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/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 0f6f7ac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,77 +0,0 @@
-#Tue Apr 10 08:59:53 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.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/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.common.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index dd39298..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,33 +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.0.1.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,1.3.0)",
- org.eclipse.emf;bundle-version="[2.2.0,2.4.0)",
- org.eclipse.emf.common;bundle-version="[2.2.0,2.4.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.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.utils;x-friends:="org.eclipse.jst.pagedesigner,org.eclipse.jst.jsf.facesconfig.ui,org.eclipse.jst.pagedesigner.jsf.ui"
-Eclipse-LazyStart: true
-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 7c80c6c..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 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/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 6d1ed5c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/default.properties
+++ /dev/null
@@ -1,52 +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
-###############################################################################
-# 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/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/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/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 a9b031f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/plugin.properties
+++ /dev/null
@@ -1,16 +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
-###############################################################################
-
-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 787880c..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, 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
-###############################################################################
-####################################################
-# 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/ICommonConstants.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/ICommonConstants.java
deleted file mode 100644
index f8ef8b5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/ICommonConstants.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.jsf.common.ui;
-
-/**
- * Common constants that would be used through the swad world. This might
- * include file extensions, ids
- * 
- * @author mengbo
- */
-public interface ICommonConstants {
-	/**
-	 * These are the defines for the logging preference pages.
-	 */
-	public static final String P_LOGGING = "logging"; // all logging
-
-	// preferences will
-	// contain this string
-	// in the key.
-
-	public static final String P_CONSOLE_LOGGING = "console.logging.on";
-
-	public static final String P_CONSOLE_LOG_LEVEL = "console.logging.max.level";
-
-	public static final String P_ECLIPSE_LOGGING = "eclipse.logging.on";
-
-	public static final String P_ECLIPSE_LOG_LEVEL = "eclipse.logging.max.level";
-
-	public static final String P_FILE_LOGGING = "file.logging.on";
-
-	public static final String P_FILE_LOG_LEVEL = "file.logging.max.level";
-
-	public static final String P_FILE_PATH = "file.logging.path";
-
-	public static final String P_FILE_CLEAR = "file.logging.startup.clear";
-
-	public static final String P_FILE_ROLLOVER_FREQUENCY = "file.logging.rollover.frequency";
-
-	public static final String P_REMOTE_LOGGING = "remote.logging.on";
-
-	public static final String P_REMOTE_LOG_LEVEL = "remote.logging.max.level";
-
-	public static final String P_REMOTE_HOST = "remote.logging.host";
-
-	public static final String P_REMOTE_PORT = "remote.logging.port";
-
-	/** Debug levels */
-	public static final int DEBUG_LEVEL = 0;
-
-	public static final int INFO_LEVEL = 1;
-
-	public static final int WARN_LEVEL = 2;
-
-	public static final int ERROR_LEVEL = 3;
-
-	public static final int FATAL_LEVEL = 4;
-
-	/** Rollover Frequency */
-	public static final int DAILY_FREQ = 0;
-
-	public static final int WEEKLY_FREQ = 1;
-
-	public static final int MONTHLY_FREQ = 2;
-
-	/** Sybase provided taglib id, defined in plugin.xml */
-	public static final String SYBASE_TAGLIB_ID = "category_jsf";
-
-	/** DataWindow taglib id, defined in plugin.xml */
-	public static final String DATAWINDOW_TAGLIB_ID = "category_datawindow";
-
-	/** Soap Service support category id, defined in plugin.xml of jmt */
-	public static String SOAP_SERVICE_CATEGORY_ID = "category_soapservice";
-
-	/** An nature for jsf based webapp project */
-	public static final String NATURE_WEBAPP = "org.eclipse.jst.pagedesigner.WebappNature";
-
-	public static final String XML_DECL = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
-
-	/** default faces-config.xml file, for version 1.0 */
-	public static final String FACES_CONFIG_10 = XML_DECL
-			+ "<!DOCTYPE faces-config PUBLIC \"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN\" \"http://java.sun.com/dtd/web-facesconfig_1_0.dtd\">\n<faces-config/>";
-
-	/** default faces-config.xml file, for version 1.1 */
-	public static final String FACES_CONFIG_11 = XML_DECL
-			+ "<!DOCTYPE faces-config PUBLIC \"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN\" \"http://java.sun.com/dtd/web-facesconfig_1_1.dtd\">\n<faces-config/>";
-
-	/** default web.xml, for version 2.2 */
-	public static final String WEBAPP_22 = XML_DECL
-			+ "<!DOCTYPE web-app PUBLIC \"-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN\" \"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd\">";
-
-	/** default web.xml, for version 2.3 */
-	public static final String WEBAPP_23 = XML_DECL
-			+ "<!DOCTYPE web-app PUBLIC \"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN\" \"http://java.sun.com/dtd/web-app_2_3.dtd\">";
-
-	/** default web.xml, for version 2.4 */
-	public static final String WEBAPP_24 = XML_DECL
-			+ "<web-app xmlns=\"http://java.sun.com/xml/ns/j2ee\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" version=\"2.4\" xsi:schemaLocation=\"http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd\">";
-}
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 34cc432..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/IFileFolderConstants.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.jsf.common.ui;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IFileFolderConstants {
-	public static final String STAR = "*";
-
-	public static final String DOT = ".";
-
-	public static final String PATH_SEPARATOR = "/";
-
-	/** file extensions */
-	public static final String EXT_APP = "app";
-
-	public static final String EXT_CLASS = "class";
-
-	public static final String EXT_DGM = "dgm";
-
-	public static final String EXT_GIF = "gif";
-
-	public static final String EXT_HTM = "htm";
-
-	public static final String EXT_HTML = "html";
-
-	public static final String EXT_JAR = "jar";
-
-	public static final String EXT_JAVA = "java";
-
-	public static final String EXT_JPEG = "jpeg";
-
-	public static final String EXT_JPG = "jpg";
-
-	public static final String EXT_JSF = "jsf";
-
-	public static final String EXT_JSP = "jsp";
-
-	public static final String EXT_JSV = "jsv";
-
-	public static final String EXT_JTPL = "jtpl";
-
-	public static final String EXT_JSPX = "jspx";
-
-	public static final String EXT_PAGEFLOW = "pageflow";
-
-	public static final String EXT_PBD = "pbd";
-
-	public static final String EXT_PBL = "pbl";
-
-	public static final String EXT_PNG = "png";
-
-	public static final String EXT_PSR = "psr";
-
-	public static final String EXT_PROPERTIES = "properties";
-
-	public static final String EXT_PUL = "pul";
-
-	public static final String EXT_SRD = "srd";
-
-	public static final String EXT_TAGLIB = "tld";
-
-	public static final String EXT_TMPL = "tmpl";
-
-	public static final String EXT_WAR = "war";
-
-	public static final String EXT_XML = "xml";
-
-	public static final String EXT_ZIP = "zip";
-
-	public static final String EXT_WSDL = "wsdl";
-
-	/** files */
-	public static final String FILE_BUILD_PROPERTIES = "build.properties";
-
-	public static final String FILE_FACES_CONFIG_XML = "faces-config.xml";
-
-	public static final String FILE_MANIFEST_MF = "MANIFEST.MF";
-
-	public static final String FILE_WEB_APP_23_DTD = "web-app_2_3.dtd";
-
-	public static final String FILE_WEB_FACESCONFIG_10_DTD = "web-facesconfig_1_0.dtd";
-
-	public static final String FILE_WEB_XML = "web.xml";
-
-	public static final String FILE_SYBASE_EASERVER_CONFIG_XML = "sybase-easerver-config.xml";
-
-	/** folders */
-	public static final String FOLDER_BIN = "bin";
-
-	public static final String FOLDER_CLASS = "classes";
-
-	public static final String FOLDER_DTD = "dtd";
-
-	public static final String FOLDER_GENERATED = "generated";
-
-	public static final String FOLDER_ICONS = "icons";
-
-	public static final String FOLDER_IMAGES = "images";
-
-	public static final String FOLDER_LIB = "lib";
-
-	public static final String FOLDER_METAINF = "META-INF";
-
-	public static final String FOLDER_PAGEFLOW = "pageflows";
-
-	public static final String FOLDER_PB = "pb";
-
-	public static final String FOLDER_SOURCE = "src";
-
-	public static final String FOLDER_TEMPLATES = "templates";
-
-	public static final String FOLDER_TAGLIB = "tld";
-
-	public static final String FOLDER_WEBINF = "WEB-INF";
-
-	public static final String FOLDER_WEBROOT = "WebContent";
-
-	public static final String FOLDER_WIZARDS = "wizards";
-
-	public static final String FOLDER_WSDL = "wsdl";
-
-	/** the webroot folder depth relative to the project */
-	public static final int WEBROOT_FOLDER_DEPTH = 2;
-
-    /**
-     * @deprecated
-     */
-    public static String DEFAULT_FACES_CONFIG_FILE_PATH = IFileFolderConstants.PATH_SEPARATOR
-            + IFileFolderConstants.FOLDER_WEBROOT
-            + IFileFolderConstants.PATH_SEPARATOR
-            + IFileFolderConstants.FOLDER_WEBINF
-            + IFileFolderConstants.PATH_SEPARATOR
-            + IFileFolderConstants.FILE_FACES_CONFIG_XML;
-
-}
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 8a82e5f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/JSFUICommonPlugin.java
+++ /dev/null
@@ -1,460 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.IWorkspace;
-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.swt.widgets.Display;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-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 implements ICommonConstants {
-	// Properties contains general properties and defaults to preferences.
-	private static final String PROPERTIES = "default.properties";
-
-	// 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));
-		}
-
-		try {
-			// get resource bundle.
-			_resourceBundle = ResourceBundle
-					.getBundle("org.eclipse.jst.jsf.common.ui.CommonResources");
-			_alerts = new Alerts(this, _resourceBundle);
-
-			// get properties.
-			_properties = new Properties();
-			InputStream input = null;
-			_pluginBase = getBundle().getEntry("/");
-			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",
-								"Problems starting plug-in Web Application Development Common.",
-								ee);
-			}
-
-			throw new CoreException(
-					new Status(
-							IStatus.ERROR,
-							getBundle().getSymbolicName(),
-							IStatus.OK,
-							"Problems starting plug-in Web Application Development Common",
-							ee));
-		}
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	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.
-	 */
-    // TODO: theClass is never used!!
-	public static Logger getLogger(Class theClass) {
-		return getDefault().getRootLogger();
-	}
-
-	/**
-	 * Returns the plugin's root logger
-	 */
-	public Logger getRootLogger() {
-		return _log;
-	}
-
-	/**
-	 * Returns this plugin's unique identifier
-	 * 
-	 * @retun this plugin's unique identifier
-	 * 
-	 */
-	public static String getPluginId() {
-		return getDefault().getBundle().getSymbolicName();
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 */
-	public ResourceBundle getResourceBundle() {
-		return _resourceBundle;
-	}
-
-	/**
-	 * Returns the string from the plugin's resource bundle, or 'key' if not
-	 * found.
-	 */
-	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,
-	 */
-	public ResourceBundle getPluginDecriptorBundle() {
-		return Platform.getResourceBundle(getDefault().getBundle());
-	}
-
-	/**
-	 * Returns the plugin's default properties. These are normally used for
-	 * default preferences.
-	 */
-	public Properties getProperties() {
-		return _properties;
-	}
-
-	/**
-	 * 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.
-	 */
-	public static Display getStandardDisplay() {
-		Display display;
-		display = Display.getCurrent();
-		if (display == null) {
-			display = Display.getDefault();
-		}
-		return display;
-	}
-
-	/**
-	 * Returns the workspace instance.
-	 */
-	public static IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	/**
-	 * Returns a shared image for the given name
-	 * <p>
-	 * Note: Images returned from this method will be automitically disposed of
-	 * when this plug-in shuts down. Callers must not dispose of these images
-	 * themselves.
-	 * </p>
-	 * 
-	 * @param name
-	 *            the image name found in /icons (with extension)
-	 * @return the image, null on error or not found.
-	 */
-	public Image getImage(String name) {
-		if (name == null) {
-			return null;
-		}
-
-		ImageRegistry images = getImageRegistry();
-		Image image = images.get(name);
-		if (image == null) {
-			try {
-				ImageDescriptor id = ImageDescriptor.createFromURL(new URL(
-						_pluginBase, "icons/" + name));
-				images.put(name, id);
-
-				image = images.get(name);
-			} catch (MalformedURLException ee) {
-				// log.CommonPlugin.image.error=Image {0} not found.
-				_log.error("log.msg", "log.CommonPlugin.image.error", name, ee);
-			}
-		}
-		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));
-				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);
-			}
-		}
-		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.
-	 */
-	public InputStream readFile(String file) throws MalformedURLException,
-			IOException {
-		return (new URL(_pluginBase, file)).openStream();
-	}
-
-	/**
-	 * 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;
-	}
-
-	/**
-	 * 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) {
-		// 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")));
-
-		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")));
-
-		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")));
-		store.setDefault(P_FILE_PATH, _properties.getProperty(P_FILE_PATH, ""));
-		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"));
-	}
-
-	/**
-	 * 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")) {
-			return DEBUG_LEVEL;
-		}
-		if (str.equalsIgnoreCase("INFO")) {
-			return INFO_LEVEL;
-		}
-		if (str.equalsIgnoreCase("WARN")) {
-			return WARN_LEVEL;
-		}
-		if (str.equalsIgnoreCase("FATAL")) {
-			return FATAL_LEVEL;
-		}
-		return ERROR_LEVEL;
-	}
-
-	/**
-	 * Converts the rollover frequency from string to int. The frequency
-	 * defaults to DAILY.
-	 * 
-	 * @param str
-	 *            String representation of rollover frequency
-	 * @return integer representation of rollover frequency
-	 */
-	public int strToIntFrequency(String str) {
-		if (str == null) {
-			return DAILY_FREQ;
-		}
-		if (str.equalsIgnoreCase("WEEKLY")) {
-			return WEEKLY_FREQ;
-		}
-		if (str.equalsIgnoreCase("MONTHLY")) {
-			return MONTHLY_FREQ;
-		}
-		return DAILY_FREQ;
-	}
-}
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 d73a28d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/AbstractClassButtonDialogField.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.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
- */
-public 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;
-
-	public void setAutoOpenResource(boolean autoOpenResource) {
-		_autoOpenResource = autoOpenResource;
-	}
-
-	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");
-					Alerts alerts = new Alerts(JSFUICommonPlugin.getDefault(), rb);
-					alerts.error("ClassButtonDialogField.Alert.Title",
-							"ClassButtonDialogField.Alert.Msg");
-					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);
-				}
-			}
-		}
-	}
-
-	protected abstract List getImplementInterfaces();
-
-	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;
-	}
-
-	public void setInterface(String interfaceName) {
-		_interfacesList = new ArrayList();
-		_interfacesList.add(interfaceName);
-	}
-
-	/**
-	 * @param interfacesList
-	 *            The interfacesList to set.
-	 */
-	public void setInterfacesList(List interfacesList) {
-		// TODO:Now we can not find the IJavaSearchScope that support the
-		// Hierarchies for multi-types.
-		// We will support the multi-interfaces After resolve the problem.
-		this._interfacesList = interfacesList;
-	}
-
-	/**
-	 * @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/BooleanComboDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/BooleanComboDialogField.java
deleted file mode 100644
index b40bdae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/BooleanComboDialogField.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.jsf.common.ui.internal.dialogfield;
-
-
-/**
- * @author mengbo
- */
-public class BooleanComboDialogField extends ComboDialogField {
-	final public static int USE_YESNO = 0;
-
-	final public static int USE_TRUEFALSE = 1;
-
-	/**
-	 * 
-	 * @param type
-	 */
-	public void setType(int type) {
-		if (type == USE_YESNO) {
-			setItems(new String[] { "", "yes", "no" });
-		} else if (type == USE_TRUEFALSE) {
-			setItems(new String[] { "", "true", "false" });
-		}
-	}
-
-	/**
-	 * @param flags
-	 */
-	public BooleanComboDialogField(int flags) {
-		super(flags);
-		setType(USE_TRUEFALSE);
-	}
-}
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/ClasspathResourceButtonDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ClasspathResourceButtonDialogField.java
deleted file mode 100644
index a02a94f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ClasspathResourceButtonDialogField.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.dialogfield;
-
-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.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.ResourceOnClasspathDialog;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @author mengbo
- */
-public class ClasspathResourceButtonDialogField extends StringButtonDialogField {
-	private IProject _project;
-
-	private static final String[] PROPERTIES_FILES_SUFFIXS = new String[] { IFileFolderConstants.EXT_PROPERTIES }; //$NON-NLS-1$
-
-	public ClasspathResourceButtonDialogField(IProject project) {
-		this(null, project);
-		setStringButtonAdapter(new IStringButtonAdapter() {
-			public void changeControlPressed(DialogField field) {
-				browseButtonPressed();
-			}
-		});
-	}
-
-	public ClasspathResourceButtonDialogField(IStringButtonAdapter adapter,
-			IProject project) {
-		super(adapter);
-		this._project = project;
-	}
-
-	private void browseButtonPressed() {
-		Shell shell = 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 = getText();
-
-			String newValue = (String) dialog.getResult()[0];
-			if (oldValue != newValue) {
-				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;
-		}
-	}
-
-	/**
-	 * @return Returns the project.
-	 */
-	public IProject getProject() {
-		return _project;
-	}
-
-	/**
-	 * @param project
-	 *            The project to set.
-	 */
-	public void setProject(IProject project) {
-		this._project = project;
-	}
-}
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 95eca30..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ColorButtonDialogField.java
+++ /dev/null
@@ -1,337 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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;
-
-	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.
-	 */
-	public void enableButton(boolean enable) {
-		if (isOkToUse(_button)) {
-			_button.setEnabled(isEnabled() && enable);
-		}
-		_buttonEnabled = enable;
-	}
-
-	/**
-	 * Creates or returns the created buttom widget.
-	 * 
-	 * @param parent
-	 *            The parent composite or <code>null</code> if the widget has
-	 *            already been created.
-	 */
-	public Button getChangeControl(FormToolkit toolkit, Composite parent) {
-		if (_button == null) {
-			assertCompositeNotNull(parent);
-			if (toolkit != null) {
-				_button = toolkit.createButton(parent, "", SWT.PUSH);
-			} 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;
-	}
-
-	public StyleCombo getTextControl(FormToolkit toolkit, Composite parent) {
-		return getComboControl(toolkit, parent);
-	}
-
-	protected 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 59079be..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, 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
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * Defines a two sets: one of basic and one of extended colors.  Clients extending
- * this class must provide the two maps
- * 
- * @author cbateman
- *
- */
-public abstract class ColorPalette 
-{
-    /**
-     * @param cssText
-     * @return the basic color matching the cssText key or null if color doesn't exist
-     */
-    public final Color getBasicColor(String cssText) {
-        return (Color) getBasicColorMap().get(cssText.toLowerCase());
-    }
-
-    /**
-     * @param cssText
-     * @return the extended color matching the cssText key or null if color doesn't exist
-     */
-    public final Color getExtendedColor(String cssText) {
-        Set keys = getExtendedColorMap().keySet();
-        for (Iterator iterator = keys.iterator(); iterator.hasNext();) {
-            String key = (String) iterator.next();
-            if (key.equalsIgnoreCase(cssText)) {
-                return (Color) getExtendedColorMap().get(key);
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @return the map of basic colors where the key is the color name (a string)
-     * and the value is an RGB object
-     */
-    public abstract Map getBasicColorMap();
-
-    /**
-     * @return the map of extended colors where the key is the color name (a string)
-     * and the value is an Color object
-     */
-    public abstract Map getExtendedColorMap();
-
-    /**
-     * @param textColor
-     * @return same as getExtendedColor but returns value as an RGB object
-     */
-    public final RGB getExtendedColorRGB(String textColor) {
-        if (textColor == null || textColor.length() == 0) {
-            return null;
-        }
-
-        Color color = getExtendedColor(textColor);
-        if (color != null) {
-            return color.getRGB();
-        }
-
-        if (textColor.charAt(0) == '#' && textColor.length() == 4) {
-            char[] rgbChars = textColor.toCharArray();
-            char[] fullChars = { rgbChars[0], rgbChars[1], rgbChars[1],
-                    rgbChars[2], rgbChars[2], rgbChars[3], rgbChars[3] };
-
-            textColor = String.valueOf(fullChars);
-        }
-
-        if (textColor.charAt(0) == '#' && textColor.length() == 7) {
-            try {
-                int intColor = Integer.decode(textColor).intValue();
-
-                if (intColor > 0xFFFFFF || intColor < 0) {
-                    return null;
-                }
-                int r = intColor >> 16;
-                int g = (intColor >> 8) & 0xFF;
-                int b = intColor & 0xFF;
-                return new RGB(r, g, b);
-
-            } catch (NumberFormatException e) {
-                return null;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @param rgb
-     * @return the hex string for equivalent of the rgb color
-     */
-    public static String getStringColor(RGB rgb) {
-        if (rgb == null) {
-            return "";
-        }
-
-        StringBuffer buffer = new StringBuffer("#");
-        int[] intRGBs = new int[] { rgb.red, rgb.green, rgb.blue };
-        for (int i = 0; i < 3; i++) {
-            if (intRGBs[i] < 16) {
-                buffer.append("0");
-            }
-            buffer.append(Integer.toHexString(intRGBs[i]).toUpperCase());
-        }
-        return buffer.toString();
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ComboDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ComboDialogField.java
deleted file mode 100644
index 66dd217..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ComboDialogField.java
+++ /dev/null
@@ -1,337 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.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;
-
-	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;
-	}
-
-	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 parent
-	 *            The parent composite or <code>null</code> when the widget
-	 *            has already been created.
-	 */
-	public CCombo getComboControl(FormToolkit toolkit, Composite parent) {
-		if (_comboControl == null) {
-			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;
-	}
-
-	protected void handleDefaultSelection(SelectionEvent e) {
-		// commit value
-		if (_pending) {
-			_pending = false;
-			dialogFieldApplied();
-		}
-	}
-
-	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
-
-	/**
-	 * Gets the combo items.
-	 */
-	public String[] getItems() {
-		return _items;
-	}
-
-	/**
-	 * Sets the combo items. Triggers a dialog-changed event.
-	 */
-	public void setItems(String[] items) {
-		_items = items;
-		if (isOkToUse(_comboControl)) {
-			_comboControl.setItems(items);
-		}
-		_pending = false;
-		// dialogFieldChangedAndApplied();
-	}
-
-	public void setEntryMap(Map map) {
-		_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.
-	 */
-	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();
-	}
-
-	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/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 fe40291..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogField.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.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-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 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 abstract void setHyperLink(IHyperlinkListener listener);
-
-	/**
-	 * Sets the label of the dialog field.
-	 */
-	public abstract void setLabelText(String labeltext);
-
-	// ------ change listener
-	public abstract void setDialogFieldChangeListener(
-			IDialogFieldChangeListener listener);
-
-	public abstract void setDialogFieldApplyListener(
-			IDialogFieldApplyListener listener);
-
-	// ------- focus management
-	public abstract boolean setFocus();
-
-	// ------- layout helpers
-	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.
-	 */
-	public abstract int getNumberOfControls();
-
-	// ------- ui creation
-	public abstract Control getLabelControl(FormToolkit _formToolkit,
-			Composite parent);
-
-	// --------- enable / disable management
-	public abstract void setEnabled(boolean enabled);
-
-	/**
-	 * Gets the enable state of the dialog field.
-	 */
-	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();
-
-	public abstract boolean isRequired();
-
-	public abstract void setToolTip(String toolTip);
-}
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 bfc56d4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldBase.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.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;
-
-	protected 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;
-
-	public DialogFieldBase() {
-		_enabled = true;
-		_label = null;
-		_requiredLabel = null;
-		_hyperlink = null;
-		_labelText = ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * this method must be called directly after constructor, in this case,
-	 * system will create a hyper link label, and when the hyper link is
-	 * clicked, the corresponding method on the listene will be called. A
-	 * RuntimeException will throw out if this method is called after the label
-	 * has been created.
-	 * 
-	 * @param listener
-	 *            can't be null
-	 */
-	public void setHyperLink(IHyperlinkListener listener) {
-		if (_label != null) {
-			throw new RuntimeException(
-					"The Label instance does not support the listener");
-		}
-        this._listener = listener;
-	}
-
-	/**
-	 * Sets the label of the dialog field.
-	 */
-	public void setLabelText(String labeltext) {
-		_labelText = labeltext == null ? "" : labeltext;
-		// if (_isRequired)
-		// {
-		// _labelText = "* " + _labelText;
-		// }
-		// else
-		// {
-		// _labelText = " " + _labelText;
-		// }
-		if (_label != null && !_label.isDisposed()) {
-			_label.setText(_labelText);
-		} else if (_hyperlink != null && !_hyperlink.isDisposed()) {
-			_hyperlink.setText(_labelText);
-		}
-	}
-
-	protected 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
-
-	/**
-	 * Tries to set the focus to the dialog field. Returns <code>true</code>
-	 * if the dialog field can take focus. To be reimplemented by dialog field
-	 * implementors.
-	 */
-	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
-
-	/**
-	 * 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.
-	 */
-	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
-	 */
-	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;
-	}
-
-	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 && _hyperlink == null) {
-			assertCompositeNotNull(parent);
-
-			String label = null;
-			if (_labelText != null && !"".equals(_labelText)) {
-				//$NON-NLS-1$
-				label = _labelText;
-			} else {
-				label = ".";
-			}
-
-			if (_listener == null) {
-				control = createLabel(_formToolkit, parent, label);
-			} else {
-				control = createHyperlink(_formToolkit, parent, label);
-			}
-			/**
-			 * if(isRequired) { FontData[] fontData =
-			 * parent.getFont().getFontData(); FontData[] newFontData = new
-			 * FontData[fontData.length]; for(int i=0; i<fontData.length; i++) {
-			 * newFontData[i] = new FontData(fontData[i].getName(),
-			 * fontData[i].getHeight(), fontData[i].getStyle() | SWT.BOLD); }
-			 * final Font font = new Font(control.getDisplay(),newFontData);
-			 * control.setFont(font); control.addDisposeListener(new
-			 * DisposeListener() {
-			 * 
-			 * public void widgetDisposed(DisposeEvent e) { font.dispose(); }
-			 * }); } else { control.setFont(parent.getFont()); }
-			 */
-			control.setFont(parent.getFont());
-			control.setEnabled(_enabled);
-		} else {
-			if (_label != null) {
-				control = _label;
-			} else {
-				control = _hyperlink;
-			}
-		}
-		return control;
-	}
-
-	public Control getRequiredLabelControl(FormToolkit _formToolkit,
-			Composite parent) {
-		if (_requiredLabel == null) {
-			if (_formToolkit == null) {
-				_requiredLabel = new Label(parent, SWT.LEFT | SWT.WRAP);
-			} else {
-				_requiredLabel = _formToolkit.createLabel(parent, "", SWT.LEFT
-						| SWT.WRAP);
-				_requiredLabel.setForeground(getLabelColor());
-			}
-			if (_isRequired) {
-				_requiredLabel.setText(DialogFieldResources.getInstance()
-						.getString("DialogFieldBase.Label.RequiredSymbol"));
-			}
-		}
-		return _requiredLabel;
-	}
-
-	private Control createLabel(FormToolkit _formToolkit, Composite parent,
-			String labelString) {
-		if (_formToolkit == null) {
-			_label = new Label(parent, SWT.LEFT | SWT.WRAP);
-			_label.setText(labelString);
-		} else {
-			_label = _formToolkit.createLabel(parent, labelString, SWT.LEFT
-					| SWT.WRAP);
-			_label.setForeground(getLabelColor());
-		}
-		return _label;
-	}
-
-	/**
-	 * get color for lable
-	 */
-	private Color getLabelColor() {
-		String osname = System.getProperty("os.name").toLowerCase();
-		if (osname.startsWith("mac os")) {
-			return Display.getCurrent().getSystemColor(
-					SWT.COLOR_LIST_FOREGROUND);
-		}
-        return Display.getCurrent()
-                .getSystemColor(SWT.COLOR_LIST_SELECTION);
-	}
-
-	private Control createHyperlink(FormToolkit _formToolkit, Composite parent,
-			String label) {
-		if (_formToolkit == null) {
-			_hyperlink = new Hyperlink(parent, SWT.LEFT | SWT.WRAP);
-			_hyperlink.setForeground(getLabelColor());
-			_hyperlink.setUnderlined(true);
-			_hyperlink.addMouseTrackListener(new MouseTrackAdapter() {
-
-				public void mouseEnter(MouseEvent e) {
-					_hyperlink.setForeground(Display.getCurrent()
-							.getSystemColor(SWT.COLOR_BLUE));
-				}
-
-				public void mouseExit(MouseEvent e) {
-					_hyperlink.setForeground(getLabelColor());
-				}
-			});
-			_hyperlink.setText(label);
-		} else {
-			_hyperlink = _formToolkit.createHyperlink(parent, label, SWT.LEFT
-					| SWT.WRAP);
-		}
-		_hyperlink.addHyperlinkListener(_listener);
-		return _hyperlink;
-	}
-
-	/**
-	 * Creates a spacer control.
-	 * 
-	 * @param parent
-	 *            The parent composite
-	 */
-	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 parent
-	 *            The parent composite
-	 */
-	public Control createEmptySpace(FormToolkit toolkit, Composite parent,
-			int span) {
-		Label label;
-		if (toolkit != null) {
-			label = toolkit.createLabel(parent, "");
-		} else {
-			label = new Label(parent, SWT.LEFT);
-		}
-		GridData gd = new GridData();
-		gd.horizontalAlignment = GridData.BEGINNING;
-		gd.grabExcessHorizontalSpace = false;
-		gd.horizontalSpan = span;
-		gd.horizontalIndent = 0;
-		gd.widthHint = 0;
-		gd.heightHint = 0;
-		label.setLayoutData(gd);
-		return label;
-	}
-
-	/**
-	 * Tests is the control is not <code>null</code> and not disposed.
-	 */
-	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;
-	}
-
-	protected final void assertCompositeNotNull(Composite comp) {
-		Assert.isNotNull(comp,
-				"uncreated control requested with composite null"); //$NON-NLS-1$
-	}
-
-	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;
-	}
-
-	public void setRequired(boolean isRequired) {
-		this._isRequired = isRequired;
-	}
-
-	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 2e4c5bc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldGroup.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.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();
-}
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 9839eb0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldGroupPage.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.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;
-
-	IDialogFieldChangeListener _defaultChangeListener = new IDialogFieldChangeListener() {
-		public void dialogFieldChanged(DialogField field) {
-			validate();
-		}
-	};
-
-	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);
-	}
-
-	public DialogFieldGroup getDialogFieldGroup() {
-		return _group;
-	}
-
-	public 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 7ae2eab..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
- */
-public class DialogFieldResources extends ResourceUtils {
-	/** Create the logger for this class */
-	private static Logger _log = JSFUICommonPlugin
-			.getLogger(DialogFieldResources.class);
-
-	private static DialogFieldResources _resource; // singleton
-
-	private static final String BUNDLE = DialogFieldResources.class.getName(); //$NON-NLS-1$
-
-	/**
-	 * Empty Constructor.
-	 * 
-	 * @return WizardsResources
-	 */
-
-	public static DialogFieldResources getInstance() {
-		if (_resource == null) {
-			_resource = new DialogFieldResources();
-		}
-		return _resource;
-	}
-
-	/**
-	 * The constructor create a resource bundle
-	 */
-	protected DialogFieldResources() {
-		try {
-			_resources = ResourceBundle.getBundle(BUNDLE);
-			// NOTE: this throws a runtime "MissingResourceException".
-		} catch (MissingResourceException ee) {
-			// Wizards.WizardResource.Error.ResourceNotFound = Unable to locate
-			// resource.
-			_log.error("Wizards.WizardResource.Error.ResourceNotFound", ee); //$NON-NLS-1$
-		}
-		setBundle(_resources, BUNDLE);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldResources.properties b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldResources.properties
deleted file mode 100644
index 81d9c52..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, 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
-###############################################################################
-##################################################################
-# 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/DialogFieldWrapper.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldWrapper.java
deleted file mode 100644
index a0bf301..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldWrapper.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.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.core.runtime.Assert;
-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.ui.forms.events.IHyperlinkListener;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * This is a wrapper to a dialog field, by adding a small button at the end. The
- * caller is responsible to provide the image or lable text and the button click
- * handler.
- * 
- * @author mengbo
- * @version 1.5
- * see CellEditorWrapper TODO: what relation to page designer?
- */
-
-public class DialogFieldWrapper implements DialogField, ISupportTextValue {
-	private DialogField _wrappedDialogField;
-
-	private Button _button;
-
-	private boolean _buttonEnabled;
-
-	private Image _buttonImage;
-
-	private Image _disabledImage;
-
-	private String _buttonLabel;
-
-	private IStringButtonAdapter _adapter;
-
-	/**
-	 * 
-	 */
-	public DialogFieldWrapper(DialogField field, Image image,
-			Image disabledImage) {
-		super();
-		if (!(field instanceof ISupportTextValue)) {
-			throw new IllegalArgumentException(
-					"Field must be ISupportTextValue");
-		}
-		_wrappedDialogField = field;
-		_buttonImage = image;
-		_disabledImage = disabledImage;
-	}
-
-	/**
-	 * 
-	 */
-	public DialogFieldWrapper(DialogField field, String label) {
-		super();
-		if (!(field instanceof ISupportTextValue)) {
-			throw new IllegalArgumentException(
-					"Field must be ISupportTextValue");
-		}
-		_wrappedDialogField = field;
-		_buttonLabel = label;
-	}
-
-	public void setButtonAdapter(IStringButtonAdapter adapter) {
-		this._adapter = adapter;
-		this.updateButtonControl();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue#setTextWithoutUpdate(java.lang.String)
-	 */
-	public void setTextWithoutUpdate(String value) {
-		((ISupportTextValue) _wrappedDialogField).setTextWithoutUpdate(value);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue#getText()
-	 */
-	public String getText() {
-		return ((ISupportTextValue) _wrappedDialogField).getText();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue#setText(java.lang.String)
-	 */
-	public void setText(String value) {
-		((ISupportTextValue) _wrappedDialogField).setText(value);
-	}
-
-	// --------------------------------------------------------------------------------------------
-	// wrapped method to add the attached 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 = _wrappedDialogField.doFillIntoGrid(toolkit,
-				parent, nColumns - 1);
-		Control[] result = new Control[wrappedControls.length];
-
-		Control button = getButton(toolkit, parent);
-		button.setLayoutData(gridDataForButton(1));
-
-		System.arraycopy(wrappedControls, 0, result, 0, wrappedControls.length);
-		result[result.length - 1] = _button;
-		return result;
-	}
-
-	/**
-	 * @param span
-	 * @return
-	 */
-	private GridData gridDataForButton(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 getButton(FormToolkit toolkit, Composite parent) {
-		if (_button == null) {
-			Assert.isNotNull(parent,
-					"uncreated control requested with composite null"); //$NON-NLS-1$
-			if (toolkit != null) {
-				_button = toolkit.createButton(parent, "", SWT.PUSH);
-				if (_buttonImage != null) {
-					_button.setImage(_buttonImage);
-				} else {
-					_button.setText(_buttonLabel);
-				}
-			} else {
-				_button = new Button(parent, SWT.PUSH);
-				if (_buttonImage != null) {
-					_button.setImage(_buttonImage);
-				} else {
-					_button.setText(_buttonLabel);
-				}
-			}
-			_button.addPaintListener(new PaintListener() {
-				public void paintControl(PaintEvent e) {
-					if (!_button.isEnabled() && _disabledImage != null) {
-						Rectangle buttonBounds = _button.getBounds();
-						Rectangle imageBounds = _disabledImage.getBounds();
-						e.gc.drawImage(_disabledImage,
-								(buttonBounds.width - imageBounds.width) / 2,
-								(buttonBounds.height - imageBounds.height) / 2);
-					}
-				}
-			});
-			_button.setEnabled(isEnabled() && _buttonEnabled);
-			_button.addSelectionListener(new SelectionListener() {
-				public void widgetDefaultSelected(SelectionEvent e) {
-					buttonPressed();
-				}
-
-				public void widgetSelected(SelectionEvent e) {
-					buttonPressed();
-				}
-			});
-
-		}
-		return _button;
-	}
-
-	/*
-	 * (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 _wrappedDialogField.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) {
-		_wrappedDialogField.setHyperLink(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setLabelText(java.lang.String)
-	 */
-	public void setLabelText(String labeltext) {
-		_wrappedDialogField.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) {
-		_wrappedDialogField.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) {
-		_wrappedDialogField.setDialogFieldApplyListener(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setFocus()
-	 */
-	public boolean setFocus() {
-		return _wrappedDialogField.setFocus();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#getNumberOfControls()
-	 */
-	public int getNumberOfControls() {
-		return _wrappedDialogField.getNumberOfControls() + 1;
-	}
-
-	public void setButtonEnabled(boolean enabled) {
-		this._buttonEnabled = enabled;
-		updateButtonControl();
-	}
-
-	public boolean isButtonEnabled() {
-		return _buttonEnabled;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setEnabled(boolean)
-	 */
-	public void setEnabled(boolean enabled) {
-		_wrappedDialogField.setEnabled(enabled);
-		updateButtonControl();
-	}
-
-	/**
-	 * 
-	 */
-	private void updateButtonControl() {
-		if (this._button != null) {
-			this._button.setEnabled(this.isEnabled() && _buttonEnabled
-					&& _adapter != null);
-			_button.redraw();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#isEnabled()
-	 */
-	public boolean isEnabled() {
-		return _wrappedDialogField.isEnabled();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#getAttachedData(java.lang.Object)
-	 */
-	public Object getAttachedData(Object key) {
-		return _wrappedDialogField.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) {
-		_wrappedDialogField.putAttachedData(key, value);
-	}
-
-	protected void buttonPressed() {
-		if (_adapter != null) {
-			_adapter.changeControlPressed(this);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#handleGrabHorizontal()
-	 */
-	public void handleGrabHorizontal() {
-		_wrappedDialogField.handleGrabHorizontal();
-	}
-
-	public DialogField getWrappedDialogField() {
-		return _wrappedDialogField;
-	}
-
-	public boolean isRequired() {
-		return _wrappedDialogField.isRequired();
-	}
-
-	public void setToolTip(String toolTip) {
-		_wrappedDialogField.setToolTip(toolTip);
-	}
-}
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 3a73452..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/IDialogFieldChangeListener.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.jsf.common.ui.internal.dialogfield;
-
-
-/**
- * Change listener used by <code>DialogField</code>
- * 
- * @author mengbo
- */
-public interface IDialogFieldChangeListener {
-
-	/**
-	 * The dialog field has changed.
-	 */
-	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 8fd7fe7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/IStringButtonAdapter.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.jsf.common.ui.internal.dialogfield;
-
-
-/**
- * Change listener used by <code>StringButtonDialogField</code>
- */
-public interface IStringButtonAdapter {
-
-	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 3e2ea5a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ISupportTextValue.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.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 {
-	public void setTextWithoutUpdate(String value);
-
-	public String getText();
-
-	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 4aa0808..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaClassWizard.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.core.runtime.jobs.ISchedulingRule;
-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
- */
-public 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;
-
-	public void setAutoOpenResource(boolean autoOpenResource) {
-		_autoOpenResource = autoOpenResource;
-	}
-
-	public JavaClassWizard(IProject project, String className) {
-		this(project, className, null, null);
-	}
-
-	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;
-	}
-
-	protected void selectAndReveal(IResource newResource) {
-		BasicNewResourceWizard.selectAndReveal(newResource,
-				getWorkbenchWindow());
-	}
-
-	private IWorkbenchWindow getWorkbenchWindow() {
-		return PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-	}
-
-	protected ISchedulingRule getSchedulingRule() {
-		return _mainPage.getModifiedResource();
-	}
-
-	public String getClassName() {
-		return _className;
-	}
-
-	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 a990666..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaClassWizardPage.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.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.core.runtime.Path;
-import org.eclipse.jdt.core.IClassFile;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaConventions;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.ui.wizards.NewClassWizardPage;
-
-/**
- * @author mengbo
- */
-public class JavaClassWizardPage extends NewClassWizardPage {
-	private String _className;
-
-	private IProject _project;
-
-	private InitialClassProperties _initialValues;
-
-	private IJavaProject _javaProject;
-
-	private IStatus _fClassNameStatus, _fPackageNameStatus;
-
-	private final static String  SOURCE_COMPLIANCE_1_3 = JavaCore.VERSION_1_3;
-	
-	class InitialClassProperties {
-		// populate new wizard page
-		IType superClassType;
-
-		String superClassName;
-
-		List interfacesName;
-
-		String className;
-
-		String classArgs;
-
-		String packageName;
-
-		IPackageFragmentRoot packageFragmentRoot;
-
-		IPackageFragment packageFragment;
-
-		public InitialClassProperties() {
-			this.superClassType = null;
-			this.superClassName = ""; //$NON-NLS-1$
-			this.interfacesName = null;
-			this.className = null;
-			this.classArgs = null;
-			this.packageName = null;
-			this.packageFragment = null;
-			this.packageFragmentRoot = null;
-		}
-	}
-
-	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;
-	}
-
-	public JavaClassWizardPage(IProject project, String className) {
-		this(project, className, null, null);
-	}
-
-	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);
-		}
-	}
-
-	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);
-		}
-	}
-
-	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 0cbcfe4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaSearchScope.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.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
- */
-public class JavaSearchScope implements IJavaSearchScope {
-	private IProject _project;
-
-	private String _superType;
-
-	private HashSet _allowedTypeSet;
-
-	private IPath[] _enclosingProjectsAndJars;
-
-	private IProject[] _relativeProjects;
-
-	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;
-	}
-
-	/**
-	 * @param superType
-	 *            The superType to set.
-	 */
-	public void setSuperType(String superType) {
-		this._superType = 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 25ff03d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaSearchScopeDecorator.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.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
- */
-public class JavaSearchScopeDecorator implements IJavaSearchScope {
-	JavaSearchScope[] _scopes = new JavaSearchScope[0];
-
-	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 4847fb8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaUIHelper.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.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.IJavaElementSearchConstants;
-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 class JavaUIHelper {
-	public 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 != null && 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);
-		}
-	}
-
-	public 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;
-		}
-	}
-
-	public 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;
-		}
-	}
-
-	public static SelectionDialog openSelectionDialog(Shell shell,
-			IProject project, String superType, int typeFlag) {
-		IJavaSearchScope searchScope = findSearchScope(project, superType);
-		return openSelectionDialog(shell, searchScope, typeFlag);
-	}
-
-	public static SelectionDialog openSelectionDialog(Shell shell,
-			IProject project, String superType) {
-		IJavaSearchScope searchScope = findSearchScope(project, superType);
-		return openSelectionDialog(shell, searchScope,
-				IJavaElementSearchConstants.CONSIDER_ALL_TYPES);
-	}
-
-	public static IJavaSearchScope findSearchScope(IProject project,
-			String superType) {
-		if (project != null) {
-			if (superType == null || "".equals(superType)) {
-				superType = "java.lang.Object";//$NON-NLS-1$
-			}
-			return new JavaSearchScope(project, superType);
-		}
-		return SearchEngine.createWorkspaceScope();
-	}
-}
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 25e8280..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/LayoutUtil.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.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.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.Text;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-public 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;
-
-	public static Control createEmptySpace(FormToolkit kit, Composite parent,
-			int span) {
-		Label label;
-		if (kit != null) {
-			label = kit.createLabel(parent, "");
-		} else {
-			label = new Label(parent, SWT.LEFT);
-		}
-		GridData gd = new GridData();
-		gd.horizontalAlignment = GridData.BEGINNING;
-		gd.grabExcessHorizontalSpace = false;
-		gd.horizontalSpan = span;
-		gd.horizontalIndent = 0;
-		gd.widthHint = 0;
-		gd.heightHint = 0;
-		label.setLayoutData(gd);
-		return label;
-	}
-
-	public static Composite createComposite(FormToolkit kit, Composite parent,
-			int span, int internalSpan) {
-		Composite c;
-		if (kit != null) {
-			c = kit.createComposite(parent);
-			kit.paintBordersFor(c);
-		} else {
-			c = new Composite(parent, SWT.NONE);
-		}
-		GridData gd = new GridData();
-		gd.grabExcessHorizontalSpace = true;
-		gd.horizontalSpan = span;
-		gd.horizontalIndent = 0;
-		c.setLayoutData(gd);
-
-		GridLayout layout = new GridLayout();
-		layout.numColumns = internalSpan;
-		c.setLayout(layout);
-
-		return c;
-	}
-
-	/**
-	 * Calculates the number of columns needed by field editors
-	 */
-	public static int getNumberOfColumns(DialogField[] editors) {
-		int nCulumns = 0;
-		for (int i = 0; i < editors.length; i++) {
-			nCulumns = Math.max(editors[i].getNumberOfControls(), nCulumns);
-		}
-		return nCulumns;
-	}
-
-	/**
-	 * Creates a composite and fills in the given editors.
-	 * 
-	 * @param labelOnTop
-	 *            Defines if the label of all fields should be on top of the
-	 *            fields
-	 */
-	public static void doDefaultLayout(FormToolkit toolkit, Composite parent,
-			DialogField[] editors, boolean labelOnTop) {
-		doDefaultLayout(toolkit, parent, editors, labelOnTop, 0, 0, 0, 0);
-	}
-
-	/**
-	 * Creates a composite and fills in the given editors.
-	 * 
-	 * @param labelOnTop
-	 *            Defines if the label of all fields should be on top of the
-	 *            fields
-	 * @param minWidth
-	 *            The minimal width of the composite
-	 * @param minHeight
-	 *            The minimal height of the composite
-	 */
-	public static void doDefaultLayout(FormToolkit toolkit, Composite parent,
-			DialogField[] editors, boolean labelOnTop, int minWidth,
-			int minHeight) {
-		doDefaultLayout(toolkit, parent, editors, labelOnTop, minWidth,
-				minHeight, 0, 0);
-	}
-
-	/**
-	 * Creates a composite and fills in the given editors.
-	 * 
-	 * @param labelOnTop
-	 *            Defines if the label of all fields should be on top of the
-	 *            fields
-	 * @param minWidth
-	 *            The minimal width of the composite
-	 * @param minHeight
-	 *            The minimal height of the composite
-	 * @param marginWidth
-	 *            The margin width to be used by the composite
-	 * @param marginHeight
-	 *            The margin height to be used by the composite
-	 * @deprecated
-	 */
-	public static void doDefaultLayout(FormToolkit toolkit, Composite parent,
-			DialogField[] editors, boolean labelOnTop, int minWidth,
-			int minHeight, int marginWidth, int marginHeight) {
-		int nCulumns = getNumberOfColumns(editors);
-		Control[][] controls = new Control[editors.length][];
-		for (int i = 0; i < editors.length; i++) {
-			controls[i] = editors[i].doFillIntoGrid(toolkit, parent, nCulumns);
-		}
-		if (labelOnTop) {
-			nCulumns--;
-			modifyLabelSpans(controls, nCulumns);
-		}
-		GridLayout layout = new GridLayout();
-		if (marginWidth != SWT.DEFAULT) {
-			layout.marginWidth = marginWidth;
-		}
-		if (marginHeight != SWT.DEFAULT) {
-			layout.marginHeight = marginHeight;
-		}
-		layout.numColumns = nCulumns;
-		parent.setLayout(layout);
-	}
-
-	private static void modifyLabelSpans(Control[][] controls, int nCulumns) {
-		for (int i = 0; i < controls.length; i++) {
-			setHorizontalSpan(controls[i][0], nCulumns);
-		}
-	}
-
-	/**
-	 * Sets the span of a control. Assumes that GridData is used.
-	 */
-	public static void setHorizontalSpan(Control control, int span) {
-		Object ld = control.getLayoutData();
-		if (ld instanceof GridData) {
-			((GridData) ld).horizontalSpan = span;
-		} else if (span != 1) {
-			GridData gd = new GridData();
-			gd.horizontalSpan = span;
-			control.setLayoutData(gd);
-		}
-	}
-
-	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.
-	 */
-	public static void setWidthHint(Control control, int widthHint) {
-		Object ld = control.getLayoutData();
-		if (ld instanceof GridData) {
-			((GridData) ld).widthHint = widthHint;
-		}
-	}
-
-	/**
-	 * Sets the heigthHint hint of a control. Assumes that GridData is used.
-	 */
-	public static void setHeigthHint(Control control, int heigthHint) {
-		Object ld = control.getLayoutData();
-		if (ld instanceof GridData) {
-			((GridData) ld).heightHint = heigthHint;
-		}
-	}
-
-	/**
-	 * Sets the horizontal indent of a control. Assumes that GridData is used.
-	 */
-	public 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.
-	 */
-	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.
-	 */
-	public 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);
-	}
-
-	public 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;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/LocaleComboDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/LocaleComboDialogField.java
deleted file mode 100644
index 0c7c6a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/LocaleComboDialogField.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.jsf.common.ui.internal.dialogfield;
-
-import java.util.Arrays;
-import java.util.Locale;
-
-
-/**
- * @author mengbo
- */
-public class LocaleComboDialogField extends ComboDialogField {
-	private static String[] items;
-	static {
-		Locale[] locales = Locale.getAvailableLocales();
-		items = new String[locales.length + 1];
-		for (int i = 0, n = locales.length; i < n; i++) {
-			items[i] = locales[i].toString();
-		}
-		items[locales.length] = "";
-		Arrays.sort(items);
-	}
-
-	/**
-	 * @param flags
-	 */
-	public LocaleComboDialogField(int flags) {
-		super(flags);
-		setItems(items);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/MultiTypeButtonDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/MultiTypeButtonDialogField.java
deleted file mode 100644
index 7aa792e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/MultiTypeButtonDialogField.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.jsf.common.ui.internal.dialogfield;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class MultiTypeButtonDialogField extends AbstractClassButtonDialogField {
-	IJavaSearchScope _scope;
-
-	/**
-	 * @param project
-	 */
-	public MultiTypeButtonDialogField(IProject project) {
-		super(project);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.AbstractClassButtonDialogField#getJavaSearchScope()
-	 */
-	protected IJavaSearchScope getJavaSearchScope() {
-		if (_scope == null) {
-			List list = new ArrayList();
-			String superClassName = getSuperClassName();
-			if (superClassName != null && !"".equalsIgnoreCase(superClassName)) {
-				list.add(getSuperClassName());
-			}
-			list.addAll(getInterfacesList());
-			_scope = new JavaSearchScopeDecorator(this.getProject(), list);
-		}
-		return _scope;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.AbstractClassButtonDialogField#getImplementInterfaces()
-	 */
-	protected List getImplementInterfaces() {
-		List list = getInterfacesList();
-		if (list.size() == 1) {
-			return list;
-		}
-		return Collections.EMPTY_LIST;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.AbstractClassButtonDialogField#setProject(org.eclipse.core.resources.IProject)
-	 */
-	public void setProject(IProject project) {
-		if (project != getProject()) {
-			_scope = null;
-		}
-		super.setProject(project);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/NumberDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/NumberDialogField.java
deleted file mode 100644
index 8755c5a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/NumberDialogField.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.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.swt.events.VerifyEvent;
-import org.eclipse.swt.events.VerifyListener;
-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;
-
-/**
- * The text input only allows numbers
- * 
- * @author mengbo
- * @version 1.5
- */
-public class NumberDialogField extends StringDialogField {
-	public Control[] doFillIntoGrid(FormToolkit kit, Composite parent,
-			int nColumns) {
-		Control[] controls = super.doFillIntoGrid(kit, parent, nColumns);
-
-		getTextControl(kit, parent).addVerifyListener(new VerifyListener() {
-			public void verifyText(VerifyEvent e) {
-				String str = ((Text) e.getSource()).getText();
-				String newString = str.substring(0, e.start) + e.text
-						+ str.substring(e.end, str.length());
-				String regExpression = "^[1-9][0-9]*";
-				e.doit = (newString.length() == 0 || newString
-						.matches(regExpression));
-			}
-		});
-
-		return controls;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/PackageButtonDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/PackageButtonDialogField.java
deleted file mode 100644
index 2238352..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/PackageButtonDialogField.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.dialogfield;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.IJavaElement;
-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.internal.compiler.impl.CompilerOptions;
-import org.eclipse.jdt.ui.JavaElementLabelProvider;
-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.ElementListSelectionDialog;
-
-/**
- * This dialog field is used to select the package in the IPackageFragmentRoot
- * 
- * 
- * @author mengbo
- * @version 1.5
- */
-public class PackageButtonDialogField extends StringButtonDialogField {
-	/** Create the logger for this class */
-	private static Logger _log = JSFUICommonPlugin
-			.getLogger(PackageButtonDialogField.class);
-
-	/*
-	 * package fragment root corresponding to the input type (can be null)
-	 */
-	private IPackageFragmentRoot _fCurrRoot;
-
-	private IPackageFragment _fCurrPackage;
-
-    private final static String  SOURCE_COMPLIANCE_1_3 = JavaCore.VERSION_1_3;
-    
-	/**
-	 * @param packageRoot 
-	 */
-	public PackageButtonDialogField(IPackageFragmentRoot packageRoot) {
-		super(null);
-		setPackageFragmentRoot(packageRoot);
-
-		setLabelText(DialogFieldResources.getInstance().getString(
-				"PackageButtonDialogField.package.label"));
-
-		setButtonLabel(DialogFieldResources.getInstance().getString(
-				"PackageButtonDialogField.package.button"));
-
-		setStringButtonAdapter(new IStringButtonAdapter() {
-			public void changeControlPressed(DialogField field) {
-				packageChangeControlPressed(field);
-			}
-
-		});
-
-	}
-
-	/**
-	 * @param field
-	 */
-	protected void packageChangeControlPressed(DialogField field) {
-		IPackageFragment pack = choosePackage();
-		if (pack != null) {
-			setPackageFragment(pack, true);
-		}
-	}
-
-	/**
-	 * Sets the current source folder (model and text field) to the given
-	 * package fragment root.
-	 * 
-	 * @param root
-	 *            The new root.
-	 */
-	public void setPackageFragmentRoot(IPackageFragmentRoot root) {
-		_fCurrRoot = root;
-		enableButton(getPackageFragmentRoot() != null);
-	}
-
-	/**
-	 * 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;
-	}
-
-	/**
-	 * selection dialogs
-	 */
-	private IPackageFragment choosePackage() {
-		IPackageFragmentRoot froot = getPackageFragmentRoot();
-		IJavaElement[] packages = null;
-		try {
-			if (froot != null && froot.exists()) {
-				packages = froot.getChildren();
-			}
-		} catch (JavaModelException e) {
-			_log.error(e);
-		}
-		if (packages == null) {
-			packages = new IJavaElement[0];
-		}
-
-		ElementListSelectionDialog dialog = new ElementListSelectionDialog(
-				getShell(), new JavaElementLabelProvider(
-						JavaElementLabelProvider.SHOW_DEFAULT));
-		dialog.setIgnoreCase(false);
-		dialog.setTitle(DialogFieldResources.getInstance().getString(
-				"PackageButtonDialogField.ChoosePackageDialog.title")); //$NON-NLS-1$
-		dialog.setMessage(DialogFieldResources.getInstance().getString(
-				"PackageButtonDialogField.ChoosePackageDialog.description")); //$NON-NLS-1$
-		dialog
-				.setEmptyListMessage(DialogFieldResources
-						.getInstance()
-						.getString(
-								"PackageButtonDialogField.ChoosePackageDialog.empty")); //$NON-NLS-1$
-		dialog.setElements(packages);
-		IPackageFragment pack = getPackageFragment();
-		if (pack != null) {
-			dialog.setInitialSelections(new Object[] { pack });
-		}
-
-		if (dialog.open() == Window.OK) {
-			return (IPackageFragment) dialog.getFirstResult();
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the package fragment corresponding to the current input.
-	 * 
-	 * @return a package fragment or <code>null</code> if the input could not
-	 *         be resolved.
-	 */
-	public IPackageFragment getPackageFragment() {
-		return _fCurrPackage;
-	}
-
-	/**
-	 * Sets the package fragment to the given value. The method updates the
-	 * model and the text of the control.
-	 * 
-	 * @param pack
-	 *            the package fragment to be set
-	 * @param canBeModified
-	 *            if <code>true</code> the package fragment is editable;
-	 *            otherwise it is read-only.
-	 */
-	public void setPackageFragment(IPackageFragment pack, boolean canBeModified) {
-		_fCurrPackage = pack;
-		String str = (pack == null) ? "" : pack.getElementName(); //$NON-NLS-1$
-		setText(str);
-		setEnabled(canBeModified);
-	}
-
-	/**
-	 * Returns the text of the package input field.
-	 * 
-	 * @return the text of the package input field
-	 */
-	public String getPackageText() {
-		return getText();
-	}
-
-	/**
-	 * The method validates the package name and returns the status of the
-	 * validation. The validation also updates the package fragment model.
-	 * 
-	 * @return the status of the validation
-	 */
-	public IStatus getChangedStatus() {
-		StatusInfo status = new StatusInfo();
-
-		String packName = getPackageText();
-		if (packName.length() > 0) {
-			IStatus val = JavaConventions.validatePackageName(packName,SOURCE_COMPLIANCE_1_3,SOURCE_COMPLIANCE_1_3);
-			if (val.getSeverity() == IStatus.ERROR) {
-				status
-						.setError(DialogFieldResources
-								.getInstance()
-								.getString(
-										"PackageButtonDialogField.error.InvalidPackageName", val.getMessage())); //$NON-NLS-1$
-				return status;
-			} else if (val.getSeverity() == IStatus.WARNING) {
-				status
-						.setWarning(DialogFieldResources
-								.getInstance()
-								.getString(
-										"PackageButtonDialogField.warning.DiscouragedPackageName", val.getMessage())); //$NON-NLS-1$
-				// continue
-			}
-		} else {
-			status
-					.setWarning(DialogFieldResources
-							.getInstance()
-							.getString(
-									"PackageButtonDialogField.warning.DefaultPackageDiscouraged")); //$NON-NLS-1$
-		}
-
-		IPackageFragmentRoot root = getPackageFragmentRoot();
-		if (root != null) {
-			if (root.getJavaProject().exists() && packName.length() > 0) {
-				try {
-					IPath rootPath = root.getPath();
-					IPath outputPath = root.getJavaProject()
-							.getOutputLocation();
-					if (rootPath.isPrefixOf(outputPath)
-							&& !rootPath.equals(outputPath)) {
-						// if the bin folder is inside of our root, don't allow
-						// to name a package
-						// like the bin folder
-						IPath packagePath = rootPath.append(packName.replace(
-								'.', '/'));
-						if (outputPath.isPrefixOf(packagePath)) {
-							status
-									.setError(DialogFieldResources
-											.getInstance()
-											.getString(
-													"PackageButtonDialogField.error.ClashOutputLocation")); //$NON-NLS-1$
-							return status;
-						}
-					}
-				} catch (JavaModelException e) {
-					_log.error(e);
-					// let pass
-				}
-			}
-
-			_fCurrPackage = root.getPackageFragment(packName);
-		} else {
-			status.setError(""); //$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/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 cfe52bc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/RadiosDialogField.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.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * This will display a labal and a group of radio buttons. The group of radio
- * buttons will be layed out horizontally use a RowLayout, and them as a group
- * will use one cell in the GridLayout.
- * 
- * Whenever the radios selection change will fire both dialogFieldChanged() and
- * dialogFieldApplied() event.
- * 
- * @author mengbo
- */
-public class RadiosDialogField extends DialogFieldBase {
-	final static private String INDEXKEY = "INDEX";
-
-	private Composite _group;
-
-	private String[] _items;
-
-	private Button[] _button;
-
-	private int _selectIndex = -1;
-
-	private boolean _fireEvent = true;
-
-	/**
-	 * Default constructor
-	 */
-	public RadiosDialogField() {
-		super();
-	}
-
-	/**
-	 * this method must be called before create control
-	 * 
-	 * @param items
-	 */
-	public void setItems(String[] items) {
-		_items = items;
-		_button = new Button[_items.length];
-	}
-
-	// ------- layout helpers
-
-	/*
-	 * @see DialogField#doFillIntoGrid
-	 */
-	public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent,
-			int nColumns) {
-		assertEnoughColumns(nColumns);
-
-		Control requiredLabel = getRequiredLabelControl(toolkit, parent);
-		requiredLabel.setLayoutData(gridDataForLabel(1));
-
-		Control label = getLabelControl(toolkit, parent);
-		label.setLayoutData(gridDataForLabel(1));
-
-		_group = getGroup(toolkit, parent);
-		_group.setLayoutData(gridDataForGroup(nColumns - 2));
-
-		return new Control[] { requiredLabel, label, _group };
-	}
-
-	/*
-	 * @see DialogField#getNumberOfControls
-	 */
-	public int getNumberOfControls() {
-		return 3;
-	}
-
-	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
-
-	public Composite getGroup(FormToolkit toolkit, Composite parent) {
-		if (_group == null) {
-			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.
-	 */
-	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.
-	 */
-	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;
-		}
-	}
-
-	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 0ef4993..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ResourceButtonDialogField.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.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 = "";
-
-	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);
-				}
-			}
-		});
-	}
-
-	public ResourceButtonDialogField(IStringButtonAdapter adapter,
-			IProject project) {
-		super(adapter);
-		this._project = project;
-	}
-
-	protected String browseButtonPressed() {
-		Shell shell = getShell();
-		CommonResourceDialog dialog = null;
-		int style = "".equals(_separator) ? SWT.NONE : SWT.MULTI | SWT.H_SCROLL
-				| SWT.V_SCROLL;
-		if (_folder != null) {
-			dialog = new CommonResourceDialog(shell, _folder, 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;
-	}
-
-	public boolean isWebPath() {
-		return _isWebPath;
-	}
-
-	public String getSeparator() {
-		return _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 9b74c01..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/Separator.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.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;
-
-	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 height
-	 *            The heigth of the separator
-	 */
-	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;
-	}
-
-	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 parent
-	 *            The parent composite or <code>null</code> if the widget has
-	 *            already been created.
-	 */
-	public Control getSeparator(FormToolkit toolkit, Composite parent) {
-		if (_separator == null) {
-			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 03f9b12..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.JavaElementLabelProvider;
-import org.eclipse.jdt.ui.JavaElementSorter;
-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"));
-
-		setButtonLabel(DialogFieldResources.getInstance().getString(
-				"SourceFolderButtonDialogField.container.button"));
-
-		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.setSorter(new JavaElementSorter());
-		// 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 c784b96..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StatusInfo.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.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.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class StatusInfo implements IStatus {
-
-	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.
-	 */
-	public boolean isWarning() {
-		return fSeverity == IStatus.WARNING;
-	}
-
-	/**
-	 * Returns if the status' severity is INFO.
-	 */
-	public boolean isInfo() {
-		return fSeverity == IStatus.INFO;
-	}
-
-	/**
-	 * Returns if the status' 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 6c65dc0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StatusUtil.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.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.
-	 * 
-	 * @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.
-	 * 
-	 * @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.
-	 */
-	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 2afe1f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StringButtonDialogField.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.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;
-
-	public StringButtonDialogField(IStringButtonAdapter adapter) {
-		_stringButtonAdapter = adapter;
-		_browseButtonLabel = JSFUICommonPlugin
-				.getResourceString("DialogField.Browse");
-		_buttonEnabled = true;
-	}
-
-	/**
-	 * Sets the label of the button.
-	 */
-	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;
-	}
-
-	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 parent
-	 *            The parent composite or <code>null</code> if the widget has
-	 *            already been created.
-	 */
-	public Button getChangeControl(FormToolkit toolkit, Composite parent) {
-		if (_browseButton == null) {
-			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.
-	 */
-	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 499ddbe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StringDialogField.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.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 = 1;
-
-	/**
-	 * whether there is change in the UI but not fire applied event yet.
-	 */
-	private boolean _pending = false;
-
-	public StringDialogField() {
-		super();
-		_text = ""; //$NON-NLS-1$
-	}
-
-	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;
-	}
-
-	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;
-	}
-
-	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 parent
-	 *            The parent composite or <code>null</code> when the widget
-	 *            has already been created.
-	 */
-	public Text getTextControl(FormToolkit toolkit, Composite parent) {
-		if (_textControl == null) {
-			assertCompositeNotNull(parent);
-			_modifyListener = new ModifyListener() {
-				public void modifyText(ModifyEvent e) {
-					doModifyText(e);
-				}
-			};
-
-			if (toolkit != null) {
-				if (_numRows <= 1) {
-					_textControl = toolkit.createText(parent, "");
-				} else {
-					_textControl = toolkit.createText(parent, "", SWT.V_SCROLL);
-				}
-			} 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;
-	}
-
-	protected void doKeyReleased(KeyEvent e) {
-		if (e.character == '\r') {
-			// commit value
-			if (_pending) {
-				_pending = false;
-				dialogFieldApplied();
-			}
-		}
-	}
-
-	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 = "";
-		_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 a2079e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StyleComboDialogField.java
+++ /dev/null
@@ -1,375 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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;
-
-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;
-
-	public String getDefaultValue() {
-		return _defaultValue;
-	}
-
-	public void setDefaultValue(String defaultValue) {
-		this._defaultValue = defaultValue;
-	}
-
-	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;
-	}
-
-	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 parent
-	 *            The parent composite or <code>null</code> when the widget
-	 *            has already been created.
-	 */
-	public StyleCombo getComboControl(FormToolkit toolkit,
-			final Composite parent) {
-		if (_comboControl == null) {
-			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;
-	}
-
-	protected void handleDefaultSelection(SelectionEvent e) {
-		// commit value
-		if (_pending) {
-			_pending = false;
-			dialogFieldApplied();
-		}
-	}
-
-	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
-
-	/**
-	 * Gets the combo items.
-	 */
-	public String[] getItems() {
-		return _items;
-	}
-
-	/**
-	 * Sets the combo items. Triggers a dialog-changed event.
-	 */
-	public void setItems(String[] items) {
-		_items = items;
-		if (isOkToUse(_comboControl)) {
-			_comboControl.setItems(items);
-		}
-		_pending = false;
-		// dialogFieldChangedAndApplied();
-	}
-
-	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.
-	 */
-	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();
-	}
-
-	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 6ec055e..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
- */
-public 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 584f99b..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
- */
-public 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 48f5cb9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/CommonResourceDialog.java
+++ /dev/null
@@ -1,381 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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;
-
-/**
- * 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 _suffixs[] = null;
-
-		Logger _log = JSFUICommonPlugin.getLogger(CommonResourceFilter.class);
-
-		/**
-		 * @return Returns the _suffixs.
-		 */
-		public String[] getSuffixs() {
-			return _suffixs;
-		}
-
-		/**
-		 * @param _suffixs
-		 *            The _suffixs to set.
-		 */
-		public void setSuffixs(String[] _suffixs) {
-			this._suffixs = _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(_suffixs).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
-	 */
-	public CommonResourceDialog(Shell parentShell, IProject project, int style) {
-		super(parentShell, "", style);
-		if (project == null) {
-			throw new IllegalArgumentException(
-					"Argument(project) cannot be null");
-		}
-		_project = project;
-		setContentProvider(new ProjectFileDialogContentProvider());
-		setLabelProvider(WorkbenchLabelProvider
-				.getDecoratingWorkbenchLabelProvider());
-		_filter = new CommonResourceFilter();
-		setFilter(_filter);
-		_project = project;
-		setStatusMessage(getStatusMessage());
-	}
-
-	public CommonResourceDialog(Shell parentShell, IProject project) {
-		this(parentShell, project, SWT.NONE);
-	}
-
-	/**
-	 * This is a dialog for common resource selection, the resouce supported
-	 * include IFolder, IProject, IFile, user can provide
-	 * 
-	 * @param parentShell
-	 * @param folder 
-	 * @param style 
-	 */
-	public CommonResourceDialog(Shell parentShell, IFolder folder, int style) {
-		this(parentShell, (folder == null ? null : folder.getProject()), style);
-
-		_folder = folder;
-
-	}
-
-	protected String getStatusMessage() {
-		if (_resourceDescription == null) {
-			return "";
-		}
-		return _resourceDescription;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#findInputElement()
-	 */
-	protected Object findInputElement() {
-		if (_folder != null) {
-			return new Object[] { _folder, };
-		}
-		return new Object[] { _project, };
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#isValidSelection(java.lang.Object)
-	 */
-	protected boolean isValidSelection(Object selection) {
-		if (selection instanceof Object[]) {
-			for (int i = 0, n = ((Object[]) selection).length; i < n; i++) {
-				if (isValidElement(((Object[]) selection)[i]) == true) {
-					return true;
-				}
-			}
-			return false;
-		}
-        return isValidElement(selection);
-	}
-
-	private boolean isValidElement(Object selection) {
-		if ((selection instanceof IFile)) {
-			// Null means no filter is set
-			if (isSuffixBlank()) {
-				return true;
-			}
-			// The extension is supported?
-			else if (_suffixs != null
-					&& Arrays.asList(_suffixs).contains(
-							((IFile) selection).getFileExtension()
-									.toLowerCase())) {
-				return true;
-			}
-		}
-		// None of above conditions, invalid.
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.SelectionDialog#getResult()
-	 */
-	public Object[] getResult() {
-		Object[] objects = super.getResult();
-		if (objects == null || objects.length == 0) {
-			return null;
-		}
-		List list = new ArrayList();
-		for (int i = 0; i < objects.length; i++) {
-			if (objects[i] instanceof IFile) {
-				list.add(objects[i]);
-			}
-		}
-		return list.toArray();
-	}
-
-	/**
-	 * @param suffixs
-	 *            The suffixs to set.
-	 */
-	public void setSuffixs(String[] suffixs) {
-		this._suffixs = convertTolowercase(suffixs);
-		_filter.setSuffixs(_suffixs);
-		setStatusMessage(getStatusMessage());
-	}
-
-	private String[] convertTolowercase(String[] suffixs) {
-		if (suffixs != null) {
-			String[] newSuffixs = new String[suffixs.length];
-			for (int i = 0; i < suffixs.length; i++) {
-				newSuffixs[i] = suffixs[i].toLowerCase();
-			}
-			return newSuffixs;
-		}
-		return null;
-	}
-
-	public void setFilter(String[] suffixs, String sourceDescription) {
-		setSuffixs(suffixs);
-		setResourceDescription(sourceDescription);
-	}
-
-	/**
-	 * @return Returns the sourceDescription.
-	 */
-	public String getResourceDescription() {
-		return _resourceDescription;
-	}
-
-	/**
-	 * @param sourceDescription
-	 *            The sourceDescription to set.
-	 */
-	public void setResourceDescription(String sourceDescription) {
-		this._resourceDescription = sourceDescription;
-		setStatusMessage(getStatusMessage());
-	}
-
-	private boolean isSuffixBlank() {
-		boolean isSuffixBlank = false;
-		if (_suffixs == null) {
-			isSuffixBlank = true;
-		} else {
-			int count = 0;
-			for (int i = 0, size = _suffixs.length; i < size; i++) {
-				if (_suffixs[i] != null && !"".equals(_suffixs[i])) {
-					count++;
-					break;
-				}
-			}
-			if (count == 0) {
-				isSuffixBlank = true;
-			}
-		}
-		return isSuffixBlank;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/CommonWizardDialog.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/CommonWizardDialog.java
deleted file mode 100644
index 63202d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/CommonWizardDialog.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.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;
-
-public class CommonWizardDialog extends WizardDialog {
-
-	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 77d802d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/ResourceOnClasspathDialog.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.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.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.internal.core.JarEntryFile;
-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;
-
-		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;
-			}
-			// XXX: JarEntryFile is for internal use.
-			if (element instanceof JarEntryFile) {
-				String ext = ((JarEntryFile) element).getFullPath()
-						.getFileExtension();
-				if (ext != null && Arrays.asList(_suffixs).contains(ext)) {
-					return true;
-				}
-                return false;
-			}
-			if (!(element instanceof IJavaElement)) {
-				return false;
-			}
-			if (((_javaProject != null) && !_javaProject
-					.isOnClasspath((IJavaElement) element))) {
-				return false;
-			}
-			IJavaElement javaElement = (IJavaElement) element;
-			Object[] children = null;
-			switch (javaElement.getElementType()) {
-			case IJavaElement.PACKAGE_FRAGMENT_ROOT:
-				children = _javaContentProvider.getChildren(javaElement);
-				break;
-			case IJavaElement.IMPORT_CONTAINER:
-				return true;
-			case IJavaElement.PACKAGE_FRAGMENT:
-				children = _javaContentProvider.getChildren(javaElement);
-				break;
-			case IJavaElement.CLASS_FILE:
-				if (Arrays.asList(_suffixs).contains(
-						IFileFolderConstants.EXT_CLASS)) {
-					return true;
-				} 
-                return false;
-			case IJavaElement.COMPILATION_UNIT:
-				String ext = javaElement.getPath().getFileExtension();
-				if (ext != null && Arrays.asList(_suffixs).contains(ext)) {
-					return true;
-				} 
-                return false;
-			default:
-				return false;
-			}
-
-			for (int i = 0; i < children.length; i++) {
-				if (select(viewer, javaElement, children[i])) {
-					return true;
-				}
-			}
-			// Either the resouce or its children are not for displaying.
-			return false;
-		}
-	}
-
-	/**
-	 * Set the suffixs of files need to be selected.
-	 * 
-	 * @param suffixs
-	 */
-	public void setSuffixs(String suffixs[]) {
-		_suffixs = suffixs;
-		_filter.setSuffixs(suffixs);
-	}
-
-	/**
-	 * @param parentShell
-	 * @param project
-	 */
-	public ResourceOnClasspathDialog(Shell parentShell, IJavaProject project) {
-		super(parentShell, STATUS_MESSAGE);
-		// set provider and filter
-		StandardJavaElementContentProvider contentProvider = new StandardJavaElementContentProvider();
-		setContentProvider(contentProvider);
-		setLabelProvider(new JavaElementLabelProvider());
-		_filter = new ResourceOnClasspathFilter(contentProvider);
-		setFilter(_filter);
-		// store the project
-		_javaProject = project;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.SelectionDialog#getResult()
-	 */
-	public Object[] getResult() {
-		Object[] objects = super.getResult();
-		if (objects == null || objects.length == 0) {
-			return null;
-		}
-		IPath path = PathUtil.getPathOnClasspath(_javaProject, objects[0]);
-		String result = null;
-		if (path.segmentCount() == 0) {
-			return new Object[] { "" };
-		}
-		path = path.removeFileExtension();
-		result = path.toOSString();
-		result = result.replace(File.separatorChar, '.');
-		return new Object[] { result };
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#isValidSelection()
-	 */
-	protected boolean isValidSelection(Object selection) {
-		String extension = PathUtil.getPathOnClasspath(_javaProject, selection)
-				.getFileExtension();
-		return (extension != null && Arrays.asList(_suffixs).contains(extension));
-	}
-
-	protected Object findInputElement() {
-		Object input = ResourcesPlugin.getWorkspace();
-		if (input instanceof IWorkspace) {
-			return JavaCore.create(((IWorkspace) input).getRoot());
-		} else if (input instanceof IContainer) {
-			IJavaElement element = JavaCore.create((IContainer) input);
-			if (element != null && element.exists()) {
-				return element;
-			}
-			return input;
-		}
-        return JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/TreeViewerSelectionDialog.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/TreeViewerSelectionDialog.java
deleted file mode 100644
index 4923533..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/TreeViewerSelectionDialog.java
+++ /dev/null
@@ -1,354 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.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;
-
-	public static final int STYLE_INFORMATION = 1;
-
-	public static final int STYLE_ERROR = 2;
-
-	public 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;
-
-	/**
-	 * @param parentShell
-	 */
-	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);
-	}
-
-	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);
-		_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.
-	 */
-	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 
-	 */
-	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;
-	}
-
-	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.
-	 * 
-	 * @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;
-	}
-
-	protected abstract boolean isValidSelection(Object selection);
-
-	protected abstract Object findInputElement();
-}
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 c416e71..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/Alerts.java
+++ /dev/null
@@ -1,835 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.
-	public static boolean _noAlerts = false;
-
-	private ResourceBundle _rb;
-
-	private String _pluginId;
-
-	/**
-	 * Construct a alerts with the provided attributes. This constructor should
-	 * be used from the root plugin that has access to the resource bundle for
-	 * this plugin.
-	 * 
-	 * @param plugin 
-	 * @param rb
-	 *            the resource bundle to use.
-	 */
-	public Alerts(AbstractUIPlugin plugin, ResourceBundle rb) {
-		_rb = rb;
-		if (_rb == null) {
-			throw new NullPointerException(
-					"No resource bundle was provided to the Alerts.");
-		}
-		if (plugin == null) {
-			throw new NullPointerException(
-					"No plugin was provided to the Alerts.");
-		}
-		_pluginId = plugin.getBundle().getSymbolicName();
-	}
-
-	/**
-	 * Returns the text entered by a user in a simple request dialog.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param initialValue -
-	 *            initial value in the text area.
-	 * @param validator -
-	 *            something that checks for validity on the name.
-	 * @return null is returned if the user hits cancel, otherwise it is the
-	 *         text they entered.
-	 */
-	public String getInput(String titleKey, String msgKey, String initialValue,
-			IInputValidator validator) {
-		if (_noAlerts) {
-			return null;
-		}
-
-		InputDialog inDialog = new InputDialog(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), getResourceString(msgKey),
-				initialValue, validator);
-		inDialog.open();
-		return inDialog.getValue();
-	}
-
-	/**
-	 * Displays an Error message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 */
-	public void error(String titleKey, String msgKey) {
-		if (_noAlerts) {
-			return;
-		}
-
-		MessageDialog.openError(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), getResourceString(msgKey));
-	}
-
-	/**
-	 * Displays an Error message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 */
-	public void error(String titleKey, String msgKey, Object arg0) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		MessageDialog.openError(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Displays an Error message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg1 -
-	 *            arg to place into the resource bundle message.
-	 */
-	public void error(String titleKey, String msgKey, Object arg0, Object arg1) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[2];
-		args[0] = arg0;
-		args[1] = arg1;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		MessageDialog.openError(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Displays an Error message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg1 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg2 -
-	 *            arg to place into the resource bundle message.
-	 */
-	public void error(String titleKey, String msgKey, Object arg0, Object arg1,
-			Object arg2) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[3];
-		args[0] = arg0;
-		args[1] = arg1;
-		args[2] = arg2;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		MessageDialog.openError(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Displays an Error message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg1 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg2 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg3 -
-	 *            arg to place into the resource bundle message.
-	 */
-	public void error(String titleKey, String msgKey, Object arg0, Object arg1,
-			Object arg2, Object arg3) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[4];
-		args[0] = arg0;
-		args[1] = arg1;
-		args[2] = arg2;
-		args[3] = arg3;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		MessageDialog.openError(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Displays an Error message to the user.
-	 * 
-	 * @param shell -
-	 *            the shell for the error dialog
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 */
-	public void error(Shell shell, String titleKey, String msgKey) {
-		if (_noAlerts) {
-			return;
-		}
-
-		MessageDialog.openError(shell, getResourceString(titleKey),
-				getResourceString(msgKey));
-	}
-
-	/**
-	 * Displays an Error message to the user with a status using the Display
-	 * background thread.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 */
-	public void detailError(String titleKey, String msgKey) {
-		if (_noAlerts) {
-			return;
-		}
-
-		final IStatus fstatus = new Status(IStatus.ERROR, _pluginId,
-				IStatus.OK, getResourceString(msgKey), null);
-		final String ftitle = getResourceString(titleKey);
-
-		Display display = getStandardDisplay();
-		display.asyncExec(new Runnable() {
-			public void run() {
-				ErrorDialog.openError(null, ftitle, null, fstatus);
-			}
-		});
-	}
-
-	/**
-	 * Displays an Error message to the user with a status using the Display
-	 * background thread. This will give the details button.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param tt -
-	 *            exception to place in the details.
-	 */
-	public void detailError(String titleKey, String msgKey, Throwable tt) {
-		if (_noAlerts) {
-			return;
-		}
-
-		internalDetailError(getResourceString(titleKey),
-				getResourceString(msgKey), tt);
-	}
-
-	/**
-	 * Displays an Error message to the user with a status using the Display
-	 * background thread. This will give the details button.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @param tt -
-	 *            exception to place in the details.
-	 */
-	public void detailError(String titleKey, String msgKey, Object arg0,
-			Throwable tt) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		internalDetailError(getResourceString(titleKey),
-				formatter.format(args), tt);
-	}
-
-	/**
-	 * Displays an Error message to the user with a status using the Display
-	 * background thread. This will give the details button.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg1 -
-	 *            arg to place into the resource bundle message.
-	 * @param tt -
-	 *            exception to place in the details.
-	 */
-	public void detailError(String titleKey, String msgKey, Object arg0,
-			Object arg1, Throwable tt) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[1];
-		args[0] = arg0;
-		args[1] = arg1;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		internalDetailError(getResourceString(titleKey),
-				formatter.format(args), tt);
-	}
-
-	/**
-	 * Displays an Error message to the user with a status using the Display
-	 * background thread. This will give the details button.
-	 * 
-	 * @param title -
-	 *            the title message
-	 * @param message -
-	 *            message displayed to the user
-	 */
-	private void internalDetailError(String title, String msg, Throwable tt) {
-		if (_noAlerts) {
-			return;
-		}
-
-		if (tt instanceof InvocationTargetException) {
-			tt = ((InvocationTargetException) tt).getTargetException();
-		}
-
-		IStatus status = null;
-		if (tt instanceof CoreException) {
-			status = ((CoreException) tt).getStatus();
-
-			if ((status instanceof MultiStatus) == false) {
-				// convert to a multistatus to show the exception details.
-
-				Throwable th = status.getException();
-				if (th == null) {
-					th = tt;
-				}
-
-				status = buildStackTraceStatus(IStatus.ERROR, status
-						.getPlugin(), status.getMessage(), th);
-			}
-		} else {
-			status = buildStackTraceStatus(IStatus.ERROR, _pluginId, tt
-					.getMessage(), tt);
-		}
-
-		final String ftitle = title;
-		final IStatus fstatus = status;
-		final String fmsg = msg;
-		Display display = getStandardDisplay();
-		display.asyncExec(new Runnable() {
-			public void run() {
-				ErrorDialog.openError(null, ftitle, fmsg, fstatus);
-			}
-		});
-	}
-
-	/**
-	 * Builds a multistatus, so that the stack trace shows up in the alery
-	 * message for detailed alerts.
-	 * 
-	 * @param code
-	 * @param pluginId
-	 * @param message
-	 * @param tt
-	 * @return the result of the operation
-	 */
-	public IStatus buildStackTraceStatus(int code, String pluginId,
-			String message, Throwable tt) {
-		if (tt == null) {
-			return new Status(code, pluginId, IStatus.OK, message, tt);
-		}
-
-		MultiStatus mstat = new MultiStatus(pluginId, code, message, tt);
-
-		StackTraceElement[] trace = tt.getStackTrace();
-
-		mstat.add(new Status(code, pluginId, IStatus.OK, tt.toString(), null));
-		for (int ii = 0; ii < trace.length; ii++) {
-			mstat.add(new Status(code, pluginId, IStatus.OK, trace[ii]
-					.toString(), null));
-		}
-		return mstat;
-	}
-
-	/**
-	 * Displays an Error message to the user with a status using the Display
-	 * background thread. This will give the details button.
-	 * 
-	 * @param status -
-	 *            the status
-	 * @param title -
-	 *            the title of the message
-	 */
-	public void detailError(String title, IStatus status) {
-		if (_noAlerts) {
-			return;
-		}
-
-		final IStatus fstatus = status;
-		final String ftitle = title;
-		Display display = getStandardDisplay();
-		display.asyncExec(new Runnable() {
-			public void run() {
-				ErrorDialog.openError(null, ftitle, null, fstatus);
-			}
-		});
-	}
-
-	/**
-	 * Displays an information message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 */
-	public void info(String titleKey, String msgKey) {
-		if (_noAlerts) {
-			return;
-		}
-
-		MessageDialog.openInformation(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), getResourceString(msgKey));
-	}
-
-	/**
-	 * Displays an information message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 */
-	public void info(String titleKey, String msgKey, Object arg0) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		MessageDialog.openInformation(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Displays an confirmation message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @return true if the user presses the OK button, false otherwise
-	 */
-	public boolean confirm(String titleKey, String msgKey) {
-		if (_noAlerts) {
-			return true;
-		}
-
-		return MessageDialog.openConfirm(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), getResourceString(msgKey));
-	}
-
-	/**
-	 * Displays an confirmation message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @return true if the user presses the OK button, false otherwise
-	 */
-	public boolean confirm(String titleKey, String msgKey, Object arg0) {
-		if (_noAlerts) {
-			return true;
-		}
-
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		return MessageDialog.openConfirm(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Displays an question message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @return true if the user presses the "yes" button, false otherwise
-	 */
-	public boolean question(String titleKey, String msgKey) {
-		if (_noAlerts) {
-			return true;
-		}
-
-		return MessageDialog.openQuestion(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), getResourceString(msgKey));
-	}
-
-	/**
-	 * Displays an question message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @return true if the user presses the "yes" button, false otherwise
-	 */
-	public boolean question(String titleKey, String msgKey, Object arg0) {
-		if (_noAlerts) {
-			return true;
-		}
-
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		return MessageDialog.openQuestion(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Displays an warning message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 */
-	public void warning(String titleKey, String msgKey) {
-		if (_noAlerts) {
-			return;
-		}
-
-		MessageDialog.openWarning(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), getResourceString(msgKey));
-	}
-
-	/**
-	 * Displays an warning message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 */
-	public void warning(String titleKey, String msgKey, Object arg0) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		MessageDialog.openWarning(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Returns the standard display to be used. The method first checks, if the
-	 * thread calling this method has an associated dispaly. If so, this display
-	 * is returned. Otherwise the method returns the default display.
-	 */
-	public 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.
-	 */
-	public 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 95b02c4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/BrowserWindow.java
+++ /dev/null
@@ -1,375 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.guiutils;
-
-import org.eclipse.jface.window.ApplicationWindow;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.browser.LocationAdapter;
-import org.eclipse.swt.browser.LocationEvent;
-import org.eclipse.swt.browser.OpenWindowListener;
-import org.eclipse.swt.browser.StatusTextEvent;
-import org.eclipse.swt.browser.StatusTextListener;
-import org.eclipse.swt.browser.WindowEvent;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-
-/**
- * Brings up a browser into a separate window.
- * 
- * @author mengbo
- */
-public class BrowserWindow extends ApplicationWindow {
-	/**
-	 * Command to send to the browser.
-	 */
-	public static final int BROWSER_CMD_BACK = 1;
-
-	public static final int BROWSER_CMD_FORWARD = 2;
-
-	public static final int BROWSER_CMD_STOP = 3;
-
-	public static final int BROWSER_CMD_REFRESH = 4;
-
-	public static final int BROWSER_CMD_RELOAD = 5;
-
-	protected boolean _bIncludeToolbar;
-
-	protected boolean _bPopups;
-
-	protected String _title;
-
-	protected ScrolledComposite _scomp;
-
-	protected Composite _browserComposite;
-
-	protected Browser _browser;
-
-	protected String _startLocation;
-
-	protected String _startContent;
-
-	protected Point _size = new Point(600, 600);
-
-	// these items are browser context sensitive.
-	protected ToolItem _backItem;
-
-	protected 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;
-	}
-
-	public void setTitle(String title) {
-		if ((title != null) && (super.getShell() != null)) {
-			super.getShell().setText(title);
-		}
-	}
-
-	public void setStartLocation(String startLocation) {
-		_startLocation = startLocation;
-	}
-
-	public void setStartContent(String startContent) {
-		_startContent = startContent;
-	}
-
-	public Browser getBrowser() {
-		return _browser;
-	}
-
-	protected Control createContents(Composite parent) {
-		// Create the scroll composite as the one inside the parent.
-		_scomp = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL);
-
-		// Create the composite that goes inside the scroller. We will use this
-		// for
-		// everything else from here.
-		Composite innerComposite = SWTUtils.createComposite(_scomp, 1, 10, -1);
-		_scomp.setContent(innerComposite);
-		ControlListener listener = new ControlAdapter() {
-			// this will handle resizing the browser when the window is resized.
-			public void controlResized(ControlEvent e) {
-				Point pt = _scomp.getParent().getSize();
-				Rectangle rect = _browserComposite.getBounds();
-
-				pt.x -= rect.x;
-				pt.y -= rect.y;
-
-				// spacing offsets in the composites.
-				pt.x -= 10;
-				pt.y -= 60; // need status bar at bottom...30 more than normal.
-
-				// do the sanity check here since it prevents further checks.
-				if ((pt.x <= 0) || (pt.y <= 0)) {
-					return;
-				}
-
-				Rectangle innerRect = _scomp.getContent().getBounds();
-				Rectangle outerRect = _scomp.getBounds();
-
-				// substract if the scroll bars are visible.
-				if (innerRect.width > outerRect.width) {
-					pt.y -= _scomp.getHorizontalBar().getSize().y;
-				}
-				if (innerRect.height > outerRect.height) {
-					pt.x -= _scomp.getVerticalBar().getSize().x;
-				}
-
-				_browserComposite.setSize(pt);
-				_browserComposite.getParent().layout(true);
-			}
-		};
-		_scomp.addControlListener(listener);
-
-		if (_bIncludeToolbar) {
-			// ////////////////////////////////////////
-			// toobar
-			// ////////////////////////////////////////
-			ToolBar tb = new ToolBar(innerComposite, SWT.HORIZONTAL | SWT.FLAT);
-			fillToolbar(tb);
-		}
-
-		// ////////////////////////////////////////
-		// browser
-		// ////////////////////////////////////////
-		_browserComposite = new Composite(innerComposite, SWT.NULL);
-		_browserComposite.setLayout(new FillLayout());
-
-		_browser = new Browser(_browserComposite, SWT.NULL);
-
-		if (_startLocation != null) {
-			_browser.setUrl(_startLocation);
-		} else if (_startContent != null) {
-			_browser.setText(_startContent);
-		} else {
-			_browser.setText("<b>Loading...</b>");
-		}
-
-		// send the browser status messages to eclipse.
-		_browser.addStatusTextListener(new StatusTextListener() {
-			public void changed(StatusTextEvent event) {
-				setStatus(event.text);
-			}
-		});
-
-		if (_bIncludeToolbar) {
-			// check for change in location so we can enable the back/forward
-			// buttons.
-			_browser.addLocationListener(new LocationAdapter() {
-				public void changed(LocationEvent event) {
-					// check if there is something in the forward or back queue.
-					_backItem.setEnabled(_browser.isBackEnabled());
-					_forwardItem.setEnabled(_browser.isForwardEnabled());
-				}
-			});
-		}
-
-		// check is we need to open a new window.
-		_browser.addOpenWindowListener(new OpenWindowListener() {
-			public void open(WindowEvent event) {
-				if (_bPopups) {
-					BrowserWindow window = new BrowserWindow(getShell());
-					window.open();
-					event.browser = window.getBrowser();
-				} else {
-					event.browser = getBrowser();
-				}
-			}
-		});
-
-		setTitle(_title);
-		SWTUtils.computeScrollArea(_scomp, innerComposite);
-		return _scomp;
-	}
-
-	/**
-	 * Fill the toolbar for this window. This method can be overwritten to place
-	 * other toolbar controls in the bar.
-	 * 
-	 * @param tb
-	 */
-	protected void fillToolbar(ToolBar tb) {
-		// Back browser
-		_backItem = new ToolItem(tb, SWT.PUSH);
-		_backItem.setImage(JSFUICommonPlugin.getDefault()
-				.getImage("back_nav_16.gif"));
-		_backItem.setToolTipText(JSFUICommonPlugin
-				.getResourceString("BrowserWindow.back.tooltip"));
-		SelectionListener backSelectionListener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				browserCmd(BROWSER_CMD_BACK);
-			}
-		};
-		_backItem.addSelectionListener(backSelectionListener);
-
-		// Forward Browser
-		_forwardItem = new ToolItem(tb, SWT.PUSH);
-		_forwardItem.setImage(JSFUICommonPlugin.getDefault().getImage(
-				"forward_nav_16.gif"));
-		_forwardItem.setToolTipText(JSFUICommonPlugin
-				.getResourceString("BrowserWindow.forward.tooltip"));
-		SelectionListener forwardSelectionListener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				browserCmd(BROWSER_CMD_FORWARD);
-			}
-		};
-		_forwardItem.addSelectionListener(forwardSelectionListener);
-
-		// Stop Browser
-		ToolItem stopItem = new ToolItem(tb, SWT.PUSH);
-		stopItem
-				.setImage(JSFUICommonPlugin.getDefault().getImage("stop_nav_16.gif"));
-		stopItem.setToolTipText(JSFUICommonPlugin
-				.getResourceString("BrowserWindow.stop.tooltip"));
-		SelectionListener stopSelectionListener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				browserCmd(BROWSER_CMD_STOP);
-			}
-		};
-		stopItem.addSelectionListener(stopSelectionListener);
-
-		// Refresh Browser
-		ToolItem refreshItem = new ToolItem(tb, SWT.PUSH);
-		refreshItem.setImage(JSFUICommonPlugin.getDefault().getImage(
-				"refresh_nav_16.gif"));
-		refreshItem.setToolTipText(JSFUICommonPlugin
-				.getResourceString("BrowserWindow.refresh.tooltip"));
-		SelectionListener refreshServiceSelectionListener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				browserCmd(BROWSER_CMD_REFRESH);
-			}
-		};
-		refreshItem.addSelectionListener(refreshServiceSelectionListener);
-
-		if ((_startLocation != null) || (_startContent != null)) {
-			// Reload Browser.
-			ToolItem reloadItem = new ToolItem(tb, SWT.PUSH);
-			reloadItem.setImage(JSFUICommonPlugin.getDefault().getImage(
-					"reload_nav_16.gif"));
-			reloadItem.setToolTipText(JSFUICommonPlugin
-					.getResourceString("BrowserWindow.reload.tooltip"));
-			SelectionListener reloadSelectionListener = new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent event) {
-					browserCmd(BROWSER_CMD_RELOAD);
-				}
-			};
-			reloadItem.addSelectionListener(reloadSelectionListener);
-		}
-	}
-
-	/**
-	 * send the browser widget a command as defined by the cmd constant defines.
-	 * 
-	 * @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;
-	}
-
-	public void setStartSize(Point pp) {
-		_size = pp;
-	}
-
-	public void setStartSize(int x, int y) {
-		_size = new Point(x, y);
-	}
-
-	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/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 83777fc..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.
-	protected FormToolkit _toolkit;
-
-	protected Section _section;
-
-	protected ScrolledComposite _scomp;
-
-	protected String _title;
-
-	protected 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 0075afb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/FavoriteSection.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.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;
-
-	public FavoriteSection(AbstractUIPlugin plugin, String favoriteName) {
-		_favorites = new FavoriteConfigurations(plugin, favoriteName);
-	}
-
-	public Combo createFavoriteGroup(Composite parent, int horizontalSpan,
-			int comboMinWidth) {
-		Group favGroup = SWTUtils.createGroup(parent, JSFUICommonPlugin
-				.getResourceString("favorites.group.label"), 4, horizontalSpan,
-				GridData.BEGINNING | GridData.CENTER);
-
-		// Add favorite text field
-		SWTUtils.createLabel(favGroup, JSFUICommonPlugin
-				.getResourceString("favorites.label"), 1);
-		_favoriteCombo = SWTUtils.createCombo(favGroup, _favorites
-				.getFavoritesList(), 1, comboMinWidth, true);
-		_favoriteCombo.setToolTipText(JSFUICommonPlugin
-				.getResourceString("favorites.tooltip"));
-		_favoriteCombo.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				String favName = _favoriteCombo.getText().trim();
-				if (favName.length() > 0) {
-					Properties favProp = _favorites.getFavorite(_favoriteCombo
-							.getText().trim());
-					if (favProp != null) {
-						setFavorites(favProp);
-					}
-				}
-			}
-		});
-
-		// Add Save button
-		Button saveButton = SWTUtils.createPushButton(favGroup, JSFUICommonPlugin
-				.getResourceString("button.save"));
-		saveButton.setToolTipText(JSFUICommonPlugin
-				.getResourceString("favorites.save.tooltip"));
-		saveButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				String favName = _favoriteCombo.getText().trim();
-				if (favName.length() == 0) {
-					favName = JSFUICommonPlugin
-							.getResourceString("favorites.default");
-				}
-				Properties favProp = new Properties();
-				saveFavorites(favProp);
-
-				_favorites.addFavorite(favName, favProp);
-				_favorites.saveFavorites();
-
-				_favoriteCombo.removeAll();
-				String[] names = _favorites.getFavoritesList();
-
-				_favoriteCombo.setItems(names);
-				_favoriteCombo.setText(favName);
-			}
-		});
-
-		// Add Remove button
-		Button removeButton = SWTUtils.createPushButton(favGroup, JSFUICommonPlugin
-				.getResourceString("button.remove"));
-		removeButton.setToolTipText(JSFUICommonPlugin
-				.getResourceString("favorites.remove.tooltip"));
-		removeButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				String favName = _favoriteCombo.getText().trim();
-				if (favName.length() > 0) {
-					_favorites.removeFavorite(favName);
-					_favorites.saveFavorites();
-
-					removeFavorites();
-
-					_favoriteCombo.removeAll();
-					String[] names = _favorites.getFavoritesList();
-					_favoriteCombo.setItems(names);
-				}
-			}
-		});
-
-		return _favoriteCombo;
-	}
-
-	/**
-	 * This method will be called when a new favorite is set. This allows the
-	 * caller to set their values from the properties supplied.
-	 * 
-	 * @param prop
-	 */
-	public abstract void setFavorites(Properties prop);
-
-	/**
-	 * This method will be called when a new favorite is saved. This allows the
-	 * caller to save their values into the properties supplied.
-	 * 
-	 * @param prop
-	 */
-	public abstract void saveFavorites(Properties prop);
-
-	/**
-	 * This method will be called when the active favorite is removed. It allows
-	 * for clearing fields.
-	 */
-	public void removeFavorites() {
-		// do nothing.
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/ImageContainer.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/ImageContainer.java
deleted file mode 100644
index b2a6a3e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/ImageContainer.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.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.
-	 */
-	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 51419a7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/IntroductionSection.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.core.runtime.Plugin;
-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
- * 
- * @author collinsc,jchoi
- */
-public class IntroductionSection extends SectionPart {
-	private static Logger _log = JSFUICommonPlugin
-			.getLogger(IntroductionSection.class);
-
-	private String _editorId;
-
-	private FormToolkit _toolkit;
-
-	// private ImageHyperlink _helpImage;
-	private Composite _textClient;
-
-	private String _helpContextId;
-
-	private String _helpTooltip;
-
-	/**
-	 * Basic constructor - no help with this one.
-	 * 
-	 * @param editorId
-	 *            id of the editor this page is for.
-	 * @param managedForm
-	 * @param toolkit
-	 */
-	public IntroductionSection(String editorId, IManagedForm managedForm,
-			FormToolkit toolkit) {
-		this(editorId, managedForm, toolkit, null, null);
-	}
-
-	/**
-	 * Constructor with help option.
-	 * 
-	 * @param editorId
-	 *            id of the editor this page is for.
-	 * @param managedForm
-	 * @param toolkit
-	 * @param contextId 
-	 * @param helpTooltip
-	 */
-	public IntroductionSection(String editorId, IManagedForm managedForm,
-			FormToolkit toolkit, final String contextId, String helpTooltip) {
-		super(managedForm.getForm().getBody(), toolkit,
-				ExpandableComposite.TITLE_BAR | Section.DESCRIPTION);
-		super.initialize(managedForm);
-		this._editorId = editorId;
-		this._toolkit = toolkit;
-		this._helpContextId = contextId;
-		this._helpTooltip = helpTooltip;
-
-		this._textClient = this._toolkit.createComposite(getSection(), SWT.NONE);
-		this._textClient.setSize(32, 16);
-
-		RowLayout rowLayout = new RowLayout();
-		rowLayout.wrap = false;
-		rowLayout.pack = false;
-		rowLayout.justify = true;
-		rowLayout.type = SWT.HORIZONTAL;
-		rowLayout.marginLeft = 0;
-		rowLayout.marginTop = 0;
-		rowLayout.marginRight = 0;
-		rowLayout.marginBottom = 0;
-		rowLayout.spacing = 0;
-		this._textClient.setLayout(rowLayout);
-
-		this._toolkit.adapt(this._textClient, true, true);
-		getSection().setTextClient(this._textClient);
-
-		if (this._helpContextId != null) {
-			// setup the help image.
-			ImageHyperlink helpImage = new ImageHyperlink(this._textClient,
-					SWT.NONE);
-			this._toolkit.adapt(helpImage, true, true);
-			helpImage.setImage(JSFUICommonPlugin.getDefault().getImage("help.gif"));
-			if (this._helpTooltip != null) {
-				helpImage.setToolTipText(this._helpTooltip);
-			}
-			helpImage.setBackground(getSection()
-					.getTitleBarGradientBackground());
-			helpImage.addHyperlinkListener(new HyperlinkAdapter() {
-				public void linkActivated(HyperlinkEvent e) {
-					IContext context = HelpSystem.getContext(_helpContextId);
-					if (context != null) {
-						IHelpResource[] topics = context.getRelatedTopics();
-						if (topics != null && topics.length == 1) {
-                            PlatformUI.getWorkbench().getHelpSystem().displayHelpResource(topics[0]
-									.getHref());
-						} else {
-                            PlatformUI.getWorkbench().getHelpSystem().displayHelp(_helpContextId);
-						}
-					}
-				}
-			});
-		}
-
-		Composite client = this._toolkit.createComposite(getSection());
-		createClient(client, this._toolkit);
-		getSection().setClient(client);
-	}
-
-	private Composite createClient(Composite container, FormToolkit factory) {
-		TableWrapLayout layout = new TableWrapLayout();
-		layout.numColumns = 2;
-		layout.makeColumnsEqualWidth = false;
-		layout.horizontalSpacing = 20;
-		layout.verticalSpacing = 20;
-		container.setLayout(layout);
-
-		IConfigurationElement element = getExtensions();
-
-		if (element != null) {
-			setPageDetails(element);
-
-			IConfigurationElement[] children = element.getChildren();
-			for (int ii = 0; ii < children.length; ii++) {
-				processItems(container, factory, children[ii]);
-			}
-		} else {
-			setText("No Introduction");
-
-			setDescription("No Introduction page configuration found in the plugin.xml");
-		}
-
-		factory.paintBordersFor(container);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(container, _helpContextId);
-		return container;
-	}
-
-	/**
-	 * set the page details from the extensionpoint
-	 * 
-	 * @param element
-	 */
-	private void setPageDetails(IConfigurationElement element) {
-		setText(element.getAttribute("name")); //$NON-NLS-1$
-		setDescription(element.getAttribute("description")); //$NON-NLS-1$
-	}
-
-	/**
-	 * add the extension elements to the page
-	 * 
-	 * @param parent
-	 * @param toolkit_
-	 * @param element
-	 */
-	private void processItems(Composite parent, FormToolkit toolkit_,
-			IConfigurationElement element) {
-		String hyperlink = element.getAttribute("hyperlink"); //$NON-NLS-1$
-		String iconPath = element.getAttribute("icon"); //$NON-NLS-1$
-		String text = element.getAttribute("text"); //$NON-NLS-1$
-		String heading = element.getAttribute("heading"); //$NON-NLS-1$
-		String action = element.getAttribute("hyperlinkaction"); //$NON-NLS-1$
-		//String actionparameters = element.getAttribute("actionparameters"); //$NON-NLS-1$
-
-		if (iconPath != null && iconPath.length() > 0) {
-			// add an icon to the page
-
-			if (iconPath != null) {
-				String iconName;
-				if (iconPath.indexOf(IPath.SEPARATOR) != -1) {
-					iconName = new Path(iconPath).lastSegment();
-				} else {
-					iconName = iconPath;
-				}
-
-				Plugin plugin = Platform.getPlugin(element
-						.getDeclaringExtension().getContributor().getName());
-				if (plugin instanceof AbstractUIPlugin) {
-					ImageRegistry imageRegistry = ((AbstractUIPlugin) plugin)
-							.getImageRegistry();
-					Image image = imageRegistry.get(iconName);
-					if (image == null) {
-						ImageDescriptor imageDescriptor = AbstractUIPlugin
-								.imageDescriptorFromPlugin(
-										element.getDeclaringExtension()
-												.getContributor().getName(), iconPath);
-						imageRegistry.put(iconName, imageDescriptor);
-						image = imageRegistry.get(iconName);
-					}
-
-					ImageContainer img = new ImageContainer(parent);
-					img.setImage(image);
-					TableWrapData td = new TableWrapData();
-					td.rowspan = 2;
-					img.setLayoutData(td);
-				}
-			}
-
-			
-		}
-
-		if (heading != null && heading.length() > 0) {
-			// add a header
-			Label lbl = toolkit_.createLabel(parent, heading);
-			lbl.setFont(JFaceResources.getHeaderFont());
-		}
-
-		if (hyperlink != null && hyperlink.length() > 0) {
-			Hyperlink hypr = toolkit_.createHyperlink(parent, hyperlink,
-					SWT.NONE);
-			if (action != null && action.length() > 0) {
-				try {
-					final IAction thisAction = (IAction) element
-							.createExecutableExtension("hyperlinkaction"); //$NON-NLS-1$
-					hypr.addHyperlinkListener(new HyperlinkAdapter() {
-						public void linkActivated(HyperlinkEvent e) {
-							thisAction.run();
-						}
-					});
-				} catch (Exception ee) {
-					// log.IntroductionSection.action.error=Failed to launch the
-					// link {0}.
-					_log.error("log.IntroductionSection.action.error",
-							hyperlink, ee);
-					JSFUICommonPlugin.getAlerts().detailError(hyperlink,
-							"log.IntroductionSection.action.error", hyperlink,
-							ee);
-				}
-			}
-		}
-
-		if (text != null && text.length() > 0) {
-			FormText form = toolkit_.createFormText(parent, false);
-			form.setText(text, false, false);
-		}
-	}
-
-	/**
-	 * Get the extension elements for the Introduction pages
-	 */
-	private IConfigurationElement getExtensions() {
-		// find all service editor page extensions
-		IConfigurationElement element = null;
-
-		// find all service editor parameter dialog extensions
-		IConfigurationElement[] elements = Platform
-				.getExtensionRegistry()
-				.getConfigurationElementsFor(
-						"org.eclipse.jst.jsf.common.ui.introductionPage");
-		if (elements.length > 0) {
-			for (int ii = 0; ii < elements.length; ii++) {
-				// get extensions for this dialog
-				// String extPluginId =
-				// elements[ii].getDeclaringExtension().getNamespace();
-				String editorId1 = elements[ii].getDeclaringExtension()
-						.getSimpleIdentifier();
-
-				// see if we have any contributuins of dialogs
-				if (this._editorId.equals(editorId1)) {
-					element = elements[ii];
-					break;
-				}
-			}
-		}
-		return element;
-	}
-
-	private void setText(String text) {
-		getSection().setText(text);
-	}
-
-	private void setDescription(String text) {
-		getSection().setDescription(text);
-	}
-
-	/**
-	 * Set this section's layout data
-	 * @param layoutData
-	 */
-	public void setLayoutData(Object layoutData) {
-		getSection().setLayoutData(layoutData);
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/OverviewSection.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/OverviewSection.java
deleted file mode 100644
index 7fd9e54..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/OverviewSection.java
+++ /dev/null
@@ -1,335 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.GridLayout;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.SectionPart;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormText;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Hyperlink;
-import org.eclipse.ui.forms.widgets.ImageHyperlink;
-import org.eclipse.ui.forms.widgets.Section;
-
-
-/**
- * @author jchoi
- * @version
- */
-public class OverviewSection extends SectionPart {
-
-	private static Logger log = JSFUICommonPlugin.getLogger(OverviewSection.class);
-
-	private String editorId;
-
-	private FormToolkit toolkit;
-
-	private ImageHyperlink helpImage;
-
-	private Composite textClient;
-
-	private String helpContextId;
-
-	private String helpTooltip;
-
-	protected FormEditor editor;
-
-	/**
-	 * @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.editor = editor;
-		this.toolkit = toolkit;
-
-		this.textClient = this.toolkit.createComposite(getSection(), SWT.NONE);
-		this.textClient.setSize(32, 16);
-
-		init();
-	}
-
-	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.editor = editor;
-		this.toolkit = toolkit;
-
-		this.textClient = toolkit.createComposite(getSection(), SWT.NONE);
-		this.textClient.setSize(32, 16);
-		this.helpContextId = helpContextId;
-		this.helpTooltip = helpTooltip;
-		init();
-	}
-
-	public void initialize() {
-		Composite client = toolkit.createComposite(getSection());
-		createClient(client, toolkit);
-		getSection().setClient(client);
-	}
-
-	private void init() {
-		RowLayout rowLayout = new RowLayout();
-		rowLayout.wrap = false;
-		rowLayout.pack = false;
-		rowLayout.justify = true;
-		rowLayout.type = SWT.HORIZONTAL;
-		rowLayout.marginLeft = 0;
-		rowLayout.marginTop = 0;
-		rowLayout.marginRight = 0;
-		rowLayout.marginBottom = 0;
-		rowLayout.spacing = 0;
-		textClient.setLayout(rowLayout);
-
-		helpImage = new ImageHyperlink(textClient, SWT.NONE);
-		toolkit.adapt(helpImage, true, true);
-		toolkit.adapt(textClient, true, true);
-		helpImage.setImage(JSFUICommonPlugin.getDefault().getImage("help.gif")); //$NON-NLS-1$
-		getSection().setTextClient(textClient);
-		if (helpTooltip != null) {
-			helpImage.setToolTipText(helpTooltip);
-		}
-		helpImage.setBackground(getSection().getTitleBarGradientBackground());
-		helpImage.addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				IContext context = HelpSystem.getContext(helpContextId);
-				if (context != null) {
-					IHelpResource[] topics = context.getRelatedTopics();
-					if (topics != null && topics.length == 1) {
-                        PlatformUI.getWorkbench().getHelpSystem().displayHelpResource(topics[0].getHref());
-					} else {
-                        PlatformUI.getWorkbench().getHelpSystem().displayHelp(helpContextId);
-					}
-				}
-			}
-		});
-
-		/*
-		 * Composite client = _toolkit.createComposite(getSection());
-		 * createClient(client, _toolkit); getSection().setClient(client);
-		 */
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.update.ui.forms.internal.FormSection#createClient(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.update.ui.forms.internal.FormWidgetFactory)
-	 */
-	public Composite createClient(Composite container, FormToolkit factory) {
-		return null;
-	}
-
-	protected Composite createClientContainer(Composite parent, int span,
-			FormToolkit toolkit_) {
-		Composite container = toolkit_.createComposite(parent);
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = layout.marginHeight = 2;
-		layout.numColumns = span;
-		container.setLayout(layout);
-		return container;
-	}
-
-	/**
-	 * set the page details from the extensionpoint
-	 * 
-	 * @param element
-	 */
-	protected void setPageDetails(IConfigurationElement element) {
-		setText(element.getAttribute("name")); //$NON-NLS-1$
-		setDescription(element.getAttribute("description")); //$NON-NLS-1$
-	}
-
-	/**
-	 * add the extension elements to the page
-	 * 
-	 * @param parent
-	 * @param toolkit_
-	 * @param element
-	 */
-	public void processItems(Composite parent, FormToolkit toolkit_,
-			IConfigurationElement element) {
-		String hyperlink = element.getAttribute("hyperlink"); //$NON-NLS-1$      
-		String text = element.getAttribute("text"); //$NON-NLS-1$
-		String action = element.getAttribute("hyperlinkaction"); //$NON-NLS-1$
-		//String actionparameters = element.getAttribute("actionparameters"); //$NON-NLS-1$
-
-		if (hyperlink != null && hyperlink.length() > 0) {
-			Hyperlink hypr = toolkit_.createHyperlink(parent, hyperlink,
-					SWT.NONE);
-			if (action != null && action.length() > 0) {
-				try {
-					final IAction thisAction = (IAction) element
-							.createExecutableExtension("hyperlinkaction"); //$NON-NLS-1$
-					hypr.addHyperlinkListener(new HyperlinkAdapter() {
-						public void linkActivated(HyperlinkEvent e) {
-							thisAction.run();
-						}
-					});
-				} catch (Exception ee) {
-					// log.IntroductionSection.action.error=Failed to launch the
-					// link {0}.
-					log
-							.error("log.OverviewSection.action.error",
-									hyperlink, ee);
-					JSFUICommonPlugin.getAlerts().detailError(hyperlink,
-							"log.OverviewSection.action.error", hyperlink, ee);
-				}
-			}
-		}
-
-		if (text != null && text.length() > 0) {
-			FormText form = toolkit_.createFormText(parent, false);
-			form.setText(text, false, false);
-		}
-	}
-
-	/**
-	 * Get the extension elements for the Introduction pages
-	 */
-	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;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.service.framework.forms.ISESection#setEditor()
-	 */
-	public void setEditor(FormEditor editor) {
-		this.editor = editor;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.service.framework.forms.ISESection#getEditor()
-	 */
-	public FormEditor getEditor() {
-		return editor;
-	}
-
-	public void setText(String text) {
-		getSection().setText(text);
-	}
-
-	public void setDescription(String text) {
-		getSection().setDescription(text);
-
-	}
-
-	public void setLayoutData(Object layoutData) {
-		getSection().setLayoutData(layoutData);
-	}
-
-	public void setExpanded(boolean expanded) {
-		getSection().setExpanded(expanded);
-	}
-
-	/**
-	 * @return Returns the _helpImage.
-	 */
-	public ImageHyperlink getHelpImage() {
-		return helpImage;
-	}
-
-	public void setEditorID(String id) {
-		editorId = id;
-	}
-
-}
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 b955c97..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/SWTUtils.java
+++ /dev/null
@@ -1,1084 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.custom.TableTree;
-import org.eclipse.swt.custom.TableTreeEditor;
-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
-	public static final int DEFAULT_BUTTON_WIDTH = 70;
-
-	public static final int DEFAULT_COMBO_WIDTH = 100;
-
-	public static final int DEFAULT_TEXTBOX_WIDTH = 100;
-
-	public 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
-	 * @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 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 TableTree object
-	 * 
-	 * @param tableTree
-	 *            the TableTree 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.
-	 * @return the new table
-	 */
-	public static Table createTable(TableTree tableTree, String[] columns) {
-		Table table = tableTree.getTable();
-		table.setLayoutData(tableTree.getLayoutData());
-		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 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
-	 * @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
-	 * @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 TableTree object
-	 * 
-	 * @param parent
-	 *            the composite that contains the TableTree
-	 * @return the new TableTree object
-	 */
-	public static TableTree createTableTree(Composite parent) {
-		int style = SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL
-				| SWT.FULL_SELECTION | SWT.HIDE_SELECTION;
-		TableTree tableTree = new TableTree(parent, style);
-		GridData gridData = new GridData(GridData.FILL_BOTH);
-		gridData.grabExcessVerticalSpace = true;
-		gridData.grabExcessHorizontalSpace = true;
-		tableTree.setLayoutData(gridData);
-		return tableTree;
-	}
-
-	/**
-	 * Create a TableTreeEditor object
-	 * 
-	 * @param tableTree
-	 *            the TableTree that this editor is for
-	 * @return the new TableTreeEditor object
-	 */
-	public static TableTreeEditor createTableTreeEditor(TableTree tableTree) {
-		TableTreeEditor editor = new TableTreeEditor(tableTree);
-		editor.horizontalAlignment = SWT.LEFT;
-		editor.grabHorizontal = true;
-		editor.minimumWidth = 50;
-		return editor;
-	}
-
-	/**
-	 * 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
-	 * @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
-	 * @return the new text field
-	 */
-	public static Text createTextBox(Composite parent, int numColumns,
-			int minWidth, int minHeight) {
-		Text text = new Text(parent, SWT.SINGLE | SWT.BORDER);
-		GridData data = new GridData(GridData.FILL);
-		data.horizontalSpan = numColumns;
-		data.widthHint = minWidth;
-		data.heightHint = minHeight;
-		text.setLayoutData(data);
-		return text;
-	}
-
-	/**
-	 * Create a text field that is scrollable.
-	 * 
-	 * @param parent
-	 *            the parent of the new text field
-	 * @param numColumns
-	 *            number of columns the text box is to occupy
-	 * @param minWidth
-	 *            minimum width of text field
-	 * @param minHeight
-	 *            minimum height of text field
-	 * @return the new text field
-	 */
-	public static Text createTextBoxScrollable(Composite parent,
-			int numColumns, int minWidth, int minHeight) {
-		Text text = new Text(parent, SWT.BORDER | SWT.V_SCROLL | SWT.WRAP);
-		GridData data = new GridData((minWidth > 0) ? GridData.FILL
-				: GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = numColumns;
-		if (minWidth > 0) {
-			data.widthHint = minWidth;
-		}
-		data.heightHint = minHeight;
-
-		text.setLayoutData(data);
-		return text;
-	}
-
-	/**
-	 * Create a list with the items listed in it.
-	 * 
-	 * @param parent
-	 *            the parent of the new text field
-	 * @param numColumns
-	 *            number of columns the text box is to occupy
-	 * @param minWidth
-	 *            minimum width of text field
-	 * @param minHeight
-	 *            minimum height of text field
-	 * @param items
-	 *            the items in the list
-	 * @return the new list
-	 */
-	public static List createList(Composite parent, int numColumns,
-			int minWidth, int minHeight, String[] items) {
-		return createList(parent, numColumns, minWidth, minHeight, items, true);
-	}
-
-	/**
-	 * Create a list with the items listed in it.
-	 * 
-	 * @param parent
-	 *            the parent of the new list box
-	 * @param numColumns
-	 *            number of columns the list box is to occupy
-	 * @param minWidth
-	 *            minimum width of list box
-	 * @param minHeight
-	 *            minimum height of list box
-	 * @param items
-	 *            the items in the list
-	 * @param bmulti
-	 *            whether multiple item selection is allowed
-	 * @return the new list
-	 */
-	public static List createList(Composite parent, int numColumns,
-			int minWidth, int minHeight, String[] items, boolean bmulti) {
-		return createList(parent, numColumns, minWidth, minHeight, items,
-				bmulti, 1);
-	}
-
-	/**
-	 * Create a list with the items listed in it.
-	 * 
-	 * @param parent
-	 *            the parent of the new list box
-	 * @param numColumns
-	 *            number of columns the list box is to occupy
-	 * @param minWidth
-	 *            minimum width of list box
-	 * @param minHeight
-	 *            minimum height of list box
-	 * @param items
-	 *            the items in the list
-	 * @param bmulti
-	 *            whether multiple item selection is allowed
-	 * @param verticalSpan
-	 *            the number of rows the list box is to occupy
-	 * @return the new list
-	 */
-	public static List createList(Composite parent, int numColumns,
-			int minWidth, int minHeight, String[] items, boolean bmulti,
-			int verticalSpan) {
-		List theList;
-		if (bmulti)
-			theList = new List(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI
-					| SWT.BORDER);
-		else
-			theList = new List(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.SINGLE
-					| SWT.BORDER);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_VERTICAL);
-		data.horizontalSpan = numColumns;
-		data.widthHint = minWidth;
-		data.heightHint = minHeight;
-		data.verticalSpan = verticalSpan;
-		theList.setLayoutData(data);
-		if (items != null) {
-			theList.setItems(items);
-		}
-
-		return theList;
-	}
-
-	/**
-	 * Computes the size of the composite inside the scroll area so that scroll
-	 * bars show up correctly.
-	 * 
-	 * @param parentComposite
-	 * @param childComposite
-	 */
-	public static void computeScrollArea(ScrolledComposite parentComposite,
-			Composite childComposite) {
-		// Point pt = childComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		// childComposite.setSize(pt);
-
-		Point pt = childComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		parentComposite.setExpandHorizontal(true);
-		parentComposite.setExpandVertical(true);
-		parentComposite.setMinWidth(pt.x);
-		parentComposite.setMinHeight(pt.y);
-	}
-
-	/**
-	 * Builds an array of strings from a token list string. The token separator
-	 * is a comma (',').
-	 * 
-	 * @param tokenString
-	 * @return String[]
-	 */
-	public static String[] getTokenNames(String tokenString) {
-		if (tokenString == null) {
-			return new String[0];
-		}
-
-		return tokenString.split(",");
-	}
-
-	/**
-	 * Enable/Disable the widget and all its children.
-	 * 
-	 * @param widget
-	 *            The widget to be enabled/disabled.
-	 * @param state
-	 *            Enable widget if true. Disable otherwise.
-	 */
-	public static void setWidgetState(Control widget, boolean state) {
-		if (widget instanceof Composite) {
-			Control widgets[] = ((Composite) widget).getChildren();
-			for (int i = 0; i < widgets.length; i++) {
-				setWidgetState(widgets[i], state);
-			}
-		}
-		widget.setEnabled(state);
-	}
-
-	// ---------------------------------------------------------------------------
-	// following is for workaround eclipse problem
-	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=40281
-	static ControlListener _listener = new ControlListener() {
-		public void controlResized(ControlEvent e) {
-			final Composite c = (Composite) e.widget;
-			c.getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					if (!c.isDisposed()) {
-						// XXX: in 3.0, should use c.layout(true)
-						// in 3.1, should use c.layout(true, true)
-						c.layout(true);
-						c.redraw();
-					}
-				}
-			});
-		}
-
-		public void controlMoved(ControlEvent e) {
-		    // nothing for move
-		}
-	};
-
-	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 122d85e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/TextWindow.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.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;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Brings up a simple text window.
- * 
- * @author mengbo
- */
-public class TextWindow extends ApplicationWindow {
-	// this browser will be cleaned up when they close the window.
-	private Text _text;
-
-	private String _content;
-
-	private Point _size = new Point(600, 600);
-
-	/**
-	 * empty for passing from events.
-	 */
-	public TextWindow(Shell parentShell, String content) {
-		super(parentShell);
-		// addStatusLine();
-		_content = content;
-		// addCoolBar(SWT.BORDER);
-		// addMenuBar();
-		// addToolBar(SWT.BORDER);
-	}
-
-	public Text getTextWidget() {
-		return _text;
-	}
-
-	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();
-	}
-
-	public void setStartSize(Point pp) {
-		_size = pp;
-	}
-
-	protected Point getInitialSize() {
-		return _size;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/logging/Logger.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/logging/Logger.java
deleted file mode 100644
index dc1a3e6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/logging/Logger.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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;
-
-public class Logger {
-	private ResourceBundle resourceBundle;
-
-	private ILog log;
-
-	private String bundleId;
-
-	public Logger(Bundle bundle, ResourceBundle resourceBundle) {
-		log = Platform.getLog(bundle);
-		this.resourceBundle = resourceBundle;
-		bundleId = bundle.getSymbolicName();
-		if (resourceBundle == null) {
-			IStatus status = new Status(IStatus.ERROR, bundleId, IStatus.OK,
-					"The resource Bundle for logger could not be null!", null);
-			log.log(status);
-		}
-	}
-	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);
-	}
-
-	public void info(String message) {
-		IStatus status = new Status(IStatus.INFO, bundleId, IStatus.OK,
-				message, null);
-		log.log(status);
-	}
-
-	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);
-	}
-
-	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);
-	}
-	
-	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);
-	}
-
-    public void error(String key) {
-        
-        String message = getString(key);
-        IStatus status = new Status(IStatus.ERROR, bundleId, IStatus.OK,
-                message, null);
-        log.log(status);
-    }
-
-	public void error(Throwable e) {
-		IStatus status = new Status(IStatus.ERROR, bundleId, IStatus.OK, "", e);
-		log.log(status);
-	}
-
-	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);
-	}
-	
-	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);
-	}
-
-	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);
-	}
-
-	public void error(String key, String arg0, String arg1, Throwable e) {
-		Object[] args = new Object[1];
-		args[0] = arg0;
-		args[1] = arg1;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		String message = formatter.format(args);
-		IStatus status = new Status(IStatus.ERROR, bundleId, IStatus.OK,
-				message, e);
-		log.log(status);
-	}
-    
-    /**
-     * @param key
-     * @return the resource for the key, or an error message if
-     * resourceBundle.getString(key) throws an Exception
-     */
-    private String getString(String key)
-    {
-        try
-        {
-            return resourceBundle.getString(key);
-        }
-        // suppress non-error exceptions so that the logging operation
-        // itself (usually called in response to an exception) does not
-        // throw a new exception
-        catch(Exception e)
-        {
-            return "!!missing resource: " + key + "!!";
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/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 d084f5a..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";
-
-	private final static String ELEMENT_ROOT = "favorite";
-
-	private final static String ELEMENT_CONFIG = "config";
-
-	private final static String ELEMENT_NAME = "name";
-
-	private final static String ELEMENT_PROPERTY = "property";
-
-	private final static String ELEMENT_VALUE = "value";
-
-	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,
-					_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,
-					_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/JMTEntityResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/JMTEntityResolver.java
deleted file mode 100644
index 600abf0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/JMTEntityResolver.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.jsf.common.ui.internal.utils;
-
-import java.io.IOException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.InputSource;
-
-/**
- * The Entity Resolver for loading local dtd copies. Currently setup for:
- * <ul>
- * <li>web.xml (V2.3)</li>
- * <li>faces-config.xml (V1.0)</li>
- * <li>faces-config.xml (V1.1)</li>
- * </ul>
- * 
- * <pre>
- *  For Example:
- * </pre>
- *	<pre>
- * SAXReader reader = new SAXReader();
- * reader.setIgnoreComments(false);
- * JMTEntityResolver resolver = new JMTEntityResolver();
- * reader.setEntityResolver(resolver);
- * </pre>
- * 
- * @author mengbo
- * @version 1.5
- */
-public class JMTEntityResolver implements EntityResolver {
-	public InputSource resolveEntity(String publicId, String systemId) {
-		String localURL;
-		if (systemId
-				.equalsIgnoreCase("http://java.sun.com/j2ee/dtds/web-app_2_2.dtd")) {
-			localURL = "dtd/web-app_2_2.dtd";
-		} else if (systemId
-				.equalsIgnoreCase("http://java.sun.com/dtd/web-app_2_3.dtd")) //$NON-NLS-1$
-		{
-			localURL = "dtd/web-app_2_3.dtd"; //$NON-NLS-1$
-		} else if (systemId
-				.equalsIgnoreCase("http://java.sun.com/dtd/web-facesconfig_1_0.dtd")) //$NON-NLS-1$
-		{
-			localURL = "dtd/web-facesconfig_1_0.dtd"; //$NON-NLS-1$
-		} else if (systemId
-				.equalsIgnoreCase("http://java.sun.com/dtd/web-facesconfig_1_1.dtd")) //$NON-NLS-1$
-		{
-			localURL = "dtd/web-facesconfig_1_1.dtd"; //$NON-NLS-1$
-		} else {
-			// use the default behaviour
-			return null;
-		}
-
-		JSFUICommonPlugin plugin = JSFUICommonPlugin.getDefault();
-		URL url = FileLocator.find(Platform.getBundle(JSFUICommonPlugin.getPluginId()),
-				new Path(localURL), null);
-		InputSource source = null;
-		try {
-			source = new InputSource(url.openStream());
-			source.setPublicId(publicId);
-		} catch (IOException e) {
-			Logger log = plugin.getRootLogger();
-			log.error("Web.XML.DTDError", e); //$NON-NLS-1$
-		}
-		return source;
-	}
-}
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 b28a1c0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/JavaModelUtil.java
+++ /dev/null
@@ -1,1004 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.IImportContainer;
-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.IPackageDeclaration;
-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
-	 */
-	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.
-	 */
-	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
-	 * @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
-	 * @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
-	 */
-	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
-	 */
-	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
-	 */
-	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)
-	 */
-	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>.
-	 */
-	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>.
-	 */
-	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
-	 */
-	public static boolean isVisible(IMember member, IPackageFragment pack)
-			throws JavaModelException {
-
-		int type = member.getElementType();
-		if (type == IJavaElement.INITIALIZER
-				|| (type == IJavaElement.METHOD && member.getElementName()
-						.startsWith("<"))) {
-			//$NON-NLS-1$
-			return false;
-		}
-
-		int otherflags = member.getFlags();
-		IType declaringType = member.getDeclaringType();
-		if (Flags.isPublic(otherflags)
-				|| (declaringType != null && declaringType.isInterface())) {
-			return true;
-		} else if (Flags.isPrivate(otherflags)) {
-			return false;
-		}
-
-		IPackageFragment otherpack = (IPackageFragment) findParentOfKind(
-				member, IJavaElement.PACKAGE_FRAGMENT);
-		return (pack != null && otherpack != null && isSamePackage(pack,
-				otherpack));
-	}
-
-	/**
-	 * Evaluates if a member in the focus' element hierarchy is visible from
-	 * elements in a package.
-	 * 
-	 * @param member
-	 *            The member to test the visibility for
-	 * @param pack
-	 *            The package of the focus element focus
-	 */
-	public static boolean isVisibleInHierarchy(IMember member,
-			IPackageFragment pack) throws JavaModelException {
-		int type = member.getElementType();
-		if (type == IJavaElement.INITIALIZER
-				|| (type == IJavaElement.METHOD && member.getElementName()
-						.startsWith("<"))) {
-			//$NON-NLS-1$
-			return false;
-		}
-
-		int otherflags = member.getFlags();
-
-		IType declaringType = member.getDeclaringType();
-		if (Flags.isPublic(otherflags) || Flags.isProtected(otherflags)
-				|| (declaringType != null && declaringType.isInterface())) {
-			return true;
-		} else if (Flags.isPrivate(otherflags)) {
-			return false;
-		}
-
-		IPackageFragment otherpack = (IPackageFragment) findParentOfKind(
-				member, IJavaElement.PACKAGE_FRAGMENT);
-		return (pack != null && pack.equals(otherpack));
-	}
-
-	/**
-	 * Returns the package fragment root of <code>IJavaElement</code>. If the
-	 * given element is already a package fragment root, the element itself is
-	 * returned.
-	 */
-	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);
-	 */
-	public 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
-	 * @return The first found method or <code>null</code>, if nothing found
-	 */
-	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
-	 */
-	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 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
-	 */
-	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 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
-	 */
-	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 testVisibility
-	 *            If true the result is tested on visibility. Null is returned
-	 *            if the method is not visible.
-	 * @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
-	 * @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, 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.
-	 * 
-	 * @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.
-	 */
-	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.
-	 */
-	public static boolean isBoolean(IField field) throws JavaModelException {
-		return field.getTypeSignature().equals(Signature.SIG_BOOLEAN);
-	}
-
-	/**
-	 * Returns true if the element is on the build path of the given project
-	 * 
-	 * @deprecated Use jproject.isOnClasspath(element);
-	 */
-	public static boolean isOnBuildPath(IJavaProject jproject,
-			IJavaElement element) {
-		return jproject.isOnClasspath(element);
-	}
-
-	/**
-	 * 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.
-	 */
-	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
-	 */
-	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.
-	 */
-	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.
-	 */
-	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
-	 */
-	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
-	 */
-	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
-	 */
-	public static IJavaElement toOriginal(IJavaElement element) {
-		return element.getPrimaryElement();
-	}
-
-	/**
-	 * @deprecated Inline this method.
-	 */
-	public static IMember toWorkingCopy(IMember member) {
-		return member;
-	}
-
-	/**
-	 * @deprecated Inline this method.
-	 */
-	public static IPackageDeclaration toWorkingCopy(
-			IPackageDeclaration declaration) {
-		return declaration;
-	}
-
-	/**
-	 * @deprecated Inline this method.
-	 */
-	public static IJavaElement toWorkingCopy(IJavaElement elem) {
-		return elem;
-	}
-
-	/**
-	 * @deprecated Inline this method.
-	 */
-	public static IImportContainer toWorkingCopy(IImportContainer container) {
-		return container;
-
-	}
-
-	/**
-	 * @deprecated Inline this method.
-	 */
-	public static IImportDeclaration toWorkingCopy(
-			IImportDeclaration importDeclaration) {
-		return importDeclaration;
-	}
-
-	/**
-	 * @deprecated Inline this method.
-	 */
-	public static ICompilationUnit toWorkingCopy(ICompilationUnit cu) {
-		return cu;
-	}
-
-	/**
-	 * Returns true if a cu is a primary cu (original or shared working copy)
-	 */
-	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.
-	 */
-	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;
-	}
-
-	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()]);
-	}
-
-	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;
-	}
-
-	/*
-	 * Returns whether the given resource path matches one of the exclusion
-	 * patterns.
-	 * 
-	 * @see IClasspathEntry#getExclusionPatterns
-	 */
-	public static boolean isExcluded(IPath resourcePath,
-			char[][] exclusionPatterns) {
-		if (exclusionPatterns == null) {
-			return false;
-		}
-		char[] path = resourcePath.toString().toCharArray();
-		for (int i = 0, length = exclusionPatterns.length; i < length; i++) {
-			if (CharOperation.pathMatch(exclusionPatterns[i], path, true, '/')) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private static Boolean fgIsJDTCore_1_5 = null;
-
-	/**
-	 * Return true if JRE 1.5 in enabled.
-	 */
-	public static boolean isJDTCore_1_5() {
-		if (fgIsJDTCore_1_5 == null) {
-			fgIsJDTCore_1_5 = JavaCore
-					.getDefaultOptions()
-					.containsKey(
-							"org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation") ? Boolean.TRUE
-					: Boolean.FALSE;
-		}
-		return fgIsJDTCore_1_5.booleanValue();
-	}
-
-	/**
-	 * Helper method that tests if an classpath entry can be found in a
-	 * container. <code>null</code> is returned if the entry can not be found
-	 * or if the container does not allows the configuration of source
-	 * attachments
-	 * 
-	 * @param jproject
-	 *            The container's parent project
-	 * @param containerPath
-	 *            The path of the container
-	 * @param libPath
-	 *            The path of the library to be found
-	 * @return IClasspathEntry A classpath entry from the container of
-	 *         <code>null</code> if the container can not be modified.
-	 */
-	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 c7c75c8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PathUtil.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.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.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.internal.core.JarEntryFile;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.ui.IFileEditorInput;
-
-/**
- * Collection of helper methods to manage and convert links Originally part of
- * the LinksManager (com.ibm.iwt.parser.util)
- */
-public class PathUtil {
-	public static final String BACKWARD_SLASH = "\\"; //$NON-NLS-1$
-
-	public static final String FORWARD_SLASH = "/"; //$NON-NLS-1$
-
-	public static final String RELATIVE_PATH_SIGNAL = IFileFolderConstants.DOT
-			+ IFileFolderConstants.DOT + IFileFolderConstants.PATH_SEPARATOR;
-
-	/**
-	 * adjust relative path isside the absolute 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
-	 */
-	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
-	 */
-	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;
-	}
-
-	public static String convertToWebPath(String projectName, String path) {
-		String name = "";
-		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(
-				projectName);
-		String webrootName = WebrootUtil.getWebContentFolder(project).getName();
-
-		if (path.indexOf(webrootName) != -1) {
-			name = projectName + IFileFolderConstants.PATH_SEPARATOR
-					+ webrootName;
-		} else {
-			name = projectName;
-		}
-		int index = path.indexOf(projectName);
-
-		return path.substring(index + name.length());
-	}
-
-	/**
-	 * convert path relative to current active file to absolute path in
-	 * filesystem
-	 * 
-	 * @param uri
-	 *            the relative path
-	 * @return absolute path in file system
-	 */
-	public static String convertToAbsolutePath(String uri, IFile curFile) {
-		if (uri == null || uri.trim().equals("")) {
-			return uri;
-		}
-		String webroot = "";
-		IFile jsp = curFile;
-		try {
-			if (jsp == null) {
-				jsp = ((IFileEditorInput) JSFUICommonPlugin.getActivePage()
-						.getActiveEditor().getEditorInput()).getFile();
-			}
-			if (jsp != null) {
-				String webrootName = WebrootUtil.getWebContentFolder(
-						jsp.getProject()).getName();
-				webroot = jsp.getProject().getFolder(webrootName).getLocation()
-						.toString();
-			}
-		} catch (NullPointerException e) {
-			return uri;
-		}
-		if (uri.startsWith(IFileFolderConstants.PATH_SEPARATOR)) //$NON-NLS-1$
-		{
-			return webroot + uri;
-		}
-		if (jsp != null) {
-			IContainer con = jsp.getParent();
-			if (con != null) {
-				IPath path = con.getLocation();
-				if (path != null) {
-					String aPath = path.toString() + File.separator + uri;
-					aPath = aPath.replace('/', File.separatorChar);
-					aPath = aPath.replace('\\', File.separatorChar);
-					if (aPath.endsWith(File.separator)) {
-						aPath += IFileFolderConstants.PATH_SEPARATOR;
-					}
-					File file = new File(aPath);
-					if (file.exists() && file.isFile()) {
-						return file.getAbsolutePath();
-					}
-                    return uri;
-				}
-			}
-		}
-		return uri;
-	}
-
-	/**
-	 * @param javaProject
-	 * @param parent
-	 * @return the IPath for a a classpath object (?)
-	 */
-	public static IPath getPathOnClasspath(IJavaProject javaProject,
-			Object parent) {
-		IPath result = null;
-		if (javaProject == null || parent == null) {
-			return new Path("");
-		}
-		IClasspathEntry[] entries = javaProject.readRawClasspath();
-		IPath classPath = null;
-		if (parent instanceof IResource) {
-			if (((javaProject != null) && !javaProject
-					.isOnClasspath((IResource) parent))) {
-				return new Path("");
-			}
-			if (parent instanceof IFile) {
-				IPath elementPath = ((IFile) parent).getFullPath();
-				if (((IFile) parent).getFileExtension().equalsIgnoreCase(
-						IFileFolderConstants.EXT_PROPERTIES)) {
-					int machings = 0;
-					try {
-						for (int i = 0; i < entries.length; i++) {
-							// Determine whether on this classentry's path
-							int n = entries[i].getPath().matchingFirstSegments(
-									elementPath);
-							if (n > machings) {
-								// Get package name
-								machings = n;
-								classPath = elementPath.removeFirstSegments(
-										machings).removeLastSegments(1);
-							}
-						}
-
-						// Not on the classpath?
-						if (classPath == null) {
-							return null;
-						} else if (classPath.segmentCount() > 0) {
-							IJavaElement element = javaProject
-									.findElement(classPath);
-							if (element != null) {
-								IPath path = element.getPath();
-								if (path != null) {
-									IPath path1 = path
-											.removeFirstSegments(machings);
-
-									String fileName = ((IFile) parent)
-											.getName();
-									if (fileName != null) {
-										result = path1.append(fileName);
-									}
-								}
-							}
-
-						} else {
-							result = ((IFile) parent).getFullPath()
-									.removeFirstSegments(machings);
-						}
-					} catch (Exception e) {
-						return null;
-					}
-				}
-			}
-		} else if (parent instanceof JarEntryFile) {
-			IPath elementPath = ((JarEntryFile) parent).getFullPath();
-			if (elementPath.getFileExtension().equalsIgnoreCase(
-					IFileFolderConstants.EXT_PROPERTIES)) {
-				result = elementPath;
-			}
-		}
-		if (result != null) {
-			return result;
-		}
-		return new Path("");
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.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 02a6261..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PropertyUtils.java
+++ /dev/null
@@ -1,576 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-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 class PropertyUtils {
-	// 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";
-
-	public static final String STR_BOUNDS_END = ".bounds"; // assumes the
-
-	// window name or
-	// name list is
-	// prepended
-
-	// //////////////////////////////////////////////////////////////////////////
-	// Property get methods.
-	// //////////////////////////////////////////////////////////////////////////
-	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;
-		}
-	}
-
-	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;
-		}
-	}
-
-	public static int getPropertyValue(Properties props, String key,
-			int defaultValue, int minumumValue) {
-		int theValue = getPropertyValue(props, key, defaultValue);
-
-		if (theValue < minumumValue) {
-			theValue = minumumValue;
-		}
-		return theValue;
-	}
-
-	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;
-	}
-
-	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;
-	}
-
-	public static boolean isProperty(Properties props, String key,
-			boolean bDefault) {
-		return getProperty(props, key, "" + bDefault).equals("" + true);
-	}
-
-	public static String[] getPropertyStrings(Properties props, String key) {
-		String tokenString = getProperty(props, key);
-
-		if (tokenString == null) {
-			return new String[0];
-		}
-        StringTokenizer tokenizer = new StringTokenizer(tokenString, ",");
-        String[] pNames = new String[tokenizer.countTokens()];
-
-        for (int ii = 0; ii < pNames.length; ii++) {
-        	pNames[ii] = ((String) tokenizer.nextElement()).trim();
-        }
-        return pNames;
-	}
-
-	// //////////////////////////////////////////////////////////////////////////
-	// Resource bundle get methods.
-	// //////////////////////////////////////////////////////////////////////////
-	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 (Exception ee) {
-			return theDefault;
-		}
-	}
-
-	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 (Exception ee) {
-			return null;
-		}
-	}
-
-	public static int getResourcePropertyValue(ResourceBundle bundle,
-			String key, int defaultValue, int minumumValue) {
-		int theValue = getResourcePropertyValue(bundle, key, defaultValue);
-
-		if (theValue < minumumValue) {
-			theValue = minumumValue;
-		}
-		return theValue;
-	}
-
-	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;
-	}
-
-	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;
-	}
-
-	public static boolean isResourceProperty(ResourceBundle bundle, String key,
-			boolean bDefault) {
-		return getResourceProperty(bundle, key, "" + bDefault)
-				.equals("" + true);
-	}
-
-	// ///////////////////////////////////////////////////////////////////////
-	// Property misc routines
-	// ///////////////////////////////////////////////////////////////////////
-	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("%3d");
-				break;
-			case ':': // %3a
-				encoded.append("%3a");
-				break;
-			case ' ': // %20
-				encoded.append("%20");
-				break;
-			case '\n': // %0a
-				encoded.append("%0a");
-				break;
-			case '\t': // %09
-				encoded.append("%09");
-				break;
-			case '\r': // %0d
-				encoded.append("%0d");
-				break;
-			case '%': // %25
-				// added because its our encoding flag
-				encoded.append("%25");
-				break;
-			default:
-				encoded.append(ch);
-				break;
-			}
-		}
-
-		return encoded.toString();
-	}
-
-	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();
-	}
-
-	public static Properties openProperties(String propName)
-			throws IOException, FileNotFoundException {
-		return openProperties(propName, null, true);
-	}
-
-	public static Properties openProperties(String propName,
-			Properties propDefaults) throws IOException, FileNotFoundException {
-		return openProperties(propName, propDefaults, true);
-	}
-
-	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
-	 */
-	public static Properties combineProperties(Properties localProperties,
-			Properties defaultProperties) throws IOException {
-		Properties theNewProperties = new Properties();
-
-		ByteArrayOutputStream os = new ByteArrayOutputStream();
-		defaultProperties.store(os, "");
-		localProperties.store(os, "");
-		byte[] theData = os.toByteArray();
-		ByteArrayInputStream is = new ByteArrayInputStream(theData);
-		theNewProperties.load(is);
-
-		return theNewProperties;
-	}
-
-	// This should only be called by the main interface on shutdown/close!!!
-	public static void saveProperties(String propName, Properties theProperties)
-			throws IOException, SecurityException {
-		saveProperties(propName, theProperties, true);
-	}
-
-	public static void saveProperties(String propName,
-			Properties theProperties, boolean bCreatePropertiesPathname)
-			throws IOException, SecurityException {
-		// write out the changed set of preferences...
-		String propertiesFilename = bCreatePropertiesPathname ? getPropertiesPathname(propName)
-				: propName;
-		FileOutputStream fout = new FileOutputStream(propertiesFilename);
-		theProperties.store(fout, "preferences");
-		fout.close();
-	}
-
-	public static String encodeFilename(String theFilename) {
-		// make theFilename legal on the local system....
-		String theSeparator = System.getProperty("file.separator");
-		// replace all occurrances of the file separator with a ' '
-		for (int ii = 0; ii < theSeparator.length(); ii++) {
-			char theChar = theSeparator.charAt(ii);
-			theFilename = theFilename.replace(theChar, ' ');
-		}
-
-		return theFilename;
-	}
-
-	public static String getPropertiesPathname(String baseName) {
-		if (baseName.endsWith(NAME_PROPERTIES)) {
-			return System.getProperty("user.dir")
-					+ System.getProperty("file.separator")
-					+ encodeFilename(baseName);
-		}
-        return System.getProperty("user.dir")
-        		+ System.getProperty("file.separator")
-        		+ encodeFilename(baseName) + NAME_PROPERTIES;
-	}
-
-	// /////////////////////////////////////////////////////////////////////////
-	// These are generic routines that are used to get/set/save window bounds
-
-	private static final int INSET = 40;
-
-	/**
-	 * Set the initial bounds (size & location) of a component. This will get
-	 * the location from the preferences file based on the values of the "names"
-	 * parameter. These values will be encoded to make a legal properties name,
-	 * joined togther with ".", and the value STR_BOUNDS_END will be appended.
-	 * The resulting name will be used to obtain the intial bounds value from
-	 * the properties file, which will be decoded and the specified component
-	 * will then be set to that value.
-	 */
-	public static void setComponentBounds(Properties props,
-			Component theComponent, String names[], String defaultValue) {
-		setComponentBounds(props, theComponent, names, defaultValue, false);
-	}
-
-	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);
-	}
-
-	public static void setComponentBounds(Properties props,
-			Component theComponent, String thePropertyName, String defaultValue) {
-		setComponentBounds(props, theComponent, thePropertyName, defaultValue,
-				false);
-	}
-
-	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);
-		}
-	}
-
-	public static void saveComponentBounds(Properties props,
-			Component theComponent, String names[]) {
-		String tmpString = getComponentPropertyName(names, STR_BOUNDS_END);
-		saveComponentBounds(props, theComponent, tmpString);
-	}
-
-	public static void saveComponentBounds(Properties props,
-			Component theComponent, String thePropertyName) {
-		Rectangle theBounds = theComponent.getBounds();
-		String theValue = encodeBounds(theBounds);
-		props.put(thePropertyName, theValue);
-	}
-
-	public static String getComponentPropertyName(String names[],
-			String subsystemName) {
-		String tmpString = "";
-
-		for (int ii = 0; ii < names.length; ii++) {
-			tmpString = tmpString + (ii > 0 ? "." : "")
-					+ PropertyUtils.encodeName(names[ii]);
-		}
-		if (subsystemName.startsWith(".") == false)
-			tmpString += ".";
-		tmpString = tmpString + subsystemName;
-		return tmpString;
-	}
-
-	/**
-	 * Decode the comma separated values stored in sBounds. This method is
-	 * normally called to decode the location/size of a component which has been
-	 * saved into a Properties object. See encodeBounds(); Order of items in the
-	 * string is (x, y, w, h)
-	 */
-	public static Rectangle decodeBounds(String sBounds) {
-		int index;
-		int ii;
-		int theValue[] = new int[4];
-		String tmpString;
-		String restString = sBounds;
-
-		for (ii = 0; ii < 4; ii++) {
-			theValue[ii] = 0;
-		}
-		try {
-			for (ii = 0; ii < 4; ii++) {
-				index = restString.indexOf(",");
-				if (index > 0) {
-					tmpString = restString.substring(0, index);
-					restString = restString.substring(index + 1);
-				} else {
-					tmpString = restString; // should only happen on the last
-					// one....
-					restString = null; // will cause an exception if not last
-					// one...
-				}
-				theValue[ii] = Integer.valueOf(tmpString).intValue();
-			}
-		} catch (Exception ee)// NOPMD
-		{
-			// the property value maybe an invalid value, the editor should show
-			// these to user.
-		}
-
-		return new Rectangle(theValue[0], theValue[1], theValue[2], theValue[3]);
-	}
-
-	/**
-	 * * Encode the bounds of a component into a comma separated list * that is
-	 * appropriate for storing in a Properties object. * See decodeBounds();
-	 */
-	public static String encodeBounds(Rectangle rBounds) {
-		return "" + rBounds.x + "," + rBounds.y + "," + rBounds.width + ","
-				+ rBounds.height;
-	}
-
-	/**
-	 * Methods for creating Properties objects from strings.
-	 * 
-	 * Then "Encoded" versions are used on values that are stored into a
-	 * properties file (think of them as sub-properties). They do the encoding
-	 * necessary to turn a properties object into a string that has legal
-	 * "value" syntax (they actually do more than they need to, but its all
-	 * non-destructive).
-	 */
-	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;
-	}
-
-	public static Properties getPropertiesFromEncodedString(
-			String theEncodedPropertyString) throws IOException {
-		if (theEncodedPropertyString == null)
-			return null;
-		return (getPropertiesFromString(decodeName(theEncodedPropertyString)));
-	}
-
-	public static Properties encodedStringToProperties(
-			String theEncodedPropertyString) {
-		try {
-			return getPropertiesFromEncodedString(theEncodedPropertyString);
-		} catch (IOException ee) {
-			return null;
-		}
-	}
-
-	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;
-	}
-
-	public static String savePropertiesToEncodedString(Properties props,
-			String comment) throws IOException {
-		if (props == null)
-			return null;
-		return encodeName(savePropertiesToString(props, comment));
-	}
-
-	public static String propertiesToEncodedString(Properties props) {
-		try {
-			return savePropertiesToEncodedString(props, "");
-		} catch (IOException ee)// NOPMD
-		{
-            JSFUICommonPlugin.getLogger(PropertyUtils.class).error("saving properties", ee);
-		}
-		return null;
-	}
-}
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 07bdff7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/ResourceUtils.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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 Logger _log = JSFUICommonPlugin.getLogger(ResourceUtils.class);
-
-	// This is the resource bundle.
-	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.ResourceUtils", bundleLocation);
-			// pluginName=Web Application Development Common
-			JSFUICommonPlugin.getAlerts().error("pluginName", "log.ResourceUtils",
-					bundleLocation);
-		}
-	}
-
-	/**
-	 * Get the static stored resource bundle for the TRP.
-	 */
-	public ResourceBundle getResourceBundle() {
-		return _resources;
-	}
-
-	/**
-	 * 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.
-	 */
-	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.
-	 */
-	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.
-	 */
-	public boolean isResource(String key) {
-		return getString(key).equals("" + true);
-	}
-
-	/**
-	 * 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.
-	 */
-	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);
-	}
-
-	public static void ensureClosed(InputStream inputStream) {
-		if (inputStream != null) {
-			try {
-				inputStream.close();
-			} catch (IOException e) {
-				// Ignore
-			}
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/StringUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/StringUtil.java
deleted file mode 100644
index a556772..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/StringUtil.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import java.util.regex.Pattern;
-
-/**
- * This is tool class for String processing.
- * 
- * @author mengbo
- */
-public class StringUtil {
-    
-    // pattern to find all end-of-paragraph and end-of-line html tags
-    // so they can be converted to newlines
-    final private static Pattern htmlToNewline = Pattern.compile("</p>|<br>");
-    
-    // pattern to strip all <x> and </x> HTML tags
-    final private static Pattern removeHTMLTags = Pattern.compile("<[/?\\w\\s=\"\\.\\#]+>");
-    
-    // pattern to find all runs of spaces longer than one
-    final private static Pattern trimInteriorWhitespace = Pattern.compile("[ ]+");
-    
-	/**
-	 * Split a java variable name into words For example, "_aJavaVariable" will
-	 * split to "A Java Variable", "_aWTPPackageImplementation" will be "A WTP
-	 * Package Implementation"
-	 * 
-	 * @param variable
-	 * @return String
-	 */
-	public static String splitVariable(String variable) {
-		StringBuffer output = new StringBuffer("");
-		boolean isCapitalLeading = false;
-		boolean isLastSpace = false;
-
-		for (int i = 0, n = variable.length(); i < n; i++) {
-			char letter = variable.charAt(i);
-
-			if (letter == '_' || letter == '$') {
-				output.append(" ");
-				isCapitalLeading = false;
-				isLastSpace = true;
-				continue;
-			}
-
-			if (Character.isLowerCase(letter)) {
-				int nextIndex = i + 1;
-				if (nextIndex < n) {
-					char nextLetter = variable.charAt(nextIndex);
-					if (Character.isUpperCase(nextLetter)) {
-						if (isCapitalLeading) {
-							output.append(letter);
-							isLastSpace = false;
-						} else {
-							output.append(Character.toUpperCase(letter));
-							isLastSpace = false;
-						}
-						if (!isLastSpace) {
-							output.append(' ');
-							isLastSpace = true;
-						}
-						isCapitalLeading = false;
-						continue;
-					}
-				}
-			}
-			if (Character.isUpperCase(letter)) {
-				int nextIndex = i + 1;
-				if (nextIndex < n) {
-					char nextLetter = variable.charAt(nextIndex);
-					if (Character.isLowerCase(nextLetter)) {
-						if (!isLastSpace) {
-							output.append(' ');
-							isLastSpace = true;
-						}
-						output.append(letter);
-						isCapitalLeading = true;
-						isLastSpace = false;
-						continue;
-					}
-				}
-			}
-			if (isCapitalLeading) {
-				output.append(letter);
-				isLastSpace = false;
-			} else {
-				output.append(Character.toUpperCase(letter));
-				isCapitalLeading = true;
-				isLastSpace = false;
-			}
-		}
-
-		return output.toString().trim();
-	}
-
-	/**
-	 * @param str1
-	 * @param str2
-	 * @return boolean
-	 * 
-	 * Check if two strings match or not if str1=null and str2=null, it will
-	 * return true
-	 */
-	public static boolean isSameString(String str1, String str2) {
-		if (str1 == null) {
-			return str2 == null;
-		}
-        return str1.equals(str2);
-	}
-
-	/**
-	 * 
-	 * @param text
-	 * @return String Filter and convert a string, or normalize a string For
-	 *         example,
-	 *         <p>
-	 *         test
-	 *         </p>
-	 *         test1<a/> will be converted to: test\ntest1
-	 * 
-	 */
-	public static String filterConvertString(String text) {
-		if (text == null) {
-			return "";
-		}
-        
-		String result = htmlToNewline.matcher(text).replaceAll("\n"); 
-        result = removeHTMLTags.matcher(result).replaceAll("");
-        result = trimInteriorWhitespace.matcher(result).replaceAll(" ");
-
-		return result;
-	}
-
-	/**
-	 * Determine whether a string is empty or not Example: null string -> return
-	 * true; Example: "" string -> return true; Otherwise, will return false;
-	 * @param str 
-	 * 
-	 * @return true if str is null or empty
-	 */
-	public static boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/StyleCombo.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/StyleCombo.java
deleted file mode 100644
index bbcf2ce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/StyleCombo.java
+++ /dev/null
@@ -1,1878 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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;
-		}
-		}
-	}
-
-	public String getDefaultValue() {
-		return 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 4f6b148..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/UTF8Util.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.jsf.common.ui.internal.utils;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class UTF8Util {
-	private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5',
-			'6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
-
-	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)];
-	}
-
-}
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 740f5a2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/WebrootUtil.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.jsf.common.ui.internal.utils;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-
-/**
- * Web app utility methods
- */
-public class WebrootUtil {
-
-	/**
-	 * get the webpath for the project path. The project path is something like
-	 * "/projectname/webroot/filename.jsp", or "/projectname/webroot/folder".
-	 * The project information should be removed from project path, e.g,
-	 * "/filename.jsp" or "/folder/*";
-	 * 
-	 * @param path
-	 * @return the web path
-	 */
-	public static String getWebPath(IPath path) {
-		String strWebrootPath = "";
-		IProject project = WorkspaceUtil.getProjectFor(path);
-		IPath webContentPath = getWebContentPath(project);
-		if (webContentPath != null && webContentPath.isPrefixOf(path)) {
-			int start = path.matchingFirstSegments(webContentPath);
-			String[] segments = path.segments();
-			for (int i = start, n = path.segmentCount(); i < n; i++) {
-				strWebrootPath = strWebrootPath
-						+ IFileFolderConstants.PATH_SEPARATOR + segments[i];
-			}
-		}
-		return strWebrootPath;
-	}
-
-	/**
-	 * To see if a resource is under the webcontent folder.
-	 * 
-	 * @param resource
-	 * @return true if resource is within the web content folder hierarchy
-	 */
-	public static boolean isUnderWebContentFolder(IResource resource) {
-		IPath webContentPath = getWebContentPath(resource.getProject());
-		if (webContentPath != null) {
-			return webContentPath.isPrefixOf(resource.getFullPath());
-		}
-		return true;
-	}
-
-	/**
-	 * @param project
-	 * @return full path to web content folder
-	 */
-	public static IPath getWebContentPath(IProject project) {
-		if (project != null) {
-			return ComponentCore.createComponent(project).getRootFolder().getUnderlyingFolder().getFullPath();
-		}
-		return null;
-	}
-
-	/**
-	 * Return the name of the web content folder. i.e, "WebContent"
-	 * 
-	 * @param project
-	 * @return the web content folder name
-	 */
-	public static String getWebContentFolderName(IProject project) {
-		IPath webContentPath = getWebContentPath(project);
-		if (webContentPath != null)
-			return webContentPath.lastSegment();
-		return null;
-	}
-
-	/**
-	 * @param project
-	 * @return folder where for web content
-	 */
-	public static IFolder getWebContentFolder(IProject project) {
-		IPath webContentPath = getWebContentPath(project);
-		IFolder folder = null;
-		if (webContentPath != null) {
-			folder = project.getFolder(webContentPath.removeFirstSegments(1));
-		}
-		return folder;
-	}
-
-	/**
-	 * return the depth of webcontent folder. For example, if the webcontent
-	 * folder path is /projectname/webContent, then return 2, if it's
-	 * /projectname/a/webContent, then return 3.
-	 * 
-	 * @param project
-	 * @return the depth of webcontent folder
-	 */
-	public static int getWebContentFolderDepth(IProject project) {
-		if (project != null) {
-			IPath webContentPath = getWebContentPath(project);
-			if (webContentPath != null) {
-				return webContentPath.segmentCount();
-			}
-		}
-		// default to 2
-		return 2;
-	}
-
-	/**
-	 * determine the path of web file is valid or not
-	 * 
-	 * @param path -
-	 *            the path of web file
-	 * @return - true - valid web file
-	 */
-	public static boolean isValidWebFile(IPath path) {
-		String[] jspExtensions = getJSPFileExtensions();
-
-		String extension = path.getFileExtension();
-		if (extension != null
-				&& Arrays.asList(jspExtensions).contains(extension))
-		{
-				return true;
-		}
-
-		return false;
-	}
-
-	/**
-	 * get the webpath for the project path. The project path is something like
-	 * "/projectname/webroot/filename.jsp", or "/projectname/webroot/folder".
-	 * The project information should be removed from project path, e.g,
-	 * "/filename.jsp" or "/folder/*";
-	 * 
-	 * @param strPath -
-	 *            the project path
-	 * @return - web path remove from "/projectname/webroot"
-	 * @deprecated use getWebPath(IPath path) instead.
-	 */
-	public static String getWebPath(String strPath) {
-		String strWebrootPath = "";
-		if (strPath != null) {
-			IPath path = new Path(strPath);
-			return getWebPath(path);
-		}
-		return strWebrootPath;
-	}
-
-	public static String getPageNameFromWebPath(String strWebPath) {
-		String pageName = strWebPath;
-
-		if (pageName.startsWith(IFileFolderConstants.PATH_SEPARATOR)) {
-			pageName = pageName.substring(1);
-		}
-
-		String[] jspExtensions = getJSPFileExtensions();
-		for (int i = 0, n = jspExtensions.length; i < n; i++) {
-			String extension = IFileFolderConstants.DOT + jspExtensions[i];
-			if (pageName.endsWith(extension)) {
-			pageName = pageName.substring(0, pageName.length()
-						- extension.length());
-				break;
-		}
-		}
-
-		return pageName;
-	}
-	/**
-	 * Get the JSP file extension from Eclipse preference
-	 * Windows->Preferences->General->Content Types
-	 * 
-	 * @return String Array for JSP file extensions
-	 */
-	public static String[] getJSPFileExtensions() {
-		IContentTypeManager typeManager = Platform.getContentTypeManager();
-		IContentType jspContentType = typeManager
-				.getContentType("org.eclipse.jst.jsp.core.jspsource");
-		if (jspContentType != null) {
-			return jspContentType
-					.getFileSpecs(IContentType.FILE_EXTENSION_SPEC);
-		}
-		return null;
-	}
-
-	/**
-	 * Tests if the passed IProject instance is a valid JSF project in the
-	 * following ways:
-	 * <ul>
-	 * <li>project is not null and is accessible, </li>
-	 * <li>project has the "jst.web" facet set on it.</li> 
-	 * </ul>
-	 * 
-	 * @param project
-	 *            IProject instance to be tested.
-	 * @return true if the IProject instance is a valid JSF project, else false.
-	 */
-	public static boolean isValidWebProject(IProject project) {
-		boolean isValid = false;
-		// check for null or inaccessible project
-		if (project != null && project.isAccessible()) {
-            // TODO: this was jst.jsf before, but we are checking for jst.web
-            // the javadoc seems out of sync with the method name
-			// check for "jst.web" facet on project
-			try {
-				IFacetedProject facetedProject = ProjectFacetsManager
-						.create(project);
-				if (facetedProject != null) {
-					Set projectFacets = facetedProject.getProjectFacets();
-					Iterator itProjectFacets = projectFacets.iterator();
-					while (itProjectFacets.hasNext()) {
-						IProjectFacetVersion projectFacetVersion = (IProjectFacetVersion) itProjectFacets
-								.next();
-						IProjectFacet projectFacet = projectFacetVersion
-								.getProjectFacet();
-						if ("jst.web".equals(projectFacet.getId())) { //$NON-NLS-1$
-							isValid = true;
-							break;
-						}
-					}
-				}
-			} catch (CoreException ce) {
-                JSFUICommonPlugin.getLogger(WebrootUtil.class).error("checking web project", ce);
-			}
-		}
-		return isValid;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/WorkspaceUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/WorkspaceUtil.java
deleted file mode 100644
index 3423c25..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/WorkspaceUtil.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.IWorkspace;
-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 class WorkspaceUtil {
-	/** log instance */
-	private static final Logger log = JSFUICommonPlugin
-			.getLogger(WorkspaceUtil.class);
-
-	public static IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	public WorkspaceUtil() {
-	    // TODO: can we delete this?
-	}
-
-	/**
-	 * Create the given file in the workspace resource info tree.
-	 */
-	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 {
-			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.
-	 */
-	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.
-	 */
-	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 {
-			getWorkspace().run(body, null);
-		} catch (CoreException e) {
-			// Test.EclipseWorkspaceTest.Error.ResourceCreationInWorkspace =
-			// Fail in creating resource:{0} in the workspace resource info
-			// tree.
-			log
-					.error(
-							"Test.EclipseWorkspaceTest.Error.ResourceCreationInWorkspace", resource.getName(), e);//$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * crate the resource if the resource is not existed, create a new one.
-	 * 
-	 * @param resource -
-	 *            resource instance
-	 * @param local -
-	 *            a flag controlling whether or not the folder will be local
-	 *            after the creation
-	 * @throws CoreException
-	 */
-	protected static void create(final IResource resource, boolean local)
-			throws CoreException {
-		if (resource == null || resource.exists()) {
-			return;
-		}
-		if (!resource.getParent().exists()) {
-			create(resource.getParent(), local);
-		}
-		switch (resource.getType()) {
-		case IResource.FILE:
-			((IFile) resource).create(local ? new ByteArrayInputStream(
-					new byte[0]) : null, true, getMonitor());
-			break;
-		case IResource.FOLDER:
-			((IFolder) resource).create(true, local, getMonitor());
-			break;
-		case IResource.PROJECT:
-			((IProject) resource).create(getMonitor());
-			((IProject) resource).open(getMonitor());
-			break;
-		}
-	}
-
-	/**
-	 * create and return a NullProgressMonitor
-	 * 
-	 * @return - NullProgressMonitor
-	 */
-	public static IProgressMonitor getMonitor() {
-		return new NullProgressMonitor();
-	}
-
-	/**
-	 * Get the project reference for a given path
-	 * 
-	 * @param path -
-	 *            the path
-	 * @return IProject - the project reference
-	 */
-	public static IProject getProjectFor(IPath path) {
-		String[] segs = path.segments();
-		String projectPath = new String();
-		IProject[] projects = ResourcesPlugin.getWorkspace().getRoot()
-				.getProjects();
-		IProject project = null;
-		for (int p = 0; p < projects.length; p++) {
-			if (projects[p].isOpen()) {
-				for (int s = 0; s < segs.length; s++) {
-					if (segs[s].equalsIgnoreCase(projects[p].getName())) {
-						// Once we have a match on the project name, then
-						// the remainder of the segments equals the project path
-						for (int s2 = s + 1; s2 < segs.length; s2++) {
-							projectPath = projectPath
-									+ IFileFolderConstants.PATH_SEPARATOR
-									+ segs[s2];
-						}
-						project = projects[p];
-						break;
-					}
-				}
-			}
-		}
-		if (project == null) {
-			return null;
-		}
-
-		// TODO: still don't understand why this refreshLocal is necessary
-		// for now, going to only allow it if this method is called 
-		// when the tree isn't locked.  This shouldn't cause a regression, since
-		// when the call fails currently things keep on going due to the catch
-		if (!project.getWorkspace().isTreeLocked())
-		{
-    		try {
-    			project.refreshLocal(IResource.DEPTH_INFINITE, null);
-    		} catch (CoreException e) {
-                // TODO C.B.:pushing this down to a warning because it creates really
-                // spurious output.  Don't know why we are calling refreshLocal at all.
-                JSFUICommonPlugin.getLogger(WorkspaceUtil.class).info("Error.RefreshingLocal", e);
-    		}
-		}
-		
-		IResource res = project.findMember(new Path(projectPath));
-		if ((res != null) && (res.exists())) {
-			return project;
-		}
-		return null;
-	}
-
-	/**
-	 * Get the project reference for a given file
-	 * 
-	 * @param file -
-	 *            the IFile file reference
-	 * @return IProject - the project reference
-	 */
-	public static IProject getProjectFor(IFile file) {
-		IPath testPath = new Path(file.getFullPath().toOSString());
-		return getProjectFor(testPath);
-	}
-
-	/**
-	 * Get the project reference for a given file
-	 * 
-	 * @param file -
-	 *            the File file reference
-	 * @return IProject - the project reference
-	 */
-	public static IProject getProjectFor(File file) {
-		IPath testPath = new Path(file.getAbsolutePath());
-		return getProjectFor(testPath);
-	}
-
-	/**
-	 * Get the project-relative resource reference for a given path
-	 * 
-	 * @param path -
-	 *            the path
-	 * @return IResource - the project-relative resource
-	 */
-	public static IResource getProjectRelativeResource(IPath path) {
-		String[] segs = path.segments();
-		String projectPath = new String();
-		IProject[] projects = ResourcesPlugin.getWorkspace().getRoot()
-				.getProjects();
-		IProject project = null;
-		for (int p = 0; p < projects.length; p++) {
-			if (projects[p].isOpen()) {
-				for (int s = 0; s < segs.length; s++) {
-					if (segs[s].equalsIgnoreCase(projects[p].getName())) {
-						// Once we have a match on the project name, then
-						// the remainder of the segments equals the project path
-						for (int s2 = s + 1; s2 < segs.length; s2++) {
-							projectPath = projectPath
-									+ IFileFolderConstants.PATH_SEPARATOR
-									+ segs[s2];
-						}
-						project = projects[p];
-						break;
-					}
-				}
-			}
-		}
-		if (project == null) {
-			return null;
-		}
-
-		return project.getFile(projectPath);
-	}
-
-	/**
-	 * Get the project-relative resource reference for a given file
-	 * 
-	 * @param file -
-	 *            the File file reference
-	 * @return IResource - the project-relative resource
-	 */
-	public static IResource getProjectRelativeResource(File file) {
-		IPath testPath = new Path(file.getAbsolutePath());
-		return getProjectRelativeResource(testPath);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/.classpath b/jsf/plugins/org.eclipse.jst.jsf.common/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/.cvsignore b/jsf/plugins/org.eclipse.jst.jsf.common/.cvsignore
deleted file mode 100644
index 2a89e4b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-bin
-@dot
-build.xml
-javaCompiler...args
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/.project b/jsf/plugins/org.eclipse.jst.jsf.common/.project
deleted file mode 100644
index 8bd8da5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.common</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.jsf.common/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index ae7ce73..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 16:00:59 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.common/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 47fdcaf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,77 +0,0 @@
-#Tue May 15 14:57:39 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/.settings/org.eclipse.jdt.ui.prefs b/jsf/plugins/org.eclipse.jst.jsf.common/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 82eb6c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Apr 06 18:25:15 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.common/META-INF/MANIFEST.MF
deleted file mode 100644
index c7c68f5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,53 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %plugin.name
-Bundle-SymbolicName: org.eclipse.jst.jsf.common;singleton:=true
-Bundle-Version: 1.0.1.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.common.JSFCommonPlugin$Implementation
-Bundle-Localization: plugin
-Export-Package: org.eclipse.jst.jsf.common;x-internal:=true,
- org.eclipse.jst.jsf.common.dom,
- org.eclipse.jst.jsf.common.internal;x-friends:="org.eclipse.jst.jsf.core",
- org.eclipse.jst.jsf.common.internal.types;x-friends:="org.eclipse.jst.jsf.core,org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.validation.el.tests,org.eclipse.jst.jsf.designtime.tests,org.eclipse.jst.jsf.context.symbol.tests",
- org.eclipse.jst.jsf.common.internal.resource;x-friends:="org.eclipse.jst.jsf.core.tests",
- org.eclipse.jst.jsf.common.metadata,
- org.eclipse.jst.jsf.common.metadata.internal;x-friends:="org.eclipse.jst.jsf.metadata.tests",
- org.eclipse.jst.jsf.common.metadata.internal.impl;x-internal:=true,
- org.eclipse.jst.jsf.common.metadata.internal.util;x-internal:=true,
- org.eclipse.jst.jsf.common.metadata.query,
- org.eclipse.jst.jsf.common.metadata.query.internal;x-friends:="org.eclipse.jst.jsf.metadata.tests",
- org.eclipse.jst.jsf.common.metadata.traittypes.traittypes,
- org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl;x-internal:=true,
- org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.util;x-internal:=true,
- org.eclipse.jst.jsf.common.sets,
- org.eclipse.jst.jsf.common.sets.constraint,
- org.eclipse.jst.jsf.common.sets.mapping,
- org.eclipse.jst.jsf.common.util,
- org.eclipse.jst.jsf.contentmodel.annotation,
- org.eclipse.jst.jsf.contentmodel.annotation.internal;x-friends:="org.eclipse.jst.jsf.metadata.tests",
- org.eclipse.jst.jsf.context,
- org.eclipse.jst.jsf.context.resolver,
- org.eclipse.jst.jsf.context.resolver.structureddocument,
- org.eclipse.jst.jsf.context.resolver.structureddocument.internal;x-friends:="org.eclipse.jst.jsf.core,org.eclipse.jst.jsf.contentassist.tests",
- org.eclipse.jst.jsf.context.resolver.structureddocument.internal.impl;x-internal:=true,
- org.eclipse.jst.jsf.context.structureddocument,
- org.eclipse.jst.jsf.context.structureddocument.internal.impl;x-internal:=true,
- org.eclipse.jst.jsf.context.symbol,
- org.eclipse.jst.jsf.context.symbol.internal.impl;x-internal:=true,
- org.eclipse.jst.jsf.context.symbol.internal.provider;x-internal:=true,
- org.eclipse.jst.jsf.context.symbol.internal.util;x-internal:=true,
- org.eclipse.jst.jsf.context.symbol.provider,
- org.eclipse.jst.jsf.context.symbol.source
-Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jst.jsp.core;bundle-version="[1.1.0,1.3.0)",
- org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jface.text;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.sse.ui;bundle-version="[1.0.101,1.1.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.emf.edit.ui;bundle-version="[2.2.0,2.4.0)",
- org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,2.4.0)"
-Eclipse-LazyStart: true
-Bundle-Vendor: %plugin.provider
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/about.html b/jsf/plugins/org.eclipse.jst.jsf.common/about.html
deleted file mode 100644
index 04d4782..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 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>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/build.properties b/jsf/plugins/org.eclipse.jst.jsf.common/build.properties
deleted file mode 100644
index 1d865d4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/build.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               bin/,\
-               build.properties,\
-               plugin.properties,\
-               about.html,\
-               plugin.xml,\
-               icons/,\
-               model/,\
-               schema/
-javacSource=1.5
-javacTarget=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanInstanceSymbol.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanInstanceSymbol.gif
deleted file mode 100644
index 6cdef7b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanInstanceSymbol.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanMethodSymbol.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanMethodSymbol.gif
deleted file mode 100644
index 45731fe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanMethodSymbol.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol.gif
deleted file mode 100644
index 53500da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBeanPropertySymbol.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBoundedJavaTypeDescriptor.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBoundedJavaTypeDescriptor.gif
deleted file mode 100644
index cdd3b76..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBoundedJavaTypeDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBoundedListTypeDescriptor.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBoundedListTypeDescriptor.gif
deleted file mode 100644
index 83afb9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBoundedListTypeDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBoundedMapTypeDescriptor.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBoundedMapTypeDescriptor.gif
deleted file mode 100644
index badaab0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IBoundedMapTypeDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IComponentSymbol.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IComponentSymbol.gif
deleted file mode 100644
index 347a8ff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IComponentSymbol.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IInstanceSymbol.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IInstanceSymbol.gif
deleted file mode 100644
index c673a52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IInstanceSymbol.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IJavaSymbol.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IJavaSymbol.gif
deleted file mode 100644
index d3dc5a9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IJavaSymbol.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IJavaTypeDescriptor2.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IJavaTypeDescriptor2.gif
deleted file mode 100644
index 9250fec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IJavaTypeDescriptor2.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IListTypeDescriptor.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IListTypeDescriptor.gif
deleted file mode 100644
index d92f34c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IListTypeDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMapTypeDescriptor.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMapTypeDescriptor.gif
deleted file mode 100644
index cdd3b76..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMapTypeDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMethodSymbol.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMethodSymbol.gif
deleted file mode 100644
index c4a8af4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IMethodSymbol.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IPropertySymbol.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IPropertySymbol.gif
deleted file mode 100644
index c8d381f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IPropertySymbol.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/ITypeDescriptor.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/ITypeDescriptor.gif
deleted file mode 100644
index badaab0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/ITypeDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IUnconstrainedMapTypeDescriptor.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IUnconstrainedMapTypeDescriptor.gif
deleted file mode 100644
index 33854e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/IUnconstrainedMapTypeDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/UnconstrainedMapTypeDescriptor.gif b/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/UnconstrainedMapTypeDescriptor.gif
deleted file mode 100644
index a26660e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/icons/full/obj16/UnconstrainedMapTypeDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/model/metadata.ecore b/jsf/plugins/org.eclipse.jst.jsf.common/model/metadata.ecore
deleted file mode 100644
index 9b202c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/model/metadata.ecore
+++ /dev/null
@@ -1,100 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="metadata"
-    nsURI="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" nsPrefix="md">
-  <eClassifiers xsi:type="ecore:EClass" name="Model" eSuperTypes="#//Entity">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="kind" value="element"/>
-      <details key="name" value="metadatamodel"/>
-    </eAnnotations>
-    <eOperations name="findIncludeGroup" eType="#//EntityGroup">
-      <eParameters name="groupId" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="accept">
-      <eParameters name="visitor" eType="#//IEntityVisitor"/>
-    </eOperations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="entityGroups" upperBound="-1"
-        eType="#//EntityGroup" eKeys="#//Entity/id #//Entity/type">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="entityGroup"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="sourceModelProvider" unique="false"
-        eType="#//IMetaDataSourceModelProvider" volatile="true" transient="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="currentModelContext" eType="#//ModelContext"
-        volatile="true" transient="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="EntityGroup" eSuperTypes="#//Entity"/>
-  <eClassifiers xsi:type="ecore:EClass" name="Entity">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="kind" value="element"/>
-      <details key="name" value="entity"/>
-    </eAnnotations>
-    <eOperations name="accept">
-      <eParameters name="visitor" eType="#//IEntityVisitor"/>
-    </eOperations>
-    <eOperations name="getModel" eType="#//Model"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="childEntities" upperBound="-1"
-        eType="#//Entity" containment="true" eKeys="#//Entity/id #//Entity/type">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="entity"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="traits" upperBound="-1"
-        eType="#//Trait" containment="true" eKeys="#//Trait/id">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="trait"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        iD="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="includeGroups" upperBound="-1"
-        eType="#//IncludeEntityGroup">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="include-entity-group"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IncludeEntityGroup">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="modelUri" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value="uri"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Trait">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="kind" value="element"/>
-      <details key="name" value="trait"/>
-    </eAnnotations>
-    <eOperations name="accept">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="body" value="visitor.visit(this);"/>
-      </eAnnotations>
-      <eParameters name="visitor" eType="#//ITraitVisitor"/>
-    </eOperations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        iD="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="value" lowerBound="1" eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EObject"
-        containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="sourceModelProvider" eType="#//IMetaDataSourceModelProvider"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="ITraitVisitor" instanceClassName="org.eclipse.jst.jsf.common.metadata.query.ITraitVisitor"
-      serializable="false"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="IEntityVisitor" instanceClassName="org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor"
-      serializable="false"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="IMetaDataSourceModelProvider" instanceClassName="org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="ModelContext" instanceClassName="org.eclipse.jst.jsf.common.metadata.internal.ModelKeyDescriptor"/>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/model/metadata.genmodel b/jsf/plugins/org.eclipse.jst.jsf.common/model/metadata.genmodel
deleted file mode 100644
index 4707b0b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/model/metadata.genmodel
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright (c) 2007 Oracle Corporation"
-    modelDirectory="/org.eclipse.jst.jsf.common/src" editDirectory="/org.eclipse.jst.jsf.common/src"
-    editorDirectory="/org.eclipse.jst.jsf.common/src" modelPluginID="org.eclipse.jst.jsf.common"
-    modelName="Metadata" editPluginClass="org.eclipse.jst.jsf.common.metadata.MetadataPlugin"
-    editorPluginClass="org.eclipse.jst.jsf.common.metadata.MetadataPlugin" generateSchema="true"
-    testsDirectory="/org.eclipse.jst.jsf.common/src" testSuiteClass="/org.eclipse.jst.jsf.common.metadata.MetadataAllTests"
-    importerID="org.eclipse.emf.importer.ecore">
-  <genAnnotations source="http://www.eclipse.org/emf/2002/GenModel/exporter/org.eclipse.xsd.ecore.exporter">
-    <genAnnotations source="selectedPackages">
-      <details key="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" value="metadata.xsd"/>
-    </genAnnotations>
-    <details key="directoryURI" value="schema/"/>
-  </genAnnotations>
-  <foreignModel>metadata.ecore</foreignModel>
-  <genPackages prefix="Metadata" basePackage="org.eclipse.jst.jsf.common" resource="XML"
-      disposableProviderFactory="true" classPackageSuffix="internal.impl" utilityPackageSuffix="internal.util"
-      providerPackageSuffix="internal.provider" presentationPackageSuffix="internal.presentation"
-      testsPackageSuffix="internal.tests" generateExampleClass="false" ecorePackage="metadata.ecore#/">
-    <genAnnotations source="http://www.eclipse.org/emf/2002/GenModel/exporter/org.eclipse.xsd.ecore.exporter">
-      <genAnnotations source="schema/metadata.xsd"/>
-    </genAnnotations>
-    <genDataTypes ecoreDataType="metadata.ecore#//ITraitVisitor"/>
-    <genDataTypes ecoreDataType="metadata.ecore#//IEntityVisitor"/>
-    <genDataTypes ecoreDataType="metadata.ecore#//IMetaDataSourceModelProvider"/>
-    <genDataTypes ecoreDataType="metadata.ecore#//ModelContext"/>
-    <genClasses ecoreClass="metadata.ecore#//Model">
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference metadata.ecore#//Model/entityGroups"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute metadata.ecore#//Model/sourceModelProvider"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute metadata.ecore#//Model/currentModelContext"/>
-      <genOperations ecoreOperation="metadata.ecore#//Model/findIncludeGroup">
-        <genParameters ecoreParameter="metadata.ecore#//Model/findIncludeGroup/groupId"/>
-      </genOperations>
-      <genOperations ecoreOperation="metadata.ecore#//Model/accept">
-        <genParameters ecoreParameter="metadata.ecore#//Model/accept/visitor"/>
-      </genOperations>
-    </genClasses>
-    <genClasses ecoreClass="metadata.ecore#//EntityGroup"/>
-    <genClasses ecoreClass="metadata.ecore#//Entity">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference metadata.ecore#//Entity/childEntities"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference metadata.ecore#//Entity/traits"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute metadata.ecore#//Entity/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute metadata.ecore#//Entity/type"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference metadata.ecore#//Entity/includeGroups"/>
-      <genOperations ecoreOperation="metadata.ecore#//Entity/accept">
-        <genParameters ecoreParameter="metadata.ecore#//Entity/accept/visitor"/>
-      </genOperations>
-      <genOperations ecoreOperation="metadata.ecore#//Entity/getModel"/>
-    </genClasses>
-    <genClasses ecoreClass="metadata.ecore#//Trait">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute metadata.ecore#//Trait/id"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference metadata.ecore#//Trait/value"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute metadata.ecore#//Trait/sourceModelProvider"/>
-      <genOperations ecoreOperation="metadata.ecore#//Trait/accept">
-        <genParameters ecoreParameter="metadata.ecore#//Trait/accept/visitor"/>
-      </genOperations>
-    </genClasses>
-    <genClasses ecoreClass="metadata.ecore#//IncludeEntityGroup">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute metadata.ecore#//IncludeEntityGroup/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute metadata.ecore#//IncludeEntityGroup/modelUri"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/model/metadataTraitTypes.ecore b/jsf/plugins/org.eclipse.jst.jsf.common/model/metadataTraitTypes.ecore
deleted file mode 100644
index dd850dc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/model/metadataTraitTypes.ecore
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="traittypes"
-    nsURI="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" nsPrefix="mdt">
-  <eClassifiers xsi:type="ecore:EClass" name="ListOfValues">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
-        eType="ecore:EClass http://www.eclipse.org/emf/2003/XMLType#//SimpleAnyType"
-        containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="item"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SetGenerator">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="algorithm" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="expression" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/model/metadataTraitTypes.genmodel b/jsf/plugins/org.eclipse.jst.jsf.common/model/metadataTraitTypes.genmodel
deleted file mode 100644
index 9633b3c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/model/metadataTraitTypes.genmodel
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright (c) 2007 Oracle Corporation"
-    modelDirectory="/org.eclipse.jst.jsf.common/src" modelPluginID="org.eclipse.jst.jsf.common"
-    modelName="TraitTypes" importerID="org.eclipse.emf.importer.ecore">
-  <foreignModel>metadataTraitTypes.ecore</foreignModel>
-  <genPackages prefix="TraitTypes" basePackage="org.eclipse.jst.jsf.common.metadata.traittypes"
-      resource="XML" disposableProviderFactory="true" classPackageSuffix="internal.impl"
-      utilityPackageSuffix="internal.util" providerPackageSuffix="internal.provider"
-      presentationPackageSuffix="internal.presentation" ecorePackage="metadataTraitTypes.ecore#/">
-    <genClasses ecoreClass="metadataTraitTypes.ecore#//ListOfValues">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference metadataTraitTypes.ecore#//ListOfValues/entries"/>
-    </genClasses>
-    <genClasses ecoreClass="metadataTraitTypes.ecore#//SetGenerator">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute metadataTraitTypes.ecore#//SetGenerator/algorithm"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute metadataTraitTypes.ecore#//SetGenerator/expression"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/model/symbol.ecore b/jsf/plugins/org.eclipse.jst.jsf.common/model/symbol.ecore
deleted file mode 100644
index 521e76e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/model/symbol.ecore
+++ /dev/null
@@ -1,263 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="symbol"
-    nsURI="http:///org/eclipse/jst/jsf/context/symbol.ecore" nsPrefix="org.eclipse.jst.jsf.context.symbol">
-  <eClassifiers xsi:type="ecore:EClass" name="IBeanInstanceSymbol" eSuperTypes="#//IInstanceSymbol #//IDescribedInDetail">
-    <eOperations name="getJavaTypeDescriptor" eType="#//IJavaTypeDescriptor2"/>
-    <eOperations name="setJavaTypeDescriptor">
-      <eParameters name="newTypeDescriptor" eType="#//IJavaTypeDescriptor2"/>
-    </eOperations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="properties" upperBound="-1"
-        eType="#//IBeanPropertySymbol" changeable="false" volatile="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methods" upperBound="-1"
-        eType="#//IBeanMethodSymbol" changeable="false" volatile="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IBeanPropertySymbol" eSuperTypes="#//IPropertySymbol #//IDescribedInDetail">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="owner" eType="#//IJavaTypeDescriptor2"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IInstanceSymbol" eSuperTypes="#//IObjectSymbol">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeResolved" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        changeable="false" volatile="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="runtimeSource" eType="#//ERuntimeSource"
-        defaultValueLiteral="TAG_INSTANTIATED_SYMBOL"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IJavaSymbol" eSuperTypes="#//ISymbol">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="javaElement" eType="#//IJavaElement"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ISymbol" abstract="true" interface="true">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ITypeDescriptor" abstract="true">
-    <eOperations name="instanceOf" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="isArray" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-    <eOperations name="getArrayElement" eType="#//IObjectSymbol"/>
-    <eOperations name="resolveType" eType="#//IType">
-      <eParameters name="resolvedTypeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="calculateSyntheticCall" eType="#//ISymbol">
-      <eParameters name="methodName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      <eParameters name="methodArgs" upperBound="-1" eType="#//ValueType"/>
-      <eParameters name="symbolName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="properties" upperBound="-1"
-        eType="#//IPropertySymbol" volatile="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        changeable="false" volatile="true" defaultValueLiteral=""/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="superTypeSignatures" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" volatile="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="interfaceTypeSignatures"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        volatile="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeSignatureDelegate"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methods" upperBound="-1"
-        eType="#//IMethodSymbol" volatile="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeParameterSignatures"
-        unique="false" upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        transient="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="jdtContext" eType="#//IJavaElement"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="enumType" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="IType" instanceClassName="org.eclipse.jdt.core.IType"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="IJavaElement" instanceClassName="org.eclipse.jdt.core.IJavaElement"/>
-  <eClassifiers xsi:type="ecore:EClass" name="IDescribedInDetail" abstract="true"
-      interface="true"/>
-  <eClassifiers xsi:type="ecore:EClass" name="IJavaTypeDescriptor2" eSuperTypes="#//ITypeDescriptor">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="#//IType"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="beanProperties" upperBound="-1"
-        eType="#//IBeanPropertySymbol" volatile="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="beanMethods" upperBound="-1"
-        eType="#//IBeanPropertySymbol" volatile="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="arrayCount" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IBeanMethodSymbol" eSuperTypes="#//IDescribedInDetail #//IMethodSymbol">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="owner" eType="#//IJavaTypeDescriptor2"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IComponentSymbol" eSuperTypes="#//IInstanceSymbol #//IDescribedInDetail"/>
-  <eClassifiers xsi:type="ecore:EClass" name="IPropertySymbol" eSuperTypes="#//IObjectSymbol">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="intermediate" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IMapTypeDescriptor" eSuperTypes="#//ITypeDescriptor">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="mapSource" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"
-        transient="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="immutable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="ERuntimeSource">
-    <eLiterals name="BUILT_IN_SYMBOL" literal="BUILT_IN_SYMBOL"/>
-    <eLiterals name="MANAGED_BEAN_SYMBOL" value="1"/>
-    <eLiterals name="TAG_INSTANTIATED_SYMBOL" value="2"/>
-    <eLiterals name="OTHER" value="3"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IMethodSymbol" eSuperTypes="#//ISymbol">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="signature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IObjectSymbol" abstract="true" interface="true"
-      eSuperTypes="#//ISymbol">
-    <eOperations name="supportsCoercion" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="coerce" eType="#//ITypeDescriptor">
-      <eParameters name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="call" eType="#//ISymbol">
-      <eParameters name="methodName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      <eParameters name="methodArguments" upperBound="-1" eType="#//ValueType"/>
-      <eParameters name="symbolName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="typeDescriptor" eType="#//ITypeDescriptor"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="readable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="writable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IBoundedTypeDescriptor" abstract="true"
-      interface="true" eSuperTypes="#//ITypeDescriptor">
-    <eOperations name="isUnboundedForType" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="getUnboundedProperty" eType="#//ISymbol">
-      <eParameters name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
-      <eParameters name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IBoundedMapTypeDescriptor" eSuperTypes="#//IMapTypeDescriptor #//IBoundedTypeDescriptor"/>
-  <eClassifiers xsi:type="ecore:EClass" name="IBoundedJavaTypeDescriptor" eSuperTypes="#//IJavaTypeDescriptor2 #//IBoundedTypeDescriptor"/>
-  <eClassifiers xsi:type="ecore:EClass" name="IListTypeDescriptor" eSuperTypes="#//ITypeDescriptor">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="listSource" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EEList"
-        transient="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IBoundedListTypeDescriptor" eSuperTypes="#//IListTypeDescriptor #//IBoundedTypeDescriptor"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="ValueType" instanceClassName="org.eclipse.jst.jsf.common.internal.types.ValueType"/>
-  <eSubpackages name="symbol" nsURI="http:///org/eclipse/jst/jsf/context/symbol.ecore"
-      nsPrefix="org.eclipse.jst.jsf.context.symbol">
-    <eClassifiers xsi:type="ecore:EDataType" name="ValueType" instanceClassName="org.eclipse.jst.jsf.common.internal.types.ValueType"/>
-    <eClassifiers xsi:type="ecore:EClass" name="IBoundedListTypeDescriptor" eSuperTypes="#//symbol/IListTypeDescriptor #//symbol/IBoundedTypeDescriptor"/>
-    <eClassifiers xsi:type="ecore:EClass" name="IListTypeDescriptor" eSuperTypes="#//symbol/ITypeDescriptor">
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="listSource" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EEList"
-          transient="true"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IBoundedJavaTypeDescriptor" eSuperTypes="#//symbol/IJavaTypeDescriptor2 #//symbol/IBoundedTypeDescriptor"/>
-    <eClassifiers xsi:type="ecore:EClass" name="IBoundedMapTypeDescriptor" eSuperTypes="#//symbol/IMapTypeDescriptor #//symbol/IBoundedTypeDescriptor"/>
-    <eClassifiers xsi:type="ecore:EClass" name="IBoundedTypeDescriptor" abstract="true"
-        interface="true" eSuperTypes="#//symbol/ITypeDescriptor">
-      <eOperations name="getUnboundedProperty" eType="#//symbol/ISymbol">
-        <eParameters name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        <eParameters name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
-      </eOperations>
-      <eOperations name="isUnboundedForType" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-        <eParameters name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      </eOperations>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IObjectSymbol" abstract="true" interface="true"
-        eSuperTypes="#//symbol/ISymbol">
-      <eOperations name="call" eType="#//symbol/ISymbol">
-        <eParameters name="symbolName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        <eParameters name="methodArguments" upperBound="-1" eType="#//symbol/ValueType"/>
-        <eParameters name="methodName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      </eOperations>
-      <eOperations name="coerce" eType="#//symbol/ITypeDescriptor">
-        <eParameters name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      </eOperations>
-      <eOperations name="supportsCoercion" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-        <eParameters name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      </eOperations>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="writable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="readable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-      <eStructuralFeatures xsi:type="ecore:EReference" name="typeDescriptor" eType="#//symbol/ITypeDescriptor"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IMethodSymbol" eSuperTypes="#//symbol/ISymbol">
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="signature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EEnum" name="ERuntimeSource">
-      <eLiterals name="OTHER" value="3"/>
-      <eLiterals name="TAG_INSTANTIATED_SYMBOL" value="2"/>
-      <eLiterals name="MANAGED_BEAN_SYMBOL" value="1"/>
-      <eLiterals name="BUILT_IN_SYMBOL" literal="BUILT_IN_SYMBOL"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IMapTypeDescriptor" eSuperTypes="#//symbol/ITypeDescriptor">
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="immutable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-          defaultValueLiteral="true"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="mapSource" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap"
-          transient="true"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IPropertySymbol" eSuperTypes="#//symbol/IObjectSymbol">
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="intermediate" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IComponentSymbol" eSuperTypes="#//symbol/IInstanceSymbol #//symbol/IDescribedInDetail"/>
-    <eClassifiers xsi:type="ecore:EClass" name="IBeanMethodSymbol" eSuperTypes="#//symbol/IDescribedInDetail #//symbol/IMethodSymbol">
-      <eStructuralFeatures xsi:type="ecore:EReference" name="owner" eType="#//symbol/IJavaTypeDescriptor2"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IJavaTypeDescriptor2" eSuperTypes="#//symbol/ITypeDescriptor">
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="arrayCount" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-      <eStructuralFeatures xsi:type="ecore:EReference" name="beanMethods" upperBound="-1"
-          eType="#//symbol/IBeanPropertySymbol" volatile="true"/>
-      <eStructuralFeatures xsi:type="ecore:EReference" name="beanProperties" upperBound="-1"
-          eType="#//symbol/IBeanPropertySymbol" volatile="true"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="#//symbol/IType"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IDescribedInDetail" abstract="true"
-        interface="true"/>
-    <eClassifiers xsi:type="ecore:EDataType" name="IJavaElement" instanceClassName="org.eclipse.jdt.core.IJavaElement"/>
-    <eClassifiers xsi:type="ecore:EDataType" name="IType" instanceClassName="org.eclipse.jdt.core.IType"/>
-    <eClassifiers xsi:type="ecore:EClass" name="ITypeDescriptor" abstract="true">
-      <eOperations name="calculateSyntheticCall" eType="#//symbol/ISymbol">
-        <eParameters name="symbolName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        <eParameters name="methodArgs" upperBound="-1" eType="#//symbol/ValueType"/>
-        <eParameters name="methodName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      </eOperations>
-      <eOperations name="resolveType" eType="#//symbol/IType">
-        <eParameters name="resolvedTypeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      </eOperations>
-      <eOperations name="getArrayElement" eType="#//symbol/IObjectSymbol"/>
-      <eOperations name="isArray" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-      <eOperations name="instanceOf" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-        <eParameters name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      </eOperations>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="jdtContext" eType="#//symbol/IJavaElement"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeParameterSignatures"
-          unique="false" upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-          transient="true"/>
-      <eStructuralFeatures xsi:type="ecore:EReference" name="methods" upperBound="-1"
-          eType="#//symbol/IMethodSymbol" volatile="true"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeSignatureDelegate"
-          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="interfaceTypeSignatures"
-          upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-          volatile="true"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="superTypeSignatures"
-          upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-          volatile="true"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeSignature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-          changeable="false" volatile="true" defaultValueLiteral=""/>
-      <eStructuralFeatures xsi:type="ecore:EReference" name="properties" upperBound="-1"
-          eType="#//symbol/IPropertySymbol" volatile="true"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="ISymbol" abstract="true" interface="true">
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IJavaSymbol" eSuperTypes="#//symbol/ISymbol">
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="javaElement" eType="#//symbol/IJavaElement"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IInstanceSymbol" eSuperTypes="#//symbol/IObjectSymbol">
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="runtimeSource" eType="#//symbol/ERuntimeSource"
-          defaultValueLiteral="TAG_INSTANTIATED_SYMBOL"/>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeResolved" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-          changeable="false" volatile="true"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IBeanPropertySymbol" eSuperTypes="#//symbol/IPropertySymbol #//symbol/IDescribedInDetail">
-      <eStructuralFeatures xsi:type="ecore:EReference" name="owner" eType="#//symbol/IJavaTypeDescriptor2"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IBeanInstanceSymbol" eSuperTypes="#//symbol/IInstanceSymbol #//symbol/IDescribedInDetail">
-      <eOperations name="setJavaTypeDescriptor">
-        <eParameters name="newTypeDescriptor" eType="#//symbol/IJavaTypeDescriptor2"/>
-      </eOperations>
-      <eOperations name="getJavaTypeDescriptor" eType="#//symbol/IJavaTypeDescriptor2"/>
-      <eStructuralFeatures xsi:type="ecore:EReference" name="methods" upperBound="-1"
-          eType="#//symbol/IBeanMethodSymbol" changeable="false" volatile="true"/>
-      <eStructuralFeatures xsi:type="ecore:EReference" name="properties" upperBound="-1"
-          eType="#//symbol/IBeanPropertySymbol" changeable="false" volatile="true"/>
-    </eClassifiers>
-  </eSubpackages>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/model/symbol.genmodel b/jsf/plugins/org.eclipse.jst.jsf.common/model/symbol.genmodel
deleted file mode 100644
index a068a79..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/model/symbol.genmodel
+++ /dev/null
@@ -1,121 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright 2006 Oracle"
-    modelDirectory="/org.eclipse.jst.jsf.common/src" editDirectory="/org.eclipse.jst.jsf.common/src"
-    editorDirectory="/org.eclipse.jst.jsf.context.symbol.editor/src" modelPluginID="org.eclipse.jst.jsf.common"
-    modelName="My" modelPluginClass="" editPluginClass="org.eclipse.jst.jsf.common.JSFCommonPlugin"
-    editorPluginClass="org.eclipse.jst.jsf.context.symbol.presentation.MyEditorPlugin"
-    testSuiteClass="org.eclipse.jst.jsf.context.symbol.tests.MyAllTests" importerID="org.eclipse.emf.importer.java">
-  <foreignModel>@model</foreignModel>
-  <genPackages prefix="Symbol" basePackage="org.eclipse.jst.jsf.context" disposableProviderFactory="true"
-      classPackageSuffix="internal.impl" utilityPackageSuffix="internal.util" providerPackageSuffix="internal.provider"
-      ecorePackage="symbol.ecore#/">
-    <genEnums ecoreEnum="symbol.ecore#//ERuntimeSource">
-      <genEnumLiterals ecoreEnumLiteral="symbol.ecore#//ERuntimeSource/BUILT_IN_SYMBOL"/>
-      <genEnumLiterals ecoreEnumLiteral="symbol.ecore#//ERuntimeSource/MANAGED_BEAN_SYMBOL"/>
-      <genEnumLiterals ecoreEnumLiteral="symbol.ecore#//ERuntimeSource/TAG_INSTANTIATED_SYMBOL"/>
-      <genEnumLiterals ecoreEnumLiteral="symbol.ecore#//ERuntimeSource/OTHER"/>
-    </genEnums>
-    <genDataTypes ecoreDataType="symbol.ecore#//IType"/>
-    <genDataTypes ecoreDataType="symbol.ecore#//IJavaElement"/>
-    <genDataTypes ecoreDataType="symbol.ecore#//ValueType"/>
-    <genClasses ecoreClass="symbol.ecore#//IBeanInstanceSymbol">
-      <genFeatures property="Readonly" notify="false" createChild="false" ecoreFeature="ecore:EReference symbol.ecore#//IBeanInstanceSymbol/properties"/>
-      <genFeatures property="Readonly" notify="false" createChild="false" ecoreFeature="ecore:EReference symbol.ecore#//IBeanInstanceSymbol/methods"/>
-      <genOperations ecoreOperation="symbol.ecore#//IBeanInstanceSymbol/getJavaTypeDescriptor"/>
-      <genOperations ecoreOperation="symbol.ecore#//IBeanInstanceSymbol/setJavaTypeDescriptor">
-        <genParameters ecoreParameter="symbol.ecore#//IBeanInstanceSymbol/setJavaTypeDescriptor/newTypeDescriptor"/>
-      </genOperations>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//IBeanPropertySymbol">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference symbol.ecore#//IBeanPropertySymbol/owner"/>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//IInstanceSymbol">
-      <genFeatures property="Readonly" createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IInstanceSymbol/typeResolved"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IInstanceSymbol/runtimeSource"/>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//IJavaSymbol">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IJavaSymbol/javaElement"/>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//ISymbol">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//ISymbol/name"/>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//ITypeDescriptor">
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference symbol.ecore#//ITypeDescriptor/properties"/>
-      <genFeatures property="Readonly" createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//ITypeDescriptor/typeSignature"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//ITypeDescriptor/superTypeSignatures"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//ITypeDescriptor/interfaceTypeSignatures"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//ITypeDescriptor/typeSignatureDelegate"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference symbol.ecore#//ITypeDescriptor/methods"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//ITypeDescriptor/typeParameterSignatures"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//ITypeDescriptor/jdtContext"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//ITypeDescriptor/enumType"/>
-      <genOperations ecoreOperation="symbol.ecore#//ITypeDescriptor/instanceOf">
-        <genParameters ecoreParameter="symbol.ecore#//ITypeDescriptor/instanceOf/typeSignature"/>
-      </genOperations>
-      <genOperations ecoreOperation="symbol.ecore#//ITypeDescriptor/isArray"/>
-      <genOperations ecoreOperation="symbol.ecore#//ITypeDescriptor/getArrayElement"/>
-      <genOperations ecoreOperation="symbol.ecore#//ITypeDescriptor/resolveType">
-        <genParameters ecoreParameter="symbol.ecore#//ITypeDescriptor/resolveType/resolvedTypeSignature"/>
-      </genOperations>
-      <genOperations ecoreOperation="symbol.ecore#//ITypeDescriptor/calculateSyntheticCall">
-        <genParameters ecoreParameter="symbol.ecore#//ITypeDescriptor/calculateSyntheticCall/methodName"/>
-        <genParameters ecoreParameter="symbol.ecore#//ITypeDescriptor/calculateSyntheticCall/methodArgs"/>
-        <genParameters ecoreParameter="symbol.ecore#//ITypeDescriptor/calculateSyntheticCall/symbolName"/>
-      </genOperations>
-    </genClasses>
-    <genClasses image="false" ecoreClass="symbol.ecore#//IDescribedInDetail"/>
-    <genClasses ecoreClass="symbol.ecore#//IJavaTypeDescriptor2">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IJavaTypeDescriptor2/type"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference symbol.ecore#//IJavaTypeDescriptor2/beanProperties"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference symbol.ecore#//IJavaTypeDescriptor2/beanMethods"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IJavaTypeDescriptor2/arrayCount"/>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//IBeanMethodSymbol">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference symbol.ecore#//IBeanMethodSymbol/owner"/>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//IComponentSymbol"/>
-    <genClasses ecoreClass="symbol.ecore#//IPropertySymbol">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IPropertySymbol/intermediate"/>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//IMapTypeDescriptor">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IMapTypeDescriptor/mapSource"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IMapTypeDescriptor/immutable"/>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//IMethodSymbol">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IMethodSymbol/signature"/>
-    </genClasses>
-    <genClasses image="false" ecoreClass="symbol.ecore#//IObjectSymbol">
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference symbol.ecore#//IObjectSymbol/typeDescriptor"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IObjectSymbol/readable"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IObjectSymbol/writable"/>
-      <genOperations ecoreOperation="symbol.ecore#//IObjectSymbol/supportsCoercion">
-        <genParameters ecoreParameter="symbol.ecore#//IObjectSymbol/supportsCoercion/typeSignature"/>
-      </genOperations>
-      <genOperations ecoreOperation="symbol.ecore#//IObjectSymbol/coerce">
-        <genParameters ecoreParameter="symbol.ecore#//IObjectSymbol/coerce/typeSignature"/>
-      </genOperations>
-      <genOperations ecoreOperation="symbol.ecore#//IObjectSymbol/call">
-        <genParameters ecoreParameter="symbol.ecore#//IObjectSymbol/call/methodName"/>
-        <genParameters ecoreParameter="symbol.ecore#//IObjectSymbol/call/methodArguments"/>
-        <genParameters ecoreParameter="symbol.ecore#//IObjectSymbol/call/symbolName"/>
-      </genOperations>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//IBoundedTypeDescriptor">
-      <genOperations ecoreOperation="symbol.ecore#//IBoundedTypeDescriptor/isUnboundedForType">
-        <genParameters ecoreParameter="symbol.ecore#//IBoundedTypeDescriptor/isUnboundedForType/typeSignature"/>
-      </genOperations>
-      <genOperations ecoreOperation="symbol.ecore#//IBoundedTypeDescriptor/getUnboundedProperty">
-        <genParameters ecoreParameter="symbol.ecore#//IBoundedTypeDescriptor/getUnboundedProperty/name"/>
-        <genParameters ecoreParameter="symbol.ecore#//IBoundedTypeDescriptor/getUnboundedProperty/typeSignature"/>
-      </genOperations>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//IBoundedMapTypeDescriptor"/>
-    <genClasses ecoreClass="symbol.ecore#//IBoundedJavaTypeDescriptor"/>
-    <genClasses ecoreClass="symbol.ecore#//IListTypeDescriptor">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute symbol.ecore#//IListTypeDescriptor/listSource"/>
-    </genClasses>
-    <genClasses ecoreClass="symbol.ecore#//IBoundedListTypeDescriptor"/>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.common/plugin.properties
deleted file mode 100644
index c56f413..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/plugin.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-###############################################################################
-plugin.name=JavaServer Faces Tools - Common
-plugin.provider=Eclipse.org
-
-###############################################################################
-extension-point.name.0 = annotationFiles
-extension-point.name.1 = JSF EL Symbol Source Provider
-extension-point.name.2 = Contextual Symbol Factory
-extension-point.name.3 = Metadata Domain Loading Strategies (internal)
-extension-point.name.4 = Metadata Domain Source Model Types (internal)
-extension-point.name.5 = Metadata Domain Source Model Type Translators (internal)
-extension-point.name.6 = Standard Metadata Files
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.common/plugin.xml
deleted file mode 100644
index 1e03d60..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/plugin.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
- <extension-point id="annotationFiles" name="%extension-point.name.0" schema="schema/annotationFiles.exsd"/>
- <extension-point id="symbolSourceProvider" name="%extension-point.name.1" schema="schema/symbols.exsd"/>
- <extension-point id="contextSymbolFactory" name="%extension-point.name.2" schema="schema/contextSymbolFactory.exsd"/>
- <extension-point id="domainLoadingStrategies" name="%extension-point.name.3" schema="schema/DomainLoadingStrategies.exsd"/>
- <extension-point id="domainSourceModelTypes" name="%extension-point.name.4" schema="schema/DomainSourceModelTypes.exsd"/>
- <extension-point id="domainSourceModelTypeTranslators" name="%extension-point.name.5" schema="schema/DomainSourceModelTypeTranslators.exsd"/>
- <extension-point id="standardMetaDataFiles" name="%extension-point.name.6" schema="schema/StandardMetaDataFiles.exsd"/>
-   <extension
-         point="org.eclipse.jst.jsf.common.domainLoadingStrategies">
-      <domainLoader
-            domainId="TagLibraryDomain"
-            domainLoadingStrategy="org.eclipse.jst.jsf.common.metadata.internal.JSPTagLibDomainLoadingStrategy"/>
-   </extension>
-   <extension
-         point="org.eclipse.jst.jsf.common.domainSourceModelTypes">
-      <domainSourceModelTypes
-            domainId="TagLibraryDomain"
-            domainSourceModelTypeId="DefaultMetaDataTagLibraryHandler"
-            locator="org.eclipse.jst.jsf.common.metadata.internal.StandardMetaDataLocator"
-            ordinal="10">
-      </domainSourceModelTypes>   
-   </extension>
-   <extension
-         point="org.eclipse.jst.jsf.common.domainSourceModelTypeTranslators">
-      <domainSourceModelTypeTranslator
-            domainSourceModelTypeId="DefaultMetaDataTagLibraryHandler"
-            translatorClass="org.eclipse.jst.jsf.common.metadata.internal.StandardMetaDataFilesTranslator">
-      </domainSourceModelTypeTranslator>
-   </extension>
-  <extension point="org.eclipse.emf.ecore.generated_package">
-    <package 
-       uri = "http:///org/eclipse/jst/jsf/context/symbol.ecore" 
-       class = "org.eclipse.jst.jsf.context.symbol.SymbolPackage"
-       genModel = "model/symbol.genmodel" /> 
-	<package 
-       uri = "http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" 
-       class = "org.eclipse.jst.jsf.common.metadata.MetadataPackage"
-       genModel = "model/metadata.genmodel" />        
-	<package 
-       uri = "http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" 
-       class = "org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage"
-       genModel = "model/metadataTraitTypes.genmodel" />
-  </extension>
-  <extension
-        point="org.eclipse.emf.edit.itemProviderAdapterFactories">
-        <factory 
-       uri = "http:///org/eclipse/jst/jsf/context/symbol.ecore" 
-       class = "org.eclipse.jst.jsf.context.symbol.internal.provider.SymbolItemProviderAdapterFactory" 
-       supportedTypes = 
-         "org.eclipse.emf.edit.provider.IEditingDomainItemProvider
-          org.eclipse.emf.edit.provider.IStructuredItemContentProvider
-          org.eclipse.emf.edit.provider.ITreeItemContentProvider
-          org.eclipse.emf.edit.provider.IItemLabelProvider
-          org.eclipse.emf.edit.provider.IItemPropertySource
-          org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider" />
-  </extension>
- 
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/schema/DomainLoadingStrategies.exsd b/jsf/plugins/org.eclipse.jst.jsf.common/schema/DomainLoadingStrategies.exsd
deleted file mode 100644
index a2b609d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/schema/DomainLoadingStrategies.exsd
+++ /dev/null
@@ -1,121 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.common">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.common" id="DomainLoadingStrategies" name="DomainLoadingStrategies"/>
-      </appInfo>
-      <documentation>
-         ** Should be considered internal at this time.   Subject to change **
-Allows for naming domains of metadata and binding to classes that can load sources of metadata into that domain.   A domain is a set of entities using jsf.common.metadata model.  In initial release, Tag Library domain will be supplied.  Tag files, Tags, attributes are the known entities on this domain, as an example.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="domainLoader"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="domainLoader">
-      <complexType>
-         <attribute name="domainId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Key used to name this domain.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="domainLoadingStrategy" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Fully qualified java class implementing &lt;code&gt;org.eclipse.jst.jsf.common.metadata.IDomainLoadingStrategy&lt;/code&gt; that will be used to load an instance of a metadata model.
-
-Implementing class requires a constructor taking the domainID String.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.common.metadata.internal.IDomainLoadingStrategy"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         2.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;extension
-         point=&quot;org.eclipse.jst.jsf.common.domainLoadingStrategies&quot;&gt;
-      &lt;domainLoader
-            domainId=&quot;TagLibraryDomain&quot;
-         domainLoadingStrategy=&quot;org.eclipse.jst.jsf.common.metadata.internal.JSPTagLibDomainLoadingStrategy&quot;/&gt;
-   &lt;/extension&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright 2007 Oracle
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/schema/DomainSourceModelTypeTranslators.exsd b/jsf/plugins/org.eclipse.jst.jsf.common/schema/DomainSourceModelTypeTranslators.exsd
deleted file mode 100644
index 1d9c020..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/schema/DomainSourceModelTypeTranslators.exsd
+++ /dev/null
@@ -1,120 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.common">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.common" id="DomainSourceModelTypeTranslators" name="DomainSourceModelTypeTranslators"/>
-      </appInfo>
-      <documentation>
-         ** Should be considered internal at this time.   Subject to change **
-Allows for metadata domain translators to be applied to a metadata domain source type.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="domainSourceModelTypeTranslator"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="domainSourceModelTypeTranslator">
-      <complexType>
-         <attribute name="domainSourceModelTypeId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique id from the domainSourceModelTypes ext-pt that will bind the translator class to that domain source.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="translatorClass" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Fully qualified class implementing &lt;code&gt;org.eclipse.jst.jsf.common.metadata.IMetaDataTranslator&lt;/code&gt; that will translate from the source domain to the &quot;standard&quot; domain of entities and traits.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.common.metadata.internal.IMetaDataTranslator"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         2.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;extension
-         point=&quot;org.eclipse.jst.jsf.common.domainSourceModelTypeTranslators&quot;&gt;
-      &lt;domainSourceModelTypeTranslator
-            class=&quot;org.eclipse.jst.jsf.common.metadata.internal.TaglibMetaDataTLDTranslator&quot;
-            domainSourceModelTypeId=&quot;TagLibMetaDataTagLibraryHandler&quot;&gt;
-      &lt;/domainSourceModelTypeTranslator&gt;
-   &lt;/extension&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright 2007 Oracle
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/schema/DomainSourceModelTypes.exsd b/jsf/plugins/org.eclipse.jst.jsf.common/schema/DomainSourceModelTypes.exsd
deleted file mode 100644
index 4bb747e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/schema/DomainSourceModelTypes.exsd
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.common">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.common" id="domainSourceModelTypes" name="Metadata Domain Source Model Types"/>
-      </appInfo>
-      <documentation>
-         ** Should be considered internal at this time.   Subject to change **
-Binds metadata source types to a particular domain of metadata.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="domainSourceModelTypes"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="domainSourceModelTypes">
-      <complexType>
-         <attribute name="domainSourceModelTypeId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Uniquely identifies this combination of domain and source metadata locator.  This id should be used by the domainSourceModelTypeTranslator ext-pt.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="domainId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The DomainLoadingStrategy domainId that this source is being bound to.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="locator" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A class implementing &lt;code&gt;IMetaDataLocator&lt;/code&gt; that is responsible for finding instances of metadata.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.common.metadata.internal.IMetaDataLocator"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="ordinal" type="string">
-            <annotation>
-               <documentation>
-                  An optional integer ordinal that is used to prioritize a source if the domain loading strategy does not supply it&apos;s own sorting.  The higher the number, the higher the priority.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         2.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright 2007 Oracle
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/schema/StandardMetaDataFiles.exsd b/jsf/plugins/org.eclipse.jst.jsf.common/schema/StandardMetaDataFiles.exsd
deleted file mode 100644
index 1ab7d63..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/schema/StandardMetaDataFiles.exsd
+++ /dev/null
@@ -1,134 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.common">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.common" id="StandardMetaDataFiles" name="StandardMetaDataFiles"/>
-      </appInfo>
-      <documentation>
-         Defines a file of metadata for a given URI in &quot;standard&quot; form loadable by &lt;code&gt;org.eclipse.jst.jsf.common.metadata model&lt;/code&gt;
-
-&lt;p&gt;&lt;b&gt;This extension point is provisional and subject to change&lt;/b&gt;&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="standardMetaDataFile" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="standardMetaDataFile">
-      <annotation>
-         <documentation>
-            Mapping of a namespace URI to an XML file loadable by a standard metadata EMF model defined by &lt;code&gt;http://org.eclipse.jst.jsf.common.metadata/metadata.ecore&lt;/code&gt;.     See &lt;code&gt;org.eclipse.jst.jsf.standard.tagsupport&lt;/code&gt; plugin and the /metadata/jsf_core.xml file.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="uri" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Content model URI being annotated.  eg.  &quot;http://java.sun.com/jsf/core&quot;.   This can, of course, be any string that the consumer wishes to use as a key.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="location" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Location of the annotation file.   If no locator is provided, it will use the default &lt;code&gt;PluginRelativeStandardMetaDataSourceFileLocator&lt;/code&gt; which will find the file in a location relative to the plugin.
-eg. /metadata/jsf_core.xml
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="locator" type="string">
-            <annotation>
-               <documentation>
-                  Class extending &lt;code&gt;org.eclipse.jst.jsf.common.metadata.internal.StandardMetaDataSourceFileLocator&lt;/code&gt; that will be used to locate the standard metadata file.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.common.metadata.internal.StandardMetaDataSourceFileLocator"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         2.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;extension
-         point=&quot;org.eclipse.jst.jsf.common.standardMetaDataFiles&quot;&gt;
-      &lt;standardMetaDataFile
-            location=&quot;/metadata/JSF_HTML.xml&quot;
-            uri=&quot;http://java.sun.com/jsf/html&quot;&gt;
-      &lt;/standardMetaDataFile&gt;
-   &lt;/extension&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright 2007 Oracle
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/schema/annotationFiles.exsd b/jsf/plugins/org.eclipse.jst.jsf.common/schema/annotationFiles.exsd
deleted file mode 100644
index 4db4fe7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/schema/annotationFiles.exsd
+++ /dev/null
@@ -1,138 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.common">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.common" id="annotationFiles" name="Annotation Files"/>
-      </appInfo>
-      <documentation>
-         Adds annotation meta-data to a content model.  An extending plugin may only create one annotation file for a given URI.
-
-&lt;p&gt;&lt;b&gt;This extension point is provisional and subject to change&lt;/b&gt;&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="annotationFile" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="annotationFile">
-      <annotation>
-         <documentation>
-            File used to map annotations to a tag library content model.  The file assigns properties to a tag element or attribute.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="uri" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Content model URI being annotated.  eg.  &quot;http://java.sun.com/jsf/core&quot;.   This can, of course, be any string that the consumer wishes to use as a key.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="location" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Location of the annotation file.   If no locator is provided, it will use the default &lt;code&gt;CMPluginRelativeSourceFileLocator&lt;/code&gt; which will find the file in a location relative to the plugin.
-eg. /metadata/jsf_core.xml
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="locator" type="string">
-            <annotation>
-               <documentation>
-                  Class implementing the abstract &lt;code&gt;CMAnnotationSourceFileLocator&lt;/code&gt; class.  Responsible for locating the annotation file and returning an InputStream to the parser and returning a &lt;code&gt;ResourceBundle&lt;/code&gt; if there is one.   If a locator is not supplied, the default implementation for a plugin relative file, &lt;code&gt;CMPluginRelativeSourceFileLocator&lt;/code&gt; will be used.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.contentmodel.annotation.CMAnnotationSourceFileLocator:org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationFileParser"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="parser" type="string">
-            <annotation>
-               <documentation>
-                  The name of the parser class used to fill the internal model.  If not specified the default, &lt;code&gt;CMAnnotationFileParser&lt;/code&gt;, will be used which conforms to the default schema &lt;code&gt;http://org.eclipse.jst.jsf.contentmodel.annotations/grammarAnnotationSchema&lt;/code&gt;.   If parser is provided, it must implement &lt;code&gt;ICMAnnotationFileParser&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.contentmodel.annotation.CMAnnotationSourceFileLocator:org.eclipse.jst.jsf.contentmodel.annotations.ICMAnnotationFileParser"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.5
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         The parser, if specified, must implement &lt;code&gt;ICMAnnotationFileParser&lt;/code&gt; to create &lt;code&gt;CMElementAnnotation&lt;/code&gt; and &lt;code&gt;CMAttributeAnnotations&lt;/code&gt; in the &lt;code&gt;CMAnnotationMap&lt;/code&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright 2006 Oracle
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/schema/contextSymbolFactory.exsd b/jsf/plugins/org.eclipse.jst.jsf.common/schema/contextSymbolFactory.exsd
deleted file mode 100644
index b44040c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/schema/contextSymbolFactory.exsd
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.common">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.common" id="contextSymbolFactory" name="Contextual Symbol Factory"/>
-      </appInfo>
-      <documentation>
-         The context symbol factory allows a symbol factory with a specific id to be registered to create symbols in a particular context.  Clients wishing to delegate symbol construction in a particular context may then request the symbol factory based on its id.
-
-To get a map of registered symbol factories keyed by id, call SymbolsPlugin.getSymbolFactories().
-
-The most common use of this extension point is by the JSPModelProcessor.  By decorating a tag attribute with meta-data pointing to a context symbol factory with a particular id, the JSP model processor will call that symbol factory to create a symbol for that tag.
-
-See developer docs on decorating variable contributing tags for more information.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <choice>
-            <element ref="contextSymbolFactory"/>
-         </choice>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="contextSymbolFactory">
-      <annotation>
-         <documentation>
-            The context symbol factory description.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="factory" type="string" use="required">
-            <annotation>
-               <documentation>
-                  An instance of AbstractContextSymbolFactory that implements the context symbol factory.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.context.symbol.source.AbstractContextSymbolFactory"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="factoryId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id that will be used to uniquely identify this factory in meta-data or elsewhere.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.5
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;The following example creates a symbol factory for creating symbols.&lt;/p&gt;
-
-&lt;p&gt;
-&lt;pre&gt;
-&lt;extension
-     point=&quot;org.eclipse.jst.jsf.context.symbol.contextSymbolFactory&quot;&gt;
-   &lt;contextSymbolFactory
-         factory=&quot;org.eclipse.jst.jsf.designtime.internal.jsp.JSPDefaultSymbolFactory&quot;
-         factoryId=&quot;org.eclipse.jst.jsf.designtime.core.loadBundle&quot;/&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-
-&lt;p&gt;When the symbol factory &lt;i&gt;org.eclipse.jst.jsf.designtime.core.loadBundle&lt;/i&gt; is requested, an instance of JSPDefaultSymbolFactory will be constructed.&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright 2006 Oracle
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/schema/grammar-annotations.xsd b/jsf/plugins/org.eclipse.jst.jsf.common/schema/grammar-annotations.xsd
deleted file mode 100644
index 2319744..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/schema/grammar-annotations.xsd
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<xsd:schema
-	targetNamespace="http://org.eclipse.jst.jsf.contentmodel.annotations/grammarAnnotationSchema" 
-	version="1.0"
-	attributeFormDefault="unqualified"
-	elementFormDefault="unqualified" 
-	xmlns="http://org.eclipse.jst.jsf.contentmodel.annotations/grammarAnnotationSchema"
-	xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-	
-	<xsd:element name="grammar-annotations"
-		type="grammar-annotationType" />
-		
-	<xsd:complexType name="grammar-annotationType">
-		<xsd:sequence>
-			<xsd:element name="cm-element"
-				type="cm-elementType" minOccurs="1" maxOccurs="unbounded" />
-		</xsd:sequence>
-		<xsd:attribute name="caseSensitive" type="xsd:boolean" use="optional" default="true"/>
-	</xsd:complexType>
-	<xsd:complexType name="cm-elementType">
-		<xsd:sequence>
-			<xsd:element name="cm-attribute" type="cm-attributeType" minOccurs="0" maxOccurs="unbounded"/>
-			<xsd:element name="property" type="propertyType" minOccurs="0" maxOccurs="unbounded"/>
-		</xsd:sequence>
-		<xsd:attribute name="name" type="xsd:string" use="required"/>
-	</xsd:complexType>
-	<xsd:complexType name="cm-attributeType">
-		<xsd:sequence>
-			<xsd:element name="property"
-				type="propertyType" minOccurs="0" maxOccurs="unbounded"/>
-		</xsd:sequence>
-		<xsd:attribute name="name" type="xsd:string" use="required"/>
-	</xsd:complexType>
-	<xsd:complexType name="propertyType">
-		<xsd:sequence>
-			<xsd:element name="value" type="xsd:string" minOccurs="1" maxOccurs="unbounded"/>
-		</xsd:sequence>		
-		<xsd:attribute name="name" type="xsd:string" use="required"/>		
-	</xsd:complexType>
-</xsd:schema>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/schema/symbols.exsd b/jsf/plugins/org.eclipse.jst.jsf.common/schema/symbols.exsd
deleted file mode 100644
index 9269e28..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/schema/symbols.exsd
+++ /dev/null
@@ -1,121 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.common">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.common" id="symbols" name="Symbol Source Provider"/>
-      </appInfo>
-      <documentation>
-         A symbol source provider is called to discover EL namespace variable symbols.  For example, managed bean variable symbols, are contributed through a symbol source provider.  A symbol source provider may or may not wish to use a context symbol factory depending on the situation.
-
-When an EL variable is resolved, each symbol provider will be considered equally.  All of the information that determines a symbol&apos;s characteristics must be encoded in the returned ISymbol object.
-
-A list of registered symbol providers may be found by calling SymbolsPlugin.getSymbolSourceProvider().
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <choice>
-            <element ref="symbolSourceId"/>
-         </choice>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="symbolSourceId">
-      <complexType>
-         <attribute name="factory" type="string" use="required">
-            <annotation>
-               <documentation>
-                  An instance of the factory interface that will be invoked to create an instance of this symbol source provider.  Factory must have a zero-arg default constructor.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.context.symbol.source.ISymbolSourceProviderFactory"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.5
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following xml is used to contribute a set of default providers to contribute managed bean, built-in and tag contributed variables:
-
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.jst.jsf.context.symbol.symbolSourceProvider&quot;&gt;
-      &lt;symbolSourceId factory=&quot;org.eclipse.jst.jsf.designtime.internal.symbols.DefaultBeanSymbolSourceProvider&quot;/&gt;
-      &lt;symbolSourceId factory=&quot;org.eclipse.jst.jsf.designtime.internal.symbols.JSPTagVariableSymbolSourceProvider&quot;/&gt;
-      &lt;symbolSourceId factory=&quot;org.eclipse.jst.jsf.designtime.internal.symbols.DefaultBuiltInSymbolProvider&quot;/&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright 2006 Oracle
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/JSFCommonPlugin.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/JSFCommonPlugin.java
deleted file mode 100644
index 83e0407..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/JSFCommonPlugin.java
+++ /dev/null
@@ -1,332 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.ILog;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.EMFPlugin;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.jst.jsf.context.symbol.source.AbstractContextSymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolSourceProvider;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolSourceProviderFactory;
-import org.osgi.framework.Bundle;
-
-/**
- * This is the central singleton for the My edit plugin.
- * <!-- begin-user-doc -->
- * This class is not API.
- * <!-- end-user-doc -->
- * @generated
- */
-public final class JSFCommonPlugin extends EMFPlugin {
-
-	/**
-	 * Plugin id
-	 */
-	public static final String PLUGIN_ID = "org.eclipse.jst.jsf.common"; //$NON-NLS-1$
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    private static List<ISymbolSourceProviderFactory>  registeredSymbolSourceProviders;
-    private static Map<String,AbstractContextSymbolFactory>   registeredSymbolFactories;
-    
-    private final static String     FACTORY_ATTRIBUTE_NAME = "factory"; //$NON-NLS-1$
-    private final static String     FACTORY_ATTRIBUTE_ID_NAME = "factoryId";  //$NON-NLS-1$
-    private final static String     SYMBOL_SOURCE_ID = "symbolSourceId";  //$NON-NLS-1$
-    private final static String     CONTEXT_SYMBOL_FACTORY =  "contextSymbolFactory"; //$NON-NLS-1$
-	/**
-	 * Keep track of the singleton.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final JSFCommonPlugin INSTANCE = new JSFCommonPlugin();
-
-	/**
-	 * Keep track of the singleton.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private static Implementation plugin;
-
-	/**
-	 * Create the instance.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public JSFCommonPlugin() {
-		super
-		  (new ResourceLocator [] {
-		   });
-	}
-
-	/**
-	 * Returns the singleton instance of the Eclipse plugin.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the singleton instance.
-	 * @generated
-	 */
-    public ResourceLocator getPluginResourceLocator() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the singleton instance of the Eclipse plugin.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the singleton instance.
-	 * @generated
-	 */
-    public static Implementation getPlugin() {
-		return plugin;
-	}
-
-    /**
-     * @param e
-     * @param msg
-     */
-    public static void log(final Exception e, final String msg) {
-        final ILog log = getPlugin().getLog();
-
-        log.log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.OK, msg, e));
-    }
-
-    /**
-     * Logs using the default ILog implementation provided by getLog().
-     * 
-     * @param severity Severity (IStatus constant) of log entry
-     * @param message Human-readable message describing log entry
-     * @param ex Throwable instance (can be null)
-     */
-    public static void log(int severity, String message, Throwable ex) {
-        getPlugin().getLog().log(new Status(severity, PLUGIN_ID, IStatus.OK, message, ex));
-    }
-
-    /**
-     * Logs using the default ILog implementation provided by getLog().
-     * 
-     * @param severity Severity (IStatus constant) of log entry
-     * @param message Human-readable message describing log entry
-     */
-    public static void log(int severity, String message) {
-        log(severity, message, null);
-    }
-    /**
-     * @return all registered symbol source providers
-     */
-    public static ISymbolSourceProvider[]  getSymbolSourceProvider()
-    {
-        return registeredSymbolSourceProviders.toArray(new ISymbolSourceProvider[0]);
-    }
-    
-    /**
-     * @return all registered symbol source providers
-     */
-    public synchronized static List<ISymbolSourceProviderFactory> getSymbolSourceProviders()
-    {
-        if (registeredSymbolSourceProviders == null)
-        {
-            registerProviders();
-            if (registeredSymbolSourceProviders == null)
-            {
-                throw new AssertionError("registerProviders failed"); //$NON-NLS-1$
-            }
-        }
-        return Collections.unmodifiableList(registeredSymbolSourceProviders);
-    }
-    
-    private static void registerProviders()
-    {
-        final IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(plugin.getBundle().getSymbolicName(), Implementation.SYMBOL_SOURCE_EXT_ID);
-        final IExtension[] extensions = point.getExtensions();
-        registeredSymbolSourceProviders = new ArrayList<ISymbolSourceProviderFactory>(extensions.length);
-
-        for (int i = 0; i < extensions.length; i++)
-        {
-            final IExtension extension = extensions[i];
-            final IConfigurationElement[] elements = 
-                extension.getConfigurationElements();
-            final String bundleId = extension.getContributor().getName();
-            
-            for (int j = 0; j < elements.length; j++)
-            {
-                final IConfigurationElement element = elements[j];
-                if (SYMBOL_SOURCE_ID.equals(element.getName())
-                        && element.getAttribute(FACTORY_ATTRIBUTE_NAME) != null)
-                {
-                    String factoryClassName = element.getAttribute(FACTORY_ATTRIBUTE_NAME);
-                    final Bundle bundle = Platform.getBundle(bundleId);
-                    
-                    if (bundle != null)
-                    {
-                        try
-                        {
-                            Class factoryClass = bundle.loadClass(factoryClassName);
-                            
-                            ISymbolSourceProviderFactory factory = 
-                                (ISymbolSourceProviderFactory) factoryClass.newInstance();
-
-                            registeredSymbolSourceProviders.add(factory);
-                        }
-                        catch (Exception e)
-                        {
-                            plugin.log(new Status(IStatus.ERROR, plugin.getBundle().getSymbolicName(), 0, "Error loading symbol provider extension point",e)); //$NON-NLS-1$
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * @return the list of registed symbol factories
-     */
-    public synchronized static Map<String, AbstractContextSymbolFactory> getSymbolFactories()
-    {
-        if (registeredSymbolFactories == null)
-        {
-            registerSymbolFactories();
-            if (registeredSymbolFactories == null)
-            {
-                throw new AssertionError("registerProviders failed"); //$NON-NLS-1$
-            }
-        }
-        return Collections.unmodifiableMap(registeredSymbolFactories);
-    }
-    
-    private static void registerSymbolFactories()
-    {
-        final IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(plugin.getBundle().getSymbolicName(), Implementation.SYMBOL_FACTORY_EXT_ID);
-        final IExtension[] extensions = point.getExtensions();
-        registeredSymbolFactories = new HashMap<String, AbstractContextSymbolFactory>(extensions.length);
-
-        for (int i = 0; i < extensions.length; i++)
-        {
-            final IExtension extension = extensions[i];
-            final IConfigurationElement[] elements = 
-                extension.getConfigurationElements();
-            final String bundleId = extension.getContributor().getName();
-            
-            for (int j = 0; j < elements.length; j++)
-            {
-                final IConfigurationElement element = elements[j];
-                if (CONTEXT_SYMBOL_FACTORY.equals(element.getName())
-                        && element.getAttribute(FACTORY_ATTRIBUTE_NAME) != null)
-                {
-                    final String factoryClassName = element.getAttribute(FACTORY_ATTRIBUTE_NAME);
-                    final String factoryId = element.getAttribute(FACTORY_ATTRIBUTE_ID_NAME);
-                    final Bundle bundle = Platform.getBundle(bundleId);
-                    
-                    if (bundle != null)
-                    {
-                        try {
-                            Class factoryClass = bundle.loadClass(factoryClassName);
-                        
-                            AbstractContextSymbolFactory factory = 
-                                (AbstractContextSymbolFactory) factoryClass.newInstance();
-                            registeredSymbolFactories.put(factoryId, factory);
-                        } catch (InstantiationException e) {
-                            plugin.log(new Status(IStatus.ERROR, plugin.getBundle().getSymbolicName(), 0, "Error loading symbol factory extension point",e)); //$NON-NLS-1$
-                        } catch (IllegalAccessException e) {
-                            plugin.log(new Status(IStatus.ERROR, plugin.getBundle().getSymbolicName(), 0, "Error loading symbol factory extension point",e)); //$NON-NLS-1$
-                        } catch (ClassNotFoundException e) {
-                            plugin.log(new Status(IStatus.ERROR, plugin.getBundle().getSymbolicName(), 0, "Error loading symbol factory extension point",e)); //$NON-NLS-1$
-                        }
-                    }
-                }
-            }
-        }
-    }
-    
-    /**
-     * Logs an exception in this plugin to the error log
-     * 
-     * @param t
-     */
-    public static void log(Throwable t)
-    {
-        ILog log = getPlugin().getLog();
-        IStatus status = new Status(IStatus.ERROR, getPlugin().getSymbolicName(), 0,  "Caught exception", t); //$NON-NLS-1$
-        log.log(status);
-    }
-
-	/**
-	 * The actual implementation of the Eclipse <b>Plugin</b>.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static class Implementation extends EclipsePlugin 
-    {
-        /**
-         * Name of the symbolSourceProvider ext point
-         */
-        public static final  String   SYMBOL_SOURCE_EXT_ID = "symbolSourceProvider"; //$NON-NLS-1$
-        /**
-         * Local identifier for the symbol factory extension point
-         */
-        public static final  String   SYMBOL_FACTORY_EXT_ID = "contextSymbolFactory"; //$NON-NLS-1$
-		/**
-		 * Creates an instance.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        public Implementation() {
-			super();
-
-			// Remember the static instance.
-			//
-			plugin = this;
-		}
-	}
-    
-	
-	/**
-	 * Utility method returning class from class name using classloader from specified bundle
-	 * @param className
-	 * @param bundleId
-	 * @return Class
-	 */
-	public static Class<?> loadClass(String className, String bundleId) {
-		Class<?> aClass = null;
-		try {
-			if (bundleId != null){
-				Bundle bundle = Platform.getBundle(bundleId);
-				if (bundle != null){
-					aClass = bundle.loadClass(className);
-				}
-			}
-		} catch (ClassNotFoundException e) {
-			log(e);
-		}
-		return aClass;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/TagIdentifier.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/TagIdentifier.java
deleted file mode 100644
index b92b393..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/TagIdentifier.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.dom;
-
-import javax.xml.namespace.QName;
-
-
-/**
- * Creates an abstraction for a tag.  A tag is defined as a DOM Element whose
- * namespace uri may be defined outside of the DOM, such as in a JSP tag library
- * declaration.  This allows tags to be abstracted from actual DOM elements, which
- * is useful in situations like palette creation drops where the construction information
- * is known, but we are not ready to create and add a node to the document yet.
- * 
- * All tag TagIdentifier<i>s</i> should be considered immutable and idempotent.  
- * TagIdentifier instances may be cached by the factory.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public abstract class TagIdentifier 
-{
-    /**
-     * @return the uri that uniquely identifies the tag.  
-     * 
-     * i.e.
-     * 
-     * If the tag is defined by an XML namespace, then that uri string will be returned.
-     * If the tag is defined by a JSP tag library, then the tag library uri should
-     * be returned.
-     */
-    public abstract String getUri();
-    
-    /**
-     * @return the local name of the tag (without namespace prefix)
-     */
-    public abstract String getTagName();
-    
-    /**
-     * @return true if this tag is a JSP tag
-     */
-    public abstract boolean isJSPTag();
-
-    public final boolean equals(Object compareTo)
-    {
-        if (compareTo instanceof TagIdentifier)
-        {
-            return isSameTagType((TagIdentifier) compareTo);
-        }
-        return false;
-    }
-    
-    public final int hashCode()
-    {
-        // use toLowerCase to ensure equals matches
-        int hashCode = getTagName().toLowerCase().hashCode();
-        
-        String uri = getUri();
-        if (uri != null)
-        {
-            hashCode ^= uri.hashCode();
-        }
-        return hashCode;
-    }
-    
-    /**
-     * @param tagWrapper
-     * @return true if tagWrapper represents the same tag as this.
-     */
-    public final boolean isSameTagType(TagIdentifier tagWrapper)
-    {
-        if (tagWrapper == this)
-        {
-            return true;
-        }
-        
-        final String uri = tagWrapper.getUri();
-        
-        if (uri == null && getUri() != null)
-        {
-            return false;
-        }
-        else if (uri.equals(getUri()))
-        {
-            final String tagName = tagWrapper.getTagName();
-            
-            if (tagName == null && getTagName() != null)
-            {
-                return false;
-            }
-
-            // uri and tag name must both the same for it to be the same type
-            // TODO: the ignore case thing is dependent on the type of container document
-            // Use toLower instead of equalsIgnoreCase to ensure that hashCode generates
-            // a hashCode that guarantees x.equals(y) => x.hashCode == y.hashCode
-            if (tagName.toLowerCase().equals((getTagName().toLowerCase())))
-            {
-                return true;
-            }
-        }
-
-        // fall-through, not same
-        return false;
-    }
-    
-    /**
-     * @return the QName equivalent.  Returns a new object on every invocation.
-     */
-    public final QName asQName()
-    {
-        return new QName(getUri(), getTagName());
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/ITestTracker.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/ITestTracker.java
deleted file mode 100644
index a3369aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/ITestTracker.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.eclipse.jst.jsf.common.internal;
-
-/**
- * An injection interface that allows classes to selectively report test progress.
- * 
- * @author cbateman
- *
- */
-public interface ITestTracker 
-{
-    /**
-     * Event types
-     *
-     */
-    public enum Event
-    {
-        /**
-         * Signals that tracking should begin on the eventLabel
-         * The seqId must be repeated on the STOP_TRACKING event
-         * for the same event.
-         */
-        START_TRACKING,
-        /**
-         * Signals that tracking should stop on the named event
-         * for the seqId that was passed first in the START_TRACKING.
-         * 
-         */
-        STOP_TRACKING
-    }
-    
-    /**
-     * Fires the event of type event, a unique instance tracking seqId
-     * and a label called eventLabel.
-     * 
-     * @param event
-     * @param seqId
-     * @param eventLabel
-     */
-    void fireEvent(Event event, long seqId, String eventLabel);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/JSPUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/JSPUtil.java
deleted file mode 100644
index ef830ff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/JSPUtil.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package org.eclipse.jst.jsf.common.internal;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-
-/**
- * Utility JSP methods
- * @author cbateman
- *
- */
-public final class JSPUtil 
-{
-    private final static String  CTYPE_JSPSOURCE = 
-        "org.eclipse.jst.jsp.core.jspsource"; //$NON-NLS-1$
-    private final static String  CTYPE_JSPFRAGMENTSOURCE = 
-        "org.eclipse.jst.jsp.core.jspfragmentsource"; //$NON-NLS-1$
-    /**
-     * @param contentType
-     * @return true if contentType is one of the content types registered
-     * for JSP files
-     */
-    public static boolean isJSPContentType(final String contentType)
-    {
-        return CTYPE_JSPSOURCE.equals(contentType)
-                    || CTYPE_JSPFRAGMENTSOURCE.equals(contentType);
-    }
-    
-    /**
-     * @param file
-     * @return true if file is associated with a JSP or JSP fragment content type
-     */
-    public static boolean isJSPContentType(final IFile file)
-    {
-    	final boolean isJSPSource = isJSPSource(file);
-        if (isJSPSource)
-        {
-            return true;
-        }
-
-        final boolean isJSPFragment = isJSPFragment(file);
-        
-        if  (isJSPFragment)
-        {
-        	return true;
-        }
-        
-        return false;
-    }
-    
-    private JSPUtil()
-    {
-        // no instantiation
-    }
-
-	/**
-	 * @param file
-	 * @return true if file is associated with the JSP source content type
-	 * (returns if JSP fragment)
-	 */
-	public static boolean isJSPSource(IFile file) {
-		return isAssociatedWithContentType(file, CTYPE_JSPSOURCE);
-	}
-
-	/**
-	 * @param file
-	 * @return true if the file is associated with the JSP fragment content type
-	 */
-	public static boolean isJSPFragment(IFile file) {
-		return isAssociatedWithContentType(file, CTYPE_JSPFRAGMENTSOURCE);
-	}
-	
-	private static boolean isAssociatedWithContentType(final IFile file, final String contentType)
-	{
-        final IContentTypeManager typeManager = Platform.getContentTypeManager();
-        IContentType jspContentType = 
-            typeManager.getContentType(contentType);
-        if (jspContentType != null
-                && jspContentType.isAssociatedWith(file.getName()))
-        {
-            return true;
-        }
-      
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/IResourceLifecycleListener.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/IResourceLifecycleListener.java
deleted file mode 100644
index a3ab30f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/IResourceLifecycleListener.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package org.eclipse.jst.jsf.common.internal.resource;
-
-/**
- * Listener can register for events ona particular LifecycleListener
- * 
- * @author cbateman
- *
- */
-public interface IResourceLifecycleListener 
-{
-    /**
-     * Listener accepts the resource lifecycle event
-     * 
-     * @param event
-     * @return the result of accepting the event
-     */
-    EventResult acceptEvent(ResourceLifecycleEvent event);
-
-    /**
-     * @author cbateman
-     *
-     */
-    public static class EventResult
-    {
-        private static EventResult DEFAULT;
-
-        /**
-         * @return an event result with defaults initialized
-         */
-        public static EventResult getDefaultEventResult()
-        {
-            if (DEFAULT == null)
-            {
-                DEFAULT = new EventResult();
-            }
-            return DEFAULT;
-        }
-
-        private static EventResult DISPOSE_AFTER_EVENT;
-
-        /**
-         * @return an event result with default except dispose after
-         * is set
-         */
-        public static EventResult getDisposeAfterEventResult()
-        {
-            if (DISPOSE_AFTER_EVENT == null)
-            {
-                DISPOSE_AFTER_EVENT = new EventResult();
-                DISPOSE_AFTER_EVENT.setDisposeAfterEvent(true);
-            }
-            return DISPOSE_AFTER_EVENT;
-        }
-
-        /**
-         * set to true if after the current event is finished firing, the source
-         * should be disposed. If self-disposal is not applicable, the flag is ignored
-         */
-        protected boolean _disposeAfterEvent;
-
-        /**
-         * @return the remove listener flag
-         */
-        public boolean getDisposeAfterEvent()
-        {
-            return _disposeAfterEvent;
-        }
-
-        /**
-         * @param disposeAfterEvent
-         */
-        protected void setDisposeAfterEvent(boolean disposeAfterEvent) {
-            _disposeAfterEvent = disposeAfterEvent;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/LifecycleListener.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/LifecycleListener.java
deleted file mode 100644
index 6e99b52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/LifecycleListener.java
+++ /dev/null
@@ -1,365 +0,0 @@
-package org.eclipse.jst.jsf.common.internal.resource;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jst.jsf.common.internal.ITestTracker;
-import org.eclipse.jst.jsf.common.internal.ITestTracker.Event;
-import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener.EventResult;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.EventType;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.ReasonType;
-
-/**
- * Listens to resource changes and fires lifecycle events
- * 
- * @author cbateman
- *
- */
-public class LifecycleListener implements IResourceChangeListener
-{
-    private final static boolean                            ENABLE_TEST_TRACKING = false;
-    private static long                                     _seqId;
-    
-    private final List<IResource>                           _resources;
-    private final List<IResourceLifecycleListener>          _listeners;
-    private boolean                                         _isDisposed = false;
-    private ITestTracker                                    _testTracker; // == null; initialized by setter injection
-
-    /**
-     * Initialize an inactive lifecycle listener.  A workspace listener will not
-     * be installed by this constructor.  The object created using this constructor
-     * will not fire any events until addResource is called at least once to add
-     * a target resource
-     */
-    public LifecycleListener()
-    {
-        _resources = new ArrayList<IResource>();
-        _listeners = new ArrayList<IResourceLifecycleListener>(1);
-    }
-
-    /**
-     * Create a new lifecycle listener for the res
-     * @param res
-     */
-    public LifecycleListener(IResource res)
-    {
-        this();
-        _resources.add(res);
-        ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
-    }
-
-    /**
-     * @param resources
-     */
-    public LifecycleListener(List<IResource> resources)
-    {
-        this();
-        _resources.addAll(resources);
-        ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
-    }
-    
-
-    /**
-     * @param testTracker
-     */
-    public final void setTestTracker(ITestTracker testTracker)
-    {
-        _testTracker = testTracker;
-    }
-
-    /**
-     * @param res
-     */
-    public void addResource(final IResource res)
-    {
-        synchronized(_resources)
-        {
-            int preSize = _resources.size();
-            if (!_resources.contains(res))
-            {
-                _resources.add(res);
-            }
-            
-            // if the size of the array was 0
-            // and is now greater, make sure the listener is added
-            if (preSize == 0
-                    && _resources.size() > 0)
-            {
-                ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
-            }
-        }
-    }
-
-    /**
-     * @param res
-     */
-    public void removeResource(final IResource res)
-    {
-        synchronized(_resources)
-        {
-            _resources.remove(res);
-            
-            // if there are no longer target resources,
-            // remove the workspace listener
-            if (_resources.size() == 0)
-            {
-                ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
-            }
-        }
-    }
-
-    /**
-     * Release the resource change listener
-     */
-    public void dispose()
-    {
-        if (!_isDisposed)
-        {
-            // remove first to minimize the chance that the listener will
-            // be triggered during the remainder of dispose
-            ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
-
-            // don't clear the listener list currently because of 
-            // concurrent change problems.
-
-            _isDisposed = true;
-        }
-    }
-
-    /**
-     * @return true if the listener has been disposed
-     */
-    public boolean isDisposed() {
-        return _isDisposed;
-    }
-
-    /**
-     * Adds listener to the list of objects registered to receive 
-     * lifecycle events for this resource.  Only adds the listener
-     * if it is not already in the list.
-     * 
-     * Method is thread-safe and may block the caller
-     * 
-     * Throws {@link IllegalStateException} if isDisposed() == true
-     * 
-     * @param listener
-     */
-    public void addListener(IResourceLifecycleListener listener)
-    {
-        if (isDisposed())
-        {
-            throw new IllegalStateException();
-        }
-
-        synchronized(_listeners)
-        {
-            if (!_listeners.contains(listener))
-            {
-                _listeners.add(listener);
-            }
-        }
-    }
-
-    /**
-     * Removes listener from the list of registered listeners
-     * 
-     * Method is thread-safe and may block the caller
-     * 
-     * Throws {@link IllegalStateException} if isDisposed() == true
-     *
-     * @param listener
-     */
-    public void removeListener(IResourceLifecycleListener listener)
-    {
-        if (isDisposed())
-        {
-            throw new IllegalStateException();
-        }
-
-        synchronized(_listeners)
-        {
-            _listeners.remove(listener);
-        }
-    }
-
-    public void resourceChanged(IResourceChangeEvent event) 
-    {
-        long seqId = _seqId++;
-        
-        if (ENABLE_TEST_TRACKING && _testTracker != null)
-        {
-            _testTracker.fireEvent(Event.START_TRACKING, seqId, "trackMethod_resourceChanged");
-        }
-
-        assert(!isDisposed());
-
-        switch(event.getType())
-        {
-            case IResourceChangeEvent.PRE_CLOSE:
-            {
-                final IProject proj = (IProject) event.getResource();
-
-                synchronized(_resources)
-                {
-                    final List<IResource> resources = copyResourceList();
-                    for (final IResource res : resources)
-                    {
-                        if (proj == res || proj == res.getProject())
-                        {
-                            fireLifecycleEvent(
-                                    new ResourceLifecycleEvent(res, EventType.RESOURCE_INACCESSIBLE, ReasonType.RESOURCE_PROJECT_CLOSED));
-                        }
-                    }
-                }
-            }
-            break;
-
-            case IResourceChangeEvent.PRE_DELETE:
-            {
-                IProject proj = (IProject) event.getResource();
-
-                synchronized(_resources)
-                {
-                    final List<IResource> resources = copyResourceList();
-                    for (final IResource res : resources)
-                    {
-                        // if the resource being tracked is the resource being deleted,
-                        // then fire a resource delete event
-                        if (proj == res)
-                        {
-                            fireLifecycleEvent(new ResourceLifecycleEvent(res, EventType.RESOURCE_INACCESSIBLE, ReasonType.RESOURCE_DELETED));
-                        }
-                        // if the resource being tracked is a resource in the project being
-                        // deleted, then fire a project deleted event
-                        else if (proj == res.getProject())
-                        {
-                            fireLifecycleEvent(
-                                new ResourceLifecycleEvent(res, EventType.RESOURCE_INACCESSIBLE, ReasonType.RESOURCE_PROJECT_DELETED));
-                        }
-                    }
-                }
-            }
-            break;
-
-            case IResourceChangeEvent.POST_CHANGE:
-            {
-                synchronized(_resources)
-                {
-                    final List<IResource> resources = copyResourceList();
-                    for (final IResource res : resources)
-                    {
-                        // only bother continuing if the resource we are tracking
-                        // is not a project since post-change events on projects 
-                        // that we care about won't occur
-                        if (res.getType() != IResource.PROJECT)
-                        {
-                            IResourceDelta delta = event.getDelta();
-                            
-//                            long seqId2 = _seqId++;
-//                            if (ENABLE_TEST_TRACKING && _testTracker != null)
-//                            {
-//                                _testTracker.fireEvent(Event.START_TRACKING, seqId2, "testFindMember");
-//                            }
-                            // only care about post change events to resources
-                            // that we are tracking
-                            delta = delta.findMember(res.getFullPath());
-
-                            if (delta != null)
-                            {
-                                visit(delta);
-                            }
-
-//                            if (ENABLE_TEST_TRACKING && _testTracker != null)
-//                            {
-//                                _testTracker.fireEvent(Event.STOP_TRACKING, seqId2, "testFindMember");
-//                            }
-                        }
-                    }
-                }
-            }
-            break;
-
-            default:
-            // do nothing
-            // we only handle these three
-        }
-
-        if (ENABLE_TEST_TRACKING && _testTracker != null)
-        {
-            _testTracker.fireEvent(Event.STOP_TRACKING, seqId, "trackMethod_resourceChanged");
-        }
-    }
-
-    private List<IResource> copyResourceList()
-    {
-        synchronized(_resources)
-        {
-            List<IResource>  resList = new ArrayList<IResource>(_resources.size());
-            resList.addAll(_resources);
-            return resList;
-        }
-    }
-
-    private void fireLifecycleEvent(ResourceLifecycleEvent event)
-    {
-       List<IResourceLifecycleListener>                copyListeners
-           = new ArrayList(_listeners.size());
-
-        // copy the listeners to avoid concurrent modification problems
-        // if a listeners removes itself due to an event
-        synchronized(_listeners)
-        {
-            copyListeners.addAll(_listeners);
-        }
-
-        boolean  disposeAfter = false;
-
-        for (final IResourceLifecycleListener listener : copyListeners)
-        {
-           EventResult result = listener.acceptEvent(event);
-           disposeAfter |= result.getDisposeAfterEvent();
-        }
-
-        if (disposeAfter)
-        {
-            dispose();
-        }
-    }
-
-    private void visit(IResourceDelta delta) 
-    {
-        assert(!isDisposed());
-
-        final IResource res = delta.getResource();
-
-        switch (delta.getKind())
-        {
-            case IResourceDelta.CHANGED:
-            {
-                // the contents of the file have changed
-                if ((delta.getFlags() & IResourceDelta.CONTENT) != 0)
-                {
-                    fireLifecycleEvent(
-                        new ResourceLifecycleEvent
-                            (res, EventType.RESOURCE_CHANGED
-                                    , ReasonType.RESOURCE_CHANGED_CONTENTS));
-                }
-            }
-            break;
-            case IResourceDelta.REMOVED:
-            {
-                fireLifecycleEvent(
-                    new ResourceLifecycleEvent
-                        (res, EventType.RESOURCE_INACCESSIBLE
-                                    , ReasonType.RESOURCE_DELETED));
-            }
-            break;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/ResourceLifecycleEvent.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/ResourceLifecycleEvent.java
deleted file mode 100644
index 81f6ff6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/ResourceLifecycleEvent.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package org.eclipse.jst.jsf.common.internal.resource;
-
-import org.eclipse.core.resources.IResource;
-
-/**
- * @author cbateman
- *
- */
-public class ResourceLifecycleEvent 
-{
-    /**
-     * the type of lifecycle event
-     * this enum is not closed and may add new fields in the future
-     */
-    public enum EventType
-    {
-        /**
-         * Indicates that the resource is no longer accessible (as testable with
-         * IResource.isAccessible).  The reasonType will indicate why.
-         */
-        RESOURCE_INACCESSIBLE,
-        
-        /**
-         * Indicates that the resource being tracked has changed in some
-         * way, use ReasonType to determine specifics
-         */
-        RESOURCE_CHANGED;
-    }
-    
-    /**
-     * encodes the cause of the event if the event type provides one
-     * this enum is not closed and may add new fields in the future
-     */
-    public enum ReasonType
-    {
-        /**
-         * The resource was deleted from the workspace,
-         * this event is pre change if the event is project
-         * and post change otherwise
-         */
-        RESOURCE_DELETED,
-        /**
-         * The resource's project was deleted.  This event is 
-         * pre-change.  Note that if the tracked resource is 
-         * a project, RESOURCE_DELETED will be fired, not this
-         * event.
-         */
-        RESOURCE_PROJECT_DELETED,
-        /**
-         * The resource's project was closed.  This event is pre-change
-         */
-        RESOURCE_PROJECT_CLOSED,
-        /**
-         * Occurs when the contents of a non-project resource has changed 
-         */
-        RESOURCE_CHANGED_CONTENTS
-    }
-
-    private final IResource   _affectedResource;
-    private final EventType   _eventType;
-    private final ReasonType  _reasonType;
-    
-    /**
-     * @param affectedResource
-     * @param eventType
-     * @param reasonType
-     */
-    public ResourceLifecycleEvent(IResource affectedResource, EventType eventType, ReasonType reasonType)
-    {
-        _affectedResource = affectedResource;
-        _eventType = eventType;
-        _reasonType = reasonType;
-    }
-
-    /**
-     * @return the affected resource
-     */
-    public IResource getAffectedResource() {
-        return _affectedResource;
-    }
-
-    /**
-     * @return the event that has occurred
-     */
-    public EventType getEventType() {
-        return _eventType;
-    }
-
-    /**
-     * @return the cause of the event
-     */
-    public ReasonType getReasonType() {
-        return _reasonType;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/BooleanLiteralType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/BooleanLiteralType.java
deleted file mode 100644
index 6055e5f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/BooleanLiteralType.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-import org.eclipse.jdt.core.Signature;
-
-/**
- * Represents a BooleanLiteral as defined by JSP.2.9
- * 
- * @author cbateman
- *
- */
-public class BooleanLiteralType extends LiteralType 
-{
-    /**
-     * The literal FALSE singleton
-     */
-    public final static BooleanLiteralType  FALSE = new BooleanLiteralType(false);
-    /**
-     * The literal TRUE singleton
-     */
-    public final static BooleanLiteralType  TRUE = new BooleanLiteralType(true);
-    
-    private final boolean       _literalValue;
-    
-    
-    /**
-     * @param value
-     * @return a constant boolean literal type corresponding to value
-     */
-    public static BooleanLiteralType valueOf(boolean value)
-    {
-        return value ? TRUE : FALSE;
-    }
-    
-    /**
-     * @param literalValue
-     */
-    /*package*/BooleanLiteralType(boolean  literalValue)
-    {
-        super(Signature.SIG_BOOLEAN);
-        _literalValue = literalValue;
-    }
-    
-    public Number coerceToNumber(Class T) throws TypeCoercionException 
-    {
-        // illegal to coerce boolean to number per JSP.2.8.3 step 3
-        throw new TypeCoercionException("Cannot coerce boolean to number"); //$NON-NLS-1$
-    }
-
-    public String getLiteralValue() 
-    {
-        return Boolean.toString(_literalValue);
-    }
-
-    public Object getLiteralValueRaw() 
-    {
-        return Boolean.valueOf(_literalValue);
-    }
-
-    public Boolean coerceToBoolean() throws TypeCoercionException 
-    {
-        return Boolean.valueOf(_literalValue);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/CompositeType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/CompositeType.java
deleted file mode 100644
index 9069f05..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/CompositeType.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-import org.eclipse.jdt.core.Signature;
-
-
-/**
- * Encapsulates the runtime type or types of a JSF entity in a 
- * way that can be compared to other entities
- * 
- * @author cbateman
- *
- */
-public class CompositeType 
-{
-    private final String[]  _signatures;
-    private final int       _assignmentType;
-    
-    private boolean[]       _isTypeSignature; // = null lazily derived from signatures
-                                              // on first access
-    /**
-     * @param signatureStrings
-     * @param assignmentType 
-     */
-    public CompositeType(String[] signatureStrings, int  assignmentType)
-    {
-        if (signatureStrings == null
-                || signatureStrings.length < 1)
-        {
-            throw new AssertionError("Must specify at least one signature string"); //$NON-NLS-1$
-        }
-        
-        _signatures = new String[signatureStrings.length];
-        System.arraycopy(signatureStrings, 0, _signatures, 0, _signatures.length);
-        _assignmentType = assignmentType;
-    }
-    
-    /**
-     * Convenience constructor for most common case where composite only 
-     * consistes of a single type signature
-     * 
-     * @param signatureString
-     * @param assignmentType
-     */
-    public CompositeType(String signatureString, int assignmentType)
-    {
-        this(new String[]{signatureString}, assignmentType);
-    }
-    /**
-     * @return the assignment type mask
-     */
-    public int getAssignmentTypeMask()
-    {
-        return _assignmentType;
-    }
-    
-    /**
-     * @return true if the composite type supports being on the LHS of an
-     * assignment
-     */
-    public boolean isLHS()
-    {
-        return TypeUtil.matchesLHS(_assignmentType);
-    }
-    
-    /**
-     * @return true if the composite type supports being on the RHS of an
-     * assignment
-     */
-    public boolean isRHS()
-    {
-        return TypeUtil.matchesRHS(_assignmentType);
-    }
-
-    /**
-     * @return an array of booleans.  The value in each index of the array
-     * is true if the corresponding position _signatures corresponds to a type
-     * signature and false if it's a method signature
-     */
-    public boolean[] getIsTypeSignature()
-    {
-        return getTypeSignatureFlags();
-    }
-    
-    /**
-     * @return the type signatures.  Changes to the returned form do not
-     * affect the internal values
-     */
-    public String[] getSignatures()
-    {
-        final String[] copy = new String[_signatures.length];
-        System.arraycopy(_signatures, 0, copy, 0, _signatures.length);
-        return copy;
-    }
-    
-    public String toString()
-    {
-        final StringBuffer stringBuffer = new StringBuffer();
-        
-        for (int i = 0; i < _signatures.length; i++)
-        {
-            stringBuffer.append(_signatures[i]);
-            stringBuffer.append(" | "); //$NON-NLS-1$
-        }
-        
-        return stringBuffer.toString();
-    }
-    
-    /**
-     * @return a version of to string with of the type signatures replaced
-     * with their more Javaeseque names
-     */
-    public String toUserReadableString()
-    {
-        final StringBuffer stringBuffer = new StringBuffer();
-        
-        for (int i = 0; i < _signatures.length; i++)
-        {
-            final String signature = _signatures[i];
-            
-            if (getTypeSignatureFlags()[i])
-            {
-                stringBuffer.append(Signature.getSignatureSimpleName(signature));
-            }
-            
-            if (i < _signatures.length -1)
-            {
-                stringBuffer.append(", "); //$NON-NLS-1$
-            }
-        }
-        return stringBuffer.toString();
-    }
-    
-    private boolean[] getTypeSignatureFlags()
-    {
-        if (_isTypeSignature == null)
-        {
-            _isTypeSignature = new boolean[_signatures.length];
-            
-            for (int i = 0; i < _signatures.length; i++)
-            {
-                try
-                {
-                    Signature.getTypeSignatureKind(_signatures[i]);
-                    
-                    // if an exception wasn't thrown above, then it
-                    // is some sort of type signature
-                    _isTypeSignature[i] = true;
-                }
-                catch (IllegalArgumentException ae)
-                {
-                    // getTypeSignatureKind threw an exception, so
-                    // this signature is a method
-                    _isTypeSignature[i] = false;
-                }
-            }
-        }
-        
-        return _isTypeSignature;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/CompositeTypeCoercer.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/CompositeTypeCoercer.java
deleted file mode 100644
index 5f2aff4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/CompositeTypeCoercer.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-
-/**
- * Follows type coercion rules codified in section JSP.2.8 of the 
- * JSP 2.0 Specification.
- * 
- * This class operates on CompositeType's and returns raw
- * Java signatures for the single resulting type coercion.
- * 
- * The rules are stretched a little bit since JSP.2.8 defines how to
- * coerce an *instance* A to a type T.  But since we have no runtime instances,
- * only their types, we approximate by taking what we know about the type of A
- * and coercing it T as best we can.  
- * 
- * Also, whereas the spec says to throw errors when coercion is not possible,
- * we have two cases:
- * 
- *  1) We can determine definitively that there is no coercion
- *  2) We cannot determine whether there is or isn't a coercion
- *  
- *  In case 1, we always throw an exception.  In case 2, we return null to indicate
- *  "indeterminate" result, rather than error.
- * 
- * @author cbateman
- *
- */
-public class CompositeTypeCoercer 
-{
-    /**
-     * This method follows JSP.2.8.3 except that rather than returning a specific
-     * type that has been coerced to, it determines the most exact possible type
-     * that typeOfA can be coerced to, to be number compatible.  The caller must
-     * decide what do with the return value compared to the type (N in the spec)
-     * that they want to coerce to.
-     * 
-     * @param typeOfA
-     * @return a new signature for the type of A after being coerced to a Number
-     * @throws TypeCoercionException if A can definitively not be coerced to
-     * a number
-     */
-    public static String coerceToNumber(final CompositeType typeOfA)
-                            throws TypeCoercionException
-    {
-        String coercedType = null;
-        boolean errorDetected = true;       // assume error: only false if we 
-                                            // find a member of typeOfA that 
-                                            // coerces to number
-        
-        // JSP.2.8.1 -- auto-box primitives
-        final CompositeType boxedTypeOfA = 
-            TypeTransformer.transformBoxPrimitives(typeOfA);
-        final boolean[] typesigs = boxedTypeOfA.getIsTypeSignature();
-        
-        // iterate through all of the signatures that represent types
-        // and find at least one that can be coerced to a number
-        for (int i = 0; i < typesigs.length; i++)
-        {
-            if (typesigs[i])
-            {
-                try
-                {
-                    final String testType = 
-                        TypeCoercer.coerceToNumber(boxedTypeOfA.getSignatures()[i]);
-
-                    if (testType != null)
-                    {
-                        // if we have already found a coercible type, then 
-                        // we need to return null, since we have a conflict that
-                        // we don't know how to resolve to a type??????
-                        if (coercedType != null)
-                        {
-                            return null;
-                        }
-                        
-                        coercedType = testType;
-                    }
-                    errorDetected = false; // we have found a number coercion or indeterminate
-                }
-                catch (TypeCoercionException tce)
-                {
-                    // do nothing: so far error still detected
-                }
-            }
-        }
-        
-        // we have three choices:
-        // 1: if errorDetected was never cleared, we definitely never found
-        // a coerceable type, so throw exception
-        if (errorDetected)
-        {
-            throw new TypeCoercionException();
-        }
-        
-        // otherwise the flag was cleared return what we found
-        if (coercedType != null)
-        {
-            // need to unbox per JSP.2.8.1
-            coercedType =
-                TypeTransformer.transformUnboxPrimitives(coercedType);
-        }
-        
-        return coercedType;
-    }
-    
-    
-//    public static String coerceToBoolean(CompositeType compositeType)
-//    {
-//        
-//    }
- 
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/FloatLiteralType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/FloatLiteralType.java
deleted file mode 100644
index 5631b87..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/FloatLiteralType.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.eclipse.jdt.core.Signature;
-
-/**
- * Represents an FloatLiteral as defined by JSP.2.9
- * @author cbateman
- *
- */
-public class FloatLiteralType extends NumericTypeLiteral 
-{
-    private final double     _literalValue;
-    
-    /**
-     * @param literalValue
-     */
-    public FloatLiteralType(double literalValue)
-    {
-        // according to the notes to JSP.2.9, bullet 5, float literals are doubles
-        super(Signature.SIG_DOUBLE);
-        _literalValue = literalValue;
-    }
-    
-    protected Number getBoxedValue() 
-    {
-        return new Double(_literalValue);
-    }
-
-    public Number coerceToNumber(Class T) throws TypeCoercionException 
-    {
-        if (T == BigInteger.class)
-        {
-            return new BigDecimal(_literalValue).toBigInteger();
-        }
-        else if (T == BigDecimal.class)
-        {
-            return new BigDecimal(_literalValue);
-        }
-        
-        Number commonCoercion = super.coerceToNumber(T);
-
-        if (commonCoercion == null)
-        {
-            throw new IllegalArgumentException("Not a target numeric type: "+T); //$NON-NLS-1$
-        }
-
-        return commonCoercion;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/IAssignable.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/IAssignable.java
deleted file mode 100644
index 8b74dfd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/IAssignable.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-/**
- * Defines the lhs/rhs rules for a type
- * @author cbateman
- *
- */
-public interface IAssignable 
-{
-    /**
-     * Type is none: it cannot be assigned to.  method binding.
-     */
-    public static int  ASSIGNMENT_TYPE_NONE = 0x0;
-    /**
-     * Type is lhs: it can be assigned to
-     */
-    public static int  ASSIGNMENT_TYPE_LHS = 0x1;
-    
-    /**
-     * Type is rhs: it can be assigned from
-     */
-    public static int  ASSIGNMENT_TYPE_RHS = 0x2;
-    
-    /**
-     * @return the assigment mask
-     */
-    public int  getAssignability();
-    
-    /**
-     * @return true if ASSIGNMENT_TYPE_LHS is set in getAssignability
-     */
-    public boolean isLHS();
-    /**
-     * @return true if ASSIGNMENT_TYPE_RHS is set in getAssignability
-     */
-    public boolean isRHS();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/IntegerLiteralType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/IntegerLiteralType.java
deleted file mode 100644
index d7a3be8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/IntegerLiteralType.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.eclipse.jdt.core.Signature;
-
-/**
- * Represents a IntegerLiteral as defined by JSP.2.9
- * @author cbateman
- *
- */
-public class IntegerLiteralType extends NumericTypeLiteral
-{
-    /**
-     * A singleton for zero literals
-     */
-    public final static IntegerLiteralType      ZERO = new IntegerLiteralType(0);
-    
-    private final long   _literalValue;
-    
-    /**
-     * @param literalValue
-     */
-    public IntegerLiteralType(long literalValue)
-    {
-        // according to the notes to JSP.2.9, bullet 4, integer literals are longs
-        super(Signature.SIG_LONG);
-        _literalValue = literalValue;
-    }
-    
-    protected Number getBoxedValue() 
-    {
-        return Long.valueOf(_literalValue);
-    }
-
-    /**
-     * Per JSP.2.8.3, step 5
-     * @see org.eclipse.jst.jsf.common.internal.types.LiteralType#coerceToNumber(java.lang.Class)
-     */
-    public Number coerceToNumber(Class T) throws TypeCoercionException 
-    {        
-        if (T == BigInteger.class)
-        {
-            return BigInteger.valueOf(_literalValue);
-        }
-        else if (T == BigDecimal.class)
-        {
-            return BigDecimal.valueOf(_literalValue);
-        }
-        
-        Number commonCoercion = super.coerceToNumber(T);
-
-        if (commonCoercion == null)
-        {
-            throw new IllegalArgumentException("Not a target numeric type: "+T); //$NON-NLS-1$
-        }
-
-        return commonCoercion;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/LiteralType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/LiteralType.java
deleted file mode 100644
index 3ea6de5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/LiteralType.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-
-/**
- * Encodes a type signature and a string that has some literal value based on
- * the type signature.  The class represents only a value object -- no attempt
- * is made to assert that the literalValue is really of the type specified.
- * 
- * @author cbateman
- *
- */
-public abstract class LiteralType extends ValueType
-{
-    
-    /**
-     * Consider a new literal type
-     * 
-     * @param signature
-     */
-    protected LiteralType(final String signature)
-    {
-        super(signature, IAssignable.ASSIGNMENT_TYPE_RHS);
-    }
-
-    /**
-     * @return the literal value string (unparsed)
-     */
-    public abstract String getLiteralValue();
-
-    /**
-     * @return the actual untranslated literal value as an object
-     */
-    public abstract Object getLiteralValueRaw();
-    
-    /**
-     * @return the type signature
-     */
-    public final String getSignature() {
-        return super.getSignature();
-    }
-    
-    /**
-     * @return a type signature for the kind of number this literal will coerce
-     * into when asked to become a number or null if this cannot be determined
-     * @throws TypeCoercionException if this literal has no legal coercion into
-     * a number
-     */
-    public String getNumberCoercion() throws TypeCoercionException
-    {
-       // always box before coercion 
-       return
-           TypeCoercer.coerceToNumber(
-                   TypeTransformer.transformBoxPrimitives(getSignature()));
-    }
-    
-    /**
-     * @param T
-     * @return a Number coercion of the literal's value, null if indeterminate
-     * @throws TypeCoercionException if the coercion is illegal
-     */
-    public abstract Number coerceToNumber(Class T) throws TypeCoercionException;
-    
-    /**
-     * @return a Boolean coercion of the literal's value, null if indeterminate
-     * @throws TypeCoercionException if the coercion is illegal
-     */
-    public abstract Boolean coerceToBoolean() throws TypeCoercionException;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/Messages.java
deleted file mode 100644
index b3db7a5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/Messages.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.internal.types;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * Message bundle
- * 
- */
-public class Messages {
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.common.internal.types.messages"; //$NON-NLS-1$
-
-    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-            .getBundle(BUNDLE_NAME);
-
-    private Messages() {
-        // no external construction
-    }
-
-    /**
-     * @param key
-     * @return the string for key or !key! if not found
-     */
-    public static String getString(String key) {
-        try {
-            return RESOURCE_BUNDLE.getString(key);
-        } catch (MissingResourceException e) {
-            return '!' + key + '!';
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/MethodType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/MethodType.java
deleted file mode 100644
index 38e47b0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/MethodType.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-/**
- * Signature type for method bindings in an EL expression
- * 
- * @author cbateman
- *
- */
-public class MethodType implements SignatureBasedType 
-{
-    private final String        _methodName;
-    private final String        _signature;
-
-    /**
-     * @param methodName
-     * @param signature
-     */
-    public MethodType(final String methodName, final String signature)
-    {
-        _methodName = methodName;
-        _signature = signature;
-    }
-
-    /**
-     * @see org.eclipse.jst.jsf.common.internal.types.SignatureBasedType#getSignature()
-     */
-    public String getSignature() 
-    {
-        return _signature;
-    }
-
-    /**
-     * @return the method name signature
-     */
-    public String getMethodName() 
-    {
-        return _methodName;
-    }
-
-    public CompositeType toCompositeType() 
-    {
-        return new CompositeType(_signature, IAssignable.ASSIGNMENT_TYPE_NONE);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/NullLiteralType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/NullLiteralType.java
deleted file mode 100644
index eeb43e6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/NullLiteralType.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-/**
- * Represents a NullLiteralType per JSP.2.9
- * 
- * @author cbateman
- *
- */
-public class NullLiteralType extends LiteralType 
-{
-    /**
-     * The singleton null literal
-     */
-    public final static NullLiteralType SINGLETON = new NullLiteralType();
-    
-    /**
-     * Construct a new null
-     */
-    private NullLiteralType()
-    {
-        super(TypeConstants.TYPE_NULL); // use void to indicate null in this situation
-    }
-    
-    /**
-     * Per JSP.2.8.5 null is always false
-     * 
-     * @see org.eclipse.jst.jsf.common.internal.types.LiteralType#coerceToBoolean()
-     */
-    public Boolean coerceToBoolean() throws TypeCoercionException 
-    {
-        return Boolean.FALSE;
-    }
-
-    /**
-     * Per JSP.2.8.3, null is always 0
-     * 
-     * @see org.eclipse.jst.jsf.common.internal.types.LiteralType#coerceToNumber(java.lang.Class)
-     */
-    public Number coerceToNumber(Class T) throws TypeCoercionException {
-        if (T == BigInteger.class)
-        {
-            return BigInteger.ZERO;
-        }
-        else if (T == BigDecimal.class)
-        {
-            return new BigDecimal(0.0);
-        }
-        else if (T == Double.class || T == Double.TYPE)
-        {
-            return new Double(0.0);
-        }
-        else if (T == Float.class || T == Float.TYPE)
-        {
-            return new Float(0.0);
-        }
-        else if (T == Long.class || T == Long.TYPE)
-        {
-            return Long.valueOf(0L);
-        }
-        else if (T == Integer.class || T == Integer.TYPE)
-        {
-            return Integer.valueOf(0);
-        }
-        else if (T == Short.class || T == Short.TYPE)
-        {
-            return Short.valueOf((short)0);
-        }
-        else if (T == Byte.class || T == Byte.TYPE)
-        {
-            return Byte.valueOf((byte)0);
-        }
-        else
-        {
-            throw new IllegalArgumentException("Not a target numeric type: "+T); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * Per JSP.2.8.2 null is always an empty string
-     * @see org.eclipse.jst.jsf.common.internal.types.LiteralType#getLiteralValue()
-     */
-    public String getLiteralValue() 
-    {
-        return ""; //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.core.internal.types.LiteralType#getLiteralValueRaw()
-     */
-    public Object getLiteralValueRaw() 
-    {
-        return null;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/NumericTypeLiteral.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/NumericTypeLiteral.java
deleted file mode 100644
index 8b6acbe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/NumericTypeLiteral.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-
-/**
- * Common super-type for Float and Integer literals
- * @author cbateman
- *
- */
-public abstract class NumericTypeLiteral extends LiteralType 
-{
-    /**
-     * @param signature
-     */
-    protected NumericTypeLiteral(String signature)
-    {
-        super(signature);
-    }
-    
-    /**
-     * @return the boxed form of the numeric literal value
-     */
-    protected abstract Number getBoxedValue();
-    
-    public Number coerceToNumber(Class T) throws TypeCoercionException 
-    {
-        Number boxedLiteralValue = getBoxedValue();
-        
-        if (T == Double.class || T == Double.TYPE)
-        {
-            return new Double(boxedLiteralValue.doubleValue());
-        }
-        else if (T == Float.class || T == Float.TYPE)
-        {
-            return new Float(boxedLiteralValue.floatValue());
-        }
-        else if (T == Long.class || T == Long.TYPE)
-        {
-            return boxedLiteralValue;
-        }
-        else if (T == Integer.class || T == Integer.TYPE)
-        {
-            return Integer.valueOf(boxedLiteralValue.intValue());
-        }
-        else if (T == Short.class || T == Short.TYPE)
-        {
-            return Short.valueOf(boxedLiteralValue.shortValue());
-        }
-        else if (T == Byte.class || T == Byte.TYPE)
-        {
-            return Byte.valueOf(boxedLiteralValue.byteValue());
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    public String getLiteralValue() 
-    {
-        return getBoxedValue().toString();
-    }
-
-    public Object getLiteralValueRaw() 
-    {
-        return getBoxedValue();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.core.internal.types.LiteralType#coerceToBoolean()
-     */
-    public Boolean coerceToBoolean() throws TypeCoercionException {
-        // JSP.2.8.5 does not provide for number -> boolean coercion
-        throw new TypeCoercionException("Cannot coerce number to boolean"); //$NON-NLS-1$
-    }
-
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/SignatureBasedType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/SignatureBasedType.java
deleted file mode 100644
index 41e2bb4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/SignatureBasedType.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-/**
- * Defines a signature-based type.  Signatures must conform to the JVM
- * type signature format as defined in the JVM specs and in the JDT Signature 
- * class
- * 
- * @author cbateman
- *
- */
-public interface SignatureBasedType 
-{
-    /**
-     * @return the signature string
-     */
-    public String getSignature();
-    
-    /**
-     * @return a version of the this type in CompositeType form
-     */
-    public CompositeType toCompositeType();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/StringLiteralType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/StringLiteralType.java
deleted file mode 100644
index 2e887fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/StringLiteralType.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-/**
- * Represents a StringLiteral as defined by JSP.2.9
- * 
- * @author cbateman
- */
-public class StringLiteralType extends LiteralType 
-{
-    private final String        _literalValue;
-    
-    /**
-     * @param value
-     */
-    public StringLiteralType(String value)
-    {
-        super(TypeConstants.TYPE_STRING);
-        _literalValue = value;
-    }
-    
-    public Number coerceToNumber(Class T) throws TypeCoercionException 
-    {
-        try
-        {
-            if (T == BigInteger.class)
-            {
-                if ("".equals(_literalValue)) //$NON-NLS-1$
-                {
-                    return BigInteger.ZERO;
-                }
-                return new BigInteger(_literalValue);
-            }
-            else if (T == BigDecimal.class)
-            {
-                if ("".equals(_literalValue)) //$NON-NLS-1$
-                {
-                    return new BigDecimal(0.0);
-                }
-                return new BigDecimal(_literalValue);
-            }
-            else if (T == Double.class || T == Double.TYPE)
-            {
-                if ("".equals(_literalValue)) //$NON-NLS-1$
-                {
-                    return new Double(0.0);
-                }
-           
-                return Double.valueOf(_literalValue);
-            }
-            else if (T == Float.class || T == Float.TYPE)
-            {
-                if ("".equals(_literalValue)) //$NON-NLS-1$
-                {
-                    return new Float(0.0);
-                }
-                return Float.valueOf(_literalValue);
-            }
-            else if (T == Long.class || T == Long.TYPE)
-            {
-                if ("".equals(_literalValue)) //$NON-NLS-1$
-                {
-                    return Long.valueOf(0L);
-                }
-                return Long.valueOf(_literalValue);
-            }
-            else if (T == Integer.class || T == Integer.TYPE)
-            {
-                if ("".equals(_literalValue)) //$NON-NLS-1$
-                {
-                    return Integer.valueOf(0);
-                }
-                return Integer.valueOf(_literalValue);
-            }
-            else if (T == Short.class || T == Short.TYPE)
-            {
-                if ("".equals(_literalValue)) //$NON-NLS-1$
-                {
-                    return Short.valueOf((short)0);
-                }
-                return Short.valueOf(_literalValue);
-            }
-            else if (T == Byte.class || T == Byte.TYPE)
-            {
-                if ("".equals(_literalValue)) //$NON-NLS-1$
-                {
-                    return Byte.valueOf((byte)0);
-                }
-                return Byte.valueOf(_literalValue);
-            }
-            else
-            {
-                throw new IllegalArgumentException("Not a target numeric type: "+T); //$NON-NLS-1$
-            }
-        }
-        catch (NumberFormatException nfe)
-        {
-            throw new TypeCoercionException(nfe);
-        }
-    }
-
-    public String getLiteralValue() 
-    {
-        return _literalValue;
-    }
-
-    public Object getLiteralValueRaw() 
-    {
-        return _literalValue;
-    }
-
-    public Boolean coerceToBoolean() throws TypeCoercionException 
-    {
-        // JSP.2.8.5
-        return Boolean.valueOf(_literalValue);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeCoercer.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeCoercer.java
deleted file mode 100644
index fa75a12..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeCoercer.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-import org.eclipse.jdt.core.Signature;
-
-/**
- * Coercer for simple type signatures
- * 
- * @author cbateman
- *
- */
-public class TypeCoercer 
-{
-    
-    /**
-     * Based on JSP.2.8.3 in JSP 2.0 specification
-     * 
-     * @param boxedTypeSignature -- an auto-boxed type signature
-     * @return the coerced type or null if cannot be resolved.  No unboxing
-     * is performed on the return.
-     * @throws TypeCoercionException if boxedTypeSignature is
-     */
-    public static String coerceToNumber(final String boxedTypeSignature)
-                             throws TypeCoercionException
-    {
-        String boxedTypeSignature_ = boxedTypeSignature;
-        
-        // can't coerce arrays to numbers
-        if (Signature.getTypeSignatureKind(boxedTypeSignature_)
-                == Signature.ARRAY_TYPE_SIGNATURE)
-        {
-            throw new TypeCoercionException("Cannot coerce arrays to numbers"); //$NON-NLS-1$
-        }
-        // if it's character, pre-coerce to short per step 2
-        if (TypeConstants.SIGNATURE_BOXED_CHARACTER.equals(boxedTypeSignature))
-        {
-            boxedTypeSignature_ = TypeConstants.TYPE_BOXED_SHORT;
-        }
-
-        if (TypeCoercer.typeIsNumeric(boxedTypeSignature_)
-                || TypeCoercer.typeIsNull(boxedTypeSignature_))
-        {
-            return boxedTypeSignature_;
-        }
-        else if (typeIsString(boxedTypeSignature_))
-        {
-            // undetermined a string may or not resolve to a number
-            // depending on its runtime value
-            return null;
-        }
-        else
-        {
-            throw new TypeCoercionException();
-        }
-    }
-    
-    /**
-     * @param boxedTypeSignature
-     * @return true if type can be coerced to boolean; null if indeterminate
-     */
-    public static boolean canCoerceToBoolean(String boxedTypeSignature)
-    {
-        // JSP.2.8.5 -- boolean is always boolean; string is converted by Boolean.valueOf(String)
-        if (typeIsBoolean(boxedTypeSignature)
-                || typeIsString(boxedTypeSignature)
-                || typeIsNull(boxedTypeSignature))
-        {
-            return true;
-        }
-        // nothing else really convertible besides null
-        return false;
-    }
-    
-    /**
-     * @param typeSignature -- boxed type signature
-     * @return true if the typeSignature is numeric
-     */
-    public static boolean typeIsNumeric(final String typeSignature)
-    {
-        return (TypeConstants.TYPE_BOXED_BYTE.equals(typeSignature) ||
-                TypeConstants.TYPE_BOXED_SHORT.equals(typeSignature) ||
-                TypeConstants.TYPE_BOXED_INTEGER.equals(typeSignature) ||
-                TypeConstants.TYPE_BOXED_LONG.equals(typeSignature) ||
-                TypeConstants.TYPE_BOXED_FLOAT.equals(typeSignature) ||
-                TypeConstants.TYPE_BOXED_DOUBLE.equals(typeSignature) ||
-                TypeConstants.TYPE_BIG_INTEGER.equals(typeSignature) ||
-                TypeConstants.TYPE_BIG_DOUBLE.equals(typeSignature));
-    }
-    
-    /**
-     * @param typeSignature
-     * @return true if the typeSignature represents a String
-     */
-    public static boolean typeIsString(final String typeSignature)
-    {
-        return (TypeConstants.TYPE_STRING.equals(typeSignature));
-    }
-    
-    /**
-     * @param typeSignature -- boxed type signature
-     * @return true if the typeSignature represents a boxed boolean
-     */
-    public static boolean typeIsBoolean(final String typeSignature)
-    {
-        return (TypeConstants.TYPE_BOXED_BOOLEAN.equals(typeSignature));
-    }
-    
-    /**
-     * @param typeSignature
-     * @return true if type is the EL null type
-     */
-    public static boolean typeIsNull(final String typeSignature)
-    {
-        return (TypeConstants.TYPE_NULL.equals(typeSignature));
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeCoercionException.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeCoercionException.java
deleted file mode 100644
index aa18bbd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeCoercionException.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-/**
- * @author cbateman
- *
- */
-public class TypeCoercionException extends Exception 
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * @see java.lang.Exception
-     */
-    public TypeCoercionException() {
-        super();
-    }
-
-    /**
-     * @param message
-     * @param cause
-     * @see java.lang.Exception
-     */
-    public TypeCoercionException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-    /**
-     * @param message
-     * @see java.lang.Exception
-     */
-    public TypeCoercionException(String message) {
-        super(message);
-    }
-
-    /**
-     * @param cause
-     * @see java.lang.Exception
-     */
-    public TypeCoercionException(Throwable cause) {
-        super(cause);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeComparator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeComparator.java
deleted file mode 100644
index 79332b9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeComparator.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-import org.eclipse.emf.common.util.BasicDiagnostic;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jdt.core.Signature;
-
-/**
- * Static utility class used to compare two CompositeTypes for compatability
- * 
- * @author cbateman
- *
- */
-public final class TypeComparator
-{
-    /**
-     * @param firstType
-     * @param secondType
-     * @return true if firstType is assignable to secondType or vice-versa,
-     * depending on their assignment and runtime types
-     */
-    public static Diagnostic calculateTypeCompatibility(final CompositeType firstType,
-                                                        final CompositeType secondType)
-    {
-        // first, box all primitives
-        final CompositeType boxedFirstType = 
-            TypeTransformer.transformBoxPrimitives(firstType);
-        final CompositeType boxedSecondType =
-            TypeTransformer.transformBoxPrimitives(secondType);
-        
-        final String[] mustBeSatisfied = boxedFirstType.getSignatures();
-        final String[] testSignatures = boxedSecondType.getSignatures();
-        // TODO: need better user messages here
-        Diagnostic result = new BasicDiagnostic(Diagnostic.WARNING, "", 0,  //$NON-NLS-1$
-                Messages.getString("TypeComparator.Expression.Doesnt.Match.Expected.Types"), null); //$NON-NLS-1$
-        // now loop through each type in the first type and see
-        // if there is a type satisfying it in the second
-        MAIN_LOOP:
-        for  (int i = 0; i < mustBeSatisfied.length; i++)
-        {
-            final String curSatisfyType = mustBeSatisfied[i];
-
-            CHECK_CANDIDATES:
-            for (int j = 0; j < testSignatures.length; j++)
-            {
-                final String testType = testSignatures[j];
-                
-                // simplest success is an exact match
-                if (curSatisfyType.equals(testType))
-                {
-                    // check assignability mask
-                    // returns Diagnostic.OK if okay
-                    result = checkAssignability(firstType, secondType);
-                    break MAIN_LOOP;
-                }
-                
-                // or if both are methods, check to see if the
-                // method signatures match
-                if (TypeUtil.isMethodSignature(curSatisfyType))
-                {
-                    // if the satisfy type is a method,
-                    // the test  type is not, then don't go any
-                    // further, since we know the won't match
-                    if (!TypeUtil.isMethodSignature(testType))
-                    {
-                        continue CHECK_CANDIDATES;
-                    }
-
-                    final Diagnostic test =
-                        methodSignaturesMatch(curSatisfyType, testType);
-                    
-                    if (test.getSeverity() ==  Diagnostic.OK)
-                    {
-                        result = Diagnostic.OK_INSTANCE;
-                        // found a match so break
-                        break MAIN_LOOP;
-                    }
-                }
-                
-                // or, can we coerce testType to curSatisfyType
-                if (canCoerce(testType, curSatisfyType, firstType.isLHS()))
-                {
-                    result = checkAssignability(firstType, secondType);
-                    break MAIN_LOOP;
-                }
-            }
-        }
-
-        return result;
-    }
-    
-    private static boolean canCoerce(String testType, String checkType,
-                                                boolean checkTypeIsWritable)
-    {
-        boolean canCoerce = canCoerce(testType, checkType);
-        
-        // if the check type is writable, we need to be sure that the
-        // coercion can work in both directions
-        if (canCoerce && checkTypeIsWritable)
-        {
-            // reverse roles: can checkType assign back to test type?
-            canCoerce &= canCoerce(checkType, testType);
-        }
-        
-        return canCoerce;
-    }
-    
-    private static boolean canCoerce(String testType, String checkType)
-    {
-        // can always to coerce to string
-        if (TypeCoercer.typeIsString(checkType))
-        {
-            // if check type expects writability, need to ensure that 
-            // coercability is reversible
-            return true;
-        }
-        else if (TypeCoercer.typeIsNumeric(checkType))
-        {
-            return canCoerceNumeric(testType);
-        }
-        else if (TypeCoercer.typeIsBoolean(checkType))
-        {
-            return TypeCoercer.canCoerceToBoolean(testType);
-        }
-        
-        // otherwise, no type coercion available
-        return false;
-    }
-    
-    private static boolean canCoerceNumeric(String testType)
-    {
-        try
-        {
-            TypeCoercer.coerceToNumber(testType);
-            // TODO: there is a case when coerceToNumber returns
-            // null meaning "not sure", that we may want to handle
-            // differently, with a warning
-            return true;
-        }
-        catch (TypeCoercionException tce)
-        {
-            // outright failure -- can't coerce
-            return false;
-        }
-    }
-    
-    private static Diagnostic methodSignaturesMatch(String firstMethodSig, String secondMethodSig)
-    {
-        // TODO: need to account for primitive type coercions
-        final String[]  firstMethodParams = 
-            Signature.getParameterTypes(firstMethodSig);
-        final String[]  secondMethodParams =
-            Signature.getParameterTypes(secondMethodSig);
-        
-        // fail fast if param count doesn't match
-        if (firstMethodParams.length != secondMethodParams.length)
-        {
-            return new BasicDiagnostic(Diagnostic.ERROR, "", 0,  //$NON-NLS-1$
-                    Messages.getString("TypeComparator.Parameter.count.mismatch"), null); //$NON-NLS-1$
-        }
-        
-        // now check each parameter
-        for (int i = 0; i < firstMethodParams.length; i++)
-        {
-            // need to box primitives before comparing
-            final String firstMethodParam = 
-                TypeTransformer.transformBoxPrimitives(firstMethodParams[i]);
-            final String secondMethodParam = 
-                TypeTransformer.transformBoxPrimitives(secondMethodParams[i]);
-            
-            if (!firstMethodParam.equals(secondMethodParam))
-            {
-                return new BasicDiagnostic(Diagnostic.ERROR, "", 0, //$NON-NLS-1$
-                        Messages.getString("TypeComparator.Type.mismatch.on.parameter")+i, null); //$NON-NLS-1$
-            }
-        }
-        
-        // if we get to here then we need only check the return type
-        final String firstReturn =
-            TypeTransformer.transformBoxPrimitives(Signature.getReturnType(firstMethodSig));
-        final String secondReturn =
-            TypeTransformer.transformBoxPrimitives(Signature.getReturnType(secondMethodSig));
-        
-        if (!firstReturn.equals(secondReturn))
-        {
-            return new BasicDiagnostic(Diagnostic.ERROR, "", 0, //$NON-NLS-1$
-                    Messages.getString("TypeComparator.Return.Types.Dont.Match"), null); //$NON-NLS-1$
-        }
-        
-        // if we get to here, then everything checks out
-        return Diagnostic.OK_INSTANCE;
-    }
-    
-    /**
-     * Precond: both firstType and secondType must represent value bindings.
-     * 
-     * @param firstType
-     * @param secondType
-     * @return a diagnostic validating that the two composite have compatible
-     * assignability
-     */
-    private static Diagnostic checkAssignability(CompositeType firstType, CompositeType secondType)
-    {
-        if (firstType.isRHS() && !secondType.isRHS())
-        {
-            return new BasicDiagnostic(Diagnostic.WARNING, "", 0,  //$NON-NLS-1$
-                            Messages.getString("TypeComparator.Expression.Not.Gettable"), null); //$NON-NLS-1$
-        }
-        
-        if (firstType.isLHS() && !secondType.isLHS())
-        {
-            return new BasicDiagnostic(Diagnostic.WARNING, "", 0, //$NON-NLS-1$
-                            Messages.getString("TypeComparator.Expression.Expected.Settable"), null); //$NON-NLS-1$
-        }
-        
-        return Diagnostic.OK_INSTANCE;
-    }
-    
-    private TypeComparator()
-    {
-        // static utility class; not instantiable
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeConstants.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeConstants.java
deleted file mode 100644
index e237825..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeConstants.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-/**
- * @author cbateman
- *
- */
-public class TypeConstants 
-{
-    /**
-     * we overload "void" to represent null
-     */
-    public final static String  TYPE_NULL = "V"; //$NON-NLS-1$
-    /**
-     * unboxed boolean 
-     */
-    public final static String  TYPE_BOOLEAN = "Z"; //$NON-NLS-1$
-    /**
-     * string type
-     */
-    public final static String   TYPE_STRING = "Ljava.lang.String;"; //$NON-NLS-1$
-    /**
-     * big integer
-     */
-    public final static String   TYPE_BIG_INTEGER = "Ljava.math.BigInteger;"; //$NON-NLS-1$
-    
-    /**
-     * big double
-     */
-    public final static String   TYPE_BIG_DOUBLE = "Ljava.math.BigDecimal;"; //$NON-NLS-1$
-    
-    /* boxed types */
-    /**
-     * Boxed byte
-     */
-    public final static String   TYPE_BOXED_BYTE = "Ljava.lang.Byte;"; //$NON-NLS-1$
-    /**
-     * Boxed short
-     */
-    public final static String   TYPE_BOXED_SHORT = "Ljava.lang.Short;"; //$NON-NLS-1$
-    /**
-     * Boxed int
-     */
-    public final static String   TYPE_BOXED_INTEGER = "Ljava.lang.Integer;"; //$NON-NLS-1$
-    /**
-     * Boxed long
-     */
-    public final static String   TYPE_BOXED_LONG = "Ljava.lang.Long;"; //$NON-NLS-1$
-    /**
-     * Boxed float
-     */
-    public final static String   TYPE_BOXED_FLOAT = "Ljava.lang.Float;"; //$NON-NLS-1$
-    /**
-     * Boxed double
-     */
-    public final static String   TYPE_BOXED_DOUBLE = "Ljava.lang.Double;"; //$NON-NLS-1$
-    /**
-     * Boxed boolean 
-     */
-    public final static String   TYPE_BOXED_BOOLEAN = "Ljava.lang.Boolean;"; //$NON-NLS-1$
-    /**
-     * Boxed char 
-     */
-    public final static String   SIGNATURE_BOXED_CHARACTER = "Ljava.lang.Character"; //$NON-NLS-1$
-    /**
-     * Map type
-     */
-    public final static String   TYPE_MAP = "Ljava.util.Map;"; //$NON-NLS-1$
-    /**
-     * Collection type
-     */
-    public final static String   TYPE_COLLECTION = "Ljava.util.Collection;"; //$NON-NLS-1$
-    /**
-     * Comparable type
-     */
-    public final static String   TYPE_COMPARABLE = "Ljava.lang.Comparable;"; //$NON-NLS-1$
-    
-    /**
-     * List type
-     */
-    public final static String   TYPE_LIST = "Ljava.util.List;"; //$NON-NLS-1$
-    
-    /**
-     * java.lang.Object type signature
-     */
-    public static final String TYPE_JAVAOBJECT = "Ljava.lang.Object;"; //$NON-NLS-1$
-    /**
-     * Type signature for the JSF Data Model type
-     */
-    public static final String TYPE_DATA_MODEL = "Ljavax.faces.model.DataModel;"; //$NON-NLS-1$
-    /**
-     * Type signature for the Result Set type
-     */
-    public static final String TYPE_RESULT_SET = "Ljava.sql.ResultSet;"; //$NON-NLS-1$
-    /**
-     * Type signature for the JSTL ResultSet type
-     */
-    public static final String TYPE_JAVAX_SERVLET_JSP_JSTL_SQL_RESULT = "Ljavax.servlet.jsp.jstl.sql.Result;"; //$NON-NLS-1$
-    /**
-     * Type signature of the base type of all enum types
-     */
-    public static final String TYPE_ENUM_BASE = "Ljava.lang.Enum;";  // $NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeInfo.java
deleted file mode 100644
index 0015b6f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeInfo.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package org.eclipse.jst.jsf.common.internal.types;
-
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol;
-
-/**This class contains all info that is cached for a given IType.
- * @see org.eclipse.jst.jsf.common.internal.types.TypeInfoCache
- * 
- * @author Matthias
- */
-class TypeInfo {
-    
-    /**Empty String array. Used for the (usual) case when a type has no missing supertypes.
-     */
-    public static String[] NO_NAMES = new String[0];
-
-    private IBeanMethodSymbol[] methods = null;
-    private IBeanPropertySymbol[] properties = null;
-    private IType[] supertypes = null;
-    private IType[] interfaceTypes = null;
-    private String[] missingSupertypeNames = null;
-    
-    /**Creates an empty TypeInfo object
-     */
-    public TypeInfo() {
-        super();
-    }
-    
-    /**Returns the method symbols. Returns <code>null</code> if none have been cached.
-     * @return the method symbols. May be null.
-     */
-    public IBeanMethodSymbol[] getMethodSymbols() {
-        return methods;
-    }
-    
-    /**Returns the property symbols. Returns <code>null</code> if none have been cached.
-     * @return the property symbols. May be null.
-     */
-    public IBeanPropertySymbol[] getPropertySymbols() {
-        return properties;
-    }
-
-    /**Sets the methods symbols to be cached.
-     * @param methods - the method symbols
-     */
-    public void setMethodSymbols(IBeanMethodSymbol[] methods) {
-        this.methods = methods;
-    }
-
-    /**Sets the property symbols to be cached.
-     * @param properties - the property symbols
-     */
-    public void setPropertySymbols(IBeanPropertySymbol[] properties) {
-        this.properties = properties;
-    }
-
-    /**Returns the supertypes. Returns <code>null</code> if none have been cached.
-     * @return the supertypes. May be null.
-     */
-    public IType[] getSupertypes() {
-        return supertypes;
-    }
-
-    /**Sets the supertypes to be cached.
-     * @param superTypes - the property symbols
-     */
-    public void setSupertypes(IType[] superTypes) {
-        this.supertypes = superTypes;
-    }
-
-    /**Returns the interface types. Returns <code>null</code> if none have been cached.
-     * @return the interface types. May be null.
-     */
-    public IType[] getInterfaceTypes() {
-        return interfaceTypes;
-    }
-
-    /**Sets the interface types to be cached.
-     * @param interfaceTypes - the property symbols
-     */
-    public void setInterfaceTypes(IType[] interfaceTypes) {
-        this.interfaceTypes = interfaceTypes;
-    }
-
-    /**Returns the names of the missing supertypes. Returns <code>null</code> if none have been cached.
-     * @return the names of the missing supertypes. May be null.
-     */
-    public String[] getMissingSupertypeNames() {
-        return missingSupertypeNames;
-    }
-
-    /**Sets the supertypes to be cached.
-     * @param missingSupertypeNames - the names of the missing supertypes
-     */
-    public void setMissingSupertypeNames(String[] missingSupertypeNames) {
-        this.missingSupertypeNames = missingSupertypeNames;
-    }
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeInfoCache.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeInfoCache.java
deleted file mode 100644
index dcd0c29..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeInfoCache.java
+++ /dev/null
@@ -1,543 +0,0 @@
-package org.eclipse.jst.jsf.common.internal.types;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.ElementChangedEvent;
-import org.eclipse.jdt.core.IClassFile;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IElementChangedListener;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaElementDelta;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.ITypeRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.core.PackageFragment;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol;
-
-/**Provides a cache for java IType properties. It can cache bean property symbols, method symbols,
- * supertypes and implemented interfaces per IType. The cache listens to changes in the java model
- * and invalidates affected properties, but does not update them.
- * 
- * @author Matthias
- */
-public class TypeInfoCache implements IElementChangedListener {
-    
-    private static TypeInfoCache instance = null;
-    
-    /**Returns the TypeInfoCache instance.
-     * 
-     * @return the TypeInfoCache instance
-     */
-    public static synchronized TypeInfoCache getInstance() {
-        if (instance == null) {
-            instance = new TypeInfoCache();
-            JavaCore.addElementChangedListener(instance, ElementChangedEvent.POST_CHANGE);
-        }
-        return instance;
-    }
-    
-    private final Map /*<IType, TypeInfo>*/ cachedInfo;
-    private final Map /*<ITypeRoot, Set<IType>>*/ cachedTypesByAffectingTypeRoot;
-    private final Map /*<String, Set<IType>>*/ cachedTypesByMissingSupertypename;
-    
-    private TypeInfoCache() {
-        cachedInfo = new HashMap();
-        cachedTypesByAffectingTypeRoot = new HashMap();
-        cachedTypesByMissingSupertypename = new HashMap(10);
-    }
-
-    public void elementChanged(ElementChangedEvent event) {
-        updateChangedJavaElement(event.getDelta());
-    }
-    
-    /**Returns the cached info({@link TypeInfo}) for a given type. Will
-     * return <code>null</code> if no info has been cached or the the type/something it depends on
-     * has changed since then.
-     * 
-     * @param type - the type in question
-     * @return a TypeInfo instance that contains all cached info for the given type. May be null.  
-     */
-    protected TypeInfo getTypeInfo(IType type) {
-        TypeInfo info = null;
-        if (type != null)
-        {
-            info = (TypeInfo) cachedInfo.get(type);
-        }
-        return info;
-    }
-
-    /**Returns the cached bean property symbols for a given type. Will return null if no
-     * bean property symbols have been cached or the type/something it depends on has changed since
-     * then.
-     * @param beanType - the bean type in question
-     * @return the bean property symbols for the given type. May be null.
-     * @see TypeInfoCache#cachePropertySymbols(IType, IBeanPropertySymbol[])
-     */
-    public synchronized IBeanPropertySymbol[] getCachedPropertySymbols(IType beanType) {
-        IBeanPropertySymbol[] props = null;
-        
-        if (beanType != null)
-        {
-            TypeInfo typeInfo = getTypeInfo(beanType);
-            if (typeInfo != null)
-            {
-                props =  typeInfo.getPropertySymbols();
-            }
-        }
-        return props;
-    }
-
-    /**Returns the cached method symbols for a given type. Will return null if no
-     * method symbols have been cached or the type/something it depends on has changed since
-     * then.
-     * @param beanType - the bean type in question
-     * @return the method symbols for the given type. May be null.
-     * @see TypeInfoCache#cacheMethodSymbols(IType, IBeanMethodSymbol[])
-     */
-    public synchronized IBeanMethodSymbol[] getCachedMethodSymbols(IType beanType) {
-        IBeanMethodSymbol[]  methods = null;
-        
-        if (beanType != null)
-        {
-            TypeInfo typeInfo = getTypeInfo(beanType);
-            if (typeInfo != null)
-            {
-                methods =  typeInfo.getMethodSymbols();
-            }
-        }
-            
-        return methods;
-    }
-    
-    /**Returns the cached supertypes for a given type. Will return null if no supertypes
-     * have been cached for this type or if the type/something it depends on has changed since
-     * then.
-     * @param type - the bean type in question
-     * @return the supertypes for the given type. May be null.
-     * @see TypeInfoCache#cacheSupertypesFor(IType)
-     */
-    public synchronized IType[] getCachedSupertypes(IType type) {
-        IType[] types = null;
-        
-        if (type != null)
-        {
-            TypeInfo typeInfo = getTypeInfo(type);
-            if (typeInfo != null)
-            {
-                types = typeInfo.getSupertypes();
-            }
-        }
-        
-        return types;
-    }
-    
-    /**Returns the cached implemented interfaces for a given type. Will return null if no interfaces
-     * have been cached for this type or if the type/something it depends on has changed since
-     * then.
-     * @param type - the bean type in question
-     * @return the interface types implemented by the given type. May be null.
-     * @see TypeInfoCache#cacheInterfaceTypesFor(IType)
-     */
-    public synchronized IType[] getCachedInterfaceTypes(IType type) 
-    {
-        IType[] types = null;
-        
-        if (type != null)
-        {
-            TypeInfo typeInfo = getTypeInfo(type);
-            if (typeInfo != null)
-            {
-                types = typeInfo.getInterfaceTypes(); 
-            }
-        }
-        
-        return types;
-    }
-    
-    /**Caches the given method symbols for the given type. 
-     * @param beanType - the type
-     * @param methods - the method symbols to cache
-     */
-    public synchronized void cacheMethodSymbols(IType beanType, IBeanMethodSymbol[] methods) {
-        if (beanType != null)
-        {
-            TypeInfo typeInfo = getOrCreateTypeInfo(beanType);
-            if (typeInfo != null) {
-                typeInfo.setMethodSymbols(methods);
-            }
-        }
-    }
-
-    /**Caches the given property symbols for the given type. 
-     * @param beanType - the type
-     * @param properties - the property symbols to cache
-     */
-    public synchronized void cachePropertySymbols(IType beanType, IBeanPropertySymbol[] properties) {
-        if (beanType != null)
-        {
-            TypeInfo typeInfo = getOrCreateTypeInfo(beanType);
-            if (typeInfo != null) {
-                typeInfo.setPropertySymbols(properties);
-            }
-        }
-    }
-    
-    /**Caches the supertypes for the given type. The supertypes will be calculated (and also returned)
-     * by this method.
-     * @param type - the type to cache supertypes for
-     * @return the supertypes of the given type.
-     */
-    public synchronized IType[] cacheSupertypesFor(IType type) 
-    {
-        IType[] types = null;
-        
-        if (type != null)
-        {
-            TypeInfo typeInfo = getOrCreateTypeInfo(type);
-            
-            if (typeInfo != null)
-            {
-                types = typeInfo.getSupertypes();
-            }
-        }
-        return types;
-    }
-
-    /**Caches the interface types for the given type. The interface types will be calculated (and also
-     * returned) by this method.
-     * @param type - the type to cache interface types for
-     * @return the interface types implemented by the given type.
-     */
-    public synchronized IType[] cacheInterfaceTypesFor(IType type) 
-    {
-        IType[] types = null;
-        
-        if (type != null)
-        {
-            TypeInfo typeInfo = getOrCreateTypeInfo(type);
-            if (typeInfo != null)
-            {
-                types = typeInfo.getInterfaceTypes();
-            }
-        }
-        return types;
-    }
-
-    /**Returns the TypeInfo for the given type. If no TypeInfo exists for this type, an empty TypeInfo
-     * will be created and cached.
-     * @param type - the type in question
-     * @return the (modifyable) TypeInfo for the given type
-     */
-    protected TypeInfo getOrCreateTypeInfo(IType type) {
-        TypeInfo typeInfo = getTypeInfo(type);
-        if (typeInfo == null) {
-            try {
-                final ITypeHierarchy  hierarchy = 
-                    type.newSupertypeHierarchy(new NullProgressMonitor());
-                final IType[] supertypes = hierarchy.getAllSuperclasses(type);
-                final IType[] interfaceTypes = hierarchy.getAllInterfaces();
-                final IType[] rootClasses = hierarchy.getRootClasses();
-                List missingSupertypesList = null;
-                for (int i = 0; i < rootClasses.length; i++) {
-                    String superclassName = rootClasses[i].getSuperclassName();
-                    if (superclassName != null) {
-                        if (missingSupertypesList == null) {
-                            missingSupertypesList = new ArrayList(1);
-                        }
-                        superclassName = shortTypename(superclassName);
-                        missingSupertypesList.add(superclassName);
-                    }
-                }
-                String[] missingSupertypes = null;
-                if (missingSupertypesList != null) {
-                    missingSupertypes = (String[]) missingSupertypesList.toArray(new String[missingSupertypesList.size()]);
-                } else {
-                    missingSupertypes = TypeInfo.NO_NAMES;
-                }
-                typeInfo = new TypeInfo();
-                typeInfo.setSupertypes(supertypes);
-                typeInfo.setInterfaceTypes(interfaceTypes);
-                typeInfo.setMissingSupertypeNames(missingSupertypes);
-                cachedInfo.put(type, typeInfo);
-                registerCachedType(type, typeInfo);
-            } catch (JavaModelException e) {
-                JSFCommonPlugin.log(e);
-            }
-        }
-        return typeInfo;
-    }
-
-    /**Returns the typename fragment after the last "." (which in most cases is identical to the
-     * unqualified typename).
-     * Used only to make sure that if n1 and n2 are names of the same type
-     * shortname(n1) equals shortname(2) even if one name is qualified and one not.
-     * @param typename
-     * @return the typename fragment after the last "."
-     */
-    private String shortTypename(String typename) {
-        int pos = typename.lastIndexOf('.');
-        if (pos >= 0) {
-            typename = typename.substring(pos + 1);
-        }
-        return typename;
-    }
-    
-    /**
-     * Registers the given type for all ITypeRoot's it depends on, so that it can be uncached if
-     * one of this ITypeRoot's has changed. The type must be unregistered when it should not be watched
-     * anymore.
-     * @param type - the type
-     * @param typeInfo - TypeInfo of the given type
-     * @see TypeInfoCache#unregisterCachedType(IType, TypeInfo)
-     */
-    protected void registerCachedType(IType type, TypeInfo typeInfo) {
-        registerTypeForTypeRoot(type, type.getTypeRoot());
-        IType[] supertypes = typeInfo.getSupertypes();
-        for (int i = 0; i < supertypes.length; i++) {
-            registerTypeForTypeRoot(type, supertypes[i].getTypeRoot());
-        }
-        String[] missingSupertypeNames = typeInfo.getMissingSupertypeNames();
-        if (missingSupertypeNames != null) {
-            for (int i = 0; i < missingSupertypeNames.length; i++) {
-                registerTypeForMissingSupertype(type, missingSupertypeNames[i]);
-            }
-        }
-    }
-
-    private void registerTypeForTypeRoot(IType type, ITypeRoot typeRoot) {
-        Set dependentTypes = (Set) cachedTypesByAffectingTypeRoot.get(typeRoot);
-        if (dependentTypes == null) {
-            dependentTypes = new HashSet(5);
-            cachedTypesByAffectingTypeRoot.put(typeRoot, dependentTypes);
-        }
-        dependentTypes.add(type);
-    }
-
-    private void registerTypeForMissingSupertype(IType type, String supertype) {
-        Set dependentTypes = (Set) cachedTypesByMissingSupertypename.get(supertype);
-        if (dependentTypes == null) {
-            dependentTypes = new HashSet(5);
-            cachedTypesByMissingSupertypename.put(supertype, dependentTypes);
-        }
-        dependentTypes.add(type);
-    }
-
-    /**Unregisters the given type for all ITypeRoot's it depended on.
-     * @param type - the type
-     * @param typeInfo - TypeInfo of the given type
-     */
-    protected void unregisterCachedType(IType type, TypeInfo typeInfo) {
-        unregisterTypeForTypeRoot(type, type.getTypeRoot());
-        IType[] supertypes = typeInfo.getSupertypes();
-        for (int i = 0; i < supertypes.length; i++) {
-            unregisterTypeForTypeRoot(type, supertypes[i].getTypeRoot());
-        }
-        String[] missingSupertypeNames = typeInfo.getMissingSupertypeNames();
-        if (missingSupertypeNames != null) {
-            for (int i = 0; i < missingSupertypeNames.length; i++) {
-                unregisterTypeForMissingSupertype(type, missingSupertypeNames[i]);
-            }
-        }
-    }
-
-    private void unregisterTypeForTypeRoot(IType type, ITypeRoot typeRoot) {
-        Set dependentTypes = (Set) cachedTypesByAffectingTypeRoot.get(typeRoot);
-        if (dependentTypes != null) {
-            dependentTypes.remove(type);
-            if (dependentTypes.isEmpty()) {
-                cachedTypesByAffectingTypeRoot.remove(typeRoot);
-            }
-        }
-    }
-    
-    private void unregisterTypeForMissingSupertype(IType type, String supertype) {
-        Set dependentTypes = (Set) cachedTypesByMissingSupertypename.get(supertype);
-        if (dependentTypes != null) {
-            dependentTypes.remove(type);
-            if (dependentTypes.isEmpty()) {
-                cachedTypesByMissingSupertypename.remove(supertype);
-            }
-        }
-    }
-    
-    /**This will remove all cached info for all types.
-     */
-    protected synchronized void uncacheAllTypes() {
-        cachedInfo.clear();
-        cachedTypesByAffectingTypeRoot.clear();
-        cachedTypesByMissingSupertypename.clear();
-    }
-    
-    /**Removes all cached info for all types that are subtypes of a type of the given ITypeRoot. 
-     * @param typeRoot
-     */
-    protected synchronized void uncacheAffectedTypes(ITypeRoot typeRoot) {
-        Collection affectedTypes = (Collection) cachedTypesByAffectingTypeRoot.get(typeRoot);
-        if (affectedTypes != null && !affectedTypes.isEmpty()) {
-            List affectedTypesCopy = new ArrayList(affectedTypes);
-            for (Iterator it = affectedTypesCopy.iterator(); it.hasNext(); ) {
-                IType cachedType = (IType) it.next();
-                TypeInfo typeInfo = (TypeInfo) cachedInfo.remove(cachedType);
-                unregisterCachedType(cachedType, typeInfo);
-            }
-        }
-    }
-    
-    /**Removes all cached info for all types (or subtypes of types) that specify a supertype
-     * that has a name similar to the given name. 
-     * @param supertypename - the missing supertype name. May be qualified or not
-     */
-    protected synchronized void uncacheTypesWithMissingSupertype(String supertypename) {
-        Collection affectedTypes = (Collection) cachedTypesByMissingSupertypename.get(shortTypename(supertypename));
-        if (affectedTypes != null && !affectedTypes.isEmpty()) {
-            List affectedTypesCopy = new ArrayList(affectedTypes);
-            for (Iterator it = affectedTypesCopy.iterator(); it.hasNext(); ) {
-                IType cachedType = (IType) it.next();
-                TypeInfo typeInfo = (TypeInfo) cachedInfo.remove(cachedType);
-                unregisterCachedType(cachedType, typeInfo);
-            }
-        }
-    }
-    
-    /**Removes all cached info that may be affected by the given change.
-     * @param delta - the change in the java model
-     */
-    protected void updateChangedJavaElement(IJavaElementDelta delta) {
-        IJavaElement element= delta.getElement();
-        switch (element.getElementType()) {
-            case IJavaElement.JAVA_MODEL:
-                updateChangedJavaModel(delta, element);
-                break;
-            case IJavaElement.JAVA_PROJECT:
-                updateChangedJavaProject(delta, element);
-                break;
-            case IJavaElement.PACKAGE_FRAGMENT_ROOT:
-                updateChangedPackageFragmentRoot(delta, element);
-                break;
-            case IJavaElement.PACKAGE_FRAGMENT:
-                updateChangedPackageFragment(delta, (PackageFragment) element);
-                break;
-            case IJavaElement.CLASS_FILE:
-            case IJavaElement.COMPILATION_UNIT:
-                updateChangedOpenable(delta, element);
-                break;
-        }
-    }
-    
-    private void updateChangedChildren(IJavaElementDelta delta) {
-        if ((delta.getFlags() & IJavaElementDelta.F_CHILDREN) > 0) {
-            IJavaElementDelta[] children= delta.getAffectedChildren();
-            for (int i= 0; i < children.length; i++) {
-                updateChangedJavaElement(children[i]);
-            }
-        }
-    }
-
-    private void updateChangedJavaModel(IJavaElementDelta delta, IJavaElement element) {
-        switch (delta.getKind()) {
-            case IJavaElementDelta.ADDED :
-            case IJavaElementDelta.REMOVED :
-                uncacheAllTypes();
-                break;
-            case IJavaElementDelta.CHANGED :
-                updateChangedChildren(delta);
-                break;
-        }
-    }
-
-    private void updateChangedJavaProject(IJavaElementDelta delta, IJavaElement element) {
-        int kind = delta.getKind();
-        int flags = delta.getFlags();
-        if ((flags & IJavaElementDelta.F_OPENED) != 0) {
-            kind = IJavaElementDelta.ADDED; // affected in the same way
-        }
-        if ((flags & IJavaElementDelta.F_CLOSED) != 0) {
-            kind = IJavaElementDelta.REMOVED; // affected in the same way
-        }
-        switch (kind) {
-            case IJavaElementDelta.ADDED :
-            case IJavaElementDelta.REMOVED :
-                uncacheAllTypes();
-                break;
-            case IJavaElementDelta.CHANGED :
-                updateChangedChildren(delta);
-                break;
-        }
-    }
-
-   private void updateChangedPackageFragment(IJavaElementDelta delta, PackageFragment element) {
-        switch (delta.getKind()) {
-            case IJavaElementDelta.ADDED :
-                // if the package fragment is in the projects being considered, this could
-                // introduce new types, changing the hierarchy
-            case IJavaElementDelta.REMOVED :
-                // is a change if the package fragment contains supertypes?
-                uncacheAllTypes();
-                break;
-            case IJavaElementDelta.CHANGED :
-                // look at the files in the package fragment
-                updateChangedChildren(delta);
-        }
-    }
-
-    private void updateChangedPackageFragmentRoot(IJavaElementDelta delta, IJavaElement element) {
-        switch (delta.getKind()) {
-            case IJavaElementDelta.ADDED :
-            case IJavaElementDelta.REMOVED :
-                uncacheAllTypes();
-                break;
-            case IJavaElementDelta.CHANGED :
-                int flags = delta.getFlags();
-                if (((flags & IJavaElementDelta.F_ADDED_TO_CLASSPATH) > 0)||(flags & IJavaElementDelta.F_REMOVED_FROM_CLASSPATH) > 0) {
-                    uncacheAllTypes();
-                } else {
-                    updateChangedChildren(delta);
-                }
-                break;
-        }
-    }
-
-    /**Removes all cached info that may be affected by the change in this IOpenable
-     * @param delta - the change in the java model
-     * @param element - the (changed) IOpenable considered
-     */
-    protected void updateChangedOpenable(IJavaElementDelta delta, IJavaElement element) {
-        if (element instanceof ITypeRoot) {
-            ITypeRoot typeRoot = (ITypeRoot) element;
-            uncacheAffectedTypes(typeRoot);
-            // Creates missing superclass for any cached type?
-            if (delta.getKind() == IJavaElementDelta.ADDED) {
-                if (typeRoot instanceof ICompilationUnit) {
-                    ICompilationUnit cu = (ICompilationUnit) typeRoot;
-                    try {
-                        IType[] types = cu.getAllTypes();
-                        for (int i = 0; i < types.length; i++) {
-                            uncacheTypesWithMissingSupertype(types[i].getElementName());
-                        }
-                    } catch (JavaModelException e) {
-                        JSFCommonPlugin.log(IStatus.INFO, "Unable to get types for compilation unit " + cu, e); //$NON-NLS-1$
-                        uncacheAllTypes();
-                    }
-                } else if (typeRoot instanceof IClassFile) {
-                    IClassFile cf = (IClassFile) typeRoot;
-                    IType type = cf.getType();
-                    uncacheTypesWithMissingSupertype(type.getElementName());
-                }
-            }
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeTransformer.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeTransformer.java
deleted file mode 100644
index 4c5718f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeTransformer.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.jdt.core.Signature;
-
-/**
- * Transforms one CompositeType to another according to particular 
- * transform rules.
- * 
- * In general, every transformation should be of the form:
- * 
- *   CompositeType  transform(CompositeType original, other inputs...);
- * 
- * @author cbateman
- *
- */
-public class TypeTransformer 
-{
-    private final static Map  boxConversions = new HashMap();
-    private final static Map  unBoxConversions = new HashMap();
-    
-    static
-    {
-        // see jdt.core.Signature or JVM link spec for more details
-        boxConversions.put("B", "Ljava.lang.Byte;");  //$NON-NLS-1$//$NON-NLS-2$
-        boxConversions.put("C", "Ljava.lang.Character;"); //$NON-NLS-1$ //$NON-NLS-2$
-        boxConversions.put("D", "Ljava.lang.Double;"); //$NON-NLS-1$ //$NON-NLS-2$
-        boxConversions.put("F", "Ljava.lang.Float;"); //$NON-NLS-1$ //$NON-NLS-2$
-        boxConversions.put("I", "Ljava.lang.Integer;"); //$NON-NLS-1$ //$NON-NLS-2$
-        boxConversions.put("J", "Ljava.lang.Long;"); //$NON-NLS-1$ //$NON-NLS-2$
-        boxConversions.put("S", "Ljava.lang.Short;"); //$NON-NLS-1$ //$NON-NLS-2$
-        boxConversions.put("Z", "Ljava.lang.Boolean;"); //$NON-NLS-1$ //$NON-NLS-2$
-        // don't box V
-        boxConversions.put("V", "V"); //$NON-NLS-1$ //$NON-NLS-2$
-    
-        // invert hte box conversions
-        for (final Iterator it = boxConversions.keySet().iterator(); it.hasNext();)
-        {
-            final String newValue = (String) it.next();
-            final String newKey = (String) boxConversions.get(newValue);
-            if (unBoxConversions.put(newKey, newValue) != null)
-            {
-                // if put returns non-null then we have replaced a key
-                // added on a previous iteration.  This implies
-                // that box mappings are no longer one-to-one
-                throw new AssertionError("Duplicated boxing value"); //$NON-NLS-1$
-            }
-        }
-    }
-    
-    /**
-     * @param compositeType
-     * @return an equivilent form of compositeType with all primitive type
-     * signatures converted to their fully qualified boxed equivilent but
-     * otherwise unchanged.
-     * 
-     * Example:   J -> Ljava.lang.Long;
-     */
-    public static CompositeType transformBoxPrimitives(CompositeType compositeType)
-    {
-        String[] signatures = compositeType.getSignatures();
-        String[] newsignatures = new String[signatures.length];
-        
-        for (int i = 0; i < signatures.length; i++)
-        {
-            newsignatures[i] = transformBoxPrimitives(signatures[i]);
-        }
-        
-        return new CompositeType(newsignatures, compositeType.getAssignmentTypeMask());
-    }
-    
-    /**
-     * Performs boxing for a single typeSignature string
-     * @param curSignature
-     * @return the boxed signature
-     */
-    public static String transformBoxPrimitives(final String curSignature)
-    {
-        String newSignature = curSignature;
-        
-        // first determine if we have a type or method signature
-        try
-        {
-            int kind = Signature.getTypeSignatureKind(curSignature);
-            
-            // interested in base types, since these need boxing
-            if (kind == Signature.BASE_TYPE_SIGNATURE)
-            {
-                // grab the box for the primitive
-                newSignature = (String) boxConversions.get(curSignature);
-            }
-            else if (kind == Signature.ARRAY_TYPE_SIGNATURE)
-            {
-                // check if it's array of primitives
-                final String baseType = Signature.getElementType(curSignature);
-                
-                if (Signature.getTypeSignatureKind(baseType) == Signature.BASE_TYPE_SIGNATURE)
-                {
-                    // it is, so box it
-                    final String newBaseType = (String) boxConversions.get(baseType);
-                    final int numBraces = Signature.getArrayCount(curSignature);
-                    newSignature = ""; //$NON-NLS-1$
-                    for (int j = 0; j < numBraces; j++)
-                    {
-                        newSignature += "["; //$NON-NLS-1$
-                    }
-                    
-                    newSignature += newBaseType;
-                }
-            }
-        }
-        catch (IllegalArgumentException e)
-        {
-            // signature was not a type signature, so must be a method sig
-            // do nothing: don't box method types
-        }
-
-        return newSignature;
-    }
-    
-    /**
-     * Performs the exact inverse of transformBoxPrimitives -- takes all
-     * boxing type signatures and replaces them with their primitive equivilent
-     * @param compositeType
-     * @return a new composite with all boxed primitives unboxed
-     */
-    public static CompositeType transformUnboxPrimitives(CompositeType compositeType)
-    {
-        String[] signatures = compositeType.getSignatures();
-        String[] newsignatures = new String[signatures.length];
-        
-        for (int i = 0; i < signatures.length; i++)
-        {
-            newsignatures[i] = transformUnboxPrimitives(signatures[i]);
-        }
-        
-        return new CompositeType(newsignatures, compositeType.getAssignmentTypeMask());
-    }
-    
-    /**
-     * Performs unboxing for a single typeSignature string
-     * 
-     * @param typeSignature
-     * @return the transformed signature
-     */
-    public static String transformUnboxPrimitives(final String typeSignature)
-    {
-        String newSignature = typeSignature;
-        
-        // first determine if we have a type or method signature
-        try
-        {
-            int kind = Signature.getTypeSignatureKind(typeSignature);
-            
-            // interested in class types, since these need boxing
-            if (kind == Signature.CLASS_TYPE_SIGNATURE)
-            {
-                // grab the box for the primitive
-                String checkForUnbox  = (String) unBoxConversions.get(typeSignature);
-                
-                if (checkForUnbox != null)
-                {
-                    newSignature = checkForUnbox;
-                }
-            }
-            else if (kind == Signature.ARRAY_TYPE_SIGNATURE)
-            {
-                // check if it's array of objects
-                final String baseType = Signature.getElementType(typeSignature);
-                
-                if (Signature.getTypeSignatureKind(baseType) == Signature.CLASS_TYPE_SIGNATURE)
-                {
-                    // it is, so unbox it
-                    final String newBaseTypeCandidate = (String) unBoxConversions.get(baseType);
-                    
-                    if (newBaseTypeCandidate != null)
-                    {
-                        final int numBraces = Signature.getArrayCount(typeSignature);
-                        newSignature = ""; //$NON-NLS-1$
-                        for (int j = 0; j < numBraces; j++)
-                        {
-                            newSignature += "["; //$NON-NLS-1$
-                        }
-                        
-                        newSignature += newBaseTypeCandidate;
-                    }
-                }
-            }
-        }
-        catch (IllegalArgumentException e)
-        {
-            // signature was not a type signature, so must be a method sig
-            // do nothing: don't box method types
-        }
-        
-        return newSignature;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeUtil.java
deleted file mode 100644
index a302fc4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeUtil.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-import org.eclipse.jdt.core.Signature;
-
-/**
- * Package utility class
- * @author cbateman
- *
- */
-/*package*/final class TypeUtil 
-{
-    /**
-     * @param assignmentType
-     * @return true if assignmentType has lhs flag set
-     */
-    public static boolean matchesLHS(int assignmentType)
-    {
-        return (assignmentType & IAssignable.ASSIGNMENT_TYPE_LHS) != 0;
-    }
-    
-    /**
-     * @param assignmentType
-     * @return true if assignmentType has rhs flag set
-     */
-    public static boolean matchesRHS(int assignmentType)
-    {
-        return (assignmentType & IAssignable.ASSIGNMENT_TYPE_RHS) != 0;
-    }
-
-    /**
-     * @param signature
-     * @return true if the signature is a method signature
-     */
-    public static boolean isMethodSignature(final String signature)
-    {
-        // method signature must start with a "("
-        return signature.charAt(0) == Signature.C_PARAM_START;
-    }
-    private TypeUtil() {/*not instantiable*/}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/ValueType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/ValueType.java
deleted file mode 100644
index 2d12825..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/ValueType.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.internal.types;
-
-import org.eclipse.jdt.core.Signature;
-
-/**
- * Value object representing a value binding type by it's type and assignability
- * information
- * 
- * @author cbateman
- *
- */
-public class ValueType implements SignatureBasedType, IAssignable
-{
-    /**
-     * A default empty string array
-     */
-    protected final static String[]        EMPTY_STRING_ARRAY = new String[0];
-    
-    private final String        _signature;
-    private final String[]      _typeArgs;
-    private final int           _assignmentMask;
-    private final String[]      _superTypes;
-    private final String[]      _interfaceTypes;
-    
-    private final boolean       _isEnumType;
-    
-    private String[]            _allTypes;  // lazy creation on getAllTypes
-
-    /**
-     * Construct a new ValueType object with the given
-     * signature
-     * 
-     * @param signature
-     * @param typeArgs generic type arguments for signature or empty if none
-     * @param superTypes 
-     * @param interfaceTypes 
-     * @param isEnumType 
-     * @param assignmentMask 
-     */
-    public ValueType(final String signature,
-                     final String[] typeArgs,
-                     final String[] superTypes,
-                     final String[] interfaceTypes,
-                     final boolean  isEnumType,
-                     final int assignmentMask) 
-    {
-        if (signature == null)
-        {
-            throw new AssertionError("signature can never be null"); //$NON-NLS-1$
-        }
-    
-        _signature = signature;
-        _typeArgs = typeArgs;
-        _assignmentMask = assignmentMask;
-        _superTypes = superTypes != null ? superTypes : EMPTY_STRING_ARRAY;
-        _interfaceTypes = interfaceTypes != null ? interfaceTypes : EMPTY_STRING_ARRAY;
-        _isEnumType = isEnumType;
-    }
-    
-    /**
-     * Copy constructor equivilent to 
-     * ValueType(template.getSignature(), template.getSuperTypes(), template.getInterfaceTypes(),assingmentMask, template._isEnumType)
-     * 
-     * @param template
-     * @param assignmentMask
-     */
-    public ValueType(final ValueType  template, final int assignmentMask)
-    {
-        this(template._signature, template._typeArgs, template._superTypes, 
-                template._interfaceTypes, template._isEnumType, assignmentMask);
-    }
-    
-    /**
-     * Convienence constructor for creating ValueType's with no supertype, type argument
-     * or interface info.  Equivilent to:
-     *  ValueType(signature, new String[0], new String[0], new String[0], false, assignmentMask)
-     *  
-     * @param signature
-     * @param assignmentMask
-     */
-    public ValueType(final String signature, final int assignmentMask)
-    {
-        this(signature, EMPTY_STRING_ARRAY, EMPTY_STRING_ARRAY, EMPTY_STRING_ARRAY, false, assignmentMask);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.core.internal.types.SignatureBasedType#getSignature()
-     */
-    public String getSignature() 
-    {
-        return _signature;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.internal.types.IAssignable#getAssignability()
-     */
-    public int getAssignability() {
-        return _assignmentMask;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.internal.types.IAssignable#isLHS()
-     */
-    public boolean isLHS() {
-        return TypeUtil.matchesLHS(_assignmentMask);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.internal.types.IAssignable#isRHS()
-     */
-    public boolean isRHS() {
-        return TypeUtil.matchesRHS(_assignmentMask);
-    }
-    
-    /* (non-Javadoc)
-     * @see java.lang.Object#toString()
-     */
-    public String toString()
-    {
-        return Signature.getSignatureSimpleName
-            (TypeTransformer.transformBoxPrimitives(_signature));
-    }
-    
-    /**
-     * @return an array of all signatures of all super types or empty
-     * array if there are no super types for this type
-     * 
-     * Note: if isArray() == true, then these are the super types of 
-     * the base element
-     */
-    public String[] getSuperTypes()
-    {
-        return _superTypes;
-    }
-    
-    /**
-     * @return an array of all interfaces implemented or empty array
-     * if none
-     * 
-     * Note: if isArray() == true, then these are the interfacess of 
-     * the base element
-     */
-    public String[] getInterfaceTypes()
-    {
-        return _interfaceTypes;
-    }
-    
-    /**
-     * @return all types including the base type, super types and interface
-     * types.
-     * 
-     * Note: if isArray() == true, then these are the super types of 
-     * the base element
-
-     */
-    public String[]  getAllTypes()
-    {
-        if (_allTypes == null)
-        {
-            int numberOfTypes = 1 + _superTypes.length + _interfaceTypes.length;
-            _allTypes = new String[numberOfTypes];
-            _allTypes[0] = _signature;
-            System.arraycopy(_superTypes, 0, _allTypes, 1, _superTypes.length);
-            System.arraycopy(_interfaceTypes, 0, _allTypes, 1+_superTypes.length, _interfaceTypes.length);
-        }
-        return _allTypes;
-    }
-    
-    /**
-     * @return the type arguments for getSignature() if any or empty array if none
-     */
-    public String[] getTypeArguments()
-    {
-        return _typeArgs;
-    }
-    
-    /**
-     * 
-     */
-    public CompositeType toCompositeType() 
-    {
-        return new CompositeType(getAllTypes(), getAssignability());
-    }
-
-    /**
-     * @param signature
-     * @return true if an instance of this type would satisfy instanceof signature
-     *  
-     */
-    public boolean isInstanceOf(final String signature)
-    {
-        // if this is an array, then the super types are for the base
-        // type and we can't be an instance of anything but signature
-        if (isArray())
-        {
-            return getSignature().equals(signature);
-        }
-        
-        final String[]  allTypes = getAllTypes();
-        
-        for (int i = 0; i < allTypes.length; i++)
-        {
-            if (allTypes[i].equals(signature))
-            {
-                return true;
-            }
-        }
-        
-        return false;
-    }
-    
-    /**
-     * @return true if this is an array type
-     */
-    public boolean isArray()
-    {
-        return Signature.getArrayCount(getSignature()) > 0;
-    }
-
-    /**
-     * @return true if the value type represents a (>=Java5) enum type
-     */
-    public boolean isEnumType() {
-        return _isEnumType;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/messages.properties
deleted file mode 100644
index b34c98b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/messages.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
-###############################################################################
-TypeComparator.Expression.Doesnt.Match.Expected.Types=EL expression does not evaluate to expected types for this attribute
-TypeComparator.Parameter.count.mismatch=Parameter count mismatch
-TypeComparator.Type.mismatch.on.parameter=Type mismatch on parameter 
-TypeComparator.Return.Types.Dont.Match=Return types don't match
-TypeComparator.Expression.Not.Gettable=Expression is not gettable
-TypeComparator.Expression.Expected.Settable=Attribute expects settable value, but expression is not settable
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/Entity.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/Entity.java
deleted file mode 100644
index 6af707e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/Entity.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.common.metadata;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Entity</b></em>'.
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.Entity#getChildEntities <em>Child Entities</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.Entity#getTraits <em>Traits</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.Entity#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.Entity#getType <em>Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.Entity#getIncludeGroups <em>Include Groups</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getEntity()
- * @model extendedMetaData="kind='element' name='entity'"
- * @generated
- */
-public interface Entity extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Child Entities</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.common.metadata.Entity}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Child Entities</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Child Entities</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getEntity_ChildEntities()
-	 * @model type="org.eclipse.jst.jsf.common.metadata.Entity" containment="true"
-	 *        extendedMetaData="kind='element' name='entity'"
-	 * @generated
-	 */
-	EList getChildEntities();
-
-	/**
-	 * Returns the value of the '<em><b>Traits</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.common.metadata.Trait}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Traits</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Traits</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getEntity_Traits()
-	 * @model type="org.eclipse.jst.jsf.common.metadata.Trait" containment="true"
-	 *        extendedMetaData="kind='element' name='trait'"
-	 * @generated
-	 */
-	EList getTraits();
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getEntity_Id()
-	 * @model id="true" required="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.common.metadata.Entity#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Type</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Type</em>' attribute.
-	 * @see #setType(String)
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getEntity_Type()
-	 * @model
-	 * @generated
-	 */
-	String getType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.common.metadata.Entity#getType <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Type</em>' attribute.
-	 * @see #getType()
-	 * @generated
-	 */
-	void setType(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Include Groups</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Include Groups</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Include Groups</em>' reference list.
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getEntity_IncludeGroups()
-	 * @model type="org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup"
-	 *        extendedMetaData="kind='element' name='include-entity-group'"
-	 * @generated
-	 */
-	EList getIncludeGroups();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param visitor 	 
-	 * <!-- end-user-doc -->
-	 * @model visitorDataType="org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor"
-	 * @generated
-	 */
-	void accept(IEntityVisitor visitor);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return Model 
-	 * <!-- end-user-doc -->
-	 * @model kind="operation"
-	 * @generated
-	 */
-	Model getModel();
-
-} // Entity
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/EntityGroup.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/EntityGroup.java
deleted file mode 100644
index 09e9f73..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/EntityGroup.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.common.metadata;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Entity Group</b></em>'.
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getEntityGroup()
- * @model
- * @generated
- */
-public interface EntityGroup extends Entity {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-} // EntityGroup
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/IncludeEntityGroup.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/IncludeEntityGroup.java
deleted file mode 100644
index be4f146..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/IncludeEntityGroup.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.common.metadata;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Include Entity Group</b></em>'.
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup#getModelUri <em>Model Uri</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getIncludeEntityGroup()
- * @model
- * @generated
- */
-public interface IncludeEntityGroup extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getIncludeEntityGroup_Id()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Model Uri</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Model Uri</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Model Uri</em>' attribute.
-	 * @see #setModelUri(String)
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getIncludeEntityGroup_ModelUri()
-	 * @model extendedMetaData="name='uri'"
-	 * @generated
-	 */
-	String getModelUri();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup#getModelUri <em>Model Uri</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Model Uri</em>' attribute.
-	 * @see #getModelUri()
-	 * @generated
-	 */
-	void setModelUri(String value);
-
-} // IncludeEntityGroup
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/MetadataFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/MetadataFactory.java
deleted file mode 100644
index 8b8ea0c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/MetadataFactory.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.common.metadata;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * <p><b>NOT API</b></p>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage
- * @generated
- */
-public interface MetadataFactory extends EFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	MetadataFactory eINSTANCE = org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataFactoryImpl.init();
-
-	/**
-	 * Returns a new object of class '<em>Trait</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Trait</em>'.
-	 * @generated
-	 */
-	Trait createTrait();
-
-	/**
-	 * Returns a new object of class '<em>Include Entity Group</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Include Entity Group</em>'.
-	 * @generated
-	 */
-	IncludeEntityGroup createIncludeEntityGroup();
-
-	/**
-	 * Returns a new object of class '<em>Model</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Model</em>'.
-	 * @generated
-	 */
-	Model createModel();
-
-	/**
-	 * Returns a new object of class '<em>Entity</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Entity</em>'.
-	 * @generated
-	 */
-	Entity createEntity();
-
-	/**
-	 * Returns a new object of class '<em>Entity Group</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Entity Group</em>'.
-	 * @generated
-	 */
-	EntityGroup createEntityGroup();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	MetadataPackage getMetadataPackage();
-
-} //MetadataFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/MetadataPackage.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/MetadataPackage.java
deleted file mode 100644
index f97e3c8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/MetadataPackage.java
+++ /dev/null
@@ -1,892 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.common.metadata;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * <p><b>NOT API</b></p>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.common.metadata.MetadataFactory
- * @model kind="package"
- * @generated
- */
-public interface MetadataPackage extends EPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "metadata";
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://org.eclipse.jst.jsf.common.metadata/metadata.ecore";
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "md";
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	MetadataPackage eINSTANCE = org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.common.metadata.internal.impl.TraitImpl <em>Trait</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.TraitImpl
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getTrait()
-	 * @generated
-	 */
-	int TRAIT = 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.common.metadata.internal.impl.EntityImpl <em>Entity</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.EntityImpl
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getEntity()
-	 * @generated
-	 */
-	int ENTITY = 2;
-
-	/**
-	 * The feature id for the '<em><b>Child Entities</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY__CHILD_ENTITIES = 0;
-
-	/**
-	 * The feature id for the '<em><b>Traits</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY__TRAITS = 1;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY__ID = 2;
-
-	/**
-	 * The feature id for the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY__TYPE = 3;
-
-	/**
-	 * The feature id for the '<em><b>Include Groups</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY__INCLUDE_GROUPS = 4;
-
-	/**
-	 * The number of structural features of the '<em>Entity</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_FEATURE_COUNT = 5;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.common.metadata.internal.impl.ModelImpl <em>Model</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.ModelImpl
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getModel()
-	 * @generated
-	 */
-	int MODEL = 0;
-
-	/**
-	 * The feature id for the '<em><b>Child Entities</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MODEL__CHILD_ENTITIES = ENTITY__CHILD_ENTITIES;
-
-	/**
-	 * The feature id for the '<em><b>Traits</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MODEL__TRAITS = ENTITY__TRAITS;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MODEL__ID = ENTITY__ID;
-
-	/**
-	 * The feature id for the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MODEL__TYPE = ENTITY__TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Include Groups</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MODEL__INCLUDE_GROUPS = ENTITY__INCLUDE_GROUPS;
-
-	/**
-	 * The feature id for the '<em><b>Entity Groups</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MODEL__ENTITY_GROUPS = ENTITY_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Source Model Provider</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MODEL__SOURCE_MODEL_PROVIDER = ENTITY_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Current Model Context</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MODEL__CURRENT_MODEL_CONTEXT = ENTITY_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Model</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MODEL_FEATURE_COUNT = ENTITY_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.common.metadata.internal.impl.IncludeEntityGroupImpl <em>Include Entity Group</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.IncludeEntityGroupImpl
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getIncludeEntityGroup()
-	 * @generated
-	 */
-	int INCLUDE_ENTITY_GROUP = 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.common.metadata.internal.impl.EntityGroupImpl <em>Entity Group</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.EntityGroupImpl
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getEntityGroup()
-	 * @generated
-	 */
-	int ENTITY_GROUP = 1;
-
-	/**
-	 * The feature id for the '<em><b>Child Entities</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_GROUP__CHILD_ENTITIES = ENTITY__CHILD_ENTITIES;
-
-	/**
-	 * The feature id for the '<em><b>Traits</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_GROUP__TRAITS = ENTITY__TRAITS;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_GROUP__ID = ENTITY__ID;
-
-	/**
-	 * The feature id for the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_GROUP__TYPE = ENTITY__TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Include Groups</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_GROUP__INCLUDE_GROUPS = ENTITY__INCLUDE_GROUPS;
-
-	/**
-	 * The number of structural features of the '<em>Entity Group</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_GROUP_FEATURE_COUNT = ENTITY_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TRAIT__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TRAIT__VALUE = 1;
-
-	/**
-	 * The feature id for the '<em><b>Source Model Provider</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TRAIT__SOURCE_MODEL_PROVIDER = 2;
-
-	/**
-	 * The number of structural features of the '<em>Trait</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TRAIT_FEATURE_COUNT = 3;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int INCLUDE_ENTITY_GROUP__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Model Uri</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int INCLUDE_ENTITY_GROUP__MODEL_URI = 1;
-
-	/**
-	 * The number of structural features of the '<em>Include Entity Group</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int INCLUDE_ENTITY_GROUP_FEATURE_COUNT = 2;
-
-	/**
-	 * The meta object id for the '<em>ITrait Visitor</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.common.metadata.query.ITraitVisitor
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getITraitVisitor()
-	 * @generated
-	 */
-	int ITRAIT_VISITOR = 5;
-
-	/**
-	 * The meta object id for the '<em>IEntity Visitor</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getIEntityVisitor()
-	 * @generated
-	 */
-	int IENTITY_VISITOR = 6;
-
-	/**
-	 * The meta object id for the '<em>IMeta Data Source Model Provider</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getIMetaDataSourceModelProvider()
-	 * @generated
-	 */
-	int IMETA_DATA_SOURCE_MODEL_PROVIDER = 7;
-
-
-	/**
-	 * The meta object id for the '<em>Model Context</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.ModelKeyDescriptor
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getModelContext()
-	 * @generated
-	 */
-	int MODEL_CONTEXT = 8;
-
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.common.metadata.Trait <em>Trait</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Trait</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Trait
-	 * @generated
-	 */
-	EClass getTrait();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.common.metadata.Trait#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Trait#getId()
-	 * @see #getTrait()
-	 * @generated
-	 */
-	EAttribute getTrait_Id();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.common.metadata.Trait#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Value</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Trait#getValue()
-	 * @see #getTrait()
-	 * @generated
-	 */
-	EReference getTrait_Value();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.common.metadata.Trait#getSourceModelProvider <em>Source Model Provider</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Source Model Provider</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Trait#getSourceModelProvider()
-	 * @see #getTrait()
-	 * @generated
-	 */
-	EAttribute getTrait_SourceModelProvider();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup <em>Include Entity Group</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Include Entity Group</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup
-	 * @generated
-	 */
-	EClass getIncludeEntityGroup();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup#getId()
-	 * @see #getIncludeEntityGroup()
-	 * @generated
-	 */
-	EAttribute getIncludeEntityGroup_Id();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup#getModelUri <em>Model Uri</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Model Uri</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup#getModelUri()
-	 * @see #getIncludeEntityGroup()
-	 * @generated
-	 */
-	EAttribute getIncludeEntityGroup_ModelUri();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.common.metadata.Model <em>Model</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Model</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Model
-	 * @generated
-	 */
-	EClass getModel();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.common.metadata.Model#getSourceModelProvider <em>Source Model Provider</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Source Model Provider</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Model#getSourceModelProvider()
-	 * @see #getModel()
-	 * @generated
-	 */
-	EAttribute getModel_SourceModelProvider();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.common.metadata.Model#getCurrentModelContext <em>Current Model Context</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Current Model Context</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Model#getCurrentModelContext()
-	 * @see #getModel()
-	 * @generated
-	 */
-	EAttribute getModel_CurrentModelContext();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.common.metadata.Model#getEntityGroups <em>Entity Groups</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Entity Groups</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Model#getEntityGroups()
-	 * @see #getModel()
-	 * @generated
-	 */
-	EReference getModel_EntityGroups();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.common.metadata.Entity <em>Entity</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Entity</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Entity
-	 * @generated
-	 */
-	EClass getEntity();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.common.metadata.Entity#getChildEntities <em>Child Entities</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Child Entities</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Entity#getChildEntities()
-	 * @see #getEntity()
-	 * @generated
-	 */
-	EReference getEntity_ChildEntities();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.common.metadata.Entity#getTraits <em>Traits</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Traits</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Entity#getTraits()
-	 * @see #getEntity()
-	 * @generated
-	 */
-	EReference getEntity_Traits();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.common.metadata.Entity#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Entity#getId()
-	 * @see #getEntity()
-	 * @generated
-	 */
-	EAttribute getEntity_Id();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.common.metadata.Entity#getType <em>Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Type</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Entity#getType()
-	 * @see #getEntity()
-	 * @generated
-	 */
-	EAttribute getEntity_Type();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.common.metadata.Entity#getIncludeGroups <em>Include Groups</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Include Groups</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.Entity#getIncludeGroups()
-	 * @see #getEntity()
-	 * @generated
-	 */
-	EReference getEntity_IncludeGroups();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.common.metadata.EntityGroup <em>Entity Group</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Entity Group</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.EntityGroup
-	 * @generated
-	 */
-	EClass getEntityGroup();
-
-	/**
-	 * Returns the meta object for data type '{@link org.eclipse.jst.jsf.common.metadata.query.ITraitVisitor <em>ITrait Visitor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>ITrait Visitor</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.query.ITraitVisitor
-	 * @model instanceClass="org.eclipse.jst.jsf.common.metadata.query.ITraitVisitor" serializable="false"
-	 * @generated
-	 */
-	EDataType getITraitVisitor();
-
-	/**
-	 * Returns the meta object for data type '{@link org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor <em>IEntity Visitor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>IEntity Visitor</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor
-	 * @model instanceClass="org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor" serializable="false"
-	 * @generated
-	 */
-	EDataType getIEntityVisitor();
-
-	/**
-	 * Returns the meta object for data type '{@link org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider <em>IMeta Data Source Model Provider</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>IMeta Data Source Model Provider</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider
-	 * @model instanceClass="org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider"
-	 * @generated
-	 */
-	EDataType getIMetaDataSourceModelProvider();
-
-	/**
-	 * Returns the meta object for data type '{@link org.eclipse.jst.jsf.common.metadata.internal.ModelKeyDescriptor <em>Model Context</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Model Context</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.ModelKeyDescriptor
-	 * @model instanceClass="org.eclipse.jst.jsf.common.metadata.internal.ModelKeyDescriptor"
-	 * @generated
-	 */
-	EDataType getModelContext();
-
-	/**
-	 * Returns the factory that creates the instances of the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	MetadataFactory getMetadataFactory();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Defines literals for the meta objects that represent
-	 * <ul>
-	 *   <li>each class,</li>
-	 *   <li>each feature of each class,</li>
-	 *   <li>each enum,</li>
-	 *   <li>and each data type</li>
-	 * </ul>
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	interface Literals {
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.common.metadata.internal.impl.TraitImpl <em>Trait</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.TraitImpl
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getTrait()
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EClass TRAIT = eINSTANCE.getTrait();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EAttribute TRAIT__ID = eINSTANCE.getTrait_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EReference TRAIT__VALUE = eINSTANCE.getTrait_Value();
-
-		/**
-		 * The meta object literal for the '<em><b>Source Model Provider</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EAttribute TRAIT__SOURCE_MODEL_PROVIDER = eINSTANCE.getTrait_SourceModelProvider();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.common.metadata.internal.impl.IncludeEntityGroupImpl <em>Include Entity Group</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.IncludeEntityGroupImpl
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getIncludeEntityGroup()
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EClass INCLUDE_ENTITY_GROUP = eINSTANCE.getIncludeEntityGroup();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EAttribute INCLUDE_ENTITY_GROUP__ID = eINSTANCE.getIncludeEntityGroup_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Model Uri</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EAttribute INCLUDE_ENTITY_GROUP__MODEL_URI = eINSTANCE.getIncludeEntityGroup_ModelUri();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.common.metadata.internal.impl.ModelImpl <em>Model</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.ModelImpl
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getModel()
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EClass MODEL = eINSTANCE.getModel();
-
-		/**
-		 * The meta object literal for the '<em><b>Source Model Provider</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EAttribute MODEL__SOURCE_MODEL_PROVIDER = eINSTANCE.getModel_SourceModelProvider();
-
-		/**
-		 * The meta object literal for the '<em><b>Current Model Context</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EAttribute MODEL__CURRENT_MODEL_CONTEXT = eINSTANCE.getModel_CurrentModelContext();
-
-		/**
-		 * The meta object literal for the '<em><b>Entity Groups</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EReference MODEL__ENTITY_GROUPS = eINSTANCE.getModel_EntityGroups();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.common.metadata.internal.impl.EntityImpl <em>Entity</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.EntityImpl
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getEntity()
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EClass ENTITY = eINSTANCE.getEntity();
-
-		/**
-		 * The meta object literal for the '<em><b>Child Entities</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EReference ENTITY__CHILD_ENTITIES = eINSTANCE.getEntity_ChildEntities();
-
-		/**
-		 * The meta object literal for the '<em><b>Traits</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EReference ENTITY__TRAITS = eINSTANCE.getEntity_Traits();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EAttribute ENTITY__ID = eINSTANCE.getEntity_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Type</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EAttribute ENTITY__TYPE = eINSTANCE.getEntity_Type();
-
-		/**
-		 * The meta object literal for the '<em><b>Include Groups</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EReference ENTITY__INCLUDE_GROUPS = eINSTANCE.getEntity_IncludeGroups();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.common.metadata.internal.impl.EntityGroupImpl <em>Entity Group</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.EntityGroupImpl
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getEntityGroup()
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EClass ENTITY_GROUP = eINSTANCE.getEntityGroup();
-
-		/**
-		 * The meta object literal for the '<em>ITrait Visitor</em>' data type.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.common.metadata.query.ITraitVisitor
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getITraitVisitor()
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EDataType ITRAIT_VISITOR = eINSTANCE.getITraitVisitor();
-
-		/**
-		 * The meta object literal for the '<em>IEntity Visitor</em>' data type.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getIEntityVisitor()
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EDataType IENTITY_VISITOR = eINSTANCE.getIEntityVisitor();
-
-		/**
-		 * The meta object literal for the '<em>IMeta Data Source Model Provider</em>' data type.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getIMetaDataSourceModelProvider()
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EDataType IMETA_DATA_SOURCE_MODEL_PROVIDER = eINSTANCE.getIMetaDataSourceModelProvider();
-
-		/**
-		 * The meta object literal for the '<em>Model Context</em>' data type.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.ModelKeyDescriptor
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.impl.MetadataPackageImpl#getModelContext()
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EDataType MODEL_CONTEXT = eINSTANCE.getModelContext();
-
-	}
-
-} //MetadataPackage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/Model.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/Model.java
deleted file mode 100644
index fbc5ada..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/Model.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.common.metadata;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.ModelKeyDescriptor;
-import org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Model</b></em>'.
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.Model#getEntityGroups <em>Entity Groups</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.Model#getSourceModelProvider <em>Source Model Provider</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.Model#getCurrentModelContext <em>Current Model Context</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getModel()
- * @model extendedMetaData="kind='element' name='metadatamodel'"
- * @generated
- */
-public interface Model extends Entity {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Source Model Provider</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Source Model Provider</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Source Model Provider</em>' attribute.
-	 * @see #setSourceModelProvider(IMetaDataSourceModelProvider)
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getModel_SourceModelProvider()
-	 * @model unique="false" dataType="org.eclipse.jst.jsf.common.metadata.IMetaDataSourceModelProvider" transient="true" volatile="true"
-	 * @generated
-	 */
-	IMetaDataSourceModelProvider getSourceModelProvider();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.common.metadata.Model#getSourceModelProvider <em>Source Model Provider</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Source Model Provider</em>' attribute.
-	 * @see #getSourceModelProvider()
-	 * @generated
-	 */
-	void setSourceModelProvider(IMetaDataSourceModelProvider value);
-
-	/**
-	 * Returns the value of the '<em><b>Current Model Context</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Current Model Context</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Current Model Context</em>' attribute.
-	 * @see #setCurrentModelContext(ModelKeyDescriptor)
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getModel_CurrentModelContext()
-	 * @model dataType="org.eclipse.jst.jsf.common.metadata.ModelContext" transient="true" volatile="true"
-	 * @generated
-	 */
-	ModelKeyDescriptor getCurrentModelContext();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.common.metadata.Model#getCurrentModelContext <em>Current Model Context</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Current Model Context</em>' attribute.
-	 * @see #getCurrentModelContext()
-	 * @generated
-	 */
-	void setCurrentModelContext(ModelKeyDescriptor value);
-
-	/**
-	 * Returns the value of the '<em><b>Entity Groups</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.common.metadata.EntityGroup}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Entity Groups</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Entity Groups</em>' reference list.
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getModel_EntityGroups()
-	 * @model type="org.eclipse.jst.jsf.common.metadata.EntityGroup"
-	 *        extendedMetaData="kind='element' name='entityGroup'"
-	 * @generated
-	 */
-	EList getEntityGroups();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param groupId 
-	 * @return EntityGroup
-	 * @model
-	 * @generated
-	 */
-	EntityGroup findIncludeGroup(String groupId);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model visitorDataType="org.eclipse.jst.jsf.common.metadata.IEntityVisitor"
-	 * @generated
-	 */
-	void accept(IEntityVisitor visitor);
-
-} // Model
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/Trait.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/Trait.java
deleted file mode 100644
index 4eb1b30..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/Trait.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.common.metadata;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.query.ITraitVisitor;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Trait</b></em>'.
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.Trait#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.Trait#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.Trait#getSourceModelProvider <em>Source Model Provider</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getTrait()
- * @model extendedMetaData="kind='element' name='trait'"
- * @generated
- */
-public interface Trait extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getTrait_Id()
-	 * @model id="true" required="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.common.metadata.Trait#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value</em>' containment reference.
-	 * @see #setValue(EObject)
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getTrait_Value()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EObject getValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.common.metadata.Trait#getValue <em>Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' containment reference.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(EObject value);
-
-	/**
-	 * Returns the value of the '<em><b>Source Model Provider</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Source Model Provider</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Source Model Provider</em>' attribute.
-	 * @see #setSourceModelProvider(IMetaDataSourceModelProvider)
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#getTrait_SourceModelProvider()
-	 * @model dataType="org.eclipse.jst.jsf.common.metadata.IMetaDataSourceModelProvider"
-	 * @generated
-	 */
-	IMetaDataSourceModelProvider getSourceModelProvider();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.common.metadata.Trait#getSourceModelProvider <em>Source Model Provider</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Source Model Provider</em>' attribute.
-	 * @see #getSourceModelProvider()
-	 * @generated
-	 */
-	void setSourceModelProvider(IMetaDataSourceModelProvider value);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param visitor 
-	 * @model visitorDataType="org.eclipse.jst.jsf.common.metadata.query.ITraitVisitor"
-	 *        annotation="http://www.eclipse.org/emf/2002/GenModel body='visitor.visit(this);'"
-	 * @generated
-	 */
-	void accept(ITraitVisitor visitor);
-
-} // Trait
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/AbstractMetaDataLocator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/AbstractMetaDataLocator.java
deleted file mode 100644
index 8719c18..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/AbstractMetaDataLocator.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Convenient abstract class that a source model locator should consider extending.
- */
-public abstract class AbstractMetaDataLocator implements IMetaDataLocator, IMetaDataObservable{
-	
-	private IDomainSourceModelType domainSourceModelType;
-	private Set/*<IMetaDataObserver>*/ observers;
-
-	/**
-	 * Constructor
-	 */
-	public AbstractMetaDataLocator(){
-		observers = new HashSet(1);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataLocator#getDomainSourceModelType()
-	 */
-	public IDomainSourceModelType getDomainSourceModelType() {
-		return domainSourceModelType;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataLocator#setDomainSourceModelType(org.eclipse.jst.jsf.common.metadata.internal.IDomainSourceModelType)
-	 */
-	public void setDomainSourceModelType(
-			IDomainSourceModelType domainSourceModelType) {
-		this.domainSourceModelType = domainSourceModelType;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataLocator#addObserver(org.eclipse.jst.jsf.common.metadata.internal.IMetaDataObserver)
-	 */
-	public void addObserver(IMetaDataObserver observer) {
-		observers.add(observer);		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataLocator#removeObserver(org.eclipse.jst.jsf.common.metadata.internal.IMetaDataObserver)
-	 */
-	public void removeObserver(IMetaDataObserver observer) {	
-		observers.remove(observer);
-	}
-	
-	/**
-	 * @return the set of {@link IMetaDataObserver}s for this instance
-	 */
-	public Set/*<IMetaDataObserver>*/ getObservers(){
-		return observers;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/AbstractTagLibDomainContentModelMetaDataTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/AbstractTagLibDomainContentModelMetaDataTranslator.java
deleted file mode 100644
index c1f2f9e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/AbstractTagLibDomainContentModelMetaDataTranslator.java
+++ /dev/null
@@ -1,289 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.util.Iterator;
-
-import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.emf.ecore.xml.type.SimpleAnyType;
-import org.eclipse.emf.ecore.xml.type.XMLTypeFactory;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.MetadataFactory;
-import org.eclipse.jst.jsf.common.metadata.MetadataPackage;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-
-/**
- * Abstract class that the taglib domain translators use to 
- * convert the CM model to a standard meta data model
- *
- */
-public abstract class AbstractTagLibDomainContentModelMetaDataTranslator {
-	
-	/**
-	 * {@link IMetaDataModelMergeAssistant} to use
-	 */
-	protected IMetaDataModelMergeAssistant _assistant;
-
-	/**
-	 * Set the assistant to use during the translation.   Must be called prior to doTransalate(doc);
-	 * @param assistant
-	 */
-	protected void setAssistant(IMetaDataModelMergeAssistant assistant){
-		_assistant = assistant;
-	}
-	
-	/**
-	 * Transforms the CMDocument into entities and traits of a standard metadata model 
-	 * using the assistant that must be set before this call.
-	 * @param doc
-	 */
-	protected void doTranslate(CMDocument doc){
-		createTags(doc);
-		createTagfileTraits(doc);		
-	}
-	
-	/**
-	 * @param entity
-	 * @param key
-	 * @param value
-	 */
-	protected void createSimpleStringEntityTraitIfNecessary(final Entity entity, final String key,
-			final String value) {
-		Trait t = findTraitOnEntityById(entity, key);
-		if (t == null){
-			t = internalCreateTrait(entity, key);
-
-			SimpleAnyType val = XMLTypeFactory.eINSTANCE.createSimpleAnyType();
-			val.setInstanceType(EcorePackage.eINSTANCE.getEString());
-			val.setValue(value);
-			
-			t.setValue(val);
-		}
-	}
-
-	/**
-	 * @param entity
-	 * @param key
-	 * @param value
-	 */
-	protected void createSimpleBooleanObjectEntityTraitIfNecessary(final Entity entity,
-			String key, boolean value) {
-		
-		Trait t = findTraitOnEntityById(entity, key);
-		if (t == null){
-			t = internalCreateTrait(entity, key);
-
-			SimpleAnyType val = XMLTypeFactory.eINSTANCE.createSimpleAnyType();
-			val.setInstanceType(EcorePackage.eINSTANCE.getEBoolean());
-			val.setRawValue(value == true ? "true" : "false");
-			
-			t.setValue(val);
-		}
-		
-	}
-	
-	/**
-	 * @param entity
-	 * @param key
-	 * @return Trait
-	 */
-	protected Trait internalCreateTrait(final Entity entity, final String key) {
-		Trait t = MetadataFactory.eINSTANCE.createTrait();
-		t.setId(key);
-		t.setSourceModelProvider(_assistant.getSourceModelProvider());
-		entity.getTraits().add(t);
-		return t;
-	}
-	
-	/**
-	 * @param entity
-	 * @param key
-	 * @return Trait
-	 */
-	protected Trait findTraitOnEntityById(final Entity entity, final String key) {
-		for (Iterator it=entity.getTraits().iterator();it.hasNext();){
-			Trait t = (Trait)it.next();
-			if (key.equals(t.getId()))
-				return t;
-		}
-		return null;
-	}
-
-	/**
-	 * @param nodeName
-	 * @return Entity
-	 */
-	protected Entity findTagEntity(final String nodeName) {
-		for (Iterator it=getMergedModel().getChildEntities().iterator();it.hasNext();){
-			Entity entity = (Entity)it.next();
-			if (nodeName.equals(entity.getId()))
-				return entity;
-		}
-		return null;
-	}
-
-	/**
-	 * Create entities for tags
-	 * @param doc
-	 */
-	protected void createTags(final CMDocument doc) {
-		for (Iterator it=doc.getElements().iterator();it.hasNext();){
-			CMElementDeclaration tag = (CMElementDeclaration)it.next();
-			Entity entity = findTagEntity(tag.getNodeName());
-			if (entity == null){
-				entity = MetadataFactory.eINSTANCE.createEntity();
-				entity.setId(tag.getNodeName());
-				entity.setType("tag");
-				getMergedModel().getChildEntities().add(entity);
-			}
-			setTagEntityTraits(tag, entity);
-		}
-		
-	}
-	
-	/**
-	 * Sets the standard traits for a tag entity from the element declaration
-	 * @param tag
-	 * @param entity
-	 */
-	protected void setTagEntityTraits(CMElementDeclaration tag, Entity entity) {
-		createSimpleStringEntityTraitIfNecessary(entity, "display-label", getTagDisplayName(tag));
-		createSimpleStringEntityTraitIfNecessary(entity, "description", getTagDescription(tag));	
-		createSimpleStringEntityTraitIfNecessary(entity, "small-icon", getTagSmallIcon(tag));
-		createSimpleStringEntityTraitIfNecessary(entity, "large-icon", getTagLargeIcon(tag));
-		createSimpleBooleanObjectEntityTraitIfNecessary(entity, "expert", getTagIsExpert(tag));
-		createSimpleBooleanObjectEntityTraitIfNecessary(entity, "hidden", getTagIsHidden(tag));
-		
-//		createRequiredAttrTraits(entity, tag);
-	}
-	
-	/**
-	 * @param tag
-	 * @return false.   subclass should override if CMElementDeclaration has the metadata.
-	 */
-	protected boolean getTagIsHidden(CMElementDeclaration tag) {return false;}
-
-	/**
-	 * @param tag
-	 * @return false.   subclass should override if CMElementDeclaration has the metadata.
-	 */
-	protected boolean getTagIsExpert(CMElementDeclaration tag) {return false;}
-
-	/**
-	 * @param tag
-	 * @return null.   subclass should override if CMElementDeclaration has the metadata.
-	 */
-	protected String getTagLargeIcon(CMElementDeclaration tag) {return null;}
-
-	/**
-	 * @param tag
-	 * @return null.   subclass should override if CMElementDeclaration has the metadata.
-	 */
-	protected String getTagSmallIcon(CMElementDeclaration tag) {return null;}
-
-	/**
-	 * @param tag
-	 * @return null.   subclass should override if CMElementDeclaration has the metadata.
-	 */
-	protected String getTagDescription(CMElementDeclaration tag) {return null;}
-
-	/**
-	 * @param tag
-	 * @return tag.getElementName()
-	 */
-	protected String getTagDisplayName(CMElementDeclaration tag) {return tag.getElementName();}
-
-	/**
-	 * Creates standard traits for tag file entity from CMDocument metadata
-	 * @param doc
-	 */
-	protected void createTagfileTraits(CMDocument doc) {
-		Model model = getMergedModel();
-
-		createSimpleStringEntityTraitIfNecessary(model, "display-label", getURIDisplayLabel());			
-		createSimpleStringEntityTraitIfNecessary(model, "description", getURIDescription());
-		createSimpleStringEntityTraitIfNecessary(model, "default-prefix", getURIDefaultPrefix());
-		createSimpleBooleanObjectEntityTraitIfNecessary(model, "expert", getURIExpert());
-		createSimpleBooleanObjectEntityTraitIfNecessary(model, "hidden", getURIHidden());
-		
-	}
-	
-	/**
-	 * @return the display label to use for this model.  Subclasses should override if model has the meta data.
-	 */
-	protected String getURIDisplayLabel(){
-		return getMergedModel().getId();
-	}
-	
-	/**
-	 * @return default prefix to use for tags.  Returns null. Subclasses should override if model has the meta data.
-	 */
-	protected String getURIDefaultPrefix(){
-		return null;
-	}
-
-	/**
-	 * @return description to use.  Default is the URI.  Subclasses should override if model has the meta data.
-	 */
-	protected String getURIDescription(){
-		return getMergedModel().getId();
-	}
-
-	/**
-	 * @return false.  Subclasses should override if model has the meta data.
-	 */
-	protected boolean getURIExpert() { return false;}
-
-	/**
-	 * @return false.  Subclasses should override if model has the meta data.
-	 */
-	protected boolean getURIHidden() {return false;	}
-
-	/**
-	 * @return a model of all entities and traits
-	 */
-	protected Model getMergedModel() {
-		Model model = (Model)_assistant.getMergedModel().getRoot();
-		if (model == null){
-			//need to create model key object
-			Model tld = createTLDModel();
-			_assistant.getMergedModel().setRoot(tld);
-			model = (Model)_assistant.getMergedModel().getRoot();
-		}
-		return model;
-	}
-
-	/**
-	 * @return new model 
-	 */
-	protected Model createTLDModel() {
-		Model entity = getFactory().createModel();
-		entity.setId(_assistant.getMergedModel().getModelKey().getUri());
-		return entity;
-	}	
-	
-	/**
-	 * @return MetadataFactory instance
-	 */
-	protected MetadataFactory getFactory(){
-		return (MetadataFactory) MetadataPackage.eINSTANCE.getEFactoryInstance(); 
-	}
-	
-	/**
-	 * @return CMDocument being used for the current translate call
-	 */
-	protected CMDocument getSourceModel() {
-		return (CMDocument)_assistant.getSourceModelProvider().getSourceModel();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategy.java
deleted file mode 100644
index ad81c3d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategy.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Default class used for loading metadata.  
- * Loads the source types from extensions defined against the domain.
- * 
- * see org.eclipse.jst.jsf.common.domainLoadingStrategies ext-pt
- */
-public class DomainLoadingStrategy implements IDomainLoadingStrategy, IMetaDataObserver {
-
-	/**
-	 * Domain id
-	 */
-	protected String domain;
-
-	private MetaDataModel _model;
-	private List /*<IDomainSourceModelType>*/ _sourceTypes;
-	private List /*<IMetaDataSourceModelProvider>*/ _sources;
-	
-	/**
-	 * Constructor
-	 * @param domain
-	 */
-	public DomainLoadingStrategy(String domain){
-		this.domain = domain;
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IDomainLoadingStrategy#load(org.eclipse.jst.jsf.common.metadata.internal.MetaDataModel)
-	 */
-	public void load(MetaDataModel model) {
-		this._model = model;
-		_sourceTypes = loadDomainSourceModelTypes();
-		sortSourceTypes(_sourceTypes);
-		_sources = locateMetaDataSourceInstances(_sourceTypes, model);
-	    mergeModel(model, _sources);		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IDomainLoadingStrategy#reload()
-	 */
-	public void reload() throws ModelNotSetException {
-		System.out.println("reload");//debug
-		if (_model == null)
-			throw new ModelNotSetException();
-		
-		removeOldLocatorObservers();
-		_sources = locateMetaDataSourceInstances(_sourceTypes, _model);
-	    mergeModel(_model, _sources);		
-	}
-	
-	/**
-	 * Responsible for iterating through the sorted list of <code>IMetaDataSourceModelProvider</code>
-	 * and merging the models after first translating the source model as required, into a single mreged model of
-	 * standatd metadata Entities and Traits.
-	 * @param model 
-	 * @param sources
-	 */
-	protected void mergeModel(MetaDataModel model, List/*<IMetaDataSourceModelProvider>*/ sources) {		
-		IMetaDataModelMergeAssistant assistant = createModelMergeAssistant(model);
-		for (Iterator/*<IMetaDataSourceModelProvider>*/ it = sources.iterator();it.hasNext();){
-			IMetaDataSourceModelProvider mds = (IMetaDataSourceModelProvider)it.next();
-//			assistant.setSourceModel(mds.getSourceModel());
-			assistant.setSourceModelProvider(mds);
-			Iterator translators = mds.getLocator().getDomainSourceModelType().getTranslators().iterator();
-			while (translators.hasNext()){
-				IMetaDataTranslator translator = (IMetaDataTranslator)translators.next();
-				translator.translate(assistant);
-			}
-		}
-		assistant.setMergeComplete();
-	}
-	
-	/**
-	 * @param model
-	 * @return an instance of a IMetaDataModelMergeAssistant to be used while merging source models
-	 */
-	protected IMetaDataModelMergeAssistant createModelMergeAssistant(MetaDataModel model){
-		return new MetaDataModelMergeAssistantImpl(model);		
-	}
-
-	/**
-	 * Allows for subclasses to override the default mechanism for sorting the source types.
-	 * @param sourceTypes
-	 */
-	protected void sortSourceTypes(List/*<IDomainSourceModelType>*/ sourceTypes) {
-		//allows override
-	}
-
-	/**
-	 * @return list of <code>IDomainSourceModelType</code>s located in the <code>DomainSourceTypesRegistry</code> 
-	 * for the specified uri
-	 */
-	protected List/*<IDomainSourceModelType>*/ loadDomainSourceModelTypes() {
-		return DomainSourceTypesRegistry.getInstance().getDomainSourceTypes(domain); 
-	}
-
-	/**
-	 * @param sourceTypes
-	 * @param model
-	 * @return list of <code>IMetaDataSourceModelProvider</code> instances from the domain source types applicable for 
-	 * this domain for this particular uri specified in the model
-	 */
-	protected List/*<IMetaDataSourceModelProvider>*/ locateMetaDataSourceInstances(List/*<IDomainSourceModelType>*/ sourceTypes, MetaDataModel model) {
-		List/*<IMetaDataSourceModelProvider>*/ sources = new ArrayList/*<IMetaDataSourceModelProvider>*/();		
-		for (Iterator/*<IDomainSourceModelType>*/ it = sourceTypes.iterator();it.hasNext();){
-			IDomainSourceModelType sourceType = (IDomainSourceModelType)it.next();
-			IMetaDataLocator locator = sourceType.getLocator();
-			//We MUST set the sourceType here to associate the handler with locator to use for the source models
-			locator.setDomainSourceModelType(sourceType);
-			
-			//set project context in locator for those that care
-			if (locator instanceof IPathSensitiveMetaDataLocator)
-				((IPathSensitiveMetaDataLocator)locator).setProjectContext(model.getModelKey().getProject());
-			
-			List/*<IMetaDataSourceModelProvider>*/ providers = sourceType.getLocator().locateMetaDataModelProviders(model.getModelKey().getUri());
-			if (providers != null && !providers.isEmpty()){
-				for (Iterator mdProviders =providers.iterator();mdProviders.hasNext();){
-					IMetaDataSourceModelProvider provider = (IMetaDataSourceModelProvider)mdProviders.next();
-					//We MUST set the sourceType here to associate the translators to use for the source models
-					provider.setLocator(sourceType.getLocator());
-					sources.add(provider);
-				}
-			}
-			//listen for changes
-			sourceType.getLocator().addObserver(this);
-		}
-		return sources;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataObserver#notifyMetadataChanged(org.eclipse.jst.jsf.common.metadata.internal.IMetaDataChangeNotificationEvent)
-	 */
-	public void notifyMetadataChanged(IMetaDataChangeNotificationEvent event) {
-		//for now, if any event occurs, we need to flush the _model so that it will rebuild
-		_model.setNeedsRefresh();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IDomainLoadingStrategy#cleanup()
-	 */
-	public void cleanup(){
-		removeOldLocatorObservers();
-		_sources = null;
-		_sourceTypes = null;
-		_model = null;
-	}
-	
-	private void removeOldLocatorObservers(){
-		if (_sources != null){
-			for (Iterator it= _sources.iterator();it.hasNext();){				
-				IMetaDataSourceModelProvider provider = (IMetaDataSourceModelProvider)it.next();
-				IMetaDataLocator locator = provider.getLocator();
-				locator.removeObserver(this);		
-				locator.setDomainSourceModelType(null);
-				provider.setLocator(null);
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategyRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategyRegistry.java
deleted file mode 100644
index f0acd69..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategyRegistry.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-
-
-/**
- * Registry of strategies used to load domains of metadata.
- * Uses the <code>org.eclipse.jst.jsf.common.domainLoadingStrategies</code> ext-pt to load.  
- * 
- * see <code>org.eclipse.jst.jsf.common.domainLoadingStrategies</code> ext-pt 
- */
-public class DomainLoadingStrategyRegistry{
-	private static DomainLoadingStrategyRegistry INSTANCE;
-	
-	private HashMap/*<String, DomainLoadingStrategyDescriptorImpl>*/ domainLoadingStrategyDescriptors;
-	
-//	public static final String TAGLIB_DOMAIN ="TagLibraryDomain"; //this does *not* belong here.  FIX ME
-//	public static final String TAGLIB_DOMAIN_SOURCE_HANDLER_ID = TAGLIB_DOMAIN + "SourceHandler";
-//	public static final String TAGLIB_DOMAIN_TRANSLATOR = "com.foo.translators."+TAGLIB_DOMAIN + "Translator";
-
-	private static final String EXTENSION_POINT_ID = "domainLoadingStrategies";
-
-	private DomainLoadingStrategyRegistry(){
-		init();
-	}
-	
-	/**
-	 * @return singleton instance of the DomainLoadingStrategyRegistry
-	 */
-	public synchronized static DomainLoadingStrategyRegistry getInstance() {
-		if (INSTANCE == null){
-			INSTANCE = new DomainLoadingStrategyRegistry();
-		}
-		return INSTANCE;
-	}
-	
-	/**
-	 * Loads registry with descriptors from the domainLoadingStrategies ext-pt.    
-	 */
-	synchronized final void  init(){
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint point = extensionRegistry.getExtensionPoint(JSFCommonPlugin.PLUGIN_ID, EXTENSION_POINT_ID );
-		if (point != null) {
-			IConfigurationElement[] elements = point.getConfigurationElements();
-			for (int i = 0; i < elements.length; i++) {
-				IConfigurationElement element = elements[i];
-				DomainLoadingStrategyDescriptorImpl dls = new DomainLoadingStrategyDescriptorImpl(element);
-				addDomainLoadingStrategyDescriptor(dls);
-			}
-		}
-	}
-
-	/**
-	 * Add domain loading strategy descriptor for a domain to the registry domains
-	 * @param strategy
-	 */
-	protected void addDomainLoadingStrategyDescriptor(DomainLoadingStrategyDescriptorImpl strategy){
-		getDescriptors().put(strategy.getDomain(), strategy);
-	}
-	
-	/**
-	 * @param domain
-	 * @return an instance of an <code>IDomainLoadingStrategy</code> for the given domain
-	 */
-	public IDomainLoadingStrategy getLoadingStrategy(String domain){
-		DomainLoadingStrategyDescriptorImpl strategy = (DomainLoadingStrategyDescriptorImpl)getDescriptors().get(domain);
-		if (strategy == null){
-			return createDefaultLoadingStrategy();
-		}
-        return createLoadingStrategy(domain);
-	}
-
-	
-	/**
-	 * @return strategy that will only use standard metadata files
-	 */
-	private IDomainLoadingStrategy createDefaultLoadingStrategy() {
-		return new DomainLoadingStrategy(null);
-	}
-
-	private IDomainLoadingStrategy createLoadingStrategy(String domain){
-		return ((DomainLoadingStrategyDescriptorImpl)getDescriptors().get(domain)).newInstance();			
-	}
-	
-	private Map/*<String, DomainLoadingStrategyDescriptorImpl>*/ getDescriptors(){
-		if (domainLoadingStrategyDescriptors == null){
-			domainLoadingStrategyDescriptors = new HashMap/*<String, DomainLoadingStrategyDescriptorImpl>*/();			
-		}
-		return domainLoadingStrategyDescriptors;
-	}
-
-	/**
-	 * Implementation of a DomainLoadingStrategy descriptor that is responsible for creating instances of the IDomainLoadingStrategy
-	 */
-	private class DomainLoadingStrategyDescriptorImpl {
-		String domain;
-		String loadingStrategyClassName;
-		String bundleId;
-		Class strategy;
-		IConfigurationElement element;
-		
-		DomainLoadingStrategyDescriptorImpl(IConfigurationElement element){
-			this.element = element;
-			this.init();
-		}
-
-		private void init() {
-			domain = element.getAttribute("domainId");
-			bundleId = element.getContributor().getName();
-			loadingStrategyClassName = element.getAttribute("domainLoadingStrategy");			
-		}
-
-		/**
-		 * @return domain id
-		 */
-		public String getDomain() {	
-			return domain;
-		}
-		
-		/**
-		 * @return new instance of IDomainLoadingStrategy
-		 */
-		public IDomainLoadingStrategy newInstance(){
-			try {
-				Class[] parameterTypes = new Class[]{String.class};
-				Object[] initargs = new Object[]{domain};
-				Object loader = this.getLoadingStrategy().getConstructor(parameterTypes).newInstance(initargs);
-				if (loader instanceof IDomainLoadingStrategy)
-					return (IDomainLoadingStrategy)loader;
-			} catch (InstantiationException e) {
-				JSFCommonPlugin.log(IStatus.ERROR, "Unable to instantiate IDomainLoadingStrategy for: "+ domain,e);
-			} catch (IllegalAccessException e) {
-				JSFCommonPlugin.log(IStatus.ERROR, "IllegalAccessException during creation of IDomainLoadingStrategy for: "+ domain,e);
-			} catch (IllegalArgumentException e) {
-				JSFCommonPlugin.log(IStatus.ERROR, "IllegalArgumentException during creation of IDomainLoadingStrategy for: "+ domain,e);
-			} catch (SecurityException e) {
-				JSFCommonPlugin.log(IStatus.ERROR, "SecurityException during creation of IDomainLoadingStrategy for: "+ domain,e);
-			} catch (InvocationTargetException e) {
-				JSFCommonPlugin.log(IStatus.ERROR, "InvocationTargetException during creation of IDomainLoadingStrategy for: "+ domain,e);
-			} catch (NoSuchMethodException e) {
-				JSFCommonPlugin.log(IStatus.ERROR, "NoSuchMethodException during creation of IDomainLoadingStrategy for: "+ domain,e);
-			}
-			return null;
-		}
-		
-		private Class getLoadingStrategy() {		
-			if (strategy == null){
-				strategy = JSFCommonPlugin.loadClass(loadingStrategyClassName, bundleId);
-			}
-			return strategy;
-		}
-		
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceModelTypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceModelTypeDescriptor.java
deleted file mode 100644
index bcd9338..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceModelTypeDescriptor.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-
-/**
- * Implementation of a {@link IDomainSourceModelType} descriptor.   
- * Responsible for producing instances of {@link IDomainSourceModelType}.  
- * Also responsible for creating the {@link IMetaDataTranslator} descriptors from the 
- * <code>com.eclipse.jst.jsf.common.domainSourceModelTypeTranslators</code> ext-pt
- */
-public class DomainSourceModelTypeDescriptor {
-	private static final String TRANSLATORS_EXTENSION_POINT_ID = "domainSourceModelTypeTranslators";
-	private static final String STANDARD_FILE_NULL_TRANSLATOR = "org.eclipse.jst.jsf.common.metadata.internal.StandardMetaDataFilesTranslator";
-	private String domain = "DEFAULT";
-	private String domainSourceModelTypeId;
-	private String locatorClassName = "org.eclipse.jst.jsf.common.metadata.internal.StandardMetaDataLocator";
-	private Set translatorDescriptors;
-	private String bundleId = JSFCommonPlugin.PLUGIN_ID;
-	private int ordinal;
-	private IDomainSourceModelType _instance;
-	
-	/**
-	 * Constructor
-	 * @param domain
-	 * @param domainSourceModelTypeId
-	 * @param locatorClassName
-	 * @param bundleId
-	 * @param ordinal
-	 */
-	public DomainSourceModelTypeDescriptor(String domain, String domainSourceModelTypeId, String locatorClassName, String bundleId, int ordinal){
-		this.domain = domain;
-		this.locatorClassName = locatorClassName;
-		this.domainSourceModelTypeId = domainSourceModelTypeId;
-		this.bundleId = bundleId;
-		this.ordinal = ordinal;
-		init();
-	}
-
-	/**
-	 * Default model type descriptor that will load only standard metadata files
-	 */
-	public DomainSourceModelTypeDescriptor(){
-//		getTranslatorDescriptors();
-		//createTranslatorInstances() will add the standard null translator 
-	}
-	
-	private synchronized void init() {
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint point = extensionRegistry.getExtensionPoint(JSFCommonPlugin.PLUGIN_ID, TRANSLATORS_EXTENSION_POINT_ID );
-		if (point != null) {
-			IConfigurationElement[] elements = point.getConfigurationElements();
-			for (int i = 0; i < elements.length; i++) {
-				IConfigurationElement element = elements[i];
-				String srcHdlrId = element.getAttribute("domainSourceModelTypeId");
-				if (srcHdlrId.equals(domainSourceModelTypeId))
-					addTranslatorDescriptor(element);
-			}
-		}
-	}
-	
-	private void addTranslatorDescriptor(IConfigurationElement element) {
-		String translator = element.getAttribute("translatorClass");
-		DomainSourceModelTranslatorDescriptor d = new DomainSourceModelTranslatorDescriptor(translator, element.getContributor().getName());
-		getTranslatorDescriptors().add(d);
-	}
-
-	private Set getTranslatorDescriptors(){
-		if (translatorDescriptors == null){
-			translatorDescriptors = new HashSet();
-		}
-		return translatorDescriptors;
-	}
-
-	/**
-	 * @return domain
-	 */
-	public String getDomain() { 
-		return domain;
-	}
-	 
-	/**
-	 * @return singleton instance of the {@link IDomainSourceModelType}
-	 */
-	public IDomainSourceModelType getInstance(){
-		if (_instance == null){
-			_instance = newInstance();
-		}
-		return _instance;
-	}
-	/**
-	 * @return new instance of {@link IDomainSourceModelType} 
-	 */
-	private IDomainSourceModelType newInstance(){		
-
-		return new DomainSourceModelTypeImpl();
-	}
-	
-	/**
-	 * Internal class implementing {@link IDomainSourceModelType}
-	 */
-	class DomainSourceModelTypeImpl implements IDomainSourceModelType{
-
-		private Set translators;
-		private IMetaDataLocator locator;
-
-		DomainSourceModelTypeImpl(){
-            // restrict construction to package scope
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.IDomainSourceModelType#getDomain()
-		 */
-		public String getDomain() {
-			return domain;
-		}
-		
-		/**
-		 * @return value of ordinal defined by the ext-pt used for ordering source types for a domain
-		 */
-		public int getOrdinal(){
-			return ordinal;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.IDomainSourceModelType#getLocator()
-		 */
-		public IMetaDataLocator getLocator() {
-			if (locator == null){
-				locator = MetaDataLocatorFactory.getInstance().getLocator(locatorClassName, bundleId);
-			}
-								
-			return locator;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jst.jsf.common.metadata.internal.IDomainSourceModelType#getTranslators()
-		 */
-		public Set getTranslators() {
-			if (translators == null){				
-				translators = createTranslatorInstances();
-			}
-			return translators;
-		}
-		
-		/* (non-Javadoc)
-		 * @see java.lang.Object#toString()
-		 */
-		public String toString(){
-			StringBuffer buf = new StringBuffer("DomainSourceModelTypeImpl");
-			buf.append("(domain = ");
-			buf.append(getDomain());
-			buf.append(", locator = ");
-			buf.append(getLocator());
-			buf.append(")");
-			return buf.toString();
-		}
-		
-		private Set createTranslatorInstances() {
-			translators = new HashSet/*<IMetaDataTranslator>*/();
-			if (getTranslatorDescriptors().size() == 0){// for TagLibDomain, we are adding null translator via extension (as of 7/16/07)
-				//would get here if a domain and source type was defined without a domain translator.  Should not happen, but 
-				//add Null Translator for now....
-				//we could/should raise exception.  
-				//Developers should add a STANDARD_FILE_NULL_TRANSLATOR if using standard metadata format.
-				Class klass = JSFCommonPlugin.loadClass(STANDARD_FILE_NULL_TRANSLATOR, JSFCommonPlugin.PLUGIN_ID);
-				try {
-					translators.add(klass.newInstance());
-					return translators;
-				} catch (InstantiationException e) {
-                    // TODO: other error handling?
-					JSFCommonPlugin.log(e, "Error in createTranslatorInstances(STANDARD_FILE_NULL_TRANSLATOR)");
-				} catch (IllegalAccessException e) {
-                    // TODO: other error handling?
-                    JSFCommonPlugin.log(e, "Error in createTranslatorInstances(STANDARD_FILE_NULL_TRANSLATOR)");
-				}
-
-			}
-			
-			Iterator/*<DomainSourceModelTranslatorDescriptor>*/it = getTranslatorDescriptors().iterator();
-			while (it.hasNext()){
-				DomainSourceModelTranslatorDescriptor d = (DomainSourceModelTranslatorDescriptor)it.next();
-				Class klass = JSFCommonPlugin.loadClass(d.getTranslator(), d.getBundleId());
-				try {
-					translators.add(klass.newInstance());
-				} catch (InstantiationException e) {
-                    // TODO: other error handling?
-                    JSFCommonPlugin.log(e, "Error in createTranslatorInstances");
-				} catch (IllegalAccessException e) {
-                    // TODO: other error handling?
-                    JSFCommonPlugin.log(e, "Error in createTranslatorInstances");
-				}
-			}
-			return translators;
-		}
-
-	}
-	
-	/**
-	 * Internal class implementing a descriptor for DomainSourceModelTranslators
-	 */
-	class DomainSourceModelTranslatorDescriptor {
-
-		private String _translator;
-		private String _bundleId;
-
-		/**
-		 * Constructor
-		 * @param translator
-		 * @param bundleId
-		 */
-		public DomainSourceModelTranslatorDescriptor(String translator, String bundleId) {
-			this._translator = translator;
-			this._bundleId = bundleId;
-		}
-		
-		String getTranslator(){
-			return _translator;
-		}
-		
-		String getBundleId(){
-			return _bundleId;
-		}
-		
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceTypesRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceTypesRegistry.java
deleted file mode 100644
index 9ace164..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceTypesRegistry.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.metadata.internal.DomainSourceModelTypeDescriptor.DomainSourceModelTypeImpl;
-
-/**
- * Registry of Domain Source Types loaded from domainSourceModelTypes ext-pt.
- */
-public class DomainSourceTypesRegistry{
-	private static final String EXTENSION_POINT_ID = "domainSourceModelTypes";
-	private static DomainSourceTypesRegistry INSTANCE;
-	private Map/*<String, List/*<DomainSourceModelTypeDescriptor>>*/ domainSourceTypeDescriptors;
-	private Map/*<String, List/*<IDomainSourceModelType>*/ domainSourceTypes;
-	
-	private DomainSourceTypesRegistry(){
-		init();
-	}
-
-	/**
-	 * @return singleton instance of DomainSourceTypesRegistry
-	 */
-	public synchronized static DomainSourceTypesRegistry getInstance() {
-		if (INSTANCE == null){
-			INSTANCE = new DomainSourceTypesRegistry();
-		}
-		return INSTANCE;
-	}
-
-	/**
-	 * @param domain identifier
-	 * @return list of <code>IDomainSourceModelType</code> sorted in descending order by ordinal
-	 */
-	public List/*<IDomainSourceModelType>*/ getDomainSourceTypes(String domain){
-		if (getDomainSourceTypes().containsKey(domain))
-			return (List)getDomainSourceTypes().get(domain);
-		
-		List/*<DomainSourceModelTypeDescriptor>*/ list = getDomainSourceModelDescriptors(domain);
-		List/*<IDomainSourceModelType>*/ types = new ArrayList/*<IDomainSourceModelType>*/();
-		for(Iterator/*<DomainSourceModelTypeDescriptor>*/ it=list.iterator();it.hasNext();){
-			DomainSourceModelTypeDescriptor d = (DomainSourceModelTypeDescriptor)it.next();
-			types.add(d.getInstance());
-		}
-		//default sort descending by ordinal 
-		Collections.sort(types, new Comparator(){
-			public int compare(Object o1, Object o2) {
-				DomainSourceModelTypeImpl desc1 = (DomainSourceModelTypeImpl)o1;
-				DomainSourceModelTypeImpl desc2 = (DomainSourceModelTypeImpl)o2;
-				if (desc1.getOrdinal() == desc2.getOrdinal())
-						return 0;
-				if (desc1.getOrdinal() > desc2.getOrdinal())
-					return -1;
-				
-				return 1;
-			}
-			
-		});
-		
-		getDomainSourceTypes().put(domain, types);
-		return types;
-	}
-	
-	private List getDomainSourceModelDescriptors(String domain) {
-		List ret = (List)getDescriptors().get(domain);
-		if (ret != null && ret.size()>0)
-			return ret;
-		
-		return getDefaultSourceModelDescriptor();
-	}
-
-	private List getDefaultSourceModelDescriptor() {
-		List ret = new ArrayList();
-		DomainSourceModelTypeDescriptor desc = new DomainSourceModelTypeDescriptor();
-		ret.add(desc);
-		return ret;
-	}
-
-	private synchronized void init() {
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint point = extensionRegistry.getExtensionPoint(JSFCommonPlugin.PLUGIN_ID, EXTENSION_POINT_ID );
-		if (point != null) {
-			IConfigurationElement[] elements = point.getConfigurationElements();
-			for (int i = 0; i < elements.length; i++) {
-				IConfigurationElement element = elements[i];
-				addDomainSourceTypeDescriptor(element);
-			}
-		}
-	}
-
-	private void addDomainSourceTypeDescriptor(IConfigurationElement element) {
-		String domainId = element.getAttribute("domainId");
-		String srcHdlrId = element.getAttribute("domainSourceModelTypeId");
-		String locator = element.getAttribute("locator");
-		String ordinalStr = element.getAttribute("ordinal");
-		int ordinal = 1;
-		if (ordinalStr!=null && !ordinalStr.equals("")){
-			ordinal = Integer.parseInt(ordinalStr);
-		}
-		DomainSourceModelTypeDescriptor d = new DomainSourceModelTypeDescriptor(domainId, srcHdlrId, locator, element.getContributor().getName(), ordinal);
-		List/*<DomainSourceTypeDescriptor>*/ descs = (List)getDescriptors().get(domainId);
-		if (descs == null){
-			descs = new ArrayList/*<DomainSourceTypeDescriptor>*/();
-			getDescriptors().put(domainId, descs);
-		}
-		descs.add(d);
-	}
-
-	private Map/*<String, List/*<DomainSourceTypeDescriptor>>*/ getDescriptors() {
-		if (domainSourceTypeDescriptors == null){
-			domainSourceTypeDescriptors = new HashMap/*<String, List/*<DomainSourceTypeDescriptor>>*/();
-		}
-		return domainSourceTypeDescriptors;
-	}
-	
-	private Map/*<String, List/*<IDomainSourceModelType>>*/ getDomainSourceTypes() {
-		if (domainSourceTypes == null){
-			domainSourceTypes = new HashMap/*<String, List/*<IDomainSourceModelType>>*/();
-		}
-		return domainSourceTypes;
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IClassLoaderProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IClassLoaderProvider.java
deleted file mode 100644
index 6c81696..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IClassLoaderProvider.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-/**
- * Provides class loading by using the plugin's classloader that defined an item of metadata
- */
-public interface IClassLoaderProvider {
-	/**
-	 * @param className
-	 * @return Class - implementers should eat exceptions and return null whenever class cannot be returned
-	 */
-	public Class loadClass(String className);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IDomainLoadingStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IDomainLoadingStrategy.java
deleted file mode 100644
index ee21e62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IDomainLoadingStrategy.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-
-/**
- * Defines a strategy to use for loading a standard metadata model for a certain domain.
- * see <code>org.eclipse.jst.jsf.common.domainLoadingStrategies</code> ext-pt 
- */
-public interface IDomainLoadingStrategy {
-	
-	/**
-	 * Create a merged "standard" metadata model.  
-	 * @param model to load
-	 * 
-	 */
-	public void load(MetaDataModel model);
-	
-	/**
-	 * Reload a merged "standard" metadata model.  
-	 * Allows for some optimization for reload.
-	 * @throws ModelNotSetException 
-	 * 
-	 */
-	public void reload() throws ModelNotSetException;
-	
-	
-	/**
-	 * Opportunity to cleanup and should be called when strategy is being destroyed
-	 */
-	public void cleanup();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IDomainSourceModelType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IDomainSourceModelType.java
deleted file mode 100644
index 296c4a7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IDomainSourceModelType.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.util.Set;
-
-/**
- * Binds a domain of metadata to a source model type which is defined by a {@link IMetaDataLocator} 
- * and set of {@link IMetaDataTranslator}s
- * Not intended to be implemented by clients.  Created from ext-pts.
- */
-public interface IDomainSourceModelType {
-	/**
-	 * @return domain id
-	 */
-	public String getDomain();
-	/**
-	 * @return IMetaDataLocator
-	 */
-	public IMetaDataLocator getLocator();
-//	public int getOrdinal();
-	/**
-	 * @return set of {@link IMetaDataTranslator}s for the domain source model type
-	 */
-	public Set/*<IMetaDataTranslator>*/ getTranslators();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IImageDescriptorProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IImageDescriptorProvider.java
deleted file mode 100644
index 9405a6a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IImageDescriptorProvider.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * Provides image descriptors relative to the plugin that provided the image metadata
- *
- */
-public interface IImageDescriptorProvider {
-	/**
-	 * @param imagePath
-	 * @return ImageDescriptor - implementers should eat exceptions and return null whenever imageDescriptor cannot be returned
-	 */
-	public ImageDescriptor getImageDescriptor(String imagePath);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataChangeNotificationEvent.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataChangeNotificationEvent.java
deleted file mode 100644
index d14e19c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataChangeNotificationEvent.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-/**
- * Experimental and not used at the moment.
- *
- */
-public interface IMetaDataChangeNotificationEvent {
-	//change to enums if we do Java5
-	public static final int ADDED = 1;
-	public static final int REMOVED = 2;
-	public static final int CHANGED = 3;
-	
-	public String getURI();
-	public int getEventType();
-	public IMetaDataLocator getLocator();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataLocator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataLocator.java
deleted file mode 100644
index 4bb67fe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataLocator.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.util.List;
-
-/**
- * Locates instances of metadata of a specific source model type
- */
-public interface IMetaDataLocator {
-	/**
-	 * @param uri
-	 * @return a list of <code>IMetaDataModelProvider</code>s for the uri located by this instance 
-	 */
-	public List/*<IMetaDataModelProvider>*/ locateMetaDataModelProviders(String uri);
-	
-	/**
-	 * Opportunity for service to start (add listeners, etc.). 
-	 * Framework calls this immediately after construction and all setup should occur at this time.
-	 */
-	public void startLocating();
-	/**
-	 * Stop looking for instances of metadata model sources.  An opporttunity to cleanup. 
-	 */
-	public void stopLocating();
-
-	/**
-	 * @param observer add a {@link IMetaDataObserver} of this locator 
-	 */
-	public void addObserver(IMetaDataObserver observer);
-	/**
-	 * @param observer remove a {@link IMetaDataObserver} of this locator 
-	 */
-	public void removeObserver(IMetaDataObserver observer);
-	
-	/**
-	 * @return IDomainSourceModelType instance that created this locator
-	 */
-	public IDomainSourceModelType getDomainSourceModelType();
-	/**
-	 * @param domainSourceModelType set the domainSourceModelType instance that created this locator
-	 */
-	public void setDomainSourceModelType(IDomainSourceModelType domainSourceModelType);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataModelMergeAssistant.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataModelMergeAssistant.java
deleted file mode 100644
index d5744f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataModelMergeAssistant.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.EntityGroup;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-
-
-/**
- * Helper class interface to merge source models into a single merged model.
- * Not intended to be implemented by clients
- *
- */
-public interface IMetaDataModelMergeAssistant {
-	/**
-	 * @return merged model
-	 */
-	public MetaDataModel getMergedModel();
-	/**
-	 * Method that will first check to see if an entity with the same id exists in the merged model. 
-	 * If not, it will add it.   The entities includeGroups are then also merged.
-	 * @param entity
-	 * @return flag indicating whether or not the entity was new and therefore added to the merged model
-	 *  
-	 */
-	public boolean addEntity(Entity entity);
-	/**
-	 * Method will add an entity if not already existing in the merged model, and then check for an existing trait by id on the merged model's entity.
-	 * @param entity
-	 * @param trait
-	 * @return flag indicating whether or not the traits was new and therefore added to the merged model's entity
-	 */
-	public boolean addTrait(Entity entity, Trait trait);
-	
-	/**
-	 * Method will add an entityGroup to the model if not already exiting in the merged model (by id).
-	 * @param entityGroup
-	 */
-	public void addEntityGroup(EntityGroup entityGroup);
-	/**
-	 * Signal that the merge is complete so that any post-processing may occur.  
-	 * This should be the last call made on the merge assistant and should be done before client calls for the merged model result.
-	 * This should signal that entityGroups processing should begin.
-	 */
-	public void setMergeComplete();
-
-	/**
-	 * @param mds - {@link IMetaDataSourceModelProvider}
-	 */
-	public void setSourceModelProvider(IMetaDataSourceModelProvider mds);
-	/**
-	 * @return {@link IMetaDataSourceModelProvider} for current operation
-	 */
-	public IMetaDataSourceModelProvider getSourceModelProvider();
-	
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataObservable.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataObservable.java
deleted file mode 100644
index 89c0624..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataObservable.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-/**
- * Allows {@link IMetaDataObserver}s to observe changes.
- * Experimental.
- *
- */
-public interface IMetaDataObservable {
-	public void addObserver(IMetaDataObserver observer);
-	public void removeObserver(IMetaDataObserver observer);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataObserver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataObserver.java
deleted file mode 100644
index 5a138a3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataObserver.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-/**
- * Interface for notification when an {@link IMetaDataObservable} changes
- *
- */
-public interface IMetaDataObserver {
-	/**
-	 * Callback to observer when an {@link IMetaDataObservable} throws an event
-	 * @param event
-	 */
-	public void notifyMetadataChanged(IMetaDataChangeNotificationEvent event);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataSourceModelProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataSourceModelProvider.java
deleted file mode 100644
index 6a19c3b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataSourceModelProvider.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-
-/**
- * Provides a source of metadata that can be transformed into a merged standard model
- * LIKELY TO CHANGE
- */
-public interface IMetaDataSourceModelProvider extends IAdaptable{
-	/**
-	 * @return the source model
-	 */
-	public Object getSourceModel();
-	/**
-	 * @return the IMetaDataLocator instance that located this model provider instance
-	 */
-	public IMetaDataLocator getLocator();
-	/**
-	 * @param locator instance that located this model provider instance
-	 */
-	public void setLocator(IMetaDataLocator locator);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataTranslator.java
deleted file mode 100644
index eaa159b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IMetaDataTranslator.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-/**
- * Translate from the source model metadata structure into a standard metadata domain of metadata.
- *
- */
-public interface IMetaDataTranslator {
-	/**
-	 * @param assistant perform translation using the IMetaDataModelMergeAssistant
-	 */
-	public void translate(IMetaDataModelMergeAssistant assistant);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IPathSensitiveMetaDataLocator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IPathSensitiveMetaDataLocator.java
deleted file mode 100644
index 0f0ed71..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IPathSensitiveMetaDataLocator.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import org.eclipse.core.resources.IProject;
-
-/**
- * A <code>IMetaDataLocator</code> that is sensitive to the project context 
- */
-public interface IPathSensitiveMetaDataLocator extends IMetaDataLocator {
-	/**
-	 * @param project
-	 */
-	public void setProjectContext(IProject project);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IResourceBundleProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IResourceBundleProvider.java
deleted file mode 100644
index 640da35..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IResourceBundleProvider.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.util.ResourceBundle;
-
-/**
- * Provides the resource bundle from the plugin that defined an item of metadata.
- */
-public interface IResourceBundleProvider {
-	/**
-	 * @return ResourceBundle - implementers should eat exceptions and return null whenever resourceBundle cannot be returned
-	 */
-	public ResourceBundle getResourceBundle();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IStandardMetaDataSourceInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IStandardMetaDataSourceInfo.java
deleted file mode 100644
index 02270a3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IStandardMetaDataSourceInfo.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-
-/**
- * Represents the metadata file defined by the StandardMetaDataFile extension-point
- * Not intended to be implemented by clients
- */
-public interface IStandardMetaDataSourceInfo {
-	/**
-	 * @return location of metadata file that the locator class will use 
-	 */
-	public String getLocation();
-	/**
-	 * @return bundle id of plugin defining the metadata file
-	 */
-	public String getBundleId();
-	/**
-	 * @return class name of the locator that will find the the standard metadata file
-	 */
-	public String getLocatorClassname();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/JSPTagLibDomainLoadingStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/JSPTagLibDomainLoadingStrategy.java
deleted file mode 100644
index 9aeb8b4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/JSPTagLibDomainLoadingStrategy.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.util.List;
-
-
-/**
- * Strategy for loading tag metadata.   Extends and uses the default {@link DomainLoadingStrategy}.  
- * Mainly exists for illustrative purposes.  Could be removed..
- */
-public class JSPTagLibDomainLoadingStrategy extends DomainLoadingStrategy {
-
-	/**
-	 * Constructor
-	 * @param domain
-	 */
-	public JSPTagLibDomainLoadingStrategy(String domain) {
-		super(domain);
-	}
-
-	/*@Override*/
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.DomainLoadingStrategy#sortSourceTypes(java.util.List)
-	 */
-	protected void sortSourceTypes(List/*<IDomainSourceType>*/ sourceTypes) {
-		//an opportunity to override the priority of the source types...
-	}
-
-	
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/Messages.java
deleted file mode 100644
index 74fd0a7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/Messages.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Externalized strings for Metadata
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.common.metadata.internal.messages"; //$NON-NLS-1$
-
-	/**
-	 * Property key not found in bundle
-	 */
-	public static String Key_not_found;
-
-	/**
-	 * Missing resource
-	 */
-	public static String MissingResource_exception;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-        // no external instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataChangeNotificationEvent.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataChangeNotificationEvent.java
deleted file mode 100644
index 8ecc17d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataChangeNotificationEvent.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-/**
- * Experimental.  Subject to change.
- *
- */
-public class MetaDataChangeNotificationEvent implements
-		IMetaDataChangeNotificationEvent {
-
-	private String _uri;
-	private IMetaDataLocator _locator;
-	private int _type;
-
-	/**
-	 * Constructor
-	 * @param locator
-	 * @param uri
-	 * @param type
-	 */
-	public MetaDataChangeNotificationEvent(IMetaDataLocator locator, String uri, int type){
-		this._locator = locator;
-		this._uri = uri;
-		this._type = type;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataChangeNotificationEvent#getEventType()
-	 */
-	public int getEventType() {
-		return _type;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataChangeNotificationEvent#getLocator()
-	 */
-	public IMetaDataLocator getLocator() {
-		return _locator;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataChangeNotificationEvent#getURI()
-	 */
-	public String getURI() {
-		return _uri;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataLocatorFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataLocatorFactory.java
deleted file mode 100644
index ed92cf1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataLocatorFactory.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-
-/**
- * Creates instances of IMetaDataLocators and caches them so that there is only one instance of a particular locator
- * when client requests one. 
- */
-public class MetaDataLocatorFactory {
-	private static MetaDataLocatorFactory INSTANCE = null;
-	
-	/**
-	 * @return singleton instance of the MetaDataLocatorFactory
-	 */
-	public synchronized static MetaDataLocatorFactory getInstance(){
-		if (INSTANCE == null){
-			INSTANCE = new MetaDataLocatorFactory();
-		}
-		return INSTANCE;
-	}
-
-	private HashMap _locators;
-
-	private Map getLocators() {
-		if (_locators == null){
-			_locators = new HashMap();
-		}
-		return _locators;
-	}
-	
-	/**
-	 * @param locatorClassName
-	 * @param bundleId
-	 * @return IMetaDataLocator
-	 */
-	public IMetaDataLocator getLocator(String locatorClassName, String bundleId){
-		String key = getKey(locatorClassName, bundleId);
-		IMetaDataLocator locator = (IMetaDataLocator)getLocators().get(key);
-		if (locator == null){
-			Class klass = JSFCommonPlugin.loadClass(locatorClassName, bundleId);
-			try {
-				locator = (IMetaDataLocator)klass.newInstance();
-				if (locator != null) {
-					getLocators().put(key, locator);
-					locator.startLocating();
-				}
-			} catch (InstantiationException e) {
-				JSFCommonPlugin.log(IStatus.ERROR, "Could not instantiate IMetaDataLocator: "+key, e);
-			} catch (IllegalAccessException e) {
-				JSFCommonPlugin.log(IStatus.ERROR, "IllegalAccessException while creating IMetaDataLocator: "+key, e);
-			}
-		}
-		return locator;
-	}
-
-	private String getKey(String locatorClassName, String bundleId) {
-		StringBuffer buf = new StringBuffer(bundleId);
-		buf.append(":");
-		buf.append(locatorClassName);
-		return buf.toString();
-	}
-	
-	/**
-	 * Stops and disposes all locators
-	 */
-	public void dispose(){
-		for (Iterator it=getLocators().values().iterator();it.hasNext();){
-			IMetaDataLocator locator = (IMetaDataLocator)it.next();
-			locator.stopLocating();			
-		}
-		getLocators().clear();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModel.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModel.java
deleted file mode 100644
index 5554ab7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModel.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import org.eclipse.jst.jsf.common.metadata.Model;
-
-/**
- * Responsible for loading and holding onto the standard metadata model using the IDomainLoadingStrategy.
- * Wraps the model (root) with the strategy used for loading it, along with the identifying key (modelKeyDescriptor)
- */
-public class MetaDataModel {
-
-	private Object root;
-	private ModelKeyDescriptor modelKeyDescriptor;
-	private IDomainLoadingStrategy strategy;
-	private boolean refresh;
-	
-	/**
-	 * Constructor
-	 * @param key
-	 * @param strategy
-	 */
-	public MetaDataModel(ModelKeyDescriptor key, IDomainLoadingStrategy strategy){
-		this.modelKeyDescriptor = key;
-		this.strategy = strategy;
-	}
-
-	/**
-	 * @return the root of the model.  
-	 */
-	public Object getRoot(){
-		return root;
-	}
-	
-	/**
-	 * @param root 
-	 */
-	public void setRoot(Object root){
-		this.root = root;
-		if (root != null)
-			((Model)root).setCurrentModelContext(modelKeyDescriptor);
-	}
-	
-	/**
-	 * @return ModelKeyDescriptor for this model
-	 */
-	public ModelKeyDescriptor getModelKey(){
-		return modelKeyDescriptor;
-	}
-
-//	public void accept(IEntityVisitor visitor){
-//		if (getRoot() instanceof Model)
-//			visitor.visit((Model)getRoot());
-//	}
-
-	/**
-	 * @return true if the model is null or is not, in fact, a {@link Model}
-	 */
-	public boolean isEmpty() {
-		if (root == null || !(root instanceof Model))
-			return true;
-				
-		return false;
-	}
-	
-	/**
-	 * Load the model.  Delegates to the strategy.
-	 */
-	public void load(){
-		strategy.load(this);
-	}
-	
-	/**
-	 * Reloads the model delegating to strategy reload
-	 * @throws ModelNotSetException
-	 */
-	public void reload()throws ModelNotSetException{
-		setRoot(null);
-		refresh = false;
-		strategy.reload();
-	}
-
-	/**
-	 * @return flag indicating that the model is stale
-	 */
-	public boolean needsRefresh() {		
-		return refresh;
-	}
-	
-	/**
-	 * Flag that model is stale
-	 */
-	public void setNeedsRefresh() {		
-		refresh = true;
-	}
-	
-	/**
-	 * Cleans up the model releasing references.
-	 */
-	public void cleanup(){
-		if (strategy != null)
-			strategy.cleanup();
-		strategy = null;
-		root = null;
-		modelKeyDescriptor = null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelContextImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelContextImpl.java
deleted file mode 100644
index 37b9e16..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelContextImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import org.eclipse.jst.jsf.common.metadata.query.IMetaDataModelContext;
-
-/**
- * Simple implementation of {@link IMetaDataModelContext}
- *
- */
-public class MetaDataModelContextImpl implements IMetaDataModelContext {
-	private String _domain;
-	
-	/**
-	 * Constructor
-	 * @param domain id
-	 */
-	public MetaDataModelContextImpl(String domain){
-		_domain = domain;
-	}
-	
-	public String getDomainID() {
-		return _domain;
-	}
-
-	public Object getAdapter(Class adapter) {
-		if (adapter.equals(IMetaDataModelContext.class))
-			return this;
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelManager.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelManager.java
deleted file mode 100644
index 1568552..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelManager.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-
-/**
- * Singleton instance for each IProject used to manage all standard metdata models for that project.
- *
- * Manager is responsible for loading and caching MetaDataModels.  Models are keyed by URI.
- * 
- * The manager listens for project closing resource events so that the resources can be freed up.
- */
-public class MetaDataModelManager implements IResourceChangeListener{
-	/**
-	 * Key that is used for the IProject instance's session property that
-	 * holds a MetaDataModelManager instance.  Each project will have it's own instance of a model manager.
-	 */
-	public static final QualifiedName KEY_SESSIONPROPERTY =
-		new QualifiedName(null, "MetaDataModelManager"); //$NON-NLS-1$ FIX ME	
-
-	private static MetaDataModelManager SHARED_INSTANCE;
-	private ModelMap models; 
-	private IProject project;
-	
-	/**
-	 * @return instance that is project agnostic.   * may get removed * 
-	 */
-	public synchronized static MetaDataModelManager getSharedInstance(){
-		if (SHARED_INSTANCE == null) {
-			SHARED_INSTANCE = new MetaDataModelManager(null);
-		}
-		return SHARED_INSTANCE;
-	}
-	
-	/**
-	 * @param project
-	 * @return instance of the model manager for this project.  Shouldn't, but may, return null.
-	 */
-	public synchronized static MetaDataModelManager getInstance(IProject project){
-		MetaDataModelManager repo = null;
-		repo = getFromSessionProperty(project);
-		if (repo == null) {
-			repo = new MetaDataModelManager(project);		
-			ResourcesPlugin.getWorkspace().addResourceChangeListener(repo, IResourceChangeEvent.PRE_CLOSE);
-		}
-		return repo;
-	}
-	private MetaDataModelManager(IProject project) {
-		this.project = project;
-		init();
-	}
-	
-	/**
-	 * @param project
-	 * @return MetaDataModelManager instance for the project
-	 */
-	protected static MetaDataModelManager getFromSessionProperty(IProject project) {
-		MetaDataModelManager repo = null;
-		try {
-			Object obj = project.getSessionProperty(KEY_SESSIONPROPERTY);
-			if (obj != null && obj instanceof MetaDataModelManager) {
-				repo = (MetaDataModelManager)obj;
-			}
-		} catch(CoreException ce) {
-			JSFCommonPlugin.log(IStatus.ERROR, "Internal Error: Unable to recover MetaDataModelManager for: "+project.getName(), ce); //$NON-NLS-1$
-		}
-		return repo;
-	}
-
-	/**
-	 * Sets this MetaDataModelManager instance as a session property of its
-	 * IProject instance.
-	 */
-	protected void setAsSessionProperty() {
-		if (project != null) {//&& project.isAccessible()) {
-			try {
-				project.setSessionProperty(KEY_SESSIONPROPERTY, this);
-			} catch(CoreException ce) {
-				JSFCommonPlugin.log(IStatus.ERROR, "Internal Error: Unable to store MetaDataModelManager for: "+project.getName(), ce); //$NON-NLS-1$		}
-			}
-		}
-	}
-	
-	/**
-	 * Releases a project's MetaDataModelManager instance by removing from project session property
-	 * @param aProject
-	 */
-	protected void removeAsSessionProperty(IProject aProject){
-		try {
-			aProject.setSessionProperty(KEY_SESSIONPROPERTY, null);
-		} catch (CoreException e) {
-            JSFCommonPlugin.log(e, "Error removing session property"); //$NON-NLS-1$
-		}
-	}
-	
-	private synchronized void init() {
-		models = new ModelMap();	
-		setAsSessionProperty();
-	}
-	
-	
-	/**
-	 * Will locate the cached MetaDataModel.   Sets the model context in the model.
-	 * @param modelContext
-	 * @return the MetaDataModel for the given ITaglibDomainMetaDataModelContext
-	 */
-	public synchronized MetaDataModel getModel(final ITaglibDomainMetaDataModelContext modelContext){
-		ModelKeyDescriptor modelKeyDescriptor = StandardModelFactory.getInstance().createModelKeyDescriptor(modelContext);
-		MetaDataModel model = models.get(modelKeyDescriptor);
-		if (model == null || project == null){
-//			long in = System.currentTimeMillis();					
-			model = loadMetadata(modelKeyDescriptor);			
-//			System.out.println("Time to load "+modelContext.getURI()+": "+String.valueOf(System.currentTimeMillis() - in));
-		}
-		else if (model.needsRefresh()){
-			try {
-				model.reload();
-			} catch (ModelNotSetException e) {
-				//simply load it - should not get here
-				model = loadMetadata(modelKeyDescriptor);
-			}
-		}
-		if (model != null && model.getRoot() != null)
-			((Model)model.getRoot()).setCurrentModelContext(modelKeyDescriptor);
-		
-		return model;
-	}
-	
-	private void addModel(MetaDataModel model) {
-		
-		if (model != null)
-			models.put(model.getModelKey(), model);		
-	}
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
-	 */
-	public void resourceChanged(IResourceChangeEvent event) {
-		if (event.getType() == IResourceChangeEvent.PRE_CLOSE){
-			//a project is closing - release and cleanup
-			final IProject aProject = (IProject)event.getResource();
-			if (aProject == this.project){
-				SafeRunnable.run(new ISafeRunnable(){
-
-					public void handleException(Throwable exception) {
-						// FIXME: what to do here?
-						
-					}
-
-					public void run() throws Exception {
-						for (Iterator it=models.getModels().iterator();it.hasNext();){
-							MetaDataModel model = (MetaDataModel)it.next();
-							models.remove(model);
-							model.cleanup();					
-						}
-						removeAsSessionProperty(project);
-					}					
-				});			
-			}
-		}
-		
-	}
-	
-	private synchronized MetaDataModel loadMetadata(ModelKeyDescriptor modelKeyDescriptor){
-		IDomainLoadingStrategy strategy = DomainLoadingStrategyRegistry.getInstance().getLoadingStrategy(modelKeyDescriptor.getDomain());;
-		if (strategy == null){
-			JSFCommonPlugin.log(IStatus.ERROR, "Internal Error: Unable to locate metadata loading strategy for: "+modelKeyDescriptor.toString()); //$NON-NLS-1$
-			return null;
-		}
-		MetaDataModel model = StandardModelFactory.getInstance().createModel(modelKeyDescriptor, strategy);//new MetaDataModel(modelKey, strategy);
-		model.load();
-		addModel(model);
-
-		return model;
-	}
-
-	/**
-	 * Map of models keyed by ModelKeyDescriptor (.toString())
-	 *
-	 */
-	private class ModelMap{
-		private HashMap /*<String, MetaDataModel>*/ map;
-		
-		ModelMap(){
-			map = new HashMap/*<String, MetaDataModel>*/();
-		}
-		
-		/**
-		 * @param modelKeyDescriptor
-		 * @param model adds model to the map using the given key descriptor
-		 */
-		public void put(ModelKeyDescriptor modelKeyDescriptor, MetaDataModel model){
-			String key = modelKeyDescriptor.toString();
-			map.put(key, model);
-		}
-		
-		/**
-		 * @param modelKeyDescriptor
-		 * @return MetaDataModel for this ModelKeyDescriptor.  May return null.
-		 */
-		public synchronized MetaDataModel get(ModelKeyDescriptor modelKeyDescriptor){
-			String key = modelKeyDescriptor.toString();
-			return (MetaDataModel)map.get(key);
-		}
-		
-		/**
-		 * @param model from the map
-		 */
-		public void remove(MetaDataModel model){
-			map.remove(model.getModelKey().toString());
-		}
-		/**
-		 * @return models in this map as a Set
-		 */
-		public Set getModels(){
-			Set ret = new HashSet();
-			for (Iterator it=map.entrySet().iterator();it.hasNext();){
-				Map.Entry entry = (Map.Entry)it.next();
-				ret.add(entry.getValue());
-			}
-			return ret;
-		}
-	}
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelMergeAssistantImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelMergeAssistantImpl.java
deleted file mode 100644
index df3c715..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelMergeAssistantImpl.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.ecore.util.EcoreUtil.Copier;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.EntityGroup;
-import org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.MetaDataException;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.metadata.query.internal.SearchControl;
-import org.eclipse.jst.jsf.common.metadata.query.internal.SimpleEntityQueryVisitorImpl;
-import org.eclipse.jst.jsf.common.metadata.query.internal.SimpleResultSet;
-import org.eclipse.jst.jsf.common.metadata.query.internal.SimpleTraitQueryVisitorImpl;
-import org.eclipse.jst.jsf.common.metadata.query.internal.HierarchicalSearchControl;
-/**
- * Implements {@link IMetaDataModelMergeAssistant}
- * 
- * Responsible for merging source models into one.  The first model in has subsequent 
- * entities and traits added to it.   
- * 
- * TODO - make locating of existing entities and traits in the merged model more efficient
- * TODO - refactor out Taglibdomain-only aspects of include-group processing 
- *
- */
-public class MetaDataModelMergeAssistantImpl implements
-		IMetaDataModelMergeAssistant {
-	
-	private MetaDataModel mergedModel;
-	private Copier copier;
-	private SimpleEntityQueryVisitorImpl entityVisitor;
-	private SimpleTraitQueryVisitorImpl traitVisitor;
-	private IMetaDataSourceModelProvider provider;
-	
-	/**
-	 * Constructor.   Queries with search control limited to first found.
-	 * @param model
-	 */
-	public MetaDataModelMergeAssistantImpl(MetaDataModel model) {
-		this.mergedModel = model;
-		copier = new Copier();
-		entityVisitor = new SimpleEntityQueryVisitorImpl(new HierarchicalSearchControl(1, 
-			HierarchicalSearchControl.SCOPE_ALL_LEVELS));
-		traitVisitor = new SimpleTraitQueryVisitorImpl(new SearchControl(1));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant#getMergedModel()
-	 */
-	public MetaDataModel getMergedModel() {
-		return mergedModel;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant#getSourceModel()
-	 */
-	public IMetaDataSourceModelProvider getSourceModelProvider() {
-		return provider;
-	}
-
-	public void setSourceModelProvider(IMetaDataSourceModelProvider provider) {
-		this.provider = provider;
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant#addEntityGroup(org.eclipse.jst.jsf.common.metadata.EntityGroup)
-	 */
-	public void addEntityGroup(EntityGroup entityGroup) {
-		Model model = (Model)getMergedModel().getRoot();
-		if (!isExistingEntityGroup(model, entityGroup)){
-			model.getEntityGroups().add(entityGroup);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant#addEntity(org.eclipse.jst.jsf.common.metadata.Entity)
-	 */
-	public boolean addEntity(final Entity entity) {
-		Entity mmEntity = getMergedEntity(entity);
-		if (mmEntity == null){
-			addEntityAsNecessary((Entity)entity.eContainer(), entity);
-			return true;
-		}
-		addIncludeGroupsAsNecessary(mmEntity, entity);
-		return false;
-	}
-
-	private void addIncludeGroupsAsNecessary(final Entity mmEntity, final Entity entity) {
-		for (Iterator it=entity.getIncludeGroups().iterator();it.hasNext();){
-			IncludeEntityGroup grp = (IncludeEntityGroup)it.next();
-			boolean found = false;
-			for (Iterator it2=mmEntity.getIncludeGroups().iterator();it2.hasNext();){
-				IncludeEntityGroup grp2 = (IncludeEntityGroup)it2.next();
-				if (grp2.equals(grp)){
-					found = true;
-					break;
-				}
-			}
-			if (!found){//maybe we should clone and add
-				mmEntity.getIncludeGroups().add(grp);
-			}
-		}
-	}
-
-	/**
-	 * Checks to see if the entity (by id) is present in the mergedModel or not.
-	 * If not, it will perform a copy of the entity and it's attributes using
-	 * EcoreUtil.Copier.  
-	 * 
-	 * @param parent
-	 * @param entity
-	 * @return
-	 */
-	private Entity addEntityAsNecessary(final Entity parent, final Entity entity) {		
-		Entity mmParent = null;
-		Entity mmEntity = null;
-		if (parent != null){
-			mmParent = getMergedEntity(parent);
-			if (mmParent == null){
-				mmParent = addEntityAsNecessary((Entity)entity.eContainer(), entity);
-			}
-		}
-		if (mmParent != null){
-			mmEntity = addEntityInternal(mmParent, entity);
-			return mmEntity;
-		}
-		return mmEntity;
-	}
-	
-	private boolean isExistingEntityGroup(Model model, EntityGroup entityGroup) {
-		boolean found = false;
-		for(Iterator it=model.getEntityGroups().iterator();it.hasNext();){
-			if (entityGroup.getId().equals(((EntityGroup)it.next()).getId()))
-				return true;			
-		}
-		return found;
-	}
-
-	private Entity getExistingChildEntity(final Entity parent, final Entity entity) {
-		for(Iterator it=parent.getChildEntities().iterator();it.hasNext();){
-			Entity foundEntity = (Entity)it.next();
-			if (entity.getId().equals(foundEntity.getId()))
-				return foundEntity;			
-		}
-		return null;
-	}
-
-	private /*synchronized*/ Entity addEntityInternal(final Entity parent, final Entity entity) {
-		Entity mmEntity =(Entity)copier.copy(entity);
-		copier.copyReferences();
-		parent.getChildEntities().add(mmEntity);
-		return mmEntity;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant#addTrait(org.eclipse.jst.jsf.common.metadata.Entity, org.eclipse.jst.jsf.common.metadata.Trait)
-	 */
-	public boolean addTrait(Entity entity, Trait trait) {
-		Entity returnedEntity = getMergedEntity(entity);
-		if (returnedEntity != null){
-			return addTraitAsNecessary(returnedEntity, trait);
-		}
-		return false;
-	}
-	
-
-	private boolean addTraitAsNecessary(Entity mergedEntity, Trait trait) {
-		Trait mmTrait = getMergedTrait(mergedEntity, trait);
-		if (mmTrait == null){			
-			mmTrait = addTraitInternal(mergedEntity, trait);
-			return true;
-
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant#setMergeComplete()
-	 */
-	public void setMergeComplete() {
-		Model model = (Model)getMergedModel().getRoot();
-		if (model != null)
-			processIncludeGroups(model);		
-	}
-	
-	/**
-	 * Copies the passed trait and adds it to the merged entity.
-	 * The source model provider of the trait is then set on the trait so that 
-	 * the trait can know where it came from.
-	 * 
-	 * @param parent
-	 * @param trait
-	 * @return merged Trait
-	 */
-	private Trait addTraitInternal(final Entity parent, final Trait trait) {		
-		Trait mmTrait =(Trait)copier.copy(trait);
-		copier.copyReferences();
-		parent.getTraits().add(mmTrait);
-		//set the model key to know from where the trait came
-		mmTrait.setSourceModelProvider(trait.getSourceModelProvider());
-		return mmTrait;
-	}
-
-	/**
-	 * Locates the entity in the merged model matching by id only. 
-	 * If not located, this method returns null;
-	 * 
-	 * @param entity
-	 * @return merged entity
-	 */
-	private Entity getMergedEntity(Entity entity){
-		if (entity instanceof Model)
-			return (Entity)mergedModel.getRoot();
-		
-		Entity ret = null;
-		String entityKey = getIdRelativeToRoot(entity);
-		SimpleResultSet rs = (SimpleResultSet)entityVisitor.findEntities((Entity)mergedModel.getRoot(), entityKey);
-		try {
-			if (! rs.getResults().isEmpty()) 
-				ret = (Entity)rs.getResults().get(0);				
-			rs.close();
-		} catch (MetaDataException e) {
-			JSFCommonPlugin.log(IStatus.ERROR, "Error in getMergedEntity()", e);
-		}
-		return ret;
-	}
-	
-	private String getIdRelativeToRoot(final Entity entity) {
-		Entity e = entity;
-		StringBuffer buf = new StringBuffer();
-		while (e.eContainer() != null){
-			buf.insert(0, e.getId());
-			if (e.eContainer()!=null && e.eContainer().eContainer() != null)
-				buf.insert(0,"/");
-			e = (Entity)e.eContainer();
-		}
-		return buf.toString();
-	}
-
-	/**
-	 * Locates the trait in the merged model matching by id only. 
-	 * If not located, this method returns null;
-	 *  
-	 * @param entity
-	 * @param trait
-	 * @return merged Trait
-	 */
-	public Trait getMergedTrait(Entity entity, Trait trait){
-		SimpleResultSet rs = (SimpleResultSet)traitVisitor.findTraits(entity, trait.getId());
-		Trait ret = null;
-		try {
-			if (! rs.getResults().isEmpty()) 
-				ret = (Trait)rs.getResults().get(0);				
-			rs.close();
-		} catch (MetaDataException e) {
-			JSFCommonPlugin.log(IStatus.ERROR, "Error in getMergedTrait()", e);
-		}
-		return ret;
-	}
-
-	private void processIncludeGroups(final Model root) {
-		addEntityGroupReferencesRecursively(root);
-	}
-
-	private void addEntityGroupReferencesRecursively(final Entity entity) {
-		doIncludes(entity);
-		for (int i=0, size=entity.getChildEntities().size();i<size;i++){
-			addEntityGroupReferencesRecursively((Entity)entity.getChildEntities().get(i));
-		}		
-	}
-
-	private void doIncludes(final Entity entity){
-		for (int j=0, groupsSize=entity.getIncludeGroups().size();j<groupsSize; j++){				
-			IncludeEntityGroup include = (IncludeEntityGroup)entity.getIncludeGroups().get(j);				
-			if (include.getId() != null){
-				//is this a local merge?
-				if (include.getModelUri() == null||
-						(include.getModelUri()
-							.equals(getMergedModel()
-								.getModelKey().getUri())) ){
-					EntityGroup eg = ((Model)getMergedModel().getRoot()).findIncludeGroup(include.getId());
-					addIncludeRefs(entity, eg);
-				} else //external model include
-					addIncludeRefs(entity, include);
-			}
-		}
-	}
-	/*
-	 * Adds traits and child entities from an external entity group to the passed entity
-	 * @param entity
-	 * @param include
-	 */
-	private void addIncludeRefs(final Entity entity, final IncludeEntityGroup include) {
-		ITaglibDomainMetaDataModelContext modelContext = new TaglibDomainMetaDataModelContextImpl(				
-				getMergedModel().getModelKey().getDomain(), 
-				getMergedModel().getModelKey().getProject(), 
-				include.getModelUri()
-		);
-		
-		Model externalModel = TaglibDomainMetaDataQueryHelper.getModel(modelContext);
-		EntityGroup entityGroup = externalModel.findIncludeGroup(include.getId());
-		
-		addIncludeRefs(entity, entityGroup);
-	}
-
-	/*
-	 * Adds traits and child entities from a local entity group to the passed entity if not already present for the entity.
-	 * First 
-	 * @param entity
-	 * @param entityGroup
-	 */
-	private void addIncludeRefs(final Entity entity, final EntityGroup entityGroup) {
-		if (entityGroup == null)
-			return;
-	
-		for (int i=0, size=entityGroup.getTraits().size();i<size;i++){
-			addTrait(entity, (Trait)entityGroup.getTraits().get(i));
-		}
-		
-		for (int i=0, size=entityGroup.getChildEntities().size();i<size;i++){
-			traverseAndAddIncludes(entity, (Entity)entityGroup.getChildEntities().get(i));
-		}
-	}
-	
-	private void traverseAndAddIncludes(final Entity parent, final Entity entity){
-		Entity mergedEntity = addIncludedEntityAsNecessary(parent, entity);
-		
-		for (final Iterator/*<Trait>*/ it=entity.getTraits().iterator();it.hasNext();){
-			Trait trait = (Trait)it.next();
-			addTraitAsNecessary(mergedEntity, trait);
-		}
-		
-		for (final Iterator/*<EntityKey>*/ it=entity.getChildEntities().iterator();it.hasNext();){
-			Entity e = (Entity)it.next();
-			traverseAndAddIncludes(mergedEntity, e);//add as normal
-		}
-		
-	}
-		
-	/*
-	 * Checks to see if the entity (by id) is present as a child entity in the parent or not.
-	 * If not, it will add the entity to the childEntities without copying.
-	 * 
-	 * @param parent
-	 * @param entity
-	 * @return Entity
-	 */
-	private Entity addIncludedEntityAsNecessary(final Entity parent, final Entity entity) {		
-		Entity mergedEntity = getExistingChildEntity(parent, entity);
-		if (mergedEntity == null){
-			mergedEntity = addEntityInternal(parent, entity);
-		}
-		return mergedEntity;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ModelKeyDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ModelKeyDescriptor.java
deleted file mode 100644
index b082277..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ModelKeyDescriptor.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import org.eclipse.core.resources.IProject;
-
-/**
- * Meta data model key descriptor used to lazily load a model when it is required
- *
- */
-public class ModelKeyDescriptor {
-	private IProject project;
-	private String domain;
-	private String uri;
-	private String key;
-	
-	/**
-	 * Constructor
-	 * @param project
-	 * @param domain
-	 * @param uri
-	 */
-	public ModelKeyDescriptor(IProject project, String domain, String uri){
-		this.project = project;
-		this.domain = domain;
-		this.uri = uri;
-		StringBuffer buf = new StringBuffer(domain);
-		buf.append(":");
-		buf.append(uri);
-		key = buf.toString();
-	}
-	
-	/**
-	 * @return domain id
-	 */
-	public String getDomain(){
-		return domain;
-	}
-	
-	/**
-	 * @return model uri
-	 */
-	public String getUri(){
-		return uri;
-	}
-
-	/**
-	 * @return project
-	 */
-	public IProject getProject(){
-		return project;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString(){		
-		return key;
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ModelNotSetException.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ModelNotSetException.java
deleted file mode 100644
index 34b90b1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ModelNotSetException.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-/**
- * Experimental
- *
- */
-public class ModelNotSetException extends Exception {
-	private static final long serialVersionUID = 1L;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/PluginRelativeStandardMetaDataSourceFileLocator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/PluginRelativeStandardMetaDataSourceFileLocator.java
deleted file mode 100644
index 9e19b56..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/PluginRelativeStandardMetaDataSourceFileLocator.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-
-/**
- * Default implementation of StandardMetaDataSourceFileLocator that will locate standard metadata files
- * and resource bundles relative to the plugin that registered the files using the 
- * <code>org.eclipse.jst.jsf.common.StandardMetaDataFiles</code> ext-pt.
- *
- */
-public class PluginRelativeStandardMetaDataSourceFileLocator extends StandardMetaDataSourceFileLocator{
-	
-	private ResourceBundle resourceBundle;
-
-	/* 
-	 * Returns InputStream of standard metadata file from plugin relative location.
-	 * 	 
-	 */
-	public InputStream getInputStream() throws IOException {
-		URL url = FileLocator.find(Platform.getBundle(fileInfo.getBundleId()), Path.fromOSString(fileInfo.getLocation()), null);
-		if (url != null) 
-			return url.openStream();
-		
-        String  fileName = Path.fromOSString(fileInfo.getLocation()).toString() + " (Plugin: " + fileInfo.getBundleId()+")" ;
-        throw new FileNotFoundException("Metadata file not found: "+ fileName);
-	}
-
-	
-	/* 
-	 * Returns property resource bundle if it exists.  May return null.
-	 * This implementation assumes that the basename of the bundle is the same 
-	 * as the source file name and in the same directory.
-	 * 
-	 */
-	public ResourceBundle getResourceBundle() throws IOException, MalformedURLException {
-		if (resourceBundle == null){
-			URL bundleURL = getStandardMetaDataSourceFileBasenameURL();
-			if (bundleURL == null)
-				return null;
-			
-			resourceBundle = ResourceBundleHelper.getResourceBundle(bundleURL);
-		}
-		return resourceBundle;
-	}
-	
-	private URL getStandardMetaDataSourceFileBasenameURL()  {
-		IPath annotationPath = Path.fromOSString(fileInfo.getLocation()); 
-		IPath annotationFolder = annotationPath.removeLastSegments(1);
-		IPath propertiesLocation = annotationPath.removeFirstSegments(annotationPath.segmentCount() - 1).removeFileExtension();
-		// append location of properties file
-		IPath propertiesFile = annotationFolder.append(propertiesLocation);
-	
-		// append .properties extension if needed
-		if (propertiesFile.getFileExtension() == null)
-			propertiesFile = propertiesFile.addFileExtension("properties"); //$NON-NLS-1$
-		// create a URL out of the properties file location
-		return FileLocator.find(Platform.getBundle(fileInfo.getBundleId()),
-				propertiesFile, null);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ResourceBundleHelper.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ResourceBundleHelper.java
deleted file mode 100644
index 58788dc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ResourceBundleHelper.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     Gerry Kessler/Oracle - copied from org.eclipse.wst.sse.core.internal.encoding.util and modified heavily
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.Locale;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-
-/**
- * ResourceBundleHelper
- *
- */
-public class ResourceBundleHelper {
-
-	/**
-	 * @param resourceURL
-	 * @return ResourceBundle
-	 * @throws MalformedURLException - may return null
-	 * @throws IOException
-	 */
-	public static ResourceBundle getResourceBundle(URL resourceURL) throws MalformedURLException, IOException {
-		return getResourceBundle(resourceURL, Locale.getDefault());
-	}
-
-	/**
-	 * @param resourceURL
-	 * @param targetLocale
-	 * @return ResourceBundle - may return null
-	 * @throws MalformedURLException
-	 * @throws IOException
-	 */
-	public static ResourceBundle getResourceBundle(URL resourceURL, Locale targetLocale) throws MalformedURLException, IOException {
-		// try to load bundle from the location specified in the resourceURL
-		//
-		String protocol	= resourceURL.getProtocol();
-		String host		= resourceURL.getHost();
-		String file		= resourceURL.getFile();
-		IPath path 		= new Path(file);
-		
-		String dir = "./";
-		String bundleName = path.removeFileExtension().segment(path.segmentCount() - 1);
-		if (path.segmentCount() > 1)
-			dir = path.removeLastSegments(1).toString();
-		
-		// create a class loader with a class path that points to the resource
-		// bundle's location
-		//         
-		URL[] classpath = new URL[1];
-		classpath[0] = FileLocator.resolve(new URL(protocol, host, dir));
-		ClassLoader resourceLoader = new URLClassLoader(classpath, null);
-
-		return ResourceBundle.getBundle(bundleName, targetLocale, resourceLoader);
-	}
-}
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileInfo.java
deleted file mode 100644
index 5dfb331..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileInfo.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-/**
- * Contains information about annotation files.  
- */
-public final class StandardMetaDataFileInfo implements IStandardMetaDataSourceInfo{
-		
-	private String fileLocation;
-	private String fileLocatorClassname;
-	private String bundleId;
-
-	/**
-	 * Constructor
-	 * @param fileLocation
-	 * @param bundleId
-	 * @param fileLocatorClassname
-	 */
-	public StandardMetaDataFileInfo( String fileLocation, String bundleId, String fileLocatorClassname) {
-		this.fileLocation = fileLocation.trim();
-		this.bundleId = bundleId.trim();
-		this.fileLocatorClassname = fileLocatorClassname;
-	}
-
-	/**
-	 * Get the location of the annotation file as originally specified.
-	 * 
-	 * @return String
-	 */
-	public String getLocation() {
-		return fileLocation;
-	}
-	
-	/**
-	 * Get the annotation file locator classname that must implement ICMAnnotationSourceFileLocator.
-	 * Can return null or empty string.   Caller should provide default.
-	 * 
-	 * @return String
-	 */
-	public String getLocatorClassname() {
-		return fileLocatorClassname != null ? fileLocatorClassname.trim() : null;
-	}
-
-	/**
-	 * Get the bundle id of the plugin where the annotation file is located.
-	 * 
-	 * @return String
-	 */
-	public String getBundleId() {
-		return bundleId;
-	}
-
-	public String toString(){
-		StringBuffer buf = new StringBuffer("StandardMetaDataFileInfo");
-		buf.append(": ");
-		buf.append(bundleId);
-		buf.append("/");
-		buf.append(fileLocation);
-		if (getLocatorClassname() != null){
-			buf.append(": ");
-			buf.append(getLocatorClassname());
-		}
-		return buf.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileRegistry.java
deleted file mode 100644
index e49ca1a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileRegistry.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM - Initial API and implementation
- *   Jens Lukowski/Innoopract - initial renaming/restructuring
- * 	 Gerry Kessler/Oracle - code borrowed and repurposed for JSF subproject
- *
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-
-
-/**
- * Registry of standard metadata files
- */
-public final class StandardMetaDataFileRegistry {
-	private Map/*<String, List<IMetaDataSourceModelProvider>>*/ mdFilesMap 	= new HashMap/*<String, List<IMetaDataSourceModelProvider>>*/(1);
-	private List/*<IMetaDataSourceModelProvider>*/ EMPTY_LIST 	= new ArrayList/*<IMetaDataSourceModelProvider>*/(0);
-
-	private static StandardMetaDataFileRegistry reg;
-	
-	/**
-	 * @return the singleton instance of the registry
-	 */
-	public static StandardMetaDataFileRegistry getInstance() {
-		if (reg == null){
-			reg = new StandardMetaDataFileRegistry();
-		}
-		return reg;
-	}
-	
-	private StandardMetaDataFileRegistry() {
-		new StandardMetaDataFileRegistryReader(this).readRegistry();
-	}
-
-	/**
-	 * @param uri as String
-	 * @return list of standard metadata sources as <code>IMetaDataSourceModelProvider</code>s.  
-	 * Returns empty list of no standard metadata files are registered for the given uri.
-	 */
-	public synchronized List/*<IMetaDataSourceModelProvider>*/ getStandardMetaDataModelProviders(String uri) {
-		List/*<IMetaDataSourceModelProvider>*/ theList = (List)mdFilesMap.get(uri);
-		return theList != null ? theList : EMPTY_LIST ;
-	}
-		
-	/**
-	 * For use by registry reader only
-	 * @param uri
-	 * @param fileInfo 
-	 */
-	public synchronized void addStandardMetaDataFileInfo(String uri, IStandardMetaDataSourceInfo fileInfo) {
-		List/*<IMetaDataSourceModelProvider>*/ providers = (List) mdFilesMap.get(uri);
-		if (providers == null) {
-			providers = new ArrayList/*<IStandardMetaDataSourceInfo>*/();
-			mdFilesMap.put(uri, providers);
-		}
-		providers.add(new StandardMetaDataFilesProvider(fileInfo, uri));
-	}	
-	
-/**
- * Internal implementation of IMetaDataSourceModelProvider for "standard" metadata sources
- *
- */
-class StandardMetaDataFilesProvider implements IMetaDataSourceModelProvider {
-	
-	private org.eclipse.jst.jsf.common.metadata.internal.IStandardMetaDataSourceInfo info;
-	private Object model;
-	private IMetaDataLocator locator;
-	private StandardMetaDataSourceFileLocator fileLocator = null;
-	
-	/**
-	 * Constructor
-	 * @param info
-	 * @param uri
-	 */
-	StandardMetaDataFilesProvider(IStandardMetaDataSourceInfo info, String uri){
-		this.info = info;
-	}
-	
-	private StandardMetaDataSourceFileLocator getFileLocator(){
-		if (fileLocator == null){		
-			if (info.getLocatorClassname() == null){
-				fileLocator = new PluginRelativeStandardMetaDataSourceFileLocator();
-			}	
-			else {		
-				Class klass = JSFCommonPlugin.loadClass(info.getLocatorClassname(), info.getBundleId());
-				try {
-					fileLocator = (StandardMetaDataSourceFileLocator)klass.newInstance();
-				} catch (InstantiationException e) {
-					JSFCommonPlugin.log(IStatus.ERROR, "InstantiationException: StandardMetaDataFilesProvider.getFileLocator()", e); //$NON-NLS-1$
-				} catch (IllegalAccessException e) {
-					JSFCommonPlugin.log(IStatus.ERROR, "IllegalAccessException: StandardMetaDataFilesProvider.getFileLocator()", e);				 //$NON-NLS-1$
-				}			
-			}
-			if (fileLocator != null)
-				fileLocator.setFileInfo(info);
-		}
-		return fileLocator;
-	}
-	
-	private InputStream getInputStream() throws IOException {				
-		if (getFileLocator() != null){
-			return	getFileLocator().getInputStream();			
-		}
-		return null;
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider#getSourceModel()
-	 */
-	public Object getSourceModel() {
-		if (model != null)
-			return model;
-		
-		InputStream inputStream = null;
-		try {
-			inputStream = getInputStream();
-			if (inputStream != null){
-				EList contents = StandardModelFactory.getInstance().loadStandardFileResource(inputStream, this);
-				//check to see if this is a Model
-				if (contents != null && contents.get(0) instanceof Model){				
-					model = contents.get(0);
-					((Model)model).setSourceModelProvider(this);
-				}
-			}
-		} catch (FileNotFoundException e){
-			JSFCommonPlugin.log(IStatus.ERROR, e.getLocalizedMessage());
-		} catch (IOException e) {
-			JSFCommonPlugin.log(IStatus.ERROR,"IOException(1): StandardMetaDataFilesProvider.getSourceModel()", e); //$NON-NLS-1$
-		} finally {
-			if (inputStream != null){
-				try {
-					inputStream.close();
-				} catch (IOException e) {
-					JSFCommonPlugin.log( IStatus.ERROR,"IOException (2): StandardMetaDataFilesProvider.getSourceModel()", e); //$NON-NLS-1$
-				}
-			}
-		}
-		return model;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider#getLocator()
-	 */
-	public IMetaDataLocator getLocator() {
-		return locator;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider#setLocator(org.eclipse.jst.jsf.common.metadata.internal.IMetaDataLocator)
-	 */
-	public void setLocator(IMetaDataLocator locator) {
-		this.locator = locator;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider#getResourceBundle()
-	 */
-	private ResourceBundle internalGetResourceBundle() {
-		if (getFileLocator() != null){
-			try {
-				return fileLocator.getResourceBundle();
-			} catch (MissingResourceException e) {
-				JSFCommonPlugin.log(IStatus.ERROR, "InternalGetResourceBundle1", e);
-			} catch (IOException e) {
-				JSFCommonPlugin.log(IStatus.ERROR, "InternalGetResourceBundle2", e);			
-			}
-		}
-		return null;
-	}
-
-	public Object getAdapter(Class klass) {
-		final StandardMetaDataFilesProvider mdp = this;
-		if (klass == IImageDescriptorProvider.class){			
-			return new IImageDescriptorProvider(){
-				String imageBase;
-				public ImageDescriptor getImageDescriptor(String imagePath) {
-					imagePath = appendImageBase(imagePath);
-					String bundleID = mdp.getFileLocator().getFileInfo().getBundleId();
-					URL url = FileLocator.find(Platform.getBundle(bundleID), new Path(imagePath), null);
-					return ImageDescriptor.createFromURL(url);
-				}
-				private String appendImageBase(String imagePath) {
-					return getImageBase() + imagePath;
-				}
-				
-				private String getImageBase(){
-					if (imageBase == null){
-						Model aModel = (Model)getSourceModel();
-						Trait t = TaglibDomainMetaDataQueryHelper.getTrait(aModel, "images-base-path"); //$NON-NLS-1$
-						if (t == null){
-							imageBase = "";		 //$NON-NLS-1$
-						} else {
-							imageBase = TraitValueHelper.getValueAsString(t);
-							if (imageBase != null && imageBase.length() > 0){
-								imageBase = imageBase +"/"; //$NON-NLS-1$
-							}
-						}
-					}
-					return imageBase;
-				}
-				
-			};
-		
-		} else if (klass == IResourceBundleProvider.class) {
-			return new IResourceBundleProvider(){
-
-				public ResourceBundle getResourceBundle() {
-					return mdp.internalGetResourceBundle();
-				}
-				
-			};
-			
-		} else if (klass == IClassLoaderProvider.class){
-			return new IClassLoaderProvider(){
-
-				public Class loadClass(String className) {
-					String bundleID = mdp.getFileLocator().getFileInfo().getBundleId();
-					try {
-						return Platform.getBundle(bundleID).loadClass(className);
-					} catch (ClassNotFoundException e) {
-						return null;
-					}
-				}
-				
-			};
-		}
-		return null;
-	}
-
-}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileRegistryReader.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileRegistryReader.java
deleted file mode 100644
index a6b051b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileRegistryReader.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM - Initial API and implementation
- *   Jens Lukowski/Innoopract - initial renaming/restructuring
- *   Gerry Kessler/Oracle - code borrowed and repurposed for JSF subproject
- *
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-
-
-/**
- * This class reads the standardMetaDataFiles extensions adds each specified standard metadata
- * file to the StandardMetaDataFileRegistry.
- * 
- * @see StandardMetaDataFileRegistry
- * also see StandardMetaDataFile extension-point
- */
-public class StandardMetaDataFileRegistryReader {
-	/**
-	 * EXTENSION POINT ID
-	 */
-	protected static final String EXTENSION_POINT_ID = "standardMetaDataFiles"; //$NON-NLS-1$
-	/**
-	 * IConfigurationElement element name
-	 */
-	protected static final String TAG_NAME = "StandardMetaDataFile"; //$NON-NLS-1$
-	/**
-	 * Uri attribute name for IConfigurationElement
-	 */
-	protected static final String ATT_URI = "uri"; //$NON-NLS-1$
-	/**
-	 * Location attribute name for IConfigurationElement
-	 */
-	protected static final String ATT_LOCATION = "location"; //$NON-NLS-1$
-	/**
-	 * Locator attribute name for IConfigurationElement
-	 */
-	protected static final String ATT_LOCATOR = "locator"; //$NON-NLS-1$
-
-	private StandardMetaDataFileRegistry annotationFileRegistry;
-
-	/**
-	 * Constructor
-	 * @param registry
-	 */
-	public StandardMetaDataFileRegistryReader(StandardMetaDataFileRegistry registry) {
-		this.annotationFileRegistry = registry;
-	}
-
-	/**
-	 * read the registery
-	 */
-	public void readRegistry() {
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint point = extensionRegistry.getExtensionPoint(JSFCommonPlugin.PLUGIN_ID, EXTENSION_POINT_ID);
-		if (point != null) {
-			IConfigurationElement[] elements = point.getConfigurationElements();
-			for (int i = 0; i < elements.length; i++) {
-				readElement(elements[i]);
-			}
-		}
-	}
-
-	private void readElement(IConfigurationElement element) {
-		if (element.getName().equalsIgnoreCase(TAG_NAME)) {
-			String uri = element.getAttribute(ATT_URI);
-			String location = element.getAttribute(ATT_LOCATION);
-			String locator = element.getAttribute(ATT_LOCATOR);
-			String bundleId = null;
-			if (uri != null && location != null) {
-				try {
-					bundleId = element.getContributor().getName();
-					StandardMetaDataFileInfo fileInfo = new StandardMetaDataFileInfo(location, bundleId, locator);
-					annotationFileRegistry.addStandardMetaDataFileInfo(uri, fileInfo);
-				}
-				catch (Exception e) {
-					JSFCommonPlugin.log(IStatus.ERROR, "Internal Error: exception occurred while reading StandardMetaDataFile ext-pt: "+location + ":"+uri, e); //$NON-NLS-1$		}
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFilesTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFilesTranslator.java
deleted file mode 100644
index 261f24e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFilesTranslator.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.util.Iterator;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.EntityGroup;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-
-
-/**
- * A 'null' translation of a metadata file.  Entities and traits are not transformed.
- *
- */
-public class StandardMetaDataFilesTranslator implements IMetaDataTranslator {
-
-	public void translate(IMetaDataModelMergeAssistant assistant) {//TODO: throw proper errors
-		//null translate - sourceModel object are already Entities and traits
-		//traverse the tree and add to model
-		
-		//temp - throw proper errors 
-		//assert assistant.getSourceModel() instanceof ModelKeyDescriptor;
-		
-		MetaDataModel mm = assistant.getMergedModel();
-		if (mm.getRoot() == null)
-			mm.setRoot(assistant.getSourceModelProvider().getSourceModel());
-		
-		else {
-			//for each entity and trait call "add".   assistant will handle merge.
-			Model mk = (Model)assistant.getSourceModelProvider().getSourceModel();
-			if (mk != null)//possible that model was not loaded
-				traverseAndAdd(assistant, mk);
-		}			
-	}
-	
-	/**
-	 * Add entity and any children
-	 * @param assistant
-	 * @param entity
-	 */
-	protected void traverseAndAdd(IMetaDataModelMergeAssistant assistant, final Entity entity){
-		assistant.addEntity(entity);
-		
-		if (entity instanceof Model){
-			Model model = (Model)entity;
-			for (final Iterator/*EntityGroup*/ it=model.getEntityGroups().iterator();it.hasNext();){
-				assistant.addEntityGroup((EntityGroup)it.next());
-			}
-		}
-		
-		for (final Iterator/*<Trait>*/ it=entity.getTraits().iterator();it.hasNext();){
-			Trait trait = (Trait)it.next();
-			assistant.addTrait(entity, trait);
-		}
-		
-		for (final Iterator/*<EntityKey>*/ it=entity.getChildEntities().iterator();it.hasNext();){
-			Entity e = (Entity)it.next();
-			traverseAndAdd(assistant, e);
-		}
-		
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataLocator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataLocator.java
deleted file mode 100644
index fd3e3ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataLocator.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.util.List;
-
-
-/**
- * Implementation of IMetaDataLocator for standard metadata sources.
- * Uses StandardMetaDataFileRegistry to locate instances.
- *
- */
-public class StandardMetaDataLocator extends AbstractMetaDataLocator {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataLocator#locateMetaDataModelProviders(java.lang.String)
-	 */
-	public List locateMetaDataModelProviders(String uri) {
-		return StandardMetaDataFileRegistry.getInstance().getStandardMetaDataModelProviders(uri);
-	}
-
-	/* 
-	 * Does nothing.
-	 */
-	public void startLocating() {
-		//do nothing
-	}
-
-	/* 
-	 * Does nothing.
-	 */
-	public void stopLocating() {
-		//do nothing
-	}
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataSourceFileLocator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataSourceFileLocator.java
deleted file mode 100644
index 418b240..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataSourceFileLocator.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-
-/**
- * Used to supply an InputStream to the parser of an annotation 
- * meta-data file and the URL to the resource bundle for a properties file, if any.
- * 
- * Implementors must provide a zero-argument constructor.
- *
- */ 
-public abstract class StandardMetaDataSourceFileLocator {
-	/**
-	 * metadata file to locate
-	 */
-	protected IStandardMetaDataSourceInfo fileInfo;
-	
-	/**
-	 * Set the <code>IStandardMetaDataSourceInfo</code> for this locator
-	 * @param fileInfo
-	 */
-	public final void setFileInfo(IStandardMetaDataSourceInfo fileInfo){
-		this.fileInfo = fileInfo;
-	}
-	
-	/**
-	 * @return the <code>IStandardMetaDataSourceInfo</code> for this locator
-	 */
-	protected final IStandardMetaDataSourceInfo getFileInfo(){
-		return fileInfo;
-	}
-	/**
-	 * Return InputStream to the meta-data source file.  
-	 * Callers are responsble for closing the stream.
-	 * @return InputStream
-	 * @throws IOException
-	 */
-	public abstract InputStream getInputStream() throws IOException;
-	
-	/**
-	 * Return ResourceBundle for the property files if there are any.  Return null if not.
-	 * 
-	 * @return java.util.ResourceBundle
-	 * @throws IOException
-	 * @throws MissingResourceException
-	 */
-	public abstract ResourceBundle getResourceBundle() throws IOException, MissingResourceException;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardModelFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardModelFactory.java
deleted file mode 100644
index 53b99a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardModelFactory.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Map;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.eclipse.emf.ecore.util.BasicExtendedMetaData;
-import org.eclipse.emf.ecore.util.ExtendedMetaData;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl;
-import org.eclipse.jst.jsf.common.metadata.internal.util.MetadataResourceImpl;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-
-/**
- * Singelton that produces and loads standard metadata models.  
- * All models are loaded into the same ResourceSet 
- *
- * see Model
- */
-public class StandardModelFactory {
-	private static StandardModelFactory INSTANCE;
-	private ExtendedMetaData extendedMetaData;
-	private ResourceSet resourceSet;
-	
-	
-	/**
-	 * @return singleton instance of the metadata model factory
-	 */
-	public synchronized static StandardModelFactory getInstance(){
-		if (INSTANCE == null){
-			INSTANCE = new StandardModelFactory();
-			INSTANCE.init();			
-		}
-		return INSTANCE;
-	}
-
-	private void init() {
-		resourceSet = new ResourceSetImpl();
-		
-	    extendedMetaData = new BasicExtendedMetaData(resourceSet.getPackageRegistry());
-		
-		// Register the appropriate resource factory to handle all file extentions.
-		//
-		resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put
-			(Resource.Factory.Registry.DEFAULT_EXTENSION, 
-			 new XMLResourceFactoryImpl());
-
-		//relying on the org.eclipse.emf.ecore.generated_package ext-pt to register traits
-	}
-
-//	private void registerTraitTypes(Registry packageRegistry) {
-//		for(Iterator/*<EPackage>*/ it=TraitTypeRegistry.getInstance().getEPackages().iterator();it.hasNext();){
-//			EPackage pkg = (EPackage)it.next();
-//			packageRegistry.put(pkg.getNsURI(), pkg);
-//		}
-//	}
-
-	private StandardModelFactory() {		
-		super();
-	}
-	
-	/**
-	 * Factory method that probably belongs somewhere else!
-	 * @param key
-	 * @param strategy
-	 * @return an empty MetaDataModel
-	 */
-	public MetaDataModel createModel(ModelKeyDescriptor key, IDomainLoadingStrategy strategy){
-		return new MetaDataModel(key, strategy);
-	}
-
-	/**
-	 * Factory method that probably belongs somewhere else!
-	 * @param modelContext 
-	 * @return a ModelKeyDescriptor for the context
-	 */
-	public ModelKeyDescriptor createModelKeyDescriptor(final ITaglibDomainMetaDataModelContext modelContext) {
-		return new ModelKeyDescriptor(modelContext.getProject(), modelContext.getDomainID(), modelContext.getURI());
-	}
-	
-	/**
-	 * @param inputStream
-	 * @param provider
-	 * @return the root of the standard model from the resource as an EList
-	 * @throws IOException
-	 */
-	public EList loadStandardFileResource(InputStream inputStream, IMetaDataSourceModelProvider provider) throws IOException {
-		XMLResource res = new MetadataResourceImpl(provider); 
-		resourceSet.getResources().add(res);
-		setLoadOptions(res);
-		res.load(inputStream, null);
-		EList root = res.getContents();		
-		return root;	
-	}
-
-	/**
-	 * Sets default load options for the resource
-	 * @param resource 
-	 */
-	protected void setLoadOptions(XMLResource resource) {
-		Map options = resource.getDefaultLoadOptions();
-//		options.put(XMLResource.OPTION_SAVE_TYPE_INFORMATION, true);				
-		options.put(XMLResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE);
-		options.put(XMLResource.OPTION_EXTENDED_META_DATA, extendedMetaData);
-		options.put(XMLResource.OPTION_RESOURCE_HANDLER, resource);
-		options.put(XMLResource.OPTION_LAX_FEATURE_PROCESSING, Boolean.TRUE);
-		options.put(XMLResource.OPTION_RECORD_UNKNOWN_FEATURE, Boolean.TRUE);
-//		options.put(XMLResource.OPTION_DOM_USE_NAMESPACES_IN_SCOPE, Boolean.TRUE);
-	}
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TaglibDomainMetaDataModelContextImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TaglibDomainMetaDataModelContextImpl.java
deleted file mode 100644
index 8f3813a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TaglibDomainMetaDataModelContextImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-
-/**
- * Simple implementation of {@link ITaglibDomainMetaDataModelContext}
- */
-public class TaglibDomainMetaDataModelContextImpl extends MetaDataModelContextImpl implements ITaglibDomainMetaDataModelContext, Cloneable{
-	private IProject _project;
-	private String _uri;
-	
-	/**
-	 * Constructor
-	 * @param project
-	 * @param domain
-	 * @param uri
-	 */
-	public TaglibDomainMetaDataModelContextImpl(String domain, IProject project, String uri){
-		super(domain);
-		this._project = project;
-		this._uri = uri;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext#getProject()
-	 */
-	public IProject getProject() {		
-		return _project;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext#getURI()
-	 */
-	public String getURI() {
-		return _uri;
-	}
-	
-	public Object getAdapter(Class adapter) {
-		if (adapter.equals(ITaglibDomainMetaDataModelContext.class))
-			return this;
-		
-		return super.getAdapter(adapter);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TraitValueHelper.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TraitValueHelper.java
deleted file mode 100644
index d45da0f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TraitValueHelper.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.internal;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.BasicEObjectImpl;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.xml.type.AnyType;
-import org.eclipse.emf.ecore.xml.type.SimpleAnyType;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.ListOfValues;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Experimental/prototype class to assist with decoding trait values.
- * This could/should be made API at some point after "hardening". (https://bugs.eclipse.org/bugs/show_bug.cgi?id=192052) 
- */
-public class TraitValueHelper {
-	private static final String KEY_NOT_FOUND = Messages.Key_not_found;
-	/**
-	 * @param trait
-	 * @return EClass of trait value
-	 */
-	public static EClass getValueType(Trait trait){
-		if (trait == null)
-			return null;
-		if (trait.getValue() != null)
-			return trait.getValue().eClass();
-		return null;
-	}
-	
-	/**
-	 * @param trait
-	 * @return value of trait as String Object.  
-	 */
-	public static Object getValue(Trait trait){
-		if (trait == null)
-			return null;
-		if (trait.getValue() == null)
-			return null;
-		
-		if (trait.getValue() instanceof SimpleAnyType){
-			return ((SimpleAnyType)trait.getValue()).getRawValue();
-		}
-		else if (trait.getValue() instanceof AnyType){
-			AnyType any = (AnyType)trait.getValue();
-			FeatureMap map = any.getMixed();			
-			return getTextValueFromFeatureMap(map);
-		}
-		else if ( trait.getValue().eIsProxy() && trait.getValue() instanceof BasicEObjectImpl){
-			BasicEObjectImpl o = (BasicEObjectImpl)trait.getValue();
-			return o.eProxyURI().toString();
-		}
-		return trait.getValue();
-	}
-	
-	private static String getTextValueFromFeatureMap(FeatureMap map) {
-		for (Iterator it=map.iterator();it.hasNext();){
-			FeatureMap.Entry entry = (FeatureMap.Entry)it.next();
-			if (entry.getEStructuralFeature().getName().equals("text"))		
-				return (String)entry.getValue();
-		}
-		return null;
-	}
-
-	/**
-	 * @param trait
-	 * @return value of trait as String.  If externalized, will resolve from resource bundle.
-	 */
-	public static String getValueAsString(Trait trait){
-		Object val = getValue(trait);
-		if (val != null && val instanceof String){			
-			String result = getNLSValue(trait, (String)val);
-			return result;
-		}
-		return null;
-	}
-	
-	/**
-	 * 
-	 * @param trait whose value a {@link ListOfValues} or is a single string
-	 * @return List of Strings.  If externalized, will resolve from resource bundle 
-	 * using getNLSValue(Trait trait, String rawValue)
-	 */
-	public synchronized static List getValueAsListOfStrings(Trait trait){
-		//PROTO ONLY!!! Need to make WAY more robust!
-		List ret = new ArrayList();
-		if (trait.getValue() instanceof ListOfValues) {
-			for(Iterator it=trait.getValue().eContents().iterator();it.hasNext();){
-				Object o = it.next();				
-				if (o instanceof SimpleAnyType){
-					SimpleAnyType sat = (SimpleAnyType)o;
-					String rawValue = getTextValueFromFeatureMap(sat.getMixed());
-					String nlsValue = getNLSValue(trait, rawValue);
-					
-					ret.add(nlsValue);
-				}	
-			}
-		} 
-		else {
-			//may be single value
-			String o = getValueAsString(trait);
-			if (o != null)
-				ret.add(o);
-		}
-		return ret;
-	}
-	
-	/**
-	 * Looks for '%' (and not '%%') at beginning of rawValue.   If found, looks to the
-	 * traits sourceModelProvider for resource bundle to resolve the key after 
-	 * stripping the '%' sign.
-	 * @param trait
-	 * @param rawValue of string in from metadata
-	 * @return the NLS Value or rawValue if it cannot be located
-	 */
-	public static String getNLSValue(Trait trait, String rawValue) {
-		String result = rawValue;
-		if (rawValue.startsWith("%") && !rawValue.startsWith("%%")){ 
-			String key = rawValue.substring(1);
-			result = getNLSPropertyValue(trait, key);	
-			if (rawValue == null){
-				result = rawValue;
-			}
-		}
-		return result == null ? null : result.trim();
-	}
-
-	//will return null if there is an IOException with ResourceBundle
-	private static String getNLSPropertyValue(Trait trait, String key){
-		try{			
-			IMetaDataSourceModelProvider provider = trait.getSourceModelProvider();
-			IResourceBundleProvider resourceBundleProvider = (IResourceBundleProvider)provider.getAdapter(IResourceBundleProvider.class);		
-			if (resourceBundleProvider != null){
-				ResourceBundle resourceBundle_ = resourceBundleProvider.getResourceBundle();				
-				if (resourceBundle_ != null){
-					String replVal = resourceBundle_.getString(key);
-					return replVal;
-				}				
-			}
-			//return original string 
-			return key; 
-
-		} catch (MissingResourceException e){
-			//fall thru
-			JSFCommonPlugin.log(e,  NLS.bind(Messages.MissingResource_exception, new String[]{key}));
-		}
-		return key + KEY_NOT_FOUND;
-	}
-
-	/**
-	 * Will take get the value as a String and attempt to coerce to boolean.
-	 * Will return 'false' if coercion fails, or value was null.
-	 * @param trait
-	 * @return true or false 
-	 */
-	public static boolean getValueAsBoolean(Trait trait) {
-		String val = getValueAsString(trait);
-		if (val == null)
-			return false;
-		
-		return Boolean.valueOf(val).booleanValue();
-	}
-	
-//	/**
-//	 * @param trait
-//	 * @return name of class or primitive datatype that the value is defined as.   
-//	 * For SimpleAnyTypes, the getInstanceType().getInstanceClassName() is returned.
-//	 * For AnyType, java.lang.String is always returned.
-//	 * For all others, the class.getName() is returned.
-//	 */
-//	public static String getValueInstanceClassName(Trait trait) {String.class.getName();
-//		if (trait.getValue() instanceof SimpleAnyType) {
-//			return ((SimpleAnyType)trait.getValue()).getInstanceType().getInstanceClassName();
-//		}
-//		else if (trait.getValue() instanceof AnyType) {
-//			return String.class.getName();
-//		}
-//		else {
-//			return trait.getValue().getClass().getName();
-//		}
-//		
-//	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/EntityGroupImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/EntityGroupImpl.java
deleted file mode 100644
index 9343b62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/EntityGroupImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: EntityGroupImpl.java,v 1.4 2007/05/11 17:54:55 gkessler Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.internal.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.common.metadata.EntityGroup;
-import org.eclipse.jst.jsf.common.metadata.MetadataPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Entity Group</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class EntityGroupImpl extends EntityImpl implements EntityGroup {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EntityGroupImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MetadataPackage.Literals.ENTITY_GROUP;
-	}
-
-} //EntityGroupImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/EntityImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/EntityImpl.java
deleted file mode 100644
index 22cd970..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/EntityImpl.java
+++ /dev/null
@@ -1,415 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: EntityImpl.java,v 1.6 2007/06/11 20:55:58 gkessler Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.internal.impl;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup;
-import org.eclipse.jst.jsf.common.metadata.MetadataPackage;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Entity</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.internal.impl.EntityImpl#getChildEntities <em>Child Entities</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.internal.impl.EntityImpl#getTraits <em>Traits</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.internal.impl.EntityImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.internal.impl.EntityImpl#getType <em>Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.internal.impl.EntityImpl#getIncludeGroups <em>Include Groups</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class EntityImpl extends EObjectImpl implements Entity {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached value of the '{@link #getChildEntities() <em>Child Entities</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getChildEntities()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList childEntities = null;
-
-	/**
-	 * The cached value of the '{@link #getTraits() <em>Traits</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTraits()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList traits = null;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TYPE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected String type = TYPE_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getIncludeGroups() <em>Include Groups</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIncludeGroups()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList includeGroups = null;
-
-	/**
-	 * The cached value of the Model
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	private Model _model;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EntityImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MetadataPackage.Literals.ENTITY;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getChildEntities() {
-		if (childEntities == null) {
-			childEntities = new EObjectContainmentEList(Entity.class, this, MetadataPackage.ENTITY__CHILD_ENTITIES);
-		}
-		return childEntities;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getTraits() {
-		if (traits == null) {
-			traits = new EObjectContainmentEList(Trait.class, this, MetadataPackage.ENTITY__TRAITS);
-		}
-		return traits;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIncludeGroups() {
-		if (includeGroups == null) {
-			includeGroups = new EObjectResolvingEList(IncludeEntityGroup.class, this, MetadataPackage.ENTITY__INCLUDE_GROUPS);
-		}
-		return includeGroups;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MetadataPackage.ENTITY__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getType() {
-		return type;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setType(String newType) {
-		String oldType = type;
-		type = newType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MetadataPackage.ENTITY__TYPE, oldType, type));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public void accept(IEntityVisitor visitor) {
-		if (visitor.stopVisiting())
-			return;
-		visitor.visit(this);
-		
-		if (!getChildEntities().isEmpty()){
-			for (Iterator/*<Entity>*/ it = getChildEntities().iterator(); it.hasNext();){
-				Entity k = (Entity)it.next();
-				k.accept(visitor);
-				if (visitor.stopVisiting())
-					return;
-			}
-		}
-//		if (!getIncludeGroups().isEmpty()){
-//			for (Iterator/*<IncludeEntityGroup>*/ it = getIncludeGroups().iterator(); it.hasNext();){
-//				IncludeEntityGroup entityGroup = (IncludeEntityGroup)it.next();
-//				Model m = getModel(entityGroup);
-//				if (m != null){
-//					Entity k = m.findIncludeGroup(entityGroup.getId());
-//					if (k != null){
-//						k.accept(visitor);
-//						if (visitor.stopVisiting())
-//							return;
-//					}
-//				}
-//			}
-//		}
-		visitor.visitCompleted(this);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Model getModel() {
-		if (_model == null){
-			EObject parent = this.eContainer();
-			while (true){				
-				if (parent instanceof Model){
-					_model = (Model)parent;
-					break;
-				}
-				if (parent != null)
-					parent = parent.eContainer();
-				else
-					break;
-			}
-		}
-		return _model;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case MetadataPackage.ENTITY__CHILD_ENTITIES:
-				return ((InternalEList)getChildEntities()).basicRemove(otherEnd, msgs);
-			case MetadataPackage.ENTITY__TRAITS:
-				return ((InternalEList)getTraits()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case MetadataPackage.ENTITY__CHILD_ENTITIES:
-				return getChildEntities();
-			case MetadataPackage.ENTITY__TRAITS:
-				return getTraits();
-			case MetadataPackage.ENTITY__ID:
-				return getId();
-			case MetadataPackage.ENTITY__TYPE:
-				return getType();
-			case MetadataPackage.ENTITY__INCLUDE_GROUPS:
-				return getIncludeGroups();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case MetadataPackage.ENTITY__CHILD_ENTITIES:
-				getChildEntities().clear();
-				getChildEntities().addAll((Collection)newValue);
-				return;
-			case MetadataPackage.ENTITY__TRAITS:
-				getTraits().clear();
-				getTraits().addAll((Collection)newValue);
-				return;
-			case MetadataPackage.ENTITY__ID:
-				setId((String)newValue);
-				return;
-			case MetadataPackage.ENTITY__TYPE:
-				setType((String)newValue);
-				return;
-			case MetadataPackage.ENTITY__INCLUDE_GROUPS:
-				getIncludeGroups().clear();
-				getIncludeGroups().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case MetadataPackage.ENTITY__CHILD_ENTITIES:
-				getChildEntities().clear();
-				return;
-			case MetadataPackage.ENTITY__TRAITS:
-				getTraits().clear();
-				return;
-			case MetadataPackage.ENTITY__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case MetadataPackage.ENTITY__TYPE:
-				setType(TYPE_EDEFAULT);
-				return;
-			case MetadataPackage.ENTITY__INCLUDE_GROUPS:
-				getIncludeGroups().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case MetadataPackage.ENTITY__CHILD_ENTITIES:
-				return childEntities != null && !childEntities.isEmpty();
-			case MetadataPackage.ENTITY__TRAITS:
-				return traits != null && !traits.isEmpty();
-			case MetadataPackage.ENTITY__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case MetadataPackage.ENTITY__TYPE:
-				return TYPE_EDEFAULT == null ? type != null : !TYPE_EDEFAULT.equals(type);
-			case MetadataPackage.ENTITY__INCLUDE_GROUPS:
-				return includeGroups != null && !includeGroups.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: ");
-		result.append(id);
-		result.append(", type: ");
-		result.append(type);
-		result.append(')');
-		return result.toString();
-	}
-
-} //EntityImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/IncludeEntityGroupImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/IncludeEntityGroupImpl.java
deleted file mode 100644
index 0f8cee8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/IncludeEntityGroupImpl.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: IncludeEntityGroupImpl.java,v 1.2 2007/04/16 19:54:10 itrimble Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup;
-import org.eclipse.jst.jsf.common.metadata.MetadataPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Include Entity Group</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.internal.impl.IncludeEntityGroupImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.internal.impl.IncludeEntityGroupImpl#getModelUri <em>Model Uri</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IncludeEntityGroupImpl extends EObjectImpl implements IncludeEntityGroup {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getModelUri() <em>Model Uri</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getModelUri()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String MODEL_URI_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getModelUri() <em>Model Uri</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getModelUri()
-	 * @generated
-	 * @ordered
-	 */
-	protected String modelUri = MODEL_URI_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IncludeEntityGroupImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MetadataPackage.Literals.INCLUDE_ENTITY_GROUP;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MetadataPackage.INCLUDE_ENTITY_GROUP__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getModelUri() {
-		return modelUri;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setModelUri(String newModelUri) {
-		String oldModelUri = modelUri;
-		modelUri = newModelUri;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MetadataPackage.INCLUDE_ENTITY_GROUP__MODEL_URI, oldModelUri, modelUri));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case MetadataPackage.INCLUDE_ENTITY_GROUP__ID:
-				return getId();
-			case MetadataPackage.INCLUDE_ENTITY_GROUP__MODEL_URI:
-				return getModelUri();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case MetadataPackage.INCLUDE_ENTITY_GROUP__ID:
-				setId((String)newValue);
-				return;
-			case MetadataPackage.INCLUDE_ENTITY_GROUP__MODEL_URI:
-				setModelUri((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case MetadataPackage.INCLUDE_ENTITY_GROUP__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case MetadataPackage.INCLUDE_ENTITY_GROUP__MODEL_URI:
-				setModelUri(MODEL_URI_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case MetadataPackage.INCLUDE_ENTITY_GROUP__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case MetadataPackage.INCLUDE_ENTITY_GROUP__MODEL_URI:
-				return MODEL_URI_EDEFAULT == null ? modelUri != null : !MODEL_URI_EDEFAULT.equals(modelUri);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: ");
-		result.append(id);
-		result.append(", modelUri: ");
-		result.append(modelUri);
-		result.append(')');
-		return result.toString();
-	}
-
-} //IncludeEntityGroupImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/MetadataFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/MetadataFactoryImpl.java
deleted file mode 100644
index ca04307..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/MetadataFactoryImpl.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MetadataFactoryImpl.java,v 1.4 2007/05/11 17:54:55 gkessler Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.internal.impl;
-
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.EntityGroup;
-import org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup;
-import org.eclipse.jst.jsf.common.metadata.MetadataFactory;
-import org.eclipse.jst.jsf.common.metadata.MetadataPackage;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.ModelKeyDescriptor;
-
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class MetadataFactoryImpl extends EFactoryImpl implements MetadataFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Creates the default factory implementation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return MetadataFactory
-	 * @generated
-	 */
-	public static MetadataFactory init() {
-		try {
-			MetadataFactory theMetadataFactory = (MetadataFactory)EPackage.Registry.INSTANCE.getEFactory("http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"); 
-			if (theMetadataFactory != null) {
-				return theMetadataFactory;
-			}
-		}
-		catch (Exception exception) {
-			EcorePlugin.INSTANCE.log(exception);
-		}
-		return new MetadataFactoryImpl();
-	}
-
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MetadataFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case MetadataPackage.MODEL: return createModel();
-			case MetadataPackage.ENTITY_GROUP: return createEntityGroup();
-			case MetadataPackage.ENTITY: return createEntity();
-			case MetadataPackage.TRAIT: return createTrait();
-			case MetadataPackage.INCLUDE_ENTITY_GROUP: return createIncludeEntityGroup();
-			default:
-				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object createFromString(EDataType eDataType, String initialValue) {
-		switch (eDataType.getClassifierID()) {
-			case MetadataPackage.IMETA_DATA_SOURCE_MODEL_PROVIDER:
-				return createIMetaDataSourceModelProviderFromString(eDataType, initialValue);
-			case MetadataPackage.MODEL_CONTEXT:
-				return createModelContextFromString(eDataType, initialValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertToString(EDataType eDataType, Object instanceValue) {
-		switch (eDataType.getClassifierID()) {
-			case MetadataPackage.IMETA_DATA_SOURCE_MODEL_PROVIDER:
-				return convertIMetaDataSourceModelProviderToString(eDataType, instanceValue);
-			case MetadataPackage.MODEL_CONTEXT:
-				return convertModelContextToString(eDataType, instanceValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Trait createTrait() {
-		TraitImpl trait = new TraitImpl();
-		return trait;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IncludeEntityGroup createIncludeEntityGroup() {
-		IncludeEntityGroupImpl includeEntityGroup = new IncludeEntityGroupImpl();
-		return includeEntityGroup;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Model createModel() {
-		ModelImpl model = new ModelImpl();
-		return model;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Entity createEntity() {
-		EntityImpl entity = new EntityImpl();
-		return entity;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EntityGroup createEntityGroup() {
-		EntityGroupImpl entityGroup = new EntityGroupImpl();
-		return entityGroup;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param eDataType IMetaDataSourceModelProvider
-	 * @param initialValue 
-	 * @return IMetaDataSourceModelProvider
-	 * @generated
-	 */
-	public IMetaDataSourceModelProvider createIMetaDataSourceModelProviderFromString(EDataType eDataType, String initialValue) {
-		return (IMetaDataSourceModelProvider)super.createFromString(eDataType, initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param eDataType 
-	 * @param instanceValue 
-	 * @return String
-	 * @generated
-	 */
-	public String convertIMetaDataSourceModelProviderToString(EDataType eDataType, Object instanceValue) {
-		return super.convertToString(eDataType, instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param eDataType 
-	 * @param initialValue 
-	 * @return ModelKeyDescriptor
-	 * @generated
-	 */
-	public ModelKeyDescriptor createModelContextFromString(EDataType eDataType, String initialValue) {
-		return (ModelKeyDescriptor)super.createFromString(eDataType, initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param eDataType 
-	 * @param instanceValue 
-	 * @return String
-	 * @generated
-	 */
-	public String convertModelContextToString(EDataType eDataType, Object instanceValue) {
-		return super.convertToString(eDataType, instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MetadataPackage getMetadataPackage() {
-		return (MetadataPackage)getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return MetadataPackage
-	 * @deprecated
-	 * @generated
-	 */
-	public static MetadataPackage getPackage() {
-		return MetadataPackage.eINSTANCE;
-	}
-
-} //MetadataFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/MetadataPackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/MetadataPackageImpl.java
deleted file mode 100644
index 7f9d582..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/MetadataPackageImpl.java
+++ /dev/null
@@ -1,604 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MetadataPackageImpl.java,v 1.6 2007/05/11 17:54:55 gkessler Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.internal.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EOperation;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.EntityGroup;
-import org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup;
-import org.eclipse.jst.jsf.common.metadata.MetadataFactory;
-import org.eclipse.jst.jsf.common.metadata.MetadataPackage;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.ModelKeyDescriptor;
-import org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor;
-import org.eclipse.jst.jsf.common.metadata.query.ITraitVisitor;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class MetadataPackageImpl extends EPackageImpl implements MetadataPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass traitEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass includeEntityGroupEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass modelEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass entityEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass entityGroupEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType iTraitVisitorEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType iEntityVisitorEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType iMetaDataSourceModelProviderEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType modelContextEDataType = null;
-
-	/**
-	 * Creates an instance of the model <b>Package</b>, registered with
-	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-	 * package URI value.
-	 * <p>Note: the correct way to create the package is via the static
-	 * factory method {@link #init init()}, which also performs
-	 * initialization of the package, or returns the registered package,
-	 * if one already exists.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.emf.ecore.EPackage.Registry
-	 * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private MetadataPackageImpl() {
-		super(eNS_URI, MetadataFactory.eINSTANCE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static boolean isInited = false;
-
-	/**
-	 * Creates, registers, and initializes the <b>Package</b> for this
-	 * model, and for any others upon which it depends.  Simple
-	 * dependencies are satisfied by calling this method on all
-	 * dependent packages before doing anything else.  This method drives
-	 * initialization for interdependent packages directly, in parallel
-	 * with this package, itself.
-	 * <p>Of this package and its interdependencies, all packages which
-	 * have not yet been registered by their URI values are first created
-	 * and registered.  The packages are then initialized in two steps:
-	 * meta-model objects for all of the packages are created before any
-	 * are initialized, since one package's meta-model objects may refer to
-	 * those of another.
-	 * <p>Invocation of this method will not affect any packages that have
-	 * already been initialized.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return MetadataPackage
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static MetadataPackage init() {
-		if (isInited) return (MetadataPackage)EPackage.Registry.INSTANCE.getEPackage(MetadataPackage.eNS_URI);
-
-		// Obtain or create and register package
-		MetadataPackageImpl theMetadataPackage = (MetadataPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof MetadataPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new MetadataPackageImpl());
-
-		isInited = true;
-
-		// Create package meta-data objects
-		theMetadataPackage.createPackageContents();
-
-		// Initialize created meta-data
-		theMetadataPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theMetadataPackage.freeze();
-
-		return theMetadataPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTrait() {
-		return traitEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTrait_Value() {
-		return (EReference)traitEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTrait_SourceModelProvider() {
-		return (EAttribute)traitEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getIncludeEntityGroup() {
-		return includeEntityGroupEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getIncludeEntityGroup_Id() {
-		return (EAttribute)includeEntityGroupEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getIncludeEntityGroup_ModelUri() {
-		return (EAttribute)includeEntityGroupEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTrait_Id() {
-		return (EAttribute)traitEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getModel() {
-		return modelEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getModel_SourceModelProvider() {
-		return (EAttribute)modelEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getModel_CurrentModelContext() {
-		return (EAttribute)modelEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getModel_EntityGroups() {
-		return (EReference)modelEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getEntity() {
-		return entityEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getEntity_ChildEntities() {
-		return (EReference)entityEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getEntity_Traits() {
-		return (EReference)entityEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getEntity_Id() {
-		return (EAttribute)entityEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getEntity_Type() {
-		return (EAttribute)entityEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getEntity_IncludeGroups() {
-		return (EReference)entityEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getEntityGroup() {
-		return entityGroupEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getITraitVisitor() {
-		return iTraitVisitorEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getIEntityVisitor() {
-		return iEntityVisitorEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getIMetaDataSourceModelProvider() {
-		return iMetaDataSourceModelProviderEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getModelContext() {
-		return modelContextEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MetadataFactory getMetadataFactory() {
-		return (MetadataFactory)getEFactoryInstance();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isCreated = false;
-
-	/**
-	 * Creates the meta-model objects for the package.  This method is
-	 * guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void createPackageContents() {
-		if (isCreated) return;
-		isCreated = true;
-
-		// Create classes and their features
-		modelEClass = createEClass(MODEL);
-		createEReference(modelEClass, MODEL__ENTITY_GROUPS);
-		createEAttribute(modelEClass, MODEL__SOURCE_MODEL_PROVIDER);
-		createEAttribute(modelEClass, MODEL__CURRENT_MODEL_CONTEXT);
-
-		entityGroupEClass = createEClass(ENTITY_GROUP);
-
-		entityEClass = createEClass(ENTITY);
-		createEReference(entityEClass, ENTITY__CHILD_ENTITIES);
-		createEReference(entityEClass, ENTITY__TRAITS);
-		createEAttribute(entityEClass, ENTITY__ID);
-		createEAttribute(entityEClass, ENTITY__TYPE);
-		createEReference(entityEClass, ENTITY__INCLUDE_GROUPS);
-
-		traitEClass = createEClass(TRAIT);
-		createEAttribute(traitEClass, TRAIT__ID);
-		createEReference(traitEClass, TRAIT__VALUE);
-		createEAttribute(traitEClass, TRAIT__SOURCE_MODEL_PROVIDER);
-
-		includeEntityGroupEClass = createEClass(INCLUDE_ENTITY_GROUP);
-		createEAttribute(includeEntityGroupEClass, INCLUDE_ENTITY_GROUP__ID);
-		createEAttribute(includeEntityGroupEClass, INCLUDE_ENTITY_GROUP__MODEL_URI);
-
-		// Create data types
-		iTraitVisitorEDataType = createEDataType(ITRAIT_VISITOR);
-		iEntityVisitorEDataType = createEDataType(IENTITY_VISITOR);
-		iMetaDataSourceModelProviderEDataType = createEDataType(IMETA_DATA_SOURCE_MODEL_PROVIDER);
-		modelContextEDataType = createEDataType(MODEL_CONTEXT);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isInitialized = false;
-
-	/**
-	 * Complete the initialization of the package and its meta-model.  This
-	 * method is guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void initializePackageContents() {
-		if (isInitialized) return;
-		isInitialized = true;
-
-		// Initialize package
-		setName(eNAME);
-		setNsPrefix(eNS_PREFIX);
-		setNsURI(eNS_URI);
-
-		// Add supertypes to classes
-		modelEClass.getESuperTypes().add(this.getEntity());
-		entityGroupEClass.getESuperTypes().add(this.getEntity());
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(modelEClass, Model.class, "Model", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getModel_EntityGroups(), this.getEntityGroup(), null, "entityGroups", null, 0, -1, Model.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getModel_SourceModelProvider(), this.getIMetaDataSourceModelProvider(), "sourceModelProvider", null, 0, 1, Model.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getModel_CurrentModelContext(), this.getModelContext(), "currentModelContext", null, 0, 1, Model.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		EOperation op = addEOperation(modelEClass, this.getEntityGroup(), "findIncludeGroup", 0, 1);
-		addEParameter(op, ecorePackage.getEString(), "groupId", 0, 1);
-
-		op = addEOperation(modelEClass, null, "accept");
-		addEParameter(op, this.getIEntityVisitor(), "visitor", 0, 1);
-
-		initEClass(entityGroupEClass, EntityGroup.class, "EntityGroup", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(entityEClass, Entity.class, "Entity", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getEntity_ChildEntities(), this.getEntity(), null, "childEntities", null, 0, -1, Entity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		getEntity_ChildEntities().getEKeys().add(this.getEntity_Id());
-		getEntity_ChildEntities().getEKeys().add(this.getEntity_Type());
-		initEReference(getEntity_Traits(), this.getTrait(), null, "traits", null, 0, -1, Entity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		getEntity_Traits().getEKeys().add(this.getTrait_Id());
-		initEAttribute(getEntity_Id(), ecorePackage.getEString(), "id", null, 1, 1, Entity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getEntity_Type(), ecorePackage.getEString(), "type", null, 0, 1, Entity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getEntity_IncludeGroups(), this.getIncludeEntityGroup(), null, "includeGroups", null, 0, -1, Entity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		op = addEOperation(entityEClass, null, "accept");
-		addEParameter(op, this.getIEntityVisitor(), "visitor", 0, 1);
-
-		op = addEOperation(entityEClass, this.getModel(), "getModel", 0, 1);
-
-		initEClass(traitEClass, Trait.class, "Trait", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getTrait_Id(), ecorePackage.getEString(), "id", null, 1, 1, Trait.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getTrait_Value(), ecorePackage.getEObject(), null, "value", null, 1, 1, Trait.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTrait_SourceModelProvider(), this.getIMetaDataSourceModelProvider(), "sourceModelProvider", null, 0, 1, Trait.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		op = addEOperation(traitEClass, null, "accept");
-		addEParameter(op, this.getITraitVisitor(), "visitor", 0, 1);
-
-		initEClass(includeEntityGroupEClass, IncludeEntityGroup.class, "IncludeEntityGroup", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getIncludeEntityGroup_Id(), ecorePackage.getEString(), "id", null, 1, 1, IncludeEntityGroup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getIncludeEntityGroup_ModelUri(), ecorePackage.getEString(), "modelUri", null, 0, 1, IncludeEntityGroup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		// Initialize data types
-		initEDataType(iTraitVisitorEDataType, ITraitVisitor.class, "ITraitVisitor", !IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
-		initEDataType(iEntityVisitorEDataType, IEntityVisitor.class, "IEntityVisitor", !IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
-		initEDataType(iMetaDataSourceModelProviderEDataType, IMetaDataSourceModelProvider.class, "IMetaDataSourceModelProvider", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
-		initEDataType(modelContextEDataType, ModelKeyDescriptor.class, "ModelContext", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
-
-		// Create resource
-		createResource(eNS_URI);
-
-		// Create annotations
-		// http:///org/eclipse/emf/ecore/util/ExtendedMetaData
-		createExtendedMetaDataAnnotations();
-		// http://www.eclipse.org/emf/2002/GenModel
-		createGenModelAnnotations();
-	}
-
-	/**
-	 * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void createExtendedMetaDataAnnotations() {
-		String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData";		
-		addAnnotation
-		  (modelEClass, 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "metadatamodel"
-		   });		
-		addAnnotation
-		  (getModel_EntityGroups(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "entityGroup"
-		   });		
-		addAnnotation
-		  (entityEClass, 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "entity"
-		   });		
-		addAnnotation
-		  (getEntity_ChildEntities(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "entity"
-		   });		
-		addAnnotation
-		  (getEntity_Traits(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "trait"
-		   });		
-		addAnnotation
-		  (getEntity_IncludeGroups(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "include-entity-group"
-		   });		
-		addAnnotation
-		  (getIncludeEntityGroup_ModelUri(), 
-		   source, 
-		   new String[] {
-			 "name", "uri"
-		   });		
-		addAnnotation
-		  (traitEClass, 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "trait"
-		   });			
-		addAnnotation
-		  (getTrait_Value(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "namespace", "##targetNamespace"
-		   });
-	}
-
-	/**
-	 * Initializes the annotations for <b>http://www.eclipse.org/emf/2002/GenModel</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("cast")
-	protected void createGenModelAnnotations() {
-		String source = "http://www.eclipse.org/emf/2002/GenModel";										
-		addAnnotation
-		  ((EOperation)traitEClass.getEOperations().get(0), 
-		   source, 
-		   new String[] {
-			 "body", "visitor.visit(this);"
-		   });	
-	}
-
-} //MetadataPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/ModelImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/ModelImpl.java
deleted file mode 100644
index 764e9a2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/ModelImpl.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ModelImpl.java,v 1.5 2007/05/16 23:51:15 gkessler Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.internal.impl;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.EntityGroup;
-import org.eclipse.jst.jsf.common.metadata.MetadataPackage;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.ModelKeyDescriptor;
-import org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Model</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.internal.impl.ModelImpl#getEntityGroups <em>Entity Groups</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.internal.impl.ModelImpl#getSourceModelProvider <em>Source Model Provider</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.internal.impl.ModelImpl#getCurrentModelContext <em>Current Model Context</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ModelImpl extends EntityImpl implements Model {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached value of the '{@link #getEntityGroups() <em>Entity Groups</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEntityGroups()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList entityGroups = null;
-
-	/**
-	 * The default value of the '{@link #getSourceModelProvider() <em>Source Model Provider</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSourceModelProvider()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final IMetaDataSourceModelProvider SOURCE_MODEL_PROVIDER_EDEFAULT = null;
-
-	/**
-	 * The default value of the '{@link #getCurrentModelContext() <em>Current Model Context</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCurrentModelContext()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final ModelKeyDescriptor CURRENT_MODEL_CONTEXT_EDEFAULT = null;
-
-	private IMetaDataSourceModelProvider sourceModelProvider;
-
-	private ModelKeyDescriptor _modelContext;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ModelImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MetadataPackage.Literals.MODEL;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * May return null.
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public IMetaDataSourceModelProvider getSourceModelProvider() {
-		return sourceModelProvider;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public void setSourceModelProvider(IMetaDataSourceModelProvider newSourceModelProvider) {
-		sourceModelProvider = newSourceModelProvider;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public ModelKeyDescriptor getCurrentModelContext() {
-		return _modelContext;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public void setCurrentModelContext(ModelKeyDescriptor newCurrentModelContext) {
-		_modelContext = newCurrentModelContext;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getEntityGroups() {
-		if (entityGroups == null) {
-			entityGroups = new EObjectResolvingEList(EntityGroup.class, this, MetadataPackage.MODEL__ENTITY_GROUPS);
-		}
-		return entityGroups;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case MetadataPackage.MODEL__ENTITY_GROUPS:
-				return getEntityGroups();
-			case MetadataPackage.MODEL__SOURCE_MODEL_PROVIDER:
-				return getSourceModelProvider();
-			case MetadataPackage.MODEL__CURRENT_MODEL_CONTEXT:
-				return getCurrentModelContext();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case MetadataPackage.MODEL__ENTITY_GROUPS:
-				getEntityGroups().clear();
-				getEntityGroups().addAll((Collection)newValue);
-				return;
-			case MetadataPackage.MODEL__SOURCE_MODEL_PROVIDER:
-				setSourceModelProvider((IMetaDataSourceModelProvider)newValue);
-				return;
-			case MetadataPackage.MODEL__CURRENT_MODEL_CONTEXT:
-				setCurrentModelContext((ModelKeyDescriptor)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-	
-	
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public EntityGroup findIncludeGroup(String groupId){
-		EntityGroup ret = null;
-		for (Iterator it=getEntityGroups().iterator();it.hasNext();){
-			EntityGroup entityGroup = (EntityGroup)it.next();
-			if (entityGroup.getId().equals(groupId)){
-				ret = entityGroup;
-				break;
-			}
-		}
-		return ret;
-	}
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case MetadataPackage.MODEL__ENTITY_GROUPS:
-				getEntityGroups().clear();
-				return;
-			case MetadataPackage.MODEL__SOURCE_MODEL_PROVIDER:
-				setSourceModelProvider(SOURCE_MODEL_PROVIDER_EDEFAULT);
-				return;
-			case MetadataPackage.MODEL__CURRENT_MODEL_CONTEXT:
-				setCurrentModelContext(CURRENT_MODEL_CONTEXT_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-
-	public void accept(IEntityVisitor visitor) {
-		if (visitor.stopVisiting())
-			return;
-		visitor.visit(this);
-		
-		if (!getChildEntities().isEmpty()){
-			for (Iterator/*<Entity>*/ it = getChildEntities().iterator(); it.hasNext();){
-				Entity k = (Entity)it.next();
-				k.accept(visitor);
-				if (visitor.stopVisiting())
-					return;
-			}
-		}
-
-		visitor.visitCompleted(this);
-	}
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Model getModel() {
-		return this;
-	}
-	
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case MetadataPackage.MODEL__ENTITY_GROUPS:
-				return entityGroups != null && !entityGroups.isEmpty();
-			case MetadataPackage.MODEL__SOURCE_MODEL_PROVIDER:
-				return SOURCE_MODEL_PROVIDER_EDEFAULT == null ? getSourceModelProvider() != null : !SOURCE_MODEL_PROVIDER_EDEFAULT.equals(getSourceModelProvider());
-			case MetadataPackage.MODEL__CURRENT_MODEL_CONTEXT:
-				return CURRENT_MODEL_CONTEXT_EDEFAULT == null ? getCurrentModelContext() != null : !CURRENT_MODEL_CONTEXT_EDEFAULT.equals(getCurrentModelContext());
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //ModelImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/TraitImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/TraitImpl.java
deleted file mode 100644
index 01f3d1f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/TraitImpl.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TraitImpl.java,v 1.5 2007/06/11 20:55:58 gkessler Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.common.metadata.MetadataPackage;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.query.ITraitVisitor;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Trait</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link com.foo.model.metadata.impl.TraitImpl#getType <em>Type</em>}</li>
- *   <li>{@link com.foo.model.metadata.impl.TraitImpl#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-/**
- * @author Owner
- *
- */
-public class TraitImpl extends EObjectImpl implements Trait {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected EObject value = null;
-
-	/**
-	 * The default value of the '{@link #getSourceModelProvider() <em>Source Model Provider</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSourceModelProvider()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final IMetaDataSourceModelProvider SOURCE_MODEL_PROVIDER_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getSourceModelProvider() <em>Source Model Provider</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSourceModelProvider()
-	 * @generated
-	 * @ordered
-	 */
-	protected IMetaDataSourceModelProvider sourceModelProvider = SOURCE_MODEL_PROVIDER_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TraitImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MetadataPackage.Literals.TRAIT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject getValue() {
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param newValue 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * @generated
-	 */
-	public NotificationChain basicSetValue(EObject newValue, NotificationChain msgs) {
-		EObject oldValue = value;
-		value = newValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MetadataPackage.TRAIT__VALUE, oldValue, newValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(EObject newValue) {
-		if (newValue != value) {
-			NotificationChain msgs = null;
-			if (value != null)
-				msgs = ((InternalEObject)value).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MetadataPackage.TRAIT__VALUE, null, msgs);
-			if (newValue != null)
-				msgs = ((InternalEObject)newValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MetadataPackage.TRAIT__VALUE, null, msgs);
-			msgs = basicSetValue(newValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MetadataPackage.TRAIT__VALUE, newValue, newValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IMetaDataSourceModelProvider getSourceModelProvider() {
-		return sourceModelProvider;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSourceModelProvider(IMetaDataSourceModelProvider newSourceModelProvider) {
-		IMetaDataSourceModelProvider oldSourceModelProvider = sourceModelProvider;
-		sourceModelProvider = newSourceModelProvider;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MetadataPackage.TRAIT__SOURCE_MODEL_PROVIDER, oldSourceModelProvider, sourceModelProvider));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MetadataPackage.TRAIT__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public void accept(ITraitVisitor visitor) {
-		visitor.visit(this);
-		visitor.visitCompleted(this);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case MetadataPackage.TRAIT__VALUE:
-				return basicSetValue(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case MetadataPackage.TRAIT__ID:
-				return getId();
-			case MetadataPackage.TRAIT__VALUE:
-				return getValue();
-			case MetadataPackage.TRAIT__SOURCE_MODEL_PROVIDER:
-				return getSourceModelProvider();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case MetadataPackage.TRAIT__ID:
-				setId((String)newValue);
-				return;
-			case MetadataPackage.TRAIT__VALUE:
-				setValue((EObject)newValue);
-				return;
-			case MetadataPackage.TRAIT__SOURCE_MODEL_PROVIDER:
-				setSourceModelProvider((IMetaDataSourceModelProvider)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case MetadataPackage.TRAIT__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case MetadataPackage.TRAIT__VALUE:
-				setValue((EObject)null);
-				return;
-			case MetadataPackage.TRAIT__SOURCE_MODEL_PROVIDER:
-				setSourceModelProvider(SOURCE_MODEL_PROVIDER_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case MetadataPackage.TRAIT__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case MetadataPackage.TRAIT__VALUE:
-				return value != null;
-			case MetadataPackage.TRAIT__SOURCE_MODEL_PROVIDER:
-				return SOURCE_MODEL_PROVIDER_EDEFAULT == null ? sourceModelProvider != null : !SOURCE_MODEL_PROVIDER_EDEFAULT.equals(sourceModelProvider);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: ");
-		result.append(id);
-		result.append(", sourceModelProvider: ");
-		result.append(sourceModelProvider);
-		result.append(')');
-		return result.toString();
-	}
-
-	public boolean equals(@SuppressWarnings("hiding")Object value){
-		if (!(value instanceof String))
-			return super.equals(value);
-		
-		String key = (String)value;
-		if (key.equals(getId()))
-			return true;
-		
-		return false;
-	}
-} //TraitImpl
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/messages.properties
deleted file mode 100644
index 5e9fd47..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/messages.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-
-MissingResource_exception=MissingResourceException for NLSPropertyValue: {0} 
-Key_not_found=(key not found)
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataAdapterFactory.java
deleted file mode 100644
index 81b5e28..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataAdapterFactory.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MetadataAdapterFactory.java,v 1.4 2007/04/16 19:54:01 itrimble Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.internal.util;
-
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.EntityGroup;
-import org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup;
-import org.eclipse.jst.jsf.common.metadata.MetadataPackage;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-
-
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage
- * @generated
- */
-public class MetadataAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static MetadataPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MetadataAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = MetadataPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Returns whether this factory is applicable for the type of the object.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-	 * <!-- end-user-doc -->
-	 * @return whether this factory is applicable for the type of the object.
-	 * @generated
-	 */
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject)object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch the delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MetadataSwitch modelSwitch =
-		new MetadataSwitch() {
-			public Object caseModel(Model object) {
-				return createModelAdapter();
-			}
-			public Object caseEntityGroup(EntityGroup object) {
-				return createEntityGroupAdapter();
-			}
-			public Object caseEntity(Entity object) {
-				return createEntityAdapter();
-			}
-			public Object caseTrait(Trait object) {
-				return createTraitAdapter();
-			}
-			public Object caseIncludeEntityGroup(IncludeEntityGroup object) {
-				return createIncludeEntityGroupAdapter();
-			}
-			public Object defaultCase(EObject object) {
-				return createEObjectAdapter();
-			}
-		};
-
-	/**
-	 * Creates an adapter for the <code>target</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param target the object to adapt.
-	 * @return the adapter for the <code>target</code>.
-	 * @generated
-	 */
-	public Adapter createAdapter(Notifier target) {
-		return (Adapter)modelSwitch.doSwitch((EObject)target);
-	}
-
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.common.metadata.Trait <em>Trait</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.common.metadata.Trait
-	 * @generated
-	 */
-	public Adapter createTraitAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup <em>Include Entity Group</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup
-	 * @generated
-	 */
-	public Adapter createIncludeEntityGroupAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.common.metadata.Model <em>Model</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.common.metadata.Model
-	 * @generated
-	 */
-	public Adapter createModelAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.common.metadata.Entity <em>Entity</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.common.metadata.Entity
-	 * @generated
-	 */
-	public Adapter createEntityAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.common.metadata.EntityGroup <em>Entity Group</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.common.metadata.EntityGroup
-	 * @generated
-	 */
-	public Adapter createEntityGroupAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for the default case.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createEObjectAdapter() {
-		return null;
-	}
-
-} //MetadataAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataResourceFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataResourceFactoryImpl.java
deleted file mode 100644
index e365a03..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataResourceFactoryImpl.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MetadataResourceFactoryImpl.java,v 1.2 2007/01/24 17:22:46 gkessler Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.internal.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource Factory</b> associated with the package.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.common.metadata.internal.util.MetadataResourceImpl
- * @generated
- */
-public class MetadataResourceFactoryImpl extends ResourceFactoryImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Creates an instance of the resource factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MetadataResourceFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * Creates an instance of the resource.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Resource createResource(URI uri) {
-		XMLResource result = new MetadataResourceImpl(uri);
-		result.getDefaultSaveOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-		result.getDefaultLoadOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-
-		result.getDefaultSaveOptions().put(XMLResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE);
-
-		result.getDefaultLoadOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
-		result.getDefaultSaveOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
-
-		result.getDefaultLoadOptions().put(XMLResource.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);
-		return result;
-	}
-
-} //MetadataResourceFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataResourceImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataResourceImpl.java
deleted file mode 100644
index a82e0da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataResourceImpl.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MetadataResourceImpl.java,v 1.7 2007/05/11 17:54:56 gkessler Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.internal.util;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Map;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.xmi.XMLHelper;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.MetadataPackage;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource </b> associated with the package.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.common.metadata.internal.util.MetadataResourceFactoryImpl
- * @generated NOT
- */
-public class MetadataResourceImpl extends XMLResourceImpl implements XMLResource.ResourceHandler {
-	
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Oracle inc.";
-	
-	/**
-	 * IMetaDataSourceModelProvider
-	 */
-	protected IMetaDataSourceModelProvider _provider;
-	/**
-	 * Creates an instance of the resource.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param uri the URI of the new resource.
-	 * @generated
-	 */
-	public MetadataResourceImpl(URI uri) {
-		super(uri);
-	}
-
-	/**
-	 * Constructor
-	 */
-	public MetadataResourceImpl() {
-		super();
-	}
-
-
-	/**
-	 * Constructorb
-	 * @param provider
-	 */
-	public MetadataResourceImpl(IMetaDataSourceModelProvider provider){
-		super();
-		_provider = provider;
-	}
-	/**
-	* Override createXMLHelper so that MetadataPackage.eINSTANCE is used for the NoNamespace package
-	* @generated NOT
-	*/
-	protected XMLHelper createXMLHelper() {
-		return new XMLHelperImpl(){
-			public EPackage getNoNamespacePackage() {
-				return MetadataPackage.eINSTANCE;
-			}
-		};
-	}
-	
-	public void postLoad(XMLResource resource, InputStream inputStream,
-			Map options) {
-		Object aRoot = resource.getContents().get(0);
-		if (aRoot != null && aRoot instanceof Model){			
-			setModelKeyInTraits((Model)aRoot, (Model)aRoot);
-		}
-	}
-
-	private void setModelKeyInTraits(Model root, Entity currentEntity) {
-		// TODO: does this have side effect that we care about? nothing is done with the return value
-	    MetadataPackage.eINSTANCE.getTrait_SourceModelProvider();
-		for (int i=0;i < currentEntity.getTraits().size();i++){
-			((Trait)currentEntity.getTraits().get(i)).setSourceModelProvider(_provider);
-		}
-		for (int j=0;j < currentEntity.getChildEntities().size();j++){
-			setModelKeyInTraits(root,(Entity)currentEntity.getChildEntities().get(j));
-		}
-		
-		if (currentEntity == root){
-			for (int k=0;k < root.getEntityGroups().size();k++){
-				setModelKeyInTraits(root,(Entity)root.getEntityGroups().get(k));
-			}
-		}
-	}
-
-
-	public void postSave(XMLResource resource, OutputStream outputStream,
-			Map options) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public void preLoad(XMLResource resource, InputStream inputStream,
-			Map options) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public void preSave(XMLResource resource, OutputStream outputStream,
-			Map options) {
-		// TODO Auto-generated method stub
-		
-	}
-
-} //MetadataResourceImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataSwitch.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataSwitch.java
deleted file mode 100644
index 39efb15..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataSwitch.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MetadataSwitch.java,v 1.5 2007/05/11 17:54:56 gkessler Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.internal.util;
-
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.EntityGroup;
-import org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup;
-import org.eclipse.jst.jsf.common.metadata.MetadataPackage;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-
-
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.common.metadata.MetadataPackage
- * @generated
- */
-public class MetadataSwitch {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static MetadataPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MetadataSwitch() {
-		if (modelPackage == null) {
-			modelPackage = MetadataPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param theEObject 
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	public Object doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param theEClass 
-	 * @param theEObject 
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-		else {
-			List eSuperTypes = theEClass.getESuperTypes();
-			return
-				eSuperTypes.isEmpty() ?
-					defaultCase(theEObject) :
-					doSwitch((EClass)eSuperTypes.get(0), theEObject);
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param classifierID 
-	 * @param theEObject 
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected Object doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-			case MetadataPackage.MODEL: {
-				Model model = (Model)theEObject;
-				Object result = caseModel(model);
-				if (result == null) result = caseEntity(model);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MetadataPackage.ENTITY_GROUP: {
-				EntityGroup entityGroup = (EntityGroup)theEObject;
-				Object result = caseEntityGroup(entityGroup);
-				if (result == null) result = caseEntity(entityGroup);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MetadataPackage.ENTITY: {
-				Entity entity = (Entity)theEObject;
-				Object result = caseEntity(entity);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MetadataPackage.TRAIT: {
-				Trait trait = (Trait)theEObject;
-				Object result = caseTrait(trait);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MetadataPackage.INCLUDE_ENTITY_GROUP: {
-				IncludeEntityGroup includeEntityGroup = (IncludeEntityGroup)theEObject;
-				Object result = caseIncludeEntityGroup(includeEntityGroup);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			default: return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Trait</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Trait</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTrait(Trait object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Include Entity Group</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Include Entity Group</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseIncludeEntityGroup(IncludeEntityGroup object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Model</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Model</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseModel(Model object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Entity</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Entity</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseEntity(Entity object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Entity Group</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Entity Group</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseEntityGroup(EntityGroup object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>EObject</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch, but this is the last case anyway.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-	public Object defaultCase(EObject object) {
-		return null;
-	}
-
-} //MetadataSwitch
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataXMLProcessor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataXMLProcessor.java
deleted file mode 100644
index 39a9791..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataXMLProcessor.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MetadataXMLProcessor.java,v 1.3 2007/04/16 19:54:01 itrimble Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.internal.util;
-
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.xmi.util.XMLProcessor;
-import org.eclipse.jst.jsf.common.metadata.MetadataPackage;
-
-
-/**
- * This class contains helper methods to serialize and deserialize XML documents
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class MetadataXMLProcessor extends XMLProcessor {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-
-	/**
-	 * Public constructor to instantiate the helper.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MetadataXMLProcessor() {
-		super((EPackage.Registry.INSTANCE));
-		MetadataPackage.eINSTANCE.eClass();
-	}
-	
-	/**
-	 * Register for "*" and "xml" file extensions the MetadataResourceFactoryImpl factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Map getRegistrations() {
-		if (registrations == null) {
-			super.getRegistrations();
-			registrations.put(XML_EXTENSION, new MetadataResourceFactoryImpl());
-			registrations.put(STAR_EXTENSION, new MetadataResourceFactoryImpl());
-		}
-		return registrations;
-	}
-
-} //MetadataXMLProcessor
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/package-info.java
deleted file mode 100644
index 836883f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/package-info.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * EMF interface objects for design-time metadata.   
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.common.metadata;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractEntityQueryVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractEntityQueryVisitor.java
deleted file mode 100644
index 282b639..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractEntityQueryVisitor.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.metadata.query;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-
-/**
- * Abstract class implmenting {@link IEntityQueryVisitor} that concrete subclasses should provide implementations
- * <p><b>Provisional API - subject to change</b></p>
- */
-public abstract class AbstractEntityQueryVisitor extends AbstractEntityVisitor
-		implements IEntityQueryVisitor {
-
-	/** 
-	 * @return EmptyResultSet.   Subclasses should override.
-	 */
-	public IResultSet findEntities(Entity initialEntityContext, String entityKey) {
-		return new EmptyResultSet();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractEntityVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractEntityVisitor.java
deleted file mode 100644
index 54e6f01..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractEntityVisitor.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.metadata.query;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-
-/**
- * Abstract implementation that concrete subclasses should ovveride
- * <p><b>Provisional API - subject to change</b></p>
- */
-public abstract class AbstractEntityVisitor extends AbstractMetaDataVisitor
-		implements IEntityVisitor {
-
-	public abstract void visit(Entity entity);
-
-	public void visitCompleted(Entity entity){
-		//subclasses should override if needed
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractMetaDataVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractMetaDataVisitor.java
deleted file mode 100644
index 15443e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractMetaDataVisitor.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.metadata.query;
-
-/**
- * Abstract class implementing {@link IMetaDataVisitor}
- * <p><b>Provisional API - subject to change</b></p>
- */
-public abstract class AbstractMetaDataVisitor implements IMetaDataVisitor {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.query.IMetaDataVisitor#stopVisiting()
-	 */
-	public boolean stopVisiting() {		
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractResultSet.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractResultSet.java
deleted file mode 100644
index e459d7c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractResultSet.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.metadata.query;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Abstract implementation of {@link IResultSet} that developers may subclass.
- * Users should assume that the results are only valid at the time of the query.  This may change in the future.
- * <p><b>Provisional API - subject to change</b></p>
- */
-public abstract class AbstractResultSet/*<T>*/ implements IResultSet/*<T>*/ {
-	private List		_results;
-	private boolean 	_isClosed = false;
-	
-	public List getResults() throws MetaDataException {
-		initIfNecessary();
-		return _results;
-	}
-	
-	public final void close() throws MetaDataException {
-		doClose();
-		_isClosed = true;
-		_results = null;
-	}
-
-	/**
-	 * Overridable method to close resultset.  This is called by close()
-	 * @throws MetaDataException
-	 */
-	@SuppressWarnings("unused")
-	protected void doClose() throws MetaDataException {
-		//subclasses to provide override
-	}
-	
-	public final boolean isClosed() {		
-		return _isClosed;
-	}
-
-	/**
-	 * @return List of results.  Null is tolerated.
-	 */
-	protected abstract List getInternalResults();
-	
-	private void initIfNecessary() throws MetaDataException {
-		if (_isClosed)
-			throw new MetaDataException("Attempt to access a closed resultset.");
-		
-		if (_results == null) {
-			List checkNullResults = getInternalResults();
-			if (checkNullResults == null){
-				checkNullResults = Collections.EMPTY_LIST;
-			} 
-			_results = Collections.unmodifiableList(checkNullResults);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractTraitQueryVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractTraitQueryVisitor.java
deleted file mode 100644
index ddb8940..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractTraitQueryVisitor.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.metadata.query;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-
-/**
- * Abstract implmentation of {@link ITraitQueryVisitor} that subclasses should use to provide implmentation
- * <p><b>Provisional API - subject to change</b></p> 
- */
-public abstract class AbstractTraitQueryVisitor extends AbstractTraitVisitor implements
-		ITraitQueryVisitor {
-
-	/** 
-	 * @return EmptyResultSet.   Subclasses should override.
-	 */
-	public IResultSet findTraits(Entity entity, String traitKey) {
-		return new EmptyResultSet();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractTraitVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractTraitVisitor.java
deleted file mode 100644
index 795a473..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/AbstractTraitVisitor.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.metadata.query;
-
-import org.eclipse.jst.jsf.common.metadata.Trait;
-
-/**
- * Abstract Trait visitor
- * <p><b>Provisional API - subject to change</b></p>
- */
-public abstract class AbstractTraitVisitor extends AbstractMetaDataVisitor implements ITraitVisitor{
-
-	public abstract void visit(final Trait trait); 
-	
-	public void visitCompleted(final Trait trait) {
-		//subclasses should override if needed
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/EmptyResultSet.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/EmptyResultSet.java
deleted file mode 100644
index 0c6539e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/EmptyResultSet.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.metadata.query;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Implementation of an empty result set
- * <p><b>Provisional API - subject to change</b></p>
- */
-public final class EmptyResultSet implements IResultSet {
-	private boolean _isClosed = false;
-	public void close() {
-		_isClosed = true;
-	}
-	
-	public List getResults() throws MetaDataException{
-		if (_isClosed)
-			throw new MetaDataException("Resultset is closed");
-		
-		return Collections.EMPTY_LIST;		
-	}
-
-	public boolean isClosed() {
-		return _isClosed;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IEntityQueryVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IEntityQueryVisitor.java
deleted file mode 100644
index 7f168c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IEntityQueryVisitor.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.query;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-
-/**
- * Entity querying interface
- * <p>NOT to implemented by clients directly.   Clients should subclass AbstractEntityQueryVisitor instead.
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface IEntityQueryVisitor extends IEntityVisitor{
-	/**
-	 * @param initialEntityContext
-	 * @param entityKey to find relative to the passed intialEntityContext
-	 * @return IResultSet of Entities matching the key.  IResultSet must NOT be null.  Implementers may return {@link EmptyResultSet}.
-	 */
-	public IResultSet/*<Entity>*/ findEntities(final Entity initialEntityContext,
-			final String entityKey);
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IEntityVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IEntityVisitor.java
deleted file mode 100644
index fcc1783..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IEntityVisitor.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.query;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-
-/**
- * Visitor interface for Entities
- * <p>NOT to implemented by clients directly.   Clients should subclass AbstractEntityVisitor instead.
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface IEntityVisitor extends IMetaDataVisitor {
-	/**
-	 * Visit the entity. 
-	 * The entity and then it's children are visited
-	 * @param entity - must not be NULL
-	 */
-	public void visit(final Entity entity);
-	/**
-	 * Signal that the entity and all it's children is now completely 'visited'.  
-	 * The entity will call this method at the end of the accept method.
-	 * @param entity - must not be NULL
-	 */
-	public void visitCompleted(Entity entity);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IMetaDataModelContext.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IMetaDataModelContext.java
deleted file mode 100644
index c70cdd9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IMetaDataModelContext.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.query;
-
-import org.eclipse.jst.jsf.context.IModelContext;
-
-/**
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface IMetaDataModelContext extends IModelContext {
-	/**
-	 * @return domain identifier for this context.  
-	 * <p>This must match the domain id from the org.eclipse.jst.jsf.common.DomainLoadingStrategies
-	 */
-	public String getDomainID();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IMetaDataVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IMetaDataVisitor.java
deleted file mode 100644
index 35a3652..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IMetaDataVisitor.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.query;
-
-/**
- * Common interface for Entity and Trait visitors
- * <p>NOT to implemented by clients directly.   Clients should subclass AbstractMetaDataVisitor instead.
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface IMetaDataVisitor {
-	/**
-	 * @return true if visitor has recognized that visiting should stop
-	 */
-	public boolean stopVisiting();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IResultSet.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IResultSet.java
deleted file mode 100644
index 0d0ab48..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/IResultSet.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.query;
-
-import java.util.List;
-
-
-
-/**
- * Results from a metadata query.  The resultset should be considered valid only at the time that the query is performed.
- * Once "closed", the resultset should not be accessed again. 
- * 
- * <p>Not intended to be implemented directly by clients.  Developers should extend {@link AbstractResultSet} instead.
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface IResultSet/*<T>*/{
-	
-	/**
-	 * @return unmodifiable List of results.  May NOT be null.  Implementer must return Collections.EMPTY_LIST instead.
-	 * @throws MetaDataException 
-	 */
-	public List/*<T>*/ getResults() throws MetaDataException;
-
-	/**
-	 * Signal that the query results are no longer required allowing for any cleanup that may be required
-	 * Once a resultset is closed, a MetaDataException should be thrown if the next() or hasNext() is called.  Clients can check isClosed() first.
-	 * @throws MetaDataException 
-	 */
-	public void close() throws MetaDataException;
-	
-	/**
-	 * @return true if this resultset has been closed. 
-	 */
-	public boolean isClosed();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/ITaglibDomainMetaDataModelContext.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/ITaglibDomainMetaDataModelContext.java
deleted file mode 100644
index 17595f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/ITaglibDomainMetaDataModelContext.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.query;
-
-import org.eclipse.core.resources.IProject;
-
-/**
- * Context for determining the Model to locate in the MetaDataManager
- * <p>Should NOT be implemented by clients
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface ITaglibDomainMetaDataModelContext extends IMetaDataModelContext {
-	/**
-	 * @return project 
-	 */
-	public IProject getProject();
-	/**
-	 * @return the namespace URI as String
-	 */
-	public String getURI();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/ITraitQueryVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/ITraitQueryVisitor.java
deleted file mode 100644
index fd96a37..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/ITraitQueryVisitor.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.query;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-
-/**
- * Trait querying interface
- * <p>NOT to implemented by clients directly.   Clients should subclass AbstractTraitQueryVisitor instead.
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface ITraitQueryVisitor extends ITraitVisitor{
-	/**
-	 * @param entity
-	 * @param traitKey
-	 * @return IResultSet of Traits.  IResultSet must NOT be null.  Implementers may return {@link EmptyResultSet}.
-	 */
-	public IResultSet/*<Trait>*/ findTraits(final Entity entity,
-			final String traitKey);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/ITraitVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/ITraitVisitor.java
deleted file mode 100644
index 9b39a10..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/ITraitVisitor.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.query;
-
-import org.eclipse.jst.jsf.common.metadata.Trait;
-
-/**
- * Visitor interface for Traits
- * <p>NOT to implemented by clients directly.   Clients should subclass AbstractTraitVisitor instead.
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface ITraitVisitor extends IMetaDataVisitor {
-	/**
-	 * Visit the Trait.
-	 * Implementer cannot assume ordering of trait visiting. 
-	 * @param trait - must not be null
- 	 */
-	public void visit(final Trait trait);
-	
-	/**
-	 * Signal that the the trait has been completely visited
-	 * @param trait
-	 */
-	public void visitCompleted(final Trait trait);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/MetaDataException.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/MetaDataException.java
deleted file mode 100644
index 50b314f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/MetaDataException.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.metadata.query;
-
-/**
- * Exception intended to be superclass of all exceptions thrown while handling metadata during query
- * <p><b>Provisional API - subject to change</b></p>
- */
-public class MetaDataException extends Exception {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	
-	/**
-	 * Constructor
-	 */
-	public MetaDataException(){
-		super();
-	}
-	/**
-	 * Constructor
-	 * @param msg
-	 */
-	public MetaDataException(String msg){
-		super(msg);
-	}
-	
-	/**
-	 * Constructor
-	 * @param msg
-	 * @param cause 
-	 */
-	public MetaDataException(String msg, Throwable cause){
-		super(msg, cause);
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/TaglibDomainMetaDataQueryHelper.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/TaglibDomainMetaDataQueryHelper.java
deleted file mode 100644
index 582db6d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/TaglibDomainMetaDataQueryHelper.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.query;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.MetaDataModel;
-import org.eclipse.jst.jsf.common.metadata.internal.TaglibDomainMetaDataModelContextImpl;
-import org.eclipse.jst.jsf.common.metadata.internal.MetaDataModelManager;
-import org.eclipse.jst.jsf.common.metadata.query.internal.SimpleEntityQueryVisitorImpl;
-import org.eclipse.jst.jsf.common.metadata.query.internal.SimpleTraitQueryVisitorImpl;
-import org.eclipse.jst.jsf.common.metadata.query.internal.HierarchicalSearchControl;
-
-
-/**
- * Helper class with static methods to simplify querying of a metadata model. 
- * 
- * <p>Steps for use:
- * 	<br>1) Get the ITaglibDomainMetaDataModelContext using createMetaDataModelContext or createTagLibraryDomainMetaDataModelContext
- * 	<br>2) Use appropriate getXXX methods using the ITaglibDomainMetaDataModelContext.
- * <p><b>Provisional API - subject to change</b></p>
- * @see IResultSet
- * @see IEntityQueryVisitor
- * @see ITraitQueryVisitor
- * @see ITaglibDomainMetaDataModelContext
- * @see Model
- * @see Entity
- * @see Trait
- */
-public final class TaglibDomainMetaDataQueryHelper{
-	/**
-	 * Domain id for Tag library domain of metatdata  
-	 */
-	public static final String TAGLIB_DOMAIN = "TagLibraryDomain"; //need better place for this
-	
-	/**
-	 * private constructor
-	 */
-	private TaglibDomainMetaDataQueryHelper (){
-		super();
-	}
-	
-	/**
-	 * Convenience method for creating {@link ITaglibDomainMetaDataModelContext}s for TAGLIB_DOMAIN
-	 * @param project
-	 * @param uri
-	 * @return ITaglibDomainMetaDataModelContext
-	 */
-	public static ITaglibDomainMetaDataModelContext createMetaDataModelContext(IProject project, String uri){
-		return new TaglibDomainMetaDataModelContextImpl(TAGLIB_DOMAIN, project, uri);
-	}
-	/**
-	 * @param modelContext
-	 * @return Model object for given context.   May return null if not located.
-	 */
-	public static Model getModel(final ITaglibDomainMetaDataModelContext modelContext) {
-		MetaDataModel model = getMDModel(modelContext);
-		//we may want to throw error that model is empty
-		if (model != null && !model.isEmpty()){			
-			return (Model)model.getRoot();
-		}
-		return null;
-	}
-
-	/**
-	 * @param modelContext
-	 * @param entityKey relative to root of the model
-	 * @return the first entity match from the root of the model.   May return null.
-	 */
-	public static Entity getEntity(final ITaglibDomainMetaDataModelContext modelContext,
-			final String entityKey) {
-		IEntityQueryVisitor visitor = new SimpleEntityQueryVisitorImpl(new HierarchicalSearchControl(1, HierarchicalSearchControl.SCOPE_ALL_LEVELS));
-		IResultSet/*<Entity>*/ rs = getEntities(modelContext,entityKey,  visitor);
-		Entity e = null;
-		try {
-			if (! rs.getResults().isEmpty()){
-				e = (Entity)rs.getResults().get(0);				
-			}
-			rs.close();
-		} catch (MetaDataException ex) {
-			JSFCommonPlugin.log(IStatus.ERROR, "Error in Helper.getEntity() - 1", ex);
-		}
-
-		return e;
-	}
-
-	/**
-	 * @param modelContext 
-	 * @param entityKey relative to root of model 
-	 * @param visitor 
-	 * @return an IResultSet of entity objects
-	 */
-	public static IResultSet/*<Entity>*/ getEntities(final ITaglibDomainMetaDataModelContext modelContext,
-				final String entityKey, final IEntityQueryVisitor visitor){
-		Model model = getModel(modelContext);
-		//we may want to throw error that model is empty
-		return getEntities(model, entityKey, visitor);
-		
-	}
-
-	/**
-	 * @param entity
-	 * @param traitKey
-	 * @return a trait or null for the given entity and traitKey using a SimpleEntityQueryVisitorImpl 
-	 */
-	public static Trait getTrait(final Entity entity, final String traitKey){
-		ITraitQueryVisitor visitor = new SimpleTraitQueryVisitorImpl();	
-		Trait t= null;
-		IResultSet/*<Trait>*/ rs = getTraits(entity, traitKey, visitor);
-		try {
-			if (! rs.getResults().isEmpty()){
-				t = (Trait)rs.getResults().get(0);				
-			}
-			rs.close();
-		} catch (MetaDataException ex) {
-			JSFCommonPlugin.log(IStatus.ERROR, "Error in Helper.getTrait()", ex);
-		}
-
-		return t;
-	}
-
-	/**
-	 * @param entity
-	 * @param traitKey
-	 * @param traitQueryVisitor
-	 * @return an IResultSet of trait objects using supplied traitQueryVisitor.  IResultSet should NOT be null.
-	 */
-	public static IResultSet/*<Trait>*/ getTraits(Entity entity, String traitKey,
-			ITraitQueryVisitor traitQueryVisitor) { 
-		IResultSet/*<Trait>*/ rs = traitQueryVisitor.findTraits(entity, traitKey);
-		return rs;
-	}
-
-	/**
-	 * @param initialEntityContext
-	 * @param entityKey relative to initial passed entity
-	 * @return the first entity located by key using SimpleEntityQueryVisitorImpl
-	 */
-	public static Entity getEntity(Entity initialEntityContext, String entityKey) {
-		IEntityQueryVisitor visitor = new SimpleEntityQueryVisitorImpl(new HierarchicalSearchControl(1, HierarchicalSearchControl.SCOPE_ALL_LEVELS));
-		Entity e= null;
-		IResultSet/*<Entity>*/ rs = getEntities(initialEntityContext, entityKey, visitor);
-		try {
-			if (! rs.getResults().isEmpty()){
-				e = (Entity)rs.getResults().get(0);				
-			}
-			rs.close();
-		} catch (MetaDataException ex) {
-			JSFCommonPlugin.log(IStatus.ERROR, "Error in Helper.getEntity() - 0", ex);
-		}		
-
-		return e;		
-	}
-
-	/**
-	 * @param initialEntityContext
-	 * @param entityQuery relative to initial passed entity
-	 * @param entityKeyQueryVisitor
-	 * @return IResultSet of entities located by key using entityQueryVisitor.  IResultSet should NOT be null.
-	 */
-	public static IResultSet/*<Entity>*/ getEntities(Entity initialEntityContext, String entityQuery,
-			IEntityQueryVisitor entityKeyQueryVisitor) {
-				
-		return entityKeyQueryVisitor.findEntities(initialEntityContext, entityQuery);	
-	}
-
-	
-	/**
-	 * Retrieve the MetaDataModel from the ModelManager for given key
-	 * @param modelContext
-	 * @return MetaDataModel
-	 */
-	private static MetaDataModel getMDModel(final ITaglibDomainMetaDataModelContext modelContext){
-		MetaDataModelManager mgr = null;
-		if (modelContext.getProject() != null)
-			mgr = MetaDataModelManager.getInstance(modelContext.getProject());
-		else //temp(?)
-			mgr = MetaDataModelManager.getSharedInstance();	
-		
-		return mgr.getModel(modelContext);
-	}
-
-	/**
-	 * @param modelContext
-	 * @param entityKey
-	 * @param traitKey
-	 * @return first trait found for entity and trait key starting from root of the model using SimpleMetaDataQueryImpl
-	 */
-	public static Trait getTrait(final ITaglibDomainMetaDataModelContext modelContext,
-			final String entityKey, final String traitKey) { 
-		Entity entity = getEntity(modelContext, entityKey);
-		Trait t = null;
-		if (entity != null){			
-			t = getTrait(entity, traitKey);
-		}
-		return t;
-	}	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/HierarchicalSearchControl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/HierarchicalSearchControl.java
deleted file mode 100644
index 36d446e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/HierarchicalSearchControl.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.metadata.query.internal;
-
-/**
- * Sets controls on how a tree of nodes can be searched
- */
-public class HierarchicalSearchControl extends SearchControl {
-	//scope levels
-	/**
-	 * Do not recurse.  
-	 */
-	public static final int SCOPE_CURRENT_LEVEL = 0;
-	/**
-	 * Allow for one level of children to be visited from initial context
-	 */
-	public static final int SCOPE_ONE_LEVEL = 1;
-	/**
-	 * Allow unlimited recursion of children
-	 */
-	public static final int SCOPE_ALL_LEVELS = 2;
-	
-	private int scope = SCOPE_ALL_LEVELS;
-	
-	/**
-	 * Constructor using defaults of COUNT_LIMIT_NONE and SCOPE_ALL_LEVELS 
-	 */
-	public HierarchicalSearchControl(){
-		super();
-	}
-	/**
-	 * Constructor
-	 * @param countLimit
-	 * @param scope
-	 */
-	public HierarchicalSearchControl(int countLimit, int scope){
-		super(countLimit);
-		this.scope = scope;
-	}
-	
-	
-	/**
-	 * @param scope
-	 */
-	public void setScope(int scope){
-		this.scope= scope;
-	}
-	
-	/**
-	 * @return scope
-	 */
-	public int getScope(){
-		return scope;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SearchControl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SearchControl.java
deleted file mode 100644
index 43e1317..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SearchControl.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.query.internal;
-
-/**
- * Simple class used by {@link SimpleEntityQueryVisitorImpl} allowing some control of a metadata query.  
- * A query visitor can use this to optimize the query results and signal completion.
- */
-public class SearchControl {	
-
-	/**
-	 * No limit on query results
-	 */
-	public static final int COUNT_LIMIT_NONE = -1;
-	
-	//default settings
-	private int countLimit = COUNT_LIMIT_NONE;
-
-	
-	/**
-	 * Constructor using defaults of COUNT_LIMIT_NONE
-	 */
-	public SearchControl(){
-		//use default settings
-	}
-	
-	/**
-	 * Constructor
-	 * @param countLimit
-	 */
-	public SearchControl(int countLimit){
-		this.countLimit = countLimit;
-	}
-	
-	/**
-	 * @param limit results count limit
-	 */
-	public void setCountLimit(int limit){
-		this.countLimit = limit;
-	}
-	
-	/**
-	 * @return query results count limit
-	 */
-	public int getCountLimit(){
-		return countLimit;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SimpleEntityQueryVisitorImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SimpleEntityQueryVisitorImpl.java
deleted file mode 100644
index 0e260ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SimpleEntityQueryVisitorImpl.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.query.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Stack;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.EntityGroup;
-import org.eclipse.jst.jsf.common.metadata.query.AbstractEntityQueryVisitor;
-import org.eclipse.jst.jsf.common.metadata.query.IEntityQueryVisitor;
-import org.eclipse.jst.jsf.common.metadata.query.IResultSet;
-import org.eclipse.jst.jsf.common.metadata.query.ITraitQueryVisitor;
-
-
-/**
- * A simple metadata query visitor implementing {@link IEntityQueryVisitor} and {@link ITraitQueryVisitor}.
- * - simple find entity and traits by id only 	
- * - Does not allow for wild card searchs
- */
-public class SimpleEntityQueryVisitorImpl extends AbstractEntityQueryVisitor  {
-	private HierarchicalSearchControl control;
-	private boolean _stop;
-
-	private EntityQueryComparator entityComparator;
-	private List/*<Entity>*/ _entityResults;
-
-	/**
-	 * Constructor that also creates a default SearchControl
-	 */
-	public SimpleEntityQueryVisitorImpl() {
-		super();
-		control = new HierarchicalSearchControl();
-	}
-	
-	/**
-	 * Constructor
-	 * @param control
-	 */
-	public SimpleEntityQueryVisitorImpl(HierarchicalSearchControl control) {
-		super();
-		this.control = control;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.query.IEntityQueryVisitor#findEntities(org.eclipse.jst.jsf.common.metadata.Entity, java.lang.String)
-	 */
-	public IResultSet/*<Entity>*/ findEntities(Entity initialEntityContext,
-			String entityKey) {
-		
-		resetQuery();
-		
-		if (initialEntityContext != null){
-			entityComparator = new EntityQueryComparator(entityKey);			
-			initialEntityContext.accept(this);			
-		}
-		
-		return new SimpleResultSet(getInternalEntityResults());
-	}
-
-	private void resetQuery() {
-		_stop = false;
-		_entityResults = null;
-	}
-
-	private List/*<Entity>*/ getInternalEntityResults(){
-		if (_entityResults == null){
-			_entityResults = new ArrayList/*<Entity>*/();
-		}
-		return _entityResults;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor#visit(org.eclipse.jst.jsf.common.metadata.Entity)
-	 */
-	public void visit(Entity key) {		
-		switch (entityComparator.compareTo(key)){
-			case 0:
-				getInternalEntityResults().add(key);
-				break;
-			default:
-				break;
-
-		}
-		checkShouldStopVisitingEntities();
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.query.IEntityVisitor#visitCompleted(Entity entity)
-	 */
-	public void visitCompleted(Entity entity) {
-		entityComparator.popContext();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.query.IMetaDataVisitor#stopVisiting()
-	 */
-	public boolean stopVisiting() {
-		return _stop;
-	}
-
-	private void checkShouldStopVisitingEntities(){
-		//implement how to set stop to signal to the entity accept() to skip visiting
-		if (control.getCountLimit()== getInternalEntityResults().size() && control.getCountLimit() != SearchControl.COUNT_LIMIT_NONE )
-			_stop = true;
-	}
-
-	/**
-	 * Simple comparator that compares that an entity's id for with another
-	 */
-	private class EntityQueryComparator implements Comparable/*<Entity>*/{
-
-		private String entityKey;
-		private EntityStack stack;
-
-		/**
-		 * Constructor
-		 * @param entityKey
-		 */
-		public EntityQueryComparator(String entityKey){
-			this.entityKey = entityKey;		
-			stack = new EntityStack();
-		}
-		
-		public int compareTo(Object entity) {			
-			stack.push(entity);
-			return entityKey.compareTo(getRelativeId());			
-		}
-		
-		/**
-		 * Pop stack
-		 */
-		public void popContext(){
-			stack.pop();
-		}
-		
-		private String getRelativeId(){
-			int size = stack.size();
-			int i = 1;
-			StringBuffer buf = new StringBuffer();
-			while(i < size){
-				Entity e = (Entity)stack.elementAt(i);
-				if (!(e instanceof EntityGroup)){
-					if (buf.length()>0) 
-						buf.append("/");
-					buf.append(e.getId());
-				}
-				i++;
-			}
-			return buf.toString();
-		}
-	}
-	
-	/**
-	 * Stack used for determining relative key of an entity from the initial context.
-	 */
-	private class EntityStack extends Stack/*<Entity>*/ {
-		/**
-         * 
-         */
-        private static final long serialVersionUID = -6010267544968175003L;
-
-        /**
-         * Constructor
-         */
-        public EntityStack(){
-			super();
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SimpleResultSet.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SimpleResultSet.java
deleted file mode 100644
index 7759589..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SimpleResultSet.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.query.internal;
-
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.metadata.query.AbstractResultSet;
-import org.eclipse.jst.jsf.common.metadata.query.IResultSet;
-
-/**
- * Simple implementation of {@link IResultSet} by extending AbstractResultSet
- *
- */
-public final class SimpleResultSet/*<T>*/ extends AbstractResultSet/*<T>*/ {	
-	private List/*<T>*/ results;	
-	
-	/**
-	 * Constructor passing a list to hold the results
-	 * @param results 
-	 */
-	public SimpleResultSet(List/*<T>*/ results){
-		super();
-		this.results = results;
-	}
-
-	protected List getInternalResults(){
-		if (results == null){
-			results = Collections.EMPTY_LIST;
-		}
-		return results;
-	}
-	
-
-}
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SimpleTraitQueryVisitorImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SimpleTraitQueryVisitorImpl.java
deleted file mode 100644
index 41b0e56..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/internal/SimpleTraitQueryVisitorImpl.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.metadata.query.internal;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.query.AbstractTraitQueryVisitor;
-import org.eclipse.jst.jsf.common.metadata.query.IResultSet;
-import org.eclipse.jst.jsf.common.metadata.query.ITraitQueryVisitor;
-
-
-/**
- * A simple metadata query visitor implementing {@link ITraitQueryVisitor}.
- * - simple find traits by id only 	
- * - Does not allow for wild card searchs
- */
-public class SimpleTraitQueryVisitorImpl extends AbstractTraitQueryVisitor  {
-
-	private String _traitQuery;
-	private SearchControl _control;
-	private boolean _stop;
-	private List/*<Trait>*/ _traitResults;
-
-	/**
-	 * Constructor that also creates a default SearchControl
-	 */
-	public SimpleTraitQueryVisitorImpl() {
-		super();
-		_control = new SearchControl();
-	}
-	
-	/**
-	 * Constructor
-	 * @param control
-	 */
-	public SimpleTraitQueryVisitorImpl(SearchControl control) {
-		super();
-		this._control = control;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.query.ITraitQueryVisitor#findTraits(org.eclipse.jst.jsf.common.metadata.Entity, java.lang.String)
-	 */
-	public IResultSet/*<Trait>*/ findTraits(final Entity entity, final String traitQuery){
-		
-		resetQuery();
-		if (entity != null){			
-			this._traitQuery = traitQuery;			
-			for (Iterator/*<Trait>*/ it=entity.getTraits().iterator();it.hasNext();){
-				Trait t = (Trait)it.next();
-				t.accept(this);
-				if (stopVisiting())
-					break;
-			}
-		}
-		return new SimpleResultSet(getInternalTraitResults());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.query.ITraitVisitor#visit(org.eclipse.jst.jsf.common.metadata.Trait)
-	 */
-	public void visit(Trait trait) {		
-		if (trait.equals(_traitQuery))
-			getInternalTraitResults().add(trait);		
-		
-		checkShouldStopVisitingTraits();
-	}
-
-	/**
-	 * 
-	 */
-	private void resetQuery() {
-		_stop = false;
-		_traitResults = null;
-	}
-
-	/**
-	 * @return lazy init of a SimpleResultSet of Traits
-	 */
-	private List/*<Trait>*/ getInternalTraitResults(){
-		if (_traitResults == null){
-			_traitResults = new ArrayList/*<Trait>*/();
-		}
-		return _traitResults;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.query.IMetaDataVisitor#stopVisiting()
-	 */
-	public boolean stopVisiting() {
-		return _stop;
-	}
-
-	private void checkShouldStopVisitingTraits(){
-		if (_control.getCountLimit()== getInternalTraitResults().size() && _control.getCountLimit() != SearchControl.COUNT_LIMIT_NONE)
-			_stop = true;
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/ListOfValues.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/ListOfValues.java
deleted file mode 100644
index 52b3382..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/ListOfValues.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>List Of Values</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.ListOfValues#getEntries <em>Entries</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage#getListOfValues()
- * @model
- * @generated
- */
-public interface ListOfValues extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Entries</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.xml.type.SimpleAnyType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Entries</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Entries</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage#getListOfValues_Entries()
-	 * @model type="org.eclipse.emf.ecore.xml.type.SimpleAnyType" containment="true"
-	 *        extendedMetaData="kind='element' name='item'"
-	 * @generated
-	 */
-	EList getEntries();
-
-} // ListOfValues
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/SetGenerator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/SetGenerator.java
deleted file mode 100644
index 9c4fea7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/SetGenerator.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Set Generator</b></em>'.
- *
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage#getSetGenerator()
- * @model
- * @generated
- */
-public interface SetGenerator extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-    /**
-     * Returns the value of the '<em><b>Algorithm</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Algorithm</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Algorithm</em>' attribute.
-     * @see #setAlgorithm(String)
-     * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage#getSetGenerator_Algorithm()
-     * @model extendedMetaData="kind='element'"
-     * @generated
-     */
-    String getAlgorithm();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator#getAlgorithm <em>Algorithm</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Algorithm</em>' attribute.
-     * @see #getAlgorithm()
-     * @generated
-     */
-    void setAlgorithm(String value);
-
-    /**
-     * Returns the value of the '<em><b>Expression</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Expression</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Expression</em>' attribute.
-     * @see #setExpression(String)
-     * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage#getSetGenerator_Expression()
-     * @model extendedMetaData="kind='element'"
-     * @generated
-     */
-    String getExpression();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator#getExpression <em>Expression</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Expression</em>' attribute.
-     * @see #getExpression()
-     * @generated
-     */
-    void setExpression(String value);
-
-} // SetGenerator
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/TraitTypesFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/TraitTypesFactory.java
deleted file mode 100644
index 6e76eed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/TraitTypesFactory.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage
- * @generated
- */
-public interface TraitTypesFactory extends EFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	TraitTypesFactory eINSTANCE = org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.TraitTypesFactoryImpl.init();
-
-	/**
-	 * Returns a new object of class '<em>List Of Values</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>List Of Values</em>'.
-	 * @generated
-	 */
-	ListOfValues createListOfValues();
-
-	/**
-     * Returns a new object of class '<em>Set Generator</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Set Generator</em>'.
-     * @generated
-     */
-    SetGenerator createSetGenerator();
-
-    /**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	TraitTypesPackage getTraitTypesPackage();
-
-} //TraitTypesFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/TraitTypesPackage.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/TraitTypesPackage.java
deleted file mode 100644
index cd4314a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/TraitTypesPackage.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesFactory
- * @model kind="package"
- * @generated
- */
-public interface TraitTypesPackage extends EPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "traittypes";
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore";
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "mdt";
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	TraitTypesPackage eINSTANCE = org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.TraitTypesPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.ListOfValuesImpl <em>List Of Values</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.ListOfValuesImpl
-	 * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.TraitTypesPackageImpl#getListOfValues()
-	 * @generated
-	 */
-	int LIST_OF_VALUES = 0;
-
-	/**
-	 * The feature id for the '<em><b>Entries</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIST_OF_VALUES__ENTRIES = 0;
-
-	/**
-	 * The number of structural features of the '<em>List Of Values</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIST_OF_VALUES_FEATURE_COUNT = 1;
-
-
-	/**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.SetGeneratorImpl <em>Set Generator</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.SetGeneratorImpl
-     * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.TraitTypesPackageImpl#getSetGenerator()
-     * @generated
-     */
-    int SET_GENERATOR = 1;
-
-    /**
-     * The feature id for the '<em><b>Algorithm</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int SET_GENERATOR__ALGORITHM = 0;
-
-    /**
-     * The feature id for the '<em><b>Expression</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int SET_GENERATOR__EXPRESSION = 1;
-
-    /**
-     * The number of structural features of the '<em>Set Generator</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int SET_GENERATOR_FEATURE_COUNT = 0;
-
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.ListOfValues <em>List Of Values</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>List Of Values</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.ListOfValues
-	 * @generated
-	 */
-	EClass getListOfValues();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.ListOfValues#getEntries <em>Entries</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Entries</em>'.
-	 * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.ListOfValues#getEntries()
-	 * @see #getListOfValues()
-	 * @generated
-	 */
-	EReference getListOfValues_Entries();
-
-	/**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator <em>Set Generator</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Set Generator</em>'.
-     * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator
-     * @generated
-     */
-    EClass getSetGenerator();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator#getAlgorithm <em>Algorithm</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Algorithm</em>'.
-     * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator#getAlgorithm()
-     * @see #getSetGenerator()
-     * @generated
-     */
-    EAttribute getSetGenerator_Algorithm();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator#getExpression <em>Expression</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Expression</em>'.
-     * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator#getExpression()
-     * @see #getSetGenerator()
-     * @generated
-     */
-    EAttribute getSetGenerator_Expression();
-
-    /**
-	 * Returns the factory that creates the instances of the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	TraitTypesFactory getTraitTypesFactory();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Defines literals for the meta objects that represent
-	 * <ul>
-	 *   <li>each class,</li>
-	 *   <li>each feature of each class,</li>
-	 *   <li>each enum,</li>
-	 *   <li>and each data type</li>
-	 * </ul>
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	interface Literals {
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.ListOfValuesImpl <em>List Of Values</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.ListOfValuesImpl
-		 * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.TraitTypesPackageImpl#getListOfValues()
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EClass LIST_OF_VALUES = eINSTANCE.getListOfValues();
-
-		/**
-		 * The meta object literal for the '<em><b>Entries</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EReference LIST_OF_VALUES__ENTRIES = eINSTANCE.getListOfValues_Entries();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.SetGeneratorImpl <em>Set Generator</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.SetGeneratorImpl
-         * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.TraitTypesPackageImpl#getSetGenerator()
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-		EClass SET_GENERATOR = eINSTANCE.getSetGenerator();
-
-        /**
-         * The meta object literal for the '<em><b>Algorithm</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-		EAttribute SET_GENERATOR__ALGORITHM = eINSTANCE.getSetGenerator_Algorithm();
-
-        /**
-         * The meta object literal for the '<em><b>Expression</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-		EAttribute SET_GENERATOR__EXPRESSION = eINSTANCE.getSetGenerator_Expression();
-
-	}
-
-} //TraitTypesPackage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/ListOfValuesImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/ListOfValuesImpl.java
deleted file mode 100644
index c3ce0ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/ListOfValuesImpl.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ListOfValuesImpl.java,v 1.3 2007/04/16 19:54:01 itrimble Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-
-import org.eclipse.emf.ecore.xml.type.SimpleAnyType;
-
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.ListOfValues;
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>List Of Values</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.ListOfValuesImpl#getEntries <em>Entries</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ListOfValuesImpl extends EObjectImpl implements ListOfValues {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-    /**
-     * The cached value of the '{@link #getEntries() <em>Entries</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getEntries()
-     * @generated
-     * @ordered
-     */
-    protected EList entries = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ListOfValuesImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return TraitTypesPackage.Literals.LIST_OF_VALUES;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getEntries() {
-        if (entries == null) {
-            entries = new EObjectContainmentEList(SimpleAnyType.class, this, TraitTypesPackage.LIST_OF_VALUES__ENTRIES);
-        }
-        return entries;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case TraitTypesPackage.LIST_OF_VALUES__ENTRIES:
-                return ((InternalEList)getEntries()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case TraitTypesPackage.LIST_OF_VALUES__ENTRIES:
-                return getEntries();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case TraitTypesPackage.LIST_OF_VALUES__ENTRIES:
-                getEntries().clear();
-                getEntries().addAll((Collection)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case TraitTypesPackage.LIST_OF_VALUES__ENTRIES:
-                getEntries().clear();
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case TraitTypesPackage.LIST_OF_VALUES__ENTRIES:
-                return entries != null && !entries.isEmpty();
-        }
-        return super.eIsSet(featureID);
-    }
-
-} //ListOfValuesImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/SetGeneratorImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/SetGeneratorImpl.java
deleted file mode 100644
index e4d96b6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/SetGeneratorImpl.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: SetGeneratorImpl.java,v 1.2 2007/04/16 19:54:01 itrimble Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator;
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Set Generator</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.SetGeneratorImpl#getAlgorithm <em>Algorithm</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl.SetGeneratorImpl#getExpression <em>Expression</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SetGeneratorImpl extends EObjectImpl implements SetGenerator {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-    /**
-     * The default value of the '{@link #getAlgorithm() <em>Algorithm</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getAlgorithm()
-     * @generated
-     * @ordered
-     */
-    protected static final String ALGORITHM_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getAlgorithm() <em>Algorithm</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getAlgorithm()
-     * @generated
-     * @ordered
-     */
-    protected String algorithm = ALGORITHM_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getExpression() <em>Expression</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getExpression()
-     * @generated
-     * @ordered
-     */
-    protected static final String EXPRESSION_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getExpression() <em>Expression</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getExpression()
-     * @generated
-     * @ordered
-     */
-    protected String expression = EXPRESSION_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected SetGeneratorImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return TraitTypesPackage.Literals.SET_GENERATOR;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getAlgorithm() {
-        return algorithm;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setAlgorithm(String newAlgorithm) {
-        String oldAlgorithm = algorithm;
-        algorithm = newAlgorithm;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, TraitTypesPackage.SET_GENERATOR__ALGORITHM, oldAlgorithm, algorithm));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getExpression() {
-        return expression;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setExpression(String newExpression) {
-        String oldExpression = expression;
-        expression = newExpression;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, TraitTypesPackage.SET_GENERATOR__EXPRESSION, oldExpression, expression));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case TraitTypesPackage.SET_GENERATOR__ALGORITHM:
-                return getAlgorithm();
-            case TraitTypesPackage.SET_GENERATOR__EXPRESSION:
-                return getExpression();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case TraitTypesPackage.SET_GENERATOR__ALGORITHM:
-                setAlgorithm((String)newValue);
-                return;
-            case TraitTypesPackage.SET_GENERATOR__EXPRESSION:
-                setExpression((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case TraitTypesPackage.SET_GENERATOR__ALGORITHM:
-                setAlgorithm(ALGORITHM_EDEFAULT);
-                return;
-            case TraitTypesPackage.SET_GENERATOR__EXPRESSION:
-                setExpression(EXPRESSION_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case TraitTypesPackage.SET_GENERATOR__ALGORITHM:
-                return ALGORITHM_EDEFAULT == null ? algorithm != null : !ALGORITHM_EDEFAULT.equals(algorithm);
-            case TraitTypesPackage.SET_GENERATOR__EXPRESSION:
-                return EXPRESSION_EDEFAULT == null ? expression != null : !EXPRESSION_EDEFAULT.equals(expression);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (algorithm: ");
-        result.append(algorithm);
-        result.append(", expression: ");
-        result.append(expression);
-        result.append(')');
-        return result.toString();
-    }
-
-} //SetGeneratorImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/TraitTypesFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/TraitTypesFactoryImpl.java
deleted file mode 100644
index 6aa6dfc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/TraitTypesFactoryImpl.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TraitTypesFactoryImpl.java,v 1.5 2007/05/11 17:54:57 gkessler Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.*;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class TraitTypesFactoryImpl extends EFactoryImpl implements TraitTypesFactory {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-    /**
-     * Creates the default factory implementation.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return TraitTypesFactory
-     * @generated
-     */
-    public static TraitTypesFactory init() {
-        try {
-            TraitTypesFactory theTraitTypesFactory = (TraitTypesFactory)EPackage.Registry.INSTANCE.getEFactory("http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore"); 
-            if (theTraitTypesFactory != null) {
-                return theTraitTypesFactory;
-            }
-        }
-        catch (Exception exception) {
-            EcorePlugin.INSTANCE.log(exception);
-        }
-        return new TraitTypesFactoryImpl();
-    }
-
-    /**
-     * Creates an instance of the factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public TraitTypesFactoryImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EObject create(EClass eClass) {
-        switch (eClass.getClassifierID()) {
-            case TraitTypesPackage.LIST_OF_VALUES: return createListOfValues();
-            case TraitTypesPackage.SET_GENERATOR: return createSetGenerator();
-            default:
-                throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
-        }
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ListOfValues createListOfValues() {
-        ListOfValuesImpl listOfValues = new ListOfValuesImpl();
-        return listOfValues;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public SetGenerator createSetGenerator() {
-        SetGeneratorImpl setGenerator = new SetGeneratorImpl();
-        return setGenerator;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public TraitTypesPackage getTraitTypesPackage() {
-        return (TraitTypesPackage)getEPackage();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return TraitTypesPackage
-     * @deprecated
-     * @generated
-     */
-    public static TraitTypesPackage getPackage() {
-        return TraitTypesPackage.eINSTANCE;
-    }
-
-} //TraitTypesFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/TraitTypesPackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/TraitTypesPackageImpl.java
deleted file mode 100644
index e40e5ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/impl/TraitTypesPackageImpl.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TraitTypesPackageImpl.java,v 1.5 2007/05/11 17:54:57 gkessler Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-
-import org.eclipse.emf.ecore.xml.type.XMLTypePackage;
-
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.ListOfValues;
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator;
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesFactory;
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class TraitTypesPackageImpl extends EPackageImpl implements TraitTypesPackage {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass listOfValuesEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass setGeneratorEClass = null;
-
-    /**
-     * Creates an instance of the model <b>Package</b>, registered with
-     * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-     * package URI value.
-     * <p>Note: the correct way to create the package is via the static
-     * factory method {@link #init init()}, which also performs
-     * initialization of the package, or returns the registered package,
-     * if one already exists.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.emf.ecore.EPackage.Registry
-     * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage#eNS_URI
-     * @see #init()
-     * @generated
-     */
-    private TraitTypesPackageImpl() {
-        super(eNS_URI, TraitTypesFactory.eINSTANCE);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private static boolean isInited = false;
-
-    /**
-     * Creates, registers, and initializes the <b>Package</b> for this
-     * model, and for any others upon which it depends.  Simple
-     * dependencies are satisfied by calling this method on all
-     * dependent packages before doing anything else.  This method drives
-     * initialization for interdependent packages directly, in parallel
-     * with this package, itself.
-     * <p>Of this package and its interdependencies, all packages which
-     * have not yet been registered by their URI values are first created
-     * and registered.  The packages are then initialized in two steps:
-     * meta-model objects for all of the packages are created before any
-     * are initialized, since one package's meta-model objects may refer to
-     * those of another.
-     * <p>Invocation of this method will not affect any packages that have
-     * already been initialized.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return TraitTypesPackage
-     * @see #eNS_URI
-     * @see #createPackageContents()
-     * @see #initializePackageContents()
-     * @generated
-     */
-    public static TraitTypesPackage init() {
-        if (isInited) return (TraitTypesPackage)EPackage.Registry.INSTANCE.getEPackage(TraitTypesPackage.eNS_URI);
-
-        // Obtain or create and register package
-        TraitTypesPackageImpl theTraitTypesPackage = (TraitTypesPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof TraitTypesPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new TraitTypesPackageImpl());
-
-        isInited = true;
-
-        // Initialize simple dependencies
-        XMLTypePackage.eINSTANCE.eClass();
-
-        // Create package meta-data objects
-        theTraitTypesPackage.createPackageContents();
-
-        // Initialize created meta-data
-        theTraitTypesPackage.initializePackageContents();
-
-        // Mark meta-data to indicate it can't be changed
-        theTraitTypesPackage.freeze();
-
-        return theTraitTypesPackage;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getListOfValues() {
-        return listOfValuesEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getListOfValues_Entries() {
-        return (EReference)listOfValuesEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getSetGenerator() {
-        return setGeneratorEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getSetGenerator_Algorithm() {
-        return (EAttribute)setGeneratorEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getSetGenerator_Expression() {
-        return (EAttribute)setGeneratorEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public TraitTypesFactory getTraitTypesFactory() {
-        return (TraitTypesFactory)getEFactoryInstance();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private boolean isCreated = false;
-
-    /**
-     * Creates the meta-model objects for the package.  This method is
-     * guarded to have no affect on any invocation but its first.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void createPackageContents() {
-        if (isCreated) return;
-        isCreated = true;
-
-        // Create classes and their features
-        listOfValuesEClass = createEClass(LIST_OF_VALUES);
-        createEReference(listOfValuesEClass, LIST_OF_VALUES__ENTRIES);
-
-        setGeneratorEClass = createEClass(SET_GENERATOR);
-        createEAttribute(setGeneratorEClass, SET_GENERATOR__ALGORITHM);
-        createEAttribute(setGeneratorEClass, SET_GENERATOR__EXPRESSION);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private boolean isInitialized = false;
-
-    /**
-     * Complete the initialization of the package and its meta-model.  This
-     * method is guarded to have no affect on any invocation but its first.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void initializePackageContents() {
-        if (isInitialized) return;
-        isInitialized = true;
-
-        // Initialize package
-        setName(eNAME);
-        setNsPrefix(eNS_PREFIX);
-        setNsURI(eNS_URI);
-
-        // Obtain other dependent packages
-        XMLTypePackage theXMLTypePackage = (XMLTypePackage)EPackage.Registry.INSTANCE.getEPackage(XMLTypePackage.eNS_URI);
-
-        // Add supertypes to classes
-
-        // Initialize classes and features; add operations and parameters
-        initEClass(listOfValuesEClass, ListOfValues.class, "ListOfValues", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getListOfValues_Entries(), theXMLTypePackage.getSimpleAnyType(), null, "entries", null, 0, -1, ListOfValues.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(setGeneratorEClass, SetGenerator.class, "SetGenerator", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getSetGenerator_Algorithm(), ecorePackage.getEString(), "algorithm", null, 0, 1, SetGenerator.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getSetGenerator_Expression(), ecorePackage.getEString(), "expression", null, 0, 1, SetGenerator.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        // Create resource
-        createResource(eNS_URI);
-
-        // Create annotations
-        // http:///org/eclipse/emf/ecore/util/ExtendedMetaData
-        createExtendedMetaDataAnnotations();
-    }
-
-    /**
-     * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void createExtendedMetaDataAnnotations() {
-        String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData";		
-        addAnnotation
-          (getListOfValues_Entries(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "item"
-           });		
-        addAnnotation
-          (getSetGenerator_Algorithm(), 
-           source, 
-           new String[] {
-             "kind", "element"
-           });		
-        addAnnotation
-          (getSetGenerator_Expression(), 
-           source, 
-           new String[] {
-             "kind", "element"
-           });
-    }
-
-} //TraitTypesPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesAdapterFactory.java
deleted file mode 100644
index 3261477..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesAdapterFactory.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TraitTypesAdapterFactory.java,v 1.4 2007/04/16 19:54:18 itrimble Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage
- * @generated
- */
-public class TraitTypesAdapterFactory extends AdapterFactoryImpl {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-    /**
-     * The cached model package.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected static TraitTypesPackage modelPackage;
-
-    /**
-     * Creates an instance of the adapter factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public TraitTypesAdapterFactory() {
-        if (modelPackage == null) {
-            modelPackage = TraitTypesPackage.eINSTANCE;
-        }
-    }
-
-    /**
-     * Returns whether this factory is applicable for the type of the object.
-     * <!-- begin-user-doc -->
-     * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-     * <!-- end-user-doc -->
-     * @return whether this factory is applicable for the type of the object.
-     * @generated
-     */
-    public boolean isFactoryForType(Object object) {
-        if (object == modelPackage) {
-            return true;
-        }
-        if (object instanceof EObject) {
-            return ((EObject)object).eClass().getEPackage() == modelPackage;
-        }
-        return false;
-    }
-
-    /**
-     * The switch the delegates to the <code>createXXX</code> methods.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected TraitTypesSwitch modelSwitch =
-        new TraitTypesSwitch() {
-            public Object caseListOfValues(ListOfValues object) {
-                return createListOfValuesAdapter();
-            }
-            public Object caseSetGenerator(SetGenerator object) {
-                return createSetGeneratorAdapter();
-            }
-            public Object defaultCase(EObject object) {
-                return createEObjectAdapter();
-            }
-        };
-
-    /**
-     * Creates an adapter for the <code>target</code>.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param target the object to adapt.
-     * @return the adapter for the <code>target</code>.
-     * @generated
-     */
-    public Adapter createAdapter(Notifier target) {
-        return (Adapter)modelSwitch.doSwitch((EObject)target);
-    }
-
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.ListOfValues <em>List Of Values</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.ListOfValues
-     * @generated
-     */
-    public Adapter createListOfValuesAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator <em>Set Generator</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator
-     * @generated
-     */
-    public Adapter createSetGeneratorAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for the default case.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @generated
-     */
-    public Adapter createEObjectAdapter() {
-        return null;
-    }
-
-} //TraitTypesAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesResourceFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesResourceFactoryImpl.java
deleted file mode 100644
index 6a187a3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesResourceFactoryImpl.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TraitTypesResourceFactoryImpl.java,v 1.3 2007/02/28 21:12:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.util;
-
-import org.eclipse.emf.common.util.URI;
-
-import org.eclipse.emf.ecore.resource.Resource;
-
-import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl;
-
-import org.eclipse.emf.ecore.xmi.XMLResource;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource Factory</b> associated with the package.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.util.TraitTypesResourceImpl
- * @generated
- */
-public class TraitTypesResourceFactoryImpl extends ResourceFactoryImpl {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-    /**
-     * Creates an instance of the resource factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public TraitTypesResourceFactoryImpl() {
-        super();
-    }
-
-    /**
-     * Creates an instance of the resource.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Resource createResource(URI uri) {
-        XMLResource result = new TraitTypesResourceImpl(uri);
-        result.getDefaultSaveOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-        result.getDefaultLoadOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-
-        result.getDefaultSaveOptions().put(XMLResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE);
-
-        result.getDefaultLoadOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
-        result.getDefaultSaveOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
-
-        result.getDefaultLoadOptions().put(XMLResource.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);
-        return result;
-    }
-
-} //TraitTypesResourceFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesResourceImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesResourceImpl.java
deleted file mode 100644
index ab734a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesResourceImpl.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TraitTypesResourceImpl.java,v 1.3 2007/02/28 21:12:40 cbateman Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.util;
-
-import org.eclipse.emf.common.util.URI;
-
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource </b> associated with the package.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.util.TraitTypesResourceFactoryImpl
- * @generated
- */
-public class TraitTypesResourceImpl extends XMLResourceImpl {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-    /**
-     * Creates an instance of the resource.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param uri the URI of the new resource.
-     * @generated
-     */
-    public TraitTypesResourceImpl(URI uri) {
-        super(uri);
-    }
-
-} //TraitTypesResourceImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesSwitch.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesSwitch.java
deleted file mode 100644
index aeedcd7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesSwitch.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TraitTypesSwitch.java,v 1.5 2007/05/11 17:54:56 gkessler Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage
- * @generated
- */
-public class TraitTypesSwitch {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-    /**
-     * The cached model package
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected static TraitTypesPackage modelPackage;
-
-    /**
-     * Creates an instance of the switch.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public TraitTypesSwitch() {
-        if (modelPackage == null) {
-            modelPackage = TraitTypesPackage.eINSTANCE;
-        }
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param theEObject 
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    public Object doSwitch(EObject theEObject) {
-        return doSwitch(theEObject.eClass(), theEObject);
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param theEClass 
-     * @param theEObject 
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    protected Object doSwitch(EClass theEClass, EObject theEObject) {
-        if (theEClass.eContainer() == modelPackage) {
-            return doSwitch(theEClass.getClassifierID(), theEObject);
-        }
-        else {
-            List eSuperTypes = theEClass.getESuperTypes();
-            return
-                eSuperTypes.isEmpty() ?
-                    defaultCase(theEObject) :
-                    doSwitch((EClass)eSuperTypes.get(0), theEObject);
-        }
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param classifierID 
-     * @param theEObject 
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    protected Object doSwitch(int classifierID, EObject theEObject) {
-        switch (classifierID) {
-            case TraitTypesPackage.LIST_OF_VALUES: {
-                ListOfValues listOfValues = (ListOfValues)theEObject;
-                Object result = caseListOfValues(listOfValues);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case TraitTypesPackage.SET_GENERATOR: {
-                SetGenerator setGenerator = (SetGenerator)theEObject;
-                Object result = caseSetGenerator(setGenerator);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            default: return defaultCase(theEObject);
-        }
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>List Of Values</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>List Of Values</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseListOfValues(ListOfValues object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Set Generator</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Set Generator</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseSetGenerator(SetGenerator object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>EObject</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch, but this is the last case anyway.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>EObject</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-     * @generated
-     */
-    public Object defaultCase(EObject object) {
-        return null;
-    }
-
-} //TraitTypesSwitch
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesXMLProcessor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesXMLProcessor.java
deleted file mode 100644
index 2db7356..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/traittypes/traittypes/internal/util/TraitTypesXMLProcessor.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TraitTypesXMLProcessor.java,v 1.4 2007/04/16 19:54:18 itrimble Exp $
- */
-package org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.internal.util;
-
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EPackage;
-
-import org.eclipse.emf.ecore.xmi.util.XMLProcessor;
-
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage;
-
-/**
- * This class contains helper methods to serialize and deserialize XML documents
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class TraitTypesXMLProcessor extends XMLProcessor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-
-    /**
-     * Public constructor to instantiate the helper.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public TraitTypesXMLProcessor() {
-        super((EPackage.Registry.INSTANCE));
-        TraitTypesPackage.eINSTANCE.eClass();
-    }
-    
-    /**
-     * Register for "*" and "xml" file extensions the TraitTypesResourceFactoryImpl factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected Map getRegistrations() {
-        if (registrations == null) {
-            super.getRegistrations();
-            registrations.put(XML_EXTENSION, new TraitTypesResourceFactoryImpl());
-            registrations.put(STAR_EXTENSION, new TraitTypesResourceFactoryImpl());
-        }
-        return registrations;
-    }
-
-} //TraitTypesXMLProcessor
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/AxiomaticSet.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/AxiomaticSet.java
deleted file mode 100644
index 8bc2881..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/AxiomaticSet.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.sets;
-
-import java.util.Set;
-
-/**
- * A java.util.Set with the basic mathematic set axioms of 
- * extensionality (equality), union, intersection, 
- * relative complement (set subtraction) and empty (already 
- * supported by Set).
- *
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public interface AxiomaticSet extends Set 
-{
-    /**
-     * Implementations should aim to provide O(mn) time cost
-     * where n is the number of elements in this set and
-     * m is the cost to check membership of an element in this
-     * set in toSet.  When a set is itself a member of a set,
-     * the implementation must call isEquivalent on those subsets
-     * recursively.
-     * 
-     * @param toSet 
-     * 
-     * @return true iff this set is equivalent toSet.  Note
-     * that extensionality holds that two sets are equivalent
-     * if and only if they contain exactly the same elements.
-     * 
-     *
-     */
-    boolean isEquivalent(AxiomaticSet toSet);
-    
-    /**
-     * @param set
-     * @return the axiomatic union of this set with set
-     */
-    AxiomaticSet union(AxiomaticSet set);
-    
-    
-    /**
-     * @param set
-     * @return the axiomatic intersection of this set with set
-     */
-    AxiomaticSet intersect(AxiomaticSet set);
-    
-    /**
-     * @param set
-     * @return convenience method that must be equivalent to
-     * (this.intersect(set).isEmpty())
-     */
-    boolean isDisjoint(AxiomaticSet set);
-    
-    /**
-     * The set constructed by the removing the intersection
-     * of this with set from this.  The set will contain all
-     * elements in this that are not in set.
-     * 
-     * Eqivalence: this - set
-     * 
-     * @param set
-     * @return the relative complement or theoretic difference of 
-     * set from this
-     */
-    AxiomaticSet subtract(AxiomaticSet set);
-    
-    /**
-     * @return the first element in the set.  There is no guarantee which element
-     * will be chosen, but the call should always return the same element of the set
-     * for multiple invocations on the same set.  Generally this is a convience method
-     * for when the set only contains one element.
-     * 
-     * @throws java.util.NoSuchElementException if the set is empty.
-     */
-    Object getFirstElement();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/AxiomaticSetUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/AxiomaticSetUtil.java
deleted file mode 100644
index baf9f8d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/AxiomaticSetUtil.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.sets;
-
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * Generic (unoptimized) utilities for doing set operations.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class AxiomaticSetUtil 
-{
-    /**
-     * Creates the union of firstSet and secondSet in newSet.
-     * @param newSet
-     * @param firstSet
-     * @param secondSet
-     */
-    public static void union(AxiomaticSet newSet, AxiomaticSet firstSet, AxiomaticSet secondSet)
-    {
-        newSet.addAll(firstSet);
-        newSet.addAll(secondSet);
-    }
-    
-    /**
-     * Creates an intersection of firstSet and secondSet in newSet
-     * @param newSet
-     * @param firstSet
-     * @param secondSet
-     */
-    public static void intersect(AxiomaticSet newSet, AxiomaticSet firstSet, AxiomaticSet secondSet)
-    {
-        // minor optimization: always iterate through the smaller of the
-        // two sets.  This way we iterate through the smallest number
-        // of elements
-        Iterator it = null;
-        Set  testSet = null;
-        // if other set smaller, get its iterator
-        if (secondSet.size() < firstSet.size())
-        {
-            it = secondSet.iterator();
-            // test set is other set
-            testSet = firstSet;
-        }
-        // first set is smaller or same
-        else
-        {
-            it = firstSet.iterator();
-            testSet = secondSet;
-        }
-        
-        while (it.hasNext())
-        {
-            Object member = it.next();
-            if (testSet.contains(member))
-            {
-                newSet.add(member);   
-            }
-        }
-    }
-    
-    /**
-     * @param firstSet
-     * @param secondSet
-     * @return true firstSet and secondSet have no common elements (their intersection is empty)
-     */
-    public static boolean isDisjoint(AxiomaticSet firstSet, AxiomaticSet secondSet)
-    {
-        return firstSet.intersect(secondSet).isEmpty();
-    }
-
-    /**
-     * @param firstOperand
-     * @param secondOperand
-     * @return the set formed by removing the intersection of firstOperand and secondOperand
-     * from firstOperand, leaving only those elements in firstOperand that are not in secondOperand
-     */
-    public static AxiomaticSet subtract(
-            AxiomaticSet firstOperand, AxiomaticSet secondOperand) 
-    {
-        ConcreteAxiomaticSet  relativeComplement = new ConcreteAxiomaticSet();
-
-        // iterate through firstOperand and add each element to the result
-        // set that is not in secondOperand
-        for (final Iterator it = firstOperand.iterator(); it.hasNext();)
-        {
-            Object member = it.next();
-            if (!secondOperand.contains(member))
-            {
-                relativeComplement.add(member);   
-            }
-        }
-
-        return relativeComplement;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/ConcreteAxiomaticSet.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/ConcreteAxiomaticSet.java
deleted file mode 100644
index b82c03f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/ConcreteAxiomaticSet.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.sets;
-
-import java.util.HashSet;
-
-/**
- * Implements a simple axiomatic set based on a hashset
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class ConcreteAxiomaticSet extends HashSet implements AxiomaticSet {
-
-    /**
-     * serial version id
-     */
-    private static final long serialVersionUID = 7094728081135008203L;
-
-    public AxiomaticSet intersect(AxiomaticSet set) {
-        AxiomaticSet intersection = new ConcreteAxiomaticSet();
-        AxiomaticSetUtil.intersect(intersection, this, set);
-        return intersection;
-    }
-
-    public boolean isEquivalent(AxiomaticSet toSet) {
-        return equals(toSet);
-    }
-
-    public AxiomaticSet union(AxiomaticSet set) {
-       AxiomaticSet union = new ConcreteAxiomaticSet();
-       AxiomaticSetUtil.union(union, this, set);
-       return union;
-    }
-
-    public boolean isDisjoint(AxiomaticSet set) {
-        return AxiomaticSetUtil.isDisjoint(this, set);
-    }
-
-    public Object getFirstElement() {
-        return iterator().next();
-    }
-
-    public AxiomaticSet subtract(AxiomaticSet set) {
-       return AxiomaticSetUtil.subtract(this, set);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/NodeSet.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/NodeSet.java
deleted file mode 100644
index 146b833..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/NodeSet.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.sets;
-
-import java.util.AbstractSet;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-import org.w3c.dom.NodeList;
-
-/**
- * A set backed by a W3C NodeList so as to avoid copying.  Note that operations
- * that return new sets still invoke a copy.  Also, membership operations
- * require O(n) time.  This should generally used for sets that are assumed to be
- * small where O(n) search time will be small compared to doing a full copy.
- * 
- * This set is immutable (mutation methods throw exceptions)
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class NodeSet extends AbstractSet implements AxiomaticSet 
-{
-    private NodeList        _data;
-    
-    /**
-     * @param data  -- wrap the actual data source
-     */
-    public NodeSet(NodeList data)
-    {
-        _data = data;
-    }
-    
-    public Iterator iterator() {
-        return new Iterator()
-        {
-            private int  pos = 0;
-            
-            public boolean hasNext() {
-                return pos < _data.getLength();
-            }
-
-            public Object next() {
-                return _data.item(pos++);
-            }
-
-            public void remove() {
-                throw new UnsupportedOperationException();
-            }
-            
-        };
-    }
-
-    public int size() {
-        return _data.getLength();
-    }
-
-    public AxiomaticSet intersect(AxiomaticSet set) {
-        ConcreteAxiomaticSet newSet = new ConcreteAxiomaticSet();
-        AxiomaticSetUtil.intersect(newSet, this, set);
-        return newSet;
-    }
-
-    public boolean isEquivalent(AxiomaticSet toSet) {
-        if (this == toSet)
-        {
-            return true;
-        }
-        
-        if (toSet instanceof NodeSet
-                && ((NodeSet)toSet)._data == this._data)
-        {
-            return true;
-        }
-        
-        // if different sizes, false
-        if (toSet.size() != size())
-        {
-            return false;
-        }
-        
-        // otherwise, compare item by item
-        // Iterator through me with the hope that look ups
-        // are more efficent in toSet 
-        for (Iterator it = iterator(); it.hasNext();)
-        {
-            Object obj = it.next();
-            
-            if (!toSet.contains(obj))
-            {
-                // fail fase on membership mismatch
-                return false;
-            }
-        }
-        
-        // if we get to here then the item by item match succeeded
-        return true;
-    }
-
-    public AxiomaticSet union(AxiomaticSet set) {
-        ConcreteAxiomaticSet newSet = new ConcreteAxiomaticSet();
-        AxiomaticSetUtil.union(newSet, this, set);
-        return newSet;
-    }
-
-    public boolean isDisjoint(AxiomaticSet set) {
-        return AxiomaticSetUtil.isDisjoint(this, set);
-    }
-
-    public Object getFirstElement() {
-        if (_data.getLength()>0)
-        {
-            return _data.item(0);
-        }
-        throw new NoSuchElementException("Set is empty"); //$NON-NLS-1$
-    }
-
-    public AxiomaticSet subtract(AxiomaticSet set) {
-        return AxiomaticSetUtil.subtract(this, set);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/constraint/AbstractMemberConstraint.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/constraint/AbstractMemberConstraint.java
deleted file mode 100644
index d71ebf0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/constraint/AbstractMemberConstraint.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.sets.constraint;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.sets.AxiomaticSet;
-
-/**
- * A set constraint that is specific to members of the set.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class AbstractMemberConstraint extends AbstractSetConstraint {
-
-    public Diagnostic isSatisfied(AxiomaticSet set) {
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/constraint/AbstractSetConstraint.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/constraint/AbstractSetConstraint.java
deleted file mode 100644
index f176a37..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/constraint/AbstractSetConstraint.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.sets.constraint;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.sets.AxiomaticSet;
-
-/**
- * Super-class of all axiomatic set constraints.
- * 
- * A set constraint applies one or more pre-conditions on a set
- * and returns a diagnostic that flags whether or not the set
- * satisfies that constraint or not.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractSetConstraint 
-{
-    /**
-     * The following post-conditions must hold:
-     * 
-     * 1) if the set satisfies the constraint with no caveats, 
-     * the returned diagnostic must in turn satisfy 
-     * Diagnostic.getSeverity() == Diagnostic.OK
-     * 
-     * 2) if the set does not satisfy the constraint, the returned diagnostic
-     * must satisfy Diagnostic.getSeverity() == Diagnostic.ERROR
-     * 
-     * 3) if the set strictly satisfies the constraint but the constraint includes
-     * parameters that can only be heuristically applied, the constraint may choose
-     * to return a diagnostic where Diagnostic.getSeverity() == Diagnostic.WARNING
-     * 
-     * The diagnostic returned should _never_ have any other severity but OK, ERROR or WARNING
-     * 
-     * Algorithmically:
-     * 
-     * Constraint is satisfied can be tested by Diagnostic.getSeverity() != ERROR
-     * Constraint is not satisfied can be tested by Diagnostic.getSeverity() == ERROR
-     * 
-     * @param set
-     * @return a diagnostic object that contains information about whether
-     * or not the constraint is satisfied for set. 
-     * <b>MUST NOT RETURN NULL</b>
-     */
-    public abstract Diagnostic isSatisfied(AxiomaticSet set);
-    
-    /**
-     * Convenience method
-     * 
-     * @param set
-     * @return true if the constraint is satisfied for set
-     */
-    public final boolean passesConstraint(AxiomaticSet set)
-    {
-        return isSatisfied(set).getSeverity() != Diagnostic.ERROR;
-    }
-    
-    /**
-     * Convenience method
-     * 
-     * @param set
-     * @return true if the constraint is <b>not</b> satisfied for set
-     */
-    public final boolean failsConstraint(AxiomaticSet set)
-    {
-        return !passesConstraint(set);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/mapping/AbstractObjectInjectiveSetMapping.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/mapping/AbstractObjectInjectiveSetMapping.java
deleted file mode 100644
index 8c2d5b5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/mapping/AbstractObjectInjectiveSetMapping.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.sets.mapping;
-
-import java.util.Iterator;
-
-import org.eclipse.jst.jsf.common.sets.AxiomaticSet;
-import org.eclipse.jst.jsf.common.sets.ConcreteAxiomaticSet;
-
-/**
- * Super-class of all ObjectInjectiveSetMapping.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractObjectInjectiveSetMapping implements
-        ObjectInjectiveSetMapping {
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.sets.mapping.ObjectInjectiveSetMapping#mapIterator(org.eclipse.jst.jsf.common.sets.AxiomaticSet)
-     */
-    public Iterator mapIterator(final AxiomaticSet set) 
-    {
-        return new Iterator()
-        {
-            final Iterator  setIterator = set.iterator();
-            
-            public boolean hasNext() 
-            {
-                return setIterator.hasNext();
-            }
-
-            public Object next() 
-            {
-                return map(setIterator.next());
-            }
-
-            public void remove() 
-            {
-                throw new UnsupportedOperationException("cannot modify iterator"); //$NON-NLS-1$
-            }
-        };
-    }
-
-    /**
-     * @param element
-     * @return the result object from the mapping on element
-     */
-    public abstract Object map(Object element);
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.sets.mapping.AxiomaticSetMapping#map(org.eclipse.jst.jsf.common.sets.AxiomaticSet)
-     */
-    public final AxiomaticSet map(AxiomaticSet set) {
-       AxiomaticSet resultSet = new ConcreteAxiomaticSet();
-       
-       for (final Iterator it = mapIterator(set); it.hasNext();)
-       {
-           resultSet.add(it.next());
-       }
-       
-       return resultSet;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/mapping/AxiomaticSetMapping.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/mapping/AxiomaticSetMapping.java
deleted file mode 100644
index d6ab1ff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/mapping/AxiomaticSetMapping.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.sets.mapping;
-
-import org.eclipse.jst.jsf.common.sets.AxiomaticSet;
-
-/**
- * Defines an axiomatic mapping from set to another.  In formal notation, this may
- * also be defined as a "function" or a "proposition".
- * 
- * Applying the map method can be seen as being equivalent to:
- * 
- * AxiomaticSetMapping: set -> map(set)
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public interface AxiomaticSetMapping 
-{
-    /**
-     * @param set
-     * @return the new set resulting from applying the map to set
-     */
-    AxiomaticSet map(AxiomaticSet set);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/mapping/ObjectInjectiveSetMapping.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/mapping/ObjectInjectiveSetMapping.java
deleted file mode 100644
index ce33eec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/sets/mapping/ObjectInjectiveSetMapping.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.sets.mapping;
-
-import java.util.Iterator;
-
-import org.eclipse.jst.jsf.common.sets.AxiomaticSet;
-
-/**
- * A type of axiomatic set mapping that operates injectively on the input
- * set to create its result set.  Note that the injection (one-to-oneness)
- * of the mapping is based on Java objects and not on the value of the object.
- * Therefore, the result set is not guaranteed to be injective on the basis
- * of value.
- * 
- * For example, consider a set of integers:
- * 
- * X = {new Integer(4), new Integer(6), new Integer(9)}
- * 
- * an ObjectInjectiveSetMapping may be defined that maps this set
- * to a result based on:
- * 
- * map(x) = new Boolean(x < 8) for all x in X
- * 
- * An ObjectiveInjectiveSetMapping result set would look like this:
- * 
- * map(X) = {new Boolean(true), new Boolean(true), new Boolean(false)}
- * 
- * Note that boolean TRUE maps twice, so based on the value of the set members,
- * the mapping is not injective.  However, each Java object in X maps to a
- * distinct Java object in map(X)
- * 
- * This interface should not be implemented by clients. Clients should
- * sub-class AbstractObjectInjectiveSetMapping to avoid future API breakage.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public interface ObjectInjectiveSetMapping extends AxiomaticSetMapping
-{
-    /**
-     * This method optimizes the case where a client wants to apply some
-     * mapping or constraint to each element of a set until a particular
-     * condition applies and then stop.
-     * 
-     * Mapping's that implement this
-     * interface should generally implement their map(set) method as:
-     * 
-     *  for (Iterator it = mapIterator(set); it.hasNext();)
-     *  {
-     *      result.add(doMapping(it.next));
-     *  }
-     *  
-     * @param set
-     * @return an iterator that allows a client to apply the mapping
-     * one element of set at a time.  The iterator is immutable and should
-     * throw UnsupportedOperationException if remove() is called.
-     */
-    public Iterator mapIterator(AxiomaticSet set);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanIntrospector.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanIntrospector.java
deleted file mode 100644
index 4bffcfe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanIntrospector.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.util;
-
-import java.beans.Introspector;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-
-/**
- * A class that does bean introspection on a JDT IType
- * 
- * This functionality is not meant to replace runtime bean 
- * introspection.  Rather, it is meant to provide a 
- * more "lightweight" (in terms of class loading as well as
- * error handling of bean instantiation out of context) way
- * to determine a bean's properties at design time.
- * 
- * This class may not be sub-classed by clients.
- * 
- * @author cbateman
- *
- */
-public class JDTBeanIntrospector 
-{
-	private final static String GET_PREFIX = "get"; //$NON-NLS-1$
-	private final static String SET_PREFIX = "set"; //$NON-NLS-1$
-	private final static String IS_PREFIX = "is"; //$NON-NLS-1$
-	
-	private final IType 	_type;
-
-	/**
-	 * @param type
-	 */
-	public JDTBeanIntrospector(IType type)
-	{
-		_type = type;
-	}
-	
-	/**
-	 * @return an map of all properties with the property names
-     * as keys and the values being JDTBeanProperty objects representing
-     * the properties.
-	 */
-	public Map<String, JDTBeanProperty> getProperties()
-	{
-		final Map<String, JDTBeanProperty>   propertiesWorkingCopy = 
-		    new HashMap<String, JDTBeanProperty>();
-		final IMethod[] methods = getAllMethods();
-		
-		for (int i = 0; i < methods.length; i++)
-		{
-			final IMethod  method = methods[i];
-
-			try
-			{
-				processPropertyMethod(method, propertiesWorkingCopy);
-			}
-			catch (JavaModelException jme)
-			{
-				// log and then proceed to next method
-				JSFCommonPlugin.log(jme, "Error processing IMethod for bean property info"); //$NON-NLS-1$
-			}
-		}
-
-        final Map properties = new HashMap();
-        
-        for (final Iterator it = propertiesWorkingCopy.keySet().iterator(); it.hasNext();)
-        {
-            final String key = (String) it.next();
-            JDTBeanPropertyWorkingCopy  wcopy = 
-                (JDTBeanPropertyWorkingCopy) propertiesWorkingCopy.get(key);
-            properties.put(key, wcopy.toValueObject());
-        }
-
-		return properties;
-	}
-
-	private void processPropertyMethod(IMethod method, Map<String, JDTBeanProperty> properties) throws JavaModelException
-	{
-		// to be a bean method, it must not a constructor, must be public
-		// and must not be static
-		if (!method.isConstructor()
-				&& Flags.isPublic(method.getFlags())
-				&& !Flags.isStatic(method.getFlags()))
-		{
-			final String methodName = method.getElementName();
-			final String returnType = method.getReturnType();
-			
-			// either starts with get or is boolean and starts with is
-			
-			// is access must start with 'is', have a boolean return type and no parameters
-			final boolean  startsWithIs = methodName.startsWith(IS_PREFIX) 
-					&& Signature.SIG_BOOLEAN.equals(returnType)
-					&& method.getNumberOfParameters() == 0
-                    && methodName.length() > IS_PREFIX.length();
-			
-			// get accessor must start with 'get', have no parameters and return non-void
-			final boolean  startsWithGet = (methodName.startsWith(GET_PREFIX)
-											&& method.getNumberOfParameters() == 0)
-											&& !Signature.SIG_VOID.equals(returnType)                    
-                                            && methodName.length() > GET_PREFIX.length();
-			
-			// mutator must start with 'set' and have one parameter and a void return type
-			final boolean  startsWithSet = methodName.startsWith(SET_PREFIX)
-											&& method.getNumberOfParameters() == 1
-											&& Signature.SIG_VOID.equals(returnType)
-                                            && methodName.length() > SET_PREFIX.length();
-
-			if (startsWithGet || startsWithSet || startsWithIs)
-			{
-				final String propertyName = 
-					Introspector.decapitalize(methodName.substring(startsWithIs ? 2 : 3));
-
-				JDTBeanPropertyWorkingCopy workingCopy = 
-					(JDTBeanPropertyWorkingCopy) properties.get(propertyName);
-
-				if (workingCopy == null)
-				{
-					workingCopy = new JDTBeanPropertyWorkingCopy(_type);
-					properties.put(propertyName, workingCopy);
-				}
-
-				if  (startsWithIs)
-				{
-					workingCopy.setIsGetter(method);
-				}
-				else if (startsWithGet)
-				{
-					workingCopy.setGetter(method);
-				}
-				else if (startsWithSet)
-				{
-					workingCopy.addSetter(method);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @return all methods for the type including inherited ones
-	 */
-	public IMethod[] getAllMethods()
-	{
-		IMethod[] methods = new IMethod[0];
-		
-		try
-		{
-            // type not resolved so don't proceed
-            if (_type != null)
-            {
-	            // TODO: type hierarchy is potentially expensive, should
-	            // cache once and listen for changes
-	            ITypeHierarchy  hierarchy = _type.newSupertypeHierarchy(new NullProgressMonitor());
-	            
-				methods = getAllMethods(hierarchy, _type);
-            }
-		}
-		catch(JavaModelException jme)
-		{
-            JSFCommonPlugin.log(jme, "Error getting type information for bean"); //$NON-NLS-1$
-		}
-
-		return methods;
-	}
-
-    /**
-     * @param typeHierarchy
-     * @param type
-     * @return all methods of the type and it's super types
-     */
-    private static IMethod[] getAllMethods(final ITypeHierarchy typeHierarchy, final IType type)
-    {
-        final List<IMethod>   methods = new ArrayList<IMethod>();
-        final IType[] superTypes = typeHierarchy.getAllSuperclasses(type);
-        final IType[] closure = new IType[superTypes.length+1];
-        closure[0] = type;
-        System.arraycopy(superTypes, 0, closure, 1, superTypes.length);
-        
-        for (int i = 0; i < closure.length; i++)
-        {
-            try {
-                final IType superType = closure[i];
-                methods.addAll(Arrays.asList(superType.getMethods()));
-            } catch (JavaModelException e) {
-                JSFCommonPlugin.log(e, "Error getting super type information for bean"); //$NON-NLS-1$
-            }
-        }
-            
-        return methods.toArray(new IMethod[methods.size()]);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanProperty.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanProperty.java
deleted file mode 100644
index 3f92f83..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanProperty.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.common.util;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-
-/**
- * Represents a single bean property backed by JDT data
- * 
- * This class may not be sub-classed by clients.
- * 
- * @author cbateman
- *
- */
-public class JDTBeanProperty 
-{
-	/**
-	 * the IMethod for the accessor  (either is or get)
-	 */
-	private IMethod   _getter;
-	
-	/**
-	 * the IMethod for a "set" accessor method
-	 */
-	private IMethod   _setter;
-
-	/**
-	 * The IType that this property belongs to
-	 */
-	protected final IType    _type;
-    
-    /**
-     * @param type
-     */
-    protected JDTBeanProperty(IType type)
-    {
-        _type = type;
-    }
-
-    /**
-	 * @return true if this property is readable
-	 */
-	public boolean isReadable()
-	{
-		return  _getter != null;
-	}
-	
-	/**
-	 * @return true if this property is writable
-	 */
-	public boolean isWritable()
-	{
-		return _setter != null;
-	}
-	
-	
-	/**
-	 * @return the get accessor IMethod or null if none
-	 */
-	public IMethod getGetter() {
-		return _getter;
-	}
-
-	
-	
-	/**
-	 * Set the get accessor IMethod
-	 * @param getter -- may be null to indicate none
-	 */
-	void setGetter(IMethod getter) {
-		_getter = getter;
-	}
-
-
-	/**
-	 * @return the set mutator IMethod or null if none
-	 */
-	public IMethod getSetter() {
-		return _setter;
-	}
-
-	/**
-	 * @param setter
-	 */
-	void setSetter(IMethod setter) {
-		_setter = setter;
-	}
-	
-    /**
-     * @return the IType for this property's type or null if it
-     * cannot determined.  Note that null does not necessarily indicate an error
-     * since some types like arrays of things do not have corresponding JDT IType's
-     * If typeSignature represents an array, the base element IType is returned
-     * if possible
-     */
-    public IType getType()
-    {
-        final String typeSignature = Signature.getElementType(getTypeSignature());
-        return TypeUtil.resolveType(_type, typeSignature);
-    }
-	
-    /**
-     * @return the number of array nesting levels in typeSignature.
-     * Returns 0 if not an array.
-     */
-    public int getArrayCount()
-    {
-        return Signature.getArrayCount(getTypeSignature());
-    }
-    
-    /**
-     * @return true if property is an enum type, false otherwise or if cannot be resolved
-     */
-    public boolean isEnumType()
-    {
-        return TypeUtil.isEnumType(getType());
-    }
-    
-	/**
-	 * Fully equivalent to:
-	 * 
-	 * getTypeSignature(true)
-	 * 
-	 * @return the fully resolved (if possible) type signature for
-     * the property or null if unable to determine.
-     * 
-     * NOTE: this is the "type erasure" signature, so any type parameters
-     * will be removed and only the raw type signature will be returned.
-	 */
-	public String getTypeSignature()
-    {
-	    return getTypeSignature(true);
-    }
-	
-	
-    /**
-     * @param eraseTypeParameters if true, the returned type has type parameters
-     * erased. If false, template types are resolved. 
-     * 
-     * @see org.eclipse.jst.jsf.common.util.TypeUtil#resolveTypeSignature(IType, String, boolean)
-     * for more information on how specific kinds of unresolved generics are resolved
-     * 
-     * @return the fully resolved (if possible) type signature for
-     * the property or null if unable to determine.
-     */
-    public String getTypeSignature(boolean eraseTypeParameters)
-    {
-        try
-        {
-            String unResolvedSig = getUnresolvedType();
-            return TypeUtil.resolveTypeSignature(_type, unResolvedSig, eraseTypeParameters);
-        }
-        catch (JavaModelException jme)
-        {
-            JSFCommonPlugin.log(jme, "Error resolving bean property type signature"); //$NON-NLS-1$
-            return null;
-        }
-    }
-    
-	/**
-	 * For example, if this property was formed from: List<String> getListOfStrings()
-	 * then the list would consist of the signature "Ljava.lang.String;".  All 
-	 * nested type paramters are resolved
-	 * 
-     * @see org.eclipse.jst.jsf.common.util.TypeUtil#resolveTypeSignature(IType, String, boolean)
-     * for more information on how specific kinds of unresolved generics are resolved
-	 * 
-	 * @return a list of type signatures (fully resolved if possible)
-	 * of this property's bounding type parameters.
-	 */
-	public List<String> getTypeParameterSignatures()
-	{
-	    List<String>  signatures = new ArrayList<String>();
-	    
-	    try
-	    {
-	        final String[] typeParameters = Signature.getTypeArguments(getUnresolvedType());
-	        //System.err.println(getUnresolvedType());
-	        for (String parameter : typeParameters)
-	        {
-	            //System.out.println(parameter);
-	            signatures.add(TypeUtil.resolveTypeSignature(_type, parameter, false));
-	        }
-	    }
-	    catch (JavaModelException jme)
-	    {
-            JSFCommonPlugin.log(jme, "Error resolving bean property type signature"); //$NON-NLS-1$
-            // fall-through and return empty array
-	    }
-
-	    return signatures;
-	}
-
-//	public Map<String, String> getTypeParameterSignatureMap()
-//	{
-//	    Map<String, String>  signatures = new HashMap<String, String>();
-//        
-//        try
-//        {
-//            final String[] typeParameters = Signature.getTypeArguments(getUnresolvedType());
-//            
-//            for (String parameter : typeParameters)
-//            {
-//                signatures.add(TypeUtil.resolveTypeSignature(_type, parameter, false));
-//            }
-//        }
-//        catch (JavaModelException jme)
-//        {
-//            JSFCommonPlugin.log(jme, "Error resolving bean property type signature"); //$NON-NLS-1$
-//            // fall-through and return empty array
-//        }
-//
-//        return signatures;
-//	}
-	
-    private String getUnresolvedType() throws JavaModelException
-    {
-        String   typeSig = null;
-        
-        // first decide which method to use; getter always gets precendence
-        if (_getter != null)
-        {
-            typeSig = _getter.getReturnType();
-        }
-        // TODO: if no getter or setter could we have been created?
-        // use setter
-        else
-        {
-            typeSig = _setter.getParameterTypes()[0];
-        }
-        
-        return typeSig;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanPropertyWorkingCopy.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanPropertyWorkingCopy.java
deleted file mode 100644
index f3bdf14..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanPropertyWorkingCopy.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.util;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-
-/**
- * A writable version of the JDTBeanProperty object
- * 
- * This class may not be sub-classed by clients
- * 
- * @author cbateman
- *
- */
-public class JDTBeanPropertyWorkingCopy extends JDTBeanProperty 
-{
-	private final List		_setters;
-	
-	/**
-	 * the IMethod for the boolean "is" accessor method
-	 */
-	private IMethod        _isGetter;
-	
-	/**
-	 * Constructor
-	 * @param type 
-	 */
-	public JDTBeanPropertyWorkingCopy(IType type)
-	{
-        super(type);
-		_setters = new ArrayList();
-	}
-	
-	/**
-	 * @return the bean properties spawned from this working copy
-	 * Normally, there is only one property in the array, however,
-	 * since this working copy represents all properties with the same
-	 * name, there could be multiple properties since setters can
-	 * be overloaded by name and could result in zero or one readable
-	 * properties plus zero or more write-only properties with the same
-	 * name.  I can't see anywhere in the spec that covers this 
-	 * boundary case
-	 */
-	public JDTBeanProperty toValueObject()
-	{
-		// if the isGetter is present that it takes precedence
-		// over the the normal getter
-		IMethod  getter = getIsGetter() != null ? 
-							getIsGetter() : getGetter();
-		IMethod  matchedSetter = null;
-
-		if (getter != null)
-		{
-			matchedSetter = determineMatchedSetter(getter);
-		}
-		// if there's no getter than pick any setter: there
-		// are bigger problem when there's no getter than
-		// ambiguous setters
-		else if (_setters.size() > 0)
-		{
-			matchedSetter = (IMethod) _setters.get(0);
-		}
-		
-		JDTBeanProperty beanProp = new JDTBeanProperty(_type);
-		beanProp.setGetter(getter);
-		beanProp.setSetter(matchedSetter);
-		return beanProp;
-	}
-	
-	private IMethod determineMatchedSetter(IMethod getter)
-	{
-		IMethod matchedSetter = null;
-		
-		try
-		{
-			final String getterSig = 
-				TypeUtil.resolveTypeSignature(_type, getter.getReturnType());
-
-			FIND_MATCHING_SETTER:for 
-				(final Iterator it = _setters.iterator(); it.hasNext();)
-			{
-				final IMethod  setter = (IMethod) it.next();
-				if (setter.getNumberOfParameters() == 1)
-				{
-					final String paramSig = 
-						TypeUtil.resolveTypeSignature
-							(_type,setter.getParameterTypes()[0]);
-					
-					if (paramSig.equals(getterSig))
-					{
-						// we've found our match since only one
-						// setter with the same name as the getter
-						// can have the same matching type for a
-						// single arg method
-						matchedSetter = setter;
-						break FIND_MATCHING_SETTER;
-					}
-				}
-			}
-		}
-		catch (JavaModelException jme)
-		{
-            JSFCommonPlugin.log(jme, "Error determining getter return type, bean properties analysis may be inaccurate"); //$NON-NLS-1$
-		}
-
-		return matchedSetter;
-	}
-	
-	//@Override
-	public void setGetter(IMethod getter) {
-		super.setGetter(getter);
-	}
-
-	/**
-	 * @param isGetter
-	 */
-	public void setIsGetter(IMethod isGetter) {
-		_isGetter = isGetter;
-	}
-
-	/**
-	 * @param setter
-	 */
-	public void addSetter(IMethod setter) {
-        if (setter != null
-                && setter.getNumberOfParameters() == 1)
-        {
-            _setters.add(setter);
-        }
-	}
-
-    /**
-     * Not supported on working copy.  This is synthetically generated
-     * on toValueObject()
-     * @return nothing; throws exception
-     */
-    public final IMethod getSetter()
-    {
-        throw new UnsupportedOperationException("Setter not calculated in working copy.  Call toValueObject().getSetter()"); //$NON-NLS-1$
-    }
-    
-	/**
-	 * @return the "is" getter method or null if not found
-	 */
-	public IMethod getIsGetter() {
-		return _isGetter;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/TypeUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/TypeUtil.java
deleted file mode 100644
index 50041de..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/TypeUtil.java
+++ /dev/null
@@ -1,591 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.common.util;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.ITypeParameter;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-
-/**
- * Utility for handling IType's and type signatures
- * 
- * Class is static and cannot be extended or instantiated.
- * 
- * @author cbateman
- *
- */
-public final class TypeUtil 
-{
-    static IType resolveType(final IType owningType, final String typeSignature)
-    {
-        // if type signature is already resolved then simply look it up
-        if (typeSignature.charAt(0) == Signature.C_RESOLVED
-        		|| (Signature.getTypeSignatureKind(typeSignature) == Signature.ARRAY_TYPE_SIGNATURE
-        			&& Signature.getElementType(typeSignature).charAt(0) == Signature.C_RESOLVED))
-        {
-            IType type = null;
-            
-            try
-            {
-                type = owningType.getJavaProject().
-                           findType(getFullyQualifiedName(typeSignature));
-            }
-            catch (JavaModelException jme)
-            {
-                // do nothing; return type == null;
-            }
-            
-            return type;
-        }
-        
-        
-        return resolveTypeRelative(owningType, typeSignature);
-    }
-
-    /**
-     * Fully equivalent to:
-     * 
-     * #resolveTypeSignature(owningType, typeSignature, true)
-     * 
-     * If resolved, type signature has generic type parameters erased (absent).
-     * 
-     * @param owningType
-     * @param typeSignature
-     * @return the resolved type signature for typeSignature in owningType or
-     * typeSignature unchanged if cannot resolve.
-     */
-    public static String resolveTypeSignature(final IType owningType, final String typeSignature)
-    {
-        return resolveTypeSignature(owningType, typeSignature, true);
-    }
-    
-    /**
-     * Resolve typeSignature in the context of owningType.  This method will return 
-     * a type erased signture if eraseTypeParameters == true and will attempt to
-     * resolve and include parameters if eraseTypeParamters == false
-     * 
-     * NOTE: special rules apply to the way unresolved type parameters and wildcards
-     * are resolved:
-     * 
-     * 1) If a fully unresolved type parameter is found, then it will be replaced with Ljava.lang.Object;
-     * 
-     * i.e.  List<T>  -> Ljava.util.List<Ljava.lang.Object;>;  for any unresolved T.
-     * 
-     * 2) Any bounded wildcard will be replaced by the bound:
-     * 
-     * i.e. List<? extends String> -> Ljava.util.List<Ljava.lang.String;>;
-     * i.e. List<? super String> -> Ljava.util.List<Ljava.lang.String;>;
-     * 
-     * Note limitation here: bounds that use 'super' will take the "best case" scenario that the list
-     * type is of that type.
-     * 
-     * 3) The unbounded wildcard will be replaced by Ljava.lang.Object;
-     * 
-     * i.e. List<?> -> Ljava.util.List<Ljava.lang.Object;>;
-     * 
-     * 
-     * The reason for this substition is to return the most accurate reasonable approximation
-     * of the type within what is known by owningType
-     * 
-     * @param owningType
-     * @param typeSignature
-     * @param eraseTypeParameters if set to false, type parameters are resolved included
-     * in the signature
-     * @return the resolved type signature for typeSignature in owningType or
-     * typeSignature unchanged if cannot resolve.
-     */
-    public static String resolveTypeSignature(final IType owningType, final String typeSignature, boolean eraseTypeParameters)
-    {
-        final int sigKind = Signature.getTypeSignatureKind(typeSignature);
-    
-        switch (sigKind)
-        {
-            case Signature.BASE_TYPE_SIGNATURE:
-                return typeSignature;
-                
-            case Signature.ARRAY_TYPE_SIGNATURE:
-            {
-                final String elementType = Signature.getElementType(typeSignature);
-                
-                if (Signature.getTypeSignatureKind(elementType) == Signature.BASE_TYPE_SIGNATURE)
-                {
-                    return typeSignature;
-                }
-
-                final String resolvedElementType = resolveSignatureRelative(owningType, elementType, eraseTypeParameters);
-                String resultType = ""; //$NON-NLS-1$
-                for (int i = 0; i < Signature.getArrayCount(typeSignature);i++)
-                {
-                    resultType+=Signature.C_ARRAY;
-                }
-                
-                return resultType+resolvedElementType;
-            }
-
-            case Signature.TYPE_VARIABLE_SIGNATURE:
-            	return resolveSignatureRelative(owningType, typeSignature, eraseTypeParameters);
-            
-            case Signature.CLASS_TYPE_SIGNATURE:
-                return resolveSignatureRelative(owningType, typeSignature, eraseTypeParameters);
-
-            case Signature.WILDCARD_TYPE_SIGNATURE:
-                // strip the wildcard and try again.  Too bad Signature doesn't seem to have a method
-                // for this
-                if (typeSignature.charAt(0) == Signature.C_STAR)
-                {
-                    return TypeConstants.TYPE_JAVAOBJECT;
-                }
-                return resolveTypeSignature(owningType, typeSignature.substring(1), eraseTypeParameters);
-            
-            case Signature.CAPTURE_TYPE_SIGNATURE:
-                // strip the capture and try again
-                return resolveTypeSignature(owningType, Signature.removeCapture(typeSignature), eraseTypeParameters);
-//            case Signature.TYPE_VARIABLE_SIGNATURE:
-//                resolveSignatureRelative(owningType, typeSignature, eraseTypeParameters);
-
-            default:
-                return typeSignature;
-        }
-    }
-    
-    /**
-     * @param owningType -- type relative to which typeSignature will be resolved
-     * @param typeSignature -- non-array type signature
-     * @return the resolved type signature if possible or typeSignature if not
-     */
-    private static String resolveSignatureRelative(final IType owningType, final String typeSignature, final boolean eraseTypeParameters)
-    {
-        // if already fully resolved, return the input
-        if (typeSignature.charAt(0) == Signature.C_RESOLVED)
-        {
-            return typeSignature;
-        }
-
-        List<String> typeParameters = new ArrayList<String>();
-
-        IType resolvedType = resolveTypeRelative(owningType, typeSignature);
-
-        if (resolvedType != null)
-        {
-            if (!eraseTypeParameters)
-            {
-                // ensure that type parameters are resolved recursively
-                for (String typeParam : Signature.getTypeArguments(typeSignature))
-                {
-                    typeParam = Signature.removeCapture(typeParam);
-                    // check and remove bound wildcarding (extends/super/?)
-                    if (Signature.getTypeSignatureKind(typeParam) == Signature.WILDCARD_TYPE_SIGNATURE)
-                    {
-                        // convert ? to Object, strip extends/super
-                        if (typeParam.charAt(0) == Signature.C_STAR)
-                        {
-                            typeParam = TypeConstants.TYPE_JAVAOBJECT;
-                        }
-                        else
-                        {
-                            typeParam = typeParam.substring(1);
-                        }
-                    }
-                    final String resolvedParameter = 
-                    	resolveSignatureRelative(
-                    			// use the enclosing type, 
-                    			// *not* the resolved type because 
-                    			// we need to resolve in that context
-                    			owningType, 
-                    				typeParam, eraseTypeParameters);
-                    typeParameters.add(resolvedParameter);
-                }
-            }
-
-            final String  resolvedTypeSignature = 
-                Signature.createTypeSignature
-                    (resolvedType.getFullyQualifiedName(), true);
-           
-
-            if (typeParameters.size() > 0 && !eraseTypeParameters)
-            {
-                StringBuffer sb = new StringBuffer(resolvedTypeSignature);
-
-                if (sb.charAt(sb.length()-1) == ';')
-                {
-                    sb = sb.delete(sb.length()-1, sb.length());
-                }
-                
-                sb.append("<"); //$NON-NLS-1$
-                for(String param : typeParameters)
-                {
-                    //System.out.println("type param: "+resolvedType.getTypeParameter(param));
-                    sb.append(param);
-                }
-                
-                // replace the dangling ',' with the closing ">"
-                sb.append(">;"); //$NON-NLS-1$
-                return sb.toString();
-            }
-            
-            return resolvedTypeSignature;
-        }
-
-        if (Signature.getTypeSignatureKind(typeSignature) == 
-                Signature.CLASS_TYPE_SIGNATURE
-            || Signature.getTypeSignatureKind(typeSignature)
-                == Signature.TYPE_VARIABLE_SIGNATURE)
-        {
-            // if we are unable to resolve, check to see if the owning type has
-            // a parameter by this name
-            ITypeParameter typeParam = owningType.getTypeParameter(Signature.getSignatureSimpleName(typeSignature));
-            
-            // if we have a type parameter and it hasn't been resolved to a type,
-            // then assume it is a method template placeholder (i.e. T in ArrayList).
-            // at runtime these unresolved parameter variables are effectively 
-            // turned into Object's.  For example, think List.add(E o).  At runtime,
-            // E will behave exactly like java.lang.Object in that signature
-            if (typeParam.exists())
-            {
-                return TypeConstants.TYPE_JAVAOBJECT;
-            }
-            
-            // TODO: is there a better way to handle a failure to resolve
-            // than just garbage out?
-            //JSFCommonPlugin.log(new Exception("Failed to resolve type: "+typeSignature), "Failed to resolve type: "+typeSignature); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-        
-        return typeSignature;
-    }
-
-    private static IType resolveTypeRelative(final IType owningType, final String typeSignature)
-    {
-        final String fullName = getFullyQualifiedName(typeSignature);
-        
-        IType resolvedType = null;
-        
-        try
-        {
-            // TODO: this call is only supported on sourceTypes!
-            String[][] resolved = owningType.resolveType(fullName);
-    
-            if (resolved != null && resolved.length > 0)
-            {
-                resolvedType = owningType.getJavaProject().findType(resolved[0][0], resolved[0][1]);
-            }
-            else
-            {
-                resolvedType = resolveInParents(owningType, fullName);
-            }
-        }
-        catch (JavaModelException jme)
-        {
-            //  do nothing; newType == null
-        }
-
-        return resolvedType;
-    }
-
-    /**
-     * @param type
-     * @return a type signature for a type
-     */
-    public static String getSignature(IType type)
-    {
-        final String fullyQualifiedName = type.getFullyQualifiedName();
-        return Signature.createTypeSignature(fullyQualifiedName, true);
-    }
-
-    
-    /**
-     * @param owner
-     * @param unresolvedSignature
-     * @return the resolved method signature for unresolvedSignature in owner
-     */
-    public static String resolveMethodSignature(final IType  owner, 
-                                         final String unresolvedSignature)
-    {
-        // get the list of parameters
-        final String[] parameters = 
-            Signature.getParameterTypes(unresolvedSignature);
-        
-        for (int i = 0; i < parameters.length; i++)
-        {
-            // try to full resolve the type
-            parameters[i] = resolveTypeSignature(owner, parameters[i]);
-        }
-        
-        // resolve return type
-        final String resolvedReturn = 
-            resolveTypeSignature(owner, 
-                                  Signature.getReturnType(unresolvedSignature));
-        
-        return Signature.createMethodSignature(parameters, resolvedReturn);
-    }
-    
-    /**
-     * @param typeSignature     
-     * @return a fully qualified Java class name from a type signature
-     * i.e. Ljava.lang.String; -> java.lang.String
-     */
-    public static String getFullyQualifiedName(final String typeSignature)
-    {
-        final String packageName = Signature.getSignatureQualifier(typeSignature);
-        final String typeName = Signature.getSignatureSimpleName(typeSignature);
-        return "".equals(packageName) ? typeName : packageName + "." + typeName;  //$NON-NLS-1$//$NON-NLS-2$
-    }
-    
-    private static IType resolveInParents(IType  childType, String fullyQualifiedName)
-                                throws JavaModelException
-    {
-        IType resolvedType = null;
-        
-        // not resolved? try the supertypes
-        final ITypeHierarchy typeHierarchy =
-            childType.newSupertypeHierarchy(new NullProgressMonitor());
-        IType[] superTypes = typeHierarchy.getAllSupertypes(childType);
-        String[][]   resolved;
-        
-        LOOP_UNTIL_FIRST_MATCH:
-            for (int i = 0; i < superTypes.length; i++)
-        {
-            IType type = superTypes[i];
-            resolved = type.resolveType(fullyQualifiedName);
-            
-            if (resolved != null && resolved.length > 0)
-            {
-                resolvedType = childType.getJavaProject().findType(resolved[0][0], resolved[0][1]);
-                break LOOP_UNTIL_FIRST_MATCH;
-            }
-        }
-
-        return resolvedType;
-    }
-    
-    /**
-     * Attempts to get a Java IType for a fully qualified signature.  Note that
-     * generic type arguments are generally ignored by JDT when doing such 
-     * look ups.
-     * 
-     * @param javaProject the project context inside which to resolve the type
-     * @param fullyResolvedTypeSignature a fully resolved type signature
-     * @return the IType if resolved, null otherwise
-     */
-    public static IType resolveType(final IJavaProject javaProject, final String fullyResolvedTypeSignature)
-    {
-        final String fullyQualifiedName =
-            getFullyQualifiedName(fullyResolvedTypeSignature);
-        
-        try {
-            return javaProject.findType(fullyQualifiedName);
-        } catch (JavaModelException e) {
-            // accessible problem
-            JSFCommonPlugin.log(e);
-            return null;
-        }
-    }
-    
-    /**
-     * @param type
-     * @param typeParamSignature -- must be a Type Variable Signature
-     * @param typeArguments
-     * @return the signature for the type argument in typeArguments that matches the
-     * named typeParamSignature in type.
-     * @throws IllegalArgumentException if typeParamSignature is not valid
-     * 
-     * For example, given type for java.util.Map, typeParamSignature == "V" and
-     * typeArguments = {Ljava.util.String;, Lcom.test.Blah;}, the result would be
-     * the typeArgument that matches "V", which is "Lcom.test.Blah;}
-     * 
-     * returns null if the match cannot be found.
-     */
-    public static String matchTypeParameterToArgument(final IType type, final String typeParamSignature, final List<String> typeArguments)
-    {
-    	if (Signature.getTypeSignatureKind(typeParamSignature) != Signature.TYPE_VARIABLE_SIGNATURE)
-    	{
-    		throw new IllegalArgumentException();
-    	}
-    	
-        try
-        {
-            ITypeParameter[] typeParams = type.getTypeParameters();
-
-            for (int pos = 0; pos < typeParams.length; pos++)
-            {
-                if (typeParams[pos].getElementName().equals(Signature.getSignatureSimpleName(typeParamSignature)))
-                {
-                    if (pos < typeArguments.size())
-                    {
-                        // TODO: should typeArguments.size ever != typeParams.length?
-                        return typeArguments.get(pos);
-                    }
-                }
-            }
-        } 
-        catch (JavaModelException e) 
-        {
-            JSFCommonPlugin.log(e);
-        }
-        
-        return null;
-    }
-    
-    /**
-     * @param type
-     * @param fieldName
-     * @return true if fieldName is a member of type.  Note that if type is java.lang.Enum
-     * then this will always return true since we cannot know what fields the instance has (it could be any enum)
-     */
-    public static boolean isEnumMember(final IType type, final String fieldName)
-    {
-        try
-        {
-            if (type == null || !isEnumType(type))
-            {
-                throw new IllegalArgumentException("type must be non-null and isEnum()==true"); //$NON-NLS-1$
-            }
-            
-            if (fieldName == null)
-            {
-                throw new IllegalArgumentException("fieldName must be non-null"); //$NON-NLS-1$
-            }
-
-            // if type is the java.lang.Enum, always true
-            if (TypeConstants.TYPE_ENUM_BASE.equals(Signature.createTypeSignature(type.getFullyQualifiedName(), true)))
-            {
-                return true;
-            }
-            
-            final IField field = type.getField(fieldName);
-
-            if (field.exists() && field.isEnumConstant())
-            {
-                return true;
-            }
-        }
-        catch (JavaModelException jme)
-        {
-            // fall through and return false
-        }
-        
-        return false;
-    }
-    
-    /**
-     * @param typeSig1 the type signature of the first enum. Must be non-null, fully resolved enum type.
-     * @param typeSig2 the type signature of the second enum.  Must be non-null, fully resolved enum type.
-     * 
-     * @return true if typeSig1.compareTo(typeSig2) is a legal operation (won't throw a CCE)
-     */
-    public static boolean isEnumsCompareCompatible(final String typeSig1, final String typeSig2)
-    {
-        if (typeSig1 == null || typeSig2 == null)
-        {
-            throw new IllegalArgumentException("args must not be null"); //$NON-NLS-1$
-        }
-        
-        if (Signature.getTypeSignatureKind(typeSig1) != Signature.CLASS_TYPE_SIGNATURE
-             || Signature.getTypeSignatureKind(typeSig2) != Signature.CLASS_TYPE_SIGNATURE)
-        {
-            throw new IllegalArgumentException("args must be resolved class types"); //$NON-NLS-1$
-        }
-        
-        // if one or the other is the raw enum type, then they *may* be comparable; we don't know
-        if (TypeConstants.TYPE_ENUM_BASE.equals(typeSig1) 
-                || TypeConstants.TYPE_ENUM_BASE.equals(typeSig2))
-        {
-            return true;
-        }
-        
-        // TODO: support the case of enum base type with generic type argument
-        
-        // only comparable if is the same class
-        return typeSig1.equals(typeSig2);
-    }
-    
-    /**
-     * @param typeSig1 the type signature of the first enum. Must be non-null, fully resolved enum type.
-     * @param typeSig2 the type signature of the second enum. Must be non-null, fully resolved enum type.
-     * @return true if instances typeSig1 and typeSig2 can never be equal due
-     * their being definitively different enum types
-     */
-    public static boolean canNeverBeEqual(final String typeSig1, final String typeSig2)
-    {
-        if (typeSig1 == null || typeSig2 == null)
-        {
-            throw new IllegalArgumentException("args must not be null"); //$NON-NLS-1$
-        }
-        
-        if (Signature.getTypeSignatureKind(typeSig1) != Signature.CLASS_TYPE_SIGNATURE
-             || Signature.getTypeSignatureKind(typeSig2) != Signature.CLASS_TYPE_SIGNATURE)
-        {
-            throw new IllegalArgumentException("args must be resolved class types"); //$NON-NLS-1$
-        }
-
-        // if either one is the base enum type, then we can't be sure
-        if (TypeConstants.TYPE_ENUM_BASE.equals(typeSig1) 
-                || TypeConstants.TYPE_ENUM_BASE.equals(typeSig2))
-        {
-            return false;
-        }
-
-        // if they are definitely not the same enum types, then their values
-        // can never be equal
-        return !typeSig1.equals(typeSig2);
-    }
-    
-
-    /**
-     * NOTE: we diverge from IType.isEnum() because we also return true if the base type
-     * is a java.lang.Enum since we consider this to be "any enumeration type" whereas JDT considers
-     * it merely a class since it doesn't use an "enum" keyword declaration.
-     * @param type
-     * @return true if type is an enum type or is java.lang.Enum
-     */
-    static boolean isEnumType(IType type)
-    {
-        if (type == null)
-        {
-            return false;
-        }
-        
-        // check if it's the enumeration base type
-        if (TypeConstants.TYPE_ENUM_BASE.equals(Signature.createTypeSignature(type.getFullyQualifiedName(), true)))
-        {
-            return true;
-        }
-    
-        try
-        {
-            return type.isEnum();
-        }
-        catch (JavaModelException jme)
-        {
-            // log and fallthrough to return false
-            JSFCommonPlugin.log(jme, "Problem resolving isEnum"); //$NON-NLS-1$
-        }
-        
-        // if unresolved assume false
-        return false;
-    }
-    
-    private TypeUtil()
-    {
-        // no external instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/CMAnnotationHelper.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/CMAnnotationHelper.java
deleted file mode 100644
index 506ee47..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/CMAnnotationHelper.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.contentmodel.annotation;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.contentmodel.annotation.internal.CMAnnotationFileRegistry;
-import org.eclipse.jst.jsf.contentmodel.annotation.internal.CMAnnotationMap;
-
-/**
- * Class meant for all public access to the design-time meta-data (CMAnnotations) values.
- * 
- * <li>Annotation files are registered against a uri (eg. http://java.sun.com/jsf/core) 
- * using the extension-point <code>org.eclipse.jst.jsf.contentmodel.annotations.annotationFiles</code>.</li>
- * <li>Any number of annotation files can be associated with the uri and against any element or attribute.</li>
- * <li>It is recommended that a single plugin should avoid registering meta-data for the same attribute or element 
- * from different annotationFiles.</li>
- * <li>A CMAnnotation allows for a collection of property values for a named property.</li>  
- * <li>Querying the registry using this helper class can return lists of <code>CMAnnotationPropertyValue</code> 
- * which allows the caller to make the determination of whether the property value is of interest or not.</li> 
- * <li>The caller can also query the registry for specific plugin supplied annotation meta-data.</li>
- * 
- * <li>-- include link to doc--</li>
- * 
- * @see org.eclipse.jst.jsf.contentmodel.annotation.internal.CMElementAnnotation
- * @see org.eclipse.jst.jsf.contentmodel.annotation.internal.CMAttributeAnnotation
- * @see CMAnnotationPropertyValue
- * 
- * also see org.eclipse.jst.jsf.contentmodel.annotations.annotationFiles extension-point
- * 
- * @deprecated see <code>org.eclipse.jst.jsf.common.metadata</code>  package
- */
-public class CMAnnotationHelper {
-	private static List EMPTY_LIST = new ArrayList(0);
-	
-	/**
-	 * Returns a list of CMAnnotationPropertyValue objects for a given property name and uri/tag/tag attribute combo.
-	 * A list is being returned because it is possible that there are multiple annotation files with the same 
-	 * named property.  Caller can decide what to do.
-	 * 
-	 * Will return empty if annotation is not found or meta-data property name not present.
-	 * 
-	 * @param uri
-	 * @param cmElementName
-	 * @param cmAttrName
-	 * @param meta_prop_name
-	 * @return list of CMAnnotationPropertyValue objects
-	 */
-	public static List getCMAttributeProperties(String uri, String cmElementName, String cmAttrName, String meta_prop_name) {
-		return getCMAttributeProperties(null, uri, cmElementName, cmAttrName, meta_prop_name);
-	}
-	
-
-	/**
-	 * Returns a list of CMAnnotationPropertyValue objects for a given bundleId, property name and uri/tag/tag attribute combo.
-	 * A list is being returned because it is possible that there are multiple annotation files with the same 
-	 * named property.  Caller can decide what to do.
-	 * 
-	 * Use this method if you are not looking for a property value from a specific bundle.  Usually the caller.
-	 * 
-	 * Will return empty if annotation is not found or meta-data property name not present.
-	 * 
-	 * @param bundleId
-	 * @param uri
-	 * @param cmElementName
-	 * @param cmAttrName
-	 * @param meta_prop_name
-	 * @return list of CMAnnotationPropertyValue objects
-	 */
-	public static List getCMAttributeProperties(String bundleId, String uri, String cmElementName, String cmAttrName, String meta_prop_name) {
-		if (!CMAnnotationFileRegistry.getInstance().hasAnnotations(uri))			
-			return EMPTY_LIST;
-		
-		List list = new ArrayList();
-		List maps = CMAnnotationFileRegistry.getInstance().getAnnotationMaps(uri);
-		if (maps != null){
-			Iterator it = maps.iterator();
-			while (it.hasNext()){
-				CMAnnotationMap map = (CMAnnotationMap)it.next();
-				if (bundleId == null || map.getFileInfo().getBundleId().equals(bundleId)){
-					CMAnnotationPropertyValue propVal =  map.getCMAttributePropertyValue(cmElementName, cmAttrName, meta_prop_name);
-					if (propVal != null){
-						list.add(propVal);
-					}
-				}
-			}
-		}
-		return list;
-	}
-	
-	/**
-	 * Convenience method to return the first string value for a given bundle, uri, element, attr, and meta_prop_name.
-	 * Caller needs to be aware that this could be a multi-value property.  If so, <code>getCMAttributePropertyValues</code>
-	 * should probably be called.
-	 * 
-	 * Caller must be sure that only one annotation meta-data file is associated with this uri from the specified bundle.  
-	 * If there are multiple annotations, only the first bundle's values will be returned.
-	 * 
-	 * Will return null if annotation is not found or meta-data property name not present.
-	 * 
-	 * @param bundleId
-	 * @param uri
-	 * @param cmElementName
-	 * @param cmAttrName
-	 * @param meta_prop_name
-	 * @return property value as String
-	 */
-	public static String getCMAttributePropertyValue(String bundleId, String uri, String cmElementName, String cmAttrName, String meta_prop_name){
-		List vals = getCMAttributeProperties(bundleId, uri, cmElementName, cmAttrName, meta_prop_name);
-		if (vals != null && !vals.isEmpty()){
-			return((CMAnnotationPropertyValue)vals.get(0)).getPropertyValue();
-		}
-		return null;
-	}
-	
-	/**
-	 * Convenience method to return the list of property values for a given bundle, uri, element, attr, and meta_prop_name.
-	 * 
-	 * Caller must be sure that only one annotation meta-data file is associated with this uri from the specified bundle.  
-	 * If there are multiple annotations, only the first bundle's values will be returned.
-	 * 
-	 * Will return empty list if annotation is not found or meta-data property name not present.
-	 * 
-	 * @param bundleId
-	 * @param uri
-	 * @param cmElementName
-	 * @param cmAttrName
-	 * @param meta_prop_name
-	 * @return property values as List
-	 */
-	public static List getCMAttributePropertyValues(String bundleId, String uri, String cmElementName, String cmAttrName, String meta_prop_name){
-		List vals = getCMAttributeProperties(bundleId, uri, cmElementName, cmAttrName, meta_prop_name);
-		if (!vals.isEmpty()){
-			return((CMAnnotationPropertyValue)vals.get(0)).getPropertyValues();
-		}
-		return EMPTY_LIST;
-	}
-	/**
-	 * Returns a list of CMAnnotationPropertyValue objects for a given property name and uri/tag element combo.
-	 * A list is being returned because it is possible that there are multiple annotation files with the same 
-	 * named property.  Caller can decide what to do.
-	 * 
-	 * Will return empty list if annotation is not found or meta-data property name not present.
-	 * 
-	 * @param uri
-	 * @param cmElementName
-	 * @param meta_prop_name
-	 * @return list of CMAnnotationPropertyValue objects
-	 */
-	public static List getCMElementProperties(String uri, String cmElementName, String meta_prop_name) {
-		return getCMElementProperties(null, uri, cmElementName, meta_prop_name);
-	}
-
-	
-	/**
-	 * Returns a list of CMAnnotationPropertyValue objects for a given bundle, property name and uri/tag element combo.
-	 * A list is being returned because it is possible that there are multiple annotation files with the same 
-	 * named property.  Caller can decide what to do.
-	 * 
-	 * Use this method if you are not looking for a property value from a specific bundle.  Usually the caller.
-	 * 
-	 * Will return empty list if annotation is not found or meta-data property name not present.
-	 * 
-	 * @param bundleId
-	 * @param uri
-	 * @param cmElementName
-	 * @param meta_prop_name
-	 * @return list of CMAnnotationPropertyValue objects
-	 */
-	public static List getCMElementProperties(String bundleId, String uri, String cmElementName, String meta_prop_name) {
-		if (!CMAnnotationFileRegistry.getInstance().hasAnnotations(uri))			
-			return EMPTY_LIST;
-		
-		List list = new ArrayList();
-		List maps = CMAnnotationFileRegistry.getInstance().getAnnotationMaps(uri);
-		if (maps != null){
-			Iterator it = maps.iterator();
-			while (it.hasNext()){
-				CMAnnotationMap map = (CMAnnotationMap)it.next();
-				if (bundleId == null || map.getFileInfo().getBundleId().equals(bundleId)){
-					CMAnnotationPropertyValue propVal =  map.getCMElementPropertyValue(cmElementName, meta_prop_name);
-					if (propVal != null){
-						list.add(propVal);
-					}
-				}
-			}
-		}
-		return list;
-	}
-	
-	/**
-	 * Convenience method to return the first string value for a given bundle, uri, element, and meta_prop_name.
-	 * Caller needs to be aware that this could be a multi-value property.  If so, <code>getCMAttributePropertyValues</code>
-	 * should probably be called.
-	 * 
-	 * Caller must be sure that only one annotation meta-data file is associated with this uri from the specified bundle.  
-	 * If there are multiple annotations, only the first bundle's values will be returned.
-	 * 
-	 * Will return null if annotation is not found or meta-data property name not present.
-	 * 
-	 * @param bundleId
-	 * @param uri
-	 * @param cmElementName
-	 * @param meta_prop_name
-	 * @return property value as String
-	 */
-	public static String getCMElementPropertyValue(String bundleId, String uri, String cmElementName, String meta_prop_name){
-		List vals = getCMElementProperties(bundleId, uri, cmElementName, meta_prop_name);
-		if (vals != null && !vals.isEmpty()){
-			return((CMAnnotationPropertyValue)vals.get(0)).getPropertyValue();
-		}
-		return null;
-	}
-	
-	/**
-	 * Convenience method to return the list of property values for a given bundle, uri, element, and meta_prop_name.
-	 * 
-	 * Caller must be sure that only one annotation meta-data file is associated with this uri from the specified bundle.  
-	 * If there are multiple annotations, only the first bundle's values will be returned.
-	 * 
-	 * Will return empty list if annotation is not found or meta-data property name not present.
-	 * 
-	 * @param bundleId
-	 * @param uri
-	 * @param cmElementName
-	 * @param meta_prop_name
-	 * @return List of property values as Strings 
-	 */
-	public static List getCMElementPropertyValues(String bundleId, String uri, String cmElementName, String meta_prop_name){
-		List vals = getCMElementProperties(bundleId, uri, cmElementName, meta_prop_name);
-		if (vals != null && !vals.isEmpty()){
-			return((CMAnnotationPropertyValue)vals.get(0)).getPropertyValues();
-		}
-		return null;
-	}
-	
-	/**
-	 * Return whether or not there are annotation files for a given uri and bundleId.
-	 * @param bundleId
-	 * @param uri
-	 * @return boolean
-	 */
-	public static boolean hasAnnotations(String bundleId, String uri) {
-		return CMAnnotationFileRegistry.getInstance().hasAnnotations(bundleId, uri);
-	}
-	
-	/**
-	 * Return whether or not there are annotation files for a given uri.
-	 * @param uri
-	 * @return boolean 
-	 */
-	public static boolean hasAnnotations(String uri) {
-		return CMAnnotationFileRegistry.getInstance().hasAnnotations(uri);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/CMAnnotationPropertyValue.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/CMAnnotationPropertyValue.java
deleted file mode 100644
index 4147572..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/CMAnnotationPropertyValue.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.contentmodel.annotation;
-
-import java.util.List;
-
-/**
- * The class used to return result of a query on the annotation model.   
- * 
- * @author Gerry Kessler - Oracle
- *
- * @deprecated see <code>org.eclipse.jst.jsf.common.metadata</code>  package
- */
-public class CMAnnotationPropertyValue {
-	private ICMAnnotationSourceFileInfo fileInfo;
-	private List propertyValues;
-	
-	/**
-	 * Constructor
-	 * @param fileInfo
-	 * @param propertyValues
-	 */
-	public CMAnnotationPropertyValue(ICMAnnotationSourceFileInfo fileInfo, List propertyValues){
-		this.fileInfo = fileInfo;
-		this.propertyValues = propertyValues;
-	}
-
-	/**
-	 * Convenience method for accessing the bundleid
-	 * @return String
-	 */
-	public String getBundleId(){
-		return fileInfo.getBundleId();
-	}
-	
-	/**
-	 * @return ICMAnnotationSourceFileInfo used to define this property
-	 */
-	public ICMAnnotationSourceFileInfo getFileInfo(){
-		return fileInfo;
-	}
-	
-	/**
-	 * Return first string property value.   
-	 * If caller expects more values, they should use getPropertyValues().
-	 * @return String  
-	 */
-	public String getPropertyValue(){
-		return ((String)propertyValues.get(0)).trim();
-	}
-	
-	/**
-	 * Return list of property values as strings for the given property
-	 * @return java.util.List
-	 */
-	public List getPropertyValues(){
-		return propertyValues;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/CMAnnotationSourceFileLocator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/CMAnnotationSourceFileLocator.java
deleted file mode 100644
index 71abc4b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/CMAnnotationSourceFileLocator.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.contentmodel.annotation;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-
-/**
- * Used to supply an InputStream to the parser of an annotation 
- * meta-data file and the URL to the resource bundle for a properties file, if any.
- * 
- * Implementors must provide a zero-argument constructor.
- * 
- * @author Gerry Kessler - Oracle
- * @deprecated see <code>org.eclipse.jst.jsf.common.metadata</code>  package
- */ 
-public abstract class CMAnnotationSourceFileLocator{
-	/**
-	 * ICMAnnotationSourceFileInfo
-	 */
-	protected ICMAnnotationSourceFileInfo fileInfo;
-	
-	/**
-	 * Set the ICMAnnotationSourceFileInfo for locator
-	 * @param fileInfo
-	 */
-	public final void setFileInfo(ICMAnnotationSourceFileInfo fileInfo){
-		this.fileInfo = fileInfo;
-	}
-	
-	/**
-	 * @return ICMAnnotationSourceFileInfo for the locator
-	 */
-	protected final ICMAnnotationSourceFileInfo getFileInfo(){
-		return fileInfo;
-	}
-	/**
-	 * Return InputStream to the meta-data annotation.  
-	 * Callers are responsble for closing the stream.
-	 * @return InputStream
-	 * @throws IOException
-	 */
-	public abstract InputStream getAnnotationSourceInputStream() throws IOException;
-	/**
-	 * Return ResourceBundle for the property files if there are any.  Return null if not.
-	 * 
-	 * @return java.util.ResourceBundle
-	 * @throws IOException
-	 * @throws MissingResourceException
-	 */
-	public abstract ResourceBundle getResourceBundle() throws IOException, MissingResourceException;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/ICMAnnotationFileParser.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/ICMAnnotationFileParser.java
deleted file mode 100644
index ebf214f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/ICMAnnotationFileParser.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.contentmodel.annotation;
-
-import org.eclipse.jst.jsf.contentmodel.annotation.internal.ICMAnnotationAdvisor;
-
-/**
- * Interface used to allow parsing of meta-data files that do not conform to the default schema provided.
- *  
- * @author Gerry Kessler - Oracle
- * 
- * also see ext-pt: org.eclipse.jst.jsf.contentmodel.annotations.annotationFile  
- * also see xml schema defn: <code>http://org.eclipse.jst.jsf.contentmodel.annotations/grammarAnnotationSchema</code>
- * @see org.eclipse.jst.jsf.contentmodel.annotation.internal.ICMAnnotationAdvisor
- * @see org.eclipse.jst.jsf.contentmodel.annotation.CMAnnotationSourceFileLocator
- * 
- * @deprecated see <code>org.eclipse.jst.jsf.common.metadata</code>  package
- */
-public interface ICMAnnotationFileParser {
-
-	/**
-	 * Parse the annotation file using the InputStream provided by the locator and   
-	 * using the ICMAnnotationAdvisor methods to fill the internal model.
-	 * 
-	 * The implementor is responsible for closing the inputstream when parse is complete.
-	 * 
-	 * @param advisor 
-	 * @param locator 
-	 * 
-	 * @throws Exception
-	 */
-	public void parse(ICMAnnotationAdvisor advisor, CMAnnotationSourceFileLocator locator) throws Exception;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/ICMAnnotationSourceFileInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/ICMAnnotationSourceFileInfo.java
deleted file mode 100644
index 8b9ca6a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/ICMAnnotationSourceFileInfo.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.contentmodel.annotation;
-
-/**
- * The interface used to access information about the annotationFile extension
- * 
- * Not intended to be implemented by clients.
- * @author Gerry Kessler - Oracle
- * 
- * @deprecated see <code>org.eclipse.jst.jsf.common.metadata</code>  package
- */
-public interface ICMAnnotationSourceFileInfo {
-	/**
-	 * @return location of annotation file that the locator class will use 
-	 */
-	public String getAnnotationFileLocation();
-	/**
-	 * @return bundle id of plugin defining the annotation file
-	 */
-	public String getBundleId();
-	/**
-	 * @return class name of parser to use on the annotation file
-	 */
-	public String getParserClassName();
-	/**
-	 * @return class name of the file locator
-	 */
-	public String getAnnotationFileLocatorClassname();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotation.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotation.java
deleted file mode 100644
index f625b77..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotation.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM - Initial API and implementation
- *   Jens Lukowski/Innoopract - initial renaming/restructuring
- *   Gerry Kessler/Oracle - code borrowed and repurposed for JSF subproject
- * 
- * 
- *******************************************************************************/
-package org.eclipse.jst.jsf.contentmodel.annotation.internal;
-
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.List;
-
-/**
- * Content model annotation.   A property with a set of values.
- * @deprecated see common.metadata package
- */
-public abstract class CMAnnotation {
-	private String _name;	
-	protected Hashtable props = new Hashtable(3);
-
-	public CMAnnotation(String name) {
-		setName(name.trim());
-	}
-
-	private void setName(String name) {
-		_name = name;
-	}
-
-	public String getName() {
-		return _name;
-	}
-
-	public void setProperty(String propertyName, String propertyValue) {
-		CMAnnotationProperty prop = getAnnotationProperty(propertyName);
-		if (prop == null){
-			prop = new CMAnnotationProperty(propertyName, propertyValue);
-			props.put(propertyName, prop);
-		}
-		else {
-			prop.setValue(propertyValue);
-		}		
-	}
-
-	public CMAnnotationProperty getAnnotationProperty(String propertyName){
-		if (props.containsKey(propertyName))
-			return (CMAnnotationProperty)props.get(propertyName);
-		return null;
-	}
-	
-	class CMAnnotationProperty {
-		private String propName;
-		private List propValues = new ArrayList(2);
-		
-		public CMAnnotationProperty(String propertyName){
-			propName = propertyName;
-		}
-
-		public CMAnnotationProperty(String propertyName, String propertyValue){
-			propName = propertyName;
-			propValues.add(propertyValue);
-		}
-		
-		public void setValue(String propertyValue) {
-			propValues.add(propertyValue);
-		}
-		
-		public String getPropertyName(){
-			return propName;
-		}
-		
-		public List getPropertyValues(){
-			return propValues;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationAdvisor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationAdvisor.java
deleted file mode 100644
index fc8bce1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationAdvisor.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.contentmodel.annotation.internal;
-
-import org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationSourceFileInfo;
-
-/**
- * An internal class implementing ICMAnnotationAdvisor that allows us to decouple the parser
- * from the internal data model (CMAnnotationMap).
- * 
- * @author Gerry Kessler - Oracle
- * @deprecated see common.metadata package
- */
-public final class CMAnnotationAdvisor implements ICMAnnotationAdvisor {
-
-	private CMAnnotationMap map;
-
-	public CMAnnotationAdvisor(CMAnnotationMap map) {
-		this.map = map;
-		setCaseSensitive(true);// default to case sensitive
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.contentmodel.annotation.internal.ICMAnnotationAdvisor#addElementAnnotation(java.lang.String, java.lang.String, java.lang.String)
-	 */
-	public void addElementAnnotation(String elementName, String propertyName, String propertyValue) {
-
-		CMElementAnnotation elem = getElementAnnotation(getStringValueForCaseSensitivity(elementName));
-		elem.setProperty(getStringValueForCaseSensitivity(propertyName), propertyValue);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.contentmodel.annotation.internal.ICMAnnotationAdvisor#addAttributeAnnotation(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
-	 */
-	public void addAttributeAnnotation(String elementName, String attributeName,
-			String propertyName, String propertyValue) {
-
-		CMElementAnnotation elem = getElementAnnotation(getStringValueForCaseSensitivity(elementName));
-		CMAttributeAnnotation attr = getAttributeAnnotation(elem,
-				getStringValueForCaseSensitivity(attributeName));
-		attr.setProperty(getStringValueForCaseSensitivity(propertyName), propertyValue);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.contentmodel.annotation.internal.ICMAnnotationAdvisor#getFileInfo()
-	 */
-	public ICMAnnotationSourceFileInfo getFileInfo() {
-		return this.map.getFileInfo();
-	}
-
-	/**
-	 * This implementation is case sensitive by default
-	 * 
-	 * @see org.eclipse.jst.jsf.contentmodel.annotation.internal.ICMAnnotationAdvisor#setCaseSensitive(boolean)
-	 */
-	public void setCaseSensitive(boolean val) {
-		map.setCaseSensitive(val);
-	}
-
-	private CMElementAnnotation getElementAnnotation(String elementName) {
-		CMElementAnnotation elem = map.getElementAnnotation(elementName);
-		if (elem == null) {
-			elem = new CMElementAnnotation(elementName);
-			map.addCMElementAnnotation(elem);
-		}
-		return elem;
-	}
-
-	private CMAttributeAnnotation getAttributeAnnotation(CMElementAnnotation elem,
-			String attributeName) {
-		// attrAnnotations map will always be initialized so do not need to check for null
-		CMAttributeAnnotation attr = (CMAttributeAnnotation) elem.getAttributeAnnotations().get(
-				attributeName);
-		if (attr == null) {
-			attr = new CMAttributeAnnotation(elem.getName(), attributeName);
-			elem.addCMAttributeAnnotation(attr);
-		}
-		return attr;
-	}
-
-	private String getStringValueForCaseSensitivity(String val) {
-		return map.getStringValueForCaseSensitivity(val);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileInfo.java
deleted file mode 100644
index c9526c0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileInfo.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM - Initial API and implementation
- *   Jens Lukowski/Innoopract - initial renaming/restructuring
- *   Gerry Kessler/Oracle - code borrowed and repurposed for JSF subproject
- * 
- * 
- *******************************************************************************/
-package org.eclipse.jst.jsf.contentmodel.annotation.internal;
-
-import org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationSourceFileInfo;
-
-/**
- * Contains information about annotation files.  
- * @deprecated see common.metadata package
- */
-public final class CMAnnotationFileInfo implements ICMAnnotationSourceFileInfo{
-	private String annotationFileLocation;
-	private String annotationFileLocatorClassname;
-	private String bundleId;
-	private String parserClassname;
-
-	public CMAnnotationFileInfo(String annotationFileLocation, String bundleId, String parserClassname, String annotationFileLocatorClassname) {
-		this.annotationFileLocation = annotationFileLocation.trim();
-		this.bundleId = bundleId.trim();
-		this.parserClassname = parserClassname;
-		this.annotationFileLocatorClassname = annotationFileLocatorClassname;
-	}
-
-	/**
-	 * Get the location of the annotation file as originally specified.
-	 * 
-	 * @return String
-	 */
-	public String getAnnotationFileLocation() {
-		return annotationFileLocation;
-	}
-	
-	/**
-	 * Get the annotation file locator classname that must implement ICMAnnotationSourceFileLocator.
-	 * Can return null or empty string.   Caller should provide default.
-	 * 
-	 * @return String
-	 */
-	public String getAnnotationFileLocatorClassname() {
-		return annotationFileLocatorClassname != null ? annotationFileLocatorClassname.trim() : null;
-	}
-
-	/**
-	 * Get the bundle id of the plugin where the annotation file is located.
-	 * 
-	 * @return String
-	 */
-	public String getBundleId() {
-		return bundleId;
-	}
-	
-	/**
-	 * Return classname for the annotation file parser (ICMAnnotationFileParser) to use.
-	 * Can return null or empty string.   If it does, the caller should provide a default.
-	 * 
-	 * @return String
-	 */
-	public String getParserClassName(){
-		return parserClassname != null ? parserClassname.trim() : null;
-	}
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileParser.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileParser.java
deleted file mode 100644
index 1fa3ec9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileParser.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM - Initial API and implementation
- *   Jens Lukowski/Innoopract - initial renaming/restructuring
- * 	 Gerry Kessler/Oracle - code borrowed and repurposed for JSF subproject
- *
- *******************************************************************************/
-package org.eclipse.jst.jsf.contentmodel.annotation.internal;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.contentmodel.annotation.CMAnnotationSourceFileLocator;
-import org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationFileParser;
-import org.xml.sax.Attributes;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * Default implementation of ICMAnnotationFileParser that will parse xml files conforming to 
- * http://org.eclipse.jst.jsf.contentmodel.annotations/grammarAnnotationSchema.   
- * 
- * @author Gerry Kessler - Oracle
- * 
- * also see http://org.eclipse.jst.jsf.contentmodel.annotations/grammarAnnotationSchema
- * @deprecated see common.metadata package
- */
-public class CMAnnotationFileParser implements ICMAnnotationFileParser {
-	
-	public static final String TAG_ID_ANNOTATIONS = "grammar-annotations"; //$NON-NLS-1$
-	public static final String TAG_ID_ELEMENT = "cm-element"; //$NON-NLS-1$
-	public static final String TAG_ID_ATTRIBUTE = "cm-attribute"; //$NON-NLS-1$
-	public static final String TAG_ID_PROPERTY = "property"; //$NON-NLS-1$
-	public static final String TAG_ID_PROPERTY_VALUE = "value"; //$NON-NLS-1$
-
-	/**
-	 * This method is called to parse an annotation file and store the contents
-	 * into an annotationMap via the advisor
-	 */
-	private void parse(ICMAnnotationAdvisor advisor, InputStream input) throws Exception {
-		ClassLoader prevClassLoader = Thread.currentThread().getContextClassLoader();
-		try {
-			SAXParserFactory factory = SAXParserFactory.newInstance();
-			factory.setNamespaceAware(true);
-			SAXParser parser = factory.newSAXParser();
-			parser.parse(new InputSource(input), new CMAnnotationMapContentHandler(advisor));
-		} finally {
-			Thread.currentThread().setContextClassLoader(prevClassLoader);
-			if (input != null){
-				try {
-					input.close();
-				} catch (IOException e) {
-                    JSFCommonPlugin.log(e, "error closing annotation file");
-				}
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationFileParser#parse(org.eclipse.jst.jsf.contentmodel.annotation.internal.ICMAnnotationAdvisor, org.eclipse.jst.jsf.contentmodel.annotation.CMAnnotationSourceFileLocator)
-	 */
-	public void parse(ICMAnnotationAdvisor advisor, CMAnnotationSourceFileLocator locator)
-			throws Exception {
-		
-		InputStream inputStream = locator.getAnnotationSourceInputStream();
-		parse(advisor, inputStream);
-	}
-
-	/**
-	 * Default content handler for annotation files following grammar-annotations schema
-	 * 
-	 * @author Gerry Kessler - Oracle
-	 */
-	protected class CMAnnotationMapContentHandler extends DefaultHandler {
-		private ICMAnnotationAdvisor advisor;
-		private String elementName;
-		private String attributeName;
-		private String currentPropertyName;
-		private String currentPropertyValue;
-		private StringBuffer propertyValueBuffer;
-
-		private boolean isInCMAttribute = false;
-
-		private boolean doCaptureNodeText;
-
-		/**
-		 * Constructor
-		 * @param advisor
-		 */
-		public CMAnnotationMapContentHandler(ICMAnnotationAdvisor advisor) {
-			this.advisor = advisor;
-		}
-
-		public void startElement(String uri, String localName, String qName, Attributes attributes)
-				throws SAXException {
-			if (localName.equals(TAG_ID_ANNOTATIONS)) {
-				int attributesLength = attributes.getLength();
-				for (int i = 0; i < attributesLength; i++) {
-					String attributeName_ = attributes.getLocalName(i);
-					String attributeValue = attributes.getValue(i);
-					if (attributeName_.equals("caseSensitive")) { //$NON-NLS-1$					
-						if (attributeValue.trim().equals("false")) {//$NON-NLS-1$
-							advisor.setCaseSensitive(false);
-						}
-					}
-				}
-			} else if (localName.equals(TAG_ID_ELEMENT)) {
-				isInCMAttribute = false;
-				elementName = attributes.getValue("name"); //$NON-NLS-1$
-			} else if (localName.equals(TAG_ID_ATTRIBUTE)) {
-				isInCMAttribute = true;
-				attributeName = attributes.getValue("name"); //$NON-NLS-1$
-			} else if (localName.equals(TAG_ID_PROPERTY)) {
-				currentPropertyName = attributes.getValue("name"); //$NON-NLS-1$					
-			} else if (localName.equals(TAG_ID_PROPERTY_VALUE)) {
-				propertyValueBuffer = new StringBuffer();
-				doCaptureNodeText = true;
-			}
-		}
-
-		public void endElement(String uri, String localName, String qName) throws SAXException {
-			if (currentPropertyName != null && localName.equals(TAG_ID_PROPERTY_VALUE)) {
-				doCaptureNodeText = false;
-				currentPropertyValue = propertyValueBuffer.toString();
-				if (currentPropertyValue != null) {					
-					if (isInCMAttribute)
-						advisor.addAttributeAnnotation(elementName, attributeName,
-								currentPropertyName, currentPropertyValue);
-					else
-						advisor.addElementAnnotation(elementName, currentPropertyName,
-								currentPropertyValue);
-				}
-			}
-
-			if (localName.equals(TAG_ID_ELEMENT)) {
-				elementName = null;
-			} else if (localName.equals(TAG_ID_ATTRIBUTE)) {
-				isInCMAttribute = false;
-				attributeName = null;
-			} else if (localName.equals(TAG_ID_PROPERTY)) {
-				currentPropertyName = null;
-			} else if (localName.equals(TAG_ID_PROPERTY_VALUE)) {
-				currentPropertyValue = null;
-			}
-		}
-
-		public void characters(char[] ch, int start, int length) {
-			if (doCaptureNodeText)
-				propertyValueBuffer.append(ch, start, length);
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileParserHelper.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileParserHelper.java
deleted file mode 100644
index d5114ad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileParserHelper.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.contentmodel.annotation.internal;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.contentmodel.annotation.CMAnnotationSourceFileLocator;
-import org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationFileParser;
-import org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationSourceFileInfo;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.Bundle;
-
-/**
- * Helper class used by the annotations registry to parse and poplulate the annotation maps using
- * the specified parsed, and source file locator from the extension.
- * 
- * @author Gerry Kessler - Oracle
- * @deprecated see common.metadata package
- */
-public class CMAnnotationFileParserHelper {
-	private static final String DEFAULT_PARSER_NAME = "org.eclipse.jst.jsf.contentmodel.annotation.internal.CMAnnotationFileParser"; //$NON-NLS-1$
-	private static final String DEFAULT_LOCATOR_NAME = "org.eclipse.jst.jsf.contentmodel.annotation.internal.CMPluginRelativeSourceFileLocator"; //$NON-NLS-1$
-	
-	public CMAnnotationFileParserHelper() {
-		super();
-	}
-	
-	public void parse(CMAnnotationMap map){
-		ICMAnnotationFileParser parser = getParser(map.getFileInfo());
-		ICMAnnotationAdvisor advisor = new CMAnnotationAdvisor(map);
-		CMAnnotationSourceFileLocator locator = getLocator(map.getFileInfo());
-		map.setLocator(locator);
-		try {
-			parser.parse(advisor, locator);
-		} catch (Exception e) {
-			JSFCommonPlugin.log(e, NLS.bind(Messages.CMAnnotationFileParserHelper_unable_to_parse , new String[]{map.getFileInfo().getAnnotationFileLocation(), map.getFileInfo().getAnnotationFileLocatorClassname()}));
-		}
-	}
-
-	private ICMAnnotationFileParser getParser(ICMAnnotationSourceFileInfo fileInfo) {
-		String parserClassName = fileInfo.getParserClassName();
-		Object obj = null;
-		if (parserClassName != null && !parserClassName.equals("")){ //$NON-NLS-1$
-			obj = getObjectForClassname(fileInfo.getBundleId(), parserClassName);
-		}
-		else {//return default			
-			obj = getObjectForClassname(JSFCommonPlugin.PLUGIN_ID, DEFAULT_PARSER_NAME );
-		}
-		if (obj != null && obj instanceof ICMAnnotationFileParser)
-			return (ICMAnnotationFileParser)obj;
-		
-		return null;
-	}
-	
-	private CMAnnotationSourceFileLocator getLocator(ICMAnnotationSourceFileInfo fileInfo) {
-		String locatorClassName = fileInfo.getAnnotationFileLocatorClassname();
-		Object obj = null;
-		if (locatorClassName != null && !locatorClassName.equals("")){ //$NON-NLS-1$
-			obj = getObjectForClassname(fileInfo.getBundleId(), locatorClassName);
-		}
-		else {//return default			
-			obj = getObjectForClassname(JSFCommonPlugin.PLUGIN_ID, DEFAULT_LOCATOR_NAME);
-		}
-		if (obj != null && obj instanceof CMAnnotationSourceFileLocator){
-			CMAnnotationSourceFileLocator locator = (CMAnnotationSourceFileLocator)obj;
-			locator.setFileInfo(fileInfo);
-			return locator;
-		}
-		return null;
-	}
-	
-	private static Object getObjectForClassname(String bundleId, String providerClassName){
-		try {
-			Bundle bundle =Platform.getBundle(bundleId);
-			if (bundle == null){
-				JSFCommonPlugin.log(IStatus.ERROR, NLS.bind(Messages.CMAnnotationFileParserHelper_unable_to_find_bundleid, new String[]{bundleId, providerClassName}));
-				return null;
-			}
-			Class klass = bundle.loadClass(providerClassName);
-			if (klass != null){
-				return klass.newInstance();					
-			}
-			return null;
-		} catch (ClassNotFoundException e) {
-			JSFCommonPlugin.log(e, NLS.bind(Messages.CMAnnotationFileParserHelper_class_not_found, new String[]{bundleId, providerClassName}));
-		} catch (InstantiationException e) {
-			JSFCommonPlugin.log(e, NLS.bind(Messages.CMAnnotationFileParserHelper_instantiation_exception, new String[]{bundleId, providerClassName}));
-		} catch (IllegalAccessException e) {
-			JSFCommonPlugin.log(e, NLS.bind(Messages.CMAnnotationFileParserHelper_illegal_access_exception, new String[]{bundleId, providerClassName}));
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileRegistry.java
deleted file mode 100644
index 50f093e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileRegistry.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM - Initial API and implementation
- *   Jens Lukowski/Innoopract - initial renaming/restructuring
- * 	 Gerry Kessler/Oracle - code borrowed and repurposed for JSF subproject
- *
- *******************************************************************************/
-package org.eclipse.jst.jsf.contentmodel.annotation.internal;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationSourceFileInfo;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * This internal class is used to associate one or more annotation files with a grammar
- * file mapped by a key (uri).
- * 
- * Using the CMAnnotationFileRegistryReader, extenders of <code>org.eclipse.jst.jsf.contentmodel.annotations.annotationFiles</code> are loaded
- * into the annotationFilesMap keyed by uri.   There can be multiple annotationFiles mapped to the same uri.
- * 
- * This registry should only be accessed by clients using the <code>org.eclipse.jst.jsf.contentmodel.annotation.CMAnnotationHelper</code>.
- * Only when the system attempts to access an annotation for a content model, will the file be parsed and cached.
- * 
- * When queried, CMAnnotationPropertyValue objects are returned for each named property found in each annotation file for a particular uri.
- * 
- * also see org.eclipse.jst.jsf.contentmodel.annotations.annotationFiles extension-point
- * @see CMAnnotationFileRegistryReader
- * @see CMAnnotationMap
- * @see org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationSourceFileInfo
- * 
- * @deprecated see common.metadata package
- */
-public final class CMAnnotationFileRegistry {
-	//all annotation files registered using "org.eclipse.jst.jsf.contentmodel.annotations.annotationFiles" ext-pt. and keyed by uri.  
-	private Map annotationFilesMap 	= new HashMap(1);
-	//will return list of CMAnnotationMap (parsed annotation files) objects keyed by uri
-	private Map parsedFilesMap 		= new HashMap(1);
-
-	private static CMAnnotationFileRegistry reg;
-	
-	private static final boolean DISABLED = true;
-	
-	public static CMAnnotationFileRegistry getInstance() {
-		if (reg == null){
-			reg = new CMAnnotationFileRegistry();
-		}
-		return reg;
-		
-	}
-	
-	//constructor reads the annotationFile registry and populates the annotationFilesMap
-	private CMAnnotationFileRegistry() {
-		if (!(DISABLED))
-			new CMAnnotationFileRegistryReader(this).readRegistry();
-	}
-	
-	private synchronized List getAnnotationFilesInfos(String uri) {
-		List theList = (List) annotationFilesMap.get(uri);
-		return theList != null ? theList : new ArrayList();
-	}
-		
-	/**
-	 * For use by registry reader only
-	 * @param uri
-	 * @param fileInfo 
-	 */
-	public synchronized void addAnnotationFileInfo(String uri, ICMAnnotationSourceFileInfo fileInfo) {
-		List fileInfos = (List) annotationFilesMap.get(uri);
-		if (fileInfos == null) {
-			fileInfos = new ArrayList();
-			annotationFilesMap.put(uri, fileInfos);
-		}
-		fileInfos.add(fileInfo);
-	}	
-	
-	private synchronized void addParsedFileToMap(String uri, CMAnnotationMap map) {
-		List maps = (List) parsedFilesMap.get(uri);
-		if (maps == null) {
-			maps = new ArrayList();
-			parsedFilesMap.put(uri, maps);
-		}
-		maps.add(map);
-	}
-
-	/**
-	 * Return list of CMAnnotationMaps for a given uri.  
-	 * By calling this method, unparsed annotation files for the given 
-	 * uri will be parsed.
-	 * 
-	 * @param uri
-	 * @return List of CMAnnotationMaps
-	 */
-	public synchronized List getAnnotationMaps(String uri) {
-		if (DISABLED){
-			JSFCommonPlugin.log(IStatus.ERROR, "Attempted metadata access using CMAnnotationFiles for uri: "+uri+".   Use org.eclipse.jst.jsf.common.metadata, instead." );
-			return Collections.EMPTY_LIST;
-		}
-		
-		List list = (List)parsedFilesMap.get(uri);
-		if (list == null){
-			loadAnnotationsForGrammar(uri);
-			list = (List)parsedFilesMap.get(uri);
-		}
-		return list;
-	}
-	
-
-	/**
-	 * Does this bundle define an annotationFile extension for the given uri.
-	 * 
-	 * @param bundleId
-	 * @param uri
-	 * @return boolean
-	 */
-	public boolean hasAnnotations(String bundleId, String uri) {
-//		if (DISABLED){
-//			
-//		}
-		List maps = (List)annotationFilesMap.get(uri);
-		if (maps == null || maps.size() ==0)
-			return false;
-		
-		for (int i=0;i<maps.size();i++){
-			if (((ICMAnnotationSourceFileInfo)maps.get(i)).getBundleId().equals(bundleId))
-				return true;
-		}
-		return false;
-	}
-	/**
-	 * Are there any annotationFile extensions defined for the given uri.
-	 * @param uri
-	 * @return boolean
-	 */
-	public boolean hasAnnotations(String uri){
-		if (DISABLED){
-			JSFCommonPlugin.log(IStatus.ERROR, "Attempted metadata access using CMAnnotationFiles for uri: "+uri+".   Use org.eclipse.jst.jsf.common.metadata, instead." );
-			return false;
-		}
-		if (annotationFilesMap.get(uri) != null)
-			return true;
-		return false;
-	}
-
-	private boolean areAnnotationsParsed(String uri) {
-		if (hasAnnotations(uri)){
-			if (parsedFilesMap.get(uri) != null)
-				return true;
-		}
-		return false;
-	}
-	
-	private void loadAnnotationsForGrammar(String uri) {
-		if (areAnnotationsParsed(uri))
-			return;
-		
-		if (DISABLED)
-			return;
-		
-		List annotationFiles = getAnnotationFilesInfos(uri);
-		for (Iterator i = annotationFiles.iterator(); i.hasNext();) {
-			try {					
-				CMAnnotationFileInfo annotationFileInfo = (CMAnnotationFileInfo) i.next();
-				CMAnnotationMap map = new CMAnnotationMap(annotationFileInfo);
-				CMAnnotationFileParserHelper parserHelper = new CMAnnotationFileParserHelper();
-				parserHelper.parse(map);
-				addParsedFileToMap(uri, map);
-			}
-			catch (Exception e) {
-                JSFCommonPlugin.log(e, NLS.bind(Messages.CMAnnotationFileRegistry_load_error, new String[]{uri}));				
-			}
-		}		
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileRegistryReader.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileRegistryReader.java
deleted file mode 100644
index 46f0a7a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationFileRegistryReader.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM - Initial API and implementation
- *   Jens Lukowski/Innoopract - initial renaming/restructuring
- *   Gerry Kessler/Oracle - code borrowed and repurposed for JSF subproject
- *
- *******************************************************************************/
-package org.eclipse.jst.jsf.contentmodel.annotation.internal;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.osgi.util.NLS;
-
-
-/**
- * This class reads the Activator manifests and adds each specified grammar
- * annotation file to the CMAnnotationsRegistry.
- * 
- * @see CMAnnotationFileRegistry
- * also see org.eclipse.jst.jsf.contentmodel.annotations.annotationFiles extension-point
- * @deprecated see common.metadata package
- */
-public class CMAnnotationFileRegistryReader {
-	protected static final String EXTENSION_POINT_ID = "annotationFiles"; //$NON-NLS-1$
-	protected static final String TAG_NAME = "annotationFile"; //$NON-NLS-1$
-	protected static final String ATT_URI = "uri"; //$NON-NLS-1$
-	protected static final String ATT_LOCATION = "location"; //$NON-NLS-1$
-	protected static final String ATT_LOCATOR = "locator"; //$NON-NLS-1$
-	protected static final String ATT_PARSER = "parser"; //$NON-NLS-1$
-
-	private CMAnnotationFileRegistry annotationFileRegistry;
-
-	public CMAnnotationFileRegistryReader(CMAnnotationFileRegistry annotationFileRegistry) {
-		this.annotationFileRegistry = annotationFileRegistry;
-	}
-
-	/**
-	 * read the registery
-	 */
-	public void readRegistry() {
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint point = extensionRegistry.getExtensionPoint(JSFCommonPlugin.PLUGIN_ID, EXTENSION_POINT_ID);
-		if (point != null) {
-			IConfigurationElement[] elements = point.getConfigurationElements();
-			for (int i = 0; i < elements.length; i++) {
-				readElement(elements[i]);
-			}
-		}
-	}
-
-	private void readElement(IConfigurationElement element) {
-		if (element.getName().equals(TAG_NAME)) {
-			String uri = element.getAttribute(ATT_URI);
-			String location = element.getAttribute(ATT_LOCATION);
-			String locator = element.getAttribute(ATT_LOCATOR);
-			String parser = element.getAttribute(ATT_PARSER);
-			String bundleId = null;
-			if (uri != null && location != null) {
-				try {
-					bundleId = element.getContributor().getName();
-					CMAnnotationFileInfo fileInfo = new CMAnnotationFileInfo(location, bundleId, parser, locator);
-					annotationFileRegistry.addAnnotationFileInfo(uri, fileInfo);
-				}
-				catch (Exception e) {
-					JSFCommonPlugin.log(e, NLS.bind(Messages.CMAnnotationFileRegistryReader_problem, new String[]{bundleId, uri, location})); 
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationMap.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationMap.java
deleted file mode 100644
index f777eb3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAnnotationMap.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM - Initial API and implementation
- *   Jens Lukowski/Innoopract - initial renaming/restructuring
- *   Oracle - code borrowed and repurposed for JSF subproject
- *
- *******************************************************************************/
-package org.eclipse.jst.jsf.contentmodel.annotation.internal;
-
-import java.io.IOException;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-import java.util.Vector;
-
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.contentmodel.annotation.CMAnnotationPropertyValue;
-import org.eclipse.jst.jsf.contentmodel.annotation.CMAnnotationSourceFileLocator;
-import org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationSourceFileInfo;
-import org.eclipse.osgi.util.NLS;
-
-
-/**
- * Internal data model of content model annotations.   
- * The content model is assumed to be xml-based (elements and attributes).
- * 
- * Map of annotations for content model elements keyed by tag element name.
- * Attribute annotations are stored in a map inside the element annotation.
- * 
- *  @see org.eclipse.jst.jsf.contentmodel.annotation.internal.CMElementAnnotation
- *  @see org.eclipse.jst.jsf.contentmodel.annotation.internal.CMAttributeAnnotation
- * 
- * @deprecated see common.metadata package
- */
-public class CMAnnotationMap {
-	//map of tag-element annotations keyed by tag name
-	protected Map cmNodeToAnnotationMap = new Hashtable();
-	protected boolean isCaseSensitive = true;
-	protected ICMAnnotationSourceFileInfo fileInfo;
-	private ResourceBundle resourceBundle;
-	private CMAnnotationSourceFileLocator locator;
-
-	/**
-	 * Constructor
-	 * @param fileInfo 
-	 */
-	public CMAnnotationMap(ICMAnnotationSourceFileInfo fileInfo) {
-		this.fileInfo = fileInfo;
-	}
-
-	/**
-	 * Set whether or not the model should be queried in a case sensitive manner
-	 * @param isCaseSensitive 
-	 */
-	public void setCaseSensitive(boolean isCaseSensitive) {
-		this.isCaseSensitive = isCaseSensitive;
-	}
-
-	/**
-	 * Set the ICMAnnotationSourceFileLocator used to find and load the annotation file
-	 * @param locator
-	 */
-	public void setLocator(CMAnnotationSourceFileLocator locator){
-		this.locator = locator;
-	}
-	
-	/**
-	 * Return  the annotation for the specified element name.
-	 * Will be null if no annotation is found.
-	 * 
-	 * @param elementName
-	 * @return CMElementAnnotation
-	 */
-	public CMElementAnnotation getElementAnnotation(String elementName) {
-		CMElementAnnotation elem = null;
-		if (cmNodeToAnnotationMap.containsKey(elementName)){
-			List annos = (List)cmNodeToAnnotationMap.get(elementName);
-			Iterator it = annos.iterator();
-			while(it.hasNext()){
-				elem = (CMElementAnnotation)it.next();
-				if (elem.getName() == elementName)
-					break;
-			}
-		}		
-		return elem;
-	}
-	
-	/**
-	 * Annotation advisor will call this method when adding an annotation to a map.
-	 * 
-	 * @param annotation
-	 */
-	public void addCMElementAnnotation(CMElementAnnotation annotation) {
-		addAnnotationForCMNodeName(annotation.getName(), annotation);
-	}
-
-	private void addAnnotationForCMNodeName(String cmNodeName, CMElementAnnotation annotation) {
-		List list = (List) cmNodeToAnnotationMap.get(cmNodeName);
-		if (list == null) {
-			list = new Vector();
-			cmNodeToAnnotationMap.put(cmNodeName, list);
-		}
-		list.add(annotation);
-	}
-
-	/**
-	 * Returns list of NLS fixed String values for a given property name of an element.
-	 * 
-	 * @param elementName
-	 * @param propertyName
-	 * @return List of Strings - can be null
-	 */
-	public List getCMElementPropertyValues(String elementName, String propertyName) {
-		List result = null;
-		String key = getStringValueForCaseSensitivity(elementName);
-		String propName = getStringValueForCaseSensitivity(propertyName);
-		List annotationList = (List) cmNodeToAnnotationMap.get(key);
-		if (annotationList != null) {
-			for (Iterator i = annotationList.iterator(); i.hasNext();) {
-				CMAnnotation annotation = (CMAnnotation) i.next();
-				if (annotation.getAnnotationProperty(propName)!= null) {
-					result = getNLSPropertyValues(annotation, propName);
-					break;
-				}
-			}
-		}
-		return result;
-	}
-	
-	/**
-	 * Returns the first NLS fixed String value for a given property name of an element.
-	 * Caller should use <code>getCMElementPropertyValues</code> if multiple values can be returned for a
-	 * property name.
-	 * 
-	 * @param elementName
-	 * @param propertyName
-	 * @return String - can be null
-	 */
-	public String getCMElementProperty(String elementName, String propertyName) {
-		String result = null;
-		List vals = getCMElementPropertyValues(elementName, propertyName);
-		if (vals != null){
-			if (vals.get(0) != null)
-				result = vals.get(0).toString();
-		}
-		return result;
-	}
-	
-	/**
-	 * Returns list of NLS fixed String values for a given property name of an attribute of a particular element.
-	 * 
-	 * @param elementName
-	 * @param propertyName
-	 * @return List of Strings - can be null
-	 */
-	public List getCMAttributePropertyValues(String elementName, String attributeName, String propertyName) {
-		List result = null;
-		String key = getStringValueForCaseSensitivity(elementName);
-		String attrName = getStringValueForCaseSensitivity(attributeName);
-		String propName = getStringValueForCaseSensitivity(propertyName);		
-		List annotationListForElement = (List) cmNodeToAnnotationMap.get(key);
-		if (annotationListForElement != null) {
-			CMAttributeAnnotation annotationForAttr = getCMAttributeAnnotation(annotationListForElement, attrName);
-			if (annotationForAttr != null){
-				if (annotationForAttr.getAnnotationProperty(propName) != null){
-					List propVals = getNLSPropertyValues(annotationForAttr, propName);
-					if (propVals != null)
-						result = propVals;
-				}
-			}
-		}
-		return result;
-	}
-		
-	/**
-	 * Gets the first property value for the specified element and attribute.
-	 * 
-	 * @param elementName
-	 * @param attributeName
-	 * @param propertyName
-	 * @return String - can be null
-	 */
-	public String getCMAttributeProperty(String elementName, String attributeName, String propertyName) {
-		String result = null;
-		List propVals = getCMAttributePropertyValues(elementName, attributeName, propertyName);
-		if (propVals != null){
-			result = (String)propVals.get(0);
-		}
-		return result;
-	}
-
-	/**
-	 * Return a <code>CMAnnotationPropertyValue</code> object for the given element, attribute, and property name.
-	 * 
-	 * @param elementName
-	 * @param attributeName
-	 * @param propertyName
-	 * @return CMAnnotationPropertyValue - can be null
-	 */
-	public CMAnnotationPropertyValue getCMAttributePropertyValue(String elementName, String attributeName, String propertyName) {
-		CMAnnotationPropertyValue result = null;
-		List val = getCMAttributePropertyValues(elementName, attributeName, propertyName);
-		if (val != null){
-			result = new CMAnnotationPropertyValue(fileInfo, val);
-		}
-		return result;
-	}
-	
-	/**
-	 * Return a <code>CMAnnotationPropertyValue</code> object for the given element and property name.
-	 * 
-	 * @param elementName
-	 * @param propertyName
-	 * @return CMAnnotationPropertyValue - can be null
-	 */
-	public CMAnnotationPropertyValue getCMElementPropertyValue(String elementName, String propertyName) {
-		CMAnnotationPropertyValue result = null;
-		List val = getCMElementPropertyValues(elementName, propertyName);
-		if (val != null){
-			result = new CMAnnotationPropertyValue( fileInfo, val);
-		}
-		return result;
-	}
-	
-	private CMAttributeAnnotation getCMAttributeAnnotation(List annotationListForElement, String attributeName) {
-		for (int i=0;i < annotationListForElement.size();i++){
-			CMElementAnnotation annotationForElement = (CMElementAnnotation)annotationListForElement.get(i);
-			if (annotationForElement != null){
-				Map attributeAnnotations = annotationForElement.getAttributeAnnotations();
-				if (attributeAnnotations != null){
-					CMAttributeAnnotation attributeAnnotation = (CMAttributeAnnotation)attributeAnnotations.get(attributeName);
-					if (attributeAnnotation != null){
-						return attributeAnnotation;
-					}
-				}
-			}
-		}
-		return null ;
-	}
-
-	private List getNLSPropertyValues(CMAnnotation annotation, String propertyName){
-		List result =  annotation.getAnnotationProperty(propertyName).getPropertyValues();
-		for (int i=0;i<result.size();i++){
-			String val = (String)result.get(i);
-			if (val.startsWith("%") && !val.startsWith("%%")){ //$NON-NLS-1$ //$NON-NLS-2$
-				val = getNLSPropertyValue(val);
-				result.set(i, val);
-				//also update property annotation to avoid needing to go thru bundle next time
-				annotation.getAnnotationProperty(propertyName).getPropertyValues().set(i, val);
-			}
-		}
-		return result;
-	}
-
-	//will return null if there is an IOException with ResourceBundle
-	private String getNLSPropertyValue(String val){
-		String NOT_FOUND = Messages.CMAnnotationMap_key_not_found;
-		try{
-			ResourceBundle resourceBundle_ = getResourceBundle();		
-			if (resourceBundle_ != null){
-				String replVal = resourceBundle_.getString(val.substring(1));
-				return replVal;
-			}
-			//return original string
-			return val; 
-		} catch (IOException e) {
-			JSFCommonPlugin.log(e, NLS.bind(Messages.CMAnnotationMap_IOException, new String[]{val}));
-			return null;
-		} catch (MissingResourceException e){
-			//fall thru
-			JSFCommonPlugin.log(e,  NLS.bind(Messages.CMAnnotationMap_MissingResource_exception, new String[]{val}));
-		}
-		return val.substring(1) + NOT_FOUND;
-	}
-
-	/**
-	 * Return the ICMAnnotationSourceFileInfo used to create this CMAnnotationMap
-	 * @return ICMAnnotationSourceFileInfo
-	 */
-	public ICMAnnotationSourceFileInfo getFileInfo(){
-		return fileInfo;
-	}
-	
-	/**
-	 * @param val 
-	 * @return string value used for case sensitive or insensitive queries.
-	 */
-	public String getStringValueForCaseSensitivity(String val){
-		return isCaseSensitive ? val : val.toLowerCase();
-	}
-
-	private ResourceBundle getResourceBundle() throws IOException{		
-		if (resourceBundle == null){		
-			resourceBundle = locator.getResourceBundle();
-		}
-		return resourceBundle;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAttributeAnnotation.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAttributeAnnotation.java
deleted file mode 100644
index fe28e9c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMAttributeAnnotation.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.contentmodel.annotation.internal;
-
-/**
- * Represents an annotation on a content model attribute
- * 
- * @author Gerry Kessler - Oracle
- *
- * @see CMElementAnnotation
- * @deprecated see common.metadata package
- */
-public class CMAttributeAnnotation extends CMAnnotation {
-	private String elementNodeSpec;
-	
-	/**
-	 * Constructor
-	 * @param elemNodeSpec
-	 * @param name
-	 */
-	public CMAttributeAnnotation(String elemNodeSpec, String name) {
-		super(name);
-		elementNodeSpec = elemNodeSpec;
-	}
-
-	public String toString(){
-		StringBuffer buf = new StringBuffer("AttrAnnotation: "); //$NON-NLS-1$
-		buf.append(getName()).append(": ").append(elementNodeSpec).append(": ").append(super.toString()); //$NON-NLS-1$ //$NON-NLS-2$
-		return buf.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMElementAnnotation.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMElementAnnotation.java
deleted file mode 100644
index a9fac73..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMElementAnnotation.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.contentmodel.annotation.internal;
-
-import java.util.Hashtable;
-import java.util.Map;
-
-/**
- * Represents an annotation on a content model element.   
- * The element annotation object holds a map it's attribute annotations.
- * 
- * @author Gerry Kessler - Oracle
- * 
- * @see CMAttributeAnnotation
- * @deprecated see common.metadata package
- */
-public class CMElementAnnotation extends CMAnnotation {
-	protected Hashtable attributes = new Hashtable();
-
-	/**
-	 * Constructor
-	 * @param name
-	 */
-	public CMElementAnnotation(String name) {
-		super(name);
-	}
-
-	/**
-	 * Return this element annotations attribute annotations.
-	 * Will NOT be null but may be empty. 
-	 * @return Map
-	 */
-	public Map getAttributeAnnotations() {
-		return attributes;
-	}
-
-	/**
-	 * Add an attribute annotation to this element's attribute annotations map
-	 * 
-	 * @param annotation
-	 */
-	public void addCMAttributeAnnotation(CMAttributeAnnotation annotation){
-		attributes.put(annotation.getName(), annotation);		
-	}
-	
-	public String toString(){
-		StringBuffer buf = new StringBuffer("ElementAnnotation: "); //$NON-NLS-1$
-		buf.append(getName()).append(": ").append(super.toString()); //$NON-NLS-1$
-		return buf.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMPluginRelativeSourceFileLocator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMPluginRelativeSourceFileLocator.java
deleted file mode 100644
index b6f876b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/CMPluginRelativeSourceFileLocator.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.contentmodel.annotation.internal;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.contentmodel.annotation.CMAnnotationSourceFileLocator;
-
-/**
- * Default implementation of CMAnnotationSourceFileLocator that will locate annotations
- * and resource bundles relative to the plugin that extends annotationFiles.
- * 
- * @author Gerry Kessler - Oracle
- * @deprecated see common.metadata package
- */
-public class CMPluginRelativeSourceFileLocator extends CMAnnotationSourceFileLocator {
-	
-	/* 
-	 * Returns InputStream of annotation file from plugin relative location.
-	 * 
-	 * @see org.eclipse.jst.jsf.contentmodel.annotations.internal.contentmodel.internal.annotation.AbstractCMSourceFileLocator#getAnnotationSourceInputStream()
-	 */
-	public InputStream getAnnotationSourceInputStream() throws IOException {
-		URL url = FileLocator.find(Platform.getBundle(fileInfo.getBundleId()), Path.fromOSString(fileInfo.getAnnotationFileLocation()), null);
-		if (url != null) {
-			return url.openStream();
-		}
-		return null;
-	}
-
-	/* 
-	 * Returns property resource bundle if it exists.  May return null.
-	 * This implementation assumes that the basename of the bundle is the same 
-	 * as the source file name and in the same directory.
-	 * 
-	 * @see org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationSourceFileLocator#getResourceBundle()
-	 */
-	public ResourceBundle getResourceBundle() throws IOException, MalformedURLException {
-		URL bundleURL = getAnnotationPropertiesFileBasenameURL();
-		ResourceBundle resourceBundle = ResourceBundleHelper.getResourceBundle(getBaseNameURL(bundleURL));
-		return resourceBundle;
-	}
-	
-	private URL getAnnotationPropertiesFileBasenameURL()  {
-		IPath annotationPath = Path.fromOSString(fileInfo.getAnnotationFileLocation()); 
-		IPath annotationFolder = annotationPath.removeLastSegments(1);
-		IPath propertiesLocation = annotationPath.removeFirstSegments(annotationPath.segmentCount() - 1).removeFileExtension();
-		// append location of propertiles file
-		IPath propertiesFile = annotationFolder.append(propertiesLocation);
-	
-		// append .properties extension if needed
-		if (propertiesFile.getFileExtension() == null)
-			propertiesFile = propertiesFile.addFileExtension("properties"); //$NON-NLS-1$
-		// create a URL out of the properties file location
-		return FileLocator.find(Platform.getBundle(fileInfo.getBundleId()),
-				propertiesFile, null);
-	}
-
-	
-	private String getBaseNameURL(URL bundleURL) {
-		IPath url = new Path(bundleURL.toExternalForm());
-		if (url.getFileExtension() != null)
-			url = url.removeFileExtension();
-		return url.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/ICMAnnotationAdvisor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/ICMAnnotationAdvisor.java
deleted file mode 100644
index eff8f55..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/ICMAnnotationAdvisor.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.contentmodel.annotation.internal;
-
-import org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationSourceFileInfo;
-
-
-/**
- * Interface used to build internal data model of annotations.   
- * Decouples the data model from the parser so that model can be changed in the future.
- * 
- * Not intended to be implemented by others.
- * 
- * @author Gerry Kessler - Oracle
- * @see org.eclipse.jst.jsf.contentmodel.annotation.internal.CMAnnotationAdvisor
- * @deprecated see common.metadata package
- */
-public interface ICMAnnotationAdvisor {
-	/**
-	 * Returns annotationFile extension information
-	 * @return ICMAnnotationSourceFileInfo 
-	 */
-	public ICMAnnotationSourceFileInfo getFileInfo();
-	/**
-	 * Set whether or not elements, attributes and property name querying is case sensitive or not.
-	 * @param val 
-	 */
-	public void setCaseSensitive(boolean val);
-	/**
-	 * Method to be used by a ICMAnnotationFileParser to assign a property and a value 
-	 * to an element in a particular content model defined by the ICMAnnotationSourceFileInfo.
-	 * 
-	 * @param elementName
-	 * @param propertyName
-	 * @param propertyValue
-	 * 
-	 * @see org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationFileParser
-	 * @see org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationSourceFileInfo
-	 */
-	public void addElementAnnotation(String elementName, String propertyName, String propertyValue);
-	/**
-	 * Method to be used by a ICMAnnotationFileParser to assign a property and a value 
-	 * to an attribute of an element in a particular content model defined by the ICMAnnotationSourceFileInfo.
-	 * 
-	 * @param elementName
-	 * @param propertyName
-	 * @param propertyValue
-	 * 
-	 * @see org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationFileParser
-	 * @see org.eclipse.jst.jsf.contentmodel.annotation.ICMAnnotationSourceFileInfo
-	 */
-	public void addAttributeAnnotation(String elementName, String attributeName, String propertyName, String propertyValue);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/Messages.java
deleted file mode 100644
index 4d0bacc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/Messages.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.contentmodel.annotation.internal;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * @deprecated see common.metadata package
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.contentmodel.annotation.internal.messages"; //$NON-NLS-1$
-
-	public static String CMAnnotationFileParserHelper_class_not_found;
-
-	public static String CMAnnotationFileParserHelper_illegal_access_exception;
-
-	public static String CMAnnotationFileParserHelper_instantiation_exception;
-
-	public static String CMAnnotationFileParserHelper_unable_to_find_bundleid;
-
-	public static String CMAnnotationFileParserHelper_unable_to_parse;
-
-	public static String CMAnnotationFileRegistry_load_error;
-
-	public static String CMAnnotationFileRegistryReader_problem;
-
-	public static String CMAnnotationMap_IOException;
-
-	public static String CMAnnotationMap_key_not_found;
-
-	public static String CMAnnotationMap_MissingResource_exception;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-        // no external instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/ResourceBundleHelper.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/ResourceBundleHelper.java
deleted file mode 100644
index a44e413..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/ResourceBundleHelper.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     Gerry Kessler/Oracle - copied from org.eclipse.wst.sse.core.internal.encoding.util and modified
- *******************************************************************************/
-package org.eclipse.jst.jsf.contentmodel.annotation.internal;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.Locale;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.FileLocator;
-
-/**
- * @deprecated see common.metadata package
- *
- */
-public class ResourceBundleHelper {
-
-	public static ResourceBundle getResourceBundle(String resourceURI) throws MalformedURLException, IOException {
-		return getResourceBundle(resourceURI, Locale.getDefault());
-	}
-
-	public static ResourceBundle getResourceBundle(String resourceURI, Locale targetLocale) throws MalformedURLException, IOException {
-		// try to load bundle from the location specified in the resourceURI
-		// we make the assumption that the resourceURI points to the local
-		// file system
-
-		int index = resourceURI.lastIndexOf("/"); //$NON-NLS-1$
-		if (index == -1) {
-			throw new IllegalArgumentException("Invalid resourceURI"); //$NON-NLS-1$
-		}
-
-		// Below we set 'resourceDirectory' so that it ends with a '/'.
-		// Here's an excerpt from the ClassLoader Javadoc ...
-		// Any URL that ends with a '/' is assumed to refer to a directory.
-		// Otherwise, the URL is assumed
-		// to refer to a JAR file which will be opened as needed.
-		//
-		String resourceDirectory = resourceURI.substring(0, index + 1);
-		String resourceBundleName = resourceURI.substring(index + 1);
-
-		// create a class loader with a class path that points to the resource
-		// bundle's location
-		//         
-		URL[] classpath = new URL[1];
-		classpath[0] = FileLocator.resolve(new URL(resourceDirectory));
-		ClassLoader resourceLoader = new URLClassLoader(classpath, null);
-
-		return ResourceBundle.getBundle(resourceBundleName, targetLocale, resourceLoader);
-	}
-}
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/messages.properties
deleted file mode 100644
index ba366a4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/internal/messages.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-CMAnnotationFileRegistryReader_problem=Problem adding annotation file: bundle = {0}, uri = {1}, location = {2}
-CMAnnotationFileParserHelper_unable_to_parse=Unable to parse: {0} with {1}
-CMAnnotationFileParserHelper_unable_to_find_bundleid=Unable to find bundleId: {0} in {1}
-CMAnnotationFileParserHelper_class_not_found=ClassNotFoundException: {0} in {1}
-CMAnnotationFileParserHelper_instantiation_exception=InstantiationException: {0} in {1}
-CMAnnotationMap_MissingResource_exception=MissingResourceException for NLSPropertyValue: {0} 
-CMAnnotationFileRegistry_load_error=Error loading grammar for: {0}
-CMAnnotationMap_key_not_found=(key not found)
-CMAnnotationMap_IOException=IOException for NLSPropertyValue: {0}
-CMAnnotationFileParserHelper_illegal_access_exception=IllegalAccessException: {0} in {1}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/package-info.java
deleted file mode 100644
index 88f5236..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/contentmodel/annotation/package-info.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Design-time metadata framework.
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.contentmodel.annotation;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/AbstractDelegatingFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/AbstractDelegatingFactory.java
deleted file mode 100644
index 37e7c6c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/AbstractDelegatingFactory.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * An abstract implementation of the IDelegatingFactory interface
- * 
- * Clients may extend this class.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDelegatingFactory implements IDelegatingFactory {
-
-	/* instance attributes */
-	
-	/**
-	 * the list of registered factory delegates
-	 */
-	protected 	final List<IAdaptable>  _delegates;
-	
-	private 	final List<Class>		_supportedDelegates;
-
-	/**
-	 * @param supportedDelegateTypes -- populates the list of classes used
-	 * by the isValidDelegate contract
-	 */
-	protected AbstractDelegatingFactory(Class[]  supportedDelegateTypes)
-	{
-		_delegates = new ArrayList<IAdaptable>();
-		
-		final List<Class> supportedTypes = new ArrayList<Class>();
-		supportedTypes.addAll(Arrays.asList(supportedDelegateTypes));
-		_supportedDelegates = Collections.unmodifiableList(supportedTypes);
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.IDelegatingFactory#addFactoryDelegate(org.eclipse.core.runtime.IAdaptable)
-	 */
-	public final void addFactoryDelegate(IAdaptable delegate) 
-	{
-		synchronized(_delegates)
-		{
-			
-			if (!_delegates.contains(delegate)
-					&& isValidDelegate(delegate))
-			{
-				_delegates.add(delegate);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.IDelegatingFactory#removeFactoryDelegate(org.eclipse.core.runtime.IAdaptable)
-	 */
-	public final boolean removeFactoryDelegate(IAdaptable delegate) 
-	{
-		synchronized(_delegates)
-		{
-			return _delegates.remove(delegate);
-		}	
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.IDelegatingFactory#getValidDelegateTypes()
-	 */
-	public final List<Class> getValidDelegateTypes() 
-	{
-		return _supportedDelegates;
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.IDelegatingFactory#isValidDelegate(org.eclipse.core.runtime.IAdaptable)
-	 */
-	public final boolean isValidDelegate(IAdaptable delegate) 
-	{
-		for (final Iterator<Class> it = _supportedDelegates.iterator(); it.hasNext();)
-		{
-			final Class clazz = it.next();
-			
-			// if the delegate supports one of the valid delegate classes
-			// via adaptation, then it is a valid delegate
-			if (delegate.getAdapter(clazz) != null)
-			{
-				return true;
-			}
-		}
-		
-		// if no found, delegate is not supported
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/AbstractDocumentContext.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/AbstractDocumentContext.java
deleted file mode 100644
index 9dad348..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/AbstractDocumentContext.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context;
-
-
-/**
- * A convenience super-type for all context instances that implement
- * IDocumentContext or one of its sub-types. 
- * 
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDocumentContext implements IDocumentContext {
-
-	/**
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapterClass) 
-	{
-		if (adapterClass.equals(IDocumentContext.class))
-		{
-			return this;
-		}
-		else if (adapterClass.equals(IModelContext.class))
-		{
-			return this;
-		}
-		
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/IDelegatingFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/IDelegatingFactory.java
deleted file mode 100644
index 6e91576..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/IDelegatingFactory.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * Defines a type of factory that can have delegate factories to help it
- * create an appropriate instance type.  The general contract for implementors
- * is:
- * 
- * 1) You must follow the isValidDelegate contract.
- * 2) You should try to create an instance yourself and only delegate
- *    if cannot do it yourself.  Deviations from this rule must be
- *    clearly documented to ensure clients understand how the factory works.
- * 
- * Clients may NOT implement this interface.  
- * Extend AbstractDelegatingFactory instead.
- * 
- * @author cbateman
- *
- */
-public interface IDelegatingFactory 
-{
-	/** -- Delegates */
-	/** If this factory is asked to construct but does not know how to,
-	 *  it will ask each of its registered delegates to do so in the order
-	 *  they were added.
-	 */
-	
-	/**
-	 * Adds delgate to the end of the list of factory delegates if the list
-	 * does not already contain it. 
-	 * 
-	 * @param delegate
-	 * @throws ClassCastException if delegate does not implement an expected
-	 * interface.  Each implementor can define what delegates are valid
-	 * based on the isValidDelegate() and getValidDelegates contracts
-	 */
-	void addFactoryDelegate(IAdaptable  delegate);
-	
-	
-	/**
-	 * @param delegate
-	 * @return true if delegate was removed, false if delegate wasn't in
-	 * the list of delegates
-	 */
-	boolean removeFactoryDelegate(IAdaptable delegate);
-	
-	/**
-	 * @return a list of Class objects that represent the interfaces
-	 * that may be passed to addFactoryDelegate.  Implementor should 
-	 * return at least one supported class.
-	 */
-	List<Class>  getValidDelegateTypes();
-	
-	
-	/**
-	 * The return value of this method should conform to the following contract:
-	 * 
-	 * Let v = getValidDelegates.  Then isValidDelegate should return true
-	 * only if the set of v contains a Class for which delegate.getAdapter(Class)
-	 * returns a non-null value.
-	 * 
-	 * @param delegate
-	 * @return true if delegate is supported, false otherwise.
-	 */
-	boolean isValidDelegate(IAdaptable delegate);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/IDocumentContext.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/IDocumentContext.java
deleted file mode 100644
index fe7d033..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/IDocumentContext.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context;
-
-/**
- * Encapsulates runtime context in a JFace IDocument model
- * 
- * Clients may NOT implement this interface directly but may sub-class
- * Extend AbstractDocumentContext instead.
-
- * @author cbateman
- *
- */
-public interface IDocumentContext extends IModelContext 
-{
-	// TODO: might make sense to have a getDocument() accessor here
-	// currently empty
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/IModelContext.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/IModelContext.java
deleted file mode 100644
index 1ace325..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/IModelContext.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * Encapsulates the current runtime context in some model.
- * 
- * This interface may be sub-classed but not implemented directly
- */
-public interface IModelContext extends IAdaptable
-{
-	// current empty
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/AbstractContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/AbstractContextResolver.java
deleted file mode 100644
index c3ef2d2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/AbstractContextResolver.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.eclipse.jst.jsf.context.resolver;
-
-import org.eclipse.jst.jsf.context.IModelContext;
-
-/**
- * The super-class of all context resolver impls.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractContextResolver implements IContextResolver {
-
-    public abstract boolean canResolveContext(IModelContext modelContext); 
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/AbstractDocumentContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/AbstractDocumentContextResolver.java
deleted file mode 100644
index 535480a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/AbstractDocumentContextResolver.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.eclipse.jst.jsf.context.resolver;
-
-import org.eclipse.jst.jsf.context.IModelContext;
-
-/**
- * The parent of all IDocumentContextResolver implementations.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDocumentContextResolver implements
-        IDocumentContextResolver {
-
-    public abstract boolean canResolveContext(IModelContext modelContext);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/IContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/IContextResolver.java
deleted file mode 100644
index 4471cab..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/IContextResolver.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.resolver;
-
-import org.eclipse.jst.jsf.context.IModelContext;
-
-/**
- * Super type of all context resolvers.  
- * 
- * May be sub-classed but should not be implemented directly.
- * Use AbstractContextResolver to implement.
- * 
- * @author cbateman
- *
- */
-public interface IContextResolver 
-{
-	/**
-	 * @param modelContext
-	 * @return true if this resolver can resolve context information
-	 * based on this context
-	 */
-	boolean canResolveContext(IModelContext  modelContext);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/IDocumentContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/IDocumentContextResolver.java
deleted file mode 100644
index 0191c3f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/IDocumentContextResolver.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.resolver;
-
-/**
- * The super-interface for all context resolvers that are related
- * to IDocumentContext's.
- * 
- * This interface may NOT be implemented by clients directly but may be sub-classed.
- * Use AbstractDocumentContextResolver for implementation.
- * 
- * @author cbateman
- *
- */
-public interface IDocumentContextResolver extends IContextResolver 
-{
-	// currently empty
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IDOMContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IDOMContextResolver.java
deleted file mode 100644
index 4677bc8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IDOMContextResolver.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.resolver.structureddocument;
-
-import org.eclipse.jst.jsf.context.resolver.IDocumentContextResolver;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * Defines a type of context resolver used to resolve the current context
- * in the XML DOM context.
- * 
- * This interface may be sub-classed or implemented by clients
- * 
- * @author cbateman
- *
- */
-public interface IDOMContextResolver extends IDocumentContextResolver 
-{
-	/**
-	 * @return the complete DOM Document for this context or null if it
-	 * cannot be resolved.
-	 */
-	Document	getDOMDocument();
-	
-	/**
-	 * @return the node which the current context is pointing to.
-     * If document context is on an attribute will return that attribute
-	 */
-	Node		getNode();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IMetadataContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IMetadataContextResolver.java
deleted file mode 100644
index 12e9987..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IMetadataContextResolver.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.resolver.structureddocument;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.context.resolver.IDocumentContextResolver;
-
-/**
- * Resolves meta-data for a particular context
- * 
- * This interface may sub-classed or implemented by clients
- * 
- * @author cbateman
- *
- */
-public interface IMetadataContextResolver extends IDocumentContextResolver 
-{
-    /**
-     * @param key 
-     * @return a list of one or more String values associated with key
-     * for the current context location. 
-     */
-    List getPropertyValue(String key);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IStructuredDocumentContextResolverFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IStructuredDocumentContextResolverFactory.java
deleted file mode 100644
index 1727b2f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IStructuredDocumentContextResolverFactory.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.resolver.structureddocument;
-
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.impl.StructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-
-
-/**
- * A factory for creating context resolvers that work with structured
- * document contexts
- * 
- * This factory may be used but not implemented or extended by clients.
- * TODO:
- * Note that getTextRegionResolver() will be moved to to an internal factory
- * interface and should not be considered part of the provisional API
- * 
- * @author cbateman
- *
- */
-public interface IStructuredDocumentContextResolverFactory 
-{
-	
-	/**
-	 * The global instance of the factory
-	 */
-	public static final IStructuredDocumentContextResolverFactory  INSTANCE = StructuredDocumentContextResolverFactory.getInstance();
-
-	/**
-	 * @param context
-	 * @return a resolver capable of resolving information in context or null
-	 * if one cannot be created.
-	 */
-	IDOMContextResolver	getDOMContextResolver(IStructuredDocumentContext context);
-	
-	/**
-     * **Non-WTP Clients: this method should not be considered API**
-     * 
-	 * @param context
-	 * @return a resolver capable of resolving information in the context or
-	 * null if one cannot be created
-	 */
-	ITextRegionContextResolver getTextRegionResolver(IStructuredDocumentContext context);
-	
-	/**
-	 * @param context
-	 * @return a resolver capable of resolving information in the context or
-	 * null if one cannot be created
-	 */
-	IWorkspaceContextResolver  getWorkspaceContextResolver(IStructuredDocumentContext context);
-	
-    /**
-     * @param context
-     * @return a resolver capable of resolving information in the context
-     * or null one cannot be created
-     */
-    ITaglibContextResolver getTaglibContextResolver(IStructuredDocumentContext context);
-    
-    /**
-     * @param context
-     * @return a resolver capable of resolving information in the context
-     * or null if one cannot be created
-     */
-    IMetadataContextResolver getMetadataContextResolver(IStructuredDocumentContext context);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/ITaglibContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/ITaglibContextResolver.java
deleted file mode 100644
index 34c4b6f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/ITaglibContextResolver.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.resolver.structureddocument;
-
-import org.eclipse.jst.jsf.context.resolver.IDocumentContextResolver;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * Defines a context resolver that resolves tag library information
- * for a particular context.
- * 
- * This interface may be sub-classed or implemented by clients
- * 
- * @author cbateman
- *
- */
-public interface ITaglibContextResolver extends IDocumentContextResolver 
-{
-    /**
-     * @param node 
-     * @return the URI corresponding to the taglib that defines the 
-     * node in the context document or null if it cannot be found
-     */
-    String getTagURIForNodeName(Node node);
-    
-	/**
-	 * @param uri
-	 * @return the tag prefix used in the context document for
-	 * the provided uri or null if it cannot be found.
-	 */
-	String	 getTagPrefixForURI(String uri);
-	
-	/**
-	 * A list all tags in the document context that are called
-	 * tagName defined in the namespace indicated by uri
-	 * 
-	 * @param uri
-	 * @param tagName
-	 * @return a (possibly empty) list of tags -- must never
-	 * be null.  Indicate none found with an empty list.
-	 */
-	NodeList getTagsByNamespaceURI(String uri, String tagName);
-    
-    /**
-     * @param node
-     * @return true if node has a tag library associated with it in this context
-     */
-    public boolean hasTag(Node node);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IWorkspaceContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IWorkspaceContextResolver.java
deleted file mode 100644
index 9a9f399..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/IWorkspaceContextResolver.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.resolver.structureddocument;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jst.jsf.context.resolver.IDocumentContextResolver;
-
-/**
- * A resolver to determine the current context within the Eclipse
- * workspace.
- * 
- * This interface may be sub-classed or implemented by clients
- * 
- * @author cbateman
- *
- */
-public interface IWorkspaceContextResolver extends IDocumentContextResolver
-{
-	/**
-	 * @return the project that contains the document context
-	 * or null if it cannot be determined
-	 */
-	IProject getProject();
-	
-	/**
-	 * @return the resource that contains the document context 
-	 * or null if it cannot be determined.
-	 * This should normally be an IFile.
-	 */
-	IResource getResource();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/ITextRegionContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/ITextRegionContextResolver.java
deleted file mode 100644
index aca8435..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/ITextRegionContextResolver.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.resolver.structureddocument.internal;
-
-import org.eclipse.jst.jsf.context.resolver.IDocumentContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-
-/**
- * Defines a resolver that can resolve context information in the
- * structured document region context.
- * 
- * Unless otherwise stated, the context region is the most specific
- * region (leaf) in which the current context is contained.
- * 
- * Note: this interface may use internal/provisional types.
- * 
- * @author cbateman
- *
- */
-public interface ITextRegionContextResolver extends IDocumentContextResolver 
-{
-	/**
-	 * @return the text for the context region
-	 */
-	String getRegionText();
-	
-	/**
-	 * @return the document relative offset of the start of the region
-	 * in which the context in is contained or -1 if the offset cannot be determined.
-	 */
-	int getStartOffset();
-	
-	/**
-	 * @return the document relative offset of the end of the region
-	 * in which the context is contained or -1 if the offset cannot be determined
-	 */
-	int getEndOffset();
-	
-	/**
-	 * @return the length of the most specific region in which the context
-	 * is contained or -1 if the length cannot be determined.
-	 */
-	int getLength();
-	
-	/**
-	 * @return the most specific TextRegion type for the current context  
-	 */
-	String  getRegionType();
-	
-	/**
-	 * @return the path to the most specific TextRegtion for the current context
-	 * note that this does not include the actual region for the current region.
-	 * That is returned by getRegionType(). 
-	 *
-	 */
-	String[]  getRegionTypePath();
-	
-	
-	/**
-	 * The offset into the structured document will be set to be
-	 * the start offset of the previous region
-	 * 
-	 * @return a context for the previous sibling of this context's
-	 * text region parent or null if no previous sibling exists
-	 */
-	IStructuredDocumentContext getPreviousContext();
-	
-	/**
-	 * The offset into the structured document will be set to be
-	 * the start offset of the next region
-	 * 
-	 * @return a context for the next sibling of this context's
-	 * text region parent or null if no next sibling exists
-	 */
-	IStructuredDocumentContext getNextContext();
-	
-	/**
-	 * Relative path works backwards from the current context.  So if the
-	 * path to current context is /a/b/c/d/e then:
-	 * 
-	 * matchesRelative({"e"}) == true
-	 * matchesRelative({"d", "e"}) == true
-	 * matchesRelative({"c", "d", "e"}) == true
-	 * matchesRelative({"b", "c", "d", "e"}) == true
-	 * matchesRelative({"a", "b", "c", "d", "e"}) == true
-	 * 
-	 * because in every case the path matches working backward from the current
-	 * context 
-	 * 
-	 * but
-	 * 
-	 * matchesRelative({a}) == false because context/.. == e not a
-	 * 
-	 * TODO: what does path = new String[0] mean?
-	 * 
-	 * @param path
-	 * @return true if the relative path matches the path to the current context
-	 * working relative to the current context.
-	 */
-	boolean   matchesRelative(String[] path);
-	
-	/**
-	 * Absolute path works forward from the root of the document to the 
-	 * current context.  So if the path to the current context is /a/b/c/d/e then:
-	 * 
-	 * matchesAbsolute({"a", "b", "c", "d", "e"}) == true
-	 * 
-	 * but 
-	 * 
-	 * matchesAbsolute({"b", "c", "d", "e"}) == true because starting from the root
-	 * you cannot follow /b/c/d/e to the context.
-	 * 
-	 * @param path
-	 * @return true if the absolute path from the root of the document 
-	 * matches the current context
-	 */
-	boolean   matchesAbsolute(String[] path);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/DOMContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/DOMContextResolver.java
deleted file mode 100644
index 76d7593..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/DOMContextResolver.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.resolver.structureddocument.internal.impl;
-
-import org.eclipse.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * Resolves DOM-related information in the provided context
- * 
- * @author cbateman
- *
- */
-class DOMContextResolver implements IDOMContextResolver 
-{
-	private final IStructuredDocumentContext		_context;
-    //private ITextRegionContextResolver              _regionResolver; // null; lazy initialized if needed
-	
-	DOMContextResolver(IStructuredDocumentContext context)
-	{
-		_context = context;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver#getDOMDocument()
-	 */
-	public Document getDOMDocument() 
-	{
-        return StructuredDocumentResolverUtil.getDOMDocument((IStructuredDocument)_context.getStructuredDocument());
-	}
-
-	public Node getNode()
-	{
-		IndexedRegion region = StructuredDocumentResolverUtil.getIndexedRegion((IStructuredDocument) _context.getStructuredDocument(), _context.getDocumentPosition());
-        
-        if (region instanceof Node)
-        {
-            return (Node) region;
-        }
-        
-        return null;
-	}
-    
-
-	public boolean canResolveContext(IModelContext modelContext) 
-	{
-		return modelContext.getAdapter(IStructuredDocumentContext.class) != null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/MetadataContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/MetadataContextResolver.java
deleted file mode 100644
index b623100..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/MetadataContextResolver.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.resolver.structureddocument.internal.impl;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IMetadataContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * A default implementation of meta-data context resolver
- * 
- * @author cbateman
- *
- */
-class MetadataContextResolver implements IMetadataContextResolver 
-{
-    private final IStructuredDocumentContext        _context;
-    
-    /**
-     * @param context
-     */
-    public MetadataContextResolver(IStructuredDocumentContext context)
-    {
-        _context = context;
-    }
-    
-    public List getPropertyValue(final String key) 
-    {
-        final DOMContextResolver domResolver = new DOMContextResolver(_context);
-        final WorkspaceContextResolver wsResolver = new WorkspaceContextResolver(_context);
-        final TaglibContextResolver  tagResolver =
-            new TaglibContextResolver(_context);
-        
-        final Node curNode = domResolver.getNode();
-        
-        if (curNode instanceof Attr)
-        {
-            final Attr attribute = (Attr) curNode;
-            final Element  element = attribute.getOwnerElement();
-            final String uri = tagResolver.getTagURIForNodeName(element);
-            final IProject project = wsResolver.getProject();
-            
-            final ITaglibDomainMetaDataModelContext mdContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, uri);
-            Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(mdContext, element.getLocalName()+"/"+attribute.getLocalName(), key); //$NON-NLS-1$
-            return TraitValueHelper.getValueAsListOfStrings(trait);
-//            return
-//                CMAnnotationHelper.
-//                    getCMAttributeProperties(uri, 
-//                                             element.getLocalName(), 
-//                                             attribute.getLocalName(),
-//                                             key);
-            
-        }
-        else if (curNode instanceof Element)
-        {
-            final Element  element = (Element) curNode;
-            final String uri = tagResolver.getTagURIForNodeName(element);
-            final IProject project = wsResolver.getProject();
-            
-            final ITaglibDomainMetaDataModelContext mdContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, uri);
-            Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(mdContext, element.getLocalName(), key);
-            return TraitValueHelper.getValueAsListOfStrings(trait);
-//            return
-//                CMAnnotationHelper.
-//                    getCMElementProperties(uri, 
-//                             element.getLocalName(), 
-//                             key);
-        }
-        
-        return Collections.EMPTY_LIST;
-    }
-
-    public boolean canResolveContext(IModelContext modelContext) {
-        return (modelContext.getAdapter(IStructuredDocumentContext.class) != null);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/StructuredDocumentContextResolverFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/StructuredDocumentContextResolverFactory.java
deleted file mode 100644
index 84d8a98..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/StructuredDocumentContextResolverFactory.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.resolver.structureddocument.internal.impl;
-
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.context.AbstractDelegatingFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IMetadataContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-/**
- * Implements a factory for creating context resolvers for structured document
- * contexts.
- * 
- * @author cbateman
- *
- */
-public class StructuredDocumentContextResolverFactory extends
-		AbstractDelegatingFactory implements
-		IStructuredDocumentContextResolverFactory 
-{
-	/* static attributes */
-	private static StructuredDocumentContextResolverFactory  INSTANCE;
-
-	/**
-	 * @return an instance (possibly shared) of the this factory
-	 */
-	public synchronized static StructuredDocumentContextResolverFactory getInstance()
-	{
-		if (INSTANCE == null)
-		{
-			INSTANCE = new StructuredDocumentContextResolverFactory();
-		}
-		
-		return INSTANCE;
-	}
-
-	/**
-	 * Constructor
-	 */
-	protected StructuredDocumentContextResolverFactory() 
-	{
-		super(new Class[] {IStructuredDocumentContextResolverFactory.class});
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory#getDOMContextResolver(org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext)
-	 */
-	public IDOMContextResolver getDOMContextResolver(IStructuredDocumentContext context) 
-	{
-        IDOMContextResolver  resolver = internalGetDOMResolver(context);
-        
-        if (resolver == null)
-        {
-            resolver = delegateGetDOMResolver(context);
-        }
-        
-        return resolver;
-    }
-    private IDOMContextResolver internalGetDOMResolver(IStructuredDocumentContext context)
-    {
-        if (context.getStructuredDocument() instanceof IStructuredDocument)
-        {
-            return new DOMContextResolver(context);
-        }
-        
-        return null;
-    }
-    
-    private IDOMContextResolver delegateGetDOMResolver(IStructuredDocumentContext context)
-    {
-        synchronized(_delegates)
-        {
-            for (final Iterator it = _delegates.iterator(); it.hasNext();)
-            {
-                IStructuredDocumentContextResolverFactory delegateFactory = (IStructuredDocumentContextResolverFactory) ((IAdaptable) it.next()).getAdapter(IStructuredDocumentContextFactory.class);
-                IDOMContextResolver contextResolver = delegateFactory.getDOMContextResolver(context);
-                
-                if (contextResolver != null)
-                {
-                    return contextResolver;
-                }
-            }
-            
-            return null;
-        }
-    }
-
-    
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory#getTextRegionResolver(org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext)
-	 */
-	public ITextRegionContextResolver getTextRegionResolver(IStructuredDocumentContext context) 	
-	{
-		ITextRegionContextResolver  resolver = internalGetTextRegionResolver(context);
-		
-		if (resolver == null)
-		{
-			resolver = delegateGetTextRegionResolver(context);
-		}
-		
-		return resolver;
-	}
-	private ITextRegionContextResolver internalGetTextRegionResolver(IStructuredDocumentContext context)
-	{
-		if (context.getStructuredDocument() instanceof IStructuredDocument)
-		{
-			return new TextRegionContextResolver(context);
-		}
-		
-		return null;
-	}
-	
-	private ITextRegionContextResolver delegateGetTextRegionResolver(IStructuredDocumentContext context)
-	{
-		synchronized(_delegates)
-		{
-			for (final Iterator it = _delegates.iterator(); it.hasNext();)
-			{
-				IStructuredDocumentContextResolverFactory delegateFactory = (IStructuredDocumentContextResolverFactory) ((IAdaptable) it.next()).getAdapter(IStructuredDocumentContextFactory.class);
-				ITextRegionContextResolver contextResolver = delegateFactory.getTextRegionResolver(context);
-				
-				if (contextResolver != null)
-				{
-					return contextResolver;
-				}
-			}
-			
-			return null;
-		}
-	}
-	
-	public IWorkspaceContextResolver getWorkspaceContextResolver(IStructuredDocumentContext context)
-	{
-		IWorkspaceContextResolver  resolver = internalGetWorkspaceContextResolver(context);
-		
-		if (resolver == null)
-		{
-			resolver = delegateGetWorkspaceContextResolver(context);
-		}
-		
-		return resolver;
-
-	}
-	
-	private IWorkspaceContextResolver internalGetWorkspaceContextResolver(IStructuredDocumentContext context)
-	{
-		if (context.getStructuredDocument() instanceof IStructuredDocument)
-		{
-			return new WorkspaceContextResolver(context);
-		}
-		
-		return null;
-	}
-	
-	private IWorkspaceContextResolver delegateGetWorkspaceContextResolver(IStructuredDocumentContext context)
-	{
-		synchronized(_delegates)
-		{
-			for (final Iterator it = _delegates.iterator(); it.hasNext();)
-			{
-				IStructuredDocumentContextResolverFactory delegateFactory = (IStructuredDocumentContextResolverFactory) ((IAdaptable) it.next()).getAdapter(IStructuredDocumentContextFactory.class);
-				IWorkspaceContextResolver contextResolver = delegateFactory.getWorkspaceContextResolver(context);
-				
-				if (contextResolver != null)
-				{
-					return contextResolver;
-				}
-			}
-			
-			return null;
-		}
-	}
-
-    public ITaglibContextResolver getTaglibContextResolver(IStructuredDocumentContext context) {
-        ITaglibContextResolver  resolver = internalGetTaglibContextResolver(context);
-        
-        if (resolver == null)
-        {
-            resolver = delegateGetTaglibContextResolver(context);
-        }
-        
-        return resolver;
-    }
-    
-    private ITaglibContextResolver internalGetTaglibContextResolver(IStructuredDocumentContext context)
-    {
-        if (context.getStructuredDocument() instanceof IStructuredDocument)
-        {
-            return new TaglibContextResolver(context);
-        }
-        
-        return null;
-    }
-    
-    private ITaglibContextResolver delegateGetTaglibContextResolver(IStructuredDocumentContext context)
-    {
-        synchronized(_delegates)
-        {
-            for (final Iterator it = _delegates.iterator(); it.hasNext();)
-            {
-                IStructuredDocumentContextResolverFactory delegateFactory = (IStructuredDocumentContextResolverFactory) ((IAdaptable) it.next()).getAdapter(IStructuredDocumentContextFactory.class);
-                ITaglibContextResolver contextResolver = delegateFactory.getTaglibContextResolver(context);
-                
-                if (contextResolver != null)
-                {
-                    return contextResolver;
-                }
-            }
-            
-            return null;
-        }
-    }
-
-    public IMetadataContextResolver getMetadataContextResolver(IStructuredDocumentContext context) {
-        IMetadataContextResolver  resolver = internalGetMetadataContextResolver(context);
-        
-        if (resolver == null)
-        {
-            resolver = delegateGetMetadataContextResolver(context);
-        }
-        
-        return resolver;
-    }
-    
-    private IMetadataContextResolver internalGetMetadataContextResolver(IStructuredDocumentContext context)
-    {
-        if (context.getStructuredDocument() instanceof IStructuredDocument)
-        {
-            return new MetadataContextResolver(context);
-        }
-        
-        return null;
-    }
-    
-    private IMetadataContextResolver delegateGetMetadataContextResolver(IStructuredDocumentContext context)
-    {
-        synchronized(_delegates)
-        {
-            for (final Iterator it = _delegates.iterator(); it.hasNext();)
-            {
-                final IStructuredDocumentContextResolverFactory delegateFactory = 
-                    (IStructuredDocumentContextResolverFactory) 
-                        ((IAdaptable) it.next()).getAdapter
-                            (IStructuredDocumentContextFactory.class);
-                final IMetadataContextResolver contextResolver = 
-                    delegateFactory.getMetadataContextResolver(context);
-                
-                if (contextResolver != null)
-                {
-                    return contextResolver;
-                }
-            }
-            
-            return null;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/StructuredDocumentResolverUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/StructuredDocumentResolverUtil.java
deleted file mode 100644
index 9a4a780..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/StructuredDocumentResolverUtil.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.resolver.structureddocument.internal.impl;
-
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-/**
- * @author cbateman
- *
- * Defines common utility methods for document resolvers
- */
-final class StructuredDocumentResolverUtil 
-{
-    static IDOMDocument getDOMDocument(IStructuredDocument document)
-    {
-        IStructuredModel model = getStructuredModel(document);
-        
-        try
-        {
-            if (model instanceof IDOMModel)
-            {
-                return ((IDOMModel)model).getDocument();
-            }
-        }
-        finally
-        {
-            if (model != null)
-            {
-                model.releaseFromRead();
-            }
-        }
-        
-        return null;
-    }
-    
-    static IndexedRegion getIndexedRegion(final IStructuredDocument document, final int documentOffset)
-    {
-        // C.B: most of this logic was copied from ContentAssistUtils.getNodeAt
-        // I chose to copy rather than just call that because ContentAssistUtils is
-        // internal
-        IStructuredModel model = getStructuredModel(document);
-        IndexedRegion             region = null;
-        if (model != null)
-        {
-            try
-            {
-                int lastOffset = documentOffset;
-                region = model.getIndexedRegion(documentOffset);
-                while (region == null && lastOffset >= 0) {
-                    lastOffset--;
-                    region = model.getIndexedRegion(lastOffset);
-                }
-                
-                // now we assume we have an element.  But our context may be
-                // on an attribute in that node, so we need to check
-                if (region instanceof IDOMElement)
-                {
-                    IDOMElement domElement = (IDOMElement) region;
-                    
-                    NamedNodeMap attributes = domElement.getAttributes();
-                    
-                    for (int i = 0; i < attributes.getLength(); i++)
-                    {
-                        Node  attrNode = attributes.item(i);
-                        
-                        if (attrNode instanceof IDOMAttr)
-                        {
-                            IDOMAttr attr = (IDOMAttr) attrNode;
-                            
-                            if (documentOffset >= attr.getStartOffset()
-                                    && documentOffset < attr.getEndOffset())
-                            {
-                                region = attr;
-                                break;
-                            }
-                        }
-                    }
-                }
-            }
-            finally
-            {
-                model.releaseFromRead();
-            }
-        }
-
-        return region;
-    }
-    
-    /**
-     * @param document
-     * @return a structured model or null if one cannot be opened for document.
-     * Note: the caller is responsible for releasing the instance of structured
-     * model that gets returned.
-     */
-    private static IStructuredModel getStructuredModel(IStructuredDocument document)
-    {
-        IModelManager modelManager = StructuredModelManager.getModelManager();
-        
-        if (modelManager != null)
-        {
-            return StructuredModelManager.getModelManager().getModelForRead(document); 
-        }
-        
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/TaglibContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/TaglibContextResolver.java
deleted file mode 100644
index 16fb2fc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/TaglibContextResolver.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.resolver.structureddocument.internal.impl;
-
-import java.util.Iterator;
-
-import org.eclipse.jst.jsf.common.internal.JSPUtil;
-import org.eclipse.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsp.core.internal.contentmodel.TaglibController;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TLDCMDocumentManager;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TaglibTracker;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * TODO: this resolver only applies to structured documents that can have
- * taglibs (I think only JSPs).  Should we move a different package?
- * Default taglib context resolver
- * 
- * @author cbateman
- *
- */
-class TaglibContextResolver implements ITaglibContextResolver 
-{
-	private final IStructuredDocumentContext		_context;
-	
-	TaglibContextResolver(IStructuredDocumentContext context)
-	{
-		_context = context;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver#getTagPrefixForURI(java.lang.String)
-	 */
-	public String getTagPrefixForURI(String uri) 
-	{
-		return null;
-	}
-
-    public boolean hasTag(final Node node)
-    {
-        Node checkNode = node;
-        
-        if (node instanceof Attr)
-        {
-            checkNode = ((Attr)node).getOwnerElement();
-        }
-        
-        return getTracker(checkNode) != null;
-    }
-    
-    private TaglibTracker getTracker(Node node)
-    {
-        final String prefix = node.getPrefix();
-
-        final TLDCMDocumentManager docMgr = 
-            TaglibController.getTLDCMDocumentManager(_context.getStructuredDocument());
-
-        // if there's no prefix, there's no way to id the tag library
-        // TODO: is this always true?  need to consult spec
-        // similar problem if couldn't load docMgr
-        if (prefix == null
-                || docMgr == null)
-        {
-            return null;
-        }
-        
-        for (final Iterator it = docMgr.getTaglibTrackers().iterator(); it.hasNext();)
-        {
-            final TaglibTracker tracker = (TaglibTracker) it.next();
-            
-            if (prefix.equals(tracker.getPrefix()))
-            {
-                return tracker;
-            }
-        }
-        
-        return null;
-    }
-    
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver#getTagURIForNodeName(org.w3c.dom.Node)
-	 */
-	public String getTagURIForNodeName(final Node node) 
-    {
-        Node checkNode = node;
-        
-        if (node instanceof Attr)
-        {
-            checkNode = ((Attr)node).getOwnerElement();
-        }
-        
-        final TaglibTracker tracker = getTracker(checkNode);
-        
-        if (tracker != null)
-        {
-            return tracker.getURI();
-        }
-        
-        
-        return null;
-    }
-
-
-
-	/* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver#getTagsByNamespaceURI(java.lang.String, java.lang.String)
-     */
-    public NodeList getTagsByNamespaceURI(String uri, String tagName) 
-	{
-		//Document domDoc = new DOMContextResolver(_context).getDOMDocument();
-		return null;
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.context.resolver.IContextResolver#canResolveContext(org.eclipse.jst.jsf.context.IModelContext)
-	 */
-	public boolean canResolveContext(IModelContext modelContext) 
-	{
-        // must be a JSP page
-		Object adapter = modelContext.getAdapter(IStructuredDocumentContext.class);
-        
-        if (adapter instanceof IStructuredDocumentContext)
-        {
-            IStructuredDocumentContext context =  
-                (IStructuredDocumentContext) adapter;
-            IStructuredModel smodel = null;
-            
-            try
-            {
-                smodel = StructuredModelManager.getModelManager().getModelForRead((IStructuredDocument)context.getStructuredDocument());
-                return JSPUtil.isJSPContentType(smodel.getContentTypeIdentifier()); //$NON-NLS-1$
-            }
-            finally
-            {
-                if (smodel != null)
-                {
-                    smodel.releaseFromRead();
-                }
-            }
-        }
-
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/TextRegionContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/TextRegionContextResolver.java
deleted file mode 100644
index 9cf0f21..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/TextRegionContextResolver.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.resolver.structureddocument.internal.impl;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionCollection;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
-
-/*package*/ class TextRegionContextResolver implements ITextRegionContextResolver {
-
-	private final IStructuredDocumentContext		_context;
-	
-	/*package*/ TextRegionContextResolver(IStructuredDocumentContext context)
-	{
-		_context = context;
-	}
-	
-	
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver#getRegionText()
-	 */
-	public String getRegionText() 
-	{
-		final ITextRegionCollection parent = getParentRegion();
-		String text = null;
-		
-		if (parent != null)
-		{
-			ITextRegion me = parent.getRegionAtCharacterOffset(_context.getDocumentPosition());
-			text = parent.getText(me);
-		}
-	
-		return text;
-	}
-
-	
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver#getEndOffset()
-	 */
-	public int getEndOffset() {
-		final ITextRegionCollection parent = getParentRegion();
-		int endOffset = -1;
-		if (parent != null)
-		{
-			ITextRegion me = parent.getRegionAtCharacterOffset(_context.getDocumentPosition());
-			endOffset =  parent.getEndOffset(me);
-		}
-		
-		return endOffset;
-	}
-
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver#getLength()
-	 */
-	public int getLength() {
-		final ITextRegionCollection parent = getParentRegion();
-		int length = -1;
-		if (parent != null)
-		{
-			ITextRegion me = parent.getRegionAtCharacterOffset(_context.getDocumentPosition());
-			length =  me.getLength();
-		}
-		
-		return length;
-
-	}
-
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver#getStartOffset()
-	 */
-	public int getStartOffset() 
-	{
-		final ITextRegionCollection parent = getParentRegion();
-		int startOffset = -1;
-		if (parent != null)
-		{
-			ITextRegion me = parent.getRegionAtCharacterOffset(_context.getDocumentPosition());
-			startOffset =  parent.getStartOffset(me);
-		}
-		
-		return startOffset;
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver#getRegionType()
-	 */
-	public String getRegionType() 
-	{
-		final ITextRegionCollection  parent = getParentRegion();
-		String  regionType = null;
-		
-		if (parent != null)
-		{
-			ITextRegion me = parent.getRegionAtCharacterOffset(_context.getDocumentPosition());
-			
-			if (me != null)
-			{
-				regionType = me.getType();
-			}
-		}
-		
-		return regionType;
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver#getRegionTypePath()
-	 */
-	public String[] getRegionTypePath() {
-		final ITextRegion[]  path = createPathToContext();
-		final String[] typePath = new String[path.length];
-		
-		for (int i = 0; i < path.length; i++)
-		{
-			typePath[i] = path[i].getType();
-		}
-		
-		return typePath;
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver#getNextContext()
-	 */
-	public IStructuredDocumentContext getNextContext() 
-	{
-		ITextRegionCollection  parent = getParentRegion();
-		IStructuredDocumentContext newContext = null;
-		
-		if (parent != null)
-		{
-			final ITextRegion me = parent.getRegionAtCharacterOffset(_context.getDocumentPosition());
-			ITextRegionList regions = parent.getRegions();
-			ITextRegion nextRegion = null;
-			for (final Iterator it = regions.iterator(); it.hasNext();)
-			{
-				if (it.next() == me
-						&& it.hasNext())
-				{
-					nextRegion = (ITextRegion) it.next();
-				}
-			}
-			
-			if (nextRegion != null)
-			{
-				// use the first position offset in the next region
-				final int documentPosition = parent.getStartOffset(nextRegion);
-				newContext = 
-					IStructuredDocumentContextFactory.INSTANCE.getContext(_context.getStructuredDocument(), documentPosition);
-			}
-		}
-		
-		return newContext;
-	}
-
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver#getPreviousContext()
-	 */
-	public IStructuredDocumentContext getPreviousContext() 
-	{
-		ITextRegionCollection  parent = getParentRegion();
-		IStructuredDocumentContext newContext = null;
-		
-		if (parent != null)
-		{
-			final ITextRegion me = parent.getRegionAtCharacterOffset(_context.getDocumentPosition());
-			ITextRegionList regions = parent.getRegions();
-			final Iterator it = regions.iterator();
-			ITextRegion  prevRegion = null;
-			ITextRegion  nextRegion = null;
-			
-			SEARCH_LOOP: while (it.hasNext())
-			{
-				nextRegion = (ITextRegion) it.next();
-
-				if (nextRegion == me)
-				{
-					break SEARCH_LOOP;
-				}
-				
-				prevRegion = nextRegion;
-			}
-			
-			if (prevRegion != null)
-			{
-				// use the last position offset in the prev region
-				final int documentPosition = parent.getStartOffset(prevRegion);
-				newContext = 
-					IStructuredDocumentContextFactory.INSTANCE.getContext(_context.getStructuredDocument(), documentPosition);
-			}
-		}
-		
-		return newContext;
-	}
-
-	private ITextRegionCollection getParentRegion()
-	{
-		final ITextRegion[] path = createPathToContext();
-		ITextRegionCollection parent = null;
-		
-		if (path.length > 0)
-		{
-			parent =  (ITextRegionCollection) path[path.length-1];
-		}
-		
-		return parent;
-	}
-	
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver#matchesRelative(java.lang.String[])
-	 */
-	public boolean matchesRelative(String[] path) {
-		final ITextRegion[]  myPath = createPathToContext();
-		return matchPath(myPath, path);
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver#matchesAbsolute(java.lang.String[])
-	 */
-	public boolean matchesAbsolute(String[] path) 
-	{
-		final ITextRegion[]  myPath = createPathToContext(); 
-		// only works if myPath and path are the same length
-		return (myPath.length == path.length)
-					&& matchPath(myPath, path);
-	}
-
-	private boolean matchPath(ITextRegion[] myPath, String[] path)
-	{
-		boolean matches = false;
-		
-		// only makes sense if path is a containing subset of myPath
-		if (path.length <= myPath.length)
-		{
-			matches = true;
-			SEARCH_LOOP:
-			for (int i = 1; i <= path.length; i++)
-			{
-				if (!path[path.length-i].equals(myPath[myPath.length-i].getType()))
-				{
-					matches = false;
-					break SEARCH_LOOP;
-				}
-			}
-		}
-	
-		return matches;
-	}
-	
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.IContextResolver#canResolveContext(org.eclipse.jst.jsf.context.IModelContext)
-	 */
-	public boolean canResolveContext(IModelContext modelContext) 
-	{
-		return (modelContext.getAdapter(IStructuredDocumentContext.class) != null);
-	}
-
-	private ITextRegion[] createPathToContext()
-	{
-		final List  regionPath = new ArrayList();
-		
-		final IStructuredDocument doc = (IStructuredDocument) _context.getStructuredDocument();
-
-		ITextRegion  container = doc.getRegionAtCharacterOffset(_context.getDocumentPosition());
-
-		while(container != null
-				&& container instanceof ITextRegionCollection)
-		{
-			regionPath.add(container);
-			container = ((ITextRegionCollection)container).getRegionAtCharacterOffset(_context.getDocumentPosition());
-		}
-		
-		return (ITextRegion[]) regionPath.toArray(new ITextRegion[0]);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/WorkspaceContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/WorkspaceContextResolver.java
deleted file mode 100644
index cb63630..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/WorkspaceContextResolver.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.resolver.structureddocument.internal.impl;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-
-/**
- * 
- * @author cbateman
- *
- */
-/*package*/ class WorkspaceContextResolver implements IWorkspaceContextResolver 
-{
-	private final IStructuredDocumentContext		_context;
-	
-	/*package*/WorkspaceContextResolver(IStructuredDocumentContext context)
-	{
-		_context = context;
-	}
-	
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver#getProject()
-	 */
-	public IProject getProject() 
-	{
-		// copied from ModelManagerImpl (with some rework by C.B.)
-		final String path = getPath();
-		
-		if (path == null)
-		{
-			return null;
-		}
-		
-		// TOODO needs rework for linked resources
-		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-		IPath iPath = new Path(path);
-		if (iPath.isAbsolute())
-		{
-			String  projectName = iPath.segment(0);
-			
-			IProject projects[] =  root.getProjects();
-			
-			for (int i = 0; i < projects.length; i++)
-			{
-				IProject project = projects[i];
-				
-				if (project.isOpen()
-						&& projectName.equals(project.getFullPath().segment(0)))
-				{
-					return project;  //
-				}
-			}
-		}
-
-		return null;
-	}
-
-	public IResource getResource() 
-	{
-		IProject project = getProject();
-		
-		if (project != null)
-		{
-			final String path = getPath();
-			
-			if (path != null)
-			{
-				final IPath iPath = new Path(path);
-				if (iPath.isAbsolute())
-				{
-					return project.getFile(iPath.removeFirstSegments(1));
-				}
-			}
-		}
-		return null;
-	}
-	
-	private String getPath()
-	{
-		IStructuredModel model = null;
-		
-		try
-		{
-			model = StructuredModelManager.getModelManager().getExistingModelForRead(_context.getStructuredDocument());
-			
-			if (model == null)
-				return null;
-			String path = model.getBaseLocation();
-			if (path == null || path.length() == 0) 
-			{
-				Object id = model.getId();
-				if (id == null)
-					return null;
-				path = id.toString();
-			}
-			
-			return path;
-		}
-		finally
-		{
-			if (model != null)
-			{
-				model.releaseFromRead();
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.resolver.IContextResolver#canResolveContext(org.eclipse.jst.jsf.context.IModelContext)
-	 */
-	public boolean canResolveContext(IModelContext modelContext) 
-	{
-		return (modelContext.getAdapter(IStructuredDocumentContext.class) != null);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/AbstractStructuredDocumentContext.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/AbstractStructuredDocumentContext.java
deleted file mode 100644
index b431d48..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/AbstractStructuredDocumentContext.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.structureddocument;
-
-import org.eclipse.jst.jsf.context.AbstractDocumentContext;
-
-/**
- * A convenience abstract super-class for context implementing
- * the IStructuredDocumentContext interface
- * 
- * Class may be sub-classed by clients
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractStructuredDocumentContext extends AbstractDocumentContext
-				implements IStructuredDocumentContext 
-{
-	/**
-	 * @see org.eclipse.jst.jsf.context.AbstractDocumentContext#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapterClass)
-	{
-		if (adapterClass.equals(IStructuredDocumentContext.class))
-		{
-			return this;
-		}
-
-		return super.getAdapter(adapterClass);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/AbstractStructuredDocumentContextFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/AbstractStructuredDocumentContextFactory.java
deleted file mode 100644
index 9502d49..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/AbstractStructuredDocumentContextFactory.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.eclipse.jst.jsf.context.structureddocument;
-
-import org.eclipse.jst.jsf.context.AbstractDelegatingFactory;
-
-/**
- * Abstract implementation of IStructuredDocumentContextFactory that must be used
- * by all implementers of new factories for document contexts.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractStructuredDocumentContextFactory extends AbstractDelegatingFactory {
-
-    /**
-     * @param supportedDelegateTypes
-     */
-    protected AbstractStructuredDocumentContextFactory(Class[] supportedDelegateTypes)
-    {
-        super(supportedDelegateTypes);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/IStructuredDocumentContext.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/IStructuredDocumentContext.java
deleted file mode 100644
index 2cf5328..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/IStructuredDocumentContext.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.structureddocument;
-
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jst.jsf.context.IDocumentContext;
-
-/**
- * Encapsulates runtime context in an SSE IStructuredDocument
- * @author cbateman
- *
- * Interface must NOT be implemented by clients.
- * Implementers should sub-class AbstractStructuredDocumentContext
- *
- */
-public interface IStructuredDocumentContext extends IDocumentContext
-{
-	/**
-	 * @return the text viewer whose context we are in
-	 */
-	IDocument getStructuredDocument();
-	/**
-	 * @return the document position within the text viewer's context
-	 * where we are.
-	 */
-	int getDocumentPosition();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/IStructuredDocumentContextFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/IStructuredDocumentContextFactory.java
deleted file mode 100644
index d9412dc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/IStructuredDocumentContextFactory.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.structureddocument;
-
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jst.jsf.context.structureddocument.internal.impl.StructuredDocumentContextFactory;
-import org.w3c.dom.Node;
-
-
-/**
- * A factory method for constructing context objects related to
- * SSE structured documents.
- *
- * May be sub-classed or implemented by clients
- * 
- * @author cbateman
- *
- */
-public interface IStructuredDocumentContextFactory
-{
-	/**
-	 * The default singleton instance of the factory
-	 */
-	public static final IStructuredDocumentContextFactory  INSTANCE = 
-        StructuredDocumentContextFactory.getInstance();
-	
-	/**
-	 * 
-	 * @param textViewer -- the text viewer where the context exists
-	 * @param documentPosition -- the absolute position of the context relative to textViewer
-	 * @return a context for a given text viewer and document position within the
-	 * document model of that text viewer or null if one cannot be determined.
-	 */
-	IStructuredDocumentContext getContext(ITextViewer textViewer, int documentPosition);
-	
-	/**
-	 * @param document -- the document
-	 * @param documentPosition -- the absolute position of the context relative to the document
-	 * @return a context for the document model or null if one cannot be determined
-	 */
-	IStructuredDocumentContext getContext(IDocument document, int documentPosition);
-    
-    /**
-     * @param document -- the document model
-     * @param node -- the DOM node within the document
-     * @return a context for the document model and dom node or null if one cannot
-     * be determined
-     */
-    IStructuredDocumentContext getContext(IDocument document, Node node);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/internal/impl/DefaultStructuredDocumentContext.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/internal/impl/DefaultStructuredDocumentContext.java
deleted file mode 100644
index f4526e7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/internal/impl/DefaultStructuredDocumentContext.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.structureddocument.internal.impl;
-
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jst.jsf.context.structureddocument.AbstractStructuredDocumentContext;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-/*package*/ class DefaultStructuredDocumentContext extends AbstractStructuredDocumentContext
-{
-	private final IStructuredDocument		_structuredDocument;
-	private final int						_documentPosition;
-	
-	/*package*/ DefaultStructuredDocumentContext(IStructuredDocument structuredDocument, int documentPosition)
-	{
-		_structuredDocument = structuredDocument;
-		_documentPosition = documentPosition;
-	}
-
-	public int getDocumentPosition() 
-	{
-		return _documentPosition;
-	}
-
-	public IDocument getStructuredDocument()
-	{
-		return _structuredDocument;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/internal/impl/StructuredDocumentContextFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/internal/impl/StructuredDocumentContextFactory.java
deleted file mode 100644
index 618eabd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/structureddocument/internal/impl/StructuredDocumentContextFactory.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.structureddocument.internal.impl;
-
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jst.jsf.context.structureddocument.AbstractStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr;
-import org.w3c.dom.Node;
-
-/**
- * @author cbateman
- *
- */
-public class StructuredDocumentContextFactory extends AbstractStructuredDocumentContextFactory
-			 implements IStructuredDocumentContextFactory
-{
-	/* static attributes */
-	private static StructuredDocumentContextFactory  INSTANCE;
-
-	/**
-	 * @param supportedDelegateTypes
-	 */
-	public StructuredDocumentContextFactory(Class[]  supportedDelegateTypes)
-	{
-	    super(supportedDelegateTypes);
-	}
-	
-	/**
-	 * @return an instance (possibly shared) of the this factory
-	 */
-	public synchronized static StructuredDocumentContextFactory getInstance()
-	{
-		if (INSTANCE == null)
-		{
-			INSTANCE = new StructuredDocumentContextFactory();
-		}
-		
-		return INSTANCE;
-	}
-	
-	
-	/**
-	 * Construct the factory
-	 */
-	protected StructuredDocumentContextFactory()
-	{
-		super(new Class[] {IStructuredDocumentContextFactory.class});
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory#getContext(org.eclipse.jface.text.ITextViewer, int)
-	 */
-	public final IStructuredDocumentContext getContext(ITextViewer textViewer, int documentPosition) 
-	{
-		// first see if I know how to make one
-		IStructuredDocumentContext  context = internalGetContext(textViewer, documentPosition);
-		
-		// if I don't know, ask my delegates
-		if (context == null)
-		{
-			context = delegateGetContext(textViewer, documentPosition);
-		}
-		
-		return context;
-	}
-
-	private IStructuredDocumentContext internalGetContext(ITextViewer textViewer, int documentPosition)
-	{
-		if (textViewer instanceof StructuredTextViewer)
-		{
-			IDocument document = ((StructuredTextViewer)textViewer).getDocument();
-			return internalGetContext(document, documentPosition);
-		}
-		
-		return null;
-	}
-	
-	private IStructuredDocumentContext internalGetContext(IDocument document, int documentPosition)
-	{
-		if (document instanceof IStructuredDocument)
-		{
-			return new DefaultStructuredDocumentContext((IStructuredDocument)document, documentPosition);
-		}
-		
-		return null;
-	}
-	
-	private IStructuredDocumentContext delegateGetContext(ITextViewer textViewer, int documentPosition)
-	{
-		synchronized(_delegates)
-		{
-			for (final Iterator it = _delegates.iterator(); it.hasNext();)
-			{
-				IStructuredDocumentContextFactory delegateFactory = (IStructuredDocumentContextFactory) ((IAdaptable) it.next()).getAdapter(IStructuredDocumentContextFactory.class);
-				IStructuredDocumentContext context = delegateFactory.getContext(textViewer, documentPosition);
-				
-				if (context != null)
-				{
-					return context;
-				}
-			}
-			
-			return null;
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory#getContext(org.eclipse.jface.text.IDocument, int)
-	 */
-	public IStructuredDocumentContext getContext(IDocument document, int documentPosition) {
-		// first see if I know how to make one
-		IStructuredDocumentContext  context = internalGetContext(document, documentPosition);
-		
-		// if I don't know, ask my delegates
-		if (context == null)
-		{
-			context = delegateGetContext(document, documentPosition);
-		}
-		
-		return context;
-	}
-	
-	private IStructuredDocumentContext delegateGetContext(IDocument document, int documentPosition)
-	{
-		synchronized(_delegates)
-		{
-			for (final Iterator it = _delegates.iterator(); it.hasNext();)
-			{
-				IStructuredDocumentContextFactory delegateFactory = (IStructuredDocumentContextFactory) ((IAdaptable) it.next()).getAdapter(IStructuredDocumentContextFactory.class);
-				IStructuredDocumentContext context = delegateFactory.getContext(document, documentPosition);
-				
-				if (context != null)
-				{
-					return context;
-				}
-			}
-			
-			return null;
-		}
-	}
-
-    public IStructuredDocumentContext getContext(IDocument document, Node node) 
-    {
-        // first see if I know how to make one
-        IStructuredDocumentContext  context = internalGetContext(document, node);
-        
-        // if I don't know, ask my delegates
-        if (context == null)
-        {
-            context = delegateGetContext(document, node);
-        }
-        
-        return context;
-
-    }
-    
-    private IStructuredDocumentContext internalGetContext(IDocument document, Node node)
-    {
-        if (document instanceof IStructuredDocument)
-        {
-            final IStructuredDocument sDoc = (IStructuredDocument) document;
-            if (node instanceof IndexedRegion)
-            {
-                final int position = ((IndexedRegion)node).getStartOffset();
-                return new DefaultStructuredDocumentContext(sDoc, position);
-            }
-            else if (node instanceof IDOMAttr)
-            {
-                IDOMAttr  attr = (IDOMAttr) node;
-                final int position = attr.getValueRegionStartOffset();
-                return new DefaultStructuredDocumentContext(sDoc, position);
-            }
-        }
-        
-        return null;
-    }
-    
-    private IStructuredDocumentContext delegateGetContext(IDocument document, Node node)
-    {
-        synchronized(_delegates)
-        {
-            for (final Iterator it = _delegates.iterator(); it.hasNext();)
-            {
-                IStructuredDocumentContextFactory delegateFactory = (IStructuredDocumentContextFactory) ((IAdaptable) it.next()).getAdapter(IStructuredDocumentContextFactory.class);
-                IStructuredDocumentContext context = delegateFactory.getContext(document, node);
-                
-                if (context != null)
-                {
-                    return context;
-                }
-            }
-            
-            return null;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/ERuntimeSource.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/ERuntimeSource.java
deleted file mode 100644
index 902e20d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/ERuntimeSource.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.AbstractEnumerator;
-
-/**
- * <!-- begin-user-doc -->
- * Enumerates the possible sources of an instance symbol
- * at runtime.  In the default implementation these can
- * be: from the built-in variables, from the managed bean
- * facility, and those defined in tags.  This information
- * is provided to allow the VariableResolver to resolve
- * conflicts when instance symbols come from more than one
- * source. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getERuntimeSource()
- * @model
- * @generated
- */
-public final class ERuntimeSource extends AbstractEnumerator {
-    /**
-     * @generated NOT
-     */
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * The '<em><b>BUILT IN SYMBOL</b></em>' literal value.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of '<em><b>BUILT IN SYMBOL</b></em>' literal object isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @see #BUILT_IN_SYMBOL_LITERAL
-     * @model
-     * @generated
-     * @ordered
-     */
-    public static final int BUILT_IN_SYMBOL = 0;
-
-    /**
-     * The '<em><b>MANAGED BEAN SYMBOL</b></em>' literal value.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of '<em><b>MANAGED BEAN SYMBOL</b></em>' literal object isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @see #MANAGED_BEAN_SYMBOL_LITERAL
-     * @model
-     * @generated
-     * @ordered
-     */
-    public static final int MANAGED_BEAN_SYMBOL = 1;
-
-    /**
-     * The '<em><b>TAG INSTANTIATED SYMBOL</b></em>' literal value.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of '<em><b>TAG INSTANTIATED SYMBOL</b></em>' literal object isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @see #TAG_INSTANTIATED_SYMBOL_LITERAL
-     * @model
-     * @generated
-     * @ordered
-     */
-    public static final int TAG_INSTANTIATED_SYMBOL = 2;
-
-    /**
-     * The '<em><b>OTHER</b></em>' literal value.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of '<em><b>OTHER</b></em>' literal object isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @see #OTHER_LITERAL
-     * @model
-     * @generated
-     * @ordered
-     */
-    public static final int OTHER = 3;
-
-    /**
-     * The '<em><b>BUILT IN SYMBOL</b></em>' literal object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #BUILT_IN_SYMBOL
-     * @generated
-     * @ordered
-     */
-    public static final ERuntimeSource BUILT_IN_SYMBOL_LITERAL = new ERuntimeSource(BUILT_IN_SYMBOL, "BUILT_IN_SYMBOL", "BUILT_IN_SYMBOL"); //$NON-NLS-1$ //$NON-NLS-2$
-
-    /**
-     * The '<em><b>MANAGED BEAN SYMBOL</b></em>' literal object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #MANAGED_BEAN_SYMBOL
-     * @generated
-     * @ordered
-     */
-    public static final ERuntimeSource MANAGED_BEAN_SYMBOL_LITERAL = new ERuntimeSource(MANAGED_BEAN_SYMBOL, "MANAGED_BEAN_SYMBOL", "MANAGED_BEAN_SYMBOL"); //$NON-NLS-1$ //$NON-NLS-2$
-
-    /**
-     * The '<em><b>TAG INSTANTIATED SYMBOL</b></em>' literal object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #TAG_INSTANTIATED_SYMBOL
-     * @generated
-     * @ordered
-     */
-    public static final ERuntimeSource TAG_INSTANTIATED_SYMBOL_LITERAL = new ERuntimeSource(TAG_INSTANTIATED_SYMBOL, "TAG_INSTANTIATED_SYMBOL", "TAG_INSTANTIATED_SYMBOL"); //$NON-NLS-1$ //$NON-NLS-2$
-
-    /**
-     * The '<em><b>OTHER</b></em>' literal object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #OTHER
-     * @generated
-     * @ordered
-     */
-    public static final ERuntimeSource OTHER_LITERAL = new ERuntimeSource(OTHER, "OTHER", "OTHER"); //$NON-NLS-1$ //$NON-NLS-2$
-
-    /**
-     * An array of all the '<em><b>ERuntime Source</b></em>' enumerators.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private static final ERuntimeSource[] VALUES_ARRAY =
-        new ERuntimeSource[] {
-            BUILT_IN_SYMBOL_LITERAL,
-            MANAGED_BEAN_SYMBOL_LITERAL,
-            TAG_INSTANTIATED_SYMBOL_LITERAL,
-            OTHER_LITERAL,
-        };
-
-    /**
-     * A public read-only list of all the '<em><b>ERuntime Source</b></em>' enumerators.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final List VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
-
-    /**
-     * Returns the '<em><b>ERuntime Source</b></em>' literal with the specified literal value.
-     * <!-- begin-user-doc -->
-     * @param literal 
-     * @return the enumeration for a string literal representation 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static ERuntimeSource get(String literal) {
-        for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-            ERuntimeSource result = VALUES_ARRAY[i];
-            if (result.toString().equals(literal)) {
-                return result;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns the '<em><b>ERuntime Source</b></em>' literal with the specified name.
-     * <!-- begin-user-doc -->
-     * @param name 
-     * @return the enumeration for the name of the literal value 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static ERuntimeSource getByName(String name) {
-        for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-            ERuntimeSource result = VALUES_ARRAY[i];
-            if (result.getName().equals(name)) {
-                return result;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns the '<em><b>ERuntime Source</b></em>' literal with the specified integer value.
-     * <!-- begin-user-doc -->
-     * @param value 
-     * @return the enumeration for it's integral value 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static ERuntimeSource get(int value) {
-        switch (value) {
-            case BUILT_IN_SYMBOL: return BUILT_IN_SYMBOL_LITERAL;
-            case MANAGED_BEAN_SYMBOL: return MANAGED_BEAN_SYMBOL_LITERAL;
-            case TAG_INSTANTIATED_SYMBOL: return TAG_INSTANTIATED_SYMBOL_LITERAL;
-            case OTHER: return OTHER_LITERAL;
-        }
-        return null;	
-    }
-
-    /**
-     * Only this class can construct instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private ERuntimeSource(int value, String name, String literal) {
-        super(value, name, literal);
-    }
-
-} //ERuntimeSource
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBeanInstanceSymbol.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBeanInstanceSymbol.java
deleted file mode 100644
index a1ddd36..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBeanInstanceSymbol.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.symbol;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc -->
- * An instance of a java bean
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- * 
- * @author cbateman
- * @model
- */
-public interface IBeanInstanceSymbol extends IInstanceSymbol, IDescribedInDetail {
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle";  //$NON-NLS-1$
-
-    /**
-     * Returns the value of the '<em><b>Properties</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Properties</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Properties</em>' reference list.
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIBeanInstanceSymbol_Properties()
-     * @model type="org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol" changeable="false" volatile="true"
-     * @generated
-     */
-	EList getProperties();
-
-    /**
-     * Returns the value of the '<em><b>Methods</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Methods</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Methods</em>' reference list.
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIBeanInstanceSymbol_Methods()
-     * @model type="org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol" changeable="false" volatile="true"
-     * @generated
-     */
-	EList getMethods();
-
-    /**
-     * <!-- begin-user-doc -->
-     * This is a convenience method equivalent to to (IJavaTypeDescriptor2) getTypeDescriptor
-     * @return the type descriptor cast to a java descriptor
-     * <!-- end-user-doc -->
-     * @model kind="operation"
-     * @generated
-     */
-    IJavaTypeDescriptor2 getJavaTypeDescriptor();
-
-    /**
-     * <!-- begin-user-doc -->
-     * Convenience method equivalent to setTypeDescriptor((IJavaTypeDescriptor2) typeDesc)s
-     * @param newTypeDescriptor 
-     * <!-- end-user-doc -->
-     * @model
-     * @generated
-     */
-    void setJavaTypeDescriptor(IJavaTypeDescriptor2 newTypeDescriptor);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBeanMethodSymbol.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBeanMethodSymbol.java
deleted file mode 100644
index 271a936..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBeanMethodSymbol.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>IBean Method Symbol</b></em>'.
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol#getOwner <em>Owner</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIBeanMethodSymbol()
- * @model
- * @generated
- */
-public interface IBeanMethodSymbol extends IDescribedInDetail, IMethodSymbol {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle";   //$NON-NLS-1$
-
-    /**
-     * Returns the value of the '<em><b>Owner</b></em>' reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Owner</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Owner</em>' reference.
-     * @see #setOwner(IJavaTypeDescriptor2)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIBeanMethodSymbol_Owner()
-     * @model
-     * @generated
-     */
-	IJavaTypeDescriptor2 getOwner();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol#getOwner <em>Owner</em>}' reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Owner</em>' reference.
-     * @see #getOwner()
-     * @generated
-     */
-	void setOwner(IJavaTypeDescriptor2 value);
-
-} // IBeanMethodSymbol
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBeanPropertySymbol.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBeanPropertySymbol.java
deleted file mode 100644
index 3fb6f88..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBeanPropertySymbol.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.symbol;
-
-/**
- * 
- * <!-- begin-user-doc -->
- * A property of a bean
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- * 
- * @author cbateman
- * @model
- */
-public interface IBeanPropertySymbol extends IPropertySymbol, IDescribedInDetail {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * @return the bean that owns this property
-	 * @model
-	 */
-	IJavaTypeDescriptor2		getOwner();
-	
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol#getOwner <em>Owner</em>}' reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Owner</em>' reference.
-     * @see #getOwner()
-     * @generated
-     */
-	void setOwner(IJavaTypeDescriptor2 value);
-
-	/**
-	 * @return true if the bean has getter for this property
-	 * @model
-	 */
-	boolean					isReadable();
-	
-	/**
-	 * @return true if the bean has a setter fot this property
-	 * @model
-	 */
-	boolean					isWritable();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedJavaTypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedJavaTypeDescriptor.java
deleted file mode 100644
index 7340267..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedJavaTypeDescriptor.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.context.symbol;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>IBounded Java Type Descriptor</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIBoundedJavaTypeDescriptor()
- * @model
- * @generated
- */
-public interface IBoundedJavaTypeDescriptor extends IJavaTypeDescriptor2, IBoundedTypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-} // IBoundedJavaTypeDescriptor
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedListTypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedListTypeDescriptor.java
deleted file mode 100644
index ebd153c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedListTypeDescriptor.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.context.symbol;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>IBounded List Type Descriptor</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIBoundedListTypeDescriptor()
- * @model
- * @generated
- */
-public interface IBoundedListTypeDescriptor extends IListTypeDescriptor, IBoundedTypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-} // IBoundedListTypeDescriptor
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedMapTypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedMapTypeDescriptor.java
deleted file mode 100644
index f54c12e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedMapTypeDescriptor.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.context.symbol;
-
-
-/**
- * <!-- begin-user-doc -->
- * Describes a IMapTypeDescriptor for which the possible keyed values are
- * unbounded for some set of possible value types.  For example, a managed
- * bean that implements Map, is unconstrained for all values in Java 1.4 and
- * for whatever the template value type is in Java5.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIBoundedMapTypeDescriptor()
- * @model
- * @generated
- */
-public interface IBoundedMapTypeDescriptor extends IMapTypeDescriptor, IBoundedTypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-} // IBoundedMapTypeDescriptor
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedTypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedTypeDescriptor.java
deleted file mode 100644
index ea92d5a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IBoundedTypeDescriptor.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.context.symbol;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>IBounded Type Descriptor</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIBoundedTypeDescriptor()
- * @model interface="true" abstract="true"
- * @generated
- */
-public interface IBoundedTypeDescriptor extends ITypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param typeSignature 
-     * @return true if this type can have unbounded property key for the
-     * indicated type.  For example, a Java 1.4 Map could potentially have
-     * a value of any time for a particular key, so this method would always return
-     * true.  However a Java5 Map<String, String> would only return true if 
-     * typeSignature is-a String.
-     * <!-- end-user-doc -->
-     * @model
-     * @generated
-     */
-    boolean isUnboundedForType(String typeSignature);
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param name 
-     * @param typeSignature 
-     * @return a symbol corresponding to the property of this type desc
-     * with name called 'name' of type 'typeSignature'.  Must return null if
-     * isPropNameUnconstrainedForType returns false for 'typeSignature'.
-     * Generally should return something meaningful (even if just an
-     * object) when isPropNameUnconstrainedForType returns true.
-     * <!-- end-user-doc -->
-     * @model
-     * @generated
-     */
-    ISymbol getUnboundedProperty(Object name, String typeSignature);
-
-} // IBoundedTypeDescriptor
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IComponentSymbol.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IComponentSymbol.java
deleted file mode 100644
index 7cad1c9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IComponentSymbol.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>IComponent Symbol</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIComponentSymbol()
- * @model
- * @generated
- */
-public interface IComponentSymbol extends IInstanceSymbol, IDescribedInDetail {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-} // IComponentSymbol
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IDescribedInDetail.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IDescribedInDetail.java
deleted file mode 100644
index 9fb2818..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IDescribedInDetail.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.symbol;
-
-
-/** 
- * Tags a symbol that has a detailed, user-readable description
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public interface IDescribedInDetail {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->s
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * @return the detailed description
-	 * @model
-	 */
-	String  getDetailedDescription();
-	
-	/**
-	 * @param detailedDescription
-	 * @model
-	 */
-	void setDetailedDescription(String detailedDescription);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IInstanceSymbol.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IInstanceSymbol.java
deleted file mode 100644
index d1e883d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IInstanceSymbol.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.symbol;
-
-/**
- * <!-- begin-user-doc -->
- * A symbol that represents an instance of something, typically
- * a variable.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- * @author cbateman
- * @model
- */
-public interface IInstanceSymbol extends IObjectSymbol {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * @return the type descriptor for this instance
-	 * @model
-	 */
-	ITypeDescriptor	getTypeDescriptor();
-    /**
-     * Returns the value of the '<em><b>Type Resolved</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Type Resolved</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Type Resolved</em>' attribute.
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIInstanceSymbol_TypeResolved()
-     * @model changeable="false" volatile="true"
-     * @generated
-     */
-	boolean isTypeResolved();
-
-    /**
-     * Returns the value of the '<em><b>Runtime Source</b></em>' attribute.
-     * The default value is <code>"TAG_INSTANTIATED_SYMBOL"</code>.
-     * The literals are from the enumeration {@link org.eclipse.jst.jsf.context.symbol.ERuntimeSource}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Runtime Source</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Runtime Source</em>' attribute.
-     * @see org.eclipse.jst.jsf.context.symbol.ERuntimeSource
-     * @see #setRuntimeSource(ERuntimeSource)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIInstanceSymbol_RuntimeSource()
-     * @model default="TAG_INSTANTIATED_SYMBOL"
-     * @generated
-     */
-    ERuntimeSource getRuntimeSource();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IInstanceSymbol#getRuntimeSource <em>Runtime Source</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Runtime Source</em>' attribute.
-     * @see org.eclipse.jst.jsf.context.symbol.ERuntimeSource
-     * @see #getRuntimeSource()
-     * @generated
-     */
-    void setRuntimeSource(ERuntimeSource value);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IJavaSymbol.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IJavaSymbol.java
deleted file mode 100644
index fa167ad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IJavaSymbol.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.symbol;
-
-import org.eclipse.jdt.core.IJavaElement;
-
-/**
- * <!-- begin-user-doc -->
- * Represents a symbol that has meaning within Java's context.  This may
- * be the name of a type, an instance, method etc.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- * @author cbateman
- * @model
- */
-public interface IJavaSymbol extends ISymbol {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * A IJavaElement may not exist for a symbol if it is synthetic at
-	 * design time but will be bound to a Java symbol at runtime.  An
-	 * example is a managed bean instance in JSF.  JDT can provide no
-	 * design-time meta-data for the symbol because it won't have 
-	 * a Java representation until the containing JSP is compiled.
-	 * 
-	 * @return JDT's java element for this symbol or null if one doesn't
-	 * exist.
-	 * @model
-	 */
-	IJavaElement  getJavaElement();
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IJavaSymbol#getJavaElement <em>Java Element</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Java Element</em>' attribute.
-     * @see #getJavaElement()
-     * @generated
-     */
-	void setJavaElement(IJavaElement value);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IJavaTypeDescriptor2.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IJavaTypeDescriptor2.java
deleted file mode 100644
index 1919289..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IJavaTypeDescriptor2.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jdt.core.IType;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>IJava Type Descriptor2</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getType <em>Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getBeanProperties <em>Bean Properties</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getBeanMethods <em>Bean Methods</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getArrayCount <em>Array Count</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIJavaTypeDescriptor2()
- * @model
- * @generated
- */
-public interface IJavaTypeDescriptor2 extends ITypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * Returns the value of the '<em><b>Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Type</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Type</em>' attribute.
-     * @see #setType(IType)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIJavaTypeDescriptor2_Type()
-     * @model dataType="org.eclipse.jst.jsf.context.symbol.IType"
-     * @generated
-     */
-	IType getType();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getType <em>Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Type</em>' attribute.
-     * @see #getType()
-     * @generated
-     */
-	void setType(IType value);
-
-    /**
-     * Returns the value of the '<em><b>Bean Properties</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Bean Properties</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Bean Properties</em>' reference list.
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIJavaTypeDescriptor2_BeanProperties()
-     * @model type="org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol" volatile="true"
-     * @generated
-     */
-	EList getBeanProperties();
-
-    /**
-     * Returns the value of the '<em><b>Bean Methods</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Bean Methods</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Bean Methods</em>' reference list.
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIJavaTypeDescriptor2_BeanMethods()
-     * @model type="org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol" volatile="true"
-     * @generated
-     */
-	EList getBeanMethods();
-
-    /**
-     * Returns the value of the '<em><b>Array Count</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Array Count</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Array Count</em>' attribute.
-     * @see #setArrayCount(int)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIJavaTypeDescriptor2_ArrayCount()
-     * @model
-     * @generated
-     */
-    int getArrayCount();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getArrayCount <em>Array Count</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * records the array nesting of the type.  IType doesn't encapsulate
-     * array types. So if this type is an array then type will represent
-     * the base element and this value will be > 0.  If not an array, then
-     * _arrayCount is always 0. 
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Array Count</em>' attribute.
-     * @see #getArrayCount()
-     * @generated
-     */
-    void setArrayCount(int value);
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param resolvedTypeSignature 
-     * @return the resolved type or null. 
-     * <!-- end-user-doc -->
-     * @model dataType="org.eclipse.jst.jsf.context.symbol.IType"
-     * @generated
-     */
-    IType resolveType(String resolvedTypeSignature);
-
-} // IJavaTypeDescriptor2
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IListTypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IListTypeDescriptor.java
deleted file mode 100644
index c4b4586..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IListTypeDescriptor.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.jsf.context.symbol;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>IList Type Descriptor</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor#getListSource <em>List Source</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIListTypeDescriptor()
- * @model
- * @generated
- */
-public interface IListTypeDescriptor extends ITypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * Returns the value of the '<em><b>List Source</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>List Source</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>List Source</em>' attribute.
-     * @see #setListSource(EList)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIListTypeDescriptor_ListSource()
-     * @model many="false"
-     * @generated
-     */
-    EList getListSource();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor#getListSource <em>List Source</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>List Source</em>' attribute.
-     * @see #getListSource()
-     * @generated
-     */
-    void setListSource(EList value);
-
-} // IListTypeDescriptor
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IMapTypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IMapTypeDescriptor.java
deleted file mode 100644
index d991b72..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IMapTypeDescriptor.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol;
-
-import java.util.Map;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>IMap Type Descriptor</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor#getMapSource <em>Map Source</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor#isImmutable <em>Immutable</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIMapTypeDescriptor()
- * @model
- * @generated
- */
-public interface IMapTypeDescriptor extends ITypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * Returns the value of the '<em><b>Map Source</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Map Source</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Map Source</em>' attribute.
-     * @see #setMapSource(Map)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIMapTypeDescriptor_MapSource()
-     * @model
-     * @generated
-     */
-    Map getMapSource();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor#getMapSource <em>Map Source</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Map Source</em>' attribute.
-     * @see #getMapSource()
-     * @generated
-     */
-    void setMapSource(Map value);
-
-    /**
-     * Returns the value of the '<em><b>Immutable</b></em>' attribute.
-     * The default value is <code>"true"</code>.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Immutable</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Immutable</em>' attribute.
-     * @see #setImmutable(boolean)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIMapTypeDescriptor_Immutable()
-     * @model default="true"
-     * @generated
-     */
-    boolean isImmutable();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor#isImmutable <em>Immutable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Immutable</em>' attribute.
-     * @see #isImmutable()
-     * @generated
-     */
-    void setImmutable(boolean value);
-
-} // IMapTypeDescriptor
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IMethodSymbol.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IMethodSymbol.java
deleted file mode 100644
index 45ee82c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IMethodSymbol.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>IMethod Symbol</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.IMethodSymbol#getSignature <em>Signature</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIMethodSymbol()
- * @model
- * @generated
- */
-public interface IMethodSymbol extends ISymbol {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * Returns the value of the '<em><b>Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Signature</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Signature</em>' attribute.
-     * @see #setSignature(String)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIMethodSymbol_Signature()
-     * @model
-     * @generated
-     */
-    String getSignature();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IMethodSymbol#getSignature <em>Signature</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Signature</em>' attribute.
-     * @see #getSignature()
-     * @generated
-     */
-    void setSignature(String value);
-
-} // IMethodSymbol
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IObjectSymbol.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IObjectSymbol.java
deleted file mode 100644
index 34fee43..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IObjectSymbol.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol;
-
-import org.eclipse.emf.common.util.EList;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>IObject Symbol</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol#getTypeDescriptor <em>Type Descriptor</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol#isReadable <em>Readable</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol#isWritable <em>Writable</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIObjectSymbol()
- * @model interface="true" abstract="true"
- * @generated
- */
-public interface IObjectSymbol extends ISymbol {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * Returns the value of the '<em><b>Type Descriptor</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Type Descriptor</em>' reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Type Descriptor</em>' reference.
-     * @see #setTypeDescriptor(ITypeDescriptor)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIObjectSymbol_TypeDescriptor()
-     * @model
-     * @generated
-     */
-    ITypeDescriptor getTypeDescriptor();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol#getTypeDescriptor <em>Type Descriptor</em>}' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Type Descriptor</em>' reference.
-     * @see #getTypeDescriptor()
-     * @generated
-     */
-    void setTypeDescriptor(ITypeDescriptor value);
-
-    /**
-     * Returns the value of the '<em><b>Readable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Readable</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Readable</em>' attribute.
-     * @see #setReadable(boolean)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIObjectSymbol_Readable()
-     * @model
-     * @generated
-     */
-    boolean isReadable();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol#isReadable <em>Readable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Readable</em>' attribute.
-     * @see #isReadable()
-     * @generated
-     */
-    void setReadable(boolean value);
-
-    /**
-     * Returns the value of the '<em><b>Writable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Writable</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Writable</em>' attribute.
-     * @see #setWritable(boolean)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIObjectSymbol_Writable()
-     * @model
-     * @generated
-     */
-    boolean isWritable();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol#isWritable <em>Writable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Writable</em>' attribute.
-     * @see #isWritable()
-     * @generated
-     */
-    void setWritable(boolean value);
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param typeSignature 
-     * @return true if this object can be coerced (is an instanceof) the type
-     * specified in the fully qualified typeSignature 
-     * <!-- end-user-doc -->
-     * @model
-     * @generated
-     */
-    boolean supportsCoercion(String typeSignature);
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param typeSignature 
-     * @return a type descriptor supporting a class cast of this object to
-     * the request typeSignature, or null if such a cast is not supported.
-     * Returns non-null iff supportsCoercion(typeSignature) == false
-     * <!-- end-user-doc -->
-     * @model
-     * @generated
-     */
-    ITypeDescriptor coerce(String typeSignature);
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param methodName 
-     * @param methodArguments 
-     * @param symbolName 
-     * @return a symbol resulting from calling the call or null if can't be determined.
-     * Generally, the symbolName should be used for the getName() value of the returned
-     * symbol, although implementers are not bound to this if a more meaningful value
-     * can be calculated.
-     * <!-- end-user-doc -->
-     * @model methodArgumentsType="org.eclipse.jst.jsf.common.internal.types.ValueType" methodArgumentsDataType="org.eclipse.jst.jsf.context.symbol.ValueType" methodArgumentsMany="true"
-     * @generated
-     */
-    ISymbol call(String methodName, EList methodArguments, String symbolName);
-
-} // IObjectSymbol
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IPropertySymbol.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IPropertySymbol.java
deleted file mode 100644
index ea757ee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/IPropertySymbol.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>IProperty Symbol</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.IPropertySymbol#isIntermediate <em>Intermediate</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIPropertySymbol()
- * @model
- * @generated
- */
-public interface IPropertySymbol extends IObjectSymbol {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * Returns the value of the '<em><b>Intermediate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Intermediate</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Intermediate</em>' attribute.
-     * @see #setIntermediate(boolean)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getIPropertySymbol_Intermediate()
-     * @model
-     * @generated
-     */
-    boolean isIntermediate();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.IPropertySymbol#isIntermediate <em>Intermediate</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Intermediate</em>' attribute.
-     * @see #isIntermediate()
-     * @generated
-     */
-    void setIntermediate(boolean value);
-
-} // IPropertySymbol
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/ISymbol.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/ISymbol.java
deleted file mode 100644
index 20a56c4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/ISymbol.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.symbol;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * An entity that represents a meaningful named value in some context. 
- * Typically these represent programming language variables, properties and methods.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- * @author cbateman
- * @model
- */
-public interface ISymbol extends EObject {
-    /**
-     * Singleton for an empty array of ISymbols
-     */
-    final ISymbol[]         EMPTY_SYMBOL_ARRAY = new ISymbol[0];
-    
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * @return the symbol's name
-	 * @model
-	 */
-	String getName();
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.ISymbol#getName <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Name</em>' attribute.
-     * @see #getName()
-     * @generated
-     */
-	void setName(String value);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/ITypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/ITypeDescriptor.java
deleted file mode 100644
index 4be180f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/ITypeDescriptor.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.symbol;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IType;
-
-/**
- * <!-- begin-user-doc -->
- * A generic descriptor for symbol information
- *
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- * @author cbateman
- * @model
- */
-public interface ITypeDescriptor extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * Returns the value of the '<em><b>Properties</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.context.symbol.IPropertySymbol}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Properties</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Properties</em>' reference list.
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getITypeDescriptor_Properties()
-     * @model type="org.eclipse.jst.jsf.context.symbol.IPropertySymbol" volatile="true"
-     * @generated
-     */
-    EList getProperties();
-
-    /**
-     * Returns the value of the '<em><b>Type Signature</b></em>' attribute.
-     * The default value is <code>""</code>.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Type Signature</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Type Signature</em>' attribute.
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getITypeDescriptor_TypeSignature()
-     * @model default="" changeable="false" volatile="true"
-     * @generated
-     */
-    String getTypeSignature();
-
-    /**
-     * Returns the value of the '<em><b>Super Type Signatures</b></em>' attribute list.
-     * The list contents are of type {@link java.lang.String}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Super Type Signatures</em>' attribute list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Super Type Signatures</em>' attribute list.
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getITypeDescriptor_SuperTypeSignatures()
-     * @model type="java.lang.String" volatile="true"
-     * @generated
-     */
-    EList getSuperTypeSignatures();
-
-    /**
-     * Returns the value of the '<em><b>Interface Type Signatures</b></em>' attribute list.
-     * The list contents are of type {@link java.lang.String}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Interface Type Signatures</em>' attribute list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Interface Type Signatures</em>' attribute list.
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getITypeDescriptor_InterfaceTypeSignatures()
-     * @model type="java.lang.String" volatile="true"
-     * @generated
-     */
-    EList getInterfaceTypeSignatures();
-
-    /**
-     * Returns the value of the '<em><b>Type Signature Delegate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Type Signature Delegate</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Type Signature Delegate</em>' attribute.
-     * @see #setTypeSignatureDelegate(String)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getITypeDescriptor_TypeSignatureDelegate()
-     * @model
-     * @generated
-     */
-    String getTypeSignatureDelegate();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getTypeSignatureDelegate <em>Type Signature Delegate</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Type Signature Delegate</em>' attribute.
-     * @see #getTypeSignatureDelegate()
-     * @generated
-     */
-    void setTypeSignatureDelegate(String value);
-
-    /**
-     * Returns the value of the '<em><b>Methods</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.context.symbol.IMethodSymbol}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Methods</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Methods</em>' reference list.
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getITypeDescriptor_Methods()
-     * @model type="org.eclipse.jst.jsf.context.symbol.IMethodSymbol" volatile="true"
-     * @generated
-     */
-    EList getMethods();
-
-    /**
-     * Returns the value of the '<em><b>Type Parameter Signatures</b></em>' attribute list.
-     * The list contents are of type {@link java.lang.String}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Type Parameter Signatures</em>' attribute list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Type Parameter Signatures</em>' attribute list.
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getITypeDescriptor_TypeParameterSignatures()
-     * @model type="java.lang.String" unique="false" transient="true"
-     * @generated
-     */
-    EList getTypeParameterSignatures();
-
-    /**
-     * Returns the value of the '<em><b>Jdt Context</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Jdt Context</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Jdt Context</em>' attribute.
-     * @see #setJdtContext(IJavaElement)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getITypeDescriptor_JdtContext()
-     * @model dataType="org.eclipse.jst.jsf.context.symbol.IJavaElement"
-     * @generated
-     */
-    IJavaElement getJdtContext();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getJdtContext <em>Jdt Context</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Jdt Context</em>' attribute.
-     * @see #getJdtContext()
-     * @generated
-     */
-    void setJdtContext(IJavaElement value);
-
-    /**
-     * Returns the value of the '<em><b>Enum Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Enum Type</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Enum Type</em>' attribute.
-     * @see #setEnumType(boolean)
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#getITypeDescriptor_EnumType()
-     * @model
-     * @generated
-     */
-    boolean isEnumType();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#isEnumType <em>Enum Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Enum Type</em>' attribute.
-     * @see #isEnumType()
-     * @generated
-     */
-    void setEnumType(boolean value);
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param typeSignature 
-     * @return true if the type descriptor's underlying type would resolve true == (type instanceof typeSignature)
-     * 
-     * <!-- end-user-doc -->
-     * @model
-     * @generated
-     */
-    boolean instanceOf(String typeSignature);
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return true iff this type is an array of something 
-	 * <!-- end-user-doc -->
-     * @model kind="operation"
-     * @generated
-     */
-	boolean isArray();
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return a symbol representing an element of this array.  May
-     * throw an exception or return null if isArray() == false 
-	 * <!-- end-user-doc -->
-     * @model kind="operation"
-     * @generated
-     */
-	IObjectSymbol getArrayElement();
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param resolvedTypeSignature 
-     * @return the IType for resolvedTypeSignature or null if  can't be resolved 
-     * <!-- end-user-doc -->
-     * @model dataType="org.eclipse.jst.jsf.context.symbol.IType"
-     * @generated
-     */
-    IType resolveType(String resolvedTypeSignature);
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param methodName 
-     * @param methodArgs 
-     * @param symbolName 
-     * @return a symbol or null if not handling 
-     * <!-- end-user-doc -->
-     * @model methodArgsType="java.lang.String" methodArgsMany="true"
-     * @generated
-     */
-    ISymbol calculateSyntheticCall(String methodName, EList methodArgs, String symbolName);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/SymbolFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/SymbolFactory.java
deleted file mode 100644
index 830b296..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/SymbolFactory.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage
- * @generated
- */
-public interface SymbolFactory extends EFactory {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * The singleton instance of the factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    SymbolFactory eINSTANCE = org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolFactoryImpl.init();
-
-    /**
-     * Returns a new object of class '<em>IBean Instance Symbol</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IBean Instance Symbol</em>'.
-     * @generated
-     */
-    IBeanInstanceSymbol createIBeanInstanceSymbol();
-
-    /**
-     * Returns a new object of class '<em>IBean Property Symbol</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IBean Property Symbol</em>'.
-     * @generated
-     */
-    IBeanPropertySymbol createIBeanPropertySymbol();
-
-    /**
-     * Returns a new object of class '<em>IInstance Symbol</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IInstance Symbol</em>'.
-     * @generated
-     */
-    IInstanceSymbol createIInstanceSymbol();
-
-    /**
-     * Returns a new object of class '<em>IJava Symbol</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IJava Symbol</em>'.
-     * @generated
-     */
-    IJavaSymbol createIJavaSymbol();
-
-    /**
-     * Returns a new object of class '<em>IJava Type Descriptor2</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IJava Type Descriptor2</em>'.
-     * @generated
-     */
-    IJavaTypeDescriptor2 createIJavaTypeDescriptor2();
-
-    /**
-     * Returns a new object of class '<em>IBean Method Symbol</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IBean Method Symbol</em>'.
-     * @generated
-     */
-    IBeanMethodSymbol createIBeanMethodSymbol();
-
-    /**
-     * Returns a new object of class '<em>IComponent Symbol</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IComponent Symbol</em>'.
-     * @generated
-     */
-    IComponentSymbol createIComponentSymbol();
-
-    /**
-     * Returns a new object of class '<em>IProperty Symbol</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IProperty Symbol</em>'.
-     * @generated
-     */
-    IPropertySymbol createIPropertySymbol();
-
-    /**
-     * Returns a new object of class '<em>IMap Type Descriptor</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IMap Type Descriptor</em>'.
-     * @generated
-     */
-    IMapTypeDescriptor createIMapTypeDescriptor();
-
-    /**
-     * Returns a new object of class '<em>IMethod Symbol</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IMethod Symbol</em>'.
-     * @generated
-     */
-    IMethodSymbol createIMethodSymbol();
-
-    /**
-     * Returns a new object of class '<em>IBounded Map Type Descriptor</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IBounded Map Type Descriptor</em>'.
-     * @generated
-     */
-    IBoundedMapTypeDescriptor createIBoundedMapTypeDescriptor();
-
-    /**
-     * Returns a new object of class '<em>IBounded Java Type Descriptor</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IBounded Java Type Descriptor</em>'.
-     * @generated
-     */
-    IBoundedJavaTypeDescriptor createIBoundedJavaTypeDescriptor();
-
-    /**
-     * Returns a new object of class '<em>IList Type Descriptor</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IList Type Descriptor</em>'.
-     * @generated
-     */
-    IListTypeDescriptor createIListTypeDescriptor();
-
-    /**
-     * Returns a new object of class '<em>IBounded List Type Descriptor</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>IBounded List Type Descriptor</em>'.
-     * @generated
-     */
-    IBoundedListTypeDescriptor createIBoundedListTypeDescriptor();
-
-    /**
-     * Returns the package supported by this factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the package supported by this factory.
-     * @generated
-     */
-    SymbolPackage getSymbolPackage();
-
-} //SymbolFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/SymbolPackage.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/SymbolPackage.java
deleted file mode 100644
index 79c1ae3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/SymbolPackage.java
+++ /dev/null
@@ -1,2673 +0,0 @@
-/**
- * Copyright 2006 Oracle
- *
- * $Id: SymbolPackage.java,v 1.8 2007/06/15 19:01:44 cbateman Exp $
- */
-package org.eclipse.jst.jsf.context.symbol;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.context.symbol.SymbolFactory
- * @model kind="package"
- * @generated
- */
-public interface SymbolPackage extends EPackage {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright 2006 Oracle";
-
-    /**
-     * The package name.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNAME = "symbol";
-
-    /**
-     * The package namespace URI.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNS_URI = "http:///org/eclipse/jst/jsf/context/symbol.ecore";
-
-    /**
-     * The package namespace name.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNS_PREFIX = "org.eclipse.jst.jsf.context.symbol";
-
-    /**
-     * The singleton instance of the package.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    SymbolPackage eINSTANCE = org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl.init();
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.ISymbol <em>ISymbol</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.ISymbol
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getISymbol()
-     * @generated
-     */
-    int ISYMBOL = 4;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ISYMBOL__NAME = 0;
-
-    /**
-     * The number of structural features of the '<em>ISymbol</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ISYMBOL_FEATURE_COUNT = 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol <em>IObject Symbol</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.IObjectSymbol
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIObjectSymbol()
-     * @generated
-     */
-    int IOBJECT_SYMBOL = 13;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IOBJECT_SYMBOL__NAME = ISYMBOL__NAME;
-
-    /**
-     * The feature id for the '<em><b>Type Descriptor</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IOBJECT_SYMBOL__TYPE_DESCRIPTOR = ISYMBOL_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Readable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IOBJECT_SYMBOL__READABLE = ISYMBOL_FEATURE_COUNT + 1;
-
-    /**
-     * The feature id for the '<em><b>Writable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IOBJECT_SYMBOL__WRITABLE = ISYMBOL_FEATURE_COUNT + 2;
-
-    /**
-     * The number of structural features of the '<em>IObject Symbol</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IOBJECT_SYMBOL_FEATURE_COUNT = ISYMBOL_FEATURE_COUNT + 3;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl <em>IInstance Symbol</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIInstanceSymbol()
-     * @generated
-     */
-    int IINSTANCE_SYMBOL = 2;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IINSTANCE_SYMBOL__NAME = IOBJECT_SYMBOL__NAME;
-
-    /**
-     * The feature id for the '<em><b>Type Descriptor</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IINSTANCE_SYMBOL__TYPE_DESCRIPTOR = IOBJECT_SYMBOL__TYPE_DESCRIPTOR;
-
-    /**
-     * The feature id for the '<em><b>Readable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IINSTANCE_SYMBOL__READABLE = IOBJECT_SYMBOL__READABLE;
-
-    /**
-     * The feature id for the '<em><b>Writable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IINSTANCE_SYMBOL__WRITABLE = IOBJECT_SYMBOL__WRITABLE;
-
-    /**
-     * The feature id for the '<em><b>Type Resolved</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IINSTANCE_SYMBOL__TYPE_RESOLVED = IOBJECT_SYMBOL_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Runtime Source</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IINSTANCE_SYMBOL__RUNTIME_SOURCE = IOBJECT_SYMBOL_FEATURE_COUNT + 1;
-
-    /**
-     * The number of structural features of the '<em>IInstance Symbol</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IINSTANCE_SYMBOL_FEATURE_COUNT = IOBJECT_SYMBOL_FEATURE_COUNT + 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanInstanceSymbolImpl <em>IBean Instance Symbol</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanInstanceSymbolImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBeanInstanceSymbol()
-     * @generated
-     */
-    int IBEAN_INSTANCE_SYMBOL = 0;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_INSTANCE_SYMBOL__NAME = IINSTANCE_SYMBOL__NAME;
-
-    /**
-     * The feature id for the '<em><b>Type Descriptor</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_INSTANCE_SYMBOL__TYPE_DESCRIPTOR = IINSTANCE_SYMBOL__TYPE_DESCRIPTOR;
-
-    /**
-     * The feature id for the '<em><b>Readable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_INSTANCE_SYMBOL__READABLE = IINSTANCE_SYMBOL__READABLE;
-
-    /**
-     * The feature id for the '<em><b>Writable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_INSTANCE_SYMBOL__WRITABLE = IINSTANCE_SYMBOL__WRITABLE;
-
-    /**
-     * The feature id for the '<em><b>Type Resolved</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_INSTANCE_SYMBOL__TYPE_RESOLVED = IINSTANCE_SYMBOL__TYPE_RESOLVED;
-
-    /**
-     * The feature id for the '<em><b>Runtime Source</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_INSTANCE_SYMBOL__RUNTIME_SOURCE = IINSTANCE_SYMBOL__RUNTIME_SOURCE;
-
-    /**
-     * The feature id for the '<em><b>Properties</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_INSTANCE_SYMBOL__PROPERTIES = IINSTANCE_SYMBOL_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Methods</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_INSTANCE_SYMBOL__METHODS = IINSTANCE_SYMBOL_FEATURE_COUNT + 1;
-
-    /**
-     * The number of structural features of the '<em>IBean Instance Symbol</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_INSTANCE_SYMBOL_FEATURE_COUNT = IINSTANCE_SYMBOL_FEATURE_COUNT + 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IPropertySymbolImpl <em>IProperty Symbol</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IPropertySymbolImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIPropertySymbol()
-     * @generated
-     */
-    int IPROPERTY_SYMBOL = 10;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IPROPERTY_SYMBOL__NAME = IOBJECT_SYMBOL__NAME;
-
-    /**
-     * The feature id for the '<em><b>Type Descriptor</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IPROPERTY_SYMBOL__TYPE_DESCRIPTOR = IOBJECT_SYMBOL__TYPE_DESCRIPTOR;
-
-    /**
-     * The feature id for the '<em><b>Readable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IPROPERTY_SYMBOL__READABLE = IOBJECT_SYMBOL__READABLE;
-
-    /**
-     * The feature id for the '<em><b>Writable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IPROPERTY_SYMBOL__WRITABLE = IOBJECT_SYMBOL__WRITABLE;
-
-    /**
-     * The feature id for the '<em><b>Intermediate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IPROPERTY_SYMBOL__INTERMEDIATE = IOBJECT_SYMBOL_FEATURE_COUNT + 0;
-
-    /**
-     * The number of structural features of the '<em>IProperty Symbol</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IPROPERTY_SYMBOL_FEATURE_COUNT = IOBJECT_SYMBOL_FEATURE_COUNT + 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanPropertySymbolImpl <em>IBean Property Symbol</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanPropertySymbolImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBeanPropertySymbol()
-     * @generated
-     */
-    int IBEAN_PROPERTY_SYMBOL = 1;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_PROPERTY_SYMBOL__NAME = IPROPERTY_SYMBOL__NAME;
-
-    /**
-     * The feature id for the '<em><b>Type Descriptor</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_PROPERTY_SYMBOL__TYPE_DESCRIPTOR = IPROPERTY_SYMBOL__TYPE_DESCRIPTOR;
-
-    /**
-     * The feature id for the '<em><b>Readable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_PROPERTY_SYMBOL__READABLE = IPROPERTY_SYMBOL__READABLE;
-
-    /**
-     * The feature id for the '<em><b>Writable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_PROPERTY_SYMBOL__WRITABLE = IPROPERTY_SYMBOL__WRITABLE;
-
-    /**
-     * The feature id for the '<em><b>Intermediate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_PROPERTY_SYMBOL__INTERMEDIATE = IPROPERTY_SYMBOL__INTERMEDIATE;
-
-    /**
-     * The feature id for the '<em><b>Owner</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_PROPERTY_SYMBOL__OWNER = IPROPERTY_SYMBOL_FEATURE_COUNT + 0;
-
-    /**
-     * The number of structural features of the '<em>IBean Property Symbol</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_PROPERTY_SYMBOL_FEATURE_COUNT = IPROPERTY_SYMBOL_FEATURE_COUNT + 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaSymbolImpl <em>IJava Symbol</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaSymbolImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIJavaSymbol()
-     * @generated
-     */
-    int IJAVA_SYMBOL = 3;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_SYMBOL__NAME = ISYMBOL__NAME;
-
-    /**
-     * The feature id for the '<em><b>Java Element</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_SYMBOL__JAVA_ELEMENT = ISYMBOL_FEATURE_COUNT + 0;
-
-    /**
-     * The number of structural features of the '<em>IJava Symbol</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_SYMBOL_FEATURE_COUNT = ISYMBOL_FEATURE_COUNT + 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl <em>IType Descriptor</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getITypeDescriptor()
-     * @generated
-     */
-    int ITYPE_DESCRIPTOR = 5;
-
-    /**
-     * The feature id for the '<em><b>Properties</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ITYPE_DESCRIPTOR__PROPERTIES = 0;
-
-    /**
-     * The feature id for the '<em><b>Type Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ITYPE_DESCRIPTOR__TYPE_SIGNATURE = 1;
-
-    /**
-     * The feature id for the '<em><b>Super Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES = 2;
-
-    /**
-     * The feature id for the '<em><b>Interface Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES = 3;
-
-    /**
-     * The feature id for the '<em><b>Type Signature Delegate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE = 4;
-
-    /**
-     * The feature id for the '<em><b>Methods</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ITYPE_DESCRIPTOR__METHODS = 5;
-
-    /**
-     * The feature id for the '<em><b>Type Parameter Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ITYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES = 6;
-
-    /**
-     * The feature id for the '<em><b>Jdt Context</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ITYPE_DESCRIPTOR__JDT_CONTEXT = 7;
-
-    /**
-     * The feature id for the '<em><b>Enum Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ITYPE_DESCRIPTOR__ENUM_TYPE = 8;
-
-    /**
-     * The number of structural features of the '<em>IType Descriptor</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ITYPE_DESCRIPTOR_FEATURE_COUNT = 9;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.IDescribedInDetail <em>IDescribed In Detail</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.IDescribedInDetail
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIDescribedInDetail()
-     * @generated
-     */
-    int IDESCRIBED_IN_DETAIL = 6;
-
-    /**
-     * The number of structural features of the '<em>IDescribed In Detail</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IDESCRIBED_IN_DETAIL_FEATURE_COUNT = 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaTypeDescriptor2Impl <em>IJava Type Descriptor2</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaTypeDescriptor2Impl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIJavaTypeDescriptor2()
-     * @generated
-     */
-    int IJAVA_TYPE_DESCRIPTOR2 = 7;
-
-    /**
-     * The feature id for the '<em><b>Properties</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__PROPERTIES = ITYPE_DESCRIPTOR__PROPERTIES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__TYPE_SIGNATURE = ITYPE_DESCRIPTOR__TYPE_SIGNATURE;
-
-    /**
-     * The feature id for the '<em><b>Super Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__SUPER_TYPE_SIGNATURES = ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Interface Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__INTERFACE_TYPE_SIGNATURES = ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature Delegate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__TYPE_SIGNATURE_DELEGATE = ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE;
-
-    /**
-     * The feature id for the '<em><b>Methods</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__METHODS = ITYPE_DESCRIPTOR__METHODS;
-
-    /**
-     * The feature id for the '<em><b>Type Parameter Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__TYPE_PARAMETER_SIGNATURES = ITYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Jdt Context</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__JDT_CONTEXT = ITYPE_DESCRIPTOR__JDT_CONTEXT;
-
-    /**
-     * The feature id for the '<em><b>Enum Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__ENUM_TYPE = ITYPE_DESCRIPTOR__ENUM_TYPE;
-
-    /**
-     * The feature id for the '<em><b>Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__TYPE = ITYPE_DESCRIPTOR_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Bean Properties</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__BEAN_PROPERTIES = ITYPE_DESCRIPTOR_FEATURE_COUNT + 1;
-
-    /**
-     * The feature id for the '<em><b>Bean Methods</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__BEAN_METHODS = ITYPE_DESCRIPTOR_FEATURE_COUNT + 2;
-
-    /**
-     * The feature id for the '<em><b>Array Count</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2__ARRAY_COUNT = ITYPE_DESCRIPTOR_FEATURE_COUNT + 3;
-
-    /**
-     * The number of structural features of the '<em>IJava Type Descriptor2</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IJAVA_TYPE_DESCRIPTOR2_FEATURE_COUNT = ITYPE_DESCRIPTOR_FEATURE_COUNT + 4;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanMethodSymbolImpl <em>IBean Method Symbol</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanMethodSymbolImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBeanMethodSymbol()
-     * @generated
-     */
-    int IBEAN_METHOD_SYMBOL = 8;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_METHOD_SYMBOL__NAME = IDESCRIBED_IN_DETAIL_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_METHOD_SYMBOL__SIGNATURE = IDESCRIBED_IN_DETAIL_FEATURE_COUNT + 1;
-
-    /**
-     * The feature id for the '<em><b>Owner</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_METHOD_SYMBOL__OWNER = IDESCRIBED_IN_DETAIL_FEATURE_COUNT + 2;
-
-    /**
-     * The number of structural features of the '<em>IBean Method Symbol</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBEAN_METHOD_SYMBOL_FEATURE_COUNT = IDESCRIBED_IN_DETAIL_FEATURE_COUNT + 3;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IComponentSymbolImpl <em>IComponent Symbol</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IComponentSymbolImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIComponentSymbol()
-     * @generated
-     */
-    int ICOMPONENT_SYMBOL = 9;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ICOMPONENT_SYMBOL__NAME = IINSTANCE_SYMBOL__NAME;
-
-    /**
-     * The feature id for the '<em><b>Type Descriptor</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ICOMPONENT_SYMBOL__TYPE_DESCRIPTOR = IINSTANCE_SYMBOL__TYPE_DESCRIPTOR;
-
-    /**
-     * The feature id for the '<em><b>Readable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ICOMPONENT_SYMBOL__READABLE = IINSTANCE_SYMBOL__READABLE;
-
-    /**
-     * The feature id for the '<em><b>Writable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ICOMPONENT_SYMBOL__WRITABLE = IINSTANCE_SYMBOL__WRITABLE;
-
-    /**
-     * The feature id for the '<em><b>Type Resolved</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ICOMPONENT_SYMBOL__TYPE_RESOLVED = IINSTANCE_SYMBOL__TYPE_RESOLVED;
-
-    /**
-     * The feature id for the '<em><b>Runtime Source</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ICOMPONENT_SYMBOL__RUNTIME_SOURCE = IINSTANCE_SYMBOL__RUNTIME_SOURCE;
-
-    /**
-     * The number of structural features of the '<em>IComponent Symbol</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ICOMPONENT_SYMBOL_FEATURE_COUNT = IINSTANCE_SYMBOL_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IMapTypeDescriptorImpl <em>IMap Type Descriptor</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IMapTypeDescriptorImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIMapTypeDescriptor()
-     * @generated
-     */
-    int IMAP_TYPE_DESCRIPTOR = 11;
-
-    /**
-     * The feature id for the '<em><b>Properties</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR__PROPERTIES = ITYPE_DESCRIPTOR__PROPERTIES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR__TYPE_SIGNATURE = ITYPE_DESCRIPTOR__TYPE_SIGNATURE;
-
-    /**
-     * The feature id for the '<em><b>Super Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES = ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Interface Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES = ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature Delegate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE = ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE;
-
-    /**
-     * The feature id for the '<em><b>Methods</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR__METHODS = ITYPE_DESCRIPTOR__METHODS;
-
-    /**
-     * The feature id for the '<em><b>Type Parameter Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES = ITYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Jdt Context</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR__JDT_CONTEXT = ITYPE_DESCRIPTOR__JDT_CONTEXT;
-
-    /**
-     * The feature id for the '<em><b>Enum Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR__ENUM_TYPE = ITYPE_DESCRIPTOR__ENUM_TYPE;
-
-    /**
-     * The feature id for the '<em><b>Map Source</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR__MAP_SOURCE = ITYPE_DESCRIPTOR_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Immutable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR__IMMUTABLE = ITYPE_DESCRIPTOR_FEATURE_COUNT + 1;
-
-    /**
-     * The number of structural features of the '<em>IMap Type Descriptor</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMAP_TYPE_DESCRIPTOR_FEATURE_COUNT = ITYPE_DESCRIPTOR_FEATURE_COUNT + 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IMethodSymbolImpl <em>IMethod Symbol</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IMethodSymbolImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIMethodSymbol()
-     * @generated
-     */
-    int IMETHOD_SYMBOL = 12;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMETHOD_SYMBOL__NAME = ISYMBOL__NAME;
-
-    /**
-     * The feature id for the '<em><b>Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMETHOD_SYMBOL__SIGNATURE = ISYMBOL_FEATURE_COUNT + 0;
-
-    /**
-     * The number of structural features of the '<em>IMethod Symbol</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IMETHOD_SYMBOL_FEATURE_COUNT = ISYMBOL_FEATURE_COUNT + 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor <em>IBounded Type Descriptor</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBoundedTypeDescriptor()
-     * @generated
-     */
-    int IBOUNDED_TYPE_DESCRIPTOR = 14;
-
-    /**
-     * The feature id for the '<em><b>Properties</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_TYPE_DESCRIPTOR__PROPERTIES = ITYPE_DESCRIPTOR__PROPERTIES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_TYPE_DESCRIPTOR__TYPE_SIGNATURE = ITYPE_DESCRIPTOR__TYPE_SIGNATURE;
-
-    /**
-     * The feature id for the '<em><b>Super Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_TYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES = ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Interface Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_TYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES = ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature Delegate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_TYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE = ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE;
-
-    /**
-     * The feature id for the '<em><b>Methods</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_TYPE_DESCRIPTOR__METHODS = ITYPE_DESCRIPTOR__METHODS;
-
-    /**
-     * The feature id for the '<em><b>Type Parameter Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_TYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES = ITYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Jdt Context</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_TYPE_DESCRIPTOR__JDT_CONTEXT = ITYPE_DESCRIPTOR__JDT_CONTEXT;
-
-    /**
-     * The feature id for the '<em><b>Enum Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_TYPE_DESCRIPTOR__ENUM_TYPE = ITYPE_DESCRIPTOR__ENUM_TYPE;
-
-    /**
-     * The number of structural features of the '<em>IBounded Type Descriptor</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_TYPE_DESCRIPTOR_FEATURE_COUNT = ITYPE_DESCRIPTOR_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedMapTypeDescriptorImpl <em>IBounded Map Type Descriptor</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedMapTypeDescriptorImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBoundedMapTypeDescriptor()
-     * @generated
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR = 15;
-
-    /**
-     * The feature id for the '<em><b>Properties</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR__PROPERTIES = IMAP_TYPE_DESCRIPTOR__PROPERTIES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR__TYPE_SIGNATURE = IMAP_TYPE_DESCRIPTOR__TYPE_SIGNATURE;
-
-    /**
-     * The feature id for the '<em><b>Super Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES = IMAP_TYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Interface Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES = IMAP_TYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature Delegate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE = IMAP_TYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE;
-
-    /**
-     * The feature id for the '<em><b>Methods</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR__METHODS = IMAP_TYPE_DESCRIPTOR__METHODS;
-
-    /**
-     * The feature id for the '<em><b>Type Parameter Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES = IMAP_TYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Jdt Context</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR__JDT_CONTEXT = IMAP_TYPE_DESCRIPTOR__JDT_CONTEXT;
-
-    /**
-     * The feature id for the '<em><b>Enum Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR__ENUM_TYPE = IMAP_TYPE_DESCRIPTOR__ENUM_TYPE;
-
-    /**
-     * The feature id for the '<em><b>Map Source</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR__MAP_SOURCE = IMAP_TYPE_DESCRIPTOR__MAP_SOURCE;
-
-    /**
-     * The feature id for the '<em><b>Immutable</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR__IMMUTABLE = IMAP_TYPE_DESCRIPTOR__IMMUTABLE;
-
-    /**
-     * The number of structural features of the '<em>IBounded Map Type Descriptor</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_MAP_TYPE_DESCRIPTOR_FEATURE_COUNT = IMAP_TYPE_DESCRIPTOR_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedJavaTypeDescriptorImpl <em>IBounded Java Type Descriptor</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedJavaTypeDescriptorImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBoundedJavaTypeDescriptor()
-     * @generated
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR = 16;
-
-    /**
-     * The feature id for the '<em><b>Properties</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__PROPERTIES = IJAVA_TYPE_DESCRIPTOR2__PROPERTIES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__TYPE_SIGNATURE = IJAVA_TYPE_DESCRIPTOR2__TYPE_SIGNATURE;
-
-    /**
-     * The feature id for the '<em><b>Super Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES = IJAVA_TYPE_DESCRIPTOR2__SUPER_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Interface Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES = IJAVA_TYPE_DESCRIPTOR2__INTERFACE_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature Delegate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE = IJAVA_TYPE_DESCRIPTOR2__TYPE_SIGNATURE_DELEGATE;
-
-    /**
-     * The feature id for the '<em><b>Methods</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__METHODS = IJAVA_TYPE_DESCRIPTOR2__METHODS;
-
-    /**
-     * The feature id for the '<em><b>Type Parameter Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES = IJAVA_TYPE_DESCRIPTOR2__TYPE_PARAMETER_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Jdt Context</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__JDT_CONTEXT = IJAVA_TYPE_DESCRIPTOR2__JDT_CONTEXT;
-
-    /**
-     * The feature id for the '<em><b>Enum Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__ENUM_TYPE = IJAVA_TYPE_DESCRIPTOR2__ENUM_TYPE;
-
-    /**
-     * The feature id for the '<em><b>Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__TYPE = IJAVA_TYPE_DESCRIPTOR2__TYPE;
-
-    /**
-     * The feature id for the '<em><b>Bean Properties</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__BEAN_PROPERTIES = IJAVA_TYPE_DESCRIPTOR2__BEAN_PROPERTIES;
-
-    /**
-     * The feature id for the '<em><b>Bean Methods</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__BEAN_METHODS = IJAVA_TYPE_DESCRIPTOR2__BEAN_METHODS;
-
-    /**
-     * The feature id for the '<em><b>Array Count</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR__ARRAY_COUNT = IJAVA_TYPE_DESCRIPTOR2__ARRAY_COUNT;
-
-    /**
-     * The number of structural features of the '<em>IBounded Java Type Descriptor</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_JAVA_TYPE_DESCRIPTOR_FEATURE_COUNT = IJAVA_TYPE_DESCRIPTOR2_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IListTypeDescriptorImpl <em>IList Type Descriptor</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IListTypeDescriptorImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIListTypeDescriptor()
-     * @generated
-     */
-    int ILIST_TYPE_DESCRIPTOR = 17;
-
-    /**
-     * The feature id for the '<em><b>Properties</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ILIST_TYPE_DESCRIPTOR__PROPERTIES = ITYPE_DESCRIPTOR__PROPERTIES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ILIST_TYPE_DESCRIPTOR__TYPE_SIGNATURE = ITYPE_DESCRIPTOR__TYPE_SIGNATURE;
-
-    /**
-     * The feature id for the '<em><b>Super Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ILIST_TYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES = ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Interface Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ILIST_TYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES = ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature Delegate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ILIST_TYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE = ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE;
-
-    /**
-     * The feature id for the '<em><b>Methods</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ILIST_TYPE_DESCRIPTOR__METHODS = ITYPE_DESCRIPTOR__METHODS;
-
-    /**
-     * The feature id for the '<em><b>Type Parameter Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ILIST_TYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES = ITYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Jdt Context</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ILIST_TYPE_DESCRIPTOR__JDT_CONTEXT = ITYPE_DESCRIPTOR__JDT_CONTEXT;
-
-    /**
-     * The feature id for the '<em><b>Enum Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ILIST_TYPE_DESCRIPTOR__ENUM_TYPE = ITYPE_DESCRIPTOR__ENUM_TYPE;
-
-    /**
-     * The feature id for the '<em><b>List Source</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ILIST_TYPE_DESCRIPTOR__LIST_SOURCE = ITYPE_DESCRIPTOR_FEATURE_COUNT + 0;
-
-    /**
-     * The number of structural features of the '<em>IList Type Descriptor</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ILIST_TYPE_DESCRIPTOR_FEATURE_COUNT = ITYPE_DESCRIPTOR_FEATURE_COUNT + 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedListTypeDescriptorImpl <em>IBounded List Type Descriptor</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedListTypeDescriptorImpl
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBoundedListTypeDescriptor()
-     * @generated
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR = 18;
-
-    /**
-     * The feature id for the '<em><b>Properties</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR__PROPERTIES = ILIST_TYPE_DESCRIPTOR__PROPERTIES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR__TYPE_SIGNATURE = ILIST_TYPE_DESCRIPTOR__TYPE_SIGNATURE;
-
-    /**
-     * The feature id for the '<em><b>Super Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES = ILIST_TYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Interface Type Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES = ILIST_TYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Type Signature Delegate</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE = ILIST_TYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE;
-
-    /**
-     * The feature id for the '<em><b>Methods</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR__METHODS = ILIST_TYPE_DESCRIPTOR__METHODS;
-
-    /**
-     * The feature id for the '<em><b>Type Parameter Signatures</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES = ILIST_TYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES;
-
-    /**
-     * The feature id for the '<em><b>Jdt Context</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR__JDT_CONTEXT = ILIST_TYPE_DESCRIPTOR__JDT_CONTEXT;
-
-    /**
-     * The feature id for the '<em><b>Enum Type</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR__ENUM_TYPE = ILIST_TYPE_DESCRIPTOR__ENUM_TYPE;
-
-    /**
-     * The feature id for the '<em><b>List Source</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR__LIST_SOURCE = ILIST_TYPE_DESCRIPTOR__LIST_SOURCE;
-
-    /**
-     * The number of structural features of the '<em>IBounded List Type Descriptor</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int IBOUNDED_LIST_TYPE_DESCRIPTOR_FEATURE_COUNT = ILIST_TYPE_DESCRIPTOR_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.context.symbol.ERuntimeSource <em>ERuntime Source</em>}' enum.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.context.symbol.ERuntimeSource
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getERuntimeSource()
-     * @generated
-     */
-    int ERUNTIME_SOURCE = 19;
-
-    /**
-     * The meta object id for the '<em>IType</em>' data type.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jdt.core.IType
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIType()
-     * @generated
-     */
-    int ITYPE = 20;
-
-    /**
-     * The meta object id for the '<em>IJava Element</em>' data type.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jdt.core.IJavaElement
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIJavaElement()
-     * @generated
-     */
-    int IJAVA_ELEMENT = 21;
-
-    /**
-     * The meta object id for the '<em>Value Type</em>' data type.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.common.internal.types.ValueType
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getValueType()
-     * @generated
-     */
-    int VALUE_TYPE = 22;
-
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol <em>IBean Instance Symbol</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IBean Instance Symbol</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol
-     * @generated
-     */
-    EClass getIBeanInstanceSymbol();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol#getProperties <em>Properties</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Properties</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol#getProperties()
-     * @see #getIBeanInstanceSymbol()
-     * @generated
-     */
-    EReference getIBeanInstanceSymbol_Properties();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol#getMethods <em>Methods</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Methods</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol#getMethods()
-     * @see #getIBeanInstanceSymbol()
-     * @generated
-     */
-    EReference getIBeanInstanceSymbol_Methods();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol <em>IBean Property Symbol</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IBean Property Symbol</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol
-     * @generated
-     */
-    EClass getIBeanPropertySymbol();
-
-    /**
-     * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol#getOwner <em>Owner</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference '<em>Owner</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol#getOwner()
-     * @see #getIBeanPropertySymbol()
-     * @generated
-     */
-    EReference getIBeanPropertySymbol_Owner();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IInstanceSymbol <em>IInstance Symbol</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IInstance Symbol</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IInstanceSymbol
-     * @generated
-     */
-    EClass getIInstanceSymbol();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IInstanceSymbol#isTypeResolved <em>Type Resolved</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Type Resolved</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IInstanceSymbol#isTypeResolved()
-     * @see #getIInstanceSymbol()
-     * @generated
-     */
-    EAttribute getIInstanceSymbol_TypeResolved();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IInstanceSymbol#getRuntimeSource <em>Runtime Source</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Runtime Source</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IInstanceSymbol#getRuntimeSource()
-     * @see #getIInstanceSymbol()
-     * @generated
-     */
-    EAttribute getIInstanceSymbol_RuntimeSource();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IJavaSymbol <em>IJava Symbol</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IJava Symbol</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IJavaSymbol
-     * @generated
-     */
-    EClass getIJavaSymbol();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IJavaSymbol#getJavaElement <em>Java Element</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Java Element</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IJavaSymbol#getJavaElement()
-     * @see #getIJavaSymbol()
-     * @generated
-     */
-    EAttribute getIJavaSymbol_JavaElement();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.ISymbol <em>ISymbol</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>ISymbol</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ISymbol
-     * @generated
-     */
-    EClass getISymbol();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.ISymbol#getName <em>Name</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Name</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ISymbol#getName()
-     * @see #getISymbol()
-     * @generated
-     */
-    EAttribute getISymbol_Name();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor <em>IType Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IType Descriptor</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ITypeDescriptor
-     * @generated
-     */
-    EClass getITypeDescriptor();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getProperties <em>Properties</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Properties</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getProperties()
-     * @see #getITypeDescriptor()
-     * @generated
-     */
-    EReference getITypeDescriptor_Properties();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getTypeSignature <em>Type Signature</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Type Signature</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getTypeSignature()
-     * @see #getITypeDescriptor()
-     * @generated
-     */
-    EAttribute getITypeDescriptor_TypeSignature();
-
-    /**
-     * Returns the meta object for the attribute list '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getSuperTypeSignatures <em>Super Type Signatures</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute list '<em>Super Type Signatures</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getSuperTypeSignatures()
-     * @see #getITypeDescriptor()
-     * @generated
-     */
-    EAttribute getITypeDescriptor_SuperTypeSignatures();
-
-    /**
-     * Returns the meta object for the attribute list '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getInterfaceTypeSignatures <em>Interface Type Signatures</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute list '<em>Interface Type Signatures</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getInterfaceTypeSignatures()
-     * @see #getITypeDescriptor()
-     * @generated
-     */
-    EAttribute getITypeDescriptor_InterfaceTypeSignatures();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getTypeSignatureDelegate <em>Type Signature Delegate</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Type Signature Delegate</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getTypeSignatureDelegate()
-     * @see #getITypeDescriptor()
-     * @generated
-     */
-    EAttribute getITypeDescriptor_TypeSignatureDelegate();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getMethods <em>Methods</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Methods</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getMethods()
-     * @see #getITypeDescriptor()
-     * @generated
-     */
-    EReference getITypeDescriptor_Methods();
-
-    /**
-     * Returns the meta object for the attribute list '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getTypeParameterSignatures <em>Type Parameter Signatures</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute list '<em>Type Parameter Signatures</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getTypeParameterSignatures()
-     * @see #getITypeDescriptor()
-     * @generated
-     */
-    EAttribute getITypeDescriptor_TypeParameterSignatures();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getJdtContext <em>Jdt Context</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Jdt Context</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#getJdtContext()
-     * @see #getITypeDescriptor()
-     * @generated
-     */
-    EAttribute getITypeDescriptor_JdtContext();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#isEnumType <em>Enum Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Enum Type</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ITypeDescriptor#isEnumType()
-     * @see #getITypeDescriptor()
-     * @generated
-     */
-    EAttribute getITypeDescriptor_EnumType();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IDescribedInDetail <em>IDescribed In Detail</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IDescribed In Detail</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IDescribedInDetail
-     * @generated
-     */
-    EClass getIDescribedInDetail();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2 <em>IJava Type Descriptor2</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IJava Type Descriptor2</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2
-     * @generated
-     */
-    EClass getIJavaTypeDescriptor2();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getType <em>Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Type</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getType()
-     * @see #getIJavaTypeDescriptor2()
-     * @generated
-     */
-    EAttribute getIJavaTypeDescriptor2_Type();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getBeanProperties <em>Bean Properties</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Bean Properties</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getBeanProperties()
-     * @see #getIJavaTypeDescriptor2()
-     * @generated
-     */
-    EReference getIJavaTypeDescriptor2_BeanProperties();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getBeanMethods <em>Bean Methods</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Bean Methods</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getBeanMethods()
-     * @see #getIJavaTypeDescriptor2()
-     * @generated
-     */
-    EReference getIJavaTypeDescriptor2_BeanMethods();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getArrayCount <em>Array Count</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Array Count</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2#getArrayCount()
-     * @see #getIJavaTypeDescriptor2()
-     * @generated
-     */
-    EAttribute getIJavaTypeDescriptor2_ArrayCount();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol <em>IBean Method Symbol</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IBean Method Symbol</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol
-     * @generated
-     */
-    EClass getIBeanMethodSymbol();
-
-    /**
-     * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol#getOwner <em>Owner</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference '<em>Owner</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol#getOwner()
-     * @see #getIBeanMethodSymbol()
-     * @generated
-     */
-    EReference getIBeanMethodSymbol_Owner();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IComponentSymbol <em>IComponent Symbol</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IComponent Symbol</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IComponentSymbol
-     * @generated
-     */
-    EClass getIComponentSymbol();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IPropertySymbol <em>IProperty Symbol</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IProperty Symbol</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IPropertySymbol
-     * @generated
-     */
-    EClass getIPropertySymbol();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IPropertySymbol#isIntermediate <em>Intermediate</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Intermediate</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IPropertySymbol#isIntermediate()
-     * @see #getIPropertySymbol()
-     * @generated
-     */
-    EAttribute getIPropertySymbol_Intermediate();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor <em>IMap Type Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IMap Type Descriptor</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor
-     * @generated
-     */
-    EClass getIMapTypeDescriptor();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor#getMapSource <em>Map Source</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Map Source</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor#getMapSource()
-     * @see #getIMapTypeDescriptor()
-     * @generated
-     */
-    EAttribute getIMapTypeDescriptor_MapSource();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor#isImmutable <em>Immutable</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Immutable</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor#isImmutable()
-     * @see #getIMapTypeDescriptor()
-     * @generated
-     */
-    EAttribute getIMapTypeDescriptor_Immutable();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IMethodSymbol <em>IMethod Symbol</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IMethod Symbol</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IMethodSymbol
-     * @generated
-     */
-    EClass getIMethodSymbol();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IMethodSymbol#getSignature <em>Signature</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Signature</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IMethodSymbol#getSignature()
-     * @see #getIMethodSymbol()
-     * @generated
-     */
-    EAttribute getIMethodSymbol_Signature();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol <em>IObject Symbol</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IObject Symbol</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IObjectSymbol
-     * @generated
-     */
-    EClass getIObjectSymbol();
-
-    /**
-     * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol#getTypeDescriptor <em>Type Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference '<em>Type Descriptor</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IObjectSymbol#getTypeDescriptor()
-     * @see #getIObjectSymbol()
-     * @generated
-     */
-    EReference getIObjectSymbol_TypeDescriptor();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol#isReadable <em>Readable</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Readable</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IObjectSymbol#isReadable()
-     * @see #getIObjectSymbol()
-     * @generated
-     */
-    EAttribute getIObjectSymbol_Readable();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol#isWritable <em>Writable</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Writable</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IObjectSymbol#isWritable()
-     * @see #getIObjectSymbol()
-     * @generated
-     */
-    EAttribute getIObjectSymbol_Writable();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor <em>IBounded Type Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IBounded Type Descriptor</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor
-     * @generated
-     */
-    EClass getIBoundedTypeDescriptor();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor <em>IBounded Map Type Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IBounded Map Type Descriptor</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor
-     * @generated
-     */
-    EClass getIBoundedMapTypeDescriptor();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor <em>IBounded Java Type Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IBounded Java Type Descriptor</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor
-     * @generated
-     */
-    EClass getIBoundedJavaTypeDescriptor();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor <em>IList Type Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IList Type Descriptor</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor
-     * @generated
-     */
-    EClass getIListTypeDescriptor();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor#getListSource <em>List Source</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>List Source</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor#getListSource()
-     * @see #getIListTypeDescriptor()
-     * @generated
-     */
-    EAttribute getIListTypeDescriptor_ListSource();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor <em>IBounded List Type Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>IBounded List Type Descriptor</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor
-     * @generated
-     */
-    EClass getIBoundedListTypeDescriptor();
-
-    /**
-     * Returns the meta object for enum '{@link org.eclipse.jst.jsf.context.symbol.ERuntimeSource <em>ERuntime Source</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for enum '<em>ERuntime Source</em>'.
-     * @see org.eclipse.jst.jsf.context.symbol.ERuntimeSource
-     * @generated
-     */
-    EEnum getERuntimeSource();
-
-    /**
-     * Returns the meta object for data type '{@link org.eclipse.jdt.core.IType <em>IType</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for data type '<em>IType</em>'.
-     * @see org.eclipse.jdt.core.IType
-     * @model instanceClass="org.eclipse.jdt.core.IType"
-     * @generated
-     */
-    EDataType getIType();
-
-    /**
-     * Returns the meta object for data type '{@link org.eclipse.jdt.core.IJavaElement <em>IJava Element</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for data type '<em>IJava Element</em>'.
-     * @see org.eclipse.jdt.core.IJavaElement
-     * @model instanceClass="org.eclipse.jdt.core.IJavaElement"
-     * @generated
-     */
-    EDataType getIJavaElement();
-
-    /**
-     * Returns the meta object for data type '{@link org.eclipse.jst.jsf.common.internal.types.ValueType <em>Value Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for data type '<em>Value Type</em>'.
-     * @see org.eclipse.jst.jsf.common.internal.types.ValueType
-     * @model instanceClass="org.eclipse.jst.jsf.common.internal.types.ValueType"
-     * @generated
-     */
-    EDataType getValueType();
-
-    /**
-     * Returns the factory that creates the instances of the model.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the factory that creates the instances of the model.
-     * @generated
-     */
-    SymbolFactory getSymbolFactory();
-
-    /**
-     * <!-- begin-user-doc -->
-     * Defines literals for the meta objects that represent
-     * <ul>
-     *   <li>each class,</li>
-     *   <li>each feature of each class,</li>
-     *   <li>each enum,</li>
-     *   <li>and each data type</li>
-     * </ul>
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    interface Literals {
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanInstanceSymbolImpl <em>IBean Instance Symbol</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanInstanceSymbolImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBeanInstanceSymbol()
-         * @generated
-         */
-        EClass IBEAN_INSTANCE_SYMBOL = eINSTANCE.getIBeanInstanceSymbol();
-
-        /**
-         * The meta object literal for the '<em><b>Properties</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference IBEAN_INSTANCE_SYMBOL__PROPERTIES = eINSTANCE.getIBeanInstanceSymbol_Properties();
-
-        /**
-         * The meta object literal for the '<em><b>Methods</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference IBEAN_INSTANCE_SYMBOL__METHODS = eINSTANCE.getIBeanInstanceSymbol_Methods();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanPropertySymbolImpl <em>IBean Property Symbol</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanPropertySymbolImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBeanPropertySymbol()
-         * @generated
-         */
-        EClass IBEAN_PROPERTY_SYMBOL = eINSTANCE.getIBeanPropertySymbol();
-
-        /**
-         * The meta object literal for the '<em><b>Owner</b></em>' reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference IBEAN_PROPERTY_SYMBOL__OWNER = eINSTANCE.getIBeanPropertySymbol_Owner();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl <em>IInstance Symbol</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIInstanceSymbol()
-         * @generated
-         */
-        EClass IINSTANCE_SYMBOL = eINSTANCE.getIInstanceSymbol();
-
-        /**
-         * The meta object literal for the '<em><b>Type Resolved</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IINSTANCE_SYMBOL__TYPE_RESOLVED = eINSTANCE.getIInstanceSymbol_TypeResolved();
-
-        /**
-         * The meta object literal for the '<em><b>Runtime Source</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IINSTANCE_SYMBOL__RUNTIME_SOURCE = eINSTANCE.getIInstanceSymbol_RuntimeSource();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaSymbolImpl <em>IJava Symbol</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaSymbolImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIJavaSymbol()
-         * @generated
-         */
-        EClass IJAVA_SYMBOL = eINSTANCE.getIJavaSymbol();
-
-        /**
-         * The meta object literal for the '<em><b>Java Element</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IJAVA_SYMBOL__JAVA_ELEMENT = eINSTANCE.getIJavaSymbol_JavaElement();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.ISymbol <em>ISymbol</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.ISymbol
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getISymbol()
-         * @generated
-         */
-        EClass ISYMBOL = eINSTANCE.getISymbol();
-
-        /**
-         * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ISYMBOL__NAME = eINSTANCE.getISymbol_Name();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl <em>IType Descriptor</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getITypeDescriptor()
-         * @generated
-         */
-        EClass ITYPE_DESCRIPTOR = eINSTANCE.getITypeDescriptor();
-
-        /**
-         * The meta object literal for the '<em><b>Properties</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference ITYPE_DESCRIPTOR__PROPERTIES = eINSTANCE.getITypeDescriptor_Properties();
-
-        /**
-         * The meta object literal for the '<em><b>Type Signature</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ITYPE_DESCRIPTOR__TYPE_SIGNATURE = eINSTANCE.getITypeDescriptor_TypeSignature();
-
-        /**
-         * The meta object literal for the '<em><b>Super Type Signatures</b></em>' attribute list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES = eINSTANCE.getITypeDescriptor_SuperTypeSignatures();
-
-        /**
-         * The meta object literal for the '<em><b>Interface Type Signatures</b></em>' attribute list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES = eINSTANCE.getITypeDescriptor_InterfaceTypeSignatures();
-
-        /**
-         * The meta object literal for the '<em><b>Type Signature Delegate</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE = eINSTANCE.getITypeDescriptor_TypeSignatureDelegate();
-
-        /**
-         * The meta object literal for the '<em><b>Methods</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference ITYPE_DESCRIPTOR__METHODS = eINSTANCE.getITypeDescriptor_Methods();
-
-        /**
-         * The meta object literal for the '<em><b>Type Parameter Signatures</b></em>' attribute list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ITYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES = eINSTANCE.getITypeDescriptor_TypeParameterSignatures();
-
-        /**
-         * The meta object literal for the '<em><b>Jdt Context</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ITYPE_DESCRIPTOR__JDT_CONTEXT = eINSTANCE.getITypeDescriptor_JdtContext();
-
-        /**
-         * The meta object literal for the '<em><b>Enum Type</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ITYPE_DESCRIPTOR__ENUM_TYPE = eINSTANCE.getITypeDescriptor_EnumType();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.IDescribedInDetail <em>IDescribed In Detail</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.IDescribedInDetail
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIDescribedInDetail()
-         * @generated
-         */
-        EClass IDESCRIBED_IN_DETAIL = eINSTANCE.getIDescribedInDetail();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaTypeDescriptor2Impl <em>IJava Type Descriptor2</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaTypeDescriptor2Impl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIJavaTypeDescriptor2()
-         * @generated
-         */
-        EClass IJAVA_TYPE_DESCRIPTOR2 = eINSTANCE.getIJavaTypeDescriptor2();
-
-        /**
-         * The meta object literal for the '<em><b>Type</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IJAVA_TYPE_DESCRIPTOR2__TYPE = eINSTANCE.getIJavaTypeDescriptor2_Type();
-
-        /**
-         * The meta object literal for the '<em><b>Bean Properties</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference IJAVA_TYPE_DESCRIPTOR2__BEAN_PROPERTIES = eINSTANCE.getIJavaTypeDescriptor2_BeanProperties();
-
-        /**
-         * The meta object literal for the '<em><b>Bean Methods</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference IJAVA_TYPE_DESCRIPTOR2__BEAN_METHODS = eINSTANCE.getIJavaTypeDescriptor2_BeanMethods();
-
-        /**
-         * The meta object literal for the '<em><b>Array Count</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IJAVA_TYPE_DESCRIPTOR2__ARRAY_COUNT = eINSTANCE.getIJavaTypeDescriptor2_ArrayCount();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanMethodSymbolImpl <em>IBean Method Symbol</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanMethodSymbolImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBeanMethodSymbol()
-         * @generated
-         */
-        EClass IBEAN_METHOD_SYMBOL = eINSTANCE.getIBeanMethodSymbol();
-
-        /**
-         * The meta object literal for the '<em><b>Owner</b></em>' reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference IBEAN_METHOD_SYMBOL__OWNER = eINSTANCE.getIBeanMethodSymbol_Owner();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IComponentSymbolImpl <em>IComponent Symbol</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IComponentSymbolImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIComponentSymbol()
-         * @generated
-         */
-        EClass ICOMPONENT_SYMBOL = eINSTANCE.getIComponentSymbol();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IPropertySymbolImpl <em>IProperty Symbol</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IPropertySymbolImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIPropertySymbol()
-         * @generated
-         */
-        EClass IPROPERTY_SYMBOL = eINSTANCE.getIPropertySymbol();
-
-        /**
-         * The meta object literal for the '<em><b>Intermediate</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IPROPERTY_SYMBOL__INTERMEDIATE = eINSTANCE.getIPropertySymbol_Intermediate();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IMapTypeDescriptorImpl <em>IMap Type Descriptor</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IMapTypeDescriptorImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIMapTypeDescriptor()
-         * @generated
-         */
-        EClass IMAP_TYPE_DESCRIPTOR = eINSTANCE.getIMapTypeDescriptor();
-
-        /**
-         * The meta object literal for the '<em><b>Map Source</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IMAP_TYPE_DESCRIPTOR__MAP_SOURCE = eINSTANCE.getIMapTypeDescriptor_MapSource();
-
-        /**
-         * The meta object literal for the '<em><b>Immutable</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IMAP_TYPE_DESCRIPTOR__IMMUTABLE = eINSTANCE.getIMapTypeDescriptor_Immutable();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IMethodSymbolImpl <em>IMethod Symbol</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IMethodSymbolImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIMethodSymbol()
-         * @generated
-         */
-        EClass IMETHOD_SYMBOL = eINSTANCE.getIMethodSymbol();
-
-        /**
-         * The meta object literal for the '<em><b>Signature</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IMETHOD_SYMBOL__SIGNATURE = eINSTANCE.getIMethodSymbol_Signature();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol <em>IObject Symbol</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.IObjectSymbol
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIObjectSymbol()
-         * @generated
-         */
-        EClass IOBJECT_SYMBOL = eINSTANCE.getIObjectSymbol();
-
-        /**
-         * The meta object literal for the '<em><b>Type Descriptor</b></em>' reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference IOBJECT_SYMBOL__TYPE_DESCRIPTOR = eINSTANCE.getIObjectSymbol_TypeDescriptor();
-
-        /**
-         * The meta object literal for the '<em><b>Readable</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IOBJECT_SYMBOL__READABLE = eINSTANCE.getIObjectSymbol_Readable();
-
-        /**
-         * The meta object literal for the '<em><b>Writable</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute IOBJECT_SYMBOL__WRITABLE = eINSTANCE.getIObjectSymbol_Writable();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor <em>IBounded Type Descriptor</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBoundedTypeDescriptor()
-         * @generated
-         */
-        EClass IBOUNDED_TYPE_DESCRIPTOR = eINSTANCE.getIBoundedTypeDescriptor();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedMapTypeDescriptorImpl <em>IBounded Map Type Descriptor</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedMapTypeDescriptorImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBoundedMapTypeDescriptor()
-         * @generated
-         */
-        EClass IBOUNDED_MAP_TYPE_DESCRIPTOR = eINSTANCE.getIBoundedMapTypeDescriptor();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedJavaTypeDescriptorImpl <em>IBounded Java Type Descriptor</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedJavaTypeDescriptorImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBoundedJavaTypeDescriptor()
-         * @generated
-         */
-        EClass IBOUNDED_JAVA_TYPE_DESCRIPTOR = eINSTANCE.getIBoundedJavaTypeDescriptor();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IListTypeDescriptorImpl <em>IList Type Descriptor</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IListTypeDescriptorImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIListTypeDescriptor()
-         * @generated
-         */
-        EClass ILIST_TYPE_DESCRIPTOR = eINSTANCE.getIListTypeDescriptor();
-
-        /**
-         * The meta object literal for the '<em><b>List Source</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ILIST_TYPE_DESCRIPTOR__LIST_SOURCE = eINSTANCE.getIListTypeDescriptor_ListSource();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedListTypeDescriptorImpl <em>IBounded List Type Descriptor</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IBoundedListTypeDescriptorImpl
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIBoundedListTypeDescriptor()
-         * @generated
-         */
-        EClass IBOUNDED_LIST_TYPE_DESCRIPTOR = eINSTANCE.getIBoundedListTypeDescriptor();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.context.symbol.ERuntimeSource <em>ERuntime Source</em>}' enum.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.context.symbol.ERuntimeSource
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getERuntimeSource()
-         * @generated
-         */
-        EEnum ERUNTIME_SOURCE = eINSTANCE.getERuntimeSource();
-
-        /**
-         * The meta object literal for the '<em>IType</em>' data type.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jdt.core.IType
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIType()
-         * @generated
-         */
-        EDataType ITYPE = eINSTANCE.getIType();
-
-        /**
-         * The meta object literal for the '<em>IJava Element</em>' data type.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jdt.core.IJavaElement
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getIJavaElement()
-         * @generated
-         */
-        EDataType IJAVA_ELEMENT = eINSTANCE.getIJavaElement();
-
-        /**
-         * The meta object literal for the '<em>Value Type</em>' data type.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.common.internal.types.ValueType
-         * @see org.eclipse.jst.jsf.context.symbol.internal.impl.SymbolPackageImpl#getValueType()
-         * @generated
-         */
-        EDataType VALUE_TYPE = eINSTANCE.getValueType();
-
-    }
-
-} //SymbolPackage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBeanInstanceSymbolImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBeanInstanceSymbolImpl.java
deleted file mode 100644
index 3872020..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBeanInstanceSymbolImpl.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-import java.util.HashMap;
-
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IBean Instance Symbol</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanInstanceSymbolImpl#getProperties <em>Properties</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanInstanceSymbolImpl#getMethods <em>Methods</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IBeanInstanceSymbolImpl extends IInstanceSymbolImpl implements IBeanInstanceSymbol {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * A detailed description (human readable) about this instance symbol
-	 */
-	protected String			  _detailedDescription = null;
-	
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected IBeanInstanceSymbolImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the EClass
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IBEAN_INSTANCE_SYMBOL;
-    }
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the list of bean properties 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public EList getProperties() 
-	{
-		return getJavaTypeDescriptor().getBeanProperties();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the list of methods 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public EList getMethods() {
-		return getJavaTypeDescriptor().getBeanMethods();
-	}
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public IJavaTypeDescriptor2 getJavaTypeDescriptor() {
-        return (IJavaTypeDescriptor2) getTypeDescriptor();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public void setJavaTypeDescriptor(IJavaTypeDescriptor2 newTypeDescriptor) {
-        setTypeDescriptor(newTypeDescriptor);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param resolve 
-     * @param coreType 
-     * @return the object related to featureID
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case SymbolPackage.IBEAN_INSTANCE_SYMBOL__PROPERTIES:
-                return getProperties();
-            case SymbolPackage.IBEAN_INSTANCE_SYMBOL__METHODS:
-                return getMethods();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @return whether the corresponding feature is set 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IBEAN_INSTANCE_SYMBOL__PROPERTIES:
-                return !getProperties().isEmpty();
-            case SymbolPackage.IBEAN_INSTANCE_SYMBOL__METHODS:
-                return !getMethods().isEmpty();
-        }
-        return super.eIsSet(featureID);
-    }
-
-	public String getDetailedDescription() 
-	{
-		return _detailedDescription;
-	}
-
-	public void setDetailedDescription(String detailedDescription) 
-	{
-		this._detailedDescription = detailedDescription;
-	}
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl#isTypeResolved()
-	 * @generated NOT
-	 */
-	// @Override
-	public boolean isTypeResolved() 
-	{
-		return getJavaTypeDescriptor() != null;
-	}
-
-    /**
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl#setTypeDescriptor(org.eclipse.jst.jsf.context.symbol.ITypeDescriptor)
-     * @generated NOT
-     */
-    public void setTypeDescriptor(ITypeDescriptor newTypeDescriptor) 
-    {
-        if (newTypeDescriptor instanceof IJavaTypeDescriptor2)
-        {
-            super.setTypeDescriptor(newTypeDescriptor);
-        }
-        else
-        {
-            throw new IllegalArgumentException("Bean instance symbol requires a IJavaTypeDescriptor2"); //$NON-NLS-1$
-        }
-    }
-
-    public boolean isReadable() 
-    {
-        // beans always readable
-        return true;
-    }
-
-    public boolean isWritable() 
-    {
-        // beans not writable
-        return false;
-    }
-
-    public void setReadable(boolean value) {
-        // do nothing
-    }
-
-    public void setWritable(boolean value) {
-        // do nothing
-    }
-
-    /* 
-     * @generated NOT
-     */
-    public ITypeDescriptor coerce(String typeSignature) 
-    {
-        if (supportsCoercion(typeSignature))
-        {
-            if (TypeConstants.TYPE_MAP.equals(typeSignature))
-            {
-                IBoundedMapTypeDescriptor mapDesc =  
-                    SymbolFactory.eINSTANCE.createIBoundedMapTypeDescriptor();
-                // bean maps are generally writable
-                mapDesc.setImmutable(true);
-                mapDesc.setMapSource(new HashMap());  // give it an empty map
-                return mapDesc;
-            }
-            else if (TypeConstants.TYPE_LIST.equals(typeSignature))
-            {
-                IBoundedListTypeDescriptor listDesc =  
-                    SymbolFactory.eINSTANCE.createIBoundedListTypeDescriptor();
-
-                // bean maps are generally writable
-                listDesc.setListSource(new BasicEList());  // give it an empty list
-                return listDesc;
-            }
-        }
-        
-        return null;
-    }
-
-    /** (non-Javadoc)
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IPropertySymbolImpl#call(java.lang.String, org.eclipse.emf.common.util.EList, java.lang.String)
-     * 
-     * @generated NOT
-     */
-    public ISymbol call(String methodName, EList methodArguments,
-            String symbolName) 
-    {
-        return Util.call(methodName, methodArguments, symbolName, getTypeDescriptor());
-    }
-
-} //IBeanInstanceSymbolImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBeanMethodSymbolImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBeanMethodSymbolImpl.java
deleted file mode 100644
index 0db98fa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBeanMethodSymbolImpl.java
+++ /dev/null
@@ -1,363 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IBean Method Symbol</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanMethodSymbolImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanMethodSymbolImpl#getSignature <em>Signature</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanMethodSymbolImpl#getOwner <em>Owner</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IBeanMethodSymbolImpl extends EObjectImpl implements IBeanMethodSymbol {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-    protected static final String NAME_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-    protected String name = NAME_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getSignature() <em>Signature</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getSignature()
-     * @generated
-     * @ordered
-     */
-    protected static final String SIGNATURE_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getSignature() <em>Signature</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getSignature()
-     * @generated
-     * @ordered
-     */
-    protected String signature = SIGNATURE_EDEFAULT;
-
-    /**
-     * The cached value of the '{@link #getOwner() <em>Owner</em>}' reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getOwner()
-     * @generated
-     * @ordered
-     */
-	protected IJavaTypeDescriptor2 owner = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected IBeanMethodSymbolImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the static eclass 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IBEAN_METHOD_SYMBOL;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the name of the method symbol 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newName 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setName(String newName) {
-        String oldName = name;
-        name = newName;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IBEAN_METHOD_SYMBOL__NAME, oldName, name));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the signature in JVM/JDT form 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getSignature() {
-        return signature;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newSignature 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setSignature(String newSignature) {
-        String oldSignature = signature;
-        signature = newSignature;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IBEAN_METHOD_SYMBOL__SIGNATURE, oldSignature, signature));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the java type descriptor that owns this symbol
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IJavaTypeDescriptor2 getOwner() {
-        if (owner != null && owner.eIsProxy()) {
-            InternalEObject oldOwner = (InternalEObject)owner;
-            owner = (IJavaTypeDescriptor2)eResolveProxy(oldOwner);
-            if (owner != oldOwner) {
-                if (eNotificationRequired())
-                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, SymbolPackage.IBEAN_METHOD_SYMBOL__OWNER, oldOwner, owner));
-            }
-        }
-        return owner;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the java type descriptor that derives this symbol 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IJavaTypeDescriptor2 basicGetOwner() {
-        return owner;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newOwner 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setOwner(IJavaTypeDescriptor2 newOwner) {
-        IJavaTypeDescriptor2 oldOwner = owner;
-        owner = newOwner;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IBEAN_METHOD_SYMBOL__OWNER, oldOwner, owner));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param resolve 
-     * @param coreType 
-     * @return the feature object for featureID 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__NAME:
-                return getName();
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__SIGNATURE:
-                return getSignature();
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__OWNER:
-                if (resolve) return getOwner();
-                return basicGetOwner();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param newValue 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__NAME:
-                setName((String)newValue);
-                return;
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__SIGNATURE:
-                setSignature((String)newValue);
-                return;
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__OWNER:
-                setOwner((IJavaTypeDescriptor2)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void eUnset(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__NAME:
-                setName(NAME_EDEFAULT);
-                return;
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__SIGNATURE:
-                setSignature(SIGNATURE_EDEFAULT);
-                return;
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__OWNER:
-                setOwner((IJavaTypeDescriptor2)null);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @return true if the feature has been set
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__NAME:
-                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__SIGNATURE:
-                return SIGNATURE_EDEFAULT == null ? signature != null : !SIGNATURE_EDEFAULT.equals(signature);
-            case SymbolPackage.IBEAN_METHOD_SYMBOL__OWNER:
-                return owner != null;
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param derivedFeatureID 
-     * @param baseClass 
-     * @return the feature id 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
-        if (baseClass == ISymbol.class) {
-            switch (derivedFeatureID) {
-                case SymbolPackage.IBEAN_METHOD_SYMBOL__NAME: return SymbolPackage.ISYMBOL__NAME;
-                default: return -1;
-            }
-        }
-        if (baseClass == IMethodSymbol.class) {
-            switch (derivedFeatureID) {
-                case SymbolPackage.IBEAN_METHOD_SYMBOL__SIGNATURE: return SymbolPackage.IMETHOD_SYMBOL__SIGNATURE;
-                default: return -1;
-            }
-        }
-        return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param baseFeatureID 
-     * @param baseClass 
-     * @return the feature id 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
-        if (baseClass == ISymbol.class) {
-            switch (baseFeatureID) {
-                case SymbolPackage.ISYMBOL__NAME: return SymbolPackage.IBEAN_METHOD_SYMBOL__NAME;
-                default: return -1;
-            }
-        }
-        if (baseClass == IMethodSymbol.class) {
-            switch (baseFeatureID) {
-                case SymbolPackage.IMETHOD_SYMBOL__SIGNATURE: return SymbolPackage.IBEAN_METHOD_SYMBOL__SIGNATURE;
-                default: return -1;
-            }
-        }
-        return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the default string representation 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (name: "); //$NON-NLS-1$
-        result.append(name);
-        result.append(", signature: "); //$NON-NLS-1$
-        result.append(signature);
-        result.append(')');
-        return result.toString();
-    }
-
-	public String getDetailedDescription() {
-		return ""; //$NON-NLS-1$
-	}
-
-	public void setDetailedDescription(String detailedDescription) {
-		throw new UnsupportedOperationException("Detailed Description is derived on property symbols"); //$NON-NLS-1$
-	}
-
-} //IBeanMethodSymbolImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBeanPropertySymbolImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBeanPropertySymbolImpl.java
deleted file mode 100644
index 3204c5d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBeanPropertySymbolImpl.java
+++ /dev/null
@@ -1,331 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-import java.util.HashMap;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IBean Property Symbol</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IBeanPropertySymbolImpl#getOwner <em>Owner</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IBeanPropertySymbolImpl extends IPropertySymbolImpl implements IBeanPropertySymbol {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-
-    /**
-     * The cached value of the '{@link #getOwner() <em>Owner</em>}' reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getOwner()
-     * @generated
-     * @ordered
-     */
-	protected IJavaTypeDescriptor2 owner = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected IBeanPropertySymbolImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the static class 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IBEAN_PROPERTY_SYMBOL;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the owner's type descriptor 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IJavaTypeDescriptor2 getOwner() {
-        if (owner != null && owner.eIsProxy()) {
-            InternalEObject oldOwner = (InternalEObject)owner;
-            owner = (IJavaTypeDescriptor2)eResolveProxy(oldOwner);
-            if (owner != oldOwner) {
-                if (eNotificationRequired())
-                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, SymbolPackage.IBEAN_PROPERTY_SYMBOL__OWNER, oldOwner, owner));
-            }
-        }
-        return owner;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * @return the java type descriptor for this instance
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IJavaTypeDescriptor2 basicGetOwner() {
-        return owner;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newOwner 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setOwner(IJavaTypeDescriptor2 newOwner) {
-        IJavaTypeDescriptor2 oldOwner = owner;
-        owner = newOwner;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IBEAN_PROPERTY_SYMBOL__OWNER, oldOwner, owner));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param resolve 
-     * @param coreType 
-     * @return the value for the featureID 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case SymbolPackage.IBEAN_PROPERTY_SYMBOL__OWNER:
-                if (resolve) return getOwner();
-                return basicGetOwner();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param newValue 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case SymbolPackage.IBEAN_PROPERTY_SYMBOL__OWNER:
-                setOwner((IJavaTypeDescriptor2)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void eUnset(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IBEAN_PROPERTY_SYMBOL__OWNER:
-                setOwner((IJavaTypeDescriptor2)null);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @return true if the feature is set 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IBEAN_PROPERTY_SYMBOL__OWNER:
-                return owner != null;
-        }
-        return super.eIsSet(featureID);
-    }
-
-	public String getDetailedDescription() 
-	{
-//		IType ownerType = getOwner().getType();
-//		IMethod method =
-//			ownerType.getMethod(getName(), new String[0]);
-//		
-//		if (method != null)
-//		{
-//			try
-//			{
-//                if (method.isBinary())
-//                {
-//                    return method.getAttachedJavadoc(new NullProgressMonitor());
-//                }
-//                else
-//                {
-//                    final ISourceRange sourceRange = method.getJavadocRange();
-//                    if (sourceRange != null)
-//                    {
-//                        return method.getCompilationUnit().
-//                    }
-//                }
-//			}
-//			catch (JavaModelException jme)
-//			{
-//				// fall through, return empty
-//			}
-//		}
-		
-		return ""; //$NON-NLS-1$
-	}
-
-	public void setDetailedDescription(String detailedDescription) 
-	{
-		throw new UnsupportedOperationException("Detailed Description is derived on property symbols"); //$NON-NLS-1$
-	}
-
-    /**
-     * @generated NOT
-     */
-    public ITypeDescriptor coerce(final String typeSignature) 
-    {
-        // ensure that we have an erased version
-        final String erasedTypeSignature = Signature.getTypeErasure(typeSignature);
-        
-        if (supportsCoercion(typeSignature))
-        {
-            if (TypeConstants.TYPE_MAP.equals(erasedTypeSignature))
-            {
-                IBoundedMapTypeDescriptor mapDesc =  
-                    SymbolFactory.eINSTANCE.createIBoundedMapTypeDescriptor();
-                // bean maps are generally writable
-                mapDesc.setImmutable(true);
-                mapDesc.setMapSource(new HashMap());  // give it an empty map
-                return mapDesc;
-            }
-            else if (TypeConstants.TYPE_LIST.equals(erasedTypeSignature))
-            {
-                IBoundedListTypeDescriptor listDesc =  
-                    SymbolFactory.eINSTANCE.createIBoundedListTypeDescriptor();
-                listDesc.setJdtContext(deriveBestJdtContext());
-                 
-                // bean maps are generally writable
-                return listDesc;
-            }
-        }
-        
-        return null;
-
-    }
-
-    private IJavaElement deriveBestJdtContext()
-    {
-        IJavaElement contextElement = null;
-        if (getTypeDescriptor() instanceof IJavaTypeDescriptor2)
-        {
-            contextElement = 
-                ((IJavaTypeDescriptor2)getTypeDescriptor()).getType();
-        }
-        
-        if (contextElement == null)
-        {
-            contextElement = getTypeDescriptor().getJdtContext();
-        }
-
-        return contextElement;
-    }
-    
-    /** (non-Javadoc)
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.IPropertySymbolImpl#call(java.lang.String, org.eclipse.emf.common.util.EList, java.lang.String)
-     * 
-     * @generated NOT
-     */
-    public ISymbol call(String methodName, EList methodArguments,
-            String symbolName) 
-    {
-        return Util.call(methodName, methodArguments, symbolName, getTypeDescriptor());
-    }
-
-
-//    private List convertArgsToSignatures(List methodArgs)
-//    {
-//        List args = new ArrayList();
-//        
-//        for (final Iterator it = methodArgs.iterator(); it.hasNext();)
-//        {
-//            Object arg = it.next();
-//            String className = arg.getClass().getName();
-//            String resolvedName = Signature.createTypeSignature(className, true);
-//            args.add(resolvedName);
-//        }
-//        
-//        return args;
-//    }
-
-    /**
-     * @generated NOT
-     */
-    public boolean supportsCoercion(String typeSignature) {
-        // first check that our type descriptor even thinks it is
-        // an instanceof this type
-        if (getTypeDescriptor().instanceOf(typeSignature))
-        {
-            // for java bean instances, we need to minimally support
-            // Map, List and Array to conform to the basic spec
-            // for JSF EL
-            if (TypeConstants.TYPE_MAP.equals(Signature.getTypeErasure(typeSignature)))
-            {
-                return true;
-            }
-            else if (TypeConstants.TYPE_LIST.equals(Signature.getTypeErasure(typeSignature)))
-            {
-                return true;
-            }
-        }
-        
-        // otherwise, not supported
-        return false;
-    }
-    
-    
-} //IBeanPropertySymbolImpl
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBoundedJavaTypeDescriptorImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBoundedJavaTypeDescriptorImpl.java
deleted file mode 100644
index ecc18ca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBoundedJavaTypeDescriptorImpl.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: IBoundedJavaTypeDescriptorImpl.java,v 1.7 2007/05/07 17:30:20 cbateman Exp $
- */
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IBounded Java Type Descriptor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class IBoundedJavaTypeDescriptorImpl extends IJavaTypeDescriptor2Impl implements IBoundedJavaTypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected IBoundedJavaTypeDescriptorImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IBOUNDED_JAVA_TYPE_DESCRIPTOR;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public boolean isUnboundedForType(String typeSignature) {
-        // TODO: for now, return true if the type is a resolved object
-        // need to add support for template checking (Java5) and
-        // decide what to do with unresolved (Q) type signatures
-        return typeSignature != null
-                && typeSignature.startsWith(Character.toString(Signature.C_RESOLVED));
-    }
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public ISymbol getUnboundedProperty(Object name, String typeSignature) {
-        ISymbol retValue = null;
-        
-        if (isUnboundedForType(typeSignature))
-        {
-            IPropertySymbol  propSymbol = SymbolFactory.eINSTANCE.createIPropertySymbol();
-            // TODO: there is a possible problem here for non-string keyed maps
-            propSymbol.setName(name.toString());
-            propSymbol.setReadable(true);
-            IBoundedJavaTypeDescriptor typeDesc = 
-                SymbolFactory.eINSTANCE.createIBoundedJavaTypeDescriptor();
-
-            typeDesc.setTypeSignatureDelegate(TypeConstants.TYPE_JAVAOBJECT);
-            propSymbol.setTypeDescriptor(typeDesc);
-            retValue = propSymbol;
-        }
-
-        return retValue;
-	}
-
-    public ISymbol calculateSyntheticCall(String methodName, EList methodArgs,
-            String symbolName) 
-    {
-        return getUnboundedProperty(symbolName, TypeConstants.TYPE_JAVAOBJECT);
-    }
-} //IBoundedJavaTypeDescriptorImpl
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBoundedListTypeDescriptorImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBoundedListTypeDescriptorImpl.java
deleted file mode 100644
index 4dd73dc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBoundedListTypeDescriptorImpl.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: IBoundedListTypeDescriptorImpl.java,v 1.4 2007/05/07 17:30:20 cbateman Exp $
- */
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.util.JDTBeanIntrospector;
-import org.eclipse.jst.jsf.common.util.TypeUtil;
-import org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IBounded List Type Descriptor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class IBoundedListTypeDescriptorImpl extends IListTypeDescriptorImpl implements IBoundedListTypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle";  //$NON-NLS-1$
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected IBoundedListTypeDescriptorImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IBOUNDED_LIST_TYPE_DESCRIPTOR;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public boolean isUnboundedForType(String typeSignature) 
-    {
-        // type signature must be a boxed integer
-        // TODO: at this level, do we need to deal with coercion to
-        // other integer types?  list.get() takes an integer...
-        return typeSignature != null && TypeConstants.TYPE_BOXED_INTEGER.equals(typeSignature);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public ISymbol getUnboundedProperty(Object name, String typeSignature) {
-        ISymbol  retValue = null;
-
-        if (isUnboundedForType(typeSignature)
-                && name instanceof Number)
-        {
-            // get integer value
-            int offset = ((Number)name).intValue();
-
-            // first see if we have it in our map source
-            // TODO: retValue = getFromMap(name.toString());
-
-            if (retValue == null)
-            {
-                IPropertySymbol  propSymbol = SymbolFactory.eINSTANCE.createIPropertySymbol();
-                // TODO: there is a possible problem here for non-string keyed maps
-                propSymbol.setName(name.toString());
-                propSymbol.setReadable(true);
-                propSymbol.setTypeDescriptor(getBoundsTypeDescriptor(offset));
-                retValue = propSymbol;
-            }
-        }
-
-        return retValue;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public ISymbol call(String methodName, EList methodArguments, String symbolName)
-    {
-        ISymbol result = null;
-        final IType type = resolveType(getTypeSignature());
-        
-        if (type != null)
-        {
-            final JDTBeanIntrospector introspector = 
-                new JDTBeanIntrospector(type);
-            
-            final IMethod callMethod = 
-                matchMethod(methodName, methodArguments, introspector.getAllMethods());
-            
-            if (callMethod != null)
-            {
-                try 
-                {
-                    // resolve the method's return type; don't erase parameters
-                    final String retTypeSignature = 
-                        TypeUtil.resolveTypeSignature
-                            (type, callMethod.getReturnType(), false) ;
-                    
-                    final IPropertySymbol  propSymbol = 
-                        SymbolFactory.eINSTANCE.createIPropertySymbol();
-
-                    // TODO: there is a possible problem here for non-string keyed maps
-                    propSymbol.setName(symbolName.toString());
-                    propSymbol.setReadable(true);
-                    IJavaTypeDescriptor2 typeDesc = 
-                        SymbolFactory.eINSTANCE.createIJavaTypeDescriptor2();
-                    
-                    typeDesc.setArrayCount(Signature.getArrayCount(retTypeSignature));
-                    
-                    // may be null
-                    typeDesc.setType(resolveType(retTypeSignature));
-                    typeDesc.setTypeSignatureDelegate(retTypeSignature);
-                    propSymbol.setTypeDescriptor(typeDesc);
-                    result = propSymbol;
-                } 
-                catch (JavaModelException e) 
-                {
-                    JSFCommonPlugin.log(e);
-                    // fall-through and return null result
-                }
-            }
-        }
-        
-        return result;
-    }
-    
-    private IMethod matchMethod(String name, List methodArguments, IMethod[] allMethods)
-    {
-        final List argSigs = convertArgsToSignatures(methodArguments);
-        IMethod matchedMethod = null;
-        
-        for (int i = 0; i < allMethods.length; i++)
-        {
-            final IMethod method = allMethods[i];
-            
-            // check for names and argument count match
-            if (method.getParameterTypes().length == argSigs.size()
-                    && method.getElementName().equals(name))
-            {
-                String[] methods = method.getParameterTypes();
-                // need to verify argument matches
-                boolean isMatched = true;
-                CHECK_ARGUMENTS: for (int j = 0; j < methods.length; j++)
-                {
-                    if (!methods[j].equals(argSigs.get(j)))
-                    {
-                        // not a match
-                        isMatched = false;
-                        break CHECK_ARGUMENTS;
-                    }
-                }
-                
-                if (isMatched)
-                {
-                    return method;
-                }
-            }
-        }
-
-        return matchedMethod;
-    }
-
-    private List convertArgsToSignatures(List methodArgs)
-    {
-        List args = new ArrayList();
-        
-        for (final Iterator it = methodArgs.iterator(); it.hasNext();)
-        {
-            Object arg = it.next();
-            String className = arg.getClass().getName();
-            String resolvedName = Signature.createTypeSignature(className, true);
-            args.add(resolvedName);
-        }
-        
-        return args;
-    }
-    
-    /**
-     * @return the ITypeDescriptor for this List's element type (bound type).
-     * Defaults to java.lang.Object if no bounds or can't resolve bounds
-     * 
-     * @generated NOT 
-     */
-    private ITypeDescriptor getBoundsTypeDescriptor(int offset)
-    {
-        IJavaTypeDescriptor2  typeDesc = null;
-        
-        List typeParameters = getTypeParameterSignatures();
-        
-        // if no bounds at all, then default to bounded java object
-        if (typeParameters.size() == 0)
-        {
-            typeDesc = 
-                SymbolFactory.eINSTANCE.createIBoundedJavaTypeDescriptor();
-            
-            typeDesc.setTypeSignatureDelegate(TypeConstants.TYPE_JAVAOBJECT);
-        }
-        else
-        {
-            // TODO: there should only be exactly one on a list...
-            final String elementType = (String) typeParameters.get(0);
-            
-            typeDesc = 
-                SymbolFactory.eINSTANCE.createIJavaTypeDescriptor2();
-            
-            typeDesc.setArrayCount(Signature.getArrayCount(elementType));
-            
-            // may be null
-            typeDesc.setType(resolveType(elementType));
-            typeDesc.setTypeSignatureDelegate(elementType);
-        }
-
-        return typeDesc;
-    }
-} //IBoundedListTypeDescriptorImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBoundedMapTypeDescriptorImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBoundedMapTypeDescriptorImpl.java
deleted file mode 100644
index fd71c5a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBoundedMapTypeDescriptorImpl.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: IBoundedMapTypeDescriptorImpl.java,v 1.6 2007/05/07 17:30:20 cbateman Exp $
- */
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-import java.util.Iterator;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IBounded Map Type Descriptor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class IBoundedMapTypeDescriptorImpl extends IMapTypeDescriptorImpl implements IBoundedMapTypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle";  //$NON-NLS-1$
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected IBoundedMapTypeDescriptorImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IBOUNDED_MAP_TYPE_DESCRIPTOR;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public boolean isUnboundedForType(String typeSignature) {
-        // TODO: for now, return true if the type is a resolved object
-        // need to add support for template checking (Java5) and
-        // decide what to do with unresolved (Q) type signatures
-        return typeSignature != null
-                && typeSignature.startsWith(Character.toString(Signature.C_RESOLVED));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public ISymbol getUnboundedProperty(Object name, String typeSignature) {
-        ISymbol  retValue = null;
-        
-        if (isUnboundedForType(typeSignature))
-        {
-            // first see if we have it in our map source
-            retValue = getFromMap(name.toString());
-            
-            if (retValue == null)
-            {
-                IPropertySymbol  propSymbol = SymbolFactory.eINSTANCE.createIPropertySymbol();
-                // TODO: there is a possible problem here for non-string keyed maps
-                propSymbol.setName(name.toString());
-                propSymbol.setReadable(true);
-                IBoundedJavaTypeDescriptor typeDesc = 
-                    SymbolFactory.eINSTANCE.createIBoundedJavaTypeDescriptor();
-                
-                typeDesc.setTypeSignatureDelegate(TypeConstants.TYPE_JAVAOBJECT);
-                propSymbol.setTypeDescriptor(typeDesc);
-                retValue = propSymbol;
-            }
-        }
-
-        return retValue;
-
-    }
-
-    /**
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#calculateSyntheticCall(java.lang.String, org.eclipse.emf.common.util.EList, java.lang.String)
-     * @generated NOT
-     */
-    public ISymbol calculateSyntheticCall(String methodName, EList methodArgs,
-            String symbolName) {
-        if ("get".equals(methodName)  //$NON-NLS-1$
-                && methodArgs.size() == 1)
-        {
-            return getUnboundedProperty(symbolName, ((ValueType) methodArgs.get(0)).getSignature());
-        }
-            
-        // default is return null
-        return null;
-    }
-
-
-    /**
-     * @generated NOT
-     */
-    private ISymbol getFromMap(final String name)
-    {
-        for (final Iterator it = getProperties().iterator(); it.hasNext();)
-        {
-            ISymbol  symbol = (ISymbol) it.next();
-            
-            if (symbol.getName().equals(name))
-            {
-                return symbol;
-            }
-        }
-        
-        return null;
-    }
-
-} //IBoundedMapTypeDescriptorImpl
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IComponentSymbolImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IComponentSymbolImpl.java
deleted file mode 100644
index 1a57a39..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IComponentSymbolImpl.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.context.symbol.IComponentSymbol;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IComponent Symbol</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class IComponentSymbolImpl extends IInstanceSymbolImpl implements IComponentSymbol {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle";  //$NON-NLS-1$
-
-    /**
-     * A human readable description of this symbol
-     */
-    protected String  _detailedDescription = null;
-    
-    /**
-     * true if this component symbol is readable
-     */
-    protected boolean _isReadable = READABLE_EDEFAULT;
-    
-    /**
-     * true if this component symbol is writable
-     */
-    protected boolean _isWritable = WRITABLE_EDEFAULT;
-    
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected IComponentSymbolImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the static class 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return SymbolPackage.Literals.ICOMPONENT_SYMBOL;
-    }
-
-    public String getDetailedDescription() {
-        return _detailedDescription;
-    }
-
-    public void setDetailedDescription(String detailedDescription) {
-        _detailedDescription = detailedDescription;
-    }
-
-    /**
-     * @generated NOT
-     */
-    public ITypeDescriptor coerce(String typeSignature) {
-        // TODO:
-        return getTypeDescriptor();
-    }
-
-    /** 
-     * @generated NOT
-     */
-    public boolean supportsCoercion(String typeSignature) {
-        // TODO:
-        if (getTypeDescriptor().instanceOf(typeSignature))
-        {
-            return true;
-        }
-        return false;
-    }
-} //IComponentSymbolImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IInstanceSymbolImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IInstanceSymbolImpl.java
deleted file mode 100644
index bc868c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IInstanceSymbolImpl.java
+++ /dev/null
@@ -1,499 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.context.symbol.ERuntimeSource;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IInstance Symbol</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl#getTypeDescriptor <em>Type Descriptor</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl#isReadable <em>Readable</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl#isWritable <em>Writable</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl#isTypeResolved <em>Type Resolved</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IInstanceSymbolImpl#getRuntimeSource <em>Runtime Source</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IInstanceSymbolImpl extends EObjectImpl implements IInstanceSymbol {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle";  //$NON-NLS-1$
-
-    /**
-     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-	protected static final String NAME_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-	protected String name = NAME_EDEFAULT;
-
-    /**
-     * The cached value of the '{@link #getTypeDescriptor() <em>Type Descriptor</em>}' reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTypeDescriptor()
-     * @generated
-     * @ordered
-     */
-	protected ITypeDescriptor typeDescriptor = null;
-
-    /**
-     * The default value of the '{@link #isReadable() <em>Readable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isReadable()
-     * @generated NOT
-     * @ordered
-     */
-    protected static final boolean READABLE_EDEFAULT = true;
-
-    /**
-     * The cached value of the '{@link #isReadable() <em>Readable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isReadable()
-     * @generated
-     * @ordered
-     */
-    protected boolean readable = READABLE_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #isWritable() <em>Writable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isWritable()
-     * @generated
-     * @ordered
-     */
-    protected static final boolean WRITABLE_EDEFAULT = false;
-
-    /**
-     * The cached value of the '{@link #isWritable() <em>Writable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isWritable()
-     * @generated
-     * @ordered
-     */
-    protected boolean writable = WRITABLE_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #isTypeResolved() <em>Type Resolved</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #isTypeResolved()
-     * @generated
-     * @ordered
-     */
-	protected static final boolean TYPE_RESOLVED_EDEFAULT = false;
-
-    /**
-     * The default value of the '{@link #getRuntimeSource() <em>Runtime Source</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getRuntimeSource()
-     * @generated
-     * @ordered
-     */
-    protected static final ERuntimeSource RUNTIME_SOURCE_EDEFAULT = ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL;
-
-    /**
-     * The cached value of the '{@link #getRuntimeSource() <em>Runtime Source</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getRuntimeSource()
-     * @generated
-     * @ordered
-     */
-    protected ERuntimeSource runtimeSource = RUNTIME_SOURCE_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected IInstanceSymbolImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the static class 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IINSTANCE_SYMBOL;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the symbol name
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getName() {
-        return name;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newName 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setName(String newName) {
-        String oldName = name;
-        name = newName;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IINSTANCE_SYMBOL__NAME, oldName, name));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the type descriptor for this instance 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ITypeDescriptor getTypeDescriptor() {
-        if (typeDescriptor != null && typeDescriptor.eIsProxy()) {
-            InternalEObject oldTypeDescriptor = (InternalEObject)typeDescriptor;
-            typeDescriptor = (ITypeDescriptor)eResolveProxy(oldTypeDescriptor);
-            if (typeDescriptor != oldTypeDescriptor) {
-                if (eNotificationRequired())
-                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, SymbolPackage.IINSTANCE_SYMBOL__TYPE_DESCRIPTOR, oldTypeDescriptor, typeDescriptor));
-            }
-        }
-        return typeDescriptor;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * @return the instance type
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ITypeDescriptor basicGetTypeDescriptor() {
-        return typeDescriptor;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newTypeDescriptor 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTypeDescriptor(ITypeDescriptor newTypeDescriptor) {
-        ITypeDescriptor oldTypeDescriptor = typeDescriptor;
-        typeDescriptor = newTypeDescriptor;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IINSTANCE_SYMBOL__TYPE_DESCRIPTOR, oldTypeDescriptor, typeDescriptor));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return true if instance symbol is readable 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean isReadable() {
-        return readable;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newReadable 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setReadable(boolean newReadable) {
-        boolean oldReadable = readable;
-        readable = newReadable;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IINSTANCE_SYMBOL__READABLE, oldReadable, readable));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return true if instance is writable.  
-     * 
-     * Normally, instances should not be 
-     * considered writable, since the VariableResolver has no setter, however
-     * this is included to allow for unforeseen cases that may require an 
-     * instance symbol to appear to be writable 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean isWritable() {
-        return writable;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newWritable 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setWritable(boolean newWritable) {
-        boolean oldWritable = writable;
-        writable = newWritable;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IINSTANCE_SYMBOL__WRITABLE, oldWritable, writable));
-    }
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return true if the type descriptor has been resolved for this symbol 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean isTypeResolved() 
-	{
-		return getTypeDescriptor() != null;
-	}
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return return the symbol's runtime source 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ERuntimeSource getRuntimeSource() {
-        return runtimeSource;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newRuntimeSource 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setRuntimeSource(ERuntimeSource newRuntimeSource) {
-        ERuntimeSource oldRuntimeSource = runtimeSource;
-        runtimeSource = newRuntimeSource == null ? RUNTIME_SOURCE_EDEFAULT : newRuntimeSource;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IINSTANCE_SYMBOL__RUNTIME_SOURCE, oldRuntimeSource, runtimeSource));
-    }
-
-    /**
-     * @generated NOT
-     */
-    public boolean supportsCoercion(String typeSignature) 
-    {
-        // first check that our type descriptor even thinks it is
-        // an instanceof this type
-        if (getTypeDescriptor().instanceOf(typeSignature))
-        {
-            // for java bean instances, we need to minimally support
-            // Map, List and Array to conform to the basic spec
-            // for JSF EL
-            if (TypeConstants.TYPE_MAP.equals(typeSignature))
-            {
-                return true;
-            }
-            else if (TypeConstants.TYPE_LIST.equals(typeSignature)
-                       /*TODO: || isArray*/)
-            {
-                return true;
-            }
-        }
-        
-        // otherwise, not supported
-        return false;
-    }
-
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public ITypeDescriptor coerce(String typeSignature) {
-        // TODO:
-        return getTypeDescriptor();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public ISymbol call(String methodName, EList methodArguments, String symbolName) {
-        return Util.call(methodName,methodArguments,symbolName,getTypeDescriptor());
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param resolve 
-     * @param coreType 
-     * @return the value for the featureID 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case SymbolPackage.IINSTANCE_SYMBOL__NAME:
-                return getName();
-            case SymbolPackage.IINSTANCE_SYMBOL__TYPE_DESCRIPTOR:
-                if (resolve) return getTypeDescriptor();
-                return basicGetTypeDescriptor();
-            case SymbolPackage.IINSTANCE_SYMBOL__READABLE:
-                return isReadable() ? Boolean.TRUE : Boolean.FALSE;
-            case SymbolPackage.IINSTANCE_SYMBOL__WRITABLE:
-                return isWritable() ? Boolean.TRUE : Boolean.FALSE;
-            case SymbolPackage.IINSTANCE_SYMBOL__TYPE_RESOLVED:
-                return isTypeResolved() ? Boolean.TRUE : Boolean.FALSE;
-            case SymbolPackage.IINSTANCE_SYMBOL__RUNTIME_SOURCE:
-                return getRuntimeSource();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param newValue 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case SymbolPackage.IINSTANCE_SYMBOL__NAME:
-                setName((String)newValue);
-                return;
-            case SymbolPackage.IINSTANCE_SYMBOL__TYPE_DESCRIPTOR:
-                setTypeDescriptor((ITypeDescriptor)newValue);
-                return;
-            case SymbolPackage.IINSTANCE_SYMBOL__READABLE:
-                setReadable(((Boolean)newValue).booleanValue());
-                return;
-            case SymbolPackage.IINSTANCE_SYMBOL__WRITABLE:
-                setWritable(((Boolean)newValue).booleanValue());
-                return;
-            case SymbolPackage.IINSTANCE_SYMBOL__RUNTIME_SOURCE:
-                setRuntimeSource((ERuntimeSource)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void eUnset(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IINSTANCE_SYMBOL__NAME:
-                setName(NAME_EDEFAULT);
-                return;
-            case SymbolPackage.IINSTANCE_SYMBOL__TYPE_DESCRIPTOR:
-                setTypeDescriptor((ITypeDescriptor)null);
-                return;
-            case SymbolPackage.IINSTANCE_SYMBOL__READABLE:
-                setReadable(READABLE_EDEFAULT);
-                return;
-            case SymbolPackage.IINSTANCE_SYMBOL__WRITABLE:
-                setWritable(WRITABLE_EDEFAULT);
-                return;
-            case SymbolPackage.IINSTANCE_SYMBOL__RUNTIME_SOURCE:
-                setRuntimeSource(RUNTIME_SOURCE_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @return true if the feature has been set 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IINSTANCE_SYMBOL__NAME:
-                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-            case SymbolPackage.IINSTANCE_SYMBOL__TYPE_DESCRIPTOR:
-                return typeDescriptor != null;
-            case SymbolPackage.IINSTANCE_SYMBOL__READABLE:
-                return readable != READABLE_EDEFAULT;
-            case SymbolPackage.IINSTANCE_SYMBOL__WRITABLE:
-                return writable != WRITABLE_EDEFAULT;
-            case SymbolPackage.IINSTANCE_SYMBOL__TYPE_RESOLVED:
-                return isTypeResolved() != TYPE_RESOLVED_EDEFAULT;
-            case SymbolPackage.IINSTANCE_SYMBOL__RUNTIME_SOURCE:
-                return runtimeSource != RUNTIME_SOURCE_EDEFAULT;
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the string representation 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (name: ");  //$NON-NLS-1$
-        result.append(name);
-        result.append(", readable: "); //$NON-NLS-1$
-        result.append(readable);
-        result.append(", writable: "); //$NON-NLS-1$
-        result.append(writable);
-        result.append(", runtimeSource: "); //$NON-NLS-1$
-        result.append(runtimeSource);
-        result.append(')');
-        return result.toString();
-    }
-
-} //IInstanceSymbolImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IJavaSymbolImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IJavaSymbolImpl.java
deleted file mode 100644
index 32d8de6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IJavaSymbolImpl.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jst.jsf.context.symbol.IJavaSymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IJava Symbol</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaSymbolImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaSymbolImpl#getJavaElement <em>Java Element</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IJavaSymbolImpl extends EObjectImpl implements IJavaSymbol {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright 2006 Oracle";  //$NON-NLS-1$
-
-    /**
-     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-	protected static final String NAME_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-	protected String name = NAME_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getJavaElement() <em>Java Element</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getJavaElement()
-     * @generated
-     * @ordered
-     */
-	protected static final IJavaElement JAVA_ELEMENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getJavaElement() <em>Java Element</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getJavaElement()
-     * @generated
-     * @ordered
-     */
-	protected IJavaElement javaElement = JAVA_ELEMENT_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected IJavaSymbolImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the static eclass 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IJAVA_SYMBOL;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the symbol name 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getName() {
-        return name;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newName 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setName(String newName) {
-        String oldName = name;
-        name = newName;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IJAVA_SYMBOL__NAME, oldName, name));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the IJavaElement associated with this symbol
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IJavaElement getJavaElement() {
-        return javaElement;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newJavaElement 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setJavaElement(IJavaElement newJavaElement) {
-        IJavaElement oldJavaElement = javaElement;
-        javaElement = newJavaElement;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IJAVA_SYMBOL__JAVA_ELEMENT, oldJavaElement, javaElement));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param resolve 
-     * @param coreType 
-     * @return the feature 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case SymbolPackage.IJAVA_SYMBOL__NAME:
-                return getName();
-            case SymbolPackage.IJAVA_SYMBOL__JAVA_ELEMENT:
-                return getJavaElement();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param newValue 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case SymbolPackage.IJAVA_SYMBOL__NAME:
-                setName((String)newValue);
-                return;
-            case SymbolPackage.IJAVA_SYMBOL__JAVA_ELEMENT:
-                setJavaElement((IJavaElement)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void eUnset(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IJAVA_SYMBOL__NAME:
-                setName(NAME_EDEFAULT);
-                return;
-            case SymbolPackage.IJAVA_SYMBOL__JAVA_ELEMENT:
-                setJavaElement(JAVA_ELEMENT_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @return true if featureID's feature has been set 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IJAVA_SYMBOL__NAME:
-                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-            case SymbolPackage.IJAVA_SYMBOL__JAVA_ELEMENT:
-                return JAVA_ELEMENT_EDEFAULT == null ? javaElement != null : !JAVA_ELEMENT_EDEFAULT.equals(javaElement);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the default string representation 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (name: "); //$NON-NLS-1$
-        result.append(name);
-        result.append(", javaElement: "); //$NON-NLS-1$
-        result.append(javaElement);
-        result.append(')');
-        return result.toString();
-    }
-
-} //IJavaSymbolImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IJavaTypeDescriptor2Impl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IJavaTypeDescriptor2Impl.java
deleted file mode 100644
index a12e921..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IJavaTypeDescriptor2Impl.java
+++ /dev/null
@@ -1,672 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.internal.types.TypeInfoCache;
-import org.eclipse.jst.jsf.common.util.JDTBeanIntrospector;
-import org.eclipse.jst.jsf.common.util.JDTBeanProperty;
-import org.eclipse.jst.jsf.common.util.TypeUtil;
-import org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IJava Type Descriptor2</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaTypeDescriptor2Impl#getType <em>Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaTypeDescriptor2Impl#getBeanProperties <em>Bean Properties</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaTypeDescriptor2Impl#getBeanMethods <em>Bean Methods</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IJavaTypeDescriptor2Impl#getArrayCount <em>Array Count</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IJavaTypeDescriptor2Impl extends ITypeDescriptorImpl implements IJavaTypeDescriptor2 {
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle";  //$NON-NLS-1$
-
-    /**
-     * The default value of the '{@link #getType() <em>Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getType()
-     * @generated
-     * @ordered
-     */
-	protected static final IType TYPE_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getType()
-     * @generated
-     * @ordered
-     */
-	protected IType type = TYPE_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getArrayCount() <em>Array Count</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getArrayCount()
-     * @generated
-     * @ordered
-     */
-    protected static final int ARRAY_COUNT_EDEFAULT = 0;
-
-    /**
-     * The cached value of the '{@link #getArrayCount() <em>Array Count</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * records the array nesting of the type.  IType doesn't encapsulate
-     * array types. So if this type is an array then type will represent
-     * the base element and this value will be > 0.  If not an array, then
-     * _arrayCount is always 0. 
-     * <!-- end-user-doc -->
-     * @see #getArrayCount()
-     * @generated
-     * @ordered
-     */
-    protected int arrayCount = ARRAY_COUNT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getJdtContext() <em>Jdt Context</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getJdtContext()
-     * @generated
-     * @ordered
-     */
-    protected static final IJavaElement JDT_CONTEXT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getJdtContext() <em>Jdt Context</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getJdtContext()
-     * @generated
-     * @ordered
-     */
-    protected IJavaElement jdtContext = JDT_CONTEXT_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected IJavaTypeDescriptor2Impl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the static class 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IJAVA_TYPE_DESCRIPTOR2;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the JDT type descriptor; if type is an array then this type
-     * represent's the array base type only
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IType getType() {
-        return type;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newType 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setType(IType newType) {
-        IType oldType = type;
-        type = newType;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__TYPE, oldType, type));
-    }
-
-	/**
-	 * @see org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getInterfaceTypeSignatures()
-	 * @generated NOT
-	 */
-	public EList getInterfaceTypeSignatures() 
-    {
-        EList  interfaces = new BasicEList();
-        
-        IType type_ = getType();
-        
-        if (type_ != null)
-        {
-            final TypeInfoCache typeInfoCache = TypeInfoCache.getInstance();
-            IType[] interfaceTypes = typeInfoCache.getCachedInterfaceTypes(type_);
-            if (interfaceTypes == null) {
-               interfaceTypes = typeInfoCache.cacheInterfaceTypesFor(type_);
-            }
-            copySignatures(interfaces, interfaceTypes);
-        }
-        
-        return interfaces;
-    }
-
-    /**
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getSuperTypeSignatures()
-     * @generated NOT
-     */
-    public EList getSuperTypeSignatures() 
-    {
-        EList  interfaces = new BasicEList();
-        
-        IType type_ = getType();
-        
-        if (type_ != null)
-        {
-            final TypeInfoCache typeInfoCache = TypeInfoCache.getInstance();
-            IType[] interfaceTypes = typeInfoCache.getCachedSupertypes(type_);
-
-            if (interfaceTypes == null) 
-            {
-               interfaceTypes = typeInfoCache.cacheSupertypesFor(type_);
-            }
-            copySignatures(interfaces, interfaceTypes);
-        }
-        
-        return interfaces;
-    }
-    
-    
-    private void copySignatures(List  list, IType[]  types)
-    {
-        for (int i = 0; i < types.length; i++)
-        {
-            final IType type_ = types[i];
-            final String signature = TypeUtil.getSignature(type_);
-            
-            if (signature != null)
-            {
-                list.add(signature);
-            }
-        }
-    }
-
-    public EList getProperties() 
-    {
-        return getBeanProperties();
-    }
-
-    
-    public EList getMethods() 
-    {
-        return getBeanMethods();
-    }
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @return the bean props for this java type 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public EList getBeanProperties() 
-	{
-	    TypeInfoCache typeInfoCache = TypeInfoCache.getInstance();
-	    IBeanPropertySymbol[] properties = typeInfoCache.getCachedPropertySymbols(type);
-	    Collection propertyColl;
-	    if (properties == null) {
-	        propertyColl = getPropertiesInternal();
-	        properties = (IBeanPropertySymbol[]) propertyColl.toArray(new IBeanPropertySymbol[propertyColl.size()]);
-	        typeInfoCache.cachePropertySymbols(type, properties);
-	    } 
-	    else 
-	    {
-            propertyColl = new ArrayList(properties.length);
-            Collections.addAll(propertyColl, (Object[])properties);
-	    }
-	    BasicEList list = new BasicEList(propertyColl);
-	    return list;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the bean methods for this type  
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public EList getBeanMethods() {
-	    TypeInfoCache typeInfoCache = TypeInfoCache.getInstance();
-	    IBeanMethodSymbol[] methods = typeInfoCache.getCachedMethodSymbols(type);
-	    Collection methodColl;
-	    if (methods == null) 
-	    {
-	        methodColl = getMethodsInternal();
-	        methods = (IBeanMethodSymbol[]) methodColl.toArray(new IBeanMethodSymbol[methodColl.size()]);
-	        typeInfoCache.cacheMethodSymbols(type, methods);
-	    } else {
-	        methodColl = new ArrayList(methods.length);
-	        Collections.addAll(methodColl, (Object[])methods);
-	    }
-	    BasicEList list = new BasicEList(methodColl);
-		return list;
-	}
-
-    
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public int getArrayCount() {
-        return arrayCount;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setArrayCount(int newArrayCount) {
-        int oldArrayCount = arrayCount;
-        arrayCount = newArrayCount;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__ARRAY_COUNT, oldArrayCount, arrayCount));
-    }
-
-	/**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IJavaElement getJdtContext() {
-        return jdtContext;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setJdtContext(IJavaElement newJdtContext) {
-        IJavaElement oldJdtContext = jdtContext;
-        jdtContext = newJdtContext;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__JDT_CONTEXT, oldJdtContext, jdtContext));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * 
-     * Tries to load an IType for a fully resolved (i.e. starts with L not Q)
-     * type signature using the current jdtContext.
-     * 
-     * @return the resolved IType or null if none could be resolved.
-     * 
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public IType resolveType(String resolvedTypeSignature) 
-    {
-        IType resolvedType = null;
-        
-        // we need to obtain an IJavaProject within which to resolve
-        // the type.
-        IJavaProject project = null;
-        
-        // first, see if we have an IType
-        if (getType() != null)
-        {
-            // optimize: if the type sig is my type sig, then return getType()
-            if (resolvedTypeSignature.equals(getTypeSignature()))
-            {
-                resolvedType = getType();
-            }
-            else
-            {
-                project = getType().getJavaProject();
-                
-                if (project != null)
-                {
-                    resolvedType =  TypeUtil.resolveType(project, resolvedTypeSignature);
-                }
-            }
-        }        
-        
-        // if not, see if a jdtContext hint has been set
-        if (resolvedType == null && getJdtContext() != null)
-        {
-            resolvedType = super.resolveType(resolvedTypeSignature);
-        }
-        
-        return resolvedType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__TYPE:
-                return getType();
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__BEAN_PROPERTIES:
-                return getBeanProperties();
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__BEAN_METHODS:
-                return getBeanMethods();
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__ARRAY_COUNT:
-                return new Integer(getArrayCount());
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__TYPE:
-                setType((IType)newValue);
-                return;
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__BEAN_PROPERTIES:
-                getBeanProperties().clear();
-                getBeanProperties().addAll((Collection)newValue);
-                return;
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__BEAN_METHODS:
-                getBeanMethods().clear();
-                getBeanMethods().addAll((Collection)newValue);
-                return;
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__ARRAY_COUNT:
-                setArrayCount(((Integer)newValue).intValue());
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__TYPE:
-                setType(TYPE_EDEFAULT);
-                return;
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__BEAN_PROPERTIES:
-                getBeanProperties().clear();
-                return;
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__BEAN_METHODS:
-                getBeanMethods().clear();
-                return;
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__ARRAY_COUNT:
-                setArrayCount(ARRAY_COUNT_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__TYPE:
-                return TYPE_EDEFAULT == null ? type != null : !TYPE_EDEFAULT.equals(type);
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__BEAN_PROPERTIES:
-                return !getBeanProperties().isEmpty();
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__BEAN_METHODS:
-                return !getBeanMethods().isEmpty();
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__ARRAY_COUNT:
-                return arrayCount != ARRAY_COUNT_EDEFAULT;
-        }
-        return super.eIsSet(featureID);
-    }
-
-    public boolean isArray() 
-    {
-	    return getArrayCount() > 0;
-    }
-
-    /**
-	 * @generated NOT
-	 */
-	public IObjectSymbol getArrayElement() 
-	{
-		if (isArray())
-		{
-			final String typeSignature = getTypeSignature();
-			final int arrayCount_ = Signature.getArrayCount(typeSignature);
-			final String baseType = Signature.getElementType(typeSignature);
-			final String elementTypeSignature = Signature.createArraySignature(baseType, arrayCount_-1);
-
-			final IJavaTypeDescriptor2 elementTypeDesc = 
-				SymbolFactory.eINSTANCE.createIJavaTypeDescriptor2();
-			final String fullyQualifiedElementType = TypeUtil.getFullyQualifiedName(baseType);
-			
-			IType elementType = null;
-
-			try 
-			{
-			    IType myType = getType();
-				if (myType != null)
-				{
-					elementType = getType().getJavaProject()
-					                 .findType(fullyQualifiedElementType);
-				}
-			} 
-			catch (JavaModelException e) 
-			{
-				// suppress
-			}
-
-			if (elementType != null)
-			{
-				elementTypeDesc.setType(elementType);
-			}
-			else
-			{
-				elementTypeDesc.setTypeSignatureDelegate(elementTypeSignature);
-			}
-            
-            elementTypeDesc.setArrayCount(Signature.getArrayCount(elementTypeSignature));
-			
-			IPropertySymbol newPropertySymbol = 
-				SymbolFactory.eINSTANCE.createIPropertySymbol();
-			newPropertySymbol.setTypeDescriptor(elementTypeDesc);
-			newPropertySymbol.setWritable(true);
-			newPropertySymbol.setReadable(true);
-			newPropertySymbol.setName(fullyQualifiedElementType);
-            return newPropertySymbol;
-		}
-
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getTypeSignature()
-     * @generated NOT
-	 */
-	public String getTypeSignature() 
-    {
-        if (getType() == null)
-        {
-            if (eIsSet(SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__TYPE_SIGNATURE_DELEGATE))
-            {
-                return getTypeSignatureDelegate();
-            }
-
-            return null;
-        }
-       
-        // make sure to array type nesting if using IType
-        return Signature.createArraySignature(
-                 TypeUtil.getSignature(getType()), getArrayCount());
-    }
-
-    private Collection getPropertiesInternal()
-	{
-        // if I'm an array then I have no bean properties
-        if (isArray())
-        {
-            return Collections.EMPTY_LIST;
-        }
-        
-        final JDTBeanIntrospector  introspector = 
-            new JDTBeanIntrospector(getType());
-        
-		final Map properties = introspector.getProperties();
-		final Collection calculatedProps = new ArrayList(properties.size());
-        
-		for (final Iterator it = properties.keySet().iterator(); it.hasNext();)
-		{
-		    final String propertyName = (String) it.next();
-            final JDTBeanProperty property = 
-                (JDTBeanProperty) properties.get(propertyName);
-			
-			final IBeanPropertySymbol workingCopy =
-			    SymbolFactory.eINSTANCE.createIBeanPropertySymbol();
-			workingCopy.setName(propertyName);
-			workingCopy.setOwner(this);
-                        
-            final IJavaTypeDescriptor2 workingCopyDesc = 
-                SymbolFactory.eINSTANCE.createIJavaTypeDescriptor2();
-            workingCopy.setTypeDescriptor(workingCopyDesc);
-			workingCopy.setReadable(property.isReadable());
-            workingCopy.setWritable(property.isWritable());
-                            
-            workingCopyDesc.setArrayCount(property.getArrayCount());
-            workingCopyDesc.getTypeParameterSignatures().addAll(property.getTypeParameterSignatures());
-            workingCopyDesc.setEnumType(property.isEnumType());
-           
-            final IType newType = property.getType();
-            final String signature = property.getTypeSignature();
-            
-            if (newType != null)
-            {
-                workingCopyDesc.setType(newType);
-            }
-            else
-            {
-                workingCopyDesc.setTypeSignatureDelegate(signature);
-            }
-            
-            calculatedProps.add(workingCopy);
-		}
-
-		return calculatedProps;
-	}
-
-    private Collection getMethodsInternal()
-	{
-        JDTBeanIntrospector introspector =
-            new JDTBeanIntrospector(getType());
-        
-		IMethod[] methods = introspector.getAllMethods();
-
-        List methodSymbols = new ArrayList();
-
-		for (int i = 0; i < methods.length; i++)
-		{
-			IMethod method = methods[i];
-			
-			try
-			{
-				// to be a bean method, it must not a constructor, must be public
-				// and must not be static
-				if (!method.isConstructor()
-						&& Flags.isPublic(method.getFlags())
-						&& !Flags.isStatic(method.getFlags()))
-				{
-					String methodName = method.getElementName();
-					IBeanMethodSymbol workingCopy = SymbolFactory.eINSTANCE.createIBeanMethodSymbol();
-					workingCopy.setName(methodName);
-					workingCopy.setOwner(this);
-                    workingCopy.setSignature(TypeUtil.
-                                                resolveMethodSignature
-                                                    (getType(), 
-                                                     method.getSignature()));
-					methodSymbols.add(workingCopy);
-				}
-			}
-			catch (JavaModelException jme)
-			{
-				// error reading meta-data.  Skip to next one
-                JSFCommonPlugin.log(jme);
-			}
-		}
-		
-		return methodSymbols;
-	}
-
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the default string rep 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (type: "); //$NON-NLS-1$
-        result.append(type);
-        result.append(", arrayCount: "); //$NON-NLS-1$
-        result.append(arrayCount);
-        result.append(')');
-        return result.toString();
-    }
-
-} //IJavaTypeDescriptor2Impl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IListTypeDescriptorImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IListTypeDescriptorImpl.java
deleted file mode 100644
index 4148df9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IListTypeDescriptorImpl.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: IListTypeDescriptorImpl.java,v 1.4 2007/05/07 17:30:20 cbateman Exp $
- */
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ECollections;
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IList Type Descriptor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IListTypeDescriptorImpl#getListSource <em>List Source</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IListTypeDescriptorImpl extends ITypeDescriptorImpl implements IListTypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle";  //$NON-NLS-1$
-
-    /**
-     * The default value of the '{@link #getListSource() <em>List Source</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getListSource()
-     * @generated
-     * @ordered
-     */
-    protected static final EList LIST_SOURCE_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getListSource() <em>List Source</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getListSource()
-     * @generated
-     * @ordered
-     */
-    protected EList listSource = LIST_SOURCE_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected IListTypeDescriptorImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return SymbolPackage.Literals.ILIST_TYPE_DESCRIPTOR;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getListSource() {
-        return listSource;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setListSource(EList newListSource) {
-        EList oldListSource = listSource;
-        listSource = newListSource;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.ILIST_TYPE_DESCRIPTOR__LIST_SOURCE, oldListSource, listSource));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case SymbolPackage.ILIST_TYPE_DESCRIPTOR__LIST_SOURCE:
-                return getListSource();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case SymbolPackage.ILIST_TYPE_DESCRIPTOR__LIST_SOURCE:
-                setListSource((EList)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.ILIST_TYPE_DESCRIPTOR__LIST_SOURCE:
-                setListSource(LIST_SOURCE_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.ILIST_TYPE_DESCRIPTOR__LIST_SOURCE:
-                return LIST_SOURCE_EDEFAULT == null ? listSource != null : !LIST_SOURCE_EDEFAULT.equals(listSource);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (listSource: ");  //$NON-NLS-1$
-        result.append(listSource);
-        result.append(')');
-        return result.toString();
-    }
-
-    /* 
-     * @generated NOT
-     */
-    public EList getInterfaceTypeSignatures() {
-        return ECollections.EMPTY_ELIST;
-    }
-
-    public EList getMethods() 
-    {
-        // TODO: should this return the methods on  a List?
-        return ECollections.EMPTY_ELIST;   
-    }
-
-    public EList getProperties() 
-    {
-        // TODO: a list has no properties as such.  What to do here?
-        return ECollections.EMPTY_ELIST;
-    }
-
-    /** 
-     * @generated NOT
-     */
-    public EList getSuperTypeSignatures() {
-        return ECollections.EMPTY_ELIST;
-    }
-
-    /**
-     * @generated NOT
-     */
-    public String getTypeSignature() 
-    {
-        return TypeConstants.TYPE_LIST;
-    }
-
-} //IListTypeDescriptorImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IMapTypeDescriptorImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IMapTypeDescriptorImpl.java
deleted file mode 100644
index 31e6171..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IMapTypeDescriptorImpl.java
+++ /dev/null
@@ -1,393 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.common.util.ECollections;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IMap Type Descriptor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IMapTypeDescriptorImpl#getMapSource <em>Map Source</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IMapTypeDescriptorImpl#isImmutable <em>Immutable</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IMapTypeDescriptorImpl extends ITypeDescriptorImpl implements IMapTypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * The default value of the '{@link #getMapSource() <em>Map Source</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getMapSource()
-     * @generated
-     * @ordered
-     */
-    protected static final Map MAP_SOURCE_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getMapSource() <em>Map Source</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getMapSource()
-     * @generated
-     * @ordered
-     */
-    protected Map mapSource = MAP_SOURCE_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #isImmutable() <em>Immutable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isImmutable()
-     * @generated
-     * @ordered
-     */
-    protected static final boolean IMMUTABLE_EDEFAULT = true;
-
-    /**
-     * The cached value of the '{@link #isImmutable() <em>Immutable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isImmutable()
-     * @generated
-     * @ordered
-     */
-    protected boolean immutable = IMMUTABLE_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected IMapTypeDescriptorImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the static eClass 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IMAP_TYPE_DESCRIPTOR;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the map source 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Map getMapSource() {
-        return mapSource;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newMapSource 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setMapSource(Map newMapSource) {
-        Map oldMapSource = mapSource;
-        mapSource = newMapSource;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IMAP_TYPE_DESCRIPTOR__MAP_SOURCE, oldMapSource, mapSource));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return true if this map is immutable as defined in the java.util.Map
-     * interface. 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean isImmutable() {
-        return immutable;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newImmutable 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setImmutable(boolean newImmutable) {
-        boolean oldImmutable = immutable;
-        immutable = newImmutable;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IMAP_TYPE_DESCRIPTOR__IMMUTABLE, oldImmutable, immutable));
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getTypeSignature()
-     * @generated NOT
-     */
-    public String getTypeSignature() 
-    {
-        // if the delegate has been set, use it
-        if (eIsSet(SymbolPackage.IMAP_TYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE))
-        {
-            return getTypeSignatureDelegate();
-        }
-        
-        // otherwise use Map
-        return TypeConstants.TYPE_MAP;
-    }
-
-    public EList getInterfaceTypeSignatures() {
-        return ECollections.EMPTY_ELIST;
-    }
-
-    public EList getSuperTypeSignatures() {
-        return ECollections.EMPTY_ELIST;
-    }
-
-    /**
-     * @see org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getProperties()
-     */
-    public EList getProperties() 
-    {
-        final BasicEList  list = new BasicEList();
-        final Map source = getMapSource();
-        final Set keys = source.keySet();
-        final Map segmentMap = processSegments(keys, source);
-        list.addAll(segmentMap.values());
-        return list;
-    }
-    
-    public EList getMethods() 
-    {
-        // TODO: should this return the methods on  a Map?
-        return ECollections.EMPTY_ELIST;
-    }
-    
-    /**
-     * @generated  NOT
-     */
-    public IObjectSymbol getArrayElement() {
-		return null;
-	}
-
-    /**
-     * @generated  NOT
-     */
-	public boolean isArray() {
-		// a map is never an array
-		return false;
-	}
-
-	private Map processSegments(final Set  keys, final Map source)
-    {
-        final Map segmentMap = new HashMap();
-        
-        for (final Iterator it = keys.iterator(); it.hasNext();)
-        {
-            final String key = (String) it.next();
-            final String segments[] = key.split("\\."); //$NON-NLS-1$
-            
-            IPropertySymbol  property = 
-                (IPropertySymbol) segmentMap.get(segments[0]);
-            
-            if (property == null)
-            {
-                final Object propValue = source.get(key);
-                property = SymbolFactory.eINSTANCE.createIPropertySymbol();
-                property.setName(segments[0]);
-                ITypeDescriptor typeDesc = null;
-                
-                // TODO: need wrapper object to rationalize
-                if (propValue != null)
-                {
-                    if (propValue instanceof IType)
-                    {
-                        typeDesc = SymbolFactory.eINSTANCE.createIJavaTypeDescriptor2();
-                        ((IJavaTypeDescriptor2)typeDesc).setType((IType)propValue);
-                    }
-                    else if (propValue instanceof IInstanceSymbol)
-                    {
-                        typeDesc = ((IInstanceSymbol)propValue).getTypeDescriptor();
-                    }
-                    else if (propValue instanceof IPropertySymbol)
-                    {
-                        typeDesc = ((IPropertySymbol)propValue).getTypeDescriptor();
-                    }
-                    else
-                    {
-                        String className = propValue.getClass().getName();
-                        String typeSignature = Signature.createTypeSignature(className, true);
-                        typeDesc = SymbolFactory.eINSTANCE.createIMapTypeDescriptor();
-                        ((IMapTypeDescriptor)typeDesc).setMapSource(new HashMap());
-                        ((IMapTypeDescriptor)typeDesc).setTypeSignatureDelegate(typeSignature);
-                        // inherit this descriptor's mutability
-                        ((IMapTypeDescriptor)typeDesc).setImmutable(isImmutable());
-                        property.setIntermediate(true);  // set the property as intermediate until we find out different
-                    }
-                    
-                    property.setTypeDescriptor(typeDesc);
-                    property.setReadable(true);
-                    // is only writable if map is not immutable
-                    property.setWritable(!isImmutable());
-                }
-                
-                segmentMap.put(segments[0], property);
-            }
-            
-            final ITypeDescriptor typeDesc = property.getTypeDescriptor();            
-            
-            if (typeDesc instanceof IMapTypeDescriptor)
-            {
-                if (segments.length == 1)
-                {
-                    // TODO: not always allowed ((IMapTypeDescriptor)typeDesc).getMapSource().put(null, source.get(key));
-                    // property is more than simply intermediate
-                    property.setIntermediate(false);
-                }
-                else
-                {
-                    ((IMapTypeDescriptor)typeDesc).getMapSource().
-                        put(key.substring(key.indexOf('.')+1), source.get(key));
-                }
-            }
-        }
-        
-        return segmentMap;
-    }
-
-    
-    
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param resolve 
-     * @param coreType 
-     * @return the object for the feature id 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case SymbolPackage.IMAP_TYPE_DESCRIPTOR__MAP_SOURCE:
-                return getMapSource();
-            case SymbolPackage.IMAP_TYPE_DESCRIPTOR__IMMUTABLE:
-                return isImmutable() ? Boolean.TRUE : Boolean.FALSE;
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param newValue 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case SymbolPackage.IMAP_TYPE_DESCRIPTOR__MAP_SOURCE:
-                setMapSource((Map)newValue);
-                return;
-            case SymbolPackage.IMAP_TYPE_DESCRIPTOR__IMMUTABLE:
-                setImmutable(((Boolean)newValue).booleanValue());
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IMAP_TYPE_DESCRIPTOR__MAP_SOURCE:
-                setMapSource(MAP_SOURCE_EDEFAULT);
-                return;
-            case SymbolPackage.IMAP_TYPE_DESCRIPTOR__IMMUTABLE:
-                setImmutable(IMMUTABLE_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @return true if is set
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IMAP_TYPE_DESCRIPTOR__MAP_SOURCE:
-                return MAP_SOURCE_EDEFAULT == null ? mapSource != null : !MAP_SOURCE_EDEFAULT.equals(mapSource);
-            case SymbolPackage.IMAP_TYPE_DESCRIPTOR__IMMUTABLE:
-                return immutable != IMMUTABLE_EDEFAULT;
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the string representation 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (mapSource: "); //$NON-NLS-1$
-        result.append(mapSource);
-        result.append(", immutable: ");  //$NON-NLS-1$
-        result.append(immutable);
-        result.append(')');
-        return result.toString();
-    }
-
-} //IMapTypeDescriptorImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IMethodSymbolImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IMethodSymbolImpl.java
deleted file mode 100644
index 2e9a75e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IMethodSymbolImpl.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IMethod Symbol</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IMethodSymbolImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IMethodSymbolImpl#getSignature <em>Signature</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IMethodSymbolImpl extends EObjectImpl implements IMethodSymbol {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-    protected static final String NAME_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-    protected String name = NAME_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getSignature() <em>Signature</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getSignature()
-     * @generated
-     * @ordered
-     */
-    protected static final String SIGNATURE_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getSignature() <em>Signature</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getSignature()
-     * @generated
-     * @ordered
-     */
-    protected String signature = SIGNATURE_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected IMethodSymbolImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the static eclass 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IMETHOD_SYMBOL;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the method name 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newName 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setName(String newName) {
-        String oldName = name;
-        name = newName;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IMETHOD_SYMBOL__NAME, oldName, name));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the method signature in JVM/JDT form 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getSignature() {
-        return signature;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newSignature 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setSignature(String newSignature) {
-        String oldSignature = signature;
-        signature = newSignature;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IMETHOD_SYMBOL__SIGNATURE, oldSignature, signature));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param resolve 
-     * @param coreType 
-     * @return the property as a feature object 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case SymbolPackage.IMETHOD_SYMBOL__NAME:
-                return getName();
-            case SymbolPackage.IMETHOD_SYMBOL__SIGNATURE:
-                return getSignature();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param newValue 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case SymbolPackage.IMETHOD_SYMBOL__NAME:
-                setName((String)newValue);
-                return;
-            case SymbolPackage.IMETHOD_SYMBOL__SIGNATURE:
-                setSignature((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IMETHOD_SYMBOL__NAME:
-                setName(NAME_EDEFAULT);
-                return;
-            case SymbolPackage.IMETHOD_SYMBOL__SIGNATURE:
-                setSignature(SIGNATURE_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @return true if the feature has been set 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IMETHOD_SYMBOL__NAME:
-                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-            case SymbolPackage.IMETHOD_SYMBOL__SIGNATURE:
-                return SIGNATURE_EDEFAULT == null ? signature != null : !SIGNATURE_EDEFAULT.equals(signature);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the raw string representation 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (name: "); //$NON-NLS-1$
-        result.append(name);
-        result.append(", signature: "); //$NON-NLS-1$
-        result.append(signature);
-        result.append(')');
-        return result.toString();
-    }
-
-} //IMethodSymbolImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IPropertySymbolImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IPropertySymbolImpl.java
deleted file mode 100644
index 64d314e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IPropertySymbolImpl.java
+++ /dev/null
@@ -1,469 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IProperty Symbol</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IPropertySymbolImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IPropertySymbolImpl#getTypeDescriptor <em>Type Descriptor</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IPropertySymbolImpl#isReadable <em>Readable</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IPropertySymbolImpl#isWritable <em>Writable</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.IPropertySymbolImpl#isIntermediate <em>Intermediate</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IPropertySymbolImpl extends EObjectImpl implements IPropertySymbol {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-    protected static final String NAME_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-    protected String name = NAME_EDEFAULT;
-
-    /**
-     * The cached value of the '{@link #getTypeDescriptor() <em>Type Descriptor</em>}' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTypeDescriptor()
-     * @generated
-     * @ordered
-     */
-    protected ITypeDescriptor typeDescriptor = null;
-
-    
-    /**
-     * Set to true if this property symbol is readable
-     */
-    protected boolean  isReadable = READABLE_EDEFAULT;
-    
-    /**
-     * Set to true if this property symbol is writable
-     */
-    protected boolean  isWritable = WRITABLE_EDEFAULT;
-    
-    /**
-     * The default value of the '{@link #isReadable() <em>Readable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isReadable()
-     * @generated
-     * @ordered
-     */
-    protected static final boolean READABLE_EDEFAULT = false;
-
-    /**
-     * The cached value of the '{@link #isReadable() <em>Readable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isReadable()
-     * @generated
-     * @ordered
-     */
-    protected boolean readable = READABLE_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #isWritable() <em>Writable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isWritable()
-     * @generated
-     * @ordered
-     */
-    protected static final boolean WRITABLE_EDEFAULT = false;
-
-    /**
-     * The cached value of the '{@link #isWritable() <em>Writable</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isWritable()
-     * @generated
-     * @ordered
-     */
-    protected boolean writable = WRITABLE_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #isIntermediate() <em>Intermediate</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isIntermediate()
-     * @generated
-     * @ordered
-     */
-    protected static final boolean INTERMEDIATE_EDEFAULT = false;
-
-    /**
-     * The cached value of the '{@link #isIntermediate() <em>Intermediate</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isIntermediate()
-     * @generated
-     * @ordered
-     */
-    protected boolean intermediate = INTERMEDIATE_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected IPropertySymbolImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the static eClass 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return SymbolPackage.Literals.IPROPERTY_SYMBOL;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return return the property name
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newName the new name of the property 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setName(String newName) {
-        String oldName = name;
-        name = newName;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IPROPERTY_SYMBOL__NAME, oldName, name));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the property's type descriptor ?? can be null ?? 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ITypeDescriptor getTypeDescriptor() {
-        if (typeDescriptor != null && typeDescriptor.eIsProxy()) {
-            InternalEObject oldTypeDescriptor = (InternalEObject)typeDescriptor;
-            typeDescriptor = (ITypeDescriptor)eResolveProxy(oldTypeDescriptor);
-            if (typeDescriptor != oldTypeDescriptor) {
-                if (eNotificationRequired())
-                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, SymbolPackage.IPROPERTY_SYMBOL__TYPE_DESCRIPTOR, oldTypeDescriptor, typeDescriptor));
-            }
-        }
-        return typeDescriptor;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the type descriptor 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ITypeDescriptor basicGetTypeDescriptor() {
-        return typeDescriptor;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newTypeDescriptor 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setTypeDescriptor(ITypeDescriptor newTypeDescriptor) {
-        ITypeDescriptor oldTypeDescriptor = typeDescriptor;
-        typeDescriptor = newTypeDescriptor;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IPROPERTY_SYMBOL__TYPE_DESCRIPTOR, oldTypeDescriptor, typeDescriptor));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return true if property is readable 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean isReadable() {
-        return readable;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newReadable 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setReadable(boolean newReadable) {
-        boolean oldReadable = readable;
-        readable = newReadable;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IPROPERTY_SYMBOL__READABLE, oldReadable, readable));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return true if property is writable 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean isWritable() {
-        return writable;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newWritable 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setWritable(boolean newWritable) {
-        boolean oldWritable = writable;
-        writable = newWritable;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IPROPERTY_SYMBOL__WRITABLE, oldWritable, writable));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return true if this property is intermediate and has no value of it's own
-     * besides as a path to it's own properties.  This is used to support the 
-     * situation in JSF where a map-based property can have dots in it (i.e. 
-     * a loadBundle key my.property) and so creates a (discouraged) ambiguous 
-     * situation where a property like #{x.y.z) really corresponds to a key
-     * "y.z" in a property file pointed to by "x" instead of there being an
-     * actual y property on x that has value in and of itself (in this case
-     * "#{x.y}" is invalid even though "#{x.y.z}" is valid). 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean isIntermediate() {
-        return intermediate;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newIntermediate 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setIntermediate(boolean newIntermediate) {
-        boolean oldIntermediate = intermediate;
-        intermediate = newIntermediate;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.IPROPERTY_SYMBOL__INTERMEDIATE, oldIntermediate, intermediate));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public boolean supportsCoercion(String typeSignature) {
-        // TODO: for now, not supported on generic properties
-        return false;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public ITypeDescriptor coerce(String typeSignature) 
-    {
-        // TODO: for now, no generic property type coercion
-        return getTypeDescriptor();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ISymbol call(String methodName, EList methodArguments, String symbolName) {
-        // TODO: implement this method
-        // Ensure that you remove @generated or mark it @generated NOT
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param resolve 
-     * @param coreType 
-     * @return the eObject for the featureID 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case SymbolPackage.IPROPERTY_SYMBOL__NAME:
-                return getName();
-            case SymbolPackage.IPROPERTY_SYMBOL__TYPE_DESCRIPTOR:
-                if (resolve) return getTypeDescriptor();
-                return basicGetTypeDescriptor();
-            case SymbolPackage.IPROPERTY_SYMBOL__READABLE:
-                return isReadable() ? Boolean.TRUE : Boolean.FALSE;
-            case SymbolPackage.IPROPERTY_SYMBOL__WRITABLE:
-                return isWritable() ? Boolean.TRUE : Boolean.FALSE;
-            case SymbolPackage.IPROPERTY_SYMBOL__INTERMEDIATE:
-                return isIntermediate() ? Boolean.TRUE : Boolean.FALSE;
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID -- set the feature 
-     * @param newValue 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case SymbolPackage.IPROPERTY_SYMBOL__NAME:
-                setName((String)newValue);
-                return;
-            case SymbolPackage.IPROPERTY_SYMBOL__TYPE_DESCRIPTOR:
-                setTypeDescriptor((ITypeDescriptor)newValue);
-                return;
-            case SymbolPackage.IPROPERTY_SYMBOL__READABLE:
-                setReadable(((Boolean)newValue).booleanValue());
-                return;
-            case SymbolPackage.IPROPERTY_SYMBOL__WRITABLE:
-                setWritable(((Boolean)newValue).booleanValue());
-                return;
-            case SymbolPackage.IPROPERTY_SYMBOL__INTERMEDIATE:
-                setIntermediate(((Boolean)newValue).booleanValue());
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID -- unset the feature 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IPROPERTY_SYMBOL__NAME:
-                setName(NAME_EDEFAULT);
-                return;
-            case SymbolPackage.IPROPERTY_SYMBOL__TYPE_DESCRIPTOR:
-                setTypeDescriptor((ITypeDescriptor)null);
-                return;
-            case SymbolPackage.IPROPERTY_SYMBOL__READABLE:
-                setReadable(READABLE_EDEFAULT);
-                return;
-            case SymbolPackage.IPROPERTY_SYMBOL__WRITABLE:
-                setWritable(WRITABLE_EDEFAULT);
-                return;
-            case SymbolPackage.IPROPERTY_SYMBOL__INTERMEDIATE:
-                setIntermediate(INTERMEDIATE_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @return true if is set 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.IPROPERTY_SYMBOL__NAME:
-                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-            case SymbolPackage.IPROPERTY_SYMBOL__TYPE_DESCRIPTOR:
-                return typeDescriptor != null;
-            case SymbolPackage.IPROPERTY_SYMBOL__READABLE:
-                return readable != READABLE_EDEFAULT;
-            case SymbolPackage.IPROPERTY_SYMBOL__WRITABLE:
-                return writable != WRITABLE_EDEFAULT;
-            case SymbolPackage.IPROPERTY_SYMBOL__INTERMEDIATE:
-                return intermediate != INTERMEDIATE_EDEFAULT;
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the string representation 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (name: "); //$NON-NLS-1$
-        result.append(name);
-        result.append(", readable: "); //$NON-NLS-1$
-        result.append(readable);
-        result.append(", writable: "); //$NON-NLS-1$
-        result.append(writable);
-        result.append(", intermediate: "); //$NON-NLS-1$
-        result.append(intermediate);
-        result.append(')');
-        return result.toString();
-    }
-
-} //IPropertySymbolImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/ITypeDescriptorImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/ITypeDescriptorImpl.java
deleted file mode 100644
index b23a303..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/ITypeDescriptorImpl.java
+++ /dev/null
@@ -1,521 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EDataTypeEList;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.util.TypeUtil;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>IType Descriptor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getProperties <em>Properties</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getTypeSignature <em>Type Signature</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getSuperTypeSignatures <em>Super Type Signatures</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getInterfaceTypeSignatures <em>Interface Type Signatures</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getTypeSignatureDelegate <em>Type Signature Delegate</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getMethods <em>Methods</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class ITypeDescriptorImpl extends EObjectImpl implements ITypeDescriptor {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * The default value of the '{@link #getTypeSignature() <em>Type Signature</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTypeSignature()
-     * @generated
-     * @ordered
-     */
-    protected static final String TYPE_SIGNATURE_EDEFAULT = ""; //$NON-NLS-1$
-
-    /**
-     * The default value of the '{@link #getTypeSignatureDelegate() <em>Type Signature Delegate</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTypeSignatureDelegate()
-     * @generated
-     * @ordered
-     */
-    protected static final String TYPE_SIGNATURE_DELEGATE_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTypeSignatureDelegate() <em>Type Signature Delegate</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTypeSignatureDelegate()
-     * @generated
-     * @ordered
-     */
-    protected String typeSignatureDelegate = TYPE_SIGNATURE_DELEGATE_EDEFAULT;
-
-    /**
-     * The cached value of the '{@link #getTypeParameterSignatures() <em>Type Parameter Signatures</em>}' attribute list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTypeParameterSignatures()
-     * @generated
-     * @ordered
-     */
-    protected EList typeParameterSignatures;
-
-    /**
-     * The default value of the '{@link #getJdtContext() <em>Jdt Context</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getJdtContext()
-     * @generated
-     * @ordered
-     */
-    protected static final IJavaElement JDT_CONTEXT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getJdtContext() <em>Jdt Context</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getJdtContext()
-     * @generated
-     * @ordered
-     */
-    protected IJavaElement jdtContext = JDT_CONTEXT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #isEnumType() <em>Enum Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isEnumType()
-     * @generated
-     * @ordered
-     */
-    protected static final boolean ENUM_TYPE_EDEFAULT = false;
-
-    /**
-     * The cached value of the '{@link #isEnumType() <em>Enum Type</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #isEnumType()
-     * @generated
-     * @ordered
-     */
-    protected boolean enumType = ENUM_TYPE_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ITypeDescriptorImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the static class 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return SymbolPackage.Literals.ITYPE_DESCRIPTOR;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return get properties for this type 
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public abstract EList getProperties();
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the type signature in JVM/JDT signature form 
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public abstract String getTypeSignature();
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the list of super types 
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public abstract EList getSuperTypeSignatures();
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the list of implemented interfaces
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public abstract EList getInterfaceTypeSignatures();
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the type signature delegate.  The descriptor may choose to use
-     * this delegate it if it is set and it cannot derive this information
-     * from other properties
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getTypeSignatureDelegate() {
-        return typeSignatureDelegate;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param newTypeSignatureDelegate 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setTypeSignatureDelegate(String newTypeSignatureDelegate) {
-        String oldTypeSignatureDelegate = typeSignatureDelegate;
-        typeSignatureDelegate = newTypeSignatureDelegate;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE, oldTypeSignatureDelegate, typeSignatureDelegate));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the methods for this type or empty list if none exist 
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public abstract EList getMethods();
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getTypeParameterSignatures() {
-        if (typeParameterSignatures == null) {
-            typeParameterSignatures = new EDataTypeEList(String.class, this, SymbolPackage.ITYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES);
-        }
-        return typeParameterSignatures;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IJavaElement getJdtContext() {
-        return jdtContext;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setJdtContext(IJavaElement newJdtContext) {
-        IJavaElement oldJdtContext = jdtContext;
-        jdtContext = newJdtContext;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.ITYPE_DESCRIPTOR__JDT_CONTEXT, oldJdtContext, jdtContext));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean isEnumType() {
-        return enumType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setEnumType(boolean newEnumType) {
-        boolean oldEnumType = enumType;
-        enumType = newEnumType;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.ITYPE_DESCRIPTOR__ENUM_TYPE, oldEnumType, enumType));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * Note about generics:
-     * 
-     * This call mimics the runtime instanceOf to the degree possible.
-     * Therefore, any type parameters (<...>) in typeSignature will be
-     * deleted using Signature.getTypeErasure() since this data won't be
-     * available at runtime.
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public boolean instanceOf(final String typeSignature) 
-    {
-        final String typeErasedSignature = Signature.getTypeErasure(typeSignature);
-        
-        if (Signature.getTypeErasure(getTypeSignature()) != null
-                && Signature.getTypeErasure(getTypeSignature()).equals(typeErasedSignature))
-        {
-            return true;
-        }
-        
-        for (final Iterator it = getSuperTypeSignatures().iterator(); it.hasNext();)
-        {
-            final String superType = (String) it.next();
-            
-            if (Signature.getTypeErasure(superType).equals(typeErasedSignature))
-            {
-                return true;
-            }
-        }
-        
-        for (final Iterator it = getInterfaceTypeSignatures().iterator(); it.hasNext();)
-        {
-            final String superType = (String) it.next();
-            
-            if (Signature.getTypeErasure(superType).equals(typeErasedSignature))
-            {
-                return true;
-            }
-        }
-        
-        return false;
-    }
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean isArray()
-	{
-		return Signature.getArrayCount(getTypeSignature()) > 0;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public IObjectSymbol getArrayElement() 
-	{
-		if (isArray())
-		{
-			// sub-class of ITypeDescriptor must implement this if they which to provide
-			// array element support
-			throw new UnsupportedOperationException("Base type descriptor does not support this function"); //$NON-NLS-1$
-		}
-		
-		// shouldn't be called if not an array
-		return null;
-	}
-
-    /**
-    /**
-     * <!-- begin-user-doc -->
-     * 
-     * Tries to load an IType for a fully resolved (i.e. starts with L not Q)
-     * type signature using the current jdtContext.
-     * 
-     * @return the resolved IType or null if none could be resolved.
-     * 
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-      public IType resolveType(String resolvedTypeSignature) 
-      {
-          // we need to obtain an IJavaProject within which to resolve
-          // the type.
-          IJavaProject project = null;
-          
-          // see if a jdtContext hint has been set
-          if (getJdtContext() != null)
-          {
-              project = getJdtContext().getJavaProject();
-          }
-          
-          if (project != null)
-          {
-              return TypeUtil.resolveType(project, resolvedTypeSignature);
-          }
-          
-          return null;
-      }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public ISymbol calculateSyntheticCall(String methodName, EList methodArgs, String symbolName) {
-        // sub-classes need only implement if they have something meaningful
-        // the want to do here
-        // by default return null to indicate this type descriptor doesn't
-        // wish to handle calls
-        return null;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param resolve 
-     * @param coreType 
-     * @return get the feature 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case SymbolPackage.ITYPE_DESCRIPTOR__PROPERTIES:
-                return getProperties();
-            case SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE:
-                return getTypeSignature();
-            case SymbolPackage.ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES:
-                return getSuperTypeSignatures();
-            case SymbolPackage.ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES:
-                return getInterfaceTypeSignatures();
-            case SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE:
-                return getTypeSignatureDelegate();
-            case SymbolPackage.ITYPE_DESCRIPTOR__METHODS:
-                return getMethods();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @param newValue 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case SymbolPackage.ITYPE_DESCRIPTOR__PROPERTIES:
-                getProperties().clear();
-                getProperties().addAll((Collection)newValue);
-                return;
-            case SymbolPackage.ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES:
-                getSuperTypeSignatures().clear();
-                getSuperTypeSignatures().addAll((Collection)newValue);
-                return;
-            case SymbolPackage.ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES:
-                getInterfaceTypeSignatures().clear();
-                getInterfaceTypeSignatures().addAll((Collection)newValue);
-                return;
-            case SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE:
-                setTypeSignatureDelegate((String)newValue);
-                return;
-            case SymbolPackage.ITYPE_DESCRIPTOR__METHODS:
-                getMethods().clear();
-                getMethods().addAll((Collection)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.ITYPE_DESCRIPTOR__PROPERTIES:
-                getProperties().clear();
-                return;
-            case SymbolPackage.ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES:
-                getSuperTypeSignatures().clear();
-                return;
-            case SymbolPackage.ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES:
-                getInterfaceTypeSignatures().clear();
-                return;
-            case SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE:
-                setTypeSignatureDelegate(TYPE_SIGNATURE_DELEGATE_EDEFAULT);
-                return;
-            case SymbolPackage.ITYPE_DESCRIPTOR__METHODS:
-                getMethods().clear();
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param featureID 
-     * @return true if feature has been set 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case SymbolPackage.ITYPE_DESCRIPTOR__PROPERTIES:
-                return !getProperties().isEmpty();
-            case SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE:
-                return TYPE_SIGNATURE_EDEFAULT == null ? getTypeSignature() != null : !TYPE_SIGNATURE_EDEFAULT.equals(getTypeSignature());
-            case SymbolPackage.ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES:
-                return !getSuperTypeSignatures().isEmpty();
-            case SymbolPackage.ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES:
-                return !getInterfaceTypeSignatures().isEmpty();
-            case SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE:
-                return TYPE_SIGNATURE_DELEGATE_EDEFAULT == null ? typeSignatureDelegate != null : !TYPE_SIGNATURE_DELEGATE_EDEFAULT.equals(typeSignatureDelegate);
-            case SymbolPackage.ITYPE_DESCRIPTOR__METHODS:
-                return !getMethods().isEmpty();
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the debug string format of the type signature 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (typeSignatureDelegate: "); //$NON-NLS-1$
-        result.append(typeSignatureDelegate);
-        result.append(')');
-        return result.toString();
-    }
-} //ITypeDescriptorImpl
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/SymbolFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/SymbolFactoryImpl.java
deleted file mode 100644
index 83453e7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/SymbolFactoryImpl.java
+++ /dev/null
@@ -1,420 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.symbol.ERuntimeSource;
-import org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IComponentSymbol;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class SymbolFactoryImpl extends EFactoryImpl implements SymbolFactory {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * Creates the default factory implementation.
-     * <!-- begin-user-doc -->
-	 * @return the SymbolFactory 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static SymbolFactory init() {
-        try {
-            SymbolFactory theSymbolFactory = (SymbolFactory)EPackage.Registry.INSTANCE.getEFactory("http:///org/eclipse/jst/jsf/context/symbol.ecore");  //$NON-NLS-1$
-            if (theSymbolFactory != null) {
-                return theSymbolFactory;
-            }
-        }
-        catch (Exception exception) {
-            EcorePlugin.INSTANCE.log(exception);
-        }
-        return new SymbolFactoryImpl();
-    }
-
-    /**
-     * Creates an instance of the factory.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public SymbolFactoryImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eClass 
-     * @return the model instace for the model class 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EObject create(EClass eClass) {
-        switch (eClass.getClassifierID()) {
-            case SymbolPackage.IBEAN_INSTANCE_SYMBOL: return createIBeanInstanceSymbol();
-            case SymbolPackage.IBEAN_PROPERTY_SYMBOL: return createIBeanPropertySymbol();
-            case SymbolPackage.IINSTANCE_SYMBOL: return createIInstanceSymbol();
-            case SymbolPackage.IJAVA_SYMBOL: return createIJavaSymbol();
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2: return createIJavaTypeDescriptor2();
-            case SymbolPackage.IBEAN_METHOD_SYMBOL: return createIBeanMethodSymbol();
-            case SymbolPackage.ICOMPONENT_SYMBOL: return createIComponentSymbol();
-            case SymbolPackage.IPROPERTY_SYMBOL: return createIPropertySymbol();
-            case SymbolPackage.IMAP_TYPE_DESCRIPTOR: return createIMapTypeDescriptor();
-            case SymbolPackage.IMETHOD_SYMBOL: return createIMethodSymbol();
-            case SymbolPackage.IBOUNDED_MAP_TYPE_DESCRIPTOR: return createIBoundedMapTypeDescriptor();
-            case SymbolPackage.IBOUNDED_JAVA_TYPE_DESCRIPTOR: return createIBoundedJavaTypeDescriptor();
-            case SymbolPackage.ILIST_TYPE_DESCRIPTOR: return createIListTypeDescriptor();
-            case SymbolPackage.IBOUNDED_LIST_TYPE_DESCRIPTOR: return createIBoundedListTypeDescriptor();
-            default:
-                throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param initialValue 
-     * @return an object constructed from the initialValue string 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object createFromString(EDataType eDataType, String initialValue) {
-        switch (eDataType.getClassifierID()) {
-            case SymbolPackage.ERUNTIME_SOURCE:
-                return createERuntimeSourceFromString(eDataType, initialValue);
-            case SymbolPackage.ITYPE:
-                return createITypeFromString(eDataType, initialValue);
-            case SymbolPackage.IJAVA_ELEMENT:
-                return createIJavaElementFromString(eDataType, initialValue);
-            default:
-                throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param instanceValue 
-     * @return the string equivelent of eDataType for the instance 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String convertToString(EDataType eDataType, Object instanceValue) {
-        switch (eDataType.getClassifierID()) {
-            case SymbolPackage.ERUNTIME_SOURCE:
-                return convertERuntimeSourceToString(eDataType, instanceValue);
-            case SymbolPackage.ITYPE:
-                return convertITypeToString(eDataType, instanceValue);
-            case SymbolPackage.IJAVA_ELEMENT:
-                return convertIJavaElementToString(eDataType, instanceValue);
-            default:
-                throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return a new bean instance symbol 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IBeanInstanceSymbol createIBeanInstanceSymbol() {
-        IBeanInstanceSymbolImpl iBeanInstanceSymbol = new IBeanInstanceSymbolImpl();
-        return iBeanInstanceSymbol;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return a new bean property symbol 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IBeanPropertySymbol createIBeanPropertySymbol() {
-        IBeanPropertySymbolImpl iBeanPropertySymbol = new IBeanPropertySymbolImpl();
-        return iBeanPropertySymbol;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IInstanceSymbol createIInstanceSymbol() {
-        IInstanceSymbolImpl iInstanceSymbol = new IInstanceSymbolImpl();
-        return iInstanceSymbol;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return a new java symbol 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IJavaSymbol createIJavaSymbol() {
-        IJavaSymbolImpl iJavaSymbol = new IJavaSymbolImpl();
-        return iJavaSymbol;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return a new java type descriptor 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IJavaTypeDescriptor2 createIJavaTypeDescriptor2() {
-        IJavaTypeDescriptor2Impl iJavaTypeDescriptor2 = new IJavaTypeDescriptor2Impl();
-        return iJavaTypeDescriptor2;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return a new bean method symbol 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IBeanMethodSymbol createIBeanMethodSymbol() {
-        IBeanMethodSymbolImpl iBeanMethodSymbol = new IBeanMethodSymbolImpl();
-        return iBeanMethodSymbol;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return a new component derived symbol 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IComponentSymbol createIComponentSymbol() {
-        IComponentSymbolImpl iComponentSymbol = new IComponentSymbolImpl();
-        return iComponentSymbol;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return a new property symbol 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IPropertySymbol createIPropertySymbol() {
-        IPropertySymbolImpl iPropertySymbol = new IPropertySymbolImpl();
-        return iPropertySymbol;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return create map type descriptor 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IMapTypeDescriptor createIMapTypeDescriptor() {
-        IMapTypeDescriptorImpl iMapTypeDescriptor = new IMapTypeDescriptorImpl();
-        return iMapTypeDescriptor;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the method symbol 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IMethodSymbol createIMethodSymbol() {
-        IMethodSymbolImpl iMethodSymbol = new IMethodSymbolImpl();
-        return iMethodSymbol;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IBoundedMapTypeDescriptor createIBoundedMapTypeDescriptor() {
-        IBoundedMapTypeDescriptorImpl iBoundedMapTypeDescriptor = new IBoundedMapTypeDescriptorImpl();
-        return iBoundedMapTypeDescriptor;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IBoundedJavaTypeDescriptor createIBoundedJavaTypeDescriptor() {
-        IBoundedJavaTypeDescriptorImpl iBoundedJavaTypeDescriptor = new IBoundedJavaTypeDescriptorImpl();
-        return iBoundedJavaTypeDescriptor;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IListTypeDescriptor createIListTypeDescriptor() {
-        IListTypeDescriptorImpl iListTypeDescriptor = new IListTypeDescriptorImpl();
-        return iListTypeDescriptor;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IBoundedListTypeDescriptor createIBoundedListTypeDescriptor() {
-        IBoundedListTypeDescriptorImpl iBoundedListTypeDescriptor = new IBoundedListTypeDescriptorImpl();
-        return iBoundedListTypeDescriptor;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param initialValue 
-     * @return 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ERuntimeSource createERuntimeSourceFromString(EDataType eDataType, String initialValue) {
-        ERuntimeSource result = ERuntimeSource.get(initialValue);
-        if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-        return result;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param instanceValue 
-     * @return the converted runtime source 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String convertERuntimeSourceToString(EDataType eDataType, Object instanceValue) {
-        return instanceValue == null ? null : instanceValue.toString();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * @param eDataType
-	 * @param initialValue
-	 * @return 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IType createITypeFromString(EDataType eDataType, String initialValue) {
-        return (IType)super.createFromString(eDataType, initialValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * @param eDataType 
-	 * @param instanceValue 
-	 * @return the converted string
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String convertITypeToString(EDataType eDataType, Object instanceValue) {
-        return super.convertToString(eDataType, instanceValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * @param eDataType 
-	 * @param initialValue 
-	 * @return return the java element
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IJavaElement createIJavaElementFromString(EDataType eDataType, String initialValue) {
-        return (IJavaElement)super.createFromString(eDataType, initialValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * @param eDataType 
-	 * @param instanceValue 
-	 * @return the converted string 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String convertIJavaElementToString(EDataType eDataType, Object instanceValue) {
-        return super.convertToString(eDataType, instanceValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ValueType createValueTypeFromString(EDataType eDataType, String initialValue) {
-        return (ValueType)super.createFromString(eDataType, initialValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String convertValueTypeToString(EDataType eDataType, Object instanceValue) {
-        return super.convertToString(eDataType, instanceValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the symbol package 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public SymbolPackage getSymbolPackage() {
-        return (SymbolPackage)getEPackage();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * @return get the symbol package
-	 * <!-- end-user-doc -->
-     * @deprecated
-     * @generated
-     */
-	public static SymbolPackage getPackage() {
-        return SymbolPackage.eINSTANCE;
-    }
-
-} //SymbolFactoryImpl
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/SymbolPackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/SymbolPackageImpl.java
deleted file mode 100644
index f72c71c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/SymbolPackageImpl.java
+++ /dev/null
@@ -1,1031 +0,0 @@
-/**
- * Copyright 2006 Oracle
- *
- * $Id: SymbolPackageImpl.java,v 1.6 2007/05/15 22:00:27 cbateman Exp $
- */
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EOperation;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IType;
-
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-
-import org.eclipse.jst.jsf.context.symbol.ERuntimeSource;
-import org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IComponentSymbol;
-import org.eclipse.jst.jsf.context.symbol.IDescribedInDetail;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class SymbolPackageImpl extends EPackageImpl implements SymbolPackage {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle";
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iBeanInstanceSymbolEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iBeanPropertySymbolEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iInstanceSymbolEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iJavaSymbolEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iSymbolEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iTypeDescriptorEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iDescribedInDetailEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iJavaTypeDescriptor2EClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iBeanMethodSymbolEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iComponentSymbolEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iPropertySymbolEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iMapTypeDescriptorEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iMethodSymbolEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iObjectSymbolEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iBoundedTypeDescriptorEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iBoundedMapTypeDescriptorEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iBoundedJavaTypeDescriptorEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iListTypeDescriptorEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass iBoundedListTypeDescriptorEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EEnum eRuntimeSourceEEnum = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EDataType iTypeEDataType = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EDataType iJavaElementEDataType = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EDataType valueTypeEDataType = null;
-
-    /**
-     * Creates an instance of the model <b>Package</b>, registered with
-     * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-     * package URI value.
-     * <p>Note: the correct way to create the package is via the static
-     * factory method {@link #init init()}, which also performs
-     * initialization of the package, or returns the registered package,
-     * if one already exists.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.emf.ecore.EPackage.Registry
-     * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage#eNS_URI
-     * @see #init()
-     * @generated
-     */
-    private SymbolPackageImpl() {
-        super(eNS_URI, SymbolFactory.eINSTANCE);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private static boolean isInited = false;
-
-    /**
-     * Creates, registers, and initializes the <b>Package</b> for this
-     * model, and for any others upon which it depends.  Simple
-     * dependencies are satisfied by calling this method on all
-     * dependent packages before doing anything else.  This method drives
-     * initialization for interdependent packages directly, in parallel
-     * with this package, itself.
-     * <p>Of this package and its interdependencies, all packages which
-     * have not yet been registered by their URI values are first created
-     * and registered.  The packages are then initialized in two steps:
-     * meta-model objects for all of the packages are created before any
-     * are initialized, since one package's meta-model objects may refer to
-     * those of another.
-     * <p>Invocation of this method will not affect any packages that have
-     * already been initialized.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #eNS_URI
-     * @see #createPackageContents()
-     * @see #initializePackageContents()
-     * @generated
-     */
-    public static SymbolPackage init() {
-        if (isInited) return (SymbolPackage)EPackage.Registry.INSTANCE.getEPackage(SymbolPackage.eNS_URI);
-
-        // Obtain or create and register package
-        SymbolPackageImpl theSymbolPackage = (SymbolPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof SymbolPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new SymbolPackageImpl());
-
-        isInited = true;
-
-        // Create package meta-data objects
-        theSymbolPackage.createPackageContents();
-
-        // Initialize created meta-data
-        theSymbolPackage.initializePackageContents();
-
-        // Mark meta-data to indicate it can't be changed
-        theSymbolPackage.freeze();
-
-        return theSymbolPackage;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIBeanInstanceSymbol() {
-        return iBeanInstanceSymbolEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getIBeanInstanceSymbol_Properties() {
-        return (EReference)iBeanInstanceSymbolEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getIBeanInstanceSymbol_Methods() {
-        return (EReference)iBeanInstanceSymbolEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIBeanPropertySymbol() {
-        return iBeanPropertySymbolEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getIBeanPropertySymbol_Owner() {
-        return (EReference)iBeanPropertySymbolEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIInstanceSymbol() {
-        return iInstanceSymbolEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIInstanceSymbol_TypeResolved() {
-        return (EAttribute)iInstanceSymbolEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIInstanceSymbol_RuntimeSource() {
-        return (EAttribute)iInstanceSymbolEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIJavaSymbol() {
-        return iJavaSymbolEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIJavaSymbol_JavaElement() {
-        return (EAttribute)iJavaSymbolEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getISymbol() {
-        return iSymbolEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getISymbol_Name() {
-        return (EAttribute)iSymbolEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getITypeDescriptor() {
-        return iTypeDescriptorEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getITypeDescriptor_Properties() {
-        return (EReference)iTypeDescriptorEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getITypeDescriptor_TypeSignature() {
-        return (EAttribute)iTypeDescriptorEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getITypeDescriptor_SuperTypeSignatures() {
-        return (EAttribute)iTypeDescriptorEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getITypeDescriptor_InterfaceTypeSignatures() {
-        return (EAttribute)iTypeDescriptorEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getITypeDescriptor_TypeSignatureDelegate() {
-        return (EAttribute)iTypeDescriptorEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getITypeDescriptor_Methods() {
-        return (EReference)iTypeDescriptorEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getITypeDescriptor_TypeParameterSignatures() {
-        return (EAttribute)iTypeDescriptorEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getITypeDescriptor_JdtContext() {
-        return (EAttribute)iTypeDescriptorEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getITypeDescriptor_EnumType() {
-        return (EAttribute)iTypeDescriptorEClass.getEStructuralFeatures().get(8);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIDescribedInDetail() {
-        return iDescribedInDetailEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIJavaTypeDescriptor2() {
-        return iJavaTypeDescriptor2EClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIJavaTypeDescriptor2_Type() {
-        return (EAttribute)iJavaTypeDescriptor2EClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getIJavaTypeDescriptor2_BeanProperties() {
-        return (EReference)iJavaTypeDescriptor2EClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getIJavaTypeDescriptor2_BeanMethods() {
-        return (EReference)iJavaTypeDescriptor2EClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIJavaTypeDescriptor2_ArrayCount() {
-        return (EAttribute)iJavaTypeDescriptor2EClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIBeanMethodSymbol() {
-        return iBeanMethodSymbolEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getIBeanMethodSymbol_Owner() {
-        return (EReference)iBeanMethodSymbolEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIComponentSymbol() {
-        return iComponentSymbolEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIPropertySymbol() {
-        return iPropertySymbolEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIPropertySymbol_Intermediate() {
-        return (EAttribute)iPropertySymbolEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIMapTypeDescriptor() {
-        return iMapTypeDescriptorEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIMapTypeDescriptor_MapSource() {
-        return (EAttribute)iMapTypeDescriptorEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIMapTypeDescriptor_Immutable() {
-        return (EAttribute)iMapTypeDescriptorEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIMethodSymbol() {
-        return iMethodSymbolEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIMethodSymbol_Signature() {
-        return (EAttribute)iMethodSymbolEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIObjectSymbol() {
-        return iObjectSymbolEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getIObjectSymbol_TypeDescriptor() {
-        return (EReference)iObjectSymbolEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIObjectSymbol_Readable() {
-        return (EAttribute)iObjectSymbolEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIObjectSymbol_Writable() {
-        return (EAttribute)iObjectSymbolEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIBoundedTypeDescriptor() {
-        return iBoundedTypeDescriptorEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIBoundedMapTypeDescriptor() {
-        return iBoundedMapTypeDescriptorEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIBoundedJavaTypeDescriptor() {
-        return iBoundedJavaTypeDescriptorEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIListTypeDescriptor() {
-        return iListTypeDescriptorEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getIListTypeDescriptor_ListSource() {
-        return (EAttribute)iListTypeDescriptorEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getIBoundedListTypeDescriptor() {
-        return iBoundedListTypeDescriptorEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EEnum getERuntimeSource() {
-        return eRuntimeSourceEEnum;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EDataType getIType() {
-        return iTypeEDataType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EDataType getIJavaElement() {
-        return iJavaElementEDataType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EDataType getValueType() {
-        return valueTypeEDataType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public SymbolFactory getSymbolFactory() {
-        return (SymbolFactory)getEFactoryInstance();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private boolean isCreated = false;
-
-    /**
-     * Creates the meta-model objects for the package.  This method is
-     * guarded to have no affect on any invocation but its first.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void createPackageContents() {
-        if (isCreated) return;
-        isCreated = true;
-
-        // Create classes and their features
-        iBeanInstanceSymbolEClass = createEClass(IBEAN_INSTANCE_SYMBOL);
-        createEReference(iBeanInstanceSymbolEClass, IBEAN_INSTANCE_SYMBOL__PROPERTIES);
-        createEReference(iBeanInstanceSymbolEClass, IBEAN_INSTANCE_SYMBOL__METHODS);
-
-        iBeanPropertySymbolEClass = createEClass(IBEAN_PROPERTY_SYMBOL);
-        createEReference(iBeanPropertySymbolEClass, IBEAN_PROPERTY_SYMBOL__OWNER);
-
-        iInstanceSymbolEClass = createEClass(IINSTANCE_SYMBOL);
-        createEAttribute(iInstanceSymbolEClass, IINSTANCE_SYMBOL__TYPE_RESOLVED);
-        createEAttribute(iInstanceSymbolEClass, IINSTANCE_SYMBOL__RUNTIME_SOURCE);
-
-        iJavaSymbolEClass = createEClass(IJAVA_SYMBOL);
-        createEAttribute(iJavaSymbolEClass, IJAVA_SYMBOL__JAVA_ELEMENT);
-
-        iSymbolEClass = createEClass(ISYMBOL);
-        createEAttribute(iSymbolEClass, ISYMBOL__NAME);
-
-        iTypeDescriptorEClass = createEClass(ITYPE_DESCRIPTOR);
-        createEReference(iTypeDescriptorEClass, ITYPE_DESCRIPTOR__PROPERTIES);
-        createEAttribute(iTypeDescriptorEClass, ITYPE_DESCRIPTOR__TYPE_SIGNATURE);
-        createEAttribute(iTypeDescriptorEClass, ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES);
-        createEAttribute(iTypeDescriptorEClass, ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES);
-        createEAttribute(iTypeDescriptorEClass, ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE);
-        createEReference(iTypeDescriptorEClass, ITYPE_DESCRIPTOR__METHODS);
-        createEAttribute(iTypeDescriptorEClass, ITYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES);
-        createEAttribute(iTypeDescriptorEClass, ITYPE_DESCRIPTOR__JDT_CONTEXT);
-        createEAttribute(iTypeDescriptorEClass, ITYPE_DESCRIPTOR__ENUM_TYPE);
-
-        iDescribedInDetailEClass = createEClass(IDESCRIBED_IN_DETAIL);
-
-        iJavaTypeDescriptor2EClass = createEClass(IJAVA_TYPE_DESCRIPTOR2);
-        createEAttribute(iJavaTypeDescriptor2EClass, IJAVA_TYPE_DESCRIPTOR2__TYPE);
-        createEReference(iJavaTypeDescriptor2EClass, IJAVA_TYPE_DESCRIPTOR2__BEAN_PROPERTIES);
-        createEReference(iJavaTypeDescriptor2EClass, IJAVA_TYPE_DESCRIPTOR2__BEAN_METHODS);
-        createEAttribute(iJavaTypeDescriptor2EClass, IJAVA_TYPE_DESCRIPTOR2__ARRAY_COUNT);
-
-        iBeanMethodSymbolEClass = createEClass(IBEAN_METHOD_SYMBOL);
-        createEReference(iBeanMethodSymbolEClass, IBEAN_METHOD_SYMBOL__OWNER);
-
-        iComponentSymbolEClass = createEClass(ICOMPONENT_SYMBOL);
-
-        iPropertySymbolEClass = createEClass(IPROPERTY_SYMBOL);
-        createEAttribute(iPropertySymbolEClass, IPROPERTY_SYMBOL__INTERMEDIATE);
-
-        iMapTypeDescriptorEClass = createEClass(IMAP_TYPE_DESCRIPTOR);
-        createEAttribute(iMapTypeDescriptorEClass, IMAP_TYPE_DESCRIPTOR__MAP_SOURCE);
-        createEAttribute(iMapTypeDescriptorEClass, IMAP_TYPE_DESCRIPTOR__IMMUTABLE);
-
-        iMethodSymbolEClass = createEClass(IMETHOD_SYMBOL);
-        createEAttribute(iMethodSymbolEClass, IMETHOD_SYMBOL__SIGNATURE);
-
-        iObjectSymbolEClass = createEClass(IOBJECT_SYMBOL);
-        createEReference(iObjectSymbolEClass, IOBJECT_SYMBOL__TYPE_DESCRIPTOR);
-        createEAttribute(iObjectSymbolEClass, IOBJECT_SYMBOL__READABLE);
-        createEAttribute(iObjectSymbolEClass, IOBJECT_SYMBOL__WRITABLE);
-
-        iBoundedTypeDescriptorEClass = createEClass(IBOUNDED_TYPE_DESCRIPTOR);
-
-        iBoundedMapTypeDescriptorEClass = createEClass(IBOUNDED_MAP_TYPE_DESCRIPTOR);
-
-        iBoundedJavaTypeDescriptorEClass = createEClass(IBOUNDED_JAVA_TYPE_DESCRIPTOR);
-
-        iListTypeDescriptorEClass = createEClass(ILIST_TYPE_DESCRIPTOR);
-        createEAttribute(iListTypeDescriptorEClass, ILIST_TYPE_DESCRIPTOR__LIST_SOURCE);
-
-        iBoundedListTypeDescriptorEClass = createEClass(IBOUNDED_LIST_TYPE_DESCRIPTOR);
-
-        // Create enums
-        eRuntimeSourceEEnum = createEEnum(ERUNTIME_SOURCE);
-
-        // Create data types
-        iTypeEDataType = createEDataType(ITYPE);
-        iJavaElementEDataType = createEDataType(IJAVA_ELEMENT);
-        valueTypeEDataType = createEDataType(VALUE_TYPE);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private boolean isInitialized = false;
-
-    /**
-     * Complete the initialization of the package and its meta-model.  This
-     * method is guarded to have no affect on any invocation but its first.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void initializePackageContents() {
-        if (isInitialized) return;
-        isInitialized = true;
-
-        // Initialize package
-        setName(eNAME);
-        setNsPrefix(eNS_PREFIX);
-        setNsURI(eNS_URI);
-
-        // Add supertypes to classes
-        iBeanInstanceSymbolEClass.getESuperTypes().add(this.getIInstanceSymbol());
-        iBeanInstanceSymbolEClass.getESuperTypes().add(this.getIDescribedInDetail());
-        iBeanPropertySymbolEClass.getESuperTypes().add(this.getIPropertySymbol());
-        iBeanPropertySymbolEClass.getESuperTypes().add(this.getIDescribedInDetail());
-        iInstanceSymbolEClass.getESuperTypes().add(this.getIObjectSymbol());
-        iJavaSymbolEClass.getESuperTypes().add(this.getISymbol());
-        iJavaTypeDescriptor2EClass.getESuperTypes().add(this.getITypeDescriptor());
-        iBeanMethodSymbolEClass.getESuperTypes().add(this.getIDescribedInDetail());
-        iBeanMethodSymbolEClass.getESuperTypes().add(this.getIMethodSymbol());
-        iComponentSymbolEClass.getESuperTypes().add(this.getIInstanceSymbol());
-        iComponentSymbolEClass.getESuperTypes().add(this.getIDescribedInDetail());
-        iPropertySymbolEClass.getESuperTypes().add(this.getIObjectSymbol());
-        iMapTypeDescriptorEClass.getESuperTypes().add(this.getITypeDescriptor());
-        iMethodSymbolEClass.getESuperTypes().add(this.getISymbol());
-        iObjectSymbolEClass.getESuperTypes().add(this.getISymbol());
-        iBoundedTypeDescriptorEClass.getESuperTypes().add(this.getITypeDescriptor());
-        iBoundedMapTypeDescriptorEClass.getESuperTypes().add(this.getIMapTypeDescriptor());
-        iBoundedMapTypeDescriptorEClass.getESuperTypes().add(this.getIBoundedTypeDescriptor());
-        iBoundedJavaTypeDescriptorEClass.getESuperTypes().add(this.getIJavaTypeDescriptor2());
-        iBoundedJavaTypeDescriptorEClass.getESuperTypes().add(this.getIBoundedTypeDescriptor());
-        iListTypeDescriptorEClass.getESuperTypes().add(this.getITypeDescriptor());
-        iBoundedListTypeDescriptorEClass.getESuperTypes().add(this.getIListTypeDescriptor());
-        iBoundedListTypeDescriptorEClass.getESuperTypes().add(this.getIBoundedTypeDescriptor());
-
-        // Initialize classes and features; add operations and parameters
-        initEClass(iBeanInstanceSymbolEClass, IBeanInstanceSymbol.class, "IBeanInstanceSymbol", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getIBeanInstanceSymbol_Properties(), this.getIBeanPropertySymbol(), null, "properties", null, 0, -1, IBeanInstanceSymbol.class, !IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getIBeanInstanceSymbol_Methods(), this.getIBeanMethodSymbol(), null, "methods", null, 0, -1, IBeanInstanceSymbol.class, !IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        addEOperation(iBeanInstanceSymbolEClass, this.getIJavaTypeDescriptor2(), "getJavaTypeDescriptor", 0, 1);
-
-        EOperation op = addEOperation(iBeanInstanceSymbolEClass, null, "setJavaTypeDescriptor");
-        addEParameter(op, this.getIJavaTypeDescriptor2(), "newTypeDescriptor", 0, 1);
-
-        initEClass(iBeanPropertySymbolEClass, IBeanPropertySymbol.class, "IBeanPropertySymbol", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getIBeanPropertySymbol_Owner(), this.getIJavaTypeDescriptor2(), null, "owner", null, 0, 1, IBeanPropertySymbol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(iInstanceSymbolEClass, IInstanceSymbol.class, "IInstanceSymbol", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getIInstanceSymbol_TypeResolved(), ecorePackage.getEBoolean(), "typeResolved", null, 0, 1, IInstanceSymbol.class, !IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getIInstanceSymbol_RuntimeSource(), this.getERuntimeSource(), "runtimeSource", "TAG_INSTANTIATED_SYMBOL", 0, 1, IInstanceSymbol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(iJavaSymbolEClass, IJavaSymbol.class, "IJavaSymbol", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getIJavaSymbol_JavaElement(), this.getIJavaElement(), "javaElement", null, 0, 1, IJavaSymbol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(iSymbolEClass, ISymbol.class, "ISymbol", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getISymbol_Name(), ecorePackage.getEString(), "name", null, 0, 1, ISymbol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(iTypeDescriptorEClass, ITypeDescriptor.class, "ITypeDescriptor", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getITypeDescriptor_Properties(), this.getIPropertySymbol(), null, "properties", null, 0, -1, ITypeDescriptor.class, !IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getITypeDescriptor_TypeSignature(), ecorePackage.getEString(), "typeSignature", "", 0, 1, ITypeDescriptor.class, !IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getITypeDescriptor_SuperTypeSignatures(), ecorePackage.getEString(), "superTypeSignatures", null, 0, -1, ITypeDescriptor.class, !IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getITypeDescriptor_InterfaceTypeSignatures(), ecorePackage.getEString(), "interfaceTypeSignatures", null, 0, -1, ITypeDescriptor.class, !IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getITypeDescriptor_TypeSignatureDelegate(), ecorePackage.getEString(), "typeSignatureDelegate", null, 0, 1, ITypeDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getITypeDescriptor_Methods(), this.getIMethodSymbol(), null, "methods", null, 0, -1, ITypeDescriptor.class, !IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getITypeDescriptor_TypeParameterSignatures(), ecorePackage.getEString(), "typeParameterSignatures", null, 0, -1, ITypeDescriptor.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getITypeDescriptor_JdtContext(), this.getIJavaElement(), "jdtContext", null, 0, 1, ITypeDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getITypeDescriptor_EnumType(), ecorePackage.getEBoolean(), "enumType", null, 0, 1, ITypeDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        op = addEOperation(iTypeDescriptorEClass, ecorePackage.getEBoolean(), "instanceOf", 0, 1);
-        addEParameter(op, ecorePackage.getEString(), "typeSignature", 0, 1);
-
-        addEOperation(iTypeDescriptorEClass, ecorePackage.getEBoolean(), "isArray", 0, 1);
-
-        addEOperation(iTypeDescriptorEClass, this.getIObjectSymbol(), "getArrayElement", 0, 1);
-
-        op = addEOperation(iTypeDescriptorEClass, this.getIType(), "resolveType", 0, 1);
-        addEParameter(op, ecorePackage.getEString(), "resolvedTypeSignature", 0, 1);
-
-        op = addEOperation(iTypeDescriptorEClass, this.getISymbol(), "calculateSyntheticCall", 0, 1);
-        addEParameter(op, ecorePackage.getEString(), "methodName", 0, 1);
-        addEParameter(op, this.getValueType(), "methodArgs", 0, -1);
-        addEParameter(op, ecorePackage.getEString(), "symbolName", 0, 1);
-
-        initEClass(iDescribedInDetailEClass, IDescribedInDetail.class, "IDescribedInDetail", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(iJavaTypeDescriptor2EClass, IJavaTypeDescriptor2.class, "IJavaTypeDescriptor2", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getIJavaTypeDescriptor2_Type(), this.getIType(), "type", null, 0, 1, IJavaTypeDescriptor2.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getIJavaTypeDescriptor2_BeanProperties(), this.getIBeanPropertySymbol(), null, "beanProperties", null, 0, -1, IJavaTypeDescriptor2.class, !IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getIJavaTypeDescriptor2_BeanMethods(), this.getIBeanPropertySymbol(), null, "beanMethods", null, 0, -1, IJavaTypeDescriptor2.class, !IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getIJavaTypeDescriptor2_ArrayCount(), ecorePackage.getEInt(), "arrayCount", null, 0, 1, IJavaTypeDescriptor2.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(iBeanMethodSymbolEClass, IBeanMethodSymbol.class, "IBeanMethodSymbol", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getIBeanMethodSymbol_Owner(), this.getIJavaTypeDescriptor2(), null, "owner", null, 0, 1, IBeanMethodSymbol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(iComponentSymbolEClass, IComponentSymbol.class, "IComponentSymbol", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(iPropertySymbolEClass, IPropertySymbol.class, "IPropertySymbol", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getIPropertySymbol_Intermediate(), ecorePackage.getEBoolean(), "intermediate", null, 0, 1, IPropertySymbol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(iMapTypeDescriptorEClass, IMapTypeDescriptor.class, "IMapTypeDescriptor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getIMapTypeDescriptor_MapSource(), ecorePackage.getEMap(), "mapSource", null, 0, 1, IMapTypeDescriptor.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getIMapTypeDescriptor_Immutable(), ecorePackage.getEBoolean(), "immutable", "true", 0, 1, IMapTypeDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(iMethodSymbolEClass, IMethodSymbol.class, "IMethodSymbol", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getIMethodSymbol_Signature(), ecorePackage.getEString(), "signature", null, 0, 1, IMethodSymbol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(iObjectSymbolEClass, IObjectSymbol.class, "IObjectSymbol", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getIObjectSymbol_TypeDescriptor(), this.getITypeDescriptor(), null, "typeDescriptor", null, 0, 1, IObjectSymbol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getIObjectSymbol_Readable(), ecorePackage.getEBoolean(), "readable", null, 0, 1, IObjectSymbol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getIObjectSymbol_Writable(), ecorePackage.getEBoolean(), "writable", null, 0, 1, IObjectSymbol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        op = addEOperation(iObjectSymbolEClass, ecorePackage.getEBoolean(), "supportsCoercion", 0, 1);
-        addEParameter(op, ecorePackage.getEString(), "typeSignature", 0, 1);
-
-        op = addEOperation(iObjectSymbolEClass, this.getITypeDescriptor(), "coerce", 0, 1);
-        addEParameter(op, ecorePackage.getEString(), "typeSignature", 0, 1);
-
-        op = addEOperation(iObjectSymbolEClass, this.getISymbol(), "call", 0, 1);
-        addEParameter(op, ecorePackage.getEString(), "methodName", 0, 1);
-        addEParameter(op, this.getValueType(), "methodArguments", 0, -1);
-        addEParameter(op, ecorePackage.getEString(), "symbolName", 0, 1);
-
-        initEClass(iBoundedTypeDescriptorEClass, IBoundedTypeDescriptor.class, "IBoundedTypeDescriptor", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        op = addEOperation(iBoundedTypeDescriptorEClass, ecorePackage.getEBoolean(), "isUnboundedForType", 0, 1);
-        addEParameter(op, ecorePackage.getEString(), "typeSignature", 0, 1);
-
-        op = addEOperation(iBoundedTypeDescriptorEClass, this.getISymbol(), "getUnboundedProperty", 0, 1);
-        addEParameter(op, ecorePackage.getEJavaObject(), "name", 0, 1);
-        addEParameter(op, ecorePackage.getEString(), "typeSignature", 0, 1);
-
-        initEClass(iBoundedMapTypeDescriptorEClass, IBoundedMapTypeDescriptor.class, "IBoundedMapTypeDescriptor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(iBoundedJavaTypeDescriptorEClass, IBoundedJavaTypeDescriptor.class, "IBoundedJavaTypeDescriptor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(iListTypeDescriptorEClass, IListTypeDescriptor.class, "IListTypeDescriptor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getIListTypeDescriptor_ListSource(), ecorePackage.getEEList(), "listSource", null, 0, 1, IListTypeDescriptor.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(iBoundedListTypeDescriptorEClass, IBoundedListTypeDescriptor.class, "IBoundedListTypeDescriptor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        // Initialize enums and add enum literals
-        initEEnum(eRuntimeSourceEEnum, ERuntimeSource.class, "ERuntimeSource");
-        addEEnumLiteral(eRuntimeSourceEEnum, ERuntimeSource.BUILT_IN_SYMBOL_LITERAL);
-        addEEnumLiteral(eRuntimeSourceEEnum, ERuntimeSource.MANAGED_BEAN_SYMBOL_LITERAL);
-        addEEnumLiteral(eRuntimeSourceEEnum, ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL);
-        addEEnumLiteral(eRuntimeSourceEEnum, ERuntimeSource.OTHER_LITERAL);
-
-        // Initialize data types
-        initEDataType(iTypeEDataType, IType.class, "IType", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
-        initEDataType(iJavaElementEDataType, IJavaElement.class, "IJavaElement", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
-        initEDataType(valueTypeEDataType, ValueType.class, "ValueType", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
-
-        // Create resource
-        createResource(eNS_URI);
-    }
-
-} //SymbolPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/Util.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/Util.java
deleted file mode 100644
index 8e136f1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/Util.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.common.util.JDTBeanIntrospector;
-import org.eclipse.jst.jsf.common.util.TypeUtil;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-
-final class Util 
-{
-    static ISymbol call(String methodName, EList methodArguments,
-            String symbolName, ITypeDescriptor typeDesc)
-    {
-        // first, see if the type descriptor wants to handle the call
-        ISymbol result = typeDesc.calculateSyntheticCall(methodName, methodArguments, symbolName);
-
-        final IType type= typeDesc.resolveType(typeDesc.getTypeSignature());
-        
-        // if the type is resolved and the typeDesc didn't already handle
-        // the call then do this the hard way...
-        if (type != null && result == null)
-        {
-            final JDTBeanIntrospector introspector = 
-                new JDTBeanIntrospector(type);
-
-            final IMethod callMethod = 
-                Util.matchMethod(methodName, methodArguments, introspector.getAllMethods(),typeDesc.getTypeParameterSignatures());
-
-            if (callMethod != null)
-            {
-                try 
-                {
-                    // resolve the method's return type; don't erase parameters
-                    String retTypeSignature = callMethod.getReturnType();
-                        
-                    // if we have a type variable, try to parameter match it
-                    if (Signature.getTypeSignatureKind(retTypeSignature) == Signature.TYPE_VARIABLE_SIGNATURE)
-                    {
-                        retTypeSignature = TypeUtil.matchTypeParameterToArgument
-                            (type
-                               , retTypeSignature, typeDesc.getTypeParameterSignatures());
-                        
-                        if (retTypeSignature == null)
-                        {
-                            retTypeSignature = TypeConstants.TYPE_JAVAOBJECT;
-                        }
-                    }
-                    // otherwise, try and resolve it in type
-                    else
-                    {
-                    	retTypeSignature = TypeUtil.resolveTypeSignature
-                    		(type, callMethod.getReturnType(), false);
-                    }
-
-                    final IPropertySymbol  propSymbol = 
-                        SymbolFactory.eINSTANCE.createIPropertySymbol();
-
-                    // TODO: there is a possible problem here for non-string keyed maps
-                    propSymbol.setName(symbolName.toString());
-                    propSymbol.setReadable(true);
-                    
-                    {
-                        IJavaTypeDescriptor2 newTypeDesc = null;
-                        
-                        if (retTypeSignature.equals(TypeConstants.TYPE_JAVAOBJECT))
-                        {
-                            newTypeDesc = SymbolFactory.eINSTANCE.createIBoundedJavaTypeDescriptor();
-                        }
-                        else
-                        {
-                            newTypeDesc = SymbolFactory.eINSTANCE.createIJavaTypeDescriptor2();
-                        }
-                        
-                        newTypeDesc.setArrayCount(Signature.getArrayCount(retTypeSignature));
-                        
-                        // may be null
-                        newTypeDesc.setType(typeDesc.resolveType(retTypeSignature));
-                        newTypeDesc.setTypeSignatureDelegate(retTypeSignature);
-                        propSymbol.setTypeDescriptor(newTypeDesc);
-                    }
-                    
-                    result = propSymbol;
-                } 
-                catch (JavaModelException e) 
-                {
-                    JSFCommonPlugin.log(e);
-                    // fall-through and return null result
-                }
-            }
-        }
-
-        return result;
-    }
-
-    static IMethod matchMethod(String methodName, List methodArguments, IMethod[] allMethods, List typeParameterSignatures)
-    {
-//        final List argSigs = convertArgsToSignatures(methodArguments);
-        IMethod matchedMethod = null;
-
-        for (int i = 0; i < allMethods.length; i++)
-        {
-            final IMethod method = allMethods[i];
-            
-            // check for names and argument count match
-            if (method.getParameterTypes().length == methodArguments.size()
-                    && method.getElementName().equals(methodName))
-            {
-                List<String> methods = resolveMethodParameters(method, typeParameterSignatures);
-                
-                // need to verify argument matches
-                boolean isMatched = true;
-                CHECK_ARGUMENTS: for (int j = 0; j < methods.size(); j++)
-                {
-                    final ValueType valueType = (ValueType) methodArguments.get(j);
-
-                    // if the parameters match, or if the method expects an object
-                    // and we have a class
-                    // TODO: there are some cases not supported here like:
-                    // - method name overloading
-                    // - autoboxing primitives
-                    // - certain kinds of parameterized args
-                    if (!methods.get(j).equals(valueType.getSignature())
-                         && !(methods.get(j).equals(TypeConstants.TYPE_JAVAOBJECT)
-                                 && Signature.getTypeSignatureKind(valueType.getSignature())==Signature.CLASS_TYPE_SIGNATURE))
-                    {
-                        // not a match
-                        isMatched = false;
-                        break CHECK_ARGUMENTS;
-                    }
-                }
-                
-                if (isMatched)
-                {
-                    return method;
-                }
-            }
-        }
-
-        return matchedMethod;
-    }
-    
-    static List<String> resolveMethodParameters(IMethod method, List typeParametersSignatures)
-    {
-        List<String>   resolved = new ArrayList<String>();
-        String[] parameterTypes = method.getParameterTypes();
-        for (String parameter : parameterTypes)
-        { 
-            parameter = TypeUtil.resolveTypeSignature(method.getDeclaringType()
-                    , parameter, false);
-            
-            if (Signature.getTypeSignatureKind(parameter) == Signature.TYPE_VARIABLE_SIGNATURE)
-            {
-                parameter = TypeUtil.matchTypeParameterToArgument
-                    (method.getDeclaringType(), parameter, typeParametersSignatures);
-            }
-            
-            if (parameter == null)
-            {
-                parameter = TypeConstants.TYPE_JAVAOBJECT;
-            }
-            
-            resolved.add(parameter);
-        }
-        
-        return resolved;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBeanInstanceSymbolItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBeanInstanceSymbolItemProvider.java
deleted file mode 100644
index a268898..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBeanInstanceSymbolItemProvider.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol} object.
- * <!-- begin-user-doc -->
- * @extends IContentProposalProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class IBeanInstanceSymbolItemProvider
-	extends IInstanceSymbolItemProvider
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, IContentProposalProvider 
-{
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IBeanInstanceSymbolItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * @return 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addPropertiesPropertyDescriptor(object);
-			addMethodsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Properties feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPropertiesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IBeanInstanceSymbol_properties_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IBeanInstanceSymbol_properties_feature", "_UI_IBeanInstanceSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IBEAN_INSTANCE_SYMBOL__PROPERTIES,
-				 false,
-				 false,
-				 false,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Methods feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addMethodsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IBeanInstanceSymbol_methods_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IBeanInstanceSymbol_methods_feature", "_UI_IBeanInstanceSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IBEAN_INSTANCE_SYMBOL__METHODS,
-				 false,
-				 false,
-				 false,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns IBeanInstanceSymbol.gif.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the image associated with object or null if not found 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IBeanInstanceSymbol")); //$NON-NLS-1$
-	}
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * @param object 
-     * @return the text label associated with object or null if not found
-	 * <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        String label = ((IBeanInstanceSymbol)object).getName();
-        return label == null || label.length() == 0 ?
-            getString("_UI_IBeanInstanceSymbol_type") : //$NON-NLS-1$
-            label;
-    }
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * @param newChildDescriptors 
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * @return the resource locator 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-	/**
-	 * @param target_
-	 * @param proposalFactory 
-	 * @return a completion proposal for target at offset
-	 */
-	public ICompletionProposal[] getProposals(Object target_, 
-                                          IProposalCreationFactory proposalFactory) 
-	{
-		IBeanInstanceSymbol  symbol = (IBeanInstanceSymbol) target_;
-
-		final String replacementText = symbol.getName();
-		final String displayText = getText(symbol);
-		final String additionalText = symbol.getDetailedDescription();
-        final Image displayImage = 
-            ExtendedImageRegistry.getInstance().getImage(getImage(symbol));
-		
-		return new ICompletionProposal[]
-		{
-            proposalFactory.createProposal(replacementText, 
-                                           displayText, 
-                                           additionalText, 
-                                           displayImage,
-                                           target_)
-        };
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBeanMethodSymbolItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBeanMethodSymbolItemProvider.java
deleted file mode 100644
index ed4eaae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBeanMethodSymbolItemProvider.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider;
-import org.eclipse.swt.graphics.Image;
-
-
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol} object.
- * <!-- begin-user-doc -->
- * @extends IContentProposalProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class IBeanMethodSymbolItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource,
-        IContentProposalProvider {
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IBeanMethodSymbolItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the list of property descriptors 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addNamePropertyDescriptor(object);
-			addSignaturePropertyDescriptor(object);
-			addOwnerPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Name feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addNamePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ISymbol_name_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ISymbol_name_feature", "_UI_ISymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.ISYMBOL__NAME,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Signature feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addSignaturePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IMethodSymbol_signature_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IMethodSymbol_signature_feature", "_UI_IMethodSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IMETHOD_SYMBOL__SIGNATURE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Owner feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addOwnerPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IBeanMethodSymbol_owner_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IBeanMethodSymbol_owner_feature", "_UI_IBeanMethodSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IBEAN_METHOD_SYMBOL__OWNER,
-				 true,
-				 false,
-				 false,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns IBeanMethodSymbol.gif.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the image associated with object or null if no found
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IBeanMethodSymbol")); //$NON-NLS-1$
-	}
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * @param object 
-     * @return the text label associated with label or null if not found 
-	 * <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        String label = ((IBeanMethodSymbol)object).getName();
-        return label == null || label.length() == 0 ?
-            getString("_UI_IBeanMethodSymbol_type") : //$NON-NLS-1$
-            label;
-    }
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(IBeanMethodSymbol.class)) {
-			case SymbolPackage.IBEAN_METHOD_SYMBOL__NAME:
-			case SymbolPackage.IBEAN_METHOD_SYMBOL__SIGNATURE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * @param newChildDescriptors 
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * @return the resource locator 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-    public ICompletionProposal[] getProposals(Object          target_, 
-                                              IProposalCreationFactory  proposalFactory) 
-    {
-        IBeanMethodSymbol  symbol = (IBeanMethodSymbol) target_;
-
-        final String replacementText = symbol.getName();
-        final String displayText = getText(target_);
-        final String additionalText = symbol.getDetailedDescription();
-        final Image displayImage = 
-            ExtendedImageRegistry.getInstance().getImage(getImage(symbol));
-        
-        return new ICompletionProposal[]
-        {
-            proposalFactory.createProposal(replacementText, 
-                                           displayText, 
-                                           additionalText, 
-                                           displayImage,
-                                           target_)
-        };
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBeanPropertySymbolItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBeanPropertySymbolItemProvider.java
deleted file mode 100644
index d083574..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBeanPropertySymbolItemProvider.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol} object.
- * <!-- begin-user-doc -->
- * @extends IContentProposalProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class IBeanPropertySymbolItemProvider
-	extends IPropertySymbolItemProvider
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, IContentProposalProvider
-{
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * @extends IContentProposalProvider
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IBeanPropertySymbolItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the list of property descriptors 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addOwnerPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Owner feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addOwnerPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IBeanPropertySymbol_owner_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IBeanPropertySymbol_owner_feature", "_UI_IBeanPropertySymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IBEAN_PROPERTY_SYMBOL__OWNER,
-				 true,
-				 false,
-				 false,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns IBeanPropertySymbol.gif.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the image associated with object or null if not found 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IBeanPropertySymbol")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the text label associated with object
- 	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((IBeanPropertySymbol)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_IBeanPropertySymbol_type") : //$NON-NLS-1$
-			getString("_UI_IBeanPropertySymbol_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * @param newChildDescriptors 
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * @return the resource locator 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBoundedJavaTypeDescriptorItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBoundedJavaTypeDescriptorItemProvider.java
deleted file mode 100644
index ff7f567..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBoundedJavaTypeDescriptorItemProvider.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: IBoundedJavaTypeDescriptorItemProvider.java,v 1.6 2007/05/07 17:30:21 cbateman Exp $
- */
-package org.eclipse.jst.jsf.context.symbol.internal.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class IBoundedJavaTypeDescriptorItemProvider
-    extends IJavaTypeDescriptor2ItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public IBoundedJavaTypeDescriptorItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns IBoundedJavaTypeDescriptor.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IBoundedJavaTypeDescriptor")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((IBoundedJavaTypeDescriptor)object).getTypeSignature();
-		return label == null || label.length() == 0 ?
-			getString("_UI_IBoundedJavaTypeDescriptor_type") : //$NON-NLS-1$
-			getString("_UI_IBoundedJavaTypeDescriptor_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBoundedListTypeDescriptorItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBoundedListTypeDescriptorItemProvider.java
deleted file mode 100644
index 0ee627c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBoundedListTypeDescriptorItemProvider.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-
-import org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class IBoundedListTypeDescriptorItemProvider
-    extends IListTypeDescriptorItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param adapterFactory 
-     * @generated
-     */
-    public IBoundedListTypeDescriptorItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This returns IBoundedListTypeDescriptor.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/IBoundedListTypeDescriptor")); //$NON-NLS-1$
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((IBoundedListTypeDescriptor)object).getTypeSignature();
-        return label == null || label.length() == 0 ?
-            getString("_UI_IBoundedListTypeDescriptor_type") : //$NON-NLS-1$
-            getString("_UI_IBoundedListTypeDescriptor_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-     * that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceLocator getResourceLocator() {
-        return JSFCommonPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBoundedMapTypeDescriptorItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBoundedMapTypeDescriptorItemProvider.java
deleted file mode 100644
index c0c9da2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IBoundedMapTypeDescriptorItemProvider.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: IBoundedMapTypeDescriptorItemProvider.java,v 1.6 2007/05/07 17:30:21 cbateman Exp $
- */
-package org.eclipse.jst.jsf.context.symbol.internal.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class IBoundedMapTypeDescriptorItemProvider
-    extends IMapTypeDescriptorItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public IBoundedMapTypeDescriptorItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns IBoundedMapTypeDescriptor.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IBoundedMapTypeDescriptor")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((IBoundedMapTypeDescriptor)object).getTypeSignature();
-		return label == null || label.length() == 0 ?
-			getString("_UI_IBoundedMapTypeDescriptor_type") : //$NON-NLS-1$
-			getString("_UI_IBoundedMapTypeDescriptor_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IComponentSymbolItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IComponentSymbolItemProvider.java
deleted file mode 100644
index 6f67237..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IComponentSymbolItemProvider.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IComponentSymbol;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IComponentSymbol} object.
- * <!-- begin-user-doc -->
- * @extends IContentProposalProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class IComponentSymbolItemProvider
-	extends IInstanceSymbolItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource,
-        IContentProposalProvider
-{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IComponentSymbolItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the property descriptor list
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns IComponentSymbol.gif.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the image associated with object or null if not found 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IComponentSymbol")); //$NON-NLS-1$
-	}
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * @param object 
-     * @return the text label for object or null if not found 
-	 * <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        String label = ((IComponentSymbol)object).getName();
-        return label == null || label.length() == 0 ?
-            getString("_UI_IComponentSymbol_type") : //$NON-NLS-1$
-            label;
-    }
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * @param newChildDescriptors 
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * @return the resource locator 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-    public ICompletionProposal[] getProposals(Object target_, 
-                                       IProposalCreationFactory proposalFactory) 
-    {
-        IComponentSymbol  symbol = (IComponentSymbol) target_;
-
-        final String replacementText = symbol.getName();
-        final String displayText = getText(symbol);
-        final String additionalText = symbol.getDetailedDescription();
-        final Image displayImage = 
-            ExtendedImageRegistry.getInstance().getImage(getImage(symbol));
-
-        return new ICompletionProposal[]
-        {
-            proposalFactory.createProposal(replacementText, 
-                                           displayText, 
-                                           additionalText, 
-                                           displayImage,
-                                           target_)
-        };
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IInstanceSymbolItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IInstanceSymbolItemProvider.java
deleted file mode 100644
index 155bfb1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IInstanceSymbolItemProvider.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider;
-import org.eclipse.swt.graphics.Image;
-
-
-
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IInstanceSymbol} object.
- * <!-- begin-user-doc -->
- * @extends IContentProposalProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class IInstanceSymbolItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource,
-        IContentProposalProvider {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IInstanceSymbolItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the EMF property descriptors  
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addNamePropertyDescriptor(object);
-			addTypeDescriptorPropertyDescriptor(object);
-			addReadablePropertyDescriptor(object);
-			addWritablePropertyDescriptor(object);
-			addTypeResolvedPropertyDescriptor(object);
-			addRuntimeSourcePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Name feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addNamePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ISymbol_name_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ISymbol_name_feature", "_UI_ISymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.ISYMBOL__NAME,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Type Descriptor feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTypeDescriptorPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IObjectSymbol_typeDescriptor_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IObjectSymbol_typeDescriptor_feature", "_UI_IObjectSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IOBJECT_SYMBOL__TYPE_DESCRIPTOR,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Readable feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addReadablePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IObjectSymbol_readable_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IObjectSymbol_readable_feature", "_UI_IObjectSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IOBJECT_SYMBOL__READABLE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Writable feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addWritablePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IObjectSymbol_writable_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IObjectSymbol_writable_feature", "_UI_IObjectSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IOBJECT_SYMBOL__WRITABLE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Type Resolved feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTypeResolvedPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IInstanceSymbol_typeResolved_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IInstanceSymbol_typeResolved_feature", "_UI_IInstanceSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IINSTANCE_SYMBOL__TYPE_RESOLVED,
-				 false,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Runtime Source feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addRuntimeSourcePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IInstanceSymbol_runtimeSource_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IInstanceSymbol_runtimeSource_feature", "_UI_IInstanceSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IINSTANCE_SYMBOL__RUNTIME_SOURCE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns IInstanceSymbol.gif.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the image adaption for object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IInstanceSymbol")); //$NON-NLS-1$
-	}
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * @param object 
-     * @return the text representation of object 
-	 * <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        String label = ((IInstanceSymbol)object).getName();
-        return label == null || label.length() == 0 ?
-            getString("_UI_IInstanceSymbol_type") : //$NON-NLS-1$
-            label;
-    }
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(IInstanceSymbol.class)) {
-			case SymbolPackage.IINSTANCE_SYMBOL__NAME:
-			case SymbolPackage.IINSTANCE_SYMBOL__READABLE:
-			case SymbolPackage.IINSTANCE_SYMBOL__WRITABLE:
-			case SymbolPackage.IINSTANCE_SYMBOL__TYPE_RESOLVED:
-			case SymbolPackage.IINSTANCE_SYMBOL__RUNTIME_SOURCE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * @param newChildDescriptors 
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * @return the resource locator 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-    public ICompletionProposal[] getProposals(Object target_, 
-                                    IProposalCreationFactory proposalFactory) 
-    {
-        IInstanceSymbol  symbol = (IInstanceSymbol) target_;
-
-        final String replacementText = symbol.getName();
-        final String displayText = getText(symbol);
-        //final String additionalText = symbol.getDetailedDescription();
-        final Image displayImage = 
-            ExtendedImageRegistry.getInstance().getImage(getImage(symbol));
-
-        return new ICompletionProposal[]
-        {
-            proposalFactory.createProposal(replacementText, 
-                                           displayText, 
-                                           null, 
-                                           displayImage,
-                                           target_)
-        };
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IJavaSymbolItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IJavaSymbolItemProvider.java
deleted file mode 100644
index 021cd5b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IJavaSymbolItemProvider.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IJavaSymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IJavaSymbol} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class IJavaSymbolItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IJavaSymbolItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the list of property descriptors 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addNamePropertyDescriptor(object);
-			addJavaElementPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Name feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addNamePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ISymbol_name_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ISymbol_name_feature", "_UI_ISymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.ISYMBOL__NAME,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Java Element feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addJavaElementPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IJavaSymbol_javaElement_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IJavaSymbol_javaElement_feature", "_UI_IJavaSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IJAVA_SYMBOL__JAVA_ELEMENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns IJavaSymbol.gif.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the image associated with object or null if not found 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IJavaSymbol")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the text label associated with object or null if no found 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((IJavaSymbol)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_IJavaSymbol_type") : //$NON-NLS-1$
-			getString("_UI_IJavaSymbol_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(IJavaSymbol.class)) {
-			case SymbolPackage.IJAVA_SYMBOL__NAME:
-			case SymbolPackage.IJAVA_SYMBOL__JAVA_ELEMENT:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * @param newChildDescriptors 
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * @return the resource locator 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IJavaTypeDescriptor2ItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IJavaTypeDescriptor2ItemProvider.java
deleted file mode 100644
index 8dc0b3f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IJavaTypeDescriptor2ItemProvider.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class IJavaTypeDescriptor2ItemProvider
-	extends ITypeDescriptorItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IJavaTypeDescriptor2ItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the emf property descriptors 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTypePropertyDescriptor(object);
-			addBeanPropertiesPropertyDescriptor(object);
-			addBeanMethodsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Type feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTypePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IJavaTypeDescriptor2_type_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IJavaTypeDescriptor2_type_feature", "_UI_IJavaTypeDescriptor2_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IJAVA_TYPE_DESCRIPTOR2__TYPE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Bean Properties feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addBeanPropertiesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IJavaTypeDescriptor2_beanProperties_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IJavaTypeDescriptor2_beanProperties_feature", "_UI_IJavaTypeDescriptor2_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IJAVA_TYPE_DESCRIPTOR2__BEAN_PROPERTIES,
-				 true,
-				 false,
-				 false,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Bean Methods feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addBeanMethodsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IJavaTypeDescriptor2_beanMethods_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IJavaTypeDescriptor2_beanMethods_feature", "_UI_IJavaTypeDescriptor2_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IJAVA_TYPE_DESCRIPTOR2__BEAN_METHODS,
-				 true,
-				 false,
-				 false,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-     * This adds a property descriptor for the Array Count feature.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param object 
-     * @generated
-     */
-    protected void addArrayCountPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_IJavaTypeDescriptor2_arrayCount_feature"), //$NON-NLS-1$
-                 getString("_UI_PropertyDescriptor_description", "_UI_IJavaTypeDescriptor2_arrayCount_feature", "_UI_IJavaTypeDescriptor2_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                 SymbolPackage.Literals.IJAVA_TYPE_DESCRIPTOR2__ARRAY_COUNT,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-
-    /**
-	 * This returns IJavaTypeDescriptor2.gif.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the image adaption for object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IJavaTypeDescriptor2")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the text representation of object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((IJavaTypeDescriptor2)object).getTypeSignature();
-		return label == null || label.length() == 0 ?
-			getString("_UI_IJavaTypeDescriptor2_type") : //$NON-NLS-1$
-			getString("_UI_IJavaTypeDescriptor2_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(IJavaTypeDescriptor2.class)) {
-			case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__TYPE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * @param newChildDescriptors 
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * @return the resource locator 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IListTypeDescriptorItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IListTypeDescriptorItemProvider.java
deleted file mode 100644
index 45a3cf1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IListTypeDescriptorItemProvider.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-
-import org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class IListTypeDescriptorItemProvider
-    extends ITypeDescriptorItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public IListTypeDescriptorItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addListSourcePropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the List Source feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addListSourcePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_IListTypeDescriptor_listSource_feature"), //$NON-NLS-1$
-                 getString("_UI_PropertyDescriptor_description", "_UI_IListTypeDescriptor_listSource_feature", "_UI_IListTypeDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                 SymbolPackage.Literals.ILIST_TYPE_DESCRIPTOR__LIST_SOURCE,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns IListTypeDescriptor.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/IListTypeDescriptor")); //$NON-NLS-1$
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((IListTypeDescriptor)object).getTypeSignature();
-        return label == null || label.length() == 0 ?
-            getString("_UI_IListTypeDescriptor_type") : //$NON-NLS-1$
-            getString("_UI_IListTypeDescriptor_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(IListTypeDescriptor.class)) {
-            case SymbolPackage.ILIST_TYPE_DESCRIPTOR__LIST_SOURCE:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-     * that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceLocator getResourceLocator() {
-        return JSFCommonPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IMapTypeDescriptorItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IMapTypeDescriptorItemProvider.java
deleted file mode 100644
index aab70d8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IMapTypeDescriptorItemProvider.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class IMapTypeDescriptorItemProvider
-    extends ITypeDescriptorItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public IMapTypeDescriptorItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the prop descriptor 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addMapSourcePropertyDescriptor(object);
-			addImmutablePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Map Source feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addMapSourcePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IMapTypeDescriptor_mapSource_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IMapTypeDescriptor_mapSource_feature", "_UI_IMapTypeDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IMAP_TYPE_DESCRIPTOR__MAP_SOURCE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Immutable feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addImmutablePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IMapTypeDescriptor_immutable_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IMapTypeDescriptor_immutable_feature", "_UI_IMapTypeDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IMAP_TYPE_DESCRIPTOR__IMMUTABLE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns IMapTypeDescriptor.gif.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the image adaptation of the object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IMapTypeDescriptor")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the text rep of the object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((IMapTypeDescriptor)object).getTypeSignature();
-		return label == null || label.length() == 0 ?
-			getString("_UI_IMapTypeDescriptor_type") : //$NON-NLS-1$
-			getString("_UI_IMapTypeDescriptor_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(IMapTypeDescriptor.class)) {
-			case SymbolPackage.IMAP_TYPE_DESCRIPTOR__MAP_SOURCE:
-			case SymbolPackage.IMAP_TYPE_DESCRIPTOR__IMMUTABLE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * @param newChildDescriptors 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * @return the resource locator 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-}
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IMethodSymbolItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IMethodSymbolItemProvider.java
deleted file mode 100644
index 0d29021..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IMethodSymbolItemProvider.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IMethodSymbol} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class IMethodSymbolItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public IMethodSymbolItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the property sheet descriptors
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addNamePropertyDescriptor(object);
-			addSignaturePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Name feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addNamePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ISymbol_name_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ISymbol_name_feature", "_UI_ISymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.ISYMBOL__NAME,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Signature feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addSignaturePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IMethodSymbol_signature_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IMethodSymbol_signature_feature", "_UI_IMethodSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IMETHOD_SYMBOL__SIGNATURE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns IMethodSymbol.gif.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the image representatino of object
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IMethodSymbol")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the text represention of object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((IMethodSymbol)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_IMethodSymbol_type") : //$NON-NLS-1$
-			getString("_UI_IMethodSymbol_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(IMethodSymbol.class)) {
-			case SymbolPackage.IMETHOD_SYMBOL__NAME:
-			case SymbolPackage.IMETHOD_SYMBOL__SIGNATURE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * @param newChildDescriptors 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * @return the EMF resource locator 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IPropertySymbolItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IPropertySymbolItemProvider.java
deleted file mode 100644
index b142f7a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/IPropertySymbolItemProvider.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.provider;
-
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.sse.ui.internal.contentassist.CustomCompletionProposal;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.IPropertySymbol} object.
- * <!-- begin-user-doc -->
- * @extends IContentProposalProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class IPropertySymbolItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource,
-        IContentProposalProvider{
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public IPropertySymbolItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the property descriptors 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addNamePropertyDescriptor(object);
-			addTypeDescriptorPropertyDescriptor(object);
-			addReadablePropertyDescriptor(object);
-			addWritablePropertyDescriptor(object);
-			addIntermediatePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Name feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addNamePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ISymbol_name_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ISymbol_name_feature", "_UI_ISymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.ISYMBOL__NAME,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Type Descriptor feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addTypeDescriptorPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IObjectSymbol_typeDescriptor_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IObjectSymbol_typeDescriptor_feature", "_UI_IObjectSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IOBJECT_SYMBOL__TYPE_DESCRIPTOR,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Readable feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addReadablePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IObjectSymbol_readable_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IObjectSymbol_readable_feature", "_UI_IObjectSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IOBJECT_SYMBOL__READABLE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Writable feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addWritablePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IObjectSymbol_writable_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IObjectSymbol_writable_feature", "_UI_IObjectSymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IOBJECT_SYMBOL__WRITABLE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Intermediate feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addIntermediatePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IPropertySymbol_intermediate_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_IPropertySymbol_intermediate_feature", "_UI_IPropertySymbol_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.IPROPERTY_SYMBOL__INTERMEDIATE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns IPropertySymbol.gif.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the image rep of object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IPropertySymbol")); //$NON-NLS-1$
-	}
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * @param object 
-     * @return the text representation of the object 
-     * <!-- end-user-doc -->
-     * @generated NOT
-     */
-    public String getText(Object object) {
-        String label = ((IPropertySymbol)object).getName();
-        return label == null || label.length() == 0 ?
-            getString("_UI_IPropertySymbol_type") : //$NON-NLS-1$
-            label;
-    }
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(IPropertySymbol.class)) {
-			case SymbolPackage.IPROPERTY_SYMBOL__NAME:
-			case SymbolPackage.IPROPERTY_SYMBOL__READABLE:
-			case SymbolPackage.IPROPERTY_SYMBOL__WRITABLE:
-			case SymbolPackage.IPROPERTY_SYMBOL__INTERMEDIATE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * @param newChildDescriptors 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * @return the resource locator 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-    /**
-     * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-     */
-    public Collection getChildren(Object object) 
-    {
-        final List  childSymbols = new ArrayList();
-        childSymbols.addAll(((IPropertySymbol)object).getTypeDescriptor().getProperties());
-        return Collections.unmodifiableList(childSymbols);
-    }
-
-    /**
-     * @see org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider#getProposals(Object, org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider.IProposalCreationFactory)
-     */
-    public ICompletionProposal[] getProposals(Object target1, IProposalCreationFactory proposalFactory) 
-    {
-        return getProposalsInternal((IPropertySymbol) target1, proposalFactory, ""); //$NON-NLS-1$
-    }
-    
-    private ICompletionProposal[] getProposalsInternal(IPropertySymbol symbol, IProposalCreationFactory proposalFactory,  String intermediatePrefix)
-    {
-        final List            completions = new ArrayList();
-        final Image displayImage = 
-            ExtendedImageRegistry.getInstance().getImage(getImage(symbol));
-            
-        if (symbol.isIntermediate())
-        {
-            // see if there's something using this as intermediate completion
-            List props = symbol.getTypeDescriptor().getProperties();
-            
-            for (final Iterator it = props.iterator(); it.hasNext();)
-            {
-                final IPropertySymbol propSymbol = (IPropertySymbol) it.next();
-
-                if (!propSymbol.isIntermediate())
-                {
-                    final String replacementText = "['" + intermediatePrefix + symbol.getName() + "." + propSymbol.getName() + "']"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                    completions.add(proposalFactory.createProposal(                          
-                                        replacementText, 
-                                        replacementText, 
-                                        null, 
-                                        displayImage, symbol));
-                }
-                else
-                {
-                    completions.addAll(Arrays.asList(getProposalsInternal(propSymbol, proposalFactory, intermediatePrefix+symbol.getName()+"."))); //$NON-NLS-1$
-                }
-            }
-        }
-        else
-        {
-            final String replacementText = intermediatePrefix + symbol.getName();
-            final String displayText = symbol.getName();
-            final String additionalText = null; // TODO: put property value here where possible?
-            
-            completions.add(proposalFactory.createProposal(
-                                                replacementText, 
-                                                displayText, 
-                                                additionalText,
-                                                displayImage, symbol));
-        }
-        
-        return (ICompletionProposal[]) completions.toArray(new CustomCompletionProposal[0]);
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/ITypeDescriptorItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/ITypeDescriptorItemProvider.java
deleted file mode 100644
index 600cacd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/ITypeDescriptorItemProvider.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ITypeDescriptorItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ITypeDescriptorItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the list of property descriptors
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addPropertiesPropertyDescriptor(object);
-			addTypeSignaturePropertyDescriptor(object);
-			addSuperTypeSignaturesPropertyDescriptor(object);
-			addInterfaceTypeSignaturesPropertyDescriptor(object);
-			addTypeSignatureDelegatePropertyDescriptor(object);
-			addMethodsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Properties feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addPropertiesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ITypeDescriptor_properties_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ITypeDescriptor_properties_feature", "_UI_ITypeDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.ITYPE_DESCRIPTOR__PROPERTIES,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Type Signature feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addTypeSignaturePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ITypeDescriptor_typeSignature_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ITypeDescriptor_typeSignature_feature", "_UI_ITypeDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.ITYPE_DESCRIPTOR__TYPE_SIGNATURE,
-				 false,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Super Type Signatures feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addSuperTypeSignaturesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ITypeDescriptor_superTypeSignatures_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ITypeDescriptor_superTypeSignatures_feature", "_UI_ITypeDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Interface Type Signatures feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addInterfaceTypeSignaturesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ITypeDescriptor_interfaceTypeSignatures_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ITypeDescriptor_interfaceTypeSignatures_feature", "_UI_ITypeDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Type Signature Delegate feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addTypeSignatureDelegatePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ITypeDescriptor_typeSignatureDelegate_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ITypeDescriptor_typeSignatureDelegate_feature", "_UI_ITypeDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Methods feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addMethodsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ITypeDescriptor_methods_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ITypeDescriptor_methods_feature", "_UI_ITypeDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 SymbolPackage.Literals.ITYPE_DESCRIPTOR__METHODS,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-     * This adds a property descriptor for the Type Parameter Signatures feature.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addTypeParameterSignaturesPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ITypeDescriptor_typeParameterSignatures_feature"), //$NON-NLS-1$
-                 getString("_UI_PropertyDescriptor_description", "_UI_ITypeDescriptor_typeParameterSignatures_feature", "_UI_ITypeDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                 SymbolPackage.Literals.ITYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Jdt Context feature.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addJdtContextPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ITypeDescriptor_jdtContext_feature"), //$NON-NLS-1$
-                 getString("_UI_PropertyDescriptor_description", "_UI_ITypeDescriptor_jdtContext_feature", "_UI_ITypeDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                 SymbolPackage.Literals.ITYPE_DESCRIPTOR__JDT_CONTEXT,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Enum Type feature.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addEnumTypePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ITypeDescriptor_enumType_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ITypeDescriptor_enumType_feature", "_UI_ITypeDescriptor_type"),
-                 SymbolPackage.Literals.ITYPE_DESCRIPTOR__ENUM_TYPE,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-	 * This returns ITypeDescriptor.gif.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the image associated with object or null if not found 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ITypeDescriptor")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @return the text label associated with object or null if not found 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ITypeDescriptor)object).getTypeSignature();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ITypeDescriptor_type") : //$NON-NLS-1$
-			getString("_UI_ITypeDescriptor_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ITypeDescriptor.class)) {
-			case SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE:
-			case SymbolPackage.ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES:
-			case SymbolPackage.ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES:
-			case SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * @param newChildDescriptors 
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * @return the resource locator 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return JSFCommonPlugin.INSTANCE;
-	}
-
-}
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/SymbolItemProviderAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/SymbolItemProviderAdapterFactory.java
deleted file mode 100644
index cf7f6a0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/SymbolItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,533 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.provider;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.edit.provider.ChangeNotifier;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.IChangeNotifier;
-import org.eclipse.emf.edit.provider.IDisposable;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.INotifyChangedListener;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.context.symbol.internal.util.SymbolAdapterFactory;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider;
-
-/**
- * This is the factory that is used to provide the interfaces needed to support Viewers.
- * The adapters generated by this factory convert EMF adapter notifications into calls to {@link #fireNotifyChanged fireNotifyChanged}.
- * The adapters also support Eclipse property sheets.
- * Note that most of the adapters are shared among multiple instances.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class SymbolItemProviderAdapterFactory extends SymbolAdapterFactory implements ComposeableAdapterFactory, IChangeNotifier, IDisposable {
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-	/**
-	 * This keeps track of the root adapter factory that delegates to this adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComposedAdapterFactory parentAdapterFactory;
-
-	/**
-	 * This is used to implement {@link org.eclipse.emf.edit.provider.IChangeNotifier}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IChangeNotifier changeNotifier = new ChangeNotifier();
-
-	/**
-	 * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Collection supportedTypes = new ArrayList();
-
-	/**
-	 * This constructs an instance.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * TODO: try to got to Gen function to add custom adapters
-	 * instead of a NOT
-	 * @generated NOT
-	 */
-	public SymbolItemProviderAdapterFactory() {
-		supportedTypes.add(IEditingDomainItemProvider.class);
-		supportedTypes.add(IStructuredItemContentProvider.class);
-		supportedTypes.add(ITreeItemContentProvider.class);
-		supportedTypes.add(IItemLabelProvider.class);
-		supportedTypes.add(IItemPropertySource.class);
-		supportedTypes.add(IContentProposalProvider.class);
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IBeanInstanceSymbolItemProvider iBeanInstanceSymbolItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol}.
-	 * <!-- begin-user-doc -->
-     * @return the adapter 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createIBeanInstanceSymbolAdapter() {
-		if (iBeanInstanceSymbolItemProvider == null) {
-			iBeanInstanceSymbolItemProvider = new IBeanInstanceSymbolItemProvider(this);
-		}
-
-		return iBeanInstanceSymbolItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IBeanPropertySymbolItemProvider iBeanPropertySymbolItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol}.
-	 * <!-- begin-user-doc -->
-     * @return the adapter 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createIBeanPropertySymbolAdapter() {
-		if (iBeanPropertySymbolItemProvider == null) {
-			iBeanPropertySymbolItemProvider = new IBeanPropertySymbolItemProvider(this);
-		}
-
-		return iBeanPropertySymbolItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IInstanceSymbol} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IInstanceSymbolItemProvider iInstanceSymbolItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IInstanceSymbol}.
-	 * <!-- begin-user-doc -->
-     * @return the adapter 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createIInstanceSymbolAdapter() {
-		if (iInstanceSymbolItemProvider == null) {
-			iInstanceSymbolItemProvider = new IInstanceSymbolItemProvider(this);
-		}
-
-		return iInstanceSymbolItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IJavaSymbol} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IJavaSymbolItemProvider iJavaSymbolItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IJavaSymbol}.
-	 * <!-- begin-user-doc -->
-     * @return the adapter 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createIJavaSymbolAdapter() {
-		if (iJavaSymbolItemProvider == null) {
-			iJavaSymbolItemProvider = new IJavaSymbolItemProvider(this);
-		}
-
-		return iJavaSymbolItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IJavaTypeDescriptor2ItemProvider iJavaTypeDescriptor2ItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2}.
-	 * <!-- begin-user-doc -->
-     * @return the adapter 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createIJavaTypeDescriptor2Adapter() {
-		if (iJavaTypeDescriptor2ItemProvider == null) {
-			iJavaTypeDescriptor2ItemProvider = new IJavaTypeDescriptor2ItemProvider(this);
-		}
-
-		return iJavaTypeDescriptor2ItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IBeanMethodSymbolItemProvider iBeanMethodSymbolItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol}.
-	 * <!-- begin-user-doc -->
-     * @return the adapter 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createIBeanMethodSymbolAdapter() {
-		if (iBeanMethodSymbolItemProvider == null) {
-			iBeanMethodSymbolItemProvider = new IBeanMethodSymbolItemProvider(this);
-		}
-
-		return iBeanMethodSymbolItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IComponentSymbol} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected IComponentSymbolItemProvider iComponentSymbolItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IComponentSymbol}.
-	 * <!-- begin-user-doc -->
-     * @return the adapter 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createIComponentSymbolAdapter() {
-		if (iComponentSymbolItemProvider == null) {
-			iComponentSymbolItemProvider = new IComponentSymbolItemProvider(this);
-		}
-
-		return iComponentSymbolItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IPropertySymbol} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected IPropertySymbolItemProvider iPropertySymbolItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IPropertySymbol}.
-	 * <!-- begin-user-doc -->
-     * @return the property symbol adapter 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createIPropertySymbolAdapter() {
-		if (iPropertySymbolItemProvider == null) {
-			iPropertySymbolItemProvider = new IPropertySymbolItemProvider(this);
-		}
-
-		return iPropertySymbolItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected IMapTypeDescriptorItemProvider iMapTypeDescriptorItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor}.
-	 * <!-- begin-user-doc -->
-     * @return the adapter 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createIMapTypeDescriptorAdapter() {
-		if (iMapTypeDescriptorItemProvider == null) {
-			iMapTypeDescriptorItemProvider = new IMapTypeDescriptorItemProvider(this);
-		}
-
-		return iMapTypeDescriptorItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IMethodSymbol} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected IMethodSymbolItemProvider iMethodSymbolItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IMethodSymbol}.
-	 * <!-- begin-user-doc -->
-     * @return the adapter for method symbols 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createIMethodSymbolAdapter() {
-		if (iMethodSymbolItemProvider == null) {
-			iMethodSymbolItemProvider = new IMethodSymbolItemProvider(this);
-		}
-
-		return iMethodSymbolItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected IBoundedMapTypeDescriptorItemProvider iBoundedMapTypeDescriptorItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createIBoundedMapTypeDescriptorAdapter() {
-		if (iBoundedMapTypeDescriptorItemProvider == null) {
-			iBoundedMapTypeDescriptorItemProvider = new IBoundedMapTypeDescriptorItemProvider(this);
-		}
-
-		return iBoundedMapTypeDescriptorItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected IBoundedJavaTypeDescriptorItemProvider iBoundedJavaTypeDescriptorItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createIBoundedJavaTypeDescriptorAdapter() {
-		if (iBoundedJavaTypeDescriptorItemProvider == null) {
-			iBoundedJavaTypeDescriptorItemProvider = new IBoundedJavaTypeDescriptorItemProvider(this);
-		}
-
-		return iBoundedJavaTypeDescriptorItemProvider;
-	}
-
-	/**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor} instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected IListTypeDescriptorItemProvider iListTypeDescriptorItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Adapter createIListTypeDescriptorAdapter() {
-        if (iListTypeDescriptorItemProvider == null) {
-            iListTypeDescriptorItemProvider = new IListTypeDescriptorItemProvider(this);
-        }
-
-        return iListTypeDescriptorItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor} instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected IBoundedListTypeDescriptorItemProvider iBoundedListTypeDescriptorItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Adapter createIBoundedListTypeDescriptorAdapter() {
-        if (iBoundedListTypeDescriptorItemProvider == null) {
-            iBoundedListTypeDescriptorItemProvider = new IBoundedListTypeDescriptorItemProvider(this);
-        }
-
-        return iBoundedListTypeDescriptorItemProvider;
-    }
-
-    /**
-	 * This returns the root adapter factory that contains this factory.
-	 * <!-- begin-user-doc -->
-     * @return the adapter factory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComposeableAdapterFactory getRootAdapterFactory() {
-		return parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();
-	}
-
-	/**
-	 * This sets the composed adapter factory that contains this factory.
-	 * <!-- begin-user-doc -->
-     * @param parentAdapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory) {
-		this.parentAdapterFactory = parentAdapterFactory;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param type 
-     * @return true if the factory supports the adapter type 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isFactoryForType(Object type) {
-		return supportedTypes.contains(type) || super.isFactoryForType(type);
-	}
-
-	/**
-	 * This implementation substitutes the factory itself as the key for the adapter.
-	 * <!-- begin-user-doc -->
-     * @param notifier 
-     * @param type 
-     * @return the adapter
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter adapt(Notifier notifier, Object type) {
-		return super.adapt(notifier, this);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * @param type 
-     * @return the adapted object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object adapt(Object object, Object type) {
-		if (isFactoryForType(type)) {
-			Object adapter = super.adapt(object, type);
-			if (!(type instanceof Class) || (((Class)type).isInstance(adapter))) {
-				return adapter;
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * This adds a listener.
-	 * <!-- begin-user-doc -->
-     * @param notifyChangedListener 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void addListener(INotifyChangedListener notifyChangedListener) {
-		changeNotifier.addListener(notifyChangedListener);
-	}
-
-	/**
-	 * This removes a listener.
-	 * <!-- begin-user-doc -->
-     * @param notifyChangedListener 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void removeListener(INotifyChangedListener notifyChangedListener) {
-		changeNotifier.removeListener(notifyChangedListener);
-	}
-
-	/**
-	 * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
-	 * <!-- begin-user-doc -->
-     * @param notification 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void fireNotifyChanged(Notification notification) {
-		changeNotifier.fireNotifyChanged(notification);
-
-		if (parentAdapterFactory != null) {
-			parentAdapterFactory.fireNotifyChanged(notification);
-		}
-	}
-
-	/**
-	 * This disposes all of the item providers created by this factory. 
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void dispose() {
-		if (iBeanInstanceSymbolItemProvider != null) iBeanInstanceSymbolItemProvider.dispose();
-		if (iBeanPropertySymbolItemProvider != null) iBeanPropertySymbolItemProvider.dispose();
-		if (iInstanceSymbolItemProvider != null) iInstanceSymbolItemProvider.dispose();
-		if (iJavaSymbolItemProvider != null) iJavaSymbolItemProvider.dispose();
-		if (iJavaTypeDescriptor2ItemProvider != null) iJavaTypeDescriptor2ItemProvider.dispose();
-		if (iBeanMethodSymbolItemProvider != null) iBeanMethodSymbolItemProvider.dispose();
-		if (iComponentSymbolItemProvider != null) iComponentSymbolItemProvider.dispose();
-		if (iPropertySymbolItemProvider != null) iPropertySymbolItemProvider.dispose();
-		if (iMapTypeDescriptorItemProvider != null) iMapTypeDescriptorItemProvider.dispose();
-		if (iMethodSymbolItemProvider != null) iMethodSymbolItemProvider.dispose();
-		if (iBoundedMapTypeDescriptorItemProvider != null) iBoundedMapTypeDescriptorItemProvider.dispose();
-		if (iBoundedJavaTypeDescriptorItemProvider != null) iBoundedJavaTypeDescriptorItemProvider.dispose();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/IMethodSymbolBasedType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/IMethodSymbolBasedType.java
deleted file mode 100644
index ae764be..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/IMethodSymbolBasedType.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.util;
-
-import org.eclipse.jst.jsf.common.internal.types.MethodType;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-
-/**
- * 
- * @author cbateman
- *
- */
-public class IMethodSymbolBasedType extends MethodType 
-{
-    private final IMethodSymbol _methodSymbol;
-    
-    /**
-     * @param methodSymbol
-     */
-    public IMethodSymbolBasedType(IMethodSymbol  methodSymbol) 
-    {
-        super(methodSymbol.getName(), methodSymbol.getSignature());
-        _methodSymbol = methodSymbol;
-    }
-
-    /**
-     * @return the method symbol
-     */
-    public IMethodSymbol getSymbol()
-    {
-        return _methodSymbol;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/IObjectSymbolBasedValueType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/IObjectSymbolBasedValueType.java
deleted file mode 100644
index 04fbe52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/IObjectSymbolBasedValueType.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.util;
-
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-
-/**
- * A value type adapter class for IObjectSymbol's
- * 
- * @author cbateman
- *
- */
-public class IObjectSymbolBasedValueType extends ValueType 
-{
-    private final IObjectSymbol _symbol;
-    
-    /**
-     * @param symbol
-     * @return a properly configured instance based on the sub-type of symbol.
-     * Returns null if symbol is not of an appropriate IObjectSymbol type
-     */
-    public static IObjectSymbolBasedValueType getInstance(ISymbol symbol)
-    {
-        if (symbol instanceof IInstanceSymbol)
-        {
-            if (((IInstanceSymbol)symbol).getTypeDescriptor() != null)
-            {
-                return new IObjectSymbolBasedValueType((IInstanceSymbol) symbol);
-            }
-        }
-        else if (symbol instanceof IPropertySymbol)
-        {
-            if (((IPropertySymbol)symbol).getTypeDescriptor() != null)
-            {
-                return new IObjectSymbolBasedValueType((IPropertySymbol) symbol);
-            }
-        }
-        
-        return null;
-    }
-    
-    /**
-     * Constructor for instance symbols (model objects)
-     * @param symbol
-     */
-    public IObjectSymbolBasedValueType(final IInstanceSymbol symbol)
-    {
-        this(symbol.getTypeDescriptor().getTypeSignature(), 
-                (String[])symbol.getTypeDescriptor().getTypeParameterSignatures().toArray(EMPTY_STRING_ARRAY),
-                (String[])symbol.getTypeDescriptor().getSuperTypeSignatures().toArray(EMPTY_STRING_ARRAY),
-                (String[])symbol.getTypeDescriptor().getInterfaceTypeSignatures().toArray(EMPTY_STRING_ARRAY),
-                symbol.getTypeDescriptor().isEnumType(),
-                IAssignable.ASSIGNMENT_TYPE_RHS /* variables are not assignable */
-                , symbol);
-    }
-    
-    /**
-     * Constructor for property symbols
-     * 
-     * @param symbol
-     */
-    public IObjectSymbolBasedValueType(final IPropertySymbol symbol)
-    {
-        this(symbol.getTypeDescriptor().getTypeSignature(), 
-                (String[])symbol.getTypeDescriptor().getTypeParameterSignatures().toArray(EMPTY_STRING_ARRAY),
-                (String[])symbol.getTypeDescriptor().getSuperTypeSignatures().toArray(EMPTY_STRING_ARRAY),
-                (String[])symbol.getTypeDescriptor().getInterfaceTypeSignatures().toArray(EMPTY_STRING_ARRAY),
-                symbol.getTypeDescriptor().isEnumType(),
-                    ASSIGNMENT_TYPE_NONE | (symbol.isReadable()?IAssignable.ASSIGNMENT_TYPE_RHS:ASSIGNMENT_TYPE_NONE)|(symbol.isWritable()?IAssignable.ASSIGNMENT_TYPE_LHS:ASSIGNMENT_TYPE_NONE)
-        , symbol);
-    }
-    
-    private IObjectSymbolBasedValueType(final String signature,
-                     final String[] typeArgs,
-                     final String[] superTypes,
-                     final String[] interfaceTypes,
-                     final boolean isEnumType,
-                     final int assignmentMask,
-                     final IObjectSymbol symbol)
-    {
-        super(signature, typeArgs, superTypes, interfaceTypes, isEnumType, assignmentMask);
-        _symbol = symbol;
-    }
-    
-    /**
-     * @return the underlying IObjectSymbol
-     */
-    public IObjectSymbol getSymbol()
-    {
-        return _symbol;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/SymbolAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/SymbolAdapterFactory.java
deleted file mode 100644
index dcecf36..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/SymbolAdapterFactory.java
+++ /dev/null
@@ -1,457 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IComponentSymbol;
-import org.eclipse.jst.jsf.context.symbol.IDescribedInDetail;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage
- * @generated
- */
-public class SymbolAdapterFactory extends AdapterFactoryImpl {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * The cached model package.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected static SymbolPackage modelPackage;
-
-    /**
-     * Creates an instance of the adapter factory.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public SymbolAdapterFactory() {
-        if (modelPackage == null) {
-            modelPackage = SymbolPackage.eINSTANCE;
-        }
-    }
-
-    /**
-     * Returns whether this factory is applicable for the type of the object.
-     * <!-- begin-user-doc -->
-	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @return whether this factory is applicable for the type of the object.
-     * @generated
-     */
-	public boolean isFactoryForType(Object object) {
-        if (object == modelPackage) {
-            return true;
-        }
-        if (object instanceof EObject) {
-            return ((EObject)object).eClass().getEPackage() == modelPackage;
-        }
-        return false;
-    }
-
-    /**
-     * The switch the delegates to the <code>createXXX</code> methods.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected SymbolSwitch modelSwitch =
-        new SymbolSwitch() {
-            public Object caseIBeanInstanceSymbol(IBeanInstanceSymbol object) {
-                return createIBeanInstanceSymbolAdapter();
-            }
-            public Object caseIBeanPropertySymbol(IBeanPropertySymbol object) {
-                return createIBeanPropertySymbolAdapter();
-            }
-            public Object caseIInstanceSymbol(IInstanceSymbol object) {
-                return createIInstanceSymbolAdapter();
-            }
-            public Object caseIJavaSymbol(IJavaSymbol object) {
-                return createIJavaSymbolAdapter();
-            }
-            public Object caseISymbol(ISymbol object) {
-                return createISymbolAdapter();
-            }
-            public Object caseITypeDescriptor(ITypeDescriptor object) {
-                return createITypeDescriptorAdapter();
-            }
-            public Object caseIDescribedInDetail(IDescribedInDetail object) {
-                return createIDescribedInDetailAdapter();
-            }
-            public Object caseIJavaTypeDescriptor2(IJavaTypeDescriptor2 object) {
-                return createIJavaTypeDescriptor2Adapter();
-            }
-            public Object caseIBeanMethodSymbol(IBeanMethodSymbol object) {
-                return createIBeanMethodSymbolAdapter();
-            }
-            public Object caseIComponentSymbol(IComponentSymbol object) {
-                return createIComponentSymbolAdapter();
-            }
-            public Object caseIPropertySymbol(IPropertySymbol object) {
-                return createIPropertySymbolAdapter();
-            }
-            public Object caseIMapTypeDescriptor(IMapTypeDescriptor object) {
-                return createIMapTypeDescriptorAdapter();
-            }
-            public Object caseIMethodSymbol(IMethodSymbol object) {
-                return createIMethodSymbolAdapter();
-            }
-            public Object caseIObjectSymbol(IObjectSymbol object) {
-                return createIObjectSymbolAdapter();
-            }
-            public Object caseIBoundedTypeDescriptor(IBoundedTypeDescriptor object) {
-                return createIBoundedTypeDescriptorAdapter();
-            }
-            public Object caseIBoundedMapTypeDescriptor(IBoundedMapTypeDescriptor object) {
-                return createIBoundedMapTypeDescriptorAdapter();
-            }
-            public Object caseIBoundedJavaTypeDescriptor(IBoundedJavaTypeDescriptor object) {
-                return createIBoundedJavaTypeDescriptorAdapter();
-            }
-            public Object caseIListTypeDescriptor(IListTypeDescriptor object) {
-                return createIListTypeDescriptorAdapter();
-            }
-            public Object caseIBoundedListTypeDescriptor(IBoundedListTypeDescriptor object) {
-                return createIBoundedListTypeDescriptorAdapter();
-            }
-            public Object defaultCase(EObject object) {
-                return createEObjectAdapter();
-            }
-        };
-
-    /**
-     * Creates an adapter for the <code>target</code>.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param target the object to adapt.
-     * @return the adapter for the <code>target</code>.
-     * @generated
-     */
-	public Adapter createAdapter(Notifier target) {
-        return (Adapter)modelSwitch.doSwitch((EObject)target);
-    }
-
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol <em>IBean Instance Symbol</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol
-     * @generated
-     */
-	public Adapter createIBeanInstanceSymbolAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol <em>IBean Property Symbol</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol
-     * @generated
-     */
-	public Adapter createIBeanPropertySymbolAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IInstanceSymbol <em>IInstance Symbol</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.context.symbol.IInstanceSymbol
-     * @generated
-     */
-	public Adapter createIInstanceSymbolAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IJavaSymbol <em>IJava Symbol</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.context.symbol.IJavaSymbol
-     * @generated
-     */
-	public Adapter createIJavaSymbolAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.ISymbol <em>ISymbol</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.context.symbol.ISymbol
-     * @generated
-     */
-	public Adapter createISymbolAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.ITypeDescriptor <em>IType Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.context.symbol.ITypeDescriptor
-     * @generated
-     */
-	public Adapter createITypeDescriptorAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IDescribedInDetail <em>IDescribed In Detail</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.context.symbol.IDescribedInDetail
-     * @generated
-     */
-	public Adapter createIDescribedInDetailAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2 <em>IJava Type Descriptor2</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2
-     * @generated
-     */
-	public Adapter createIJavaTypeDescriptor2Adapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol <em>IBean Method Symbol</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol
-     * @generated
-     */
-	public Adapter createIBeanMethodSymbolAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IComponentSymbol <em>IComponent Symbol</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.context.symbol.IComponentSymbol
-     * @generated
-     */
-	public Adapter createIComponentSymbolAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IPropertySymbol <em>IProperty Symbol</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.context.symbol.IPropertySymbol
-     * @generated
-     */
-	public Adapter createIPropertySymbolAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor <em>IMap Type Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor
-     * @generated
-     */
-	public Adapter createIMapTypeDescriptorAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IMethodSymbol <em>IMethod Symbol</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.context.symbol.IMethodSymbol
-     * @generated
-     */
-    public Adapter createIMethodSymbolAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IObjectSymbol <em>IObject Symbol</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.context.symbol.IObjectSymbol
-     * @generated
-     */
-    public Adapter createIObjectSymbolAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor <em>IBounded Type Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor
-     * @generated
-     */
-    public Adapter createIBoundedTypeDescriptorAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor <em>IBounded Map Type Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor
-     * @generated
-     */
-    public Adapter createIBoundedMapTypeDescriptorAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor <em>IBounded Java Type Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor
-     * @generated
-     */
-    public Adapter createIBoundedJavaTypeDescriptorAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor <em>IList Type Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor
-     * @generated
-     */
-    public Adapter createIListTypeDescriptorAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor <em>IBounded List Type Descriptor</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor
-     * @generated
-     */
-    public Adapter createIBoundedListTypeDescriptorAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for the default case.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @generated
-     */
-	public Adapter createEObjectAdapter() {
-        return null;
-    }
-
-} //SymbolAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/SymbolSwitch.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/SymbolSwitch.java
deleted file mode 100644
index 92c7746..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/util/SymbolSwitch.java
+++ /dev/null
@@ -1,579 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.context.symbol.internal.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IComponentSymbol;
-import org.eclipse.jst.jsf.context.symbol.IDescribedInDetail;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.IListTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
-
-
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.context.symbol.SymbolPackage
- * @generated
- */
-public class SymbolSwitch {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
-
-    /**
-     * The cached model package
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected static SymbolPackage modelPackage;
-
-    /**
-     * Creates an instance of the switch.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public SymbolSwitch() {
-        if (modelPackage == null) {
-            modelPackage = SymbolPackage.eINSTANCE;
-        }
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param theEObject 
-	 * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-	public Object doSwitch(EObject theEObject) {
-        return doSwitch(theEObject.eClass(), theEObject);
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param theEClass 
-     * @param theEObject 
-	 * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
-        if (theEClass.eContainer() == modelPackage) {
-            return doSwitch(theEClass.getClassifierID(), theEObject);
-        }
-        List eSuperTypes = theEClass.getESuperTypes();
-        return
-            eSuperTypes.isEmpty() ?
-                defaultCase(theEObject) :
-                doSwitch((EClass)eSuperTypes.get(0), theEObject);
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param classifierID 
-     * @param theEObject 
-	 * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-	protected Object doSwitch(int classifierID, EObject theEObject) {
-        switch (classifierID) {
-            case SymbolPackage.IBEAN_INSTANCE_SYMBOL: {
-                IBeanInstanceSymbol iBeanInstanceSymbol = (IBeanInstanceSymbol)theEObject;
-                Object result = caseIBeanInstanceSymbol(iBeanInstanceSymbol);
-                if (result == null) result = caseIInstanceSymbol(iBeanInstanceSymbol);
-                if (result == null) result = caseIDescribedInDetail(iBeanInstanceSymbol);
-                if (result == null) result = caseIObjectSymbol(iBeanInstanceSymbol);
-                if (result == null) result = caseISymbol(iBeanInstanceSymbol);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IBEAN_PROPERTY_SYMBOL: {
-                IBeanPropertySymbol iBeanPropertySymbol = (IBeanPropertySymbol)theEObject;
-                Object result = caseIBeanPropertySymbol(iBeanPropertySymbol);
-                if (result == null) result = caseIPropertySymbol(iBeanPropertySymbol);
-                if (result == null) result = caseIDescribedInDetail(iBeanPropertySymbol);
-                if (result == null) result = caseIObjectSymbol(iBeanPropertySymbol);
-                if (result == null) result = caseISymbol(iBeanPropertySymbol);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IINSTANCE_SYMBOL: {
-                IInstanceSymbol iInstanceSymbol = (IInstanceSymbol)theEObject;
-                Object result = caseIInstanceSymbol(iInstanceSymbol);
-                if (result == null) result = caseIObjectSymbol(iInstanceSymbol);
-                if (result == null) result = caseISymbol(iInstanceSymbol);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IJAVA_SYMBOL: {
-                IJavaSymbol iJavaSymbol = (IJavaSymbol)theEObject;
-                Object result = caseIJavaSymbol(iJavaSymbol);
-                if (result == null) result = caseISymbol(iJavaSymbol);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.ISYMBOL: {
-                ISymbol iSymbol = (ISymbol)theEObject;
-                Object result = caseISymbol(iSymbol);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.ITYPE_DESCRIPTOR: {
-                ITypeDescriptor iTypeDescriptor = (ITypeDescriptor)theEObject;
-                Object result = caseITypeDescriptor(iTypeDescriptor);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IDESCRIBED_IN_DETAIL: {
-                IDescribedInDetail iDescribedInDetail = (IDescribedInDetail)theEObject;
-                Object result = caseIDescribedInDetail(iDescribedInDetail);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2: {
-                IJavaTypeDescriptor2 iJavaTypeDescriptor2 = (IJavaTypeDescriptor2)theEObject;
-                Object result = caseIJavaTypeDescriptor2(iJavaTypeDescriptor2);
-                if (result == null) result = caseITypeDescriptor(iJavaTypeDescriptor2);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IBEAN_METHOD_SYMBOL: {
-                IBeanMethodSymbol iBeanMethodSymbol = (IBeanMethodSymbol)theEObject;
-                Object result = caseIBeanMethodSymbol(iBeanMethodSymbol);
-                if (result == null) result = caseIDescribedInDetail(iBeanMethodSymbol);
-                if (result == null) result = caseIMethodSymbol(iBeanMethodSymbol);
-                if (result == null) result = caseISymbol(iBeanMethodSymbol);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.ICOMPONENT_SYMBOL: {
-                IComponentSymbol iComponentSymbol = (IComponentSymbol)theEObject;
-                Object result = caseIComponentSymbol(iComponentSymbol);
-                if (result == null) result = caseIInstanceSymbol(iComponentSymbol);
-                if (result == null) result = caseIDescribedInDetail(iComponentSymbol);
-                if (result == null) result = caseIObjectSymbol(iComponentSymbol);
-                if (result == null) result = caseISymbol(iComponentSymbol);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IPROPERTY_SYMBOL: {
-                IPropertySymbol iPropertySymbol = (IPropertySymbol)theEObject;
-                Object result = caseIPropertySymbol(iPropertySymbol);
-                if (result == null) result = caseIObjectSymbol(iPropertySymbol);
-                if (result == null) result = caseISymbol(iPropertySymbol);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IMAP_TYPE_DESCRIPTOR: {
-                IMapTypeDescriptor iMapTypeDescriptor = (IMapTypeDescriptor)theEObject;
-                Object result = caseIMapTypeDescriptor(iMapTypeDescriptor);
-                if (result == null) result = caseITypeDescriptor(iMapTypeDescriptor);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IMETHOD_SYMBOL: {
-                IMethodSymbol iMethodSymbol = (IMethodSymbol)theEObject;
-                Object result = caseIMethodSymbol(iMethodSymbol);
-                if (result == null) result = caseISymbol(iMethodSymbol);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IOBJECT_SYMBOL: {
-                IObjectSymbol iObjectSymbol = (IObjectSymbol)theEObject;
-                Object result = caseIObjectSymbol(iObjectSymbol);
-                if (result == null) result = caseISymbol(iObjectSymbol);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IBOUNDED_TYPE_DESCRIPTOR: {
-                IBoundedTypeDescriptor iBoundedTypeDescriptor = (IBoundedTypeDescriptor)theEObject;
-                Object result = caseIBoundedTypeDescriptor(iBoundedTypeDescriptor);
-                if (result == null) result = caseITypeDescriptor(iBoundedTypeDescriptor);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IBOUNDED_MAP_TYPE_DESCRIPTOR: {
-                IBoundedMapTypeDescriptor iBoundedMapTypeDescriptor = (IBoundedMapTypeDescriptor)theEObject;
-                Object result = caseIBoundedMapTypeDescriptor(iBoundedMapTypeDescriptor);
-                if (result == null) result = caseIMapTypeDescriptor(iBoundedMapTypeDescriptor);
-                if (result == null) result = caseIBoundedTypeDescriptor(iBoundedMapTypeDescriptor);
-                if (result == null) result = caseITypeDescriptor(iBoundedMapTypeDescriptor);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IBOUNDED_JAVA_TYPE_DESCRIPTOR: {
-                IBoundedJavaTypeDescriptor iBoundedJavaTypeDescriptor = (IBoundedJavaTypeDescriptor)theEObject;
-                Object result = caseIBoundedJavaTypeDescriptor(iBoundedJavaTypeDescriptor);
-                if (result == null) result = caseIJavaTypeDescriptor2(iBoundedJavaTypeDescriptor);
-                if (result == null) result = caseIBoundedTypeDescriptor(iBoundedJavaTypeDescriptor);
-                if (result == null) result = caseITypeDescriptor(iBoundedJavaTypeDescriptor);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.ILIST_TYPE_DESCRIPTOR: {
-                IListTypeDescriptor iListTypeDescriptor = (IListTypeDescriptor)theEObject;
-                Object result = caseIListTypeDescriptor(iListTypeDescriptor);
-                if (result == null) result = caseITypeDescriptor(iListTypeDescriptor);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case SymbolPackage.IBOUNDED_LIST_TYPE_DESCRIPTOR: {
-                IBoundedListTypeDescriptor iBoundedListTypeDescriptor = (IBoundedListTypeDescriptor)theEObject;
-                Object result = caseIBoundedListTypeDescriptor(iBoundedListTypeDescriptor);
-                if (result == null) result = caseIListTypeDescriptor(iBoundedListTypeDescriptor);
-                if (result == null) result = caseIBoundedTypeDescriptor(iBoundedListTypeDescriptor);
-                if (result == null) result = caseITypeDescriptor(iBoundedListTypeDescriptor);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            default: return defaultCase(theEObject);
-        }
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IBean Instance Symbol</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>IBean Instance Symbol</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseIBeanInstanceSymbol(IBeanInstanceSymbol object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IBean Property Symbol</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>IBean Property Symbol</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseIBeanPropertySymbol(IBeanPropertySymbol object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IInstance Symbol</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>IInstance Symbol</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseIInstanceSymbol(IInstanceSymbol object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IJava Symbol</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>IJava Symbol</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseIJavaSymbol(IJavaSymbol object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>ISymbol</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>ISymbol</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseISymbol(ISymbol object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IType Descriptor</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>IType Descriptor</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseITypeDescriptor(ITypeDescriptor object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IDescribed In Detail</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>IDescribed In Detail</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseIDescribedInDetail(IDescribedInDetail object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IJava Type Descriptor2</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>IJava Type Descriptor2</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseIJavaTypeDescriptor2(IJavaTypeDescriptor2 object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IBean Method Symbol</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>IBean Method Symbol</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseIBeanMethodSymbol(IBeanMethodSymbol object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IComponent Symbol</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>IComponent Symbol</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseIComponentSymbol(IComponentSymbol object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IProperty Symbol</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>IProperty Symbol</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseIPropertySymbol(IPropertySymbol object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IMap Type Descriptor</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>IMap Type Descriptor</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseIMapTypeDescriptor(IMapTypeDescriptor object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IMethod Symbol</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>IMethod Symbol</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseIMethodSymbol(IMethodSymbol object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IObject Symbol</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>IObject Symbol</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseIObjectSymbol(IObjectSymbol object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IBounded Type Descriptor</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>IBounded Type Descriptor</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseIBoundedTypeDescriptor(IBoundedTypeDescriptor object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IBounded Map Type Descriptor</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>IBounded Map Type Descriptor</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseIBoundedMapTypeDescriptor(IBoundedMapTypeDescriptor object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IBounded Java Type Descriptor</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>IBounded Java Type Descriptor</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseIBoundedJavaTypeDescriptor(IBoundedJavaTypeDescriptor object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IList Type Descriptor</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>IList Type Descriptor</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseIListTypeDescriptor(IListTypeDescriptor object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>IBounded List Type Descriptor</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>IBounded List Type Descriptor</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseIBoundedListTypeDescriptor(IBoundedListTypeDescriptor object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>EObject</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch, but this is the last case anyway.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>EObject</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-     * @generated
-     */
-	public Object defaultCase(EObject object) {
-        return null;
-    }
-
-} //SymbolSwitch
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/provider/IContentProposalProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/provider/IContentProposalProvider.java
deleted file mode 100644
index b37344b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/provider/IContentProposalProvider.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.symbol.provider;
-
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Adapts an object to appropriate content proposal
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public interface IContentProposalProvider 
-{
-	/**
-	 * @param target 
-	 * @param proposalFactory 
-	 * @return an content proposal for target or null
-	 * if nothing appropriate can be created
-	 */
-	ICompletionProposal[]  getProposals(Object target, 
-                                        IProposalCreationFactory proposalFactory);
-    
-    /**
-     * Implementors of the class can configure certain aspects of the returned
-     * proposals
-     * 
-     * @author cbateman
-     *
-     */
-    public interface IProposalCreationFactory
-    {
-        /**
-         * @param replacementText  The text to be replaced
-         * @param displayText  The text to be displayed in the assist window
-         * @param additionalText The text to be displayed in the "addition info"
-         *                          or null
-         * @param displayImage The image to be displayed or null
-         * @param sourceObject  The original source object.  Implementors should
-         * make no assumptions (i.e. always test instanceof before casting)
-         * @return a configured completion proposal for the parameters
-         */
-        ICompletionProposal createProposal(final String  replacementText,
-                final String  displayText,
-                final String  additionalText,
-                final Image   displayImage,
-                final Object  sourceObject);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/provider/ProposalCreationFactoryAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/provider/ProposalCreationFactoryAdapter.java
deleted file mode 100644
index 588a48b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/provider/ProposalCreationFactoryAdapter.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.symbol.provider;
-
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider.IProposalCreationFactory;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.sse.ui.internal.contentassist.CustomCompletionProposal;
-
-/**
- * Default implementation of the proposal creation factory
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class ProposalCreationFactoryAdapter implements IProposalCreationFactory 
-{
-    /**
-     * The absolute document offset where the replacement is to occur
-     */
-    protected final int       _replacementOffset;
-    /**
-     * The number of characters to replace starting from _replaceOffset with
-     * the proposal.  0 indicates insertion with no replacement
-     */
-    protected final int       _replacementLength;
-    
-    /**
-     * @param replacementOffset -- the absolute document offset to do the replacement
-     * @param replacementLength  -- the number of characters to replace or 0
-     * for insert without any replacement
-     */
-    public ProposalCreationFactoryAdapter(final int replacementOffset,
-                                          final int replacementLength)
-    {
-        _replacementOffset = replacementOffset;
-        _replacementLength = replacementLength;
-    }
-
-    public ICompletionProposal createProposal(String replacementText, 
-                String displayText, String additionalText, Image displayImage,
-                Object targetObject) 
-                
-    {
-        return createDefaultProposal(replacementText, 
-                _replacementOffset, 
-                _replacementLength, 
-                replacementText.length(), 
-                displayImage, 
-                displayText, 
-                null, 
-                additionalText,
-                1);
-    }
-    
-    /**
-     * Simple factory method for creating a default proposal
-     * 
-     * @param replacementText
-     * @param replacementOffset
-     * @param replacementLength
-     * @param cursorPosition
-     * @param displayImage
-     * @param displayText
-     * @param contextInfo
-     * @param additionalText
-     * @param relevance
-     * @return a default configuration of the completion proposal based on 
-     * the CustomCompletionProposal
-     */
-    protected static ICompletionProposal 
-                    createDefaultProposal(final String replacementText,
-                                          final int replacementOffset,
-                                          final int replacementLength,
-                                          final int cursorPosition,
-                                          final Image displayImage,
-                                          final String displayText,
-                                          final IContextInformation contextInfo,
-                                          final String additionalText,
-                                          final int relevance)
-    {
-        return new CustomCompletionProposal(replacementText, 
-                replacementOffset, 
-                replacementLength, 
-                cursorPosition, 
-                displayImage, 
-                displayText, 
-                contextInfo, 
-                additionalText,
-                relevance);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/AbstractContextSymbolFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/AbstractContextSymbolFactory.java
deleted file mode 100644
index 4abd7a7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/AbstractContextSymbolFactory.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.symbol.source;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-
-/**
- * Must be sub-classed by all contextSymbolFactory extension point implementors
- * to create context configured symbols
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractContextSymbolFactory 
-{
-    /**
-     * @param symbolName -- the symbol name
-     * @param scope -- the scope of the symbol
-     * @param context -- the context; must be supported (call supports(context))
-     * @param problems -- populated with problems found during symbol construction.
-     * @return a new ISymbol configured for the name, scope and context or null
-     * if the arguments are valid but some other reason a symbol cannot be created.
-     * @throws IllegalArgumentException if this method is called with context
-     * for which supports(context) == false or if scope does not conform
-     * to exactly one of the ISymbolConstants.SYMBOL_SCOPE_* constants
-     */
-    public final ISymbol  create(String symbolName, int scope, IAdaptable context, List problems)
-    {
-        if (!supports(context))
-        {
-            throw new IllegalArgumentException("Unsupported context"); //$NON-NLS-1$
-        }
-        else if (!ISymbolConstants.isValid(scope))
-        {
-            throw new IllegalArgumentException("Unsupported symbol constant:"+scope); //$NON-NLS-1$
-        }
-        
-        return internalCreate(symbolName, scope, context, problems);
-    }
-
-    /**
-     * @param symbolName
-     * @param scope
-     * @param context
-     * @param problems -- see problems arg on create
-     * @return a new ISymbol for the name, scope and context
-     */
-    protected abstract ISymbol internalCreate(String symbolName, int scope, IAdaptable context, List problems);
-    
-    /**
-     * @param context
-     * @return true if this factory supports the context
-     */
-    public abstract boolean  supports(IAdaptable context);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/AbstractSymbolSourceProviderFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/AbstractSymbolSourceProviderFactory.java
deleted file mode 100644
index f793f81..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/AbstractSymbolSourceProviderFactory.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.symbol.source;
-
-import org.eclipse.core.resources.IProject;
-
-/**
- * Default implementation of ISymbolSourceProviderFactory.  Implementors may 
- * sub-class or create their own separate factory class.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractSymbolSourceProviderFactory implements
-        ISymbolSourceProviderFactory 
-{
-    private IProject      _project;
-    
-    /**
-     * Default constructor used by extension manager to create this factory
-     */
-    public AbstractSymbolSourceProviderFactory()
-    {
-        // do nothing
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.context.symbol.source.ISymbolSourceProviderFactory#createInstance(org.eclipse.core.resources.IProject)
-     */
-    public final ISymbolSourceProvider createInstance(IProject project) 
-    {
-        _project = project;
-        return create(project);
-    }
-    
-    /**
-     * Override this method to do specialization of provider creation
-     * 
-     * @param project
-     * @return the symbol source provider created by the subclass
-     */
-    protected abstract ISymbolSourceProvider create(IProject project);
- 
-    /**
-     * @return the IProject that this source provider is associated with.
-     */
-    protected final IProject getProject() 
-    {
-        return _project;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/ISymbolConstants.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/ISymbolConstants.java
deleted file mode 100644
index 590b792..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/ISymbolConstants.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.symbol.source;
-
-/**
- * Defines global constants for symbols
- * 
- * <p><b>Provisional API - subject to change</b></p> 
- * 
- * @author cbateman
- *
- */
-public class ISymbolConstants {
-    /**
-     * Mask to indicate all request scope symbols for a particular context
-     */
-    public final static int  SYMBOL_SCOPE_REQUEST = 1;
-    
-    /**
-     * Mask to indicate all session scope symbols for a particular context
-     */
-    public final static int  SYMBOL_SCOPE_SESSION = 2;
-    
-    /**
-     * Mask to indicate all application scope symbols for a particular context
-     */
-    public final static int  SYMBOL_SCOPE_APPLICATION = 4;
-    
-    /**
-     * Mask to indicate all 'none' scope symbols for a particular context
-     */
-    public final static int  SYMBOL_SCOPE_NONE = 8;
-
-    /**
-     * All scopes
-     */
-    public final static int  SYMBOL_SCOPE_ALL = 
-                                                SYMBOL_SCOPE_REQUEST 
-                                                | SYMBOL_SCOPE_SESSION 
-                                                | SYMBOL_SCOPE_APPLICATION 
-                                                | SYMBOL_SCOPE_NONE;
-
-    /**
-     * the string representation for request scope
-     */
-    public final static String SYMBOL_SCOPE_REQUEST_STRING = "request"; //$NON-NLS-1$
-    
-    
-    /**
-     * the string representation for session scope
-     */
-    public final static String SYMBOL_SCOPE_SESSION_STRING = "session"; //$NON-NLS-1$
-
-    /**
-     * the string representation for application scope
-     */
-    public final static String SYMBOL_SCOPE_APPLICATION_STRING = "application"; //$NON-NLS-1$
-
-    /**
-     * the string representation for none scope
-     */
-    public final static String  SYMBOL_SCOPE_NONE_STRING = "none"; //$NON-NLS-1$
-
-    /**
-     * @param scope
-     * @return true iff scope matches exactly one scope value (excluding ALL)
-     */
-    public static boolean isValid(int scope)
-    {
-        return scope  == SYMBOL_SCOPE_APPLICATION
-                   || scope == SYMBOL_SCOPE_REQUEST
-                   || scope == SYMBOL_SCOPE_SESSION
-                   || scope == SYMBOL_SCOPE_NONE;
-    }
-    
-    /**
-     * @param scopeMask
-     * @return the string representation for a scope mask or null if either
-     * the mask contains more than one scope or the scope is not valid
-     */
-    public static String getStringForMask(final int scopeMask)
-    {
-        if (scopeMask == SYMBOL_SCOPE_REQUEST)
-        {
-            return SYMBOL_SCOPE_REQUEST_STRING;
-        }
-        else if (scopeMask == SYMBOL_SCOPE_SESSION)
-        {
-            return SYMBOL_SCOPE_SESSION_STRING;
-        }
-        else if (scopeMask == SYMBOL_SCOPE_APPLICATION)
-        {
-            return SYMBOL_SCOPE_APPLICATION_STRING;
-        }
-        else if (scopeMask == SYMBOL_SCOPE_NONE)
-        {
-            return SYMBOL_SCOPE_NONE_STRING;
-        }
-        
-        return null;
-    }
-    
-    /**
-     * @param scopeString
-     * @return the scope mask for the string or -1 if the string is not
-     * one of SYMBOL_SCOPE_*_STRING
-     */
-    public static int getMaskForString(final String scopeString)
-    {
-        if (SYMBOL_SCOPE_REQUEST_STRING.equals(scopeString))
-        {
-            return SYMBOL_SCOPE_REQUEST;
-        }
-        else if (SYMBOL_SCOPE_SESSION_STRING.equals(scopeString))
-        {
-            return SYMBOL_SCOPE_SESSION;
-        }
-        else if (SYMBOL_SCOPE_APPLICATION_STRING.equals(scopeString))
-        {
-            return SYMBOL_SCOPE_APPLICATION;
-        }
-        else if (SYMBOL_SCOPE_NONE_STRING.equals(scopeString))
-        {
-            return SYMBOL_SCOPE_NONE;
-        }
-        
-        return -1;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/ISymbolSourceProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/ISymbolSourceProvider.java
deleted file mode 100644
index 96dae65..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/ISymbolSourceProvider.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.symbol.source;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-
-/**
- * Defines a provider that acts as source of symbols.  The
- * implementor is usually context specific
- * 
- * <p><b>Provisional API - subject to change</b></p> 
- * 
- * @author cbateman
- *
- */
-public interface ISymbolSourceProvider 
-{
-    /**
-	 * @param context 
-     * @param symbolScopeMask - a mask resulting for ORing the SYMBOL_SCOPE_*
-     * constants to indicate what scopes to retrieve symbols for.
-	 * @return all symbols in context matching symbolScopeMask
-	 */
-	ISymbol[]  getSymbols(IAdaptable context, int symbolScopeMask);
-	
-	/**
-	 * @param prefix
-	 * @param context 
-	 * @param symbolScopeMask a mask resulting for ORing the SYMBOL_SCOPE_*
-	 * @return the sub-set of getSymbols that conforms
-	 * to String.startsWith(prefix) in context matching symbolScopeMask.
-	 */
-	ISymbol[]  getSymbols(String prefix, IAdaptable context, int symbolScopeMask);
-	
-	/**
-	 * @param context
-	 * @return true if this provider has symbols for this context
-	 */
-	boolean	   isProvider(IAdaptable context);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/ISymbolSourceProviderFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/ISymbolSourceProviderFactory.java
deleted file mode 100644
index 87b9558..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/source/ISymbolSourceProviderFactory.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.context.symbol.source;
-
-import org.eclipse.core.resources.IProject;
-
-/**
- * Implemented by extensions wishing to use symbolSourceProvider extension point
- * to contribute designtime symbols to the JSF symbol resolver framework.
- * 
- * Instance factory class must implement a zero-argument default constructor
- * 
- * <p><b>Provisional API - subject to change</b></p> 
- * 
- * @author cbateman
- *
- */
-public interface ISymbolSourceProviderFactory 
-{
-    /**
-     * @param project
-     * @return a new instance of a symbol source provider for project
-     */
-    ISymbolSourceProvider createInstance(IProject project);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/.classpath b/jsf/plugins/org.eclipse.jst.jsf.core/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/.cvsignore b/jsf/plugins/org.eclipse.jst.jsf.core/.cvsignore
deleted file mode 100644
index 117a1fe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/.cvsignore
+++ /dev/null
@@ -1,5 +0,0 @@
-bin
-@dot*
-temp.folder
-build.xml
-javaCompiler...args
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/.project b/jsf/plugins/org.eclipse.jst.jsf.core/.project
deleted file mode 100644
index 0cd3e27..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.core</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.jsf.core/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 7a97ba4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Jun 04 13:52:01 PDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
-instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.core/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 08c324c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,77 +0,0 @@
-#Tue May 15 14:58:03 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/.settings/org.eclipse.jdt.ui.prefs b/jsf/plugins/org.eclipse.jst.jsf.core/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 82eb6c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Apr 06 18:25:15 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.core/META-INF/MANIFEST.MF
deleted file mode 100644
index d7771fe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,75 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %plugin.name
-Bundle-SymbolicName: org.eclipse.jst.jsf.core; singleton:=true
-Bundle-Version: 1.0.1.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.core.internal.JSFCorePlugin
-Bundle-Vendor: %plugin.provider
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.common.project.facet.core;bundle-version="[1.2.0,1.3.0)",
- org.eclipse.jst.j2ee.web;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jst.jsf.facesconfig;bundle-version="[1.0.0,1.1.0)",
- org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.j2ee;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jst.j2ee.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.common.frameworks.ui;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jst.jsp.core;bundle-version="[1.1.0,1.3.0)",
- org.eclipse.jst.jsf.common;bundle-version="[1.0.0,1.1.0)",
- org.eclipse.jface.text;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.html.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.validation;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.sse.ui;bundle-version="[1.0.101,1.1.0)",
- org.eclipse.wst.common.emf;bundle-version="[1.1.103,2.0.0)",
- org.eclipse.jem.util;bundle-version="[2.0.0,3.0.0)",
- org.eclipse.emf.common;bundle-version="[2.2.0,2.4.0)",
- org.eclipse.emf.ecore;bundle-version="[2.2.0,2.4.0)",
- org.eclipse.core.commands;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.swt;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,2.4.0)",
- org.eclipse.emf.edit;bundle-version="[2.2.0,2.4.0)",
- org.eclipse.jst.common.project.facet.core;bundle-version="[1.1.0,1.2.0)"
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.jst.jsf.core,
- org.eclipse.jst.jsf.core.internal;x-friends:="org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.ui,org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.core.internal.contentassist.el;x-friends:="org.eclipse.jst.jsf.contentassist.tests",
- org.eclipse.jst.jsf.core.internal.jsflibraryconfig;x-friends:="org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.ui.tests,org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.jsf.core.internal.jsflibraryregistry;x-friends:="org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.ui,org.eclipse.jst.jsf.ui.tests,org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.jsf.core.internal.jsflibraryregistry.adapter;x-friends:="org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.ui,org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl;x-friends:="org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.ui,org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;x-friends:="org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.ui,org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.core.internal.launch;x-internal:=true,
- org.eclipse.jst.jsf.core.internal.project.facet;x-friends:="org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.ui,org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.core.internal.tld;x-friends:="org.eclipse.jst.pagedesigner,org.eclipse.jst.jsf.core.tests",
- org.eclipse.jst.jsf.core.jsfappconfig,
- org.eclipse.jst.jsf.core.jsflibraryconfiguration,
- org.eclipse.jst.jsf.core.jsflibraryconfiguration.internal;x-friends:="org.eclipse.jst.jsf.core.tests",
- org.eclipse.jst.jsf.core.jsflibraryregistry,
- org.eclipse.jst.jsf.core.jsflibraryregistry.internal;x-friends:="org.eclipse.jst.jsf.core.tests",
- org.eclipse.jst.jsf.core.set.constraint,
- org.eclipse.jst.jsf.core.set.mapping,
- org.eclipse.jst.jsf.core.tagmatcher,
- org.eclipse.jst.jsf.designtime,
- org.eclipse.jst.jsf.designtime.context,
- org.eclipse.jst.jsf.designtime.el,
- org.eclipse.jst.jsf.designtime.internal.jsp;x-internal:=true,
- org.eclipse.jst.jsf.designtime.internal.symbols;x-friends:="org.eclipse.jst.jsf.designtime.tests",
- org.eclipse.jst.jsf.designtime.resolver,
- org.eclipse.jst.jsf.designtime.symbols,
- org.eclipse.jst.jsf.metadataprocessors,
- org.eclipse.jst.jsf.metadataprocessors.features,
- org.eclipse.jst.jsf.metadataprocessors.internal;x-friends:="org.eclipse.jst.jsf.metadata.tests",
- org.eclipse.jst.jsf.taglibprocessing.attributevalues,
- org.eclipse.jst.jsf.validation.internal;x-friends:="org.eclipse.jst.jsf.ui",
- org.eclipse.jst.jsf.validation.internal.appconfig;x-friends:="org.eclipse.jst.jsf.core.tests",
- org.eclipse.jst.jsf.validation.internal.constraints;x-internal:=true,
- org.eclipse.jst.jsf.validation.internal.constraints.impl;x-internal:=true,
- org.eclipse.jst.jsf.validation.internal.constraints.util;x-internal:=true,
- org.eclipse.jst.jsf.validation.internal.el;x-friends:="org.eclipse.jst.jsf.ui,org.eclipse.jst.jsf.validation.el.tests",
- org.eclipse.jst.jsf.validation.internal.el.diagnostics;x-friends:="org.eclipse.jst.jsf.validation.el.tests",
- org.eclipse.jst.jsf.validation.internal.el.operators;x-internal:=true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/about.html b/jsf/plugins/org.eclipse.jst.jsf.core/about.html
deleted file mode 100644
index 72f94ad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 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>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/build.properties b/jsf/plugins/org.eclipse.jst.jsf.core/build.properties
deleted file mode 100644
index d4fd94d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/build.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               plugin.properties,\
-               schema/,\
-               about.html,\
-               buildnotes_JSF.html
-src.includes = buildnotes_JSF.html
-javacSource=1.5
-javacTarget=1.5
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/buildnotes_JSF.html b/jsf/plugins/org.eclipse.jst.jsf.core/buildnotes_JSF.html
deleted file mode 100644
index 6a7db49..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/buildnotes_JSF.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>JSF Tools Project Build Notes</title>
-</head>
-<body>
-<h1>JSF Tools Project Build Notes</h1>
-<h4>WTP-JSF 2.0 M5 build</h4>
-<h3>What's new in this drop?</h3>
-<ul>
-	<li>Please see the New and Noteworthy section for a list of new
-	features in the JSF Tools Project. Click on the link titled <b>"
-	New for WTP 2.0 milestone build M4 (January 5, 2007)".</b></li>
-</ul>
-<h3>FAQ</h3>
-<ol>
-	<b><i><li>How to make the Visual Page Designer the default editor for
-	JSP pages?</li></i></b>
-<br>
-	The JSF Tools Project-contributed Visual Page Designer (VPD) is NOT
-	registered as the default editor for JSP files. You can make the VPD
-	the default editor for JSP files by following these steps:
-	<ul>
-		<li>Navigate to "Window" -> "Preferences..." -> "General" ->
-		"Editors" -> "File Associations"</li>
-		<li>In the "File types" section, select "*.jsp"</li>
-		<li>In the "Associated editors" section, select "Web Page Editor"</li>
-		<li>Select the "Default" button</li>
-	</ul>
-
-</ol>
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/model/constraints.ecore b/jsf/plugins/org.eclipse.jst.jsf.core/model/constraints.ecore
deleted file mode 100644
index de5a6ff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/model/constraints.ecore
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="constraints"
-    nsURI="http://org.eclipse.jst.jsf.core/constraints.ecore" nsPrefix="cnst">
-  <eClassifiers xsi:type="ecore:EClass" name="TagId">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uri" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="uri"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="name"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TagSet">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tags" upperBound="-1" eType="#//TagId">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="tagId"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ContainsTagConstraint">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="setGenerator" eType="ecore:EClass ../../org.eclipse.jst.jsf.common/model/metadataTraitTypes.ecore#//SetGenerator">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="set-generator"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="satisfiesSet" eType="#//TagSet">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="satisfies-set"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/model/constraints.genmodel b/jsf/plugins/org.eclipse.jst.jsf.core/model/constraints.genmodel
deleted file mode 100644
index e7ae676..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/model/constraints.genmodel
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/org.eclipse.jst.jsf.core/src"
-    modelPluginID="org.eclipse.jst.jsf.core" modelName="Constraints" importerID="org.eclipse.emf.importer.ecore"
-    usedGenPackages="../../org.eclipse.jst.jsf.common/model/metadataTraitTypes.genmodel#//traittypes">
-  <foreignModel>constraints.ecore</foreignModel>
-  <genPackages prefix="Constraints" basePackage="org.eclipse.jst.jsf.validation.internal"
-      resource="XML" disposableProviderFactory="true" ecorePackage="constraints.ecore#/">
-    <genClasses ecoreClass="constraints.ecore#//TagId">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute constraints.ecore#//TagId/uri"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute constraints.ecore#//TagId/name"/>
-    </genClasses>
-    <genClasses ecoreClass="constraints.ecore#//TagSet">
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference constraints.ecore#//TagSet/tags"/>
-    </genClasses>
-    <genClasses ecoreClass="constraints.ecore#//ContainsTagConstraint">
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference constraints.ecore#//ContainsTagConstraint/setGenerator"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference constraints.ecore#//ContainsTagConstraint/satisfiesSet"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/model/jsflibraryregistry.ecore b/jsf/plugins/org.eclipse.jst.jsf.core/model/jsflibraryregistry.ecore
deleted file mode 100644
index dfbc002..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/model/jsflibraryregistry.ecore
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="jsflibraryregistry"
-    nsURI="http://www.eclipse.org/webtools/jsf/schema/jsflibraryregistry.xsd" nsPrefix="jsflibreg">
-  <eClassifiers xsi:type="ecore:EClass" name="JSFLibraryRegistry">
-    <eOperations name="getJSFLibraryByID" lowerBound="1" eType="#//JSFLibrary">
-      <eParameters name="ID" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="getJSFLibrariesByName" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EEList">
-      <eParameters name="name" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="getImplJSFLibraries" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EEList"/>
-    <eOperations name="getNonImplJSFLibraries" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EEList"/>
-    <eOperations name="getAllJSFLibraries" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EEList"/>
-    <eOperations name="addJSFLibrary" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="library" lowerBound="1" eType="#//JSFLibrary"/>
-    </eOperations>
-    <eOperations name="removeJSFLibrary" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="library" lowerBound="1" eType="#//JSFLibrary"/>
-    </eOperations>
-    <eOperations name="getDefaultImplementation" lowerBound="1" eType="#//JSFLibrary"/>
-    <eOperations name="setDefaultImplementation" lowerBound="1">
-      <eParameters name="implementation" lowerBound="1" eType="#//JSFLibrary"/>
-    </eOperations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="DefaultImplementationID"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" defaultValueLiteral=""/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="JSFLibraries" upperBound="-1"
-        eType="#//JSFLibrary" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="PluginProvidedJSFLibraries"
-        upperBound="-1" eType="#//PluginProvidedJSFLibrary" transient="true" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="JSFLibrary">
-    <eOperations name="containsArchiveFile" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="fullPath" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="getWorkingCopy" lowerBound="1" eType="#//JSFLibrary"/>
-    <eOperations name="updateValues" lowerBound="1">
-      <eParameters name="otherLibrary" lowerBound="1" eType="#//JSFLibrary"/>
-    </eOperations>
-    <eOperations name="copyTo" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="baseDestLocation" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="getLabel" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="ID" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        changeable="false" transient="true" defaultValueLiteral="" derived="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="Name" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="JSFVersion" lowerBound="1"
-        eType="#//JSFVersion" defaultValueLiteral="UNKNOWN"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="Deployed" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean" defaultValueLiteral="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="Implementation" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean" defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="ArchiveFiles" upperBound="-1"
-        eType="#//ArchiveFile" containment="true" eOpposite="#//ArchiveFile/JSFLibrary"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PluginProvidedJSFLibrary" eSuperTypes="#//JSFLibrary">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="pluginID" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="Label" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ArchiveFile">
-    <eOperations name="getName" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eOperations name="getPath" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eOperations name="exists" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-    <eOperations name="equals" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="object" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
-    </eOperations>
-    <eOperations name="hashCode" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eOperations name="copyTo" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="baseDestLocation" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="getResolvedSourceLocation" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="RelativeToWorkspace" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean" defaultValueLiteral="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="SourceLocation" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="RelativeDestLocation" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="JSFLibrary" lowerBound="1"
-        eType="#//JSFLibrary" eOpposite="#//JSFLibrary/ArchiveFiles"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="JSFVersion">
-    <eLiterals name="UNKNOWN" value="-1"/>
-    <eLiterals name="v1_1" value="1"/>
-    <eLiterals name="v1_2" value="2"/>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/model/jsflibraryregistry.genmodel b/jsf/plugins/org.eclipse.jst.jsf.core/model/jsflibraryregistry.genmodel
deleted file mode 100644
index 2c7c455..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/model/jsflibraryregistry.genmodel
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright (c) 2005 Oracle Corporation"
-    modelDirectory="/org.eclipse.jst.jsf.core/src" editDirectory="/org.eclipse.jst.jsf.core.edit/src"
-    editorDirectory="/org.eclipse.jst.jsf.core.editor/src" modelPluginID="org.eclipse.jst.jsf.core"
-    templateDirectory="templates" dynamicTemplates="true" modelName="JSFLibraryRegistry"
-    importerID="org.eclipse.emf.importer.ecore">
-  <foreignModel>jsflibraryregistry.ecore</foreignModel>
-  <genPackages prefix="JSFLibraryRegistry" basePackage="org.eclipse.jst.jsf.core.internal"
-      resource="XML" disposableProviderFactory="true" ecorePackage="jsflibraryregistry.ecore#/">
-    <genEnums ecoreEnum="jsflibraryregistry.ecore#//JSFVersion">
-      <genEnumLiterals ecoreEnumLiteral="jsflibraryregistry.ecore#//JSFVersion/UNKNOWN"/>
-      <genEnumLiterals ecoreEnumLiteral="jsflibraryregistry.ecore#//JSFVersion/v1_1"/>
-      <genEnumLiterals ecoreEnumLiteral="jsflibraryregistry.ecore#//JSFVersion/v1_2"/>
-    </genEnums>
-    <genClasses ecoreClass="jsflibraryregistry.ecore#//JSFLibraryRegistry">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//JSFLibraryRegistry/DefaultImplementationID"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference jsflibraryregistry.ecore#//JSFLibraryRegistry/JSFLibraries"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference jsflibraryregistry.ecore#//JSFLibraryRegistry/PluginProvidedJSFLibraries"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibraryRegistry/getJSFLibraryByID">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//JSFLibraryRegistry/getJSFLibraryByID/ID"/>
-      </genOperations>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibraryRegistry/getJSFLibrariesByName">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//JSFLibraryRegistry/getJSFLibrariesByName/name"/>
-      </genOperations>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibraryRegistry/getImplJSFLibraries"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibraryRegistry/getNonImplJSFLibraries"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibraryRegistry/getAllJSFLibraries"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibraryRegistry/addJSFLibrary">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//JSFLibraryRegistry/addJSFLibrary/library"/>
-      </genOperations>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibraryRegistry/removeJSFLibrary">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//JSFLibraryRegistry/removeJSFLibrary/library"/>
-      </genOperations>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibraryRegistry/getDefaultImplementation"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibraryRegistry/setDefaultImplementation">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//JSFLibraryRegistry/setDefaultImplementation/implementation"/>
-      </genOperations>
-    </genClasses>
-    <genClasses ecoreClass="jsflibraryregistry.ecore#//JSFLibrary">
-      <genFeatures property="Readonly" createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//JSFLibrary/ID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//JSFLibrary/Name"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//JSFLibrary/JSFVersion"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//JSFLibrary/Deployed"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//JSFLibrary/Implementation"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference jsflibraryregistry.ecore#//JSFLibrary/ArchiveFiles"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibrary/containsArchiveFile">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//JSFLibrary/containsArchiveFile/fullPath"/>
-      </genOperations>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibrary/getWorkingCopy"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibrary/updateValues">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//JSFLibrary/updateValues/otherLibrary"/>
-      </genOperations>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibrary/copyTo">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//JSFLibrary/copyTo/baseDestLocation"/>
-      </genOperations>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibrary/getLabel"/>
-    </genClasses>
-    <genClasses ecoreClass="jsflibraryregistry.ecore#//PluginProvidedJSFLibrary">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//PluginProvidedJSFLibrary/pluginID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//PluginProvidedJSFLibrary/Label"/>
-    </genClasses>
-    <genClasses ecoreClass="jsflibraryregistry.ecore#//ArchiveFile">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//ArchiveFile/RelativeToWorkspace"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//ArchiveFile/SourceLocation"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//ArchiveFile/RelativeDestLocation"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference jsflibraryregistry.ecore#//ArchiveFile/JSFLibrary"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//ArchiveFile/getName"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//ArchiveFile/getPath"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//ArchiveFile/exists"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//ArchiveFile/equals">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//ArchiveFile/equals/object"/>
-      </genOperations>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//ArchiveFile/hashCode"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//ArchiveFile/copyTo">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//ArchiveFile/copyTo/baseDestLocation"/>
-      </genOperations>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//ArchiveFile/getResolvedSourceLocation"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/model/templates/Header.javajetinc b/jsf/plugins/org.eclipse.jst.jsf.core/model/templates/Header.javajetinc
deleted file mode 100644
index aadfb40..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/model/templates/Header.javajetinc
+++ /dev/null
@@ -1,10 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.core/plugin.properties
deleted file mode 100644
index 00d27ae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/plugin.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-plugin.name=JavaServer Faces Tools - Core
-plugin.provider=Eclipse.org
-plugin.facet.description=Enables the project to be deployed with JSF capabilities.
-
-JSFNonELAttributeValueValidator=JSP Semantics Validator (JSF)
-JSFELValidator=JSP JSF EL Validator
-JSPSemanticsValidatorMarker=JSP Semantics Problem (JSF)
-JSFAppConfigValidator=JSF Application Configuration Validator
-
-JSFv11Project=JavaServer Faces v1.1 Project
-JSFv11PresetDesc=Configures a Dynamic Web application for JSF v1.1 using Web Module v2.4 and Java v1.4 
-JSFv12Project=JavaServer Faces v1.2 Project
-JSFv12PresetDesc=Configures a Dynamic Web application for JSF v1.2 using Web Module v2.5 and Java v5.0
-# ====================================================================
-
-pluginName = Constraints Model
-providerName = www.example.org
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.core/plugin.xml
deleted file mode 100644
index 3eff8fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/plugin.xml
+++ /dev/null
@@ -1,299 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   <extension-point id="jsfLibraries" name="jsfLibraries" schema="schema/jsfLibraries.exsd"/>
-   <extension-point id="pluginProvidedJsfLibraries" name="pluginProvidedJsfLibraries" schema="schema/pluginProvidedJsfLibraries.exsd"/>
-   <extension-point id="variableresolver" name="Variable Resolver Ext Point" schema="schema/variableresolver.exsd"/>
-   <extension-point id="propertyresolver" name="Property Resolver Ext Point" schema="schema/propertyresolver.exsd"/>
-   <extension-point id="methodresolver" name="Method Resolver Ext Point" schema="schema/methodresolver.exsd"/>
-   <extension-point id="externalcontext" name="External Context Ext Point" schema="schema/externalcontext.exsd"/>
-   <extension-point id="AttributeValueRuntimeTypes" name="AttributeValueRuntimeTypes" schema="schema/AttributeValueRuntimeTypes.exsd"/>
-   <extension-point id="MetaDataEnabledFeatures" name="MetaDataEnabledFeatures" schema="schema/MetaDataEnabledFeatures.exsd"/>
-
-   <extension point="org.eclipse.emf.ecore.generated_package">
-    	<package 
-      	 	uri = "http://org.eclipse.jst.jsf.core/constraints.ecore" 
-       		class = "org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage"
-       		genModel = "model/constraints.genmodel" /> 
-   </extension>   
-  <!-- JSF Project Facets -->
-	<extension
-       id="org.eclipse.jst.jsf.project.facet"
-       name="%plugin.facet.extension.name"
-       point="org.eclipse.wst.common.project.facet.core.facets">
-
-    <project-facet id="jst.jsf">
-      <label>JavaServer Faces</label>
-      <description>%plugin.facet.description</description>
-      <default-version
-            provider="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetDefaultVersionProvider">
-      </default-version>
-    </project-facet>
-
-    <project-facet-version facet="jst.jsf" version="1.1">
-       <constraint>
-        <and>
-          <requires facet="jst.web" version="[2.3"/>
-        </and>
-      </constraint>
-    </project-facet-version> 
-
-    <project-facet-version facet="jst.jsf" version="1.2">
-       <constraint>
-        <and>
-          <requires facet="jst.web" version="[2.5"/>
-        </and>
-      </constraint>
-    </project-facet-version> 
-
-    <action id="jst.jsf.v11.install" facet="jst.jsf" type="INSTALL" version="1.1">
-      	<delegate class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetInstallDelegate"/>
-        <config-factory class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetInstallDataModelProvider"/>
-    </action>  
-      
-    <action id="jst.jsf.v11.uninstall" facet="jst.jsf" type="UNINSTALL" version="1.1" >
-	 	<delegate
-        class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetUninstallDelegate"/>
- 	</action>
-	
- 	<action id="jst.jsf.v12.install" facet="jst.jsf" type="INSTALL" version="[1.2">
-      	<delegate class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetInstallDelegate"/>
-        <config-factory class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetInstallDataModelProvider"/>
-    </action>  
-      
-    <action id="jst.jsf.v12.uninstall" facet="jst.jsf" version="[1.2" type="UNINSTALL">
-	 	<delegate
-        class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetUninstallDelegate"/>
- 	</action>  
-	      	
-  </extension> 
-  
-  <extension
-        point="org.eclipse.wst.common.project.facet.core.listeners">
-     <listener
-           class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetPrimaryRuntimeChangedListener"
-           eventTypes="PRIMARY_RUNTIME_CHANGED">
-     </listener>
-  </extension>
-  
-  <extension
-        point="org.eclipse.wst.common.project.facet.core.presets">
-     <static-preset
-           id="preset.jst.jsf.v1_1">
-	    <label>%JSFv11Project</label>
-	    <facet id="jst.java" version="1.4" />
-	    <facet id="jst.web" version="2.3"/>
-	    <facet id="jst.jsf" version="1.1" />
-     <description>
-        %JSFv11PresetDesc
-     </description>
-     </static-preset>
-     <static-preset
-           id="preset.jst.jsf.v1_2">
-	    <label>%JSFv12Project</label>
-	    <facet id="jst.java" version="5.0" />
-	    <facet id="jst.web" version="2.5"/>
-	    <facet id="jst.jsf" version="1.2" />
-     <description>
-        %JSFv12PresetDesc
-     </description>
-     </static-preset>
-  </extension>
-
-  <extension point="org.eclipse.wst.common.project.facet.core.runtimes">
-    <supported>
-		<runtime-component any="true"/>
-        	<facet id="jst.jsf" version="1.1,1.2"/> 
-    </supported>
-  </extension>
-    
-  <extension
-     name="JSF JSP File URL"
-     point="org.eclipse.jst.j2ee.web.fileURL">
-     <fileURL id="jsfPage"><run class="org.eclipse.jst.jsf.core.internal.launch.JSFFileURL"/></fileURL>
-  </extension>
-  
-  <extension
-         point="org.eclipse.ui.startup">
-      <startup class="org.eclipse.jst.jsf.designtime.internal.jsp.StartupHandler"/>
-      <!--
-      <startup
-            class="org.eclipse.jst.jsf.core.internal.RegistryMigrationStartupHandler">
-      </startup>
-      --> 
-   </extension>
-      <extension
-         point="org.eclipse.jst.jsf.common.symbolSourceProvider">
-      <symbolSourceId factory="org.eclipse.jst.jsf.designtime.internal.symbols.JSPTagVariableSymbolSourceProvider"/>
-   </extension>
-   <extension
-         point="org.eclipse.jst.jsf.common.contextSymbolFactory">
-      <contextSymbolFactory
-            factory="org.eclipse.jst.jsf.designtime.internal.jsp.JSPDefaultSymbolFactory"
-            factoryId="org.eclipse.jst.jsf.designtime.core.loadBundle"/>
-   </extension>
-   <extension
-         point="org.eclipse.jst.jsf.core.variableresolver">
-      <variableresolver
-            class="org.eclipse.jst.jsf.designtime.el.DefaultDTVariableResolver"
-            id="org.eclipse.jst.jsf.core.variableresolver.default"/>
-   </extension>
-   <extension
-         point="org.eclipse.jst.jsf.core.propertyresolver">
-      <propertyresolver
-            class="org.eclipse.jst.jsf.designtime.el.DefaultDTPropertyResolver"
-            id="org.eclipse.jst.jsf.core.propertyresolver.default"/>
-   </extension>
-   <extension
-         point="org.eclipse.jst.jsf.core.methodresolver">
-      <methodresolver
-            class="org.eclipse.jst.jsf.designtime.el.DefaultDTMethodResolver"
-            id="org.eclipse.jst.jsf.core.methodresolver.default"/>
-   </extension>
-   <extension
-         point="org.eclipse.jst.jsf.core.externalcontext">
-      <externalcontext
-            class="org.eclipse.jst.jsf.designtime.context.DefaultDTExternalContextFactory"
-            id="org.eclipse.jst.jsf.core.externalcontext.default"/>
-   </extension>
-   
-   <extension
-         point="org.eclipse.jst.jsf.core.AttributeValueRuntimeTypes">
-
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.StringType"
-            id="attributevalues.StringType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.BooleanType"
-            id="attributevalues.BooleanType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.LongType"
-            id="attributevalues.LongType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.IntegerType"
-            id="attributevalues.IntegerType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.DoubleType"
-            id="attributevalues.DoubleType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.JavaClassType"
-            id="attributevalues.JavaClassType"/>                                                
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.MethodBindingType"
-            id="attributevalues.MethodBindingType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.ActionType"
-            id="attributevalues.ActionType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.ValueBindingType"
-            id="attributevalues.ValueBindingType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.ValueType"
-            id="attributevalues.ValueType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierType"
-            id="attributevalues.FacesConfigIdentifierType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigValidatorIDType"
-            id="attributevalues.FacesConfigValidatorIDType"/>           
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigConverterIDType"
-            id="attributevalues.FacesConfigConverterIDType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.ComponentBindingType"
-            id="attributevalues.ComponentBindingType"/>            
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.ComponentIDType"
-            id="attributevalues.ComponentIDType"/>
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.LengthType"
-            id="attributevalues.LengthType"/>           
-      <attributeValueRuntimeType
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.ColorType"
-            id="attributevalues.ColorType"/>          
-   </extension>
-   
-   <extension
-         point="org.eclipse.jst.jsf.core.MetaDataEnabledFeatures">       
-      <MetaDataEnabledFeature
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigValidatorIDFeatures"
-            typeid="org.eclipse.jst.jsf.core.attributevalues.FacesConfigValidatorIDType"/>
-     <MetaDataEnabledFeature
-            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigConverterIDFeatures"
-            typeid="org.eclipse.jst.jsf.core.attributevalues.FacesConfigConverterIDType"/>            
-   </extension>
-   
-   <extension
-        point="org.eclipse.wst.validation.validator"
-		id="JSFNonELAttributeValueValidator"
-		name="%JSFNonELAttributeValueValidator">
-		<validator>
-			<projectNature id="org.eclipse.wst.common.modulecore.ModuleCoreNature" />
-			<projectNature id="org.eclipse.jdt.core.javanature" />
-			<markerId
-               markerIdValue="JSPSemanticsValidatorMarker">
-         	</markerId>
-			<helper 
-				class="org.eclipse.wst.validation.internal.operations.WorkbenchContext">
-			</helper>
-			<run
-         		class="org.eclipse.jst.jsf.validation.internal.JSPSemanticsValidator"
-         		incremental="true"
-         		fullBuild="true"
-         	/>
-   <contentTypeBinding
-         contentTypeId="org.eclipse.jst.jsp.core.jspsource">
-   </contentTypeBinding>
-   <contentTypeBinding
-         contentTypeId="org.eclipse.jst.jsp.core.jspfragmentsource">
-   </contentTypeBinding>
-		</validator>
-		</extension>
-
-   <extension
-        point="org.eclipse.wst.validation.validator"
-		id="JSFAppConfigValidator"
-		name="%JSFAppConfigValidator">
-		<validator>
-			<projectNature id="org.eclipse.wst.common.modulecore.ModuleCoreNature" />
-			<projectNature id="org.eclipse.jdt.core.javanature" />
-			<filter
-				objectClass="org.eclipse.core.resources.IFile"
-				nameFilter="faces-config.xml">
-			</filter>
-			<markerId
-               markerIdValue="JSPSemanticsValidatorMarker">
-         	</markerId>
-			<helper 
-				class="org.eclipse.wst.validation.internal.operations.WorkbenchContext">
-			</helper>
-			<run
-         		class="org.eclipse.jst.jsf.validation.internal.appconfig.AppConfigValidator"
-         		incremental="true"
-         		fullBuild="true"
-         	/>
-		</validator>
-	</extension>
-	
-	<extension
-         id="JSPSemanticsValidatorMarker"
-         name="%JSPSemanticsValidatorMarker"
-         point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.wst.validation.problemmarker">
-      </super>
-   </extension>
- <extension
-       point="org.eclipse.jst.jsf.common.symbolSourceProvider">
-    <symbolSourceId
-          factory="org.eclipse.jst.jsf.designtime.internal.symbols.ResourceBundleSymbolSourceProvider">
-    </symbolSourceId>
- </extension>
-   
-  <extension point="org.eclipse.jdt.core.classpathContainerInitializer">
-    <classpathContainerInitializer
-      class="org.eclipse.jst.jsf.core.internal.JSFLibrariesContainerInitializer"
-      id="org.eclipse.jst.jsf.core.internal.jsflibrarycontainer"/>
-  </extension>
-  
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/AttributeValueRuntimeTypes.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/AttributeValueRuntimeTypes.exsd
deleted file mode 100644
index c06c1d4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/AttributeValueRuntimeTypes.exsd
+++ /dev/null
@@ -1,126 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="AttributeValueRuntimeTypes" name="AttributeValueRuntimeTypes"/>
-      </appInfo>
-      <documentation>
-         Defines a mapping between an implementing class and an AttributeValue Runtime type.   By categorizing attribute values types in an CMAnnotation file, we can assign types and therefore processing of those types using the CMAnnotation file metadata and context information.
-
-&lt;p&gt;&lt;b&gt;This extension point is provisional and subject to change&lt;/b&gt;&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="attributeValueRuntimeType" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="attributeValueRuntimeType">
-      <annotation>
-         <documentation>
-            The MetaDataEnabledRuntimeTypeProcessing framework will use the value found on the attribute-value-runtime-value property of a cm-attribute annoation to bind to a class that implements the type.   That type may be able to provide processing for ContentAssist, Validation, Quick Fix/Quick Assist, or other context sensitive operations.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  unique id for the type within the extending plugin
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  Class that will be used to implement the type.  It must implement &lt;code&gt;org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature&lt;/code&gt; and it is recommended that the user extend the &lt;code&gt;org.eclipse.jst.jsf.metadataprocessors.AbstractRootTypeDescriptor&lt;/code&gt; or one of its subclasses.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.metadataprocessors.AbstractRootTypeDescriptor:org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.5
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         see org.eclipse.jst.jsf.taglibprocessing plugin for examples of usage
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         cm-attribute annotation elements can have an &quot;attribute-value-runtime-type&quot; property that maps to the id of this ext-pt.  The property must be fully qualified with the extender&apos;s plugin id.   i.e.  if type is FooType, the property value must be com.foo.bar.FooType.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2006 Oracle Corporation.
-All rights reserved. This program and the accompanying materials
-are made available under the terms of the Eclipse Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/epl-v10.html
- 
-Contributors:
-    Gerry Kessler/Oracle - initial API and implementation
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/MetaDataEnabledFeatures.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/MetaDataEnabledFeatures.exsd
deleted file mode 100644
index f0b6717..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/MetaDataEnabledFeatures.exsd
+++ /dev/null
@@ -1,126 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="MetaDataEnabledFeatures" name="MetaData Enabled Features"/>
-      </appInfo>
-      <documentation>
-         Defines a mapping between a runtime type defined by a different plugin and an implementing class in the extenders plugin.   This allows a provider to provide additional processing on an element or attribute instance that can be in addition to existing processing or a means to provide a new kind of processing of existing runtime types.
-
-&lt;p&gt;&lt;b&gt;This extension point is provisional and subject to change&lt;/b&gt;&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="MetaDataEnabledFeature" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="MetaDataEnabledFeature">
-      <annotation>
-         <documentation>
-            mapping between an different extenders runtime type id, and a processing class from the extenders plugin
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="typeid" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Fully qualified runtime type id
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Fully qualified implementing class that must implement &lt;code&gt;org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.metadataprocessors.AbstractMetaDataEnabledFeature:org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.5
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2006 Oracle Corporation.
-All rights reserved. This program and the accompanying materials
-are made available under the terms of the Eclipse Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/epl-v10.html
- 
-Contributors:
-    Gerry Kessler/Oracle - initial API and implementation
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/externalcontext.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/externalcontext.exsd
deleted file mode 100644
index cea6bd2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/externalcontext.exsd
+++ /dev/null
@@ -1,113 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="externalcontext" name="External Context"/>
-      </appInfo>
-      <documentation>
-         Contributes a new factory to create IDTExternalContext&apos;s.  The id can then be set on a project to indicate that this factory should be used by DTFacesContext whenever an IDTExternalContext is requested.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="externalcontext"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="externalcontext">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique id of this external context provider.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The factory class to be used to instantiate new IDTExternalContext instances.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.designtime.context.AbstractDTExternalContextFactory"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.5
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright 2006 Oracle
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/grammar-annotations.xsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/grammar-annotations.xsd
deleted file mode 100644
index 8b4a47e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/grammar-annotations.xsd
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<xsd:schema
-	targetNamespace="http://org.eclipse.jst.jsf.core/grammarAnnotationSchema" 
-	version="1.0"
-	attributeFormDefault="unqualified"
-	elementFormDefault="unqualified" 
-	xmlns="http://org.eclipse.jst.jsf.core/grammarAnnotationSchema"
-	xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-	
-	<xsd:element name="grammar-annotations"
-		type="grammar-annotationType" />
-		
-	<xsd:complexType name="grammar-annotationType">
-		<xsd:sequence>
-			<xsd:element name="cm-element"
-				type="cm-elementType" minOccurs="1" maxOccurs="unbounded" />
-		</xsd:sequence>
-		<xsd:attribute name="caseSensitive" type="xsd:boolean" use="optional" default="true"/>
-	</xsd:complexType>
-	<xsd:complexType name="cm-elementType">
-		<xsd:sequence>
-			<xsd:element name="cm-attribute" type="cm-attributeType" minOccurs="0" maxOccurs="unbounded"/>
-			<xsd:element name="property" type="propertyType" minOccurs="0" maxOccurs="unbounded"/>
-		</xsd:sequence>
-		<xsd:attribute name="name" type="xsd:string" use="required"/>
-	</xsd:complexType>
-	<xsd:complexType name="cm-attributeType">
-		<xsd:sequence>
-			<xsd:element name="property"
-				type="propertyType" minOccurs="0" maxOccurs="unbounded"/>
-		</xsd:sequence>
-		<xsd:attribute name="name" type="xsd:string" use="required"/>
-	</xsd:complexType>
-	<xsd:complexType name="propertyType">
-		<xsd:sequence>
-			<xsd:element name="value" type="propertyValue" minOccurs="1" maxOccurs="unbounded"/>
-		</xsd:sequence>		
-		<xsd:attribute name="name" type="xsd:string" use="required"/>		
-	</xsd:complexType>
-	<xsd:complexType name="propertyValue">
-		<xsd:all></xsd:all>
-	</xsd:complexType>
-</xsd:schema>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/jsfLibraries.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/jsfLibraries.exsd
deleted file mode 100644
index cfb5f58..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/jsfLibraries.exsd
+++ /dev/null
@@ -1,161 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="jsfLibraries" name="JSF Libraries"/>
-      </appInfo>
-      <documentation>
-         This extension point allows clients to create named sets of jars for use with JavaServer Faces Applications.
-&lt;b&gt;Deprecated&lt;/b&gt; - adopters should now use &lt;code&gt;org.eclipse.jst.jsf.core.pluginProvidedJsfLibraries&lt;/code&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="jsfLibrary" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="jsfLibrary">
-      <annotation>
-         <documentation>
-            A named collection of jars that will be added to the classpath as a classpath container to a project that references it.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A unique name for the library.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="isImplementation" type="boolean" use="required">
-            <annotation>
-               <documentation>
-                  Flag indicating that this libary is declared to be a JSF implementation and not just a JSF component library.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="maxVersionSupported">
-            <annotation>
-               <documentation>
-                  Used to declare which JSF specification this library will support.
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="v1_1">
-                  </enumeration>
-                  <enumeration value="v1_2">
-                  </enumeration>
-                  <enumeration value="UNKNOWN">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="archiveFilesDelegate" type="string" use="required">
-            <annotation>
-               <documentation>
-                  class that must extend org.eclipse.jst.jsf.core.jsflibraryregistry.JSFLibraryArchiveFilesDelegate to supply a collection of ArchiveFiles for the library
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.core.jsflibraryregistry.JSFLibraryArchiveFilesDelegate"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.5
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of usage of pluginProvidedJsfLibraries extension point:
-
-&lt;p&gt;
-&lt;pre&gt;
-  &lt;extension point=&quot;org.eclipse.jst.jsf.core.jsfLibraries&quot;&gt;
-    &lt;jsfLibrary       
-       name=&quot;MyComponentLib1&quot;
-       isImplementation=&quot;false&quot;
-       maxVersionSupported=&quot;v1_1&quot;
-       archiveFilesDelegate=&quot;com.acme.jsf.libraries.MyComponentLibraryFiles&quot;/&gt;
-  &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute class must be a fully qualified name of a Java class that extends the abstract class &lt;code&gt;org.eclipse.jst.jsf.core.jsflibraryregistry.JSFLibraryArchiveFilesDelegate&lt;/code&gt; and has a public 0-arg constructor.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         none
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005, 2007 Oracle Corporation.
-All rights reserved. This program and the accompanying materials
-are made available under the terms of the Eclipse Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/epl-v10.html
-
-Contributors:
-Gerry Kessler - initial API and implementation
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/methodresolver.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/methodresolver.exsd
deleted file mode 100644
index 57b83d5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/methodresolver.exsd
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="methodresolver" name="Method Resolver"/>
-      </appInfo>
-      <documentation>
-         Allows a third-party to define an alternative instance of the design time method resolver.  This id can then be set on a project using DesignTimeApplicationManager.setMethodResolverProvider.  Once set on a project this id will be used to load the active design time method resolver.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="methodresolver"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="methodresolver">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id to be used to identify this method resolver.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The class implementing the method resolver.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.designtime.el.AbstractDTMethodResolver"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.5
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;The following example defines a new method resolver implemented by CustomDTMethodResolver&lt;/p&gt;
-
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.jst.jsf.designtime.methodresolver&quot;&gt;
-      &lt;methodresolver
-            class=&quot;org.eclipse.jst.jsf.dtresolver.test.resolvers.CustomDTMethodResolver&quot;
-            id=&quot;org.eclipse.jst.jsf.dtresolver.test.methodresolver2&quot;/&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright 2006 Oracle
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/pluginProvidedJsfLibraries.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/pluginProvidedJsfLibraries.exsd
deleted file mode 100644
index 802062f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/pluginProvidedJsfLibraries.exsd
+++ /dev/null
@@ -1,176 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="pluginProvidedJsfLibraries" name="JSF Libraries"/>
-      </appInfo>
-      <documentation>
-         This extension point allows clients to create named sets of jars for use with JavaServer Faces Applications.
-
-&lt;p&gt;&lt;b&gt;This extension point is provisional and subject to change&lt;/b&gt;&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="jsfLibrary" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="jsfLibrary">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="name"/>
-         </appInfo>
-         <documentation>
-            A named collection of jars that will be added to the classpath as a classpath container to a project that references it.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A unique, non-translatable, name for the library.  The plugin developer is responsible for ensuring uniqueness within the plugin.  This name, in combination with the plugin id, is used to identify the classpath container reference.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string">
-            <annotation>
-               <documentation>
-                  Translatable string for displaying the library name.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="isImplementation" type="boolean" use="required">
-            <annotation>
-               <documentation>
-                  Flag indicating that this libary is declared to be a JSF implementation and not just a JSF component library.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="maxVersionSupported">
-            <annotation>
-               <documentation>
-                  Used to declare which JSF specification this library will support.
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="v1_1">
-                  </enumeration>
-                  <enumeration value="v1_2">
-                  </enumeration>
-                  <enumeration value="UNKNOWN">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="archiveFilesDelegate" type="string" use="required">
-            <annotation>
-               <documentation>
-                  class that must extend org.eclipse.jst.jsf.core.jsflibraryregistry.JSFLibraryArchiveFilesDelegate to supply a collection of IPaths to jars in the library
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.core.jsflibraryregistry.PluginProvidedJSFLibraryArchiveFilesDelegate"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         2.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of usage of pluginProvidedJsfLibraries extension point:
-
-&lt;p&gt;
-&lt;pre&gt;
-  &lt;extension point=&quot;org.eclipse.jst.jsf.core.pluginProvidedJsfLibraries&quot;&gt;
-    &lt;jsfLibrary       
-       name=&quot;MyComponentLib1&quot;
-       label=&quot;%MyComponentLib1.translatableLabel&quot;
-       isImplementation=&quot;false&quot;
-       maxVersionSupported=&quot;v1_1&quot;
-       archiveFilesDelegate=&quot;com.acme.jsf.libraries.MyComponentLibraryFiles&quot;/&gt;
-  &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute class must be a fully qualified name of a Java class that extends the abstract class &lt;code&gt;org.eclipse.jst.jsf.core.jsflibraryregistry.PluginProvidedJSFLibraryJarFilesDelegate&lt;/code&gt; and has a public 0-arg constructor.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         none
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2007 Oracle Corporation.
-All rights reserved. This program and the accompanying materials
-are made available under the terms of the Eclipse Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/epl-v10.html
-
-Contributors:
-Gerry Kessler - initial API and implementation
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/propertyresolver.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/propertyresolver.exsd
deleted file mode 100644
index 4ec0f67..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/propertyresolver.exsd
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="propertyresolver" name="Property Resolver"/>
-      </appInfo>
-      <documentation>
-         Allows a third-party to define an alternative instance of the design time property resolver.  This id can then be set on a project using DesignTimeApplicationManager.setPropertyResolverProvider.  Once set on a project this id will be used to load the active design time property resolver.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="propertyresolver"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="propertyresolver">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id to be used to identify this property resolver.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The class implementing the property resolver.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.designtime.el.AbstractDTPropertyResolver"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.5
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;The following example defines a new property resolver implemented by CustomDTPropertyResolver&lt;/p&gt;
-
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.jst.jsf.designtime.propertyresolver&quot;&gt;
-      &lt;propertyresolver
-            class=&quot;org.eclipse.jst.jsf.dtresolver.test.resolvers.CustomDTPropertyResolver&quot;
-            id=&quot;org.eclipse.jst.jsf.dtresolver.test.propertyresolver2&quot;/&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright 2006 Oracle
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/variableresolver.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/variableresolver.exsd
deleted file mode 100644
index d293cca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/variableresolver.exsd
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="variableresolver" name="Variable Resolver"/>
-      </appInfo>
-      <documentation>
-         Allows a third-party to define an alternative instance of the design time variable resolver.  This id can then be set on a project using DesignTimeApplicationManager.setVariableResolverProvider.  Once set on a project this id will be used to load the active design time variable resolver.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="variableresolver"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="variableresolver">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id to be used to identify this property resolver.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The class implementing the property resolver.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.jsf.designtime.el.AbstractDTVariableResolver"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.5
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;The following example defines a new variable resolver implemented by CustomDTVariableResolver&lt;/p&gt;
-
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.jst.jsf.designtime.variableresolver&quot;&gt;
-      &lt;variableresolver
-            class=&quot;org.eclipse.jst.jsf.dtresolver.test.resolvers.CustomDTVariableResolver&quot;
-            id=&quot;org.eclipse.jst.jsf.dtresolver.test.variableresolver1&quot;/&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright 2006 Oracle
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/IJSFCoreConstants.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/IJSFCoreConstants.java
deleted file mode 100644
index 7e2d9c8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/IJSFCoreConstants.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core;
-
-/**
- * JSF Core framework constants
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public final class IJSFCoreConstants 
-{
-    /**
-     * The global id for the JSF facet
-     * TODO: align with extensioin point through plugin.properties
-     */
-    public static final String JSF_CORE_FACET_ID = "jst.jsf"; //$NON-NLS-1$
-    /**
-     * The facet version for a JSF 1.0 project
-     * TODO: align with extensioin point through plugin.properties
-     */
-    public final static String                  FACET_VERSION_1_0 = "1.0"; //$NON-NLS-1$
-    /**
-     * The constant id for a JSF 1.0 project
-     */
-    public final static String                  JSF_VERSION_1_0 = FACET_VERSION_1_0;
-    /**
-     * The facet version for a JSF 1.1 project
-     * TODO: align with extensioin point through plugin.properties
-     */
-    public final static String                  FACET_VERSION_1_1 = "1.1"; //$NON-NLS-1$
-    /**
-     * The constant id for a JSF 1.1 project
-     */
-    public final static String                  JSF_VERSION_1_1 = FACET_VERSION_1_1;
-    /**
-     * The facet version for a JSF 1.2 project
-     * TODO: align with extensioin point through plugin.properties
-     */
-    public final static String                  FACET_VERSION_1_2 = "1.2";//$NON-NLS-1$
-    /**
-     * The constant id for a JSF 1.2 project
-     */
-    public final static String                  JSF_VERSION_1_2 = FACET_VERSION_1_2;
-    
-    private IJSFCoreConstants()
-    {
-        // no instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/JSFVersion.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/JSFVersion.java
deleted file mode 100644
index e1d3aaf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/JSFVersion.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core;
-
-/**
- * @author gekessle
- *
- */
-public enum JSFVersion {
-	
-	/**
-	 * Unknown version support
-	 */
-	UNKNOWN,
-	/**
-	 * Supports JSF Version 1.0
-	 */
-	V1_0,
-	/**
-	 * Supports JSF Version 1.1
-	 */
-	V1_1,
-	/**
-	 * Supports JSF Version 1.1
-	 */
-	V1_2;
-	
-    @Override
-    public String toString() {
-        switch(this)
-        {
-            case V1_0:
-                return IJSFCoreConstants.JSF_VERSION_1_0;
-            case V1_1:
-                return IJSFCoreConstants.JSF_VERSION_1_1;
-            case V1_2:
-                return IJSFCoreConstants.JSF_VERSION_1_2;
-            case UNKNOWN:
-                return "unknown";
-            default:
-                throw new IllegalStateException("Missing string conversion: "+this.name());
-        }
-    }
-
-    /**
-     * @param valueAsString
-     * @return the reverse mapping to an enum from toString() returns
-     */
-    public static JSFVersion valueOfString(String  valueAsString)
-    {
-        if (IJSFCoreConstants.JSF_VERSION_1_0.equals(valueAsString))
-        {
-            return V1_0;
-        }
-        else if (IJSFCoreConstants.JSF_VERSION_1_1.equals(valueAsString))
-        {
-            return V1_1;
-        }
-        else if (IJSFCoreConstants.JSF_VERSION_1_2.equals(valueAsString))
-        {
-            return V1_2;
-        }
-        else if ("unknown".equals(valueAsString))
-        {
-            return UNKNOWN;
-        }
-        else
-        {
-            return null;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/IJSFPreferenceModel.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/IJSFPreferenceModel.java
deleted file mode 100644
index 13af43b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/IJSFPreferenceModel.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial implementation
- *******************************************************************************/ 
-
-package org.eclipse.jst.jsf.core.internal;
-
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * Defines a generic JSF preferences model
- * 
- * @author cbateman
- *
- */
-public interface IJSFPreferenceModel 
-{
-    /**
-     * Loads the object from the preference store provided
-     * 
-     * @param prefStore
-     */
-    public void load(IPreferenceStore  prefStore);
-    
-    /**
-     * Copies the object into the preference store but DOES NOT SAVE IT
-     * 
-     * @param prefStore
-     */
-    public void commit(IPreferenceStore prefStore);
-    
-    /**
-     * Reverts the model to it's defaults.  Does not commit to pref store. 
-     */
-    public void setDefaults();
-
-    /**
-     * @param context
-     * @param key
-     * @return the preference value in context with using key as the id
-     */
-    public Object getValueByKey(final IScopeContext context, final String key);
-
-    /**
-     * @param context
-     * @param key
-     * @return the preference value in context using key as the id and drawing
-     * it directly from the preference store
-     */
-    public Object getStoredValueByKey(final IScopeContext context, final String key);
-    
-    /**
-     * Set the preference value indicated by key in context to value.  May
-     * throw ClassCastException if value is not the type expected for the key
-     * @param context
-     * @param key
-     * @param value
-     * @return the old value
-     */
-    public Object setValueByKey(final IScopeContext context, final String key, final Object value);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFCorePlugin.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFCorePlugin.java
deleted file mode 100644
index d93286e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFCorePlugin.java
+++ /dev/null
@@ -1,312 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *    Ian Trimble - JSFLibraryRegistry work
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal;
-
-import java.util.Collections;
-import java.util.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.ILog;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.jsf.designtime.context.AbstractDTExternalContextFactory;
-import org.eclipse.jst.jsf.designtime.el.AbstractDTMethodResolver;
-import org.eclipse.jst.jsf.designtime.el.AbstractDTPropertyResolver;
-import org.eclipse.jst.jsf.designtime.el.AbstractDTVariableResolver;
-import org.eclipse.ui.preferences.ScopedPreferenceStore;
-import org.eclipse.wst.common.frameworks.internal.WTPPlugin;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-
-/**
- * JSF Core plugin.
- * 
- * @author Gerry Kessler - Oracle, Ian Trimble - Oracle
- */
-public class JSFCorePlugin extends WTPPlugin {
-	/**
-	 * The plugin id
-	 */
-	public static final String PLUGIN_ID = "org.eclipse.jst.jsf.core";//org.eclipse.jst.jsf.core.internal.JSFCorePlugin"; //$NON-NLS-1$
-
-	// The shared instance.
-	private static JSFCorePlugin plugin;
-	
-    private IPreferenceStore  preferenceStore;
-
-	/**
-	 * The constructor.
-	 */
-	public JSFCorePlugin() {
-		plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 * @param context 
-	 * @throws Exception 
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 * @param context 
-	 * @throws Exception 
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 * @return the shared instance
-	 */
-	public static JSFCorePlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * @param e
-	 * @param msg
-	 */
-	public static void log(final Exception e, final String msg) {
-		final ILog log = getDefault().getLog();
-
-		log.log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.OK, msg, e));
-	}
-
-	/**
-	 * Logs using the default ILog implementation provided by getLog().
-	 * 
-	 * @param severity Severity (IStatus constant) of log entry
-	 * @param message Human-readable message describing log entry
-	 * @param ex Throwable instance (can be null)
-	 */
-	public static void log(int severity, String message, Throwable ex) {
-		getDefault().getLog().log(new Status(severity, PLUGIN_ID, IStatus.OK, message, ex));
-	}
-
-	/**
-	 * Logs using the default ILog implementation provided by getLog().
-	 * 
-	 * @param severity Severity (IStatus constant) of log entry
-	 * @param message Human-readable message describing log entry
-	 */
-	public static void log(int severity, String message) {
-		log(severity, message, null);
-	}
-
-    /**
-     * Logs a message for this plugin
-     * 
-     * @param message
-     * @param t
-     */
-    public static void log(String message, Throwable t)
-    {
-        ILog log = plugin.getLog();
-        log.log(
-           new Status(
-             IStatus.ERROR, plugin.getBundle().getSymbolicName(), 0, message, t));
-    }
-    
-	public String getPluginID() {
-		return PLUGIN_ID;
-	}
-
-    /**
-     * @return all registered symbol source providers
-     */
-    public synchronized static Map<String, AbstractDTVariableResolver> getVariableResolvers()
-    {
-        if (_registeredVariableResolvers == null)
-        {
-            registerVariableResolverProviders();
-            if (_registeredVariableResolvers == null)
-            {
-                throw new AssertionError("registerProviders failed"); //$NON-NLS-1$
-            }
-        }
-        return Collections.unmodifiableMap(_registeredVariableResolvers);
-    }
-    
-    private static Map<String, AbstractDTVariableResolver>    _registeredVariableResolvers;
-    private final static String VARIABLE_RESOLVER_EXT_POINT_NAME = "variableresolver"; //$NON-NLS-1$
-    
-    private static void registerVariableResolverProviders()
-    {
-        _registeredVariableResolvers = new HashMap();
-        loadRegisteredExtensions(VARIABLE_RESOLVER_EXT_POINT_NAME,
-                                _registeredVariableResolvers,
-                                VARIABLE_RESOLVER_EXT_POINT_NAME);
-    }
-    
-    /**
-     * @return a map of all registered property resolvers by id
-     */
-    public synchronized static Map<String, AbstractDTPropertyResolver> getPropertyResolvers()
-    {
-        if (_registeredPropertyResolvers == null)
-        {
-            registerPropertyResolverProviders();
-            if (_registeredPropertyResolvers == null)
-            {
-                throw new AssertionError("registerProviders failed"); //$NON-NLS-1$
-            }
-        }
-        return Collections.unmodifiableMap(_registeredPropertyResolvers);
-    }
-    
-    private static Map<String, AbstractDTPropertyResolver>    _registeredPropertyResolvers;
-    private final static String PROPERTY_RESOLVER_EXT_POINT_NAME = 
-                                                             "propertyresolver"; //$NON-NLS-1$
-    
-    private static void registerPropertyResolverProviders()
-    {
-        _registeredPropertyResolvers = new HashMap();
-        loadRegisteredExtensions(PROPERTY_RESOLVER_EXT_POINT_NAME,
-                                _registeredPropertyResolvers,
-                                PROPERTY_RESOLVER_EXT_POINT_NAME);
-    }
-    
-    
-    /**
-     * @return a map of all registered method resolvers by id
-     */
-    public synchronized static Map<String, AbstractDTMethodResolver> getMethodResolvers()
-    {
-        if (_registeredMethodResolvers == null)
-        {
-            registerMethodResolverProviders();
-            if (_registeredMethodResolvers == null)
-            {
-                throw new AssertionError("registerProviders failed"); //$NON-NLS-1$
-            }
-        }
-        return Collections.unmodifiableMap(_registeredMethodResolvers);
-    }
-
-    private static Map<String, AbstractDTMethodResolver>     _registeredMethodResolvers;
-    private final static String METHOD_RESOLVER_EXT_POINT_NAME = 
-                                                               "methodresolver"; //$NON-NLS-1$
-    
-    private static void registerMethodResolverProviders()
-    {
-        _registeredMethodResolvers = new HashMap();
-        loadRegisteredExtensions(METHOD_RESOLVER_EXT_POINT_NAME,
-                _registeredMethodResolvers,
-                METHOD_RESOLVER_EXT_POINT_NAME);
-
-    }
-
-    /**
-     * @return a map of all registered external context providers by id
-     */
-    public synchronized static Map<String, AbstractDTExternalContextFactory> getExternalContextProviders()
-    {
-        if (_registeredExternalContextProviders == null)
-        {
-            registerExternalContextProviders();
-            if (_registeredExternalContextProviders == null)
-            {
-                throw new AssertionError("registerProviders failed"); //$NON-NLS-1$
-            }
-        }
-        return Collections.unmodifiableMap(_registeredExternalContextProviders);
-    }
-    
-    private static Map<String, AbstractDTExternalContextFactory>     _registeredExternalContextProviders;
-    private final static String EXTERNAL_CONTEXT_EXT_POINT_NAME = 
-                                                               "externalcontext"; //$NON-NLS-1$
-
-    private static void registerExternalContextProviders()
-    {
-        _registeredExternalContextProviders = new HashMap();
-        loadRegisteredExtensions(EXTERNAL_CONTEXT_EXT_POINT_NAME,
-                                 _registeredExternalContextProviders,
-                                 EXTERNAL_CONTEXT_EXT_POINT_NAME);
-    }
-    
-    private static <ResolverProvider> void loadRegisteredExtensions(final String extName,
-                                                 final Map<String, ResolverProvider>    registry,
-                                                 final String elementName)
-    {
-        final IExtensionPoint point = Platform.getExtensionRegistry().
-        getExtensionPoint(plugin.getBundle().getSymbolicName(), 
-                extName);
-        final IExtension[] extensions = point.getExtensions();
-
-        for (int i = 0; i < extensions.length; i++)
-        {
-            final IExtension extension = extensions[i];
-            final IConfigurationElement[] elements = 
-                extension.getConfigurationElements();
-            final String bundleId = extension.getContributor().getName();
-            
-            for (int j = 0; j < elements.length; j++)
-            {
-                final IConfigurationElement element = elements[j];
-                if (elementName.equals(element.getName())
-                        && element.getAttribute("class") != null //$NON-NLS-1$
-                        && element.getAttribute("id") != null) //$NON-NLS-1$
-                {
-                    final String factoryClassName = element.getAttribute("class"); //$NON-NLS-1$
-                    final String id = element.getAttribute("id"); //$NON-NLS-1$
-                    final Bundle bundle = Platform.getBundle(bundleId);
-                    
-                    if (bundle != null)
-                    {
-                        try
-                        {
-                            final Class factoryClass = 
-                                bundle.loadClass(factoryClassName);
-                            
-                            final Object variableResolver= 
-                                factoryClass.newInstance();
-    
-                            registry.put(id, (ResolverProvider) variableResolver);
-                        }
-                        catch (Exception e)
-                        {
-                            final ILog        logger_ = getDefault().getLog();
-                            logger_.log(new Status(IStatus.ERROR, plugin.getBundle()
-                                    .getSymbolicName(), 0, 
-                                    "Error loading resolver provider extension point",e)); //$NON-NLS-1$
-                        }
-                    }
-                }
-            }
-        }
-    }
-    
-    /**
-     * @return the preference store for this bundle
-     * TODO: this is copied from AbstractUIPlugin; need to upgrade to new IPreferencesService
-     */
-    public IPreferenceStore getPreferenceStore() {
-        // Create the preference store lazily.
-        if ( this.preferenceStore == null) {
-            this.preferenceStore = new ScopedPreferenceStore(new InstanceScope(),getBundle().getSymbolicName());
-
-        }
-        return this.preferenceStore;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFLibrariesContainerInitializer.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFLibrariesContainerInitializer.java
deleted file mode 100644
index d8d443c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFLibrariesContainerInitializer.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.ClasspathContainerInitializer;
-import org.eclipse.jdt.core.IClasspathContainer;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryConfigurationHelper;
-
-/**
- * Initialize JSF Libraries as classpath containers
- */
-public class JSFLibrariesContainerInitializer extends
-		ClasspathContainerInitializer {
-
-	private static final String MISSING_LIBRARY = Messages.JSFLibrariesContainerInitializer_missing_library;
-
-	/**
-	 * Constructor
-	 */
-	public JSFLibrariesContainerInitializer() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.core.ClasspathContainerInitializer#initialize(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject)
-	 */
-	public void initialize(IPath containerPath, IJavaProject project) throws CoreException {
-		if (isJSFLibraryContainer(containerPath)) {
-			String libId= containerPath.lastSegment();
-						
-			JSFLibrary ref= JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getJSFLibraryByID(libId);
-			if (ref != null) {
-				JSFLibraryClasspathContainer container= new JSFLibraryClasspathContainer(ref);
-				JavaCore.setClasspathContainer(containerPath, new IJavaProject[] { project }, 	new IClasspathContainer[] { container }, null);
-			}
-		}
-	}
-	
-	private boolean isJSFLibraryContainer(IPath path) {
-		return path != null && path.segmentCount() == 2 && JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID.equals(path.segment(0));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.core.ClasspathContainerInitializer#canUpdateClasspathContainer(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject)
-	 */
-	public boolean canUpdateClasspathContainer(IPath containerPath, IJavaProject project) {
-		return isJSFLibraryContainer(containerPath); 
-	}
-
-	/**
-	 * @see org.eclipse.jdt.core.ClasspathContainerInitializer#getDescription(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject)
-	 */
-	public String getDescription(IPath containerPath, IJavaProject project) {
-		if (isJSFLibraryContainer(containerPath)) {
-			String id = containerPath.lastSegment();
-			JSFLibrary libref = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getJSFLibraryByID(id);
-			String displayText = id;
-
-			if (libref == null){
-				displayText = displayText + " " + MISSING_LIBRARY; //$NON-NLS-1$
-			}
-			
-			return displayText;
-		}
-		return super.getDescription(containerPath, project);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.core.ClasspathContainerInitializer#getComparisonID(org.eclipse.core.runtime.IPath, org.eclipse.jdt.core.IJavaProject)
-	 */
-	public Object getComparisonID(IPath containerPath, IJavaProject project) {
-		return containerPath;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFLibraryClasspathContainer.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFLibraryClasspathContainer.java
deleted file mode 100644
index ab3d50c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFLibraryClasspathContainer.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathContainer;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryConfigurationHelper;
-
-
-/**
- * JSF Library classpath container
- */
-public class JSFLibraryClasspathContainer implements IClasspathContainer {
-	private static final String NON_IMPL_DESC = Messages.JSFLibraryClasspathContainer_NON_IMPL_LIBRARY;
-	private static final String IMPL_DESC = Messages.JSFLibraryClasspathContainer_IMPL_LIBRARY;
-	
-	private JSFLibrary lib;
-	
-	/**
-	 * @param lib 
-	 */
-	public JSFLibraryClasspathContainer(JSFLibrary lib) {
-		this.lib = lib;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.core.IClasspathContainer#getClasspathEntries()
-	 */
-	public IClasspathEntry[] getClasspathEntries() {
-		return JSFLibraryRegistryUtil.getInstance().getClasspathEntries(lib);		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.core.IClasspathContainer#getDescription()
-	 */
-	public String getDescription() {
-		StringBuffer buf = new StringBuffer(lib.getLabel());
-		buf.append(" "); //$NON-NLS-1$
-		if (lib.isImplementation())
-			buf.append(IMPL_DESC);
-		else
-			buf.append(NON_IMPL_DESC);
-		
-		return buf.toString();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.core.IClasspathContainer#getKind()
-	 */
-	public int getKind() {
-		return IClasspathContainer.K_APPLICATION;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.core.IClasspathContainer#getPath()
-	 */
-	public IPath getPath() {		
-		return new Path(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID).append(this.lib.getID());
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFRegistryVersionInfo.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFRegistryVersionInfo.java
deleted file mode 100644
index 19fa696..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFRegistryVersionInfo.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal;
-
-import org.osgi.framework.Version;
-
-/**
- * A value object the describes the current and expected state of the JSF Library
- * Registry
- * 
- * @author cbateman
- *
- */
-final class JSFRegistryVersionInfo 
-{
-    private Version     _curVersion;        // the version of the current registry on disk
-    private Version     _expectedVersion;   // the expected or required version of the registry
-    
-    JSFRegistryVersionInfo(Version oldVersion, Version expectedVersion) 
-    {
-        super();
-        _curVersion = oldVersion;
-        _expectedVersion = expectedVersion;
-    }
-
-    /**
-     * @return the version of the registry found in the current workspace
-     */
-    public Version getCurVersion() {
-        return _curVersion;
-    }
-
-    /**
-     * @return the version of the registry that is expected
-     */
-    public Version getExpectedVersion() {
-        return _expectedVersion;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/Messages.java
deleted file mode 100644
index a98eafd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/Messages.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *    Ian Trimble - changed to work correctly with org.eclipse.osgi.util.NLS
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler.
- * 
- * @author Gerry Kessler - Oracle, Ian Trimble - Oracle
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.core.internal.messages"; //$NON-NLS-1$
-
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFFacetInstallDataModelProvider_ClientImplValidationMsg;
-
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFFacetInstallDataModelProvider_DupeJarValidation;
-
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFFacetInstallDataModelProvider_INITIAL_VALIDATION_IMPL_TYPE;
-
-
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFLibCfgDialogSettingData_Sticky_Component_Lib_Not_Exist;
-
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFLibrariesContainerInitializer_missing_library;
-
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFLibraryClasspathContainer_IMPL_LIBRARY;
-
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFLibraryClasspathContainer_NON_IMPL_LIBRARY;
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigModel_Null_Data_Source;
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigPersistData_SAVED_COMPLIB_NOT_FOUND;
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigPersistData_SAVED_IMPLLIB_NOT_FOUND;
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryRegistry_ErrorCreatingURL;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryRegistry_NoLoadCreatingNew;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryRegistry_ErrorSaving;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryRegistry_DEFAULT_IMPL_LABEL;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryRegistry_ErrorLoadingFromExtPt;
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallDataModelProvider_ValidateServletName;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallDataModelProvider_ValidateJSFImpl;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallDataModelProvider_ValidateConfigFileEmpty;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallDataModelProvider_ValidateConfigFilePath;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallDataModelProvider_ValidateConfigFileRelative1;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallDataModelProvider_ValidateConfigFileRelative2;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallDataModelProvider_ValidateConfigFileXML;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallDataModelProvider_ValidateConfigFileSlashes;
-
-    /**
-     * see messages.properties
-     */
-	public static String ArchiveFileImpl_CannotCopyFile;
-    /**
-     * see messages.properties
-     */
-	public static String ArchiveFileImpl_CannotCloseFile;
-    /**
-     * see messages.properties
-     */
-	public static String ArchiveFileImpl_CannotLocatePluginRelativeFile;
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFUtils_MissingJAR;
-
-    /**
-     * see messages.properties
-     */
-	public static String PluginProvidedJSFLibraryCreationHelper_ErrorCreating;
-    /**
-     * see messages.properties
-     */
-	public static String PluginProvidedJSFLibraryCreationHelper_ErrorMultipleDefinition;
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFUtils_ErrorCreatingConfigFile;
-    /**
-     * see messages.properties
-     */
-	public static String JSFUtils_ErrorClosingConfigFile;
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFAppConfigUtils_ErrorOpeningJarFile;
-
-    /**
-     * see messages.properties
-     */
-	public static String JARFileJSFAppConfigProvider_ErrorLoadingModel;
-
-    /**
-     * see messages.properties
-     */
-	public static String J2EEModuleDependencyDelegate_UpdatingJ2EEModuleDependencies;
-    /**
-     * see messages.properties
-     */
-	public static String J2EEModuleDependencyDelegate_UpdatingJ2EEModuleDependenciesForProject;
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFRegistryMigration05_to_10_title;
-    /**
-     * see messages.properties
-     */
-	public static String JSFRegistryMigration05_to_10_message;
-
-    /**
-     * see messages.properties
-     */
-    public static String JSFRegistryMigration05_to_10_customMessage;
-    
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFRegistryMigrationCannot05_to_10_title;
-    /**
-     * see messages.properties
-     */
-	public static String JSFRegistryMigrationCannot05_to_10_message;
-
-    /**
-     * see messages.properties
-     */
-    public static String JSFRegistryMigrationCannot05_to_10_customMessage;
-
-
-	/**
-	 * see messages.properties
-	 */
-	public static String RegistryMigrationStartupHandler_Dialog_Abort_And_Exit_Migration;
-
-    /**
-     * see messages.properties
-     */
-	public static String RegistryMigrationStartupHandler_Dialog_Confirm_Migration;
-
-    /**
-     * see messages.properties
-     */
-	public static String RegistryMigrationStartupHandler_Error_committing_migration;
-
-    /**
-     * see messages.properties
-     */
-	public static String RegistryMigrationStartupHandler_Error_Rolling_Back_Migration;
-
-    /**
-     * see messages.properties
-     */
-	public static String RegistryMigrationStartupHandler_Launch_Migration_Doc_On_Confirm;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/RegistryUpgradeCommitHandler.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/RegistryUpgradeCommitHandler.java
deleted file mode 100644
index 8e3f0f7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/RegistryUpgradeCommitHandler.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util.JSFLibraryRegistryUpgradeUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util.UpgradeStatus;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
-
-/**
- * Commits registry migration
- * @author cbateman
- *
- */
-public class RegistryUpgradeCommitHandler
-{
-
-    /**
-     * handle migration
-     */
-    public static void commitMigrationIfNecessary()
-    {
-        JSFLibraryRegistryUpgradeUtil upgradeUtil =
-            JSFLibraryRegistryUpgradeUtil.getInstance();
-
-        UpgradeStatus status = upgradeUtil.getUpgradeStatus();
-
-        if (status.getSeverity() == IStatus.OK)
-        {
-        	if (status.isUpgradeOccurred())
-        	{
-        		handle05_to_10(status);
-        	}
-        }
-        else
-        {
-        	handleErrorInMigration(status);
-        }
-    }
-
-    private static void handle05_to_10(UpgradeStatus status)
-    {
-        PlatformUI.getWorkbench().getDisplay().asyncExec(new Handle05_to_10_migration(status));
-    }
-
-    private static void handleErrorInMigration(UpgradeStatus status)
-    {
-    	PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable()
-    	{
-    		public void run()
-    		{
-    			final Shell shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
-    			MessageDialog.openError(shell, "Serious Error Encountered!", "An unrecoverable error occurred while trying to migrate your JSF Library Registry to a newer version.  This may cause your library references to be broken in your JSF projects.");
-    		}
-    	});
-    }
-    
-    private static class Handle05_to_10_migration implements Runnable
-    {
-        private final UpgradeStatus     _status;
-
-        Handle05_to_10_migration(UpgradeStatus status)
-        {
-            _status = status;
-        }
-
-        public void run()
-        {
-            // no prompting necessary.  just commit.
-       		doConfirmed(false);
-        }
-        
-    	private void doConfirmed(boolean userWantsMigrationDocLaunch) {
-    		// delete V1 registry, leave backup file
-    		IStatus result = _status.commit();
-    		
-    		if (result.getSeverity() != IStatus.OK)
-    		{
-    			final Shell  shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
-    			MessageDialog.openError(shell, Messages.RegistryMigrationStartupHandler_Error_committing_migration, result.getMessage());
-    		}
-    		
-    		// if user confirmed, launch migration doc
-    		if (userWantsMigrationDocLaunch)
-				try {
-					IWorkbenchBrowserSupport browserSupport = 
-						PlatformUI.getWorkbench().getBrowserSupport();
-					URL url = new URL("http://wiki.eclipse.org/index.php/JSF_Library_Migration"); //$NON-NLS-1$
-					browserSupport.createBrowser("JSFMigrationDoc").openURL(url); //$NON-NLS-1$
-				} catch (PartInitException e) {
-					JSFCorePlugin.log(e,"Error handling migration"); //$NON-NLS-1$
-				} catch (MalformedURLException e) {
-					JSFCorePlugin.log(e,"Error handling migration"); //$NON-NLS-1$
-				}
-    	}
-    	
-//    	private void doAbortAndExit()
-//    	{
-//    		// rollback
-//    		IStatus result = _status.rollback();
-//    		
-//    		if (result.getSeverity() != IStatus.OK)
-//    		{
-//    			final Shell  shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
-//    			MessageDialog.openError(shell, Messages.RegistryMigrationStartupHandler_Error_Rolling_Back_Migration, result.getMessage());
-//    		}
-//    		// close workbench
-//    		PlatformUI.getWorkbench().close();
-//    	}
-//    }
-//    
-//    private static class ConfirmDialog extends MessageDialogWithToggle
-//    {
-//    	final static int	CONFIRMED = 0;
-//    	final static int	ABORT_AND_EXIT = 1;
-//    	
-//		/**
-//		 * @param parentShell
-//		 * @param dialogTitle
-//		 * @param dialogMessage
-//		 */
-//		public ConfirmDialog(Shell parentShell, String dialogTitle,
-//				String dialogMessage) {
-//			super(parentShell
-//					, dialogTitle
-//					, null
-//					, dialogMessage
-//					, WARNING
-//					, new String[] { Messages.RegistryMigrationStartupHandler_Dialog_Confirm_Migration, Messages.RegistryMigrationStartupHandler_Dialog_Abort_And_Exit_Migration }
-//					, ABORT_AND_EXIT
-//					, Messages.RegistryMigrationStartupHandler_Launch_Migration_Doc_On_Confirm, true);
-//		}
-//
-//		/**
-//		 * Override so that the button ids line up with the constants
-//		 * expected
-//		 * @param parent 
-//		 */
-//		protected void createButtonsForButtonBar(Composite parent) {
-//	        final String[] buttonLabels = getButtonLabels();
-//	        final Button[] buttons = new Button[buttonLabels.length];
-//	        final int defaultButtonIndex = getDefaultButtonIndex();
-//
-//	        for (int i = 0; i < buttonLabels.length; i++) {
-//	            String label = buttonLabels[i];
-//	            Button button = createButton(parent, i, label,
-//	                    defaultButtonIndex == i);
-//	            buttons[i] = button;
-//	 
-//	        }
-//	        setButtons(buttons);
-//		}
-//		
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/ContentAssistParser.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/ContentAssistParser.java
deleted file mode 100644
index c2f965e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/ContentAssistParser.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.core.internal.contentassist.el;
-
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTAddExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTAndExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTChoiceExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTEqualityExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTFunctionInvocation;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTLiteral;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTMultiplyExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTOrExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTRelationalExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTUnaryExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTValue;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTValuePrefix;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTValueSuffix;
-import org.eclipse.jst.jsp.core.internal.java.jspel.JSPELParser;
-import org.eclipse.jst.jsp.core.internal.java.jspel.JSPELParserConstants;
-import org.eclipse.jst.jsp.core.internal.java.jspel.JSPELParserVisitor;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ParseException;
-import org.eclipse.jst.jsp.core.internal.java.jspel.SimpleNode;
-import org.eclipse.jst.jsp.core.internal.java.jspel.Token;
-
-/**
- * Consumes an EL expression and converts into a completion prefix
- * 
- * @author cbateman
- *
- */
-public final class ContentAssistParser 
-{
-    /**
-     * @param relativePosition -- 1-based position in elText (first position is 1)
-     * @param elText
-     * @return a content assist strategy for the given position and el expression
-     * or null if one cannot be determined
-     */
-    public static ContentAssistStrategy getPrefix(final int relativePosition, final String elText)
-    {
-        if (elText == null)
-        {
-            return null;
-        }
-        else if ("".equals(elText.trim()))
-        {
-            return new IdCompletionStrategy("", "");
-        }
-        
-        final java.io.StringReader reader = new java.io.StringReader(elText);
-        final JSPELParser  parser = new JSPELParser(reader);
-        
-        try
-        {
-            final ASTExpression expr = parser.Expression();
-            final PrefixVisitor visitor = new PrefixVisitor(relativePosition, elText);
-            expr.jjtAccept(visitor, null);
-            return visitor.getPrefix();
-        }
-        catch (ParseException pe)
-        {
-            // TODO: handle parser by using current and expected tokens
-        }
-        
-        return null;
-    }
-    
-    private static class PrefixVisitor implements JSPELParserVisitor
-    {
-        private final int       _relativePos;
-        private final String    _fullText;
-        
-        private String          _curPrefix; // = null; initialized as tree is visited
-        private int             _prefixType;
-        private boolean         _prefixResolved;  // = false; set to true when the prefix is resolved
-        private String          _proposalStart = "";
-        
-        PrefixVisitor(final int relativePos, final String fullText)
-        {
-            _relativePos = relativePos;
-            _fullText = fullText;
-        }
-        
-        /**
-         * @return the prefix if resolved or null if not resolved
-         */
-        public ContentAssistStrategy getPrefix()
-        {
-            if (_prefixResolved)
-            {
-                switch(_prefixType)
-                {
-                    case ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION:
-                        return new FunctionCompletionStrategy(_curPrefix, _proposalStart);
-                    
-                    case ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION:
-                        return new IdCompletionStrategy(_curPrefix, _proposalStart);
-                    
-                    case ContentAssistStrategy.PREFIX_TYPE_EMPTY_EXPRESSION:
-                        return new IdCompletionStrategy("", _proposalStart);
-                        
-                    default:
-                        // do nothing; fall-through to return null
-                }
-            }
-
-            return null;
-        }
-        
-        public Object visit(ASTAddExpression node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTAndExpression node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTChoiceExpression node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTEqualityExpression node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTExpression node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTFunctionInvocation node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTLiteral node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTMultiplyExpression node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTOrExpression node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTRelationalExpression node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTUnaryExpression node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTValue node, Object data) 
-        {
-            // we're only in this value expr if it contains the cursor
-            if (testContainsCursor(node))
-            {
-                return node.childrenAccept(this, data);
-            }
-            
-            return null;
-        }
-
-        public Object visit(ASTValuePrefix node, Object data) 
-        {
-            // for now, only concern ourselves with simple (identifier) prefixes
-            if (!_prefixResolved
-                    && node.jjtGetNumChildren() == 0
-                    && node.getFirstToken().kind == JSPELParserConstants.IDENTIFIER)
-            {
-                _curPrefix = node.getFirstToken().image;
-                
-                if (testContainsCursor(node))
-                {
-                    // if the cursor is on this id, we don't need to visit
-                    // further since we know both the prefix -- the id -- and
-                    // the type -- it's an id completion
-                    _prefixType = ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION;
-                    int proposalLength = _relativePos - node.getFirstToken().beginColumn;
-					_proposalStart = node.getFirstToken().image.substring(0, proposalLength);
-                    _prefixResolved = true;
-                }
-            }
-            return node.childrenAccept(this, data);
-        }
-
-        public Object visit(ASTValueSuffix node, Object data) 
-        {
-            // for now, only deal with the simple .id suffix
-            Token lastToken = node.getLastToken();
-			if (node.jjtGetNumChildren() == 0)
-            {
-                if (!_prefixResolved
-                      && node.getFirstToken().kind == JSPELParserConstants.DOT)
-                {
-                    if (lastToken.kind == JSPELParserConstants.IDENTIFIER)
-                    {
-                        if (testContainsCursor(node))
-                        {
-                            _prefixType = ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION;
-                            int proposalStartLength = _relativePos - lastToken.beginColumn;
-                            if (proposalStartLength < 0) { // Cursor after firstToken start but before lastToken start?
-                            	proposalStartLength = 0;
-                            }
-							_proposalStart = lastToken.image.substring(0, proposalStartLength);
-                            _prefixResolved = true;
-                        }
-                        // only include this suffix on the path if the cursor is 
-                        // further to the right.  Thus for x.^y we get a prefix "x"
-                        // and for x.y.^z we get "x.y" since this the part we must
-                        // resolve the prefix for
-                        else
-                        {
-                            _curPrefix += node.getFirstToken().image + lastToken.image;
-                        }
-                    }
-                    else if (lastToken == node.getFirstToken())
-                    {
-                        if (testCursorImmediatelyAfter(node))
-                        {
-                            _prefixType = ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION;
-                            _prefixResolved = true;
-                        }
-                    }
-                }
-
-                return null;                
-            }
-            
-            if (node.getFirstToken().kind == JSPELParserConstants.LBRACKET)
-            {
-                // try to support ca inside the brackets
-                node.childrenAccept(this, data);
-            }
-
-            Object retValue =  node.childrenAccept(this, data);
-                
-            if (!_prefixResolved)
-            {
-                // if we haven't resolved the prefix yet, then we need
-                // to append this suffix value
-                _curPrefix += _fullText.substring(node.getFirstToken().beginColumn-1, node.getLastToken().endColumn);
-            }
-            
-            return retValue;
-        }
-
-        public Object visit(SimpleNode node, Object data) 
-        {
-            return node.childrenAccept(this, data);
-        }
-        
-        private boolean testCursorImmediatelyAfter(SimpleNode node)
-        {
-            return node.getLastToken().endColumn == _relativePos-1;
-        }
-        
-        /**
-         * "Containing a cursor" here is deemed to mean that current cursor
-         * position as indicated by _relativePos, is either directly before, on or
-         * directly after an expression.  For example, in a Value expression like
-         * 
-         *          x x x . y y y . z z z
-         *         ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
-         *         1 2 3 4 5 6 7 8 9 0 1 2
-         *         
-         * Position's 1-4 are on xxx, 5-8 are on yyy and 9-12 are on zzz
-         * 
-         * @param node
-         * @return true if the node "contains the cursor" (see above)
-         */
-        private boolean testContainsCursor(SimpleNode node)
-        {
-            return (node.getFirstToken().beginColumn <= _relativePos
-                    && node.getLastToken().endColumn+1 >= _relativePos);
-                
-        }
-    }
-    
-    private ContentAssistParser()
-    {
-        // utility class; not instantiable
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/ContentAssistStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/ContentAssistStrategy.java
deleted file mode 100644
index c1582cf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/ContentAssistStrategy.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.core.internal.contentassist.el;
-
-import java.util.List;
-
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-
-/**
- * Encapsulates an EL content assist completion prefix
- * 
- * @author cbateman
- *
- */
-public abstract class ContentAssistStrategy
-{
-	/**
-	 * ContentAssistStrategy type for a dot content assist completion
-	 */
-	public final static int  PREFIX_TYPE_DOT_COMPLETION = 0;
-	/**
-	 * ContentAssistStrategy type for an id content assist completion
-	 */
-	public final static int  PREFIX_TYPE_ID_COMPLETION = 1;
-    /**
-     * Completions for an empty expression
-     */
-    public final static int  PREFIX_TYPE_EMPTY_EXPRESSION = 2;
-	
-	private final int type;
-	private final String value;
-	private final String proposalStart;
-	
-	/**
-	 * @param type
-	 * @param value
-	 * @param proposalStart 
-	 */
-	public ContentAssistStrategy(final int type, final String value, final String proposalStart) 
-	{
-		super();
-		this.type = type;
-		this.value = value;
-		this.proposalStart = proposalStart;
-	}
-    
-	/**
-	 * @return the type of this completion prefix as defined by
-	 * one of the PREFIX_TYPE constants
-	 */
-	public final int getType() 
-	{
-		return type;
-	}
-    
-	/**
-	 * @return the token which this prefix is for
-	 */
-	public final String getValue() 
-	{
-		return value;
-	}
-    
-    /**
-     * @param context
-     * @return the list of proposals for this strategy.  Contents of the list
-     * must be of type ICompletionProposal
-     */
-    public abstract List getProposals(IStructuredDocumentContext context);
-
-	/**
-	 * @return the part of the proposal which was already typed when user invoked autocomplete
-	 */
-	public String getProposalStart() {
-		return proposalStart;
-	}
-
-	/**
-	 * @param completionList
-	 * @param proposal
-	 */
-	protected void addProposalsMatchingProposalStart(final List completionList, final ICompletionProposal[] proposal) {
-		final String start = getProposalStart();
-		for (int j = 0; j < proposal.length; j++) {
-            final String proposalString = proposal[j].getDisplayString();
-			//TODO Should use "real" proposal replacement instead of displayString:
-			if (proposalString.length() >= start.length() &&
-                    proposalString.substring(0, start.length()).equalsIgnoreCase(start))
-            {
-				completionList.add(proposal[j]);
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/FunctionCompletionStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/FunctionCompletionStrategy.java
deleted file mode 100644
index 77803d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/FunctionCompletionStrategy.java
+++ /dev/null
@@ -1,358 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.core.internal.contentassist.el;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jst.jsf.common.internal.types.CompositeType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider;
-import org.eclipse.jst.jsf.context.symbol.provider.ProposalCreationFactoryAdapter;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider.IProposalCreationFactory;
-import org.eclipse.jst.jsf.designtime.resolver.ISymbolContextResolver;
-import org.eclipse.jst.jsf.designtime.resolver.StructuredDocumentSymbolResolverFactory;
-import org.eclipse.jst.jsf.metadataprocessors.MetaDataEnabledProcessingFactory;
-import org.eclipse.jst.jsf.metadataprocessors.features.ELIsNotValidException;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues;
-import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * A completion strategy for function completions like:
- * 
- * v a r .
- *        ^ 
- *
- * @author cbateman
- *
- */
-public class FunctionCompletionStrategy extends ContentAssistStrategy 
-{
-    /**
-     * @param value
-     * @param proposalStart 
-     */
-    public FunctionCompletionStrategy(String value, String proposalStart) 
-    {
-        super(ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION, value, proposalStart);
-    }
-
-    public List getProposals(IStructuredDocumentContext context) 
-    {
-        final List completionList = new ArrayList();
-        
-        String[]  ids = getValue().split("\\.");
-        
-        // if no suffixes, only one id
-        if (ids.length < 1) 
-        {
-            ids = new String[] {getValue()};
-        }
-
-        final ISymbolContextResolver  symbolResolver = 
-            StructuredDocumentSymbolResolverFactory.getInstance().
-                getSymbolContextResolver(context);
-        
-        ISymbol symbol = null;
-        
-        if (symbolResolver != null)
-        {
-            symbol = symbolResolver.getVariable(ids[0]);
-        }
-        
-        if (symbol instanceof IInstanceSymbol
-                && ((IInstanceSymbol)symbol).isTypeResolved())
-        {
-            int  curSuffixIdx = 1;
-            
-            while 
-                (curSuffixIdx < ids.length
-                        && symbol != null) 
-            {
-                
-                final ISymbol[]  properties = 
-                    symbolResolver.getProperties(symbol);
-                    
-                // set symbol to null because hasn't been found yet
-                symbol = null;
-                
-                SEARCH_SYMBOL_NAME:for
-                    (int i = 0; i < properties.length; i++)
-                {
-                    final ISymbol element = properties[i];
-                    
-                    if (ids[curSuffixIdx].equals(element.getName()))
-                    {
-                        symbol = element;
-                        break SEARCH_SYMBOL_NAME;
-                    }
-                }
-                curSuffixIdx++;
-            }
-            
-            // if we get a completion symbol, get it's proposals
-            if (symbol instanceof IObjectSymbol)
-            {
-                final List expectedMethodBindings = new ArrayList();
-                ISymbol[] suffixes = getSymbols((IObjectSymbol) symbol, 
-                                                 context, 
-                                                 symbolResolver,
-                                                 expectedMethodBindings);
-
-                final ComposedAdapterFactory factory =
-                    new ComposedAdapterFactory(
-                           ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
-                final IProposalCreationFactory  creationInfo =
-                    new MyProposalFactory(context, getProposalStart().length(), 
-                                            expectedMethodBindings);
-                
-                for (int i = 0; i < suffixes.length; i++)
-                {
-                    final ISymbol propSymbol = suffixes[i];
-                    final Object  provider =  
-                      factory.adapt(propSymbol, IContentProposalProvider.class);
-                        
-                    if (provider instanceof IContentProposalProvider)
-                    {
-                        final ICompletionProposal[] proposal  = 
-                            ((IContentProposalProvider) provider).
-                                getProposals(propSymbol, creationInfo);
-                        if (proposal != null)
-                        {
-                        	addProposalsMatchingProposalStart(completionList,
-									proposal);
-                        }
-                    }
-                }
-            }
-        }
-
-        return completionList;
-    }
-
-	private ISymbol[] getSymbols(IObjectSymbol symbol, 
-                                 IStructuredDocumentContext context, 
-                                 ISymbolContextResolver  symbolResolver,
-                                 List   expectedMethodBindings)
-    {
-        List symbols = new ArrayList();
-
-        if (isMethodBindingExpected(context, expectedMethodBindings))
-        {
-            symbols.addAll(Arrays.asList(
-                          symbolResolver.getMethods(symbol)));
-        }
-
-        symbols.addAll(Arrays.asList(symbolResolver.getProperties(symbol)));
-
-        return (ISymbol[]) symbols.toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-    }
-    
-    private boolean isMethodBindingExpected(IStructuredDocumentContext context,
-                                            List            expectedBindings)
-    {
-        boolean  isMBExpected = false;  // assume false until we find it true
-        
-        final IDOMContextResolver  domResolver = 
-            IStructuredDocumentContextResolverFactory.INSTANCE.
-                getDOMContextResolver(context);
-        
-        final Node curNode = domResolver.getNode();
-        
-        if (curNode instanceof Attr)
-        {
-            final Attr attr = (Attr) curNode;
-            final Element element = attr.getOwnerElement();
-
-            final ITaglibContextResolver taglibResolver =
-                IStructuredDocumentContextResolverFactory.INSTANCE.
-                    getTaglibContextResolver(context);
-
-            final String uri = taglibResolver.getTagURIForNodeName(element);
-            
-            final List elVals = 
-                MetaDataEnabledProcessingFactory.getInstance()
-                    .getAttributeValueRuntimeTypeFeatureProcessors
-                        (IValidELValues.class, context, uri, 
-                                element.getLocalName(), attr.getLocalName());
-            
-            for (final Iterator it = elVals.iterator(); it.hasNext();)
-            {
-                final IValidELValues validValues = (IValidELValues) it.next();
-                
-                try
-                {
-                    CompositeType type = validValues.getExpectedRuntimeType();
-                    if (type != null
-                            && type.getAssignmentTypeMask()
-                                    == IAssignable.ASSIGNMENT_TYPE_NONE)
-                    {
-                        isMBExpected = true;
-                        expectedBindings.addAll(
-                                Arrays.asList(
-                                        validValues.
-                                            getExpectedRuntimeType().
-                                            getSignatures()));
-                    }
-                }
-                catch (ELIsNotValidException e)
-                {
-                    // do nothing
-                }
-            }
-        }
-
-        // default condition is no method binding
-        return isMBExpected;
-    }
-    
-    private static class MyProposalFactory extends ProposalCreationFactoryAdapter
-    {
-        private final static int   DEFAULT_RELEVANCE = 1;
-        
-        private final static int   HIGH_RELEVANCE = 2;
-        private final static int   NORMAL_RELEVANCE = 1;
-        private final static int   LOW_RELEVANCE = 0;
-        
-        private final List                         _expectedMethodBindings;
-        private final IStructuredDocumentContext   _context;
-        
-        /**
-         * @param context 
-         * @param replacementLength
-         * @param expectedMethodBindings 
-         */
-        public MyProposalFactory(IStructuredDocumentContext context, int replacementLength,
-                                    List expectedMethodBindings) {
-        	/*TODO I changed the meaning of "replacementLength" from "number of chars AFTER cursor to be
-        	 * replaced" to "number of chars BEFORE cursor to be replaced. Since "replacementLength"
-        	 * has always been 0 (constructor is only called by FunctionCompletionStrategy.getProposals()),
-        	 * this should not change anything, but I don't know if there have been different plans
-        	 * for "replacementLength".
-        	 * TODO Maybe this change should be done in the super class instead?
-        	 */
-            super(context.getDocumentPosition() - replacementLength, replacementLength);
-            _context = context;
-            _expectedMethodBindings = expectedMethodBindings;
-        }
-
-        public ICompletionProposal createProposal(String replacementText, 
-                                                  String displayText, 
-                                                  String additionalText, 
-                                                  Image displayImage,
-                                                  Object target) 
-        {
-            int replacementOffset = _replacementOffset;
-            int replacementLength = _replacementLength;
-            
-            // TODO: I regard this as a bit of hack, but until we write our 
-            // proposal implementation, it's basically the only way I can
-            // see to do this
-            // if it's an array, we must check if we need to replace a
-            // preceding '.'
-            if (replacementText.startsWith("["))
-            {
-                ITextRegionContextResolver textResolver = 
-                    IStructuredDocumentContextResolverFactory.INSTANCE.getTextRegionResolver(_context);
-                
-                if (textResolver.getRegionType().equals(DOMJSPRegionContexts.JSP_VBL_CLOSE))
-                {
-                    textResolver = 
-                        IStructuredDocumentContextResolverFactory.
-                            INSTANCE.getTextRegionResolver(textResolver.getPreviousContext());
-                }
-                
-                String regionText = textResolver.getRegionText();
-                int regionStart = textResolver.getStartOffset();
-                
-                if (DOMJSPRegionContexts.JSP_VBL_CONTENT.equals(textResolver.getRegionType())
-                        && regionText != null
-                        && regionStart != -1
-                        && regionStart < _context.getDocumentPosition())
-                {
-                    int  relativeOffset = _context.getDocumentPosition() - regionStart - 1;
-                    
-                    if (regionText.charAt(relativeOffset) == '.')
-                    {
-                        // we must replace a length of 1 (the dot)
-                        // at an offset on prior
-                        replacementOffset--;
-                        replacementLength = 1;
-                    }
-                }
-            }
-            
-            return createDefaultProposal(replacementText, 
-                                         replacementOffset, 
-                                         replacementLength, 
-                                         replacementText.length(), 
-                                         displayImage, 
-                                         displayText, 
-                                         null, 
-                                         additionalText, 
-                                         getRelevance(target, DEFAULT_RELEVANCE));
-        }
-
-        private int getRelevance(final Object target, final int defaultRelevance)
-        {
-            // if method bindings are expected, then list exact signature 
-            // matches top most.  Still list non-matching methods, but put 
-            // them at the bottom
-            if (_expectedMethodBindings.size() > 0)
-            {
-                if (target instanceof IMethodSymbol)
-                {
-                    final IMethodSymbol methodSymbol = (IMethodSymbol) target;
-                    
-                    for (final Iterator it = _expectedMethodBindings.iterator();
-                            it.hasNext();)
-                    {
-                        final String methodType = (String) it.next();
-                        
-                        // we have a match, so push to the top
-                        if (methodType.equals(methodSymbol.getSignature()))
-                        {
-                            return HIGH_RELEVANCE;
-                        }
-                    }
-                    
-                    // if we get out of the loop, then this method doesn't
-                    // match the expected signature
-                    return LOW_RELEVANCE;
-                }
-
-                // non-method targets have normal relevance when mb expected
-                return NORMAL_RELEVANCE;
-            }
- 
-            // otherwise, simply return the default for all
-            return defaultRelevance;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/IdCompletionStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/IdCompletionStrategy.java
deleted file mode 100644
index 83ccf55..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/contentassist/el/IdCompletionStrategy.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.core.internal.contentassist.el;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.symbol.ERuntimeSource;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider;
-import org.eclipse.jst.jsf.context.symbol.provider.ProposalCreationFactoryAdapter;
-import org.eclipse.jst.jsf.context.symbol.provider.IContentProposalProvider.IProposalCreationFactory;
-import org.eclipse.jst.jsf.designtime.resolver.ISymbolContextResolver;
-import org.eclipse.jst.jsf.designtime.resolver.StructuredDocumentSymbolResolverFactory;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * A strategy for getting completions for EL id completions like:
- * 
- *     var
- *     ^
- *     
- * @author cbateman
- *
- */
-class IdCompletionStrategy extends ContentAssistStrategy 
-{
-
-    /**
-     * Construct a strategy for completing an ID completion
-     * 
-     * @param prefixValue
-     * @param proposalStart - the part of the proposal which was already typed when user invoked autocomplete
-     */
-    public IdCompletionStrategy(final String prefixValue, String proposalStart) 
-    {
-        super(ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION, prefixValue, proposalStart);
-    }
-
-    /**
-     * @see org.eclipse.jst.jsf.core.internal.contentassist.el.ContentAssistStrategy#getProposals(org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext)
-     */
-    public List getProposals(IStructuredDocumentContext context) 
-    {
-        final List completionList = new ArrayList();
-        final IWorkspaceContextResolver workspaceResolver = 
-            IStructuredDocumentContextResolverFactory.INSTANCE.
-                getWorkspaceContextResolver(context);
-
-        final IFile  iFile = (IFile) workspaceResolver.getResource();
-
-        ISymbol[]       symbols = null;
-
-        if (iFile != null)
-        {
-            final ISymbolContextResolver  symbolResolver =
-                StructuredDocumentSymbolResolverFactory.getInstance().
-                    getSymbolContextResolver(context);
-            
-            symbols = symbolResolver.getAllVariables();
-        }
-
-        final ComposedAdapterFactory factory =
-            new ComposedAdapterFactory(ComposedAdapterFactory.
-                                                  Descriptor.Registry.INSTANCE);
-
-        final IProposalCreationFactory  creationInfo =
-           new MyProposalFactory(context.getDocumentPosition(), getProposalStart().length());
-
-        for (int i = 0; symbols != null && i < symbols.length; i++)
-        {
-            final ISymbol  symbol = symbols[i];
-
-            final Object  adapter =  
-                factory.adapt(symbol, IContentProposalProvider.class);
-                
-            if (adapter instanceof IContentProposalProvider)
-            {
-                final IContentProposalProvider  provider = 
-                    (IContentProposalProvider) adapter;
-                final ICompletionProposal[] proposal  = 
-                    provider.getProposals(symbol, creationInfo);
-                if (proposal != null)
-                {
-                	addProposalsMatchingProposalStart(completionList, proposal);
-                }
-            }
-        }
-
-        return completionList;
-    }
-    
-    private static class MyProposalFactory extends ProposalCreationFactoryAdapter
-    {
-        private final static int   HIGH_RELEVANCE = 2;
-        private final static int   NORMAL_RELEVANCE = 1;
-        private final static int   LOW_RELEVANCE = 0;
-
-        /**
-         * @param replacementOffset
-         * @param replacementLength
-         */
-        public MyProposalFactory(int replacementOffset, int replacementLength) 
-        {
-        	/*TODO I changed the meaning of "replacementLength" from "number of chars AFTER cursor to be
-        	 * replaced" to "number of chars BEFORE cursor to be replaced. Since "replacementLength"
-        	 * has always been 0 (constructor is only called by IdCompletionStrategy.getProposals()),
-        	 * this should not change anything, but I don't know if there have been different plans
-        	 * for "replacementLength".
-        	 * TODO Maybe this change should be done in the super class instead?
-        	 */
-            super(replacementOffset - replacementLength, replacementLength);
-        }
-
-        public ICompletionProposal createProposal(final String replacementText, 
-                                                  final String displayText, 
-                                                  final String additionalText, 
-                                                  final Image displayImage, 
-                                                  final Object targetObject) 
-        {
-            return createDefaultProposal(replacementText, _replacementOffset, 
-                                         _replacementLength, 
-                                         replacementText.length(), displayImage, 
-                                         displayText, null, additionalText, 
-                                         getRelevance(targetObject));
-        }
-        
-        private int getRelevance(Object target)
-        {
-            // put tag vars at top, followed by beans, then implicits and other
-            if (target instanceof IInstanceSymbol)
-            {
-                final IInstanceSymbol symbol = (IInstanceSymbol) target;
-                
-                switch (symbol.getRuntimeSource().getValue())
-                {
-                    case ERuntimeSource.TAG_INSTANTIATED_SYMBOL:
-                        return HIGH_RELEVANCE;
-                    case ERuntimeSource.MANAGED_BEAN_SYMBOL:
-                        return NORMAL_RELEVANCE;
-                    case ERuntimeSource.BUILT_IN_SYMBOL:
-                    case ERuntimeSource.OTHER:
-                        return LOW_RELEVANCE;
-                }
-            }
-            
-            // if none of the above, return low relevance
-            return LOW_RELEVANCE;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigDialogSettingData.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigDialogSettingData.java
deleted file mode 100644
index 93086db..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigDialogSettingData.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Justin Chen
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryconfig;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties;
-import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE;
-
-/**
- * To construct implementation library and component libraries from sticky values 
- * in DialogSettings as saved libraries.  
- * 
- * @author Justin Chen - Oracle
- */
-public class JSFLibraryConfigDialogSettingData implements JSFLibraryConfiglModelSource {
-	/**
-	 * Delimintor for parsing a persistent property string.
-	 */
-	final protected static String SEPARATOR =":";	//$NON-NLS-1$
-
-	final private JSFLibraryRegistryUtil jsfLibReg;
-	final private boolean dftImplLibDeployFlag;
-	private String[] savedCompLibs;
-	private JSFLibraryInternalReference selJSFLibImpl;	// lazy initialized	
-	private List selJSFLibComp;							// lazy initialized
-
-	private IMPLEMENTATION_TYPE implType;
-	
-	
-	/**
-	 * Constructor where implementation type was chosen to be CLIENT_SUPPLIED.  Created for backwards compatibilty when server supplied was not an option.
-	 * @param implLibDeployFlag
-	 * @param compLibs
-	 */
-	public JSFLibraryConfigDialogSettingData(boolean implLibDeployFlag, String[] compLibs) {
-		this(IMPLEMENTATION_TYPE.CLIENT_SUPPLIED, implLibDeployFlag, compLibs);		
-	}
-	
-	/**
-	 * Constructor
-	 * @param implType {@link IMPLEMENTATION_TYPE}
-	 * @param implLibDeployFlag String  valid options are "true" or "false"
-	 * @param compLibs String[]  saved component library settings in string array
-	 * 
-	public JSFLibraryConfigDialogSettingData(String implLibDeployFlag, String[] compLibs) {
-		this.jsfLibReg = JSFLibraryRegistryUtil.getInstance();
-		this.dftImplLibDeployFlag = implLibDeployFlag;
-		this.savedCompLibs = compLibs;
-		
-		// Verify and log a message if a saved component library no longer exists. 
-		verifySavedLibAvailability();
-	}
-	*/
-	public JSFLibraryConfigDialogSettingData(IMPLEMENTATION_TYPE implType, boolean implLibDeployFlag, String[] compLibs) {
-		
-		this.jsfLibReg = JSFLibraryRegistryUtil.getInstance();
-		this.dftImplLibDeployFlag = implLibDeployFlag;
-		this.savedCompLibs = compLibs;
-		this.implType = implType;
-		
-		// Verify and log a message if a saved component library no longer exists. 
-		verifySavedLibAvailability();
-	}	
-	
-	/**
-	 * There is no saved JSFImplLibrary per se if initializing from DialogSettings 
-	 * since default implementation library is always selected and only the 
-	 * deployment flag is saved.  
-	 * 
-	 * A null is returned when there is no default 
-	 * implementation library in registry.
-	 *     
-	 * @return selJSFLibImpl JSFLibraryInternalReference return default implementation library with updated deployment flag 
-	 */
-	public JSFLibraryInternalReference getJSFImplementationLibrary() {
-		if (selJSFLibImpl == null) {
-			// To instanciate a JSFLibraryReferenceUserDefined object from default impl lib as the saved library.  
-			JSFLibraryInternalReference dftImplLib = jsfLibReg.getDefaultJSFImplementationLibrary(); 		
-			if (dftImplLib != null) {
-				selJSFLibImpl = new JSFLibraryInternalReference(dftImplLib.getLibrary(), 
-						true,	// selected 
-						dftImplLibDeployFlag);
-			}
-		}
-		return selJSFLibImpl;
-	}
-	
-	/**
-	 * Return the list of saved component libraries and their deployment settings.
-	 * 
-	 * @return selJSFLibComp List 
-	 */
-	public List getJSFComponentLibraries() {
-		if (selJSFLibComp == null) {
-			selJSFLibComp = new ArrayList();		
-			
-			if (savedCompLibs != null && savedCompLibs.length > 0) {
-				JSFLibraryInternalReference lib = null;
-				String item;
-				String[] attributes;
-				String id;
-				boolean deploy = false;
-				
-				for (int i = 0; i < savedCompLibs.length; i++) {
-					item = savedCompLibs[i];
-					attributes = item.split(SEPARATOR);
-					
-					id = attributes[0];				
-					deploy = Boolean.valueOf(attributes[1]).booleanValue();
-					
-					lib = jsfLibReg.getJSFLibraryReferencebyID(id);
-					if (lib != null) {
-						selJSFLibComp.add(new JSFLibraryInternalReference(lib.getLibrary(), true, deploy));
-					} /*else {
-						// already logged if a saved component library is no longer available.
-					}*/
-				}
-			}
-		}
-		return selJSFLibComp;
-	}
-
-	/**
-	 * Only need to verify component library availability from sticky settings.
-	 */
- 	private void verifySavedLibAvailability() {
- 		List validLibs = new ArrayList();
-		if (savedCompLibs != null && savedCompLibs.length > 0) {
-			String item = null;
-			String[] attributes;
-			boolean invalidRefs = false;
-			for (int i = 0; i < savedCompLibs.length; i++) {
-				item = savedCompLibs[i];
-				attributes = item.split(SEPARATOR);
-													
-				if (jsfLibReg.getJSFLibraryReferencebyID(attributes[0]) != null) {
-					validLibs.add(item);
-				} else {
-					invalidRefs = true;
-//					JSFCorePlugin.log(IStatus.INFO, Messages.JSFLibCfgDialogSettingData_Sticky_Component_Lib_Not_Exist);
-				}
-			}  				
-			if (invalidRefs){
-				String [] validCompLibs = (String[])validLibs.toArray(new String[validLibs.size()]);
-				if (validCompLibs.length > 0)
-					System.arraycopy(validCompLibs, 0, savedCompLibs, 0, validCompLibs.length);
-				else
-					savedCompLibs = new String[]{};
-			}
-		}	
-		
-
- 	}
-	
- 	/**
- 	 * @return {@link IMPLEMENTATION_TYPE}
- 	 */
- 	public IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE getImplementationType(){
- 		return implType;
- 	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigModel.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigModel.java
deleted file mode 100644
index 6321353..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigModel.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:  Oracle
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryconfig;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE;
-
-/**
- * Model for the custom control <b>JSFLibraryConfigControl</b>.
- * A JSFLibraryConfigModel object is initialized from a source and updated with 
- * selected implementation and component libraries when selections are changed.
- * 
- * @author Justin Chen - Oracle
- */
-public class JSFLibraryConfigModel {
-	final private JSFLibraryConfiglModelSource data;
-	final private JSFLibraryRegistryUtil jsfLibReg;
-	private List colJSFImplLib;
-	private List colJSFCompLib;	
-	
-	/**
-	 * Private constructor.  
-	 * @param data
-	 */
-	private JSFLibraryConfigModel(JSFLibraryConfiglModelSource data) {
-		this.data = data;
-		this.jsfLibReg = JSFLibraryRegistryUtil.getInstance();
-	}
-		
-	/**
-	 * @return IMPLEMENTATION_TYPE
-	 */
-	public IMPLEMENTATION_TYPE getImplementationType() {
-		return data.getImplementationType();
-	}
-	/**
-	 * Return JSF implementation libraries.
-	 * 
-	 * This list is initialized from JSF library registry and updated with persistent configuration data.  
-	 * 
-	 * @return List
-	 * see also org.eclipse.jst.jsf.ui.properties.IJSFLibraryDecoratorProvider#getProjectJSFImplementationLibraries()
-	 */
-	public List getJSFImplementationLibraries() {
-		if (colJSFImplLib == null) {
-			/* To initialze an implementation library list from registry 
-			 * and then update the list with saved implementation library.
-			 */
-			colJSFImplLib = jsfLibReg.getJSFImplementationLibraries();	
-//			colJSFImplLib.add(JSFLibraryRegistryUtil.getInstance().getServerSuppliedJSFLibrary());
-			JSFLibraryInternalReference targetLib = data.getJSFImplementationLibrary();
-			if (targetLib == null) {
-				// no saved implementation, get default implementation library
-				targetLib = jsfLibReg.getDefaultJSFImplementationLibrary();
-			}
-			if (targetLib != null) {
-				JSFLibraryInternalReference srcLib = jsfLibReg.getJSFLibraryReferencebyID(targetLib.getID());				
-				if (srcLib != null) {
-					srcLib.setSelected(true);
-					srcLib.setToBeDeployed(targetLib.isCheckedToBeDeployed());				
-				}
-			}
-		} 
-		return colJSFImplLib;
-	}
-
-	/**
-	 * Return JSF component libraries.
-	 * 
-	 * This list is initialized from JSF library registry and updated with persistent 
-	 * configuration data.  
-	 * 
-	 * @return List
-	 * see also org.eclipse.jst.jsf.ui.properties.IJSFLibraryDecoratorProvider#getProjectJSFComponentLibraries()
-	 */	
-	public List getJSFComponentLibraries() {
-		if (colJSFCompLib == null) {
-			/* To initialize a component library list from registry and then 
-			 * update list with saved component libraries.
-			 */
-			colJSFCompLib = jsfLibReg.getJSFComponentLibraries();			
-			Iterator it = data.getJSFComponentLibraries().iterator();
-			JSFLibraryInternalReference targetItem = null;
-			JSFLibraryInternalReference srcItem = null;
-			while (it.hasNext()) {
-				targetItem = (JSFLibraryInternalReference) it.next();
-				srcItem = jsfLibReg.getJSFLibraryReferencebyID(targetItem.getID());
-				if (srcItem != null) {
-					srcItem.setSelected(true);
-					srcItem.setToBeDeployed(targetItem.isCheckedToBeDeployed());
-				}
-			}
-		}
-		return colJSFCompLib;
-	}
-
-	/**
-	 * Return the selected JSF implementation library currently.
-	 * A null is returned if none is selected.
-	 * 
-	 * @return JSFLibraryInternalReference 
-	 */
-	public JSFLibraryInternalReference getCurrentJSFImplementationLibrarySelection() {
-		Iterator it = getJSFImplementationLibraries().iterator();
-		JSFLibraryInternalReference crtItem = null;
-		while (it.hasNext()) {
-			crtItem = (JSFLibraryInternalReference) it.next();
-			if (crtItem.isSelected()) {
-				return crtItem;
-			}
-		}		
-		return null;
-	}
-	
-	/**
-	 * Return the selected JSF component libraries currently.
-	 * An empty list is returned when no component libraries are selected.
-	 * 
-	 * @return list List
-	 */
-	public List getCurrentJSFComponentLibrarySelection() {
-		List list = new ArrayList();
-
-		Iterator it = getJSFComponentLibraries().iterator();
-		JSFLibraryInternalReference crtItem = null;
-		while (it.hasNext()) {
-			crtItem = (JSFLibraryInternalReference) it.next();
-			if (crtItem.isSelected()) {
-				list.add(crtItem);
-			}
-		}
-		return list;
-	}	
-	
-	/**
-	 * Returned a saved implementation library which was persisted as 
-	 * DialogSettings or as project properties.
-	 * 
-	 * @return JSFLibraryInternalReference
-	 */
-	public JSFLibraryInternalReference getSavedJSFImplementationLibrary() {
-		return data.getJSFImplementationLibrary();
-	}
-
-	/**
-	 * Returned saved component libraries which were persisted as 
-	 * DialogSettings or project persistent properties.
-	 *  
-	 * @return List
-	 */
-	public List getSavedJSFComponentLibraries() {
-		return data.getJSFComponentLibraries();
-	}
-	
-	/**
-	 * Update the selected JSF implementation library.
-	 * 
-	 * Note: The library parameter won't be not added into the collection 
-	 * if it does not exist already. 
-	 * 
-	 * @param library JSFLibraryInternalReference
-	 */
-	public void setCurrentJSFImplementationLibrarySelection(final JSFLibraryInternalReference library) {
-		if (library != null) {			
-			Iterator it = getJSFImplementationLibraries().iterator();
-			JSFLibraryInternalReference crtjsflib = null;
-			while (it.hasNext()) {
-				crtjsflib = (JSFLibraryInternalReference) it.next();
-				if (crtjsflib.getID().equals(library.getID())) {
-					crtjsflib.setSelected(true);
-					crtjsflib.setToBeDeployed(library.isCheckedToBeDeployed());
-				} else {
-					crtjsflib.setSelected(false);
-				}
-			}				
-		}
-	}
-
-	/**
-	 * Update the JSF library component libraries selection.
-	 * 
-	 * @param libraries List
-	 */
-	public void setCurrentJSFComponentLibrarySelection(final List libraries) {
-		if (libraries != null) {
-			/* Reset all item in component library list to unselect first.
-			 * Then, update each item in cmponent libraries to the provided list.
-			 */
-			setJSFLibrariesSelection(getJSFComponentLibraries(), false);
-	
-			Iterator it = libraries.iterator();
-			JSFLibraryInternalReference crtItem;
-			JSFLibraryInternalReference srcItem = null;
-			while (it.hasNext()) {
-				crtItem = (JSFLibraryInternalReference) it.next();
-				srcItem = jsfLibReg.getJSFLibraryReferencebyID(crtItem.getID());
-				
-				if (srcItem != null) {
-					srcItem.setSelected(true);
-					srcItem.setToBeDeployed(crtItem.isCheckedToBeDeployed());
-				}
-			}		
-		}
-	}
-		
-	/**
-	 * To save current configuration of implementation and component libraries 
-	 * as project properties.
-	 * 
-	 * @param project IProject
-	 */
-	public void saveData(final IProject project) {
-		// Instantiate one to make sure it is for a project.
-		JSFLibraryConfigProjectData data_ = new JSFLibraryConfigProjectData(project);
-		List implLibs = new ArrayList();
-		implLibs.add(getCurrentJSFImplementationLibrarySelection());
-		data_.saveData(implLibs, getCurrentJSFComponentLibrarySelection(), getImplementationType());
-	}	
-	
-	/**
-	 * Set selection state to given state to each libray in the collection.
-	 * 
-	 * @param libs List
-	 * @param state boolean
-	 */
-	private void setJSFLibrariesSelection(final List libs, final boolean state) {
-		Iterator it = libs.iterator();
-		JSFLibraryInternalReference crtjsflib;
-		while (it.hasNext()) {
-			crtjsflib = (JSFLibraryInternalReference) it.next();
-			crtjsflib.setSelected(state);
-		}		
-	}	
-	
-	/**
-	 * Factory class to create new JSFLibraryConfigModel instances
-	 */
-	public static final class JSFLibraryConfigModelFactory {
-	    /** 
-	     * To create a new instance of JSFLibraryConfigModel object.  
-		 * A NullPointerException is raised if source is null.
-		 * 
-		 * @param source JSFLibraryConfiglModelSource 
-		 * @return JSFLibraryConfigModel 
-		 */
-		public static JSFLibraryConfigModel createInstance(final JSFLibraryConfiglModelSource source) {
-			if (source == null) {
-				throw new NullPointerException(Messages.JSFLibraryConfigModel_Null_Data_Source);
-			}
-			return new JSFLibraryConfigModel(source);
-		}
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigProjectData.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigProjectData.java
deleted file mode 100644
index 70d36dc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigProjectData.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors: Oracle
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryconfig;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.core.internal.project.facet.JSFUtils;
-import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * To construct implementation library and component libraries 
- * from persistent project properties as saved libraries.  
- * 
- * @author Justin Chen - Oracle
- */
-public class JSFLibraryConfigProjectData implements JSFLibraryConfiglModelSource {
-	final static String QUALIFIEDNAME = "org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryConfigProjectData"; 
-	/**
-	 * Parsing delimnitor for elements in a tuple.
-	 */
-	final protected static String SPTR_TUPLE = ":"; //$NON-NLS-1$
-	/**
-	 * Parsing delimintor for tuples in a persistent property string.
-	 */
-	final protected static String EO_TUPLE = ";"; 	//$NON-NLS-1$
-	
-	final private IProject project;
-	final private JSFLibraryRegistryUtil jsfLibReg;
-	private JSFLibraryInternalReference selJSFLibImpl;	
-	private List selJSFLibComp;
-
-	/**
-	 * Constructor
-	 * @param project
-	 */
-	public JSFLibraryConfigProjectData(IProject project) {
-		this.project = project;
-		this.jsfLibReg = JSFLibraryRegistryUtil.getInstance();
-		
-		/* logging message when object is instantiated instead of at method call to 
-		 * reduce log entries.
-		 */ 
-		if (!isProjectFirstCreated()) {
-			verifySavedLibAvailability();
-		}		
-	}
-	 	
-	public IMPLEMENTATION_TYPE getImplementationType() {
-		try {
-			String type = ((IResource)project).getPersistentProperty(new QualifiedName(QUALIFIEDNAME, 
-					JSFUtils.PP_JSF_IMPLEMENTATION_TYPE));
-			return IMPLEMENTATION_TYPE.getValue(type);
-		} catch (CoreException e) {//
-		}
-		return IMPLEMENTATION_TYPE.UNKNOWN;
-	}	
-	
-	/**
-	 * Return the previously selected JSF implementation library from project persistent properties.
-	 * Return null if none exists.
-	 * 
-	 * @return selJSFLibImpl JSFLibraryDecorator
-	 */
- 	public JSFLibraryInternalReference getJSFImplementationLibrary() {
-		try {
-			if (!isProjectFirstCreated() && 
-					selJSFLibImpl == null ) {
-					String strImplLibs = ((IResource)project).getPersistentProperty(new QualifiedName(QUALIFIEDNAME, 
-							JSFUtils.PP_JSF_IMPLEMENTATION_LIBRARIES));
-					selJSFLibImpl = getJSFImplLibfromPersistentProperties(getTuples(strImplLibs));
-			}
-		} catch (CoreException e) {
-			JSFCorePlugin.log(e, "Exception occured while returning reference to the JSF implementation library");
-		}
-		return selJSFLibImpl; 
-	}
-	
-	/**
-	 * Return the selected JSF component libraries from project persistent properties.
-	 * An empty List is returned if no JSF component libraries were saved or 
-	 * if the project is newly created.
-	 * 
-	 * @return selJSFLibComp List
-	 */
-	public List getJSFComponentLibraries() {	
-		try {
-			if (!isProjectFirstCreated()) {
-				if ( selJSFLibComp == null ) {
-					selJSFLibComp = new ArrayList();
-					
-					String strCompLibs = ((IResource)project).getPersistentProperty(new QualifiedName(QUALIFIEDNAME, JSFUtils.PP_JSF_COMPONENT_LIBRARIES));
-					List savedList = getTuples(strCompLibs);
-					
-					Iterator it = savedList.iterator();
-					Tuple crtTuple = null;
-					JSFLibraryInternalReference srcItem = null;
-					while (it.hasNext()) {
-						crtTuple = (Tuple) it.next();
-						
-						srcItem = jsfLibReg.getJSFLibraryReferencebyID(crtTuple.getID());
-						if (srcItem != null) {
-							selJSFLibComp.add( new JSFLibraryInternalReference(srcItem.getLibrary(), 
-													true, 
-													crtTuple.needDeploy()) );
-						} /*else {
-							// already logged a message for a missing library
-						}*/
-					}
-				}		
-			} else {
-				selJSFLibComp = new ArrayList(0);  
-			}
-		} catch (CoreException e) {
-			JSFCorePlugin.log(e, "Exception occured while returning references to the JSF component libraries.");
-		}
-		return selJSFLibComp;
-	}
-	
-	/**
-	 * To save configuration data as a project persistent properties.
-	 * 
-	 * @param implementation
-	 * @param component
-	 */
-	void saveData(final List implementation, final List component, final IMPLEMENTATION_TYPE implType) {
-		try {
-			((IResource)project).setPersistentProperty(new QualifiedName(QUALIFIEDNAME, JSFUtils.PP_JSF_IMPLEMENTATION_LIBRARIES), generatePersistString(implementation));
-			((IResource)project).setPersistentProperty(new QualifiedName(QUALIFIEDNAME, JSFUtils.PP_JSF_COMPONENT_LIBRARIES), generatePersistString(component));
-			((IResource)project).setPersistentProperty(new QualifiedName(QUALIFIEDNAME, JSFUtils.PP_JSF_IMPLEMENTATION_TYPE), IMPLEMENTATION_TYPE.getStringValue(implType));
-			
-			/* Flush the selection so that they can be reconstructed from 
-			 * persistent properties when getSavedJSFImplLib and getSavedJSFCompLibs 
-			 * called next time.
-			 */
-			selJSFLibImpl = null;
-			selJSFLibComp = null;
-			
-		} catch (CoreException e) {
-			JSFCorePlugin.log(e, "Exception occured while persisting the JSF Library preferences");
-		}
-	}
-	
-	/**
-	 * Check if a project is just created by inspecting persistent properties    
-	 * if there is any.  ?
-	 */
- 	private boolean isProjectFirstCreated() {
- 		boolean isNew = false;
- 		try {
-			((IResource)project).getPersistentProperty(new QualifiedName(QUALIFIEDNAME, 
-														JSFUtils.PP_JSF_IMPLEMENTATION_LIBRARIES));
-		} catch (CoreException e) {
-			isNew = true;
-		}
-		return isNew;
- 	}
-	
- 	private void verifySavedLibAvailability() {
- 		try {
-			String strImplLibs = ((IResource)project).getPersistentProperty(new QualifiedName(QUALIFIEDNAME, JSFUtils.PP_JSF_IMPLEMENTATION_LIBRARIES));
-	 		String strCompLibs = ((IResource)project).getPersistentProperty(new QualifiedName(QUALIFIEDNAME, JSFUtils.PP_JSF_COMPONENT_LIBRARIES));
-	 		
-	 		logMissingLib(getTuples(strImplLibs), true);
-	 		logMissingLib(getTuples(strCompLibs), false);
-	 		
-		} catch (CoreException e) {
-			JSFCorePlugin.log(e, "Exception occured while verifying saved JSF Library preferences");
-		}		
- 	} 	
- 	
- 	private void logMissingLib(final List jsfLibTuples, final boolean isVerifyImpl) {
-		if (jsfLibReg != null) {
-			Iterator itTuple = jsfLibTuples.iterator();
-			while(itTuple.hasNext()) {
-				Tuple tuple = (Tuple)itTuple.next();			
-				JSFLibraryInternalReference jsfLib = jsfLibReg.getJSFLibraryReferencebyID(tuple.getID());				
-				/* Information logged when saved JSF lib is removed from registry.
-				 * One log entry is created for each missing library.
-				 */
-				if (jsfLib == null) {
-					String prjName = project.getName();
-					String msg = (isVerifyImpl) ?
-							Messages.JSFLibraryConfigPersistData_SAVED_IMPLLIB_NOT_FOUND : 
-							Messages.JSFLibraryConfigPersistData_SAVED_COMPLIB_NOT_FOUND;
-					JSFCorePlugin.log(IStatus.INFO, NLS.bind(msg, prjName));
-				}
-			}
-		} 		
- 	}	
-	
-	private JSFLibraryInternalReference getJSFImplLibfromPersistentProperties(final List jsfLibTuples) {
-		if (jsfLibReg != null) {			
-			Tuple tuple = null;
-			JSFLibraryInternalReference lib = null;
-			Iterator itTuple = jsfLibTuples.iterator();			
-			while(itTuple.hasNext()) {
-				tuple = (Tuple) itTuple.next();			
-				lib = jsfLibReg.getJSFLibraryReferencebyID(tuple.id);				
-				if (lib != null) {
-					return new JSFLibraryInternalReference(lib.getLibrary(), 
-							tuple.selected, 
-							tuple.deploy);
-				} /*else {
-					// already logged a message for a missing library
-				}*/
-			}
-		}
-		return null;
-	}
-		
-	private String generatePersistString(List list) {
-		JSFLibraryInternalReference jsfLibItem;
-		StringBuffer sb = new StringBuffer();
-		for (int i = 0; i < list.size(); i++) {
-			jsfLibItem = (JSFLibraryInternalReference)list.get(i);
-			sb = sb.append(jsfLibItem.generatePersistString());
-			sb.append(JSFLibraryConfigProjectData.EO_TUPLE);
-		}
-		return sb.toString();		
-	}	
-	
-	private List getTuples(String strJSFLibs) {
-		List list = new ArrayList();
-		
-		if (strJSFLibs != null) {
-			String patternStr = JSFLibraryConfigProjectData.EO_TUPLE;
-			String[] fields = strJSFLibs.split(patternStr);
-			if (strJSFLibs.length() > 0) {
-				Tuple tuple;
-				for (int i = 0; i < fields.length; i++) {
-					tuple = new Tuple(fields[i]);
-					list.add(tuple);
-				}
-			}			
-		}
-		return list;
-	}
-	
-	/**
-	 * Inner class for parsing project persistent properties. 
-	 * 
-	 * To Do: Take out selected attribute since it is not needed.
-	 *        Add the library name as an attribute.
-	 *        Provide code path to migrate earlier project.
-	 *        
-	 * NOTE: this class should no longer be used except to support
-	 * legacy (pre-2.0M6 library registries)
-	 */
-	static class Tuple {
-		final private String id;
-		final private boolean selected;
-		final private boolean deploy;
-		
-		Tuple(String id, boolean selected, boolean deploy) {
-			this.id = id;
-			this.selected = selected;
-			this.deploy = deploy;
-		}
-		// parse tuple = ID:selected:deploy
-		Tuple(String tuple) {
-			String[] fields = tuple.split(JSFLibraryConfigProjectData.SPTR_TUPLE);
-			
-			if (fields.length >= 3)
-			{
-    			this.id = fields[0];
-    			this.selected = Boolean.valueOf(fields[1]).booleanValue();
-    			this.deploy = Boolean.valueOf(fields[2]).booleanValue();
-			}
-			else
-			{
-			    throw new IllegalStateException("Library registry is corrupt");
-			}
-		}
-		
-		String getID() {
-			return id;
-		}
-		
-		boolean isSelected() {
-			return selected;
-		}
-		
-		boolean needDeploy() {
-			return deploy;
-		}		
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfiglModelSource.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfiglModelSource.java
deleted file mode 100644
index 5575835..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfiglModelSource.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Justin Chen
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryconfig;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE;
-
-/**
- * Interface for data source to instanciate a <b>JSFLibraryConfigModel</b> object. 
- * 
- * @author Justin Chen - Oracle
- */
-public interface JSFLibraryConfiglModelSource {
- 	/**
-	 * Return a saved JSF implementation library.  
-	 * Depends on the model source, it could be sticky values from DialogSettings or 
-	 * project property values.  
-	 * 
-	 * A null could be returned when creating first web project in a new workspace.
-	 * 
- 	 * @return JSFLibraryInternalReference
- 	 */
- 	public JSFLibraryInternalReference getJSFImplementationLibrary();
- 	
- 	/**
-	 * Return a list of saved JSF component libraries.
-	 * Otheriwse, return an empty list.
-	 *  
- 	 * @return List
- 	 */
- 	public List getJSFComponentLibraries(); 
- 	
- 	/**
-	 * Return type of implementation
-	 *  
- 	 * @return {@link IMPLEMENTATION_TYPE}
- 	 */
- 	public IMPLEMENTATION_TYPE getImplementationType(); 	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryInternalReference.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryInternalReference.java
deleted file mode 100644
index aca5bf5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryInternalReference.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:  Oracle
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryconfig;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-
-/**
- * Attach additonal attributes such as selection and deployment 
- * to a JSF library when it is referenced by a project.  
- * 
- * @author Justin Chen - Oracle
- */
-public class JSFLibraryInternalReference {
-	final private JSFLibrary jsfLib;
-	private boolean check4Deploy;			// Initialized from default in workspace
-	private boolean selected; 				// selected for project
-	
-	/**
-	 * Constructor
-	 * @param jsfLib JSFLibrary  instance embedded inside.
-	 * @param selected boolean  true if selected, otherwise, not selected.
-	 * @param deploy boolean  true if needs to be deployed, otherwise, won't be deployed.
-	 */
-	public JSFLibraryInternalReference(JSFLibrary jsfLib, boolean selected, boolean deploy) {
-		this.jsfLib = jsfLib;
-		this.selected = selected;
-		this.check4Deploy = deploy;		
-	}
-	
-	/**
-	 * Return the embedded JSFLibrary instance.
-	 *  
-	 * @return jsfLib JSFLibrary
-	 */	 
-	public JSFLibrary getLibrary() {
-		return jsfLib;
-	}
-
-	/**
-	 * Set the to be deployed flag.
-	 * 
-	 * @param deploy boolean
-	 */
-	public void setToBeDeployed(final boolean deploy) {
-		check4Deploy = deploy;
-	}	
-	
-	/**
-	 * Return true if the JSF library needs to be deployed.
-	 * Otheriwse, return false.
-	 * 
-	 * @return boolean
-	 */
-	public boolean isCheckedToBeDeployed() {
-		return check4Deploy;
-	}
-
-	/**
-	 * Set the selected attribute to a JSFLibraryLibraryReference object.
-	 * 
-	 * @param selected boolean
-	 */
-	public void setSelected(final boolean selected) {
-		this.selected = selected;
-	}
-	
-	/**
-	 * Return true if the JSF library is referenced by a project.  
-	 * Otherwise, return false.
-	 * 
-	 * @return selected boolean
-	 */
-	public boolean isSelected() {
-		return selected;
-	}	
-	
-	/**
-	 * To generate a string that represents the JSFLibraryLibraryReference 
-	 * object for persistence. 
-	 * 
-	 * @return String
-	 */
-	protected String generatePersistString() {
-		return (getID() + JSFLibraryConfigProjectData.SPTR_TUPLE + 
-				String.valueOf(isSelected()) + JSFLibraryConfigProjectData.SPTR_TUPLE + 
-				String.valueOf(isCheckedToBeDeployed())); 
-	}
-
-	/**
-	 * Helper method to return the library ID from the embedded 
-	 * JSFLibrary instance. 
-	 * 
-	 * @return id String
-	 */
-	public String getID() {
-		return jsfLib.getID();
-	}
-
-	/**
-	 * Helper method to return the library name from the embedded 
-	 * JSFLibrary instance. 
-	 * 
-	 * @return name String
-	 */
-	public String getName() {
-		return jsfLib.getName();
-	}
-
-	/**
-	 * Helper method to return the label for the library from the embedded 
-	 * JSFLibrary instance. 
-	 * 
-	 * @return name String
-	 */
-	public String getLabel() {
-		return jsfLib.getLabel();
-	}
-	
-	/**
-	 * Return true if the embedded JSF library instance i implementation. 
-	 * Otherwise, return false.
-	 * 
-	 * @return boolean
-	 */
-	public boolean isImplementation() {
-		return jsfLib.isImplementation();
-	}
-
-	/**
-	 *  Help method to return a list of Archive files from 
-	 *  the embedded JSFLibrary instance.
-	 * 
-	 * @return boolean
-	 */	
-	public EList getArchiveFiles() {
-		return jsfLib.getArchiveFiles();
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryRegistryUtil.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryRegistryUtil.java
deleted file mode 100644
index 0e3c02a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryRegistryUtil.java
+++ /dev/null
@@ -1,604 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:  Oracle
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryconfig;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.InvalidRegistryObjectException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.jdt.core.IClasspathContainer;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.JSFLibraryClasspathContainer;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.core.internal.RegistryUpgradeCommitHandler;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.adapter.MaintainDefaultImplementationAdapter;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util.JSFLibraryRegistryResourceFactoryImpl;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util.JSFLibraryRegistryResourceImpl;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util.JSFLibraryRegistryUpgradeUtil;
-import org.eclipse.jst.jsf.core.internal.project.facet.JSFUtils;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryConfigurationHelper;
-import org.eclipse.jst.jsf.core.jsflibraryregistry.PluginProvidedJSFLibraryCreationHelper;
-import org.eclipse.jst.jsf.core.jsflibraryregistry.internal.PluginProvidedJSFLibraryCreationHelper2;
-
-/**
- * A singleton maintains lists of implementation and component libraries 
- * in registry.
- *   
- * Each item in the lists contains a workingcopy of a JSF library and 
- * decorates with usage information such selection and deployment.  
- * 
- * The lists are updated when there are changes in JSF library registry.
- * 
- * @author Justin Chen, etc. - Oracle
- */
-public class JSFLibraryRegistryUtil {
-	private static JSFLibraryRegistryUtil instance = null;	
-	
-	private List implLibs = null;
-	private List compLibs = null;
-	
-
-	// The NS URI of the JSF Library Registry's Ecore package. (Must match
-	// setting on package in Ecore model.)
-	private static final String JSF_LIBRARY_REGISTRY_NSURI = "http://www.eclipse.org/webtools/jsf/schema/jsflibraryregistry.xsd"; //$NON-NLS-1$
-
-	private static final String LIB_EXT_PT 		= "pluginProvidedJsfLibraries"; //$NON-NLS-1$
-	//deprecated ext-pt
-	private static final String OLD_LIB_EXT_PT 	= "jsfLibraries"; //$NON-NLS-1$
-
-	// The JSF Library Registry EMF resource instance.
-	private static JSFLibraryRegistryResourceImpl jsfLibraryRegistryResource = null;
-	
-	//JSFLibraryRegistry singleton
-	private JSFLibraryRegistry jsfLibraryRegistry;
-	
-	/**
-	 * Private constructor
-	 */
-	private JSFLibraryRegistryUtil() {
-	    //nothing to do
-	}
-	
-	/**
-	 * Return the singleton instance of JSFLibraryRegistryUtil.
-	 *   
-	 * @return JSFLibraryRegistryUtil
-	 */
-	public synchronized static JSFLibraryRegistryUtil getInstance() {
-		if ( instance == null ) {
-			instance = new JSFLibraryRegistryUtil();
-			instance.loadJSFLibraryRegistry();
-		}
-		return instance;
-	}
-
-	/**
-	 * Convenience method to return the JSFLibraryRegistry instance.
-	 * 
-	 * @return jsfLibReg JSFLibraryRegistry
-	 */
-	public JSFLibraryRegistry getJSFLibraryRegistry() {
-		return jsfLibraryRegistry;
-	}
-	
-	/**
-	 * Get the default JSF implementation library instance.
-	 * A null is returned when there is no libraries in the registry.
-	 * 
-	 * @return JSFLibraryInternalReference
-	 */
-	public JSFLibraryInternalReference getDefaultJSFImplementationLibrary() {
-		JSFLibrary dftImplLib = getJSFLibraryRegistry().getDefaultImplementation();
-		
-		return ((dftImplLib != null) ? 
-				getJSFLibraryReferencebyID(dftImplLib.getID()) :
-				null);
-	}
-	
-	/**
-	 * Get the working copy of JSF implementation libraries.
-	 * The list is updated when there are changes in registry.
-	 * 
-	 * @return List
-	 */
-	List getJSFImplementationLibraries() {
-		if (implLibs == null) {
-			implLibs = wrapJSFLibraries(getJSFLibraryRegistry().getImplJSFLibraries());
-		} else {
-			if (implLibs.size() != getJSFLibraryRegistry().getImplJSFLibraries().size() || 
-					isAnyLibraryChanged(implLibs)) {
-				implLibs.clear();
-				implLibs = wrapJSFLibraries(getJSFLibraryRegistry().getImplJSFLibraries());
-			}
-		}
-		return implLibs;
-	}
-		
-	/**
-	 * Get the working copy of JSF component libraries.
-	 * The list is updated when there are changes in registry.
-	 * 
-	 * @return List
-	 */
-	List getJSFComponentLibraries() {
-		if (compLibs == null) {
-			compLibs = wrapJSFLibraries(getJSFLibraryRegistry().getNonImplJSFLibraries());
-		} else {
-			if (compLibs.size() != getJSFLibraryRegistry().getNonImplJSFLibraries().size() || 
-					isAnyLibraryChanged(compLibs)) {
-				compLibs.clear();
-				compLibs = wrapJSFLibraries(getJSFLibraryRegistry().getNonImplJSFLibraries());
-			}			
-		}
-		return compLibs;
-	}
-	
-	/**
-	 * Get the JSFLibraryDecorator object from the provided ID. 
-	 * A null is returned no library matches the ID.
-	 * 
-	 * @param id String
-	 * @return JSFLibraryDecorator
-	 */
-	public JSFLibraryInternalReference getJSFLibraryReferencebyID(final String id) {
-		Iterator it = getJSFImplementationLibraries().iterator();
-		JSFLibraryInternalReference crtItem = null;
-		
-		// search implementation libraries
-		while(it.hasNext()) {
-			crtItem = (JSFLibraryInternalReference)it.next();
-			if (id.equals(crtItem.getID())) {
-				return crtItem;
-			}
-		}
-		// search component libraries
-		it = getJSFComponentLibraries().iterator();
-		while(it.hasNext()) {
-			crtItem = (JSFLibraryInternalReference)it.next();
-			if (id.equals(crtItem.getID())) {
-				return crtItem;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Add a JSF Library into collection for either 
-	 * JSF implementation libraries or component libraries.  
-	 * The decision is based on if a JSF library is an implementation.
-	 * 
-	 * @param library JSFLibraryLibraryReference
-	 */
-	public void addJSFLibrary(final JSFLibraryInternalReference library) {
-		 // Library is added only if it does not exist in registry 
-		if (library != null && getJSFLibraryRegistry().getJSFLibraryByID(library.getID()) == null) {
-			// Add the library working copy into workspace registry.
-			JSFLibrary jsfLib = library.getLibrary();
-			getJSFLibraryRegistry().addJSFLibrary(jsfLib.getWorkingCopy());
-			
-			// Add library into the collection depends on its type.
-			List list = (library.isImplementation() ? 
-							getJSFImplementationLibraries() :
-							getJSFComponentLibraries());
-			list.add(library);
-		}
-	}	
-	
-	private List wrapJSFLibraries(final EList libs) {
-		List list = new ArrayList();
-		if (libs != null) {
-			JSFLibrary jsfLib;
-			JSFLibraryInternalReference jsfLibDctr;
-			
-			Iterator it = libs.iterator();
-			while (it.hasNext()) {
-				jsfLib = (JSFLibrary) it.next();
-				 // Set unselected and undeployed initially.
-				jsfLibDctr = new JSFLibraryInternalReference(jsfLib, //.getWorkingCopy(), 
-								false, 
-								false);
-				list.add(jsfLibDctr);
-			}
-		}	
-		return list;		
-	}
-
-	private boolean isAnyLibraryChanged(final List list) {
-		Iterator it = list.iterator();
-		JSFLibraryInternalReference wclib = null;		// working copy library
-		JSFLibrary lib = null;
-		
-		while(it.hasNext()) {
-			wclib = (JSFLibraryInternalReference)it.next();
-			lib = getJSFLibraryRegistry().getJSFLibraryByID(wclib.getID());
-			if (lib == null) {					// removed. Hence, changed.
-				return true;
-			}
-			if (wclib.getArchiveFiles().size() != 
-				lib.getArchiveFiles().size()) { // Archives changed..
-				return true;
-			}
-			if (isAnyArchiveFileChanged(wclib.getArchiveFiles(), 
-					lib.getArchiveFiles())) {   // Check archive file changes.  I.e., name and location
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private boolean isAnyArchiveFileChanged(final EList source, EList target) {		
-		ArchiveFile arSrc = null;
-		Iterator it = source.iterator();
-		while (it.hasNext()) {
-			arSrc = (ArchiveFile) it.next();
-			if (!findMatchedArchive(arSrc, target)) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	private boolean findMatchedArchive(ArchiveFile source, EList list) {
-		ArchiveFile target = null;
-		Iterator it = list.iterator();
-		while (it.hasNext()) {
-			target = (ArchiveFile) it.next();
-			if (target.equals(source)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Get the classpath entries for a JSF Library
-	 * @param lib
-	 * @return IClasspathEntry[]
-	 */
-	public IClasspathEntry[] getClasspathEntries(JSFLibrary lib){		
-		//TODO: cache to optimize.   probably belongs inside JSFLibrary model.
-		ArrayList res= new ArrayList(lib.getArchiveFiles().size());
-		for (Iterator it=lib.getArchiveFiles().iterator();it.hasNext();) {
-			ArchiveFile jar= (ArchiveFile)it.next();			
-			if (jar != null && jar.exists()) {
-				IClasspathEntry entry = getClasspathEntry(jar);
-				if (entry != null)
-					res.add(entry);
-			}
-		}
-		IClasspathEntry[] entries= (IClasspathEntry[]) res.toArray(new IClasspathEntry[res.size()]);
-		return entries;
-	}
-	
-	/**
-	 * Create IClasspathEntry for ArchiveFile
-	 * @param jar
-	 * @return IClasspathEntry
-	 */
-	public IClasspathEntry getClasspathEntry(ArchiveFile jar){
-		IClasspathEntry entry = null;
-		if (jar !=null && jar.exists()){
-			entry = JavaCore.newLibraryEntry(new Path(jar.getResolvedSourceLocation()), null, null);//, nu, sourceAttachRoot, accessRules, extraAttributes, false/*not exported*/);
-		}
-		return entry;
-	}
-	
-	/**
-	 * Binds JSF Libraries to classpath containers when the library changes.
-	 * 
-	 * This method will deal with library/cp container renames by removing the old classpath container and then adding.
-	 * 
-	 * @param oldId
-	 * @param newId
-	 * @param removeAndAddBecauseOfRename
-	 * @param monitor
-	 * @throws JavaModelException
-	 */
-	public static void rebindClasspathContainerEntries(String oldId, String newId, boolean removeAndAddBecauseOfRename, IProgressMonitor monitor) throws JavaModelException {
-		IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot();
-		IJavaProject[] projects= JavaCore.create(root).getJavaProjects();
-		IPath containerPath= new Path(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID).append(newId);
-		IPath oldContainerPath = new Path(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID).append(oldId);
-		
-		JSFLibrary lib = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getJSFLibraryByID(newId);
-		List affectedProjects= new ArrayList();
-		removeAndAddBecauseOfRename = (!oldId.equals(newId));
-		// find all projects using the old container name...
-		for (int i= 0; i < projects.length; i++) {
-			IJavaProject project= projects[i];
-			IClasspathEntry[] entries= project.getRawClasspath();
-			for (int k= 0; k < entries.length; k++) {
-				IClasspathEntry curr= entries[k];
-				if (curr.getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
-					if (oldContainerPath.equals(curr.getPath())) {
-						affectedProjects.add(project);
-						break;
-					}				
-				}
-			}
-		}
-		
-		if (!affectedProjects.isEmpty()) {
-			IJavaProject[] affected= (IJavaProject[]) affectedProjects.toArray(new IJavaProject[affectedProjects.size()]);
-			IClasspathContainer[] containers= new IClasspathContainer[affected.length];
-			removeAndAddBecauseOfRename = (!oldId.equals(newId));
-			if (removeAndAddBecauseOfRename){//not very pretty... remove and add new container				
-				IClasspathEntry newEntry = JavaCore.newContainerEntry(containerPath);
-				for (int i= 0; i < affected.length; i++) {
-					IJavaProject project= affected[i];
-					IClasspathEntry[] entries= project.getRawClasspath();
-					List keptEntries = new ArrayList();
-					//keep all entries except the old one
-					for (int k= 0; k < entries.length; k++) {
-						IClasspathEntry curr= entries[k];
-						if (curr.getEntryKind() == IClasspathEntry.CPE_CONTAINER){
-								if( ! oldContainerPath.equals(curr.getPath())) 
-							keptEntries.add(curr);						
-						}
-						else {
-							keptEntries.add(curr);
-						}						
-					}
-					// add new container entry
-					keptEntries.add(newEntry);
-					setRawClasspath(project, keptEntries, monitor);
-				}
-				
-			}
-			else {//rebind
-
-				JSFLibraryClasspathContainer container= new JSFLibraryClasspathContainer(lib);
-				containers[0] = container;
-	
-				JavaCore.setClasspathContainer(containerPath, affected, containers, monitor);
-			}
-		} else {
-			if (monitor != null) {
-				monitor.done();
-			}
-		}
-	}
-
-	/**
-	 * Sets the raw classpath on a project and logs an error if it when a JavaModelException occurs
-	 * @param project
-	 * @param cpEntries
-	 * @param monitor
-	 */
-	public static void setRawClasspath(IJavaProject project, List cpEntries, IProgressMonitor monitor) {
-		IClasspathEntry[] entries = (IClasspathEntry[])cpEntries.toArray(new IClasspathEntry[0]);
-		try {
-			project.setRawClasspath(entries, monitor);
-		} catch (JavaModelException e) {
-			JSFCorePlugin.log(e, "Unable to set classpath for: "+project.getProject().getName());
-		}
-	}
-	
-	/**
-	 * @param iproject
-	 * @return true if iproject has persistent properties indicating that it may still
-	 * be using V1 JSF Library references
-	 */
-	public static boolean doesProjectHaveV1JSFLibraries(IProject iproject)
-	{
-	   if (iproject == null || !iproject.isAccessible())
-	   {
-	       return false; // won't be able to get reading on a null or closed project
-	   }
-	   
-       try
-        {
-            Object compLib = iproject.getPersistentProperty(new QualifiedName(JSFLibraryConfigProjectData.QUALIFIEDNAME, JSFUtils.PP_JSF_COMPONENT_LIBRARIES));
-            Object implLib = iproject.getPersistentProperty(new QualifiedName(JSFLibraryConfigProjectData.QUALIFIEDNAME, JSFUtils.PP_JSF_IMPLEMENTATION_LIBRARIES));
-            
-            if (compLib != null || implLib != null)
-            {
-                return true;
-            }
-        }
-        catch(CoreException ce)
-        {
-            JSFCorePlugin.log(ce, "Error checking age of project");
-        }
-        // by default, fall through to false
-        return false;
-	}
-	
-	/**
-	 * Removes the persistent property from JSF projects tagged with
-	 * V1 JSF libraries.
-	 * @param projects
-	 */
-	public static void removeV1JSFLibraryProperty(List<IProject> projects)
-	{
-	    for (final Iterator<IProject> it = projects.iterator(); it.hasNext();)
-	    {
-	        IProject project = it.next();
-            try {
-                if (project.isAccessible())
-                {
-                    project.setPersistentProperty(new QualifiedName(JSFLibraryConfigProjectData.QUALIFIEDNAME, JSFUtils.PP_JSF_COMPONENT_LIBRARIES), null);
-                    project.setPersistentProperty(new QualifiedName(JSFLibraryConfigProjectData.QUALIFIEDNAME, JSFUtils.PP_JSF_IMPLEMENTATION_LIBRARIES), null);
-                }
-            } catch (CoreException e) {
-                JSFCorePlugin.log(e, "Error removing JSF library persistent property");
-            }
-	    }
-	}
-	
-	/**
-	 * Loads the JSFLibraryRegistry EMF object from plugin-specfic workspace
-	 * settings location.
-	 */
-	private void loadJSFLibraryRegistry() {
-		try {
-			
-			EPackage.Registry.INSTANCE.put(JSF_LIBRARY_REGISTRY_NSURI, JSFLibraryRegistryPackageImpl.init());
-			URI jsfLibRegURI = JSFLibraryRegistryUpgradeUtil.getRegistryURI(JSFLibraryRegistryUpgradeUtil.JSF_LIBRARY_REGISTRY_LATESTVERSION_URL);			
-			JSFLibraryRegistryUpgradeUtil.getInstance().upgradeRegistryIfNecessary(JSFLibraryRegistryUpgradeUtil.LATESTVERSION);
-
-			JSFLibraryRegistryResourceFactoryImpl resourceFactory = new JSFLibraryRegistryResourceFactoryImpl();
-			jsfLibraryRegistryResource = (JSFLibraryRegistryResourceImpl)resourceFactory.createResource(jsfLibRegURI);
-			try {
-				Map options = new HashMap();
-				//disable notifications during load to avoid changing stored default implementation
-				options.put(XMLResource.OPTION_DISABLE_NOTIFY, Boolean.TRUE);
-				jsfLibraryRegistryResource.load(options);
-				jsfLibraryRegistry = (JSFLibraryRegistry)jsfLibraryRegistryResource.getContents().get(0);
-			 	
-				loadJSFLibraryExtensions();
-				loadDeprecatedJSFLibraryExtensions();//to be removed 
-				
-			} catch(IOException ioe) {
-				//Create a new Registry instance
-				jsfLibraryRegistry = JSFLibraryRegistryFactory.eINSTANCE.createJSFLibraryRegistry();
-				jsfLibraryRegistryResource = (JSFLibraryRegistryResourceImpl)resourceFactory.createResource(jsfLibRegURI);
-				jsfLibraryRegistryResource.getContents().add(jsfLibraryRegistry);
-				loadJSFLibraryExtensions();
-				loadDeprecatedJSFLibraryExtensions();//to be removed 
-				saveJSFLibraryRegistry();
-			}
-			//add adapter to maintain default implementation
-			if (jsfLibraryRegistry != null) {				
-				//check that a default impl is set.   if not pick first one if available.
-				JSFLibrary defLib = jsfLibraryRegistry.getDefaultImplementation();
-				if (defLib == null && jsfLibraryRegistry.getImplJSFLibraries().size() > 0){
-					jsfLibraryRegistry.setDefaultImplementation((JSFLibrary)jsfLibraryRegistry.getImplJSFLibraries().get(0));
-					saveJSFLibraryRegistry();
-				}
-				jsfLibraryRegistry.eAdapters().add(MaintainDefaultImplementationAdapter.getInstance());
-				
-				//commit 
-				RegistryUpgradeCommitHandler.commitMigrationIfNecessary();
-			}
-		} catch(MalformedURLException mue) {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.JSFLibraryRegistry_ErrorCreatingURL, mue);
-		}
-	}
-/////////////////////////////////   Load and Save JSF Library Registry ////////////////////////////////////////////////
-	
-	/**
-	 * Creates library registry items from extension points.
-	 */
-	private void loadJSFLibraryExtensions() {
-		try {
-			IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(JSFCorePlugin.PLUGIN_ID, LIB_EXT_PT);
-			IExtension[] extensions = point.getExtensions();
-			for (int i=0;i < extensions.length;i++){
-				IExtension ext = extensions[i];
-				for (int j=0;j < ext.getConfigurationElements().length;j++){
-					PluginProvidedJSFLibraryCreationHelper2 newLibCreator = new PluginProvidedJSFLibraryCreationHelper2(ext.getConfigurationElements()[j]);						
-					JSFLibrary newLib = newLibCreator.create();
-					
-					/**
-					 * Additional check on if a plug-in contributes jsflibraries is an expanded folder.
-					 * Fix related to bug 144954.  
-					 * 
-					 * It would be ideal to check if a plug-in is distributed as a JAR 
-					 * before a JSFLibrary is created.
-					 * 
-					 * This is a temporary solution since JARs in a JAR case is not 
-					 * supported in this release.  Bug 14496.
-					 */
-					if (newLib != null) //&& isJSFLibinExpandedFolder(newLib))
-						jsfLibraryRegistry.addJSFLibrary(newLib);
-				}
-			}
-		} catch (InvalidRegistryObjectException e) {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.JSFLibraryRegistry_ErrorLoadingFromExtPt, e);
-		}
-	}
-	
-	/**
-	 * Creates deprecated library registry items from extension points.
-	 * TO BE REMOVED
-	 */
-	private void loadDeprecatedJSFLibraryExtensions() {
-		try {
-			IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(JSFCorePlugin.PLUGIN_ID, OLD_LIB_EXT_PT);
-			IExtension[] extensions = point.getExtensions();
-			for (int i=0;i < extensions.length;i++){
-				IExtension ext = extensions[i];
-				for (int j=0;j < ext.getConfigurationElements().length;j++){
-					PluginProvidedJSFLibraryCreationHelper newLibCreator = new PluginProvidedJSFLibraryCreationHelper(ext.getConfigurationElements()[j]);						
-					JSFLibrary newLib = newLibCreator.create();
-					
-					/**
-					 * Additional check on if a plug-in contributes jsflibraries is an expanded folder.
-					 * Fix related to bug 144954.  
-					 * 
-					 * It would be ideal to check if a plug-in is distributed as a JAR 
-					 * before a JSFLibrary is created.
-					 * 
-					 * This is a temporary solution since JARs in a JAR case is not 
-					 * supported in this release.  Bug 14496.
-					 */
-					if (newLib != null ) //&& isJSFLibinExpandedFolder(newLib))
-						jsfLibraryRegistry.addJSFLibrary(newLib);
-				}
-			}
-		} catch (InvalidRegistryObjectException e) {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.JSFLibraryRegistry_ErrorLoadingFromExtPt, e);
-		}
-	}
-	
-	/**
-	 * Saves the JSFLibraryRegistry EMF object from plugin-specfic workspace
-	 * settings location. (Called from stop(BundleContext).)
-	 * @return true if save is successful
-	 */
-	public boolean saveJSFLibraryRegistry() {
-		boolean saved = false;
-		if (jsfLibraryRegistryResource != null) {
-			try {
-				jsfLibraryRegistryResource.save(Collections.EMPTY_MAP);
-				saved = true;
-			} catch(IOException ioe) {
-				JSFCorePlugin.log(IStatus.ERROR, Messages.JSFLibraryRegistry_ErrorSaving, ioe);
-			}
-		} else {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.JSFLibraryRegistry_ErrorSaving);
-		}
-		return saved;
-	}
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/ArchiveFile.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/ArchiveFile.java
deleted file mode 100644
index 01941ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/ArchiveFile.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Archive File</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#isRelativeToWorkspace <em>Relative To Workspace</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getSourceLocation <em>Source Location</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getRelativeDestLocation <em>Relative Dest Location</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getJSFLibrary <em>JSF Library</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getArchiveFile()
- * @model
- * @generated
- */
-public interface ArchiveFile extends EObject{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Source Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Source Location</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Source Location</em>' attribute.
-	 * @see #setSourceLocation(String)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getArchiveFile_SourceLocation()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getSourceLocation();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getSourceLocation <em>Source Location</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * If the value passed is found to be relative to the workspace, a
-	 * workspace-relative location is stored; to prevent this behaviour, call
-	 * isRelativeToWorkspace(false) before calling this method.
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Source Location</em>' attribute.
-	 * @see #getSourceLocation()
-	 * @generated
-	 */
-	void setSourceLocation(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Relative To Workspace</b></em>' attribute.
-	 * The default value is <code>"true"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Relative To Workspace</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Relative To Workspace</em>' attribute.
-	 * @see #setRelativeToWorkspace(boolean)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getArchiveFile_RelativeToWorkspace()
-	 * @model default="true" required="true"
-	 * @generated
-	 */
-	boolean isRelativeToWorkspace();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#isRelativeToWorkspace <em>Relative To Workspace</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Relative To Workspace</em>' attribute.
-	 * @see #isRelativeToWorkspace()
-	 * @generated
-	 */
-	void setRelativeToWorkspace(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Relative Dest Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Relative Dest Location</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Relative Dest Location</em>' attribute.
-	 * @see #setRelativeDestLocation(String)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getArchiveFile_RelativeDestLocation()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getRelativeDestLocation();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getRelativeDestLocation <em>Relative Dest Location</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Relative Dest Location</em>' attribute.
-	 * @see #getRelativeDestLocation()
-	 * @generated
-	 */
-	void setRelativeDestLocation(String value);
-
-	/**
-	 * Returns the value of the '<em><b>JSF Library</b></em>' container reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getArchiveFiles <em>Archive Files</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>JSF Library</em>' container reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>JSF Library</em>' container reference.
-	 * @see #setJSFLibrary(JSFLibrary)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getArchiveFile_JSFLibrary()
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getArchiveFiles
-	 * @model opposite="ArchiveFiles" required="true"
-	 * @generated
-	 */
-	JSFLibrary getJSFLibrary();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getJSFLibrary <em>JSF Library</em>}' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>JSF Library</em>' container reference.
-	 * @see #getJSFLibrary()
-	 * @generated
-	 */
-	void setJSFLibrary(JSFLibrary value);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Path</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * @return the path
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true"
-	 * @generated
-	 */
-	String getPath();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the name 
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true"
-	 * @generated
-	 */
-	String getName();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return true if exists 
-	 * <!-- end-user-doc -->
-	 * @model required="true"
-	 * @generated
-	 */
-	boolean exists();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * @return true if equal 
-	 * <!-- end-user-doc -->
-	 * @model required="true" objectRequired="true"
-	 * @generated
-	 */
-	boolean equals(Object object);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the hashCode 
-	 * <!-- end-user-doc -->
-	 * @model required="true"
-	 * @generated
-	 */
-	int hashCode();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param baseDestLocation 
-	 * @return true if copied succeeds 
-	 * <!-- end-user-doc -->
-	 * @model required="true" baseDestLocationRequired="true"
-	 * @generated
-	 */
-	boolean copyTo(String baseDestLocation);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the resolved source location 
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true"
-	 * @generated
-	 */
-	String getResolvedSourceLocation();
-
-} // ArchiveFile
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibrary.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibrary.java
deleted file mode 100644
index a50d990..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibrary.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>JSF Library</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getID <em>ID</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getJSFVersion <em>JSF Version</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isDeployed <em>Deployed</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isImplementation <em>Implementation</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getArchiveFiles <em>Archive Files</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibrary()
- * @model
- * @generated
- */
-public interface JSFLibrary extends EObject{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>ID</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>ID</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>ID</em>' attribute.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibrary_ID()
-	 * @model default="" transient="true" changeable="false" derived="true"
-	 * @generated
-	 */
-	String getID();
-
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Name</em>' attribute.
-	 * @see #setName(String)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibrary_Name()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getName <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' attribute.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(String value);
-
-	/**
-	 * Returns the value of the '<em><b>JSF Version</b></em>' attribute.
-	 * The default value is <code>"UNKNOWN"</code>.
-	 * The literals are from the enumeration {@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>JSF Version</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>JSF Version</em>' attribute.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion
-	 * @see #setJSFVersion(JSFVersion)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibrary_JSFVersion()
-	 * @model default="UNKNOWN" required="true"
-	 * @generated
-	 */
-	JSFVersion getJSFVersion();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getJSFVersion <em>JSF Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>JSF Version</em>' attribute.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion
-	 * @see #getJSFVersion()
-	 * @generated
-	 */
-	void setJSFVersion(JSFVersion value);
-
-	/**
-	 * Returns the value of the '<em><b>Deployed</b></em>' attribute.
-	 * The default value is <code>"true"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Deployed</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Deployed</em>' attribute.
-	 * @see #setDeployed(boolean)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibrary_Deployed()
-	 * @model default="true" required="true"
-	 * @generated
-	 */
-	boolean isDeployed();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isDeployed <em>Deployed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Deployed</em>' attribute.
-	 * @see #isDeployed()
-	 * @generated
-	 */
-	void setDeployed(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Implementation</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Implementation</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Implementation</em>' attribute.
-	 * @see #setImplementation(boolean)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibrary_Implementation()
-	 * @model default="false" required="true"
-	 * @generated
-	 */
-	boolean isImplementation();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isImplementation <em>Implementation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Implementation</em>' attribute.
-	 * @see #isImplementation()
-	 * @generated
-	 */
-	void setImplementation(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Archive Files</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getJSFLibrary <em>JSF Library</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Archive Files</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Archive Files</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibrary_ArchiveFiles()
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getJSFLibrary
-	 * @model type="org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile" opposite="JSFLibrary" containment="true"
-	 * @generated
-	 */
-	EList getArchiveFiles();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param fullPath 
-	 * @return true if fullPath contains archive file 
-	 * <!-- end-user-doc -->
-	 * @model required="true" fullPathRequired="true"
-	 * @generated
-	 */
-	boolean containsArchiveFile(String fullPath);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the working copy 
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true"
-	 * @generated
-	 */
-	JSFLibrary getWorkingCopy();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param otherLibrary 
-	 * <!-- end-user-doc -->
-	 * @model otherLibraryRequired="true"
-	 * @generated
-	 */
-	void updateValues(JSFLibrary otherLibrary);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param baseDestLocation 
-	 * @return true if copy succeeds 
-	 * <!-- end-user-doc -->
-	 * @model required="true" baseDestLocationRequired="true"
-	 * @generated
-	 */
-	boolean copyTo(String baseDestLocation);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return label
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true"
-	 * @generated
-	 */
-	String getLabel();
-
-} // JSFLibrary
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistry.java
deleted file mode 100644
index 73b7057..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistry.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.core.internal.Messages;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>JSF Library Registry</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getDefaultImplementationID <em>Default Implementation ID</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getJSFLibraries <em>JSF Libraries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getPluginProvidedJSFLibraries <em>Plugin Provided JSF Libraries</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibraryRegistry()
- * @model
- * @generated
- */
-public interface JSFLibraryRegistry extends EObject{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Default Implementation ID</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Implementation ID</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Default Implementation ID</em>' attribute.
-	 * @see #setDefaultImplementationID(String)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibraryRegistry_DefaultImplementationID()
-	 * @model default=""
-	 * @generated
-	 */
-	String getDefaultImplementationID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getDefaultImplementationID <em>Default Implementation ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Implementation ID</em>' attribute.
-	 * @see #getDefaultImplementationID()
-	 * @generated
-	 */
-	void setDefaultImplementationID(String value);
-
-	/**
-	 *The default implementation message string
-	 */
-	public static final String DEFAULT_IMPL_LABEL = Messages.JSFLibraryRegistry_DEFAULT_IMPL_LABEL;
-
-	/**
-	 * Returns the value of the '<em><b>JSF Libraries</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>JSF Libraries</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>JSF Libraries</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibraryRegistry_JSFLibraries()
-	 * @model type="org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary" containment="true"
-	 * @generated
-	 */
-	EList getJSFLibraries();
-
-	/**
-	 * Returns the value of the '<em><b>Plugin Provided JSF Libraries</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Plugin Provided JSF Libraries</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Plugin Provided JSF Libraries</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibraryRegistry_PluginProvidedJSFLibraries()
-	 * @model type="org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary" containment="true" transient="true"
-	 * @generated
-	 */
-	EList getPluginProvidedJSFLibraries();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Implementation</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * @return the default implementation 
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true"
-	 * @generated
-	 */
-	JSFLibrary getDefaultImplementation();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param implementation 
-	 * <!-- end-user-doc -->
-	 * @model implementationRequired="true"
-	 * @generated
-	 */
-	void setDefaultImplementation(JSFLibrary implementation);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param ID 
-	 * @return the jsf library 
-	 * <!-- end-user-doc -->
-	 * @model required="true" IDRequired="true"
-	 * @generated
-	 */
-	JSFLibrary getJSFLibraryByID(String ID);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param name 
-	 * @return the jsf libraries matching name 
-	 * <!-- end-user-doc -->
-	 * @model required="true" many="false" nameRequired="true"
-	 * @generated
-	 */
-	EList getJSFLibrariesByName(String name);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the implementation JSF libraries 
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true" many="false"
-	 * @generated
-	 */
-	EList getImplJSFLibraries();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the non-implementation JSF libraries 
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true" many="false"
-	 * @generated
-	 */
-	EList getNonImplJSFLibraries();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return all the JSF libraries 
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true" many="false"
-	 * @generated
-	 */
-	EList getAllJSFLibraries();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param library 
-	 * @return true if add succeeds 
-	 * <!-- end-user-doc -->
-	 * @model required="true" libraryRequired="true"
-	 * @generated
-	 */
-	boolean addJSFLibrary(JSFLibrary library);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param library 
-	 * @return true if remove succeeds 
-	 * <!-- end-user-doc -->
-	 * @model required="true" libraryRequired="true"
-	 * @generated
-	 */
-	boolean removeJSFLibrary(JSFLibrary library);
-
-} // JSFLibraryRegistry
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistryFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistryFactory.java
deleted file mode 100644
index 77560bd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistryFactory.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage
- * @generated
- */
-public interface JSFLibraryRegistryFactory extends EFactory{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	JSFLibraryRegistryFactory eINSTANCE = org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryFactoryImpl.init();
-
-	/**
-	 * Returns a new object of class '<em>JSF Library Registry</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>JSF Library Registry</em>'.
-	 * @generated
-	 */
-	JSFLibraryRegistry createJSFLibraryRegistry();
-
-	/**
-	 * Returns a new object of class '<em>JSF Library</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>JSF Library</em>'.
-	 * @generated
-	 */
-	JSFLibrary createJSFLibrary();
-
-	/**
-	 * Returns a new object of class '<em>Archive File</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Archive File</em>'.
-	 * @generated
-	 */
-	ArchiveFile createArchiveFile();
-
-	/**
-	 * Returns a new object of class '<em>Plugin Provided JSF Library</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Plugin Provided JSF Library</em>'.
-	 * @generated
-	 */
-	PluginProvidedJSFLibrary createPluginProvidedJSFLibrary();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	JSFLibraryRegistryPackage getJSFLibraryRegistryPackage();
-
-} //JSFLibraryRegistryFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistryPackage.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistryPackage.java
deleted file mode 100644
index ac28f41..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistryPackage.java
+++ /dev/null
@@ -1,779 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory
- * @model kind="package"
- * @generated
- */
-public interface JSFLibraryRegistryPackage extends EPackage{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "jsflibraryregistry";
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://www.eclipse.org/webtools/jsf/schema/jsflibraryregistry.xsd";
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "jsflibreg";
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	JSFLibraryRegistryPackage eINSTANCE = org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryImpl <em>JSF Library Registry</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryImpl
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getJSFLibraryRegistry()
-	 * @generated
-	 */
-	int JSF_LIBRARY_REGISTRY = 0;
-
-	/**
-	 * The feature id for the '<em><b>Default Implementation ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>JSF Libraries</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY_REGISTRY__JSF_LIBRARIES = 1;
-
-	/**
-	 * The feature id for the '<em><b>Plugin Provided JSF Libraries</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES = 2;
-
-	/**
-	 * The number of structural features of the '<em>JSF Library Registry</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY_REGISTRY_FEATURE_COUNT = 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl <em>JSF Library</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getJSFLibrary()
-	 * @generated
-	 */
-	int JSF_LIBRARY = 1;
-
-	/**
-	 * The feature id for the '<em><b>ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY__NAME = 1;
-
-	/**
-	 * The feature id for the '<em><b>JSF Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY__JSF_VERSION = 2;
-
-	/**
-	 * The feature id for the '<em><b>Deployed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY__DEPLOYED = 3;
-
-	/**
-	 * The feature id for the '<em><b>Implementation</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY__IMPLEMENTATION = 4;
-
-	/**
-	 * The feature id for the '<em><b>Archive Files</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY__ARCHIVE_FILES = 5;
-
-	/**
-	 * The number of structural features of the '<em>JSF Library</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY_FEATURE_COUNT = 6;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl <em>Archive File</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getArchiveFile()
-	 * @generated
-	 */
-	int ARCHIVE_FILE = 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.PluginProvidedJSFLibraryImpl <em>Plugin Provided JSF Library</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.PluginProvidedJSFLibraryImpl
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getPluginProvidedJSFLibrary()
-	 * @generated
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY = 2;
-
-	/**
-	 * The feature id for the '<em><b>ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__ID = JSF_LIBRARY__ID;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__NAME = JSF_LIBRARY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>JSF Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__JSF_VERSION = JSF_LIBRARY__JSF_VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Deployed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__DEPLOYED = JSF_LIBRARY__DEPLOYED;
-
-	/**
-	 * The feature id for the '<em><b>Implementation</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__IMPLEMENTATION = JSF_LIBRARY__IMPLEMENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Archive Files</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__ARCHIVE_FILES = JSF_LIBRARY__ARCHIVE_FILES;
-
-	/**
-	 * The feature id for the '<em><b>Plugin ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID = JSF_LIBRARY_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Label</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__LABEL = JSF_LIBRARY_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Plugin Provided JSF Library</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY_FEATURE_COUNT = JSF_LIBRARY_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Relative To Workspace</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARCHIVE_FILE__RELATIVE_TO_WORKSPACE = 0;
-
-	/**
-	 * The feature id for the '<em><b>Source Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARCHIVE_FILE__SOURCE_LOCATION = 1;
-
-	/**
-	 * The feature id for the '<em><b>Relative Dest Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARCHIVE_FILE__RELATIVE_DEST_LOCATION = 2;
-
-	/**
-	 * The feature id for the '<em><b>JSF Library</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARCHIVE_FILE__JSF_LIBRARY = 3;
-
-	/**
-	 * The number of structural features of the '<em>Archive File</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARCHIVE_FILE_FEATURE_COUNT = 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion <em>JSF Version</em>}' enum.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getJSFVersion()
-	 * @generated
-	 */
-	int JSF_VERSION = 4;
-
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry <em>JSF Library Registry</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>JSF Library Registry</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry
-	 * @generated
-	 */
-	EClass getJSFLibraryRegistry();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getDefaultImplementationID <em>Default Implementation ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Default Implementation ID</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getDefaultImplementationID()
-	 * @see #getJSFLibraryRegistry()
-	 * @generated
-	 */
-	EAttribute getJSFLibraryRegistry_DefaultImplementationID();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getJSFLibraries <em>JSF Libraries</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>JSF Libraries</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getJSFLibraries()
-	 * @see #getJSFLibraryRegistry()
-	 * @generated
-	 */
-	EReference getJSFLibraryRegistry_JSFLibraries();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getPluginProvidedJSFLibraries <em>Plugin Provided JSF Libraries</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Plugin Provided JSF Libraries</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getPluginProvidedJSFLibraries()
-	 * @see #getJSFLibraryRegistry()
-	 * @generated
-	 */
-	EReference getJSFLibraryRegistry_PluginProvidedJSFLibraries();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary <em>JSF Library</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>JSF Library</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary
-	 * @generated
-	 */
-	EClass getJSFLibrary();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getID <em>ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>ID</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getID()
-	 * @see #getJSFLibrary()
-	 * @generated
-	 */
-	EAttribute getJSFLibrary_ID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getName()
-	 * @see #getJSFLibrary()
-	 * @generated
-	 */
-	EAttribute getJSFLibrary_Name();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getJSFVersion <em>JSF Version</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>JSF Version</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getJSFVersion()
-	 * @see #getJSFLibrary()
-	 * @generated
-	 */
-	EAttribute getJSFLibrary_JSFVersion();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isDeployed <em>Deployed</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Deployed</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isDeployed()
-	 * @see #getJSFLibrary()
-	 * @generated
-	 */
-	EAttribute getJSFLibrary_Deployed();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isImplementation <em>Implementation</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Implementation</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isImplementation()
-	 * @see #getJSFLibrary()
-	 * @generated
-	 */
-	EAttribute getJSFLibrary_Implementation();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getArchiveFiles <em>Archive Files</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Archive Files</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getArchiveFiles()
-	 * @see #getJSFLibrary()
-	 * @generated
-	 */
-	EReference getJSFLibrary_ArchiveFiles();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile <em>Archive File</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Archive File</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile
-	 * @generated
-	 */
-	EClass getArchiveFile();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getSourceLocation <em>Source Location</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Source Location</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getSourceLocation()
-	 * @see #getArchiveFile()
-	 * @generated
-	 */
-	EAttribute getArchiveFile_SourceLocation();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#isRelativeToWorkspace <em>Relative To Workspace</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Relative To Workspace</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#isRelativeToWorkspace()
-	 * @see #getArchiveFile()
-	 * @generated
-	 */
-	EAttribute getArchiveFile_RelativeToWorkspace();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getRelativeDestLocation <em>Relative Dest Location</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Relative Dest Location</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getRelativeDestLocation()
-	 * @see #getArchiveFile()
-	 * @generated
-	 */
-	EAttribute getArchiveFile_RelativeDestLocation();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getJSFLibrary <em>JSF Library</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the container reference '<em>JSF Library</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getJSFLibrary()
-	 * @see #getArchiveFile()
-	 * @generated
-	 */
-	EReference getArchiveFile_JSFLibrary();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary <em>Plugin Provided JSF Library</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Plugin Provided JSF Library</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary
-	 * @generated
-	 */
-	EClass getPluginProvidedJSFLibrary();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary#getPluginID <em>Plugin ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Plugin ID</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary#getPluginID()
-	 * @see #getPluginProvidedJSFLibrary()
-	 * @generated
-	 */
-	EAttribute getPluginProvidedJSFLibrary_PluginID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary#getLabel <em>Label</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Label</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary#getLabel()
-	 * @see #getPluginProvidedJSFLibrary()
-	 * @generated
-	 */
-	EAttribute getPluginProvidedJSFLibrary_Label();
-
-	/**
-	 * Returns the meta object for enum '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion <em>JSF Version</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for enum '<em>JSF Version</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion
-	 * @generated
-	 */
-	EEnum getJSFVersion();
-
-	/**
-	 * Returns the factory that creates the instances of the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	JSFLibraryRegistryFactory getJSFLibraryRegistryFactory();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Defines literals for the meta objects that represent
-	 * <ul>
-	 *   <li>each class,</li>
-	 *   <li>each feature of each class,</li>
-	 *   <li>each enum,</li>
-	 *   <li>and each data type</li>
-	 * </ul>
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	interface Literals {
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryImpl <em>JSF Library Registry</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryImpl
-		 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getJSFLibraryRegistry()
-		 * @generated
-		 */
-        @SuppressWarnings("hiding")
-		EClass JSF_LIBRARY_REGISTRY = eINSTANCE.getJSFLibraryRegistry();
-
-		/**
-		 * The meta object literal for the '<em><b>Default Implementation ID</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-        @SuppressWarnings("hiding")
-        EAttribute JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID = eINSTANCE.getJSFLibraryRegistry_DefaultImplementationID();
-
-		/**
-		 * The meta object literal for the '<em><b>JSF Libraries</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-        @SuppressWarnings("hiding")
-		EReference JSF_LIBRARY_REGISTRY__JSF_LIBRARIES = eINSTANCE.getJSFLibraryRegistry_JSFLibraries();
-
-		/**
-		 * The meta object literal for the '<em><b>Plugin Provided JSF Libraries</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-        @SuppressWarnings("hiding")
-		EReference JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES = eINSTANCE.getJSFLibraryRegistry_PluginProvidedJSFLibraries();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl <em>JSF Library</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl
-		 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getJSFLibrary()
-		 * @generated
-		 */
-        @SuppressWarnings("hiding")
-		EClass JSF_LIBRARY = eINSTANCE.getJSFLibrary();
-
-		/**
-		 * The meta object literal for the '<em><b>ID</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-        @SuppressWarnings("hiding")
-		EAttribute JSF_LIBRARY__ID = eINSTANCE.getJSFLibrary_ID();
-
-		/**
-		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-        @SuppressWarnings("hiding")
-		EAttribute JSF_LIBRARY__NAME = eINSTANCE.getJSFLibrary_Name();
-
-		/**
-		 * The meta object literal for the '<em><b>JSF Version</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-        @SuppressWarnings("hiding")
-		EAttribute JSF_LIBRARY__JSF_VERSION = eINSTANCE.getJSFLibrary_JSFVersion();
-
-		/**
-		 * The meta object literal for the '<em><b>Deployed</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-        @SuppressWarnings("hiding")
-		EAttribute JSF_LIBRARY__DEPLOYED = eINSTANCE.getJSFLibrary_Deployed();
-
-		/**
-		 * The meta object literal for the '<em><b>Implementation</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-        @SuppressWarnings("hiding")
-		EAttribute JSF_LIBRARY__IMPLEMENTATION = eINSTANCE.getJSFLibrary_Implementation();
-
-		/**
-		 * The meta object literal for the '<em><b>Archive Files</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-        @SuppressWarnings("hiding")
-		EReference JSF_LIBRARY__ARCHIVE_FILES = eINSTANCE.getJSFLibrary_ArchiveFiles();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl <em>Archive File</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl
-		 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getArchiveFile()
-		 * @generated
-		 */
-        @SuppressWarnings("hiding")
-		EClass ARCHIVE_FILE = eINSTANCE.getArchiveFile();
-
-		/**
-		 * The meta object literal for the '<em><b>Relative To Workspace</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-        @SuppressWarnings("hiding")
-		EAttribute ARCHIVE_FILE__RELATIVE_TO_WORKSPACE = eINSTANCE.getArchiveFile_RelativeToWorkspace();
-
-		/**
-		 * The meta object literal for the '<em><b>Source Location</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-        @SuppressWarnings("hiding")
-		EAttribute ARCHIVE_FILE__SOURCE_LOCATION = eINSTANCE.getArchiveFile_SourceLocation();
-
-		/**
-		 * The meta object literal for the '<em><b>Relative Dest Location</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-        @SuppressWarnings("hiding")
-		EAttribute ARCHIVE_FILE__RELATIVE_DEST_LOCATION = eINSTANCE.getArchiveFile_RelativeDestLocation();
-
-		/**
-		 * The meta object literal for the '<em><b>JSF Library</b></em>' container reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-        @SuppressWarnings("hiding")
-		EReference ARCHIVE_FILE__JSF_LIBRARY = eINSTANCE.getArchiveFile_JSFLibrary();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.PluginProvidedJSFLibraryImpl <em>Plugin Provided JSF Library</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.PluginProvidedJSFLibraryImpl
-		 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getPluginProvidedJSFLibrary()
-		 * @generated
-		 */
-        @SuppressWarnings("hiding")
-		EClass PLUGIN_PROVIDED_JSF_LIBRARY = eINSTANCE.getPluginProvidedJSFLibrary();
-
-		/**
-		 * The meta object literal for the '<em><b>Plugin ID</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-        @SuppressWarnings("hiding")
-		EAttribute PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID = eINSTANCE.getPluginProvidedJSFLibrary_PluginID();
-
-		/**
-		 * The meta object literal for the '<em><b>Label</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		@SuppressWarnings("hiding")
-		EAttribute PLUGIN_PROVIDED_JSF_LIBRARY__LABEL = eINSTANCE.getPluginProvidedJSFLibrary_Label();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion <em>JSF Version</em>}' enum.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion
-		 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getJSFVersion()
-		 * @generated
-		 */
-        @SuppressWarnings("hiding")
-		EEnum JSF_VERSION = eINSTANCE.getJSFVersion();
-
-	}
-
-} //JSFLibraryRegistryPackage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFVersion.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFVersion.java
deleted file mode 100644
index ad9f7f6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFVersion.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.AbstractEnumerator;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the literals of the enumeration '<em><b>JSF Version</b></em>',
- * and utility methods for working with them.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFVersion()
- * @model
- * @generated
- */
-public final class JSFVersion extends AbstractEnumerator {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * The '<em><b>UNKNOWN</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>UNKNOWN</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #UNKNOWN_LITERAL
-	 * @model
-	 * @generated
-	 * @ordered
-	 */
-	public static final int UNKNOWN = -1;
-
-	/**
-	 * The '<em><b>V1 1</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>V1 1</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #V1_1_LITERAL
-	 * @model name="v1_1"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int V1_1 = 1;
-
-	/**
-	 * The '<em><b>V1 2</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>V1 2</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #V1_2_LITERAL
-	 * @model name="v1_2"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int V1_2 = 2;
-
-	/**
-	 * The '<em><b>UNKNOWN</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #UNKNOWN
-	 * @generated
-	 * @ordered
-	 */
-	public static final JSFVersion UNKNOWN_LITERAL = new JSFVersion(UNKNOWN, "UNKNOWN", "UNKNOWN");
-
-	/**
-	 * The '<em><b>V1 1</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #V1_1
-	 * @generated
-	 * @ordered
-	 */
-	public static final JSFVersion V1_1_LITERAL = new JSFVersion(V1_1, "v1_1", "v1_1");
-
-	/**
-	 * The '<em><b>V1 2</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #V1_2
-	 * @generated
-	 * @ordered
-	 */
-	public static final JSFVersion V1_2_LITERAL = new JSFVersion(V1_2, "v1_2", "v1_2");
-
-	/**
-	 * An array of all the '<em><b>JSF Version</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final JSFVersion[] VALUES_ARRAY =
-		new JSFVersion[] {
-			UNKNOWN_LITERAL,
-			V1_1_LITERAL,
-			V1_2_LITERAL,
-		};
-
-	/**
-	 * A public read-only list of all the '<em><b>JSF Version</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
-
-	/**
-	 * Returns the '<em><b>JSF Version</b></em>' literal with the specified literal value.
-	 * <!-- begin-user-doc -->
-	 * @param literal value
-	 * @return the JSF version for name value 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static JSFVersion get(String literal) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			JSFVersion result = VALUES_ARRAY[i];
-			if (result.toString().equals(literal)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>JSF Version</b></em>' literal with the specified name.
-	 * <!-- begin-user-doc -->
-	 * @param name 
-	 * @return JSFVersion
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static JSFVersion getByName(String name) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			JSFVersion result = VALUES_ARRAY[i];
-			if (result.getName().equals(name)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>JSF Version</b></em>' literal with the specified integer value.
-	 * <!-- begin-user-doc -->
-	 * @param value 
-	 * @return the JSFVersion for the integer 'value' 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static JSFVersion get(int value) {
-		switch (value) {
-			case UNKNOWN: return UNKNOWN_LITERAL;
-			case V1_1: return V1_1_LITERAL;
-			case V1_2: return V1_2_LITERAL;
-		}
-		return null;
-	}
-
-	/**
-	 * Only this class can construct instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private JSFVersion(int value, String name, String literal) {
-		super(value, name, literal);
-	}
-
-	/**
-	 * Returns the '<em><b>JSF Version</b></em>' literal with the specified
-	 * name like the get(String) method does, but will return UNKNOWN instead
-	 * of null if the name is not recognized.
-	 * <!-- begin-user-doc -->
-	 * @param name 
-	 * @return the JSFVersion
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public static JSFVersion getJSFVersion(String name) {
-		JSFVersion version = get(name);
-		if (version == null) {
-			version = UNKNOWN_LITERAL;
-		}
-		return version;
-	}
-
-} //JSFVersion
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/PluginProvidedJSFLibrary.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/PluginProvidedJSFLibrary.java
deleted file mode 100644
index 89722da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/PluginProvidedJSFLibrary.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Plugin Provided JSF Library</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary#getPluginID <em>Plugin ID</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary#getLabel <em>Label</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getPluginProvidedJSFLibrary()
- * @model
- * @generated
- */
-public interface PluginProvidedJSFLibrary extends JSFLibrary{
-	/**
-	 * Separator between plugin id and JSF Library name
-	 */
-	public static final String ID_SEPARATOR = "$$";
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Plugin ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Plugin ID</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Plugin ID</em>' attribute.
-	 * @see #setPluginID(String)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getPluginProvidedJSFLibrary_PluginID()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getPluginID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary#getPluginID <em>Plugin ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Plugin ID</em>' attribute.
-	 * @see #getPluginID()
-	 * @generated
-	 */
-	void setPluginID(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Label</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Label</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Label</em>' attribute.
-	 * @see #setLabel(String)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getPluginProvidedJSFLibrary_Label()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getLabel();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary#getLabel <em>Label</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Label</em>' attribute.
-	 * @see #getLabel()
-	 * @generated
-	 */
-	void setLabel(String value);
-
-} // PluginProvidedJSFLibrary
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/adapter/MaintainDefaultImplementationAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/adapter/MaintainDefaultImplementationAdapter.java
deleted file mode 100644
index 6f6ff66..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/adapter/MaintainDefaultImplementationAdapter.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.adapter;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-
-/**
- * EMF adapter that attempts to always maintain a default implementation
- * JSFLibrary upon addition and removal of JSFLibrary instances and upon
- * changing of a JSFLibrary instance's implementation property.
- * 
- * @author Ian Trimble - Oracle
- */
-public class MaintainDefaultImplementationAdapter extends AdapterImpl {
-
-	private static MaintainDefaultImplementationAdapter INSTANCE =
-		new MaintainDefaultImplementationAdapter();
-
-	/**
-	 * Gets the single instance of this adapter.
-	 * 
-	 * @return The single instance of this adapter.
-	 */
-	public static MaintainDefaultImplementationAdapter getInstance() {
-		return INSTANCE;
-	}
-
-	/**
-	 * Called to notify this adapter that a change has occured.
-	 * 
-	 * @param notification EMF Notification instance
-	 */
-	public void notifyChanged(Notification notification) {
-		Object objNotifier = notification.getNotifier();
-		if (objNotifier instanceof JSFLibraryRegistry) {
-			int eventType = notification.getEventType();
-			switch (eventType) {
-				case Notification.ADD:
-					Object objNewValue = notification.getNewValue();
-					if (objNewValue instanceof JSFLibrary) {
-						libraryAdded((JSFLibrary)objNewValue);
-					}
-					break;
-				case Notification.REMOVE:
-					Object objOldValue = notification.getOldValue();
-					if (objOldValue instanceof JSFLibrary) {
-						libraryRemoved((JSFLibrary)objOldValue);
-					}
-					break;
-			}
-		} else if (objNotifier instanceof JSFLibrary) {
-			if (notification.getFeatureID(JSFLibrary.class) == JSFLibraryRegistryPackage.JSF_LIBRARY__IMPLEMENTATION) {
-				implementationFlagSet((JSFLibrary)objNotifier);
-			}
-		}
-	}
-
-	/**
-	 * Checks if the library added is an implementation and, if so, makes it
-	 * the default implementation if it is the only implementation.
-	 * 
-	 * @param library JSFLibrary instance
-	 */
-	protected void libraryAdded(JSFLibrary library) {
-		if (library != null && library.isImplementation()) {
-			JSFLibraryRegistry jsfLibReg = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry();
-			EList impls = jsfLibReg.getImplJSFLibraries();
-			if (impls.size() == 1) {
-				jsfLibReg.setDefaultImplementation(library);
-			}
-		}
-	}
-
-	/**
-	 * Checks if the library removed is the default implementation and, if so,
-	 * makes the first remaining implementation the new default or nulls out
-	 * the default implementation if no other implementation remains. 
-	 * 
-	 * @param library JSFLibrary instance
-	 */
-	protected void libraryRemoved(JSFLibrary library) {
-		if (library != null && library.isImplementation()) {
-			JSFLibraryRegistry jsfLibReg = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry();
-			JSFLibrary defaultImpl = jsfLibReg.getDefaultImplementation(); 
-			if (defaultImpl == null || library.getID().equals(defaultImpl.getID())) { 
-				setNewDefaultImplementation();
-			}
-		}
-	}
-
-	/**
-	 * Checks if the implementation flag of the JSFLibrary has been changed
-	 * such that it is now eligible to become the default implementation or
-	 * such that it is no longer eligible as the default implementation and
-	 * sets the default implementation appropriately. Note that the passed
-	 * JSFLibrary instance must have been added to the model before calling
-	 * this method for it to have any effect.
-	 * 
-	 * @param library JSFLibrary instance
-	 */
-	protected void implementationFlagSet(JSFLibrary library) {
-		JSFLibraryRegistry jsfLibReg = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry();
-		if (jsfLibReg != null) {
-			JSFLibrary defaultImpl = jsfLibReg.getDefaultImplementation();
-			if (
-					library.isImplementation() &&
-					defaultImpl == null
-			) {
-				jsfLibReg.setDefaultImplementation(library);
-			} else if (
-					!library.isImplementation() &&
-					(defaultImpl != null && library.getID() == defaultImpl.getID())
-			) {
-				setNewDefaultImplementation();
-			}
-		}
-	}
-
-	/**
-	 * Sets the first available JSFLibrary marked as an implementation as the
-	 * default implementation or sets the default implementation to null if no
-	 * JSFLibrary is marked as an implementation.
-	 */
-	protected void setNewDefaultImplementation() {
-		JSFLibraryRegistry jsfLibReg = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry();
-		EList impls = jsfLibReg.getImplJSFLibraries();
-		if (impls.size() > 0) {
-			jsfLibReg.setDefaultImplementation((JSFLibrary)impls.get(0));
-		} else {
-			jsfLibReg.setDefaultImplementation(null);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/ArchiveFileImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/ArchiveFileImpl.java
deleted file mode 100644
index a0c9407..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/ArchiveFileImpl.java
+++ /dev/null
@@ -1,705 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URL;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.Bundle;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Archive File</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl#isRelativeToWorkspace <em>Relative To Workspace</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl#getSourceLocation <em>Source Location</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl#getRelativeDestLocation <em>Relative Dest Location</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl#getJSFLibrary <em>JSF Library</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ArchiveFileImpl extends EObjectImpl implements ArchiveFile {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * The default value of the '{@link #isRelativeToWorkspace() <em>Relative To Workspace</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isRelativeToWorkspace()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean RELATIVE_TO_WORKSPACE_EDEFAULT = true;
-
-	/**
-	 * The cached value of the '{@link #isRelativeToWorkspace() <em>Relative To Workspace</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isRelativeToWorkspace()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean relativeToWorkspace = RELATIVE_TO_WORKSPACE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getSourceLocation() <em>Source Location</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSourceLocation()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SOURCE_LOCATION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getSourceLocation() <em>Source Location</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSourceLocation()
-	 * @generated
-	 * @ordered
-	 */
-	protected String sourceLocation = SOURCE_LOCATION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRelativeDestLocation() <em>Relative Dest Location</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRelativeDestLocation()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String RELATIVE_DEST_LOCATION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRelativeDestLocation() <em>Relative Dest Location</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRelativeDestLocation()
-	 * @generated
-	 * @ordered
-	 */
-	protected String relativeDestLocation = RELATIVE_DEST_LOCATION_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ArchiveFileImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the static eClass 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return JSFLibraryRegistryPackage.Literals.ARCHIVE_FILE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the source location
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getSourceLocation() {
-		return sourceLocation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Enhanced to not only set the location but also to attempt to determine
-	 * if the location passed is relative to the current workspace. If so, only
-	 * the relative location is stored. If not, the full location as passed is
-	 * stored and the relativeToWorkspace property is set to false. To override
-	 * this behaviour and set the absolute location as passed regardless, call
-	 * setRelativeToWorkspace(false) BEFORE calling this method.
-	 * 
-	 * @param newSourceLocation 
-	 *  
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public void setSourceLocation(String newSourceLocation) {
-		String oldSourceLocation = sourceLocation;
-		if (relativeToWorkspace) {
-			IWorkspaceRoot workspaceRoot = getWorkspaceRoot();
-			if (workspaceRoot != null) {
-				IPath wsRootPath = workspaceRoot.getLocation();
-				IPath srcPath = new Path(newSourceLocation);
-				if (workspaceRoot.findMember(srcPath) != null) {
-					sourceLocation = newSourceLocation;
-				} else if (wsRootPath.isPrefixOf(srcPath)) {
-					int segmentsMatched = wsRootPath.matchingFirstSegments(srcPath);
-					srcPath = srcPath.removeFirstSegments(segmentsMatched).setDevice(null);
-					sourceLocation = srcPath.toOSString();
-				} else {
-					sourceLocation = newSourceLocation;
-					relativeToWorkspace = false;
-				}
-			}
-		} else {
-			sourceLocation = newSourceLocation;
-		}
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.ARCHIVE_FILE__SOURCE_LOCATION, oldSourceLocation, sourceLocation));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return true if file is relative to workspace 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isRelativeToWorkspace() {
-		return relativeToWorkspace;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * To override workspace-relative recognition behaviour, be sure to call
-	 * this method with a false value BEFORE calling setLocation(String).
-	 * @param newRelativeToWorkspace 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRelativeToWorkspace(boolean newRelativeToWorkspace) {
-		boolean oldRelativeToWorkspace = relativeToWorkspace;
-		relativeToWorkspace = newRelativeToWorkspace;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_TO_WORKSPACE, oldRelativeToWorkspace, relativeToWorkspace));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return  the relative destination location 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getRelativeDestLocation() {
-		return relativeDestLocation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newRelativeDestLocation 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRelativeDestLocation(String newRelativeDestLocation) {
-		String oldRelativeDestLocation = relativeDestLocation;
-		relativeDestLocation = newRelativeDestLocation;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_DEST_LOCATION, oldRelativeDestLocation, relativeDestLocation));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the jsf library instance 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibrary getJSFLibrary() {
-		if (eContainerFeatureID != JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY) return null;
-		return (JSFLibrary)eContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newJSFLibrary 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetJSFLibrary(JSFLibrary newJSFLibrary, NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject)newJSFLibrary, JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY, msgs);
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newJSFLibrary 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setJSFLibrary(JSFLibrary newJSFLibrary) {
-		if (newJSFLibrary != eInternalContainer() || (eContainerFeatureID != JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY && newJSFLibrary != null)) {
-			if (EcoreUtil.isAncestor(this, newJSFLibrary))
-				throw new IllegalArgumentException("Recursive containment not allowed for " + toString());
-			NotificationChain msgs = null;
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newJSFLibrary != null)
-				msgs = ((InternalEObject)newJSFLibrary).eInverseAdd(this, JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES, JSFLibrary.class, msgs);
-			msgs = basicSetJSFLibrary(newJSFLibrary, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY, newJSFLibrary, newJSFLibrary));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the path 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getPath() {
-		String path = null;
-		String resolvedSourceLocation = getResolvedSourceLocation();
-		if (resolvedSourceLocation != null) {
-			int iPos = resolvedSourceLocation.lastIndexOf('/');
-			if (iPos < 0) {
-				iPos = resolvedSourceLocation.lastIndexOf('\\');
-			}
-			if (iPos < 1) {
-				path = ""; //$NON-NLS-1$
-			} else {
-				path = resolvedSourceLocation.substring(0, iPos);
-			}
-		}
-		return path;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the name 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getName() {
-		String name = null;
-		String resolvedSourceLocation = getResolvedSourceLocation();
-		if (resolvedSourceLocation != null) {
-			int iPos = resolvedSourceLocation.lastIndexOf('/');
-			if (iPos < 0) {
-				iPos = resolvedSourceLocation.lastIndexOf('\\');
-			}
-			if (iPos < 0 || iPos == resolvedSourceLocation.length() - 1) {
-				name = resolvedSourceLocation;
-			} else {
-				name = resolvedSourceLocation.substring(iPos + 1);
-			}
-		}
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return true if the archive file exists in the bundle 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean exists() {
-		boolean exists = false;
-		if (getJSFLibrary() instanceof PluginProvidedJSFLibrary) {
-			Bundle bundle = getBundle();
-			if (bundle != null) {
-				exists = bundle.getEntry(sourceLocation) != null;
-			}
-		} else {
-			String resolvedSourceLocation = getResolvedSourceLocation();
-			if (resolvedSourceLocation != null) {
-				exists = new File(resolvedSourceLocation).exists();
-			}
-		}
-		return exists;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * @return true if equal 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean equals(Object object) {
-		boolean equal = false;
-		if (object != null && object instanceof ArchiveFile) {
-			String resolvedSourceLocation = getResolvedSourceLocation();
-			String objResolvedSourceLocation = ((ArchiveFile)object).getResolvedSourceLocation();
-			if (resolvedSourceLocation == null && objResolvedSourceLocation == null) {
-				equal = true;
-			} else if (resolvedSourceLocation != null) {
-				equal = resolvedSourceLocation.equals(objResolvedSourceLocation);
-			}
-		}
-		return equal;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return a the resolved source location hash or 0 if it is null 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public int hashCode() {
-		return getResolvedSourceLocation() != null ? getResolvedSourceLocation().hashCode() : 0;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param baseDestLocation 
-	 * @return true if the copy is successful
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean copyTo(String baseDestLocation) {
-		boolean copied = false;
-		InputStream in = null;
-		OutputStream out = null;
-		IPath outPath = new Path(baseDestLocation);
-		if (relativeDestLocation != null) {
-			outPath = outPath.append(relativeDestLocation);
-		}
-		outPath = outPath.append(getName());
-		try {
-			if (!outPath.toFile().exists()) {
-				out = new FileOutputStream(outPath.toOSString());
-			} else {
-				return copied;
-			}
-			if (getJSFLibrary() instanceof PluginProvidedJSFLibrary) {
-				Bundle bundle = getBundle();
-				URL inURL = bundle.getEntry(sourceLocation);
-				if (inURL != null) {
-					in = inURL.openStream();
-				} else {
-					JSFCorePlugin.log(
-							IStatus.ERROR,
-							NLS.bind(Messages.ArchiveFileImpl_CannotLocatePluginRelativeFile,
-									sourceLocation));
-					return copied;
-				}
-			} else {
-				in = new FileInputStream(getResolvedSourceLocation());
-			}
-			byte[] buf = new byte[1024];
-			int len = 0;
-			while ((len = in.read(buf)) > 0) {
-				out.write(buf, 0, len);
-			}
-			copied = true;
-		} catch(FileNotFoundException fnfe) {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.ArchiveFileImpl_CannotCopyFile, fnfe);
-		} catch(IOException ioe) {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.ArchiveFileImpl_CannotCopyFile, ioe);
-		} finally {
-			try {
-				if (in != null) {
-					in.close();
-				}
-				if (out != null) {
-					out.close();
-				}
-			} catch(IOException ioe) {
-				JSFCorePlugin.log(IStatus.WARNING, Messages.ArchiveFileImpl_CannotCloseFile, ioe);
-			}
-		}
-		return copied;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the resolved source location 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getResolvedSourceLocation() {
-		String resolvedSourceLocation = null;
-		/**
-		 * The implementation to support PluginProvidedJSFLibrary assume the following.
-		 * 1. Plugin provided JSF library needs to be distributed as an expanded folder.
-		 * 2. JARs for plugin provided JSF library need to reside inside the folder mentioned in item 1 above.
-		 * 3. Each JAR needs to specify a relative path for the folder mentioned in item 1 above.
-		 * 
-		 * Fix for bug 144954.
-		 */
-		if (getJSFLibrary() instanceof PluginProvidedJSFLibrary) {
-			Bundle bundle = getBundle();
-			if (bundle != null) {
-				//resolvedSourceLocation = appendSeparator(bundleLocation) + sourceLocation;
-				try {
-					Path srcPath = new Path(sourceLocation);
-					URL fileURL = FileLocator.find(bundle, srcPath, null);
-					if (fileURL != null){
-						URL url = FileLocator.resolve(fileURL);
-						resolvedSourceLocation = url.getPath();
-					}
-					else 
-						resolvedSourceLocation = sourceLocation;
-				} catch (IOException e) {
-					resolvedSourceLocation = sourceLocation;
-				}
-			} else {
-				resolvedSourceLocation = sourceLocation;
-			}
-		} else {
-			if (isRelativeToWorkspace()) {
-				IWorkspaceRoot workspaceRoot = getWorkspaceRoot();
-				if (workspaceRoot != null) {
-					String workspaceLocation = workspaceRoot.getLocation().toOSString();
-					if (workspaceLocation != null) {
-						resolvedSourceLocation = appendSeparator(workspaceLocation) + sourceLocation;
-					} else {
-						resolvedSourceLocation = sourceLocation;
-					}
-				} else {
-					resolvedSourceLocation = sourceLocation;
-				}
-			} else {
-				resolvedSourceLocation = sourceLocation;
-			}
-		}
-		return resolvedSourceLocation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetJSFLibrary((JSFLibrary)otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
-				return basicSetJSFLibrary(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs) {
-		switch (eContainerFeatureID) {
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
-				return eInternalContainer().eInverseRemove(this, JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES, JSFLibrary.class, msgs);
-		}
-		return super.eBasicRemoveFromContainerFeature(msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param featureID 
-	 * @param resolve 
-	 * @param coreType 
-	 * @return 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_TO_WORKSPACE:
-				return isRelativeToWorkspace() ? Boolean.TRUE : Boolean.FALSE;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__SOURCE_LOCATION:
-				return getSourceLocation();
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_DEST_LOCATION:
-				return getRelativeDestLocation();
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
-				return getJSFLibrary();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param featureID 
-	 * @param newValue 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_TO_WORKSPACE:
-				setRelativeToWorkspace(((Boolean)newValue).booleanValue());
-				return;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__SOURCE_LOCATION:
-				setSourceLocation((String)newValue);
-				return;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_DEST_LOCATION:
-				setRelativeDestLocation((String)newValue);
-				return;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
-				setJSFLibrary((JSFLibrary)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_TO_WORKSPACE:
-				setRelativeToWorkspace(RELATIVE_TO_WORKSPACE_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__SOURCE_LOCATION:
-				setSourceLocation(SOURCE_LOCATION_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_DEST_LOCATION:
-				setRelativeDestLocation(RELATIVE_DEST_LOCATION_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
-				setJSFLibrary((JSFLibrary)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_TO_WORKSPACE:
-				return relativeToWorkspace != RELATIVE_TO_WORKSPACE_EDEFAULT;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__SOURCE_LOCATION:
-				return SOURCE_LOCATION_EDEFAULT == null ? sourceLocation != null : !SOURCE_LOCATION_EDEFAULT.equals(sourceLocation);
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_DEST_LOCATION:
-				return RELATIVE_DEST_LOCATION_EDEFAULT == null ? relativeDestLocation != null : !RELATIVE_DEST_LOCATION_EDEFAULT.equals(relativeDestLocation);
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
-				return getJSFLibrary() != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * Gets the Bundle instance by parent PluginProvidedJSFLibrary instance's
-	 * pluginID property, if and only if the parent JSFLibrary instance IS a
-	 * PluginProvidedJSFLibrary, else returns null.
-	 * @return Bundle instance, or null if not located or applicable
-	 */
-	protected Bundle getBundle() {
-		Bundle bundle = null;
-		if (getJSFLibrary() instanceof PluginProvidedJSFLibrary) {
-			String pluginID = ((PluginProvidedJSFLibrary)getJSFLibrary()).getPluginID();
-			if (pluginID != null) {
-				bundle = Platform.getBundle(pluginID);
-			}
-		}
-		return bundle;
-	}
-
-	/**
-	 * Gets the IWorkspaceRoot instance. 
-	 * @return IWorkspaceRoot instance
-	 */
-	protected IWorkspaceRoot getWorkspaceRoot() {
-		IWorkspaceRoot workspaceRoot = null;
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		if (workspace != null) {
-			workspaceRoot = workspace.getRoot();
-		}
-		return workspaceRoot;
-	}
-
-	/**
-	 * @param path
-	 * @return the the path string with invalid path separators correctly fixed
-	 */
-	protected String appendSeparator(String path) {
-		String newPath = null;
-		if (!path.endsWith("\\") && !path.endsWith("/")) { //$NON-NLS-1$ //$NON-NLS-2$
-			newPath = path + System.getProperty("file.separator"); //$NON-NLS-1$
-		} else {
-			newPath = path;
-		}
-		return newPath;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the string representation of this archive file 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (RelativeToWorkspace: ");
-		result.append(relativeToWorkspace);
-		result.append(", SourceLocation: ");
-		result.append(sourceLocation);
-		result.append(", RelativeDestLocation: ");
-		result.append(relativeDestLocation);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ArchiveFileImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryImpl.java
deleted file mode 100644
index 2187da7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryImpl.java
+++ /dev/null
@@ -1,557 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.adapter.MaintainDefaultImplementationAdapter;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>JSF Library</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl#getID <em>ID</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl#getJSFVersion <em>JSF Version</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl#isDeployed <em>Deployed</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl#isImplementation <em>Implementation</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl#getArchiveFiles <em>Archive Files</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class JSFLibraryImpl extends EObjectImpl implements JSFLibrary {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * The default value of the '{@link #getID() <em>ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getID() <em>ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getID()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String name = NAME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getJSFVersion() <em>JSF Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getJSFVersion()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final JSFVersion JSF_VERSION_EDEFAULT = JSFVersion.UNKNOWN_LITERAL;
-
-	/**
-	 * The cached value of the '{@link #getJSFVersion() <em>JSF Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getJSFVersion()
-	 * @generated
-	 * @ordered
-	 */
-	protected JSFVersion jsfVersion = JSF_VERSION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isDeployed() <em>Deployed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isDeployed()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean DEPLOYED_EDEFAULT = true;
-
-	/**
-	 * The cached value of the '{@link #isDeployed() <em>Deployed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isDeployed()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean deployed = DEPLOYED_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isImplementation() <em>Implementation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isImplementation()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean IMPLEMENTATION_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isImplementation() <em>Implementation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isImplementation()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean implementation = IMPLEMENTATION_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getArchiveFiles() <em>Archive Files</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getArchiveFiles()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList archiveFiles;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Enhanced to not only create an instance but also to set an initial ID
-	 * (which can be reset later) and to add the
-	 * MaintainDefaultImplementationAdapter to the list of adapters.
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	protected JSFLibraryImpl() {
-		super();
-//		//set initial ID; will be overwritten from XML if already persisted
-//		setID(String.valueOf(System.currentTimeMillis()));
-		//add adapter to maintain a default implementation
-		eAdapters().add(MaintainDefaultImplementationAdapter.getInstance());
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the static eClass 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return JSFLibraryRegistryPackage.Literals.JSF_LIBRARY;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getID() {
-		return getName();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the name 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newName 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setName(String newName) {
-		String oldName = name;
-		name = newName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.JSF_LIBRARY__NAME, oldName, name));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the jsf version 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFVersion getJSFVersion() {
-		return jsfVersion;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newJSFVersion 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setJSFVersion(JSFVersion newJSFVersion) {
-		JSFVersion oldJSFVersion = jsfVersion;
-		jsfVersion = newJSFVersion == null ? JSF_VERSION_EDEFAULT : newJSFVersion;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.JSF_LIBRARY__JSF_VERSION, oldJSFVersion, jsfVersion));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return true if library is to be deployed 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isDeployed() {
-		return deployed;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newDeployed 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDeployed(boolean newDeployed) {
-		boolean oldDeployed = deployed;
-		deployed = newDeployed;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.JSF_LIBRARY__DEPLOYED, oldDeployed, deployed));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return true if implementation 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isImplementation() {
-		return implementation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newImplementation 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setImplementation(boolean newImplementation) {
-		boolean oldImplementation = implementation;
-		implementation = newImplementation;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.JSF_LIBRARY__IMPLEMENTATION, oldImplementation, implementation));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the list of archive files 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getArchiveFiles() {
-		if (archiveFiles == null) {
-			archiveFiles = new EObjectContainmentWithInverseEList(ArchiveFile.class, this, JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES, JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY);
-		}
-		return archiveFiles;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param fullPath 
-	 * @return the true if the fullPath contains an archive file 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean containsArchiveFile(String fullPath) {
-		boolean contains = false;
-		if (fullPath != null) {
-			Iterator itArchiveFiles = getArchiveFiles().iterator();
-			while (itArchiveFiles.hasNext()) {
-				ArchiveFile archiveFile = (ArchiveFile)itArchiveFiles.next();
-				if (fullPath.equals(archiveFile.getResolvedSourceLocation())) {
-					contains = true;
-					break;
-				}
-			}
-		}
-		return contains;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the working copy 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public JSFLibrary getWorkingCopy() {
-		JSFLibrary workingCopyLib = JSFLibraryRegistryFactory.eINSTANCE.createJSFLibrary();
-//		workingCopyLib.setID(getID());
-		workingCopyLib.setName(getName());
-		workingCopyLib.setJSFVersion(getJSFVersion());
-		workingCopyLib.setDeployed(isDeployed());
-		workingCopyLib.setImplementation(isImplementation());
-		Iterator itArchiveFiles = getArchiveFiles().iterator();
-		while (itArchiveFiles.hasNext()) {
-			ArchiveFile srcArchiveFile = (ArchiveFile)itArchiveFiles.next();
-			ArchiveFile destArchiveFile = JSFLibraryRegistryFactory.eINSTANCE.createArchiveFile();
-			destArchiveFile.setRelativeToWorkspace(srcArchiveFile.isRelativeToWorkspace());
-			destArchiveFile.setSourceLocation(srcArchiveFile.getSourceLocation());
-			destArchiveFile.setRelativeDestLocation(srcArchiveFile.getRelativeDestLocation());
-			workingCopyLib.getArchiveFiles().add(destArchiveFile);
-		}
-		return workingCopyLib;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param otherLibrary 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public void updateValues(JSFLibrary otherLibrary) {
-		if (otherLibrary != null) {
-//			setID(otherLibrary.getID());
-			setName(otherLibrary.getName());
-			setJSFVersion(otherLibrary.getJSFVersion());
-			setDeployed(otherLibrary.isDeployed());
-			setImplementation(otherLibrary.isImplementation());
-			Iterator itArchiveFiles = otherLibrary.getArchiveFiles().iterator();
-			getArchiveFiles().clear();
-			while (itArchiveFiles.hasNext()) {
-				ArchiveFile srcArchiveFile = (ArchiveFile)itArchiveFiles.next();
-				ArchiveFile destArchiveFile = JSFLibraryRegistryFactory.eINSTANCE.createArchiveFile();
-				destArchiveFile.setRelativeToWorkspace(srcArchiveFile.isRelativeToWorkspace());
-				destArchiveFile.setSourceLocation(srcArchiveFile.getSourceLocation());
-				destArchiveFile.setRelativeDestLocation(srcArchiveFile.getRelativeDestLocation());
-				getArchiveFiles().add(destArchiveFile);
-			}
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param baseDestLocation 
-	 * @return the base destination location 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean copyTo(String baseDestLocation) {
-		boolean allCopied = true;
-		Iterator itFiles = getArchiveFiles().iterator();
-		while (itFiles.hasNext()) {
-			ArchiveFile archiveFile = (ArchiveFile)itFiles.next();
-			boolean copied = archiveFile.copyTo(baseDestLocation);
-			allCopied = allCopied && copied;
-		}
-		return allCopied;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getLabel() {
-		return getName();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES:
-				return ((InternalEList)getArchiveFiles()).basicAdd(otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES:
-				return ((InternalEList)getArchiveFiles()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ID:
-				return getID();
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__NAME:
-				return getName();
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__JSF_VERSION:
-				return getJSFVersion();
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__DEPLOYED:
-				return isDeployed() ? Boolean.TRUE : Boolean.FALSE;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__IMPLEMENTATION:
-				return isImplementation() ? Boolean.TRUE : Boolean.FALSE;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES:
-				return getArchiveFiles();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__NAME:
-				setName((String)newValue);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__JSF_VERSION:
-				setJSFVersion((JSFVersion)newValue);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__DEPLOYED:
-				setDeployed(((Boolean)newValue).booleanValue());
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__IMPLEMENTATION:
-				setImplementation(((Boolean)newValue).booleanValue());
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES:
-				getArchiveFiles().clear();
-				getArchiveFiles().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__NAME:
-				setName(NAME_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__JSF_VERSION:
-				setJSFVersion(JSF_VERSION_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__DEPLOYED:
-				setDeployed(DEPLOYED_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__IMPLEMENTATION:
-				setImplementation(IMPLEMENTATION_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES:
-				getArchiveFiles().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__NAME:
-				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__JSF_VERSION:
-				return jsfVersion != JSF_VERSION_EDEFAULT;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__DEPLOYED:
-				return deployed != DEPLOYED_EDEFAULT;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__IMPLEMENTATION:
-				return implementation != IMPLEMENTATION_EDEFAULT;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES:
-				return archiveFiles != null && !archiveFiles.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the string representation 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (ID: ");
-		result.append(id);
-		result.append(", Name: ");
-		result.append(name);
-		result.append(", JSFVersion: ");
-		result.append(jsfVersion);
-		result.append(", Deployed: ");
-		result.append(deployed);
-		result.append(", Implementation: ");
-		result.append(implementation);
-		result.append(')');
-		return result.toString();
-	}
-
-} //JSFLibraryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryFactoryImpl.java
deleted file mode 100644
index 0b4846a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryFactoryImpl.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class JSFLibraryRegistryFactoryImpl extends EFactoryImpl implements JSFLibraryRegistryFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * Creates the default factory implementation.
-	 * <!-- begin-user-doc -->
-     * @return the initialized factory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static JSFLibraryRegistryFactory init() {
-		try {
-			JSFLibraryRegistryFactory theJSFLibraryRegistryFactory = (JSFLibraryRegistryFactory)EPackage.Registry.INSTANCE.getEFactory("http://www.eclipse.org/webtools/jsf/schema/jsflibraryregistry.xsd"); 
-			if (theJSFLibraryRegistryFactory != null) {
-				return theJSFLibraryRegistryFactory;
-			}
-		}
-		catch (Exception exception) {
-			EcorePlugin.INSTANCE.log(exception);
-		}
-		return new JSFLibraryRegistryFactoryImpl();
-	}
-
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistryFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param eClass 
-	 * @return the static eclass 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY: return createJSFLibraryRegistry();
-			case JSFLibraryRegistryPackage.JSF_LIBRARY: return createJSFLibrary();
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY: return createPluginProvidedJSFLibrary();
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE: return createArchiveFile();
-			default:
-				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param eDataType 
-	 * @param initialValue 
-	 * @return an instance of eDataType for initialValue
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object createFromString(EDataType eDataType, String initialValue) {
-		switch (eDataType.getClassifierID()) {
-			case JSFLibraryRegistryPackage.JSF_VERSION:
-				return createJSFVersionFromString(eDataType, initialValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param eDataType 
-	 * @param instanceValue 
-	 * @return the string created from instanceValue from eDataType 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertToString(EDataType eDataType, Object instanceValue) {
-		switch (eDataType.getClassifierID()) {
-			case JSFLibraryRegistryPackage.JSF_VERSION:
-				return convertJSFVersionToString(eDataType, instanceValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the jsf library registry
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistry createJSFLibraryRegistry() {
-		JSFLibraryRegistryImpl jsfLibraryRegistry = new JSFLibraryRegistryImpl();
-		return jsfLibraryRegistry;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the jsf library 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibrary createJSFLibrary() {
-		JSFLibraryImpl jsfLibrary = new JSFLibraryImpl();
-		return jsfLibrary;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the archive file 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ArchiveFile createArchiveFile() {
-		ArchiveFileImpl archiveFile = new ArchiveFileImpl();
-		return archiveFile;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the plugin provided JSF library 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PluginProvidedJSFLibrary createPluginProvidedJSFLibrary() {
-		PluginProvidedJSFLibraryImpl pluginProvidedJSFLibrary = new PluginProvidedJSFLibraryImpl();
-		return pluginProvidedJSFLibrary;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param initialValue 
-     * @return the jsfVersion the dataType 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFVersion createJSFVersionFromString(EDataType eDataType, String initialValue) {
-		JSFVersion result = JSFVersion.get(initialValue);
-		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param instanceValue 
-     * @return the string version of the data type 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertJSFVersionToString(EDataType eDataType, Object instanceValue) {
-		return instanceValue == null ? null : instanceValue.toString();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the registry package 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistryPackage getJSFLibraryRegistryPackage() {
-		return (JSFLibraryRegistryPackage)getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the package 
-	 * <!-- end-user-doc -->
-	 * @deprecated
-	 * @generated
-	 */
-	public static JSFLibraryRegistryPackage getPackage() {
-		return JSFLibraryRegistryPackage.eINSTANCE;
-	}
-
-} //JSFLibraryRegistryFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryImpl.java
deleted file mode 100644
index 6d2964f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryImpl.java
+++ /dev/null
@@ -1,433 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>JSF Library Registry</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryImpl#getDefaultImplementationID <em>Default Implementation ID</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryImpl#getJSFLibraries <em>JSF Libraries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryImpl#getPluginProvidedJSFLibraries <em>Plugin Provided JSF Libraries</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class JSFLibraryRegistryImpl extends EObjectImpl implements JSFLibraryRegistry {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * The default value of the '{@link #getDefaultImplementationID() <em>Default Implementation ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultImplementationID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String DEFAULT_IMPLEMENTATION_ID_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getDefaultImplementationID() <em>Default Implementation ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultImplementationID()
-	 * @generated
-	 * @ordered
-	 */
-	protected String defaultImplementationID = DEFAULT_IMPLEMENTATION_ID_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getJSFLibraries() <em>JSF Libraries</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getJSFLibraries()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList jsfLibraries;
-
-	/**
-	 * The cached value of the '{@link #getPluginProvidedJSFLibraries() <em>Plugin Provided JSF Libraries</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPluginProvidedJSFLibraries()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList pluginProvidedJSFLibraries;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected JSFLibraryRegistryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the static eClass 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return JSFLibraryRegistryPackage.Literals.JSF_LIBRARY_REGISTRY;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the default implementation id 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getDefaultImplementationID() {
-		return defaultImplementationID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newDefaultImplementationID 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultImplementationID(String newDefaultImplementationID) {
-		String oldDefaultImplementationID = defaultImplementationID;
-		defaultImplementationID = newDefaultImplementationID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID, oldDefaultImplementationID, defaultImplementationID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the list of jsf libraries
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getJSFLibraries() {
-		if (jsfLibraries == null) {
-			jsfLibraries = new EObjectContainmentEList(JSFLibrary.class, this, JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__JSF_LIBRARIES);
-		}
-		return jsfLibraries;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the list of plugin provided JSF libraries 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getPluginProvidedJSFLibraries() {
-		if (pluginProvidedJSFLibraries == null) {
-			pluginProvidedJSFLibraries = new EObjectContainmentEList(PluginProvidedJSFLibrary.class, this, JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES);
-		}
-		return pluginProvidedJSFLibraries;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the default implemention JSF library 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public JSFLibrary getDefaultImplementation() {
-		return getJSFLibraryByID(getDefaultImplementationID());
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param implementation 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public void setDefaultImplementation(JSFLibrary implementation) {
-		if (implementation != null) {
-			setDefaultImplementationID(implementation.getID());
-		} else {
-			setDefaultImplementationID(null);
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__JSF_LIBRARIES:
-				return ((InternalEList)getJSFLibraries()).basicRemove(otherEnd, msgs);
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES:
-				return ((InternalEList)getPluginProvidedJSFLibraries()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID:
-				return getDefaultImplementationID();
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__JSF_LIBRARIES:
-				return getJSFLibraries();
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES:
-				return getPluginProvidedJSFLibraries();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID:
-				setDefaultImplementationID((String)newValue);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__JSF_LIBRARIES:
-				getJSFLibraries().clear();
-				getJSFLibraries().addAll((Collection)newValue);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES:
-				getPluginProvidedJSFLibraries().clear();
-				getPluginProvidedJSFLibraries().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID:
-				setDefaultImplementationID(DEFAULT_IMPLEMENTATION_ID_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__JSF_LIBRARIES:
-				getJSFLibraries().clear();
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES:
-				getPluginProvidedJSFLibraries().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID:
-				return DEFAULT_IMPLEMENTATION_ID_EDEFAULT == null ? defaultImplementationID != null : !DEFAULT_IMPLEMENTATION_ID_EDEFAULT.equals(defaultImplementationID);
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__JSF_LIBRARIES:
-				return jsfLibraries != null && !jsfLibraries.isEmpty();
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES:
-				return pluginProvidedJSFLibraries != null && !pluginProvidedJSFLibraries.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param ID 
-	 * @return the jsf library of ID or null if none 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public JSFLibrary getJSFLibraryByID(String ID) {
-		JSFLibrary library = null;
-		if (ID != null) {
-			Iterator itLibs = getAllJSFLibraries().iterator();
-			while (itLibs.hasNext()) {
-				JSFLibrary curLib = (JSFLibrary)itLibs.next();
-				if (ID.equals(curLib.getID())) {
-					library = curLib;
-					break;
-				}
-			}
-		}
-		return library;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param name 
-	 * @return the list of libraries named 'name' 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public EList getJSFLibrariesByName(String name) {
-		EList libraries = new BasicEList();
-		if (name != null) {
-			Iterator itLibs = getAllJSFLibraries().iterator();
-			while(itLibs.hasNext()) {
-				JSFLibrary curLib = (JSFLibrary)itLibs.next();
-				if (name.equals(curLib.getName())) {
-					libraries.add(curLib);
-				}
-			}
-		}
-		return libraries;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * This is a convenience method to return an EList of JSFLibrary instances
-	 * that are marked as JSF implementations; while all instances are valid
-	 * references, the returned EList should not be used for additions and/or
-	 * removals of instances (use the EList returned by getJSFLibraries()).
-	 * @return the list of implemention jsf libraries 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public EList getImplJSFLibraries() {
-		EList implementations = new BasicEList();
-		Iterator itLibs = getAllJSFLibraries().iterator();
-		while (itLibs.hasNext()) {
-			JSFLibrary lib = (JSFLibrary)itLibs.next();
-			if (lib.isImplementation()) {
-				implementations.add(lib);
-			}
-		}
-		return implementations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * This is a convenience method to return an EList of JSFLibrary instances
-	 * that are not marked as JSF implementations; while all instances are
-	 * valid references, the returned EList should not be used for additions
-	 * and/or removals of instances (use the EList returned by
-	 * getJSFLibraries()).
-	 * @return the non-implemention JSF libraries
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public EList getNonImplJSFLibraries() {
-		EList nonImplementations = new BasicEList();
-		Iterator itLibs = getAllJSFLibraries().iterator();
-		while (itLibs.hasNext()) {
-			JSFLibrary lib = (JSFLibrary)itLibs.next();
-			if (!lib.isImplementation()) {
-				nonImplementations.add(lib);
-			}
-		}
-		return nonImplementations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * This is a convenience method to return an EList of JSFLibrary instances
-	 * and PluginProvidedJSFLibrary instances; while all instances are valid
-	 * references, the returned EList should not be used for additions and/or
-	 * removals of instances (use the EList returned by getJSFLibraries()).
-	 * @return all JSF libraries 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public EList getAllJSFLibraries() {
-		EList allLibs = new BasicEList();
-		allLibs.addAll(getJSFLibraries());
-		allLibs.addAll(getPluginProvidedJSFLibraries());
-		return allLibs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param library 
-	 * @return true if library is successfully added 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean addJSFLibrary(JSFLibrary library) {
-		boolean added = false;
-		if (library instanceof PluginProvidedJSFLibrary) {
-			added = getPluginProvidedJSFLibraries().add(library);
-		} else {
-			added = getJSFLibraries().add(library);
-		}
-		return added;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param library 
-	 * @return true if library is successfully removed
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean removeJSFLibrary(JSFLibrary library) {
-		boolean removed = false;
-		if (library instanceof PluginProvidedJSFLibrary) {
-			removed = getPluginProvidedJSFLibraries().remove(library);
-		} else {
-			removed = getJSFLibraries().remove(library);
-		}
-		return removed;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the string representation 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (DefaultImplementationID: ");
-		result.append(defaultImplementationID);
-		result.append(')');
-		return result.toString();
-	}
-	
-
-} //JSFLibraryRegistryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryPackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryPackageImpl.java
deleted file mode 100644
index 0532ca9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryPackageImpl.java
+++ /dev/null
@@ -1,514 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EOperation;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class JSFLibraryRegistryPackageImpl extends EPackageImpl implements JSFLibraryRegistryPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass jsfLibraryRegistryEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass jsfLibraryEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass archiveFileEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass pluginProvidedJSFLibraryEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum jsfVersionEEnum = null;
-
-	/**
-	 * Creates an instance of the model <b>Package</b>, registered with
-	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-	 * package URI value.
-	 * <p>Note: the correct way to create the package is via the static
-	 * factory method {@link #init init()}, which also performs
-	 * initialization of the package, or returns the registered package,
-	 * if one already exists.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.emf.ecore.EPackage.Registry
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private JSFLibraryRegistryPackageImpl() {
-		super(eNS_URI, JSFLibraryRegistryFactory.eINSTANCE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static boolean isInited = false;
-
-	/**
-	 * Creates, registers, and initializes the <b>Package</b> for this
-	 * model, and for any others upon which it depends.  Simple
-	 * dependencies are satisfied by calling this method on all
-	 * dependent packages before doing anything else.  This method drives
-	 * initialization for interdependent packages directly, in parallel
-	 * with this package, itself.
-	 * <p>Of this package and its interdependencies, all packages which
-	 * have not yet been registered by their URI values are first created
-	 * and registered.  The packages are then initialized in two steps:
-	 * meta-model objects for all of the packages are created before any
-	 * are initialized, since one package's meta-model objects may refer to
-	 * those of another.
-	 * <p>Invocation of this method will not affect any packages that have
-	 * already been initialized.
-	 * <!-- begin-user-doc -->
-	 * @return the JSF library registry package
-	 * <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static JSFLibraryRegistryPackage init() {
-		if (isInited) return (JSFLibraryRegistryPackage)EPackage.Registry.INSTANCE.getEPackage(JSFLibraryRegistryPackage.eNS_URI);
-
-		// Obtain or create and register package
-		JSFLibraryRegistryPackageImpl theJSFLibraryRegistryPackage = (JSFLibraryRegistryPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof JSFLibraryRegistryPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new JSFLibraryRegistryPackageImpl());
-
-		isInited = true;
-
-		// Create package meta-data objects
-		theJSFLibraryRegistryPackage.createPackageContents();
-
-		// Initialize created meta-data
-		theJSFLibraryRegistryPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theJSFLibraryRegistryPackage.freeze();
-
-		return theJSFLibraryRegistryPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eclass 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getJSFLibraryRegistry() {
-		return jsfLibraryRegistryEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eattribute 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getJSFLibraryRegistry_DefaultImplementationID() {
-		return (EAttribute)jsfLibraryRegistryEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the ereference
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getJSFLibraryRegistry_JSFLibraries() {
-		return (EReference)jsfLibraryRegistryEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the ereference 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getJSFLibraryRegistry_PluginProvidedJSFLibraries() {
-		return (EReference)jsfLibraryRegistryEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eclass 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getJSFLibrary() {
-		return jsfLibraryEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eattribute 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getJSFLibrary_ID() {
-		return (EAttribute)jsfLibraryEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eattribute 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getJSFLibrary_Name() {
-		return (EAttribute)jsfLibraryEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eattribute
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getJSFLibrary_JSFVersion() {
-		return (EAttribute)jsfLibraryEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eattribute 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getJSFLibrary_Deployed() {
-		return (EAttribute)jsfLibraryEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eattribute 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getJSFLibrary_Implementation() {
-		return (EAttribute)jsfLibraryEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the ereference 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getJSFLibrary_ArchiveFiles() {
-		return (EReference)jsfLibraryEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eclass 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getArchiveFile() {
-		return archiveFileEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eattribute 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getArchiveFile_SourceLocation() {
-		return (EAttribute)archiveFileEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eattribute 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getArchiveFile_RelativeToWorkspace() {
-		return (EAttribute)archiveFileEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eattribute
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getArchiveFile_RelativeDestLocation() {
-		return (EAttribute)archiveFileEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the ereference 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getArchiveFile_JSFLibrary() {
-		return (EReference)archiveFileEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eclass 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPluginProvidedJSFLibrary() {
-		return pluginProvidedJSFLibraryEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eattribute 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPluginProvidedJSFLibrary_PluginID() {
-		return (EAttribute)pluginProvidedJSFLibraryEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPluginProvidedJSFLibrary_Label() {
-		return (EAttribute)pluginProvidedJSFLibraryEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the eenum 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getJSFVersion() {
-		return jsfVersionEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the jsf library registry factory
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistryFactory getJSFLibraryRegistryFactory() {
-		return (JSFLibraryRegistryFactory)getEFactoryInstance();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isCreated = false;
-
-	/**
-	 * Creates the meta-model objects for the package.  This method is
-	 * guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void createPackageContents() {
-		if (isCreated) return;
-		isCreated = true;
-
-		// Create classes and their features
-		jsfLibraryRegistryEClass = createEClass(JSF_LIBRARY_REGISTRY);
-		createEAttribute(jsfLibraryRegistryEClass, JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID);
-		createEReference(jsfLibraryRegistryEClass, JSF_LIBRARY_REGISTRY__JSF_LIBRARIES);
-		createEReference(jsfLibraryRegistryEClass, JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES);
-
-		jsfLibraryEClass = createEClass(JSF_LIBRARY);
-		createEAttribute(jsfLibraryEClass, JSF_LIBRARY__ID);
-		createEAttribute(jsfLibraryEClass, JSF_LIBRARY__NAME);
-		createEAttribute(jsfLibraryEClass, JSF_LIBRARY__JSF_VERSION);
-		createEAttribute(jsfLibraryEClass, JSF_LIBRARY__DEPLOYED);
-		createEAttribute(jsfLibraryEClass, JSF_LIBRARY__IMPLEMENTATION);
-		createEReference(jsfLibraryEClass, JSF_LIBRARY__ARCHIVE_FILES);
-
-		pluginProvidedJSFLibraryEClass = createEClass(PLUGIN_PROVIDED_JSF_LIBRARY);
-		createEAttribute(pluginProvidedJSFLibraryEClass, PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID);
-		createEAttribute(pluginProvidedJSFLibraryEClass, PLUGIN_PROVIDED_JSF_LIBRARY__LABEL);
-
-		archiveFileEClass = createEClass(ARCHIVE_FILE);
-		createEAttribute(archiveFileEClass, ARCHIVE_FILE__RELATIVE_TO_WORKSPACE);
-		createEAttribute(archiveFileEClass, ARCHIVE_FILE__SOURCE_LOCATION);
-		createEAttribute(archiveFileEClass, ARCHIVE_FILE__RELATIVE_DEST_LOCATION);
-		createEReference(archiveFileEClass, ARCHIVE_FILE__JSF_LIBRARY);
-
-		// Create enums
-		jsfVersionEEnum = createEEnum(JSF_VERSION);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isInitialized = false;
-
-	/**
-	 * Complete the initialization of the package and its meta-model.  This
-	 * method is guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void initializePackageContents() {
-		if (isInitialized) return;
-		isInitialized = true;
-
-		// Initialize package
-		setName(eNAME);
-		setNsPrefix(eNS_PREFIX);
-		setNsURI(eNS_URI);
-
-		// Add supertypes to classes
-		pluginProvidedJSFLibraryEClass.getESuperTypes().add(this.getJSFLibrary());
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(jsfLibraryRegistryEClass, JSFLibraryRegistry.class, "JSFLibraryRegistry", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getJSFLibraryRegistry_DefaultImplementationID(), ecorePackage.getEString(), "DefaultImplementationID", "", 0, 1, JSFLibraryRegistry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getJSFLibraryRegistry_JSFLibraries(), this.getJSFLibrary(), null, "JSFLibraries", null, 0, -1, JSFLibraryRegistry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getJSFLibraryRegistry_PluginProvidedJSFLibraries(), this.getPluginProvidedJSFLibrary(), null, "PluginProvidedJSFLibraries", null, 0, -1, JSFLibraryRegistry.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		EOperation op = addEOperation(jsfLibraryRegistryEClass, this.getJSFLibrary(), "getJSFLibraryByID", 1, 1);
-		addEParameter(op, ecorePackage.getEString(), "ID", 1, 1);
-
-		op = addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEEList(), "getJSFLibrariesByName", 1, 1);
-		addEParameter(op, ecorePackage.getEString(), "name", 1, 1);
-
-		addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEEList(), "getImplJSFLibraries", 1, 1);
-
-		addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEEList(), "getNonImplJSFLibraries", 1, 1);
-
-		addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEEList(), "getAllJSFLibraries", 1, 1);
-
-		op = addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEBoolean(), "addJSFLibrary", 1, 1);
-		addEParameter(op, this.getJSFLibrary(), "library", 1, 1);
-
-		op = addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEBoolean(), "removeJSFLibrary", 1, 1);
-		addEParameter(op, this.getJSFLibrary(), "library", 1, 1);
-
-		addEOperation(jsfLibraryRegistryEClass, this.getJSFLibrary(), "getDefaultImplementation", 1, 1);
-
-		op = addEOperation(jsfLibraryRegistryEClass, null, "setDefaultImplementation");
-		addEParameter(op, this.getJSFLibrary(), "implementation", 1, 1);
-
-		initEClass(jsfLibraryEClass, JSFLibrary.class, "JSFLibrary", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getJSFLibrary_ID(), ecorePackage.getEString(), "ID", "", 0, 1, JSFLibrary.class, IS_TRANSIENT, !IS_VOLATILE, !IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getJSFLibrary_Name(), ecorePackage.getEString(), "Name", null, 1, 1, JSFLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getJSFLibrary_JSFVersion(), this.getJSFVersion(), "JSFVersion", "UNKNOWN", 1, 1, JSFLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getJSFLibrary_Deployed(), ecorePackage.getEBoolean(), "Deployed", "true", 1, 1, JSFLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getJSFLibrary_Implementation(), ecorePackage.getEBoolean(), "Implementation", "false", 1, 1, JSFLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getJSFLibrary_ArchiveFiles(), this.getArchiveFile(), this.getArchiveFile_JSFLibrary(), "ArchiveFiles", null, 0, -1, JSFLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		op = addEOperation(jsfLibraryEClass, ecorePackage.getEBoolean(), "containsArchiveFile", 1, 1);
-		addEParameter(op, ecorePackage.getEString(), "fullPath", 1, 1);
-
-		addEOperation(jsfLibraryEClass, this.getJSFLibrary(), "getWorkingCopy", 1, 1);
-
-		op = addEOperation(jsfLibraryEClass, null, "updateValues");
-		addEParameter(op, this.getJSFLibrary(), "otherLibrary", 1, 1);
-
-		op = addEOperation(jsfLibraryEClass, ecorePackage.getEBoolean(), "copyTo", 1, 1);
-		addEParameter(op, ecorePackage.getEString(), "baseDestLocation", 1, 1);
-
-		addEOperation(jsfLibraryEClass, ecorePackage.getEString(), "getLabel", 1, 1);
-
-		initEClass(pluginProvidedJSFLibraryEClass, PluginProvidedJSFLibrary.class, "PluginProvidedJSFLibrary", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPluginProvidedJSFLibrary_PluginID(), ecorePackage.getEString(), "pluginID", null, 1, 1, PluginProvidedJSFLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPluginProvidedJSFLibrary_Label(), ecorePackage.getEString(), "Label", null, 1, 1, PluginProvidedJSFLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(archiveFileEClass, ArchiveFile.class, "ArchiveFile", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getArchiveFile_RelativeToWorkspace(), ecorePackage.getEBoolean(), "RelativeToWorkspace", "true", 1, 1, ArchiveFile.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getArchiveFile_SourceLocation(), ecorePackage.getEString(), "SourceLocation", null, 1, 1, ArchiveFile.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getArchiveFile_RelativeDestLocation(), ecorePackage.getEString(), "RelativeDestLocation", null, 1, 1, ArchiveFile.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getArchiveFile_JSFLibrary(), this.getJSFLibrary(), this.getJSFLibrary_ArchiveFiles(), "JSFLibrary", null, 1, 1, ArchiveFile.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		addEOperation(archiveFileEClass, ecorePackage.getEString(), "getName", 1, 1);
-
-		addEOperation(archiveFileEClass, ecorePackage.getEString(), "getPath", 1, 1);
-
-		addEOperation(archiveFileEClass, ecorePackage.getEBoolean(), "exists", 1, 1);
-
-		op = addEOperation(archiveFileEClass, ecorePackage.getEBoolean(), "equals", 1, 1);
-		addEParameter(op, ecorePackage.getEJavaObject(), "object", 1, 1);
-
-		addEOperation(archiveFileEClass, ecorePackage.getEInt(), "hashCode", 1, 1);
-
-		op = addEOperation(archiveFileEClass, ecorePackage.getEBoolean(), "copyTo", 1, 1);
-		addEParameter(op, ecorePackage.getEString(), "baseDestLocation", 1, 1);
-
-		addEOperation(archiveFileEClass, ecorePackage.getEString(), "getResolvedSourceLocation", 1, 1);
-
-		// Initialize enums and add enum literals
-		initEEnum(jsfVersionEEnum, JSFVersion.class, "JSFVersion");
-		addEEnumLiteral(jsfVersionEEnum, JSFVersion.UNKNOWN_LITERAL);
-		addEEnumLiteral(jsfVersionEEnum, JSFVersion.V1_1_LITERAL);
-		addEEnumLiteral(jsfVersionEEnum, JSFVersion.V1_2_LITERAL);
-
-		// Create resource
-		createResource(eNS_URI);
-	}
-
-} //JSFLibraryRegistryPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/PluginProvidedJSFLibraryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/PluginProvidedJSFLibraryImpl.java
deleted file mode 100644
index a7b1e37..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/PluginProvidedJSFLibraryImpl.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl;
-
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Plugin Provided JSF Library</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.PluginProvidedJSFLibraryImpl#getPluginID <em>Plugin ID</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.PluginProvidedJSFLibraryImpl#getLabel <em>Label</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PluginProvidedJSFLibraryImpl extends JSFLibraryImpl implements PluginProvidedJSFLibrary {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * The default value of the '{@link #getPluginID() <em>Plugin ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPluginID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PLUGIN_ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPluginID() <em>Plugin ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPluginID()
-	 * @generated
-	 * @ordered
-	 */
-	protected String pluginID = PLUGIN_ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getLabel() <em>Label</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLabel()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String LABEL_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getLabel() <em>Label</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLabel()
-	 * @generated
-	 * @ordered
-	 */
-	protected String label = LABEL_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PluginProvidedJSFLibraryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the static eclass 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return JSFLibraryRegistryPackage.Literals.PLUGIN_PROVIDED_JSF_LIBRARY;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the plugin id 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPluginID() {
-		return pluginID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param newPluginID 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPluginID(String newPluginID) {
-		String oldPluginID = pluginID;
-		pluginID = newPluginID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID, oldPluginID, pluginID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return translatable label
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getLabel() {
-		if (label == null)
-			return super.getLabel();
-		return label;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLabel(String newLabel) {
-		String oldLabel = label;
-		label = newLabel;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__LABEL, oldLabel, label));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID:
-				return getPluginID();
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__LABEL:
-				return getLabel();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID:
-				setPluginID((String)newValue);
-				return;
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__LABEL:
-				setLabel((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID:
-				setPluginID(PLUGIN_ID_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__LABEL:
-				setLabel(LABEL_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID:
-				return PLUGIN_ID_EDEFAULT == null ? pluginID != null : !PLUGIN_ID_EDEFAULT.equals(pluginID);
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__LABEL:
-				return LABEL_EDEFAULT == null ? label != null : !LABEL_EDEFAULT.equals(label);
-		}
-		return super.eIsSet(featureID);
-	}
-	
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getID() {
-		return getPluginID() + ID_SEPARATOR + getName();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @return the working copy 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public JSFLibrary getWorkingCopy() {
-		PluginProvidedJSFLibrary workingCopyLib = JSFLibraryRegistryFactory.eINSTANCE.createPluginProvidedJSFLibrary();
-//		workingCopyLib.setID(getID());
-		workingCopyLib.setName(getName());
-		if (label != null) workingCopyLib.setLabel(getLabel());
-		workingCopyLib.setJSFVersion(getJSFVersion());
-		workingCopyLib.setDeployed(isDeployed());
-		workingCopyLib.setImplementation(isImplementation());
-		workingCopyLib.setPluginID(getPluginID());
-		Iterator itArchiveFiles = getArchiveFiles().iterator();
-		while (itArchiveFiles.hasNext()) {
-			ArchiveFile srcArchiveFile = (ArchiveFile)itArchiveFiles.next();
-			ArchiveFile destArchiveFile = JSFLibraryRegistryFactory.eINSTANCE.createArchiveFile();
-			destArchiveFile.setRelativeToWorkspace(srcArchiveFile.isRelativeToWorkspace());
-			destArchiveFile.setSourceLocation(srcArchiveFile.getSourceLocation());
-			destArchiveFile.setRelativeDestLocation(srcArchiveFile.getRelativeDestLocation());
-			workingCopyLib.getArchiveFiles().add(destArchiveFile);
-		}
-		return workingCopyLib;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the string representation 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (pluginID: ");
-		result.append(pluginID);
-		result.append(", Label: ");
-		result.append(label);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PluginProvidedJSFLibraryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryAdapterFactory.java
deleted file mode 100644
index 9972980..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryAdapterFactory.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage
- * @generated
- */
-public class JSFLibraryRegistryAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static JSFLibraryRegistryPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistryAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = JSFLibraryRegistryPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Returns whether this factory is applicable for the type of the object.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @return whether this factory is applicable for the type of the object.
-	 * @generated
-	 */
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject)object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch the delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected JSFLibraryRegistrySwitch modelSwitch =
-		new JSFLibraryRegistrySwitch() {
-			public Object caseJSFLibraryRegistry(JSFLibraryRegistry object) {
-				return createJSFLibraryRegistryAdapter();
-			}
-			public Object caseJSFLibrary(JSFLibrary object) {
-				return createJSFLibraryAdapter();
-			}
-			public Object casePluginProvidedJSFLibrary(PluginProvidedJSFLibrary object) {
-				return createPluginProvidedJSFLibraryAdapter();
-			}
-			public Object caseArchiveFile(ArchiveFile object) {
-				return createArchiveFileAdapter();
-			}
-			public Object defaultCase(EObject object) {
-				return createEObjectAdapter();
-			}
-		};
-
-	/**
-	 * Creates an adapter for the <code>target</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param target the object to adapt.
-	 * @return the adapter for the <code>target</code>.
-	 * @generated
-	 */
-	public Adapter createAdapter(Notifier target) {
-		return (Adapter)modelSwitch.doSwitch((EObject)target);
-	}
-
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry <em>JSF Library Registry</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry
-	 * @generated
-	 */
-	public Adapter createJSFLibraryRegistryAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary <em>JSF Library</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary
-	 * @generated
-	 */
-	public Adapter createJSFLibraryAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile <em>Archive File</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile
-	 * @generated
-	 */
-	public Adapter createArchiveFileAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary <em>Plugin Provided JSF Library</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary
-	 * @generated
-	 */
-	public Adapter createPluginProvidedJSFLibraryAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for the default case.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createEObjectAdapter() {
-		return null;
-	}
-
-} //JSFLibraryRegistryAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryResourceFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryResourceFactoryImpl.java
deleted file mode 100644
index c865f2b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryResourceFactoryImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource Factory</b> associated with the package.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util.JSFLibraryRegistryResourceImpl
- * @generated
- */
-public class JSFLibraryRegistryResourceFactoryImpl extends ResourceFactoryImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * Creates an instance of the resource factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistryResourceFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * Creates an instance of the resource.
-	 * <!-- begin-user-doc -->
-     * @param uri 
-     * @return the Resource
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Resource createResource(URI uri) {
-		Resource result = new JSFLibraryRegistryResourceImpl(uri);
-		return result;
-	}
-
-} //JSFLibraryRegistryResourceFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryResourceImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryResourceImpl.java
deleted file mode 100644
index 1bff4c3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryResourceImpl.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource </b> associated with the package.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util.JSFLibraryRegistryResourceFactoryImpl
- * @generated
- */
-public class JSFLibraryRegistryResourceImpl extends XMLResourceImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * Creates an instance of the resource.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param uri the URI of the new resource.
-	 * @generated
-	 */
-	public JSFLibraryRegistryResourceImpl(URI uri) {
-		super(uri);
-	}
-
-} //JSFLibraryRegistryResourceImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistrySwitch.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistrySwitch.java
deleted file mode 100644
index b8ccb5f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistrySwitch.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage
- * @generated
- */
-public class JSFLibraryRegistrySwitch {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static JSFLibraryRegistryPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistrySwitch() {
-		if (modelPackage == null) {
-			modelPackage = JSFLibraryRegistryPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param theEObject 
- 	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	public Object doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param theEClass 
-     * @param theEObject 
- 	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-        List eSuperTypes = theEClass.getESuperTypes();
-        return
-        	eSuperTypes.isEmpty() ?
-        		defaultCase(theEObject) :
-        		doSwitch((EClass)eSuperTypes.get(0), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param classifierID 
-     * @param theEObject 
- 	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected Object doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY: {
-				JSFLibraryRegistry jsfLibraryRegistry = (JSFLibraryRegistry)theEObject;
-				Object result = caseJSFLibraryRegistry(jsfLibraryRegistry);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case JSFLibraryRegistryPackage.JSF_LIBRARY: {
-				JSFLibrary jsfLibrary = (JSFLibrary)theEObject;
-				Object result = caseJSFLibrary(jsfLibrary);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY: {
-				PluginProvidedJSFLibrary pluginProvidedJSFLibrary = (PluginProvidedJSFLibrary)theEObject;
-				Object result = casePluginProvidedJSFLibrary(pluginProvidedJSFLibrary);
-				if (result == null) result = caseJSFLibrary(pluginProvidedJSFLibrary);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE: {
-				ArchiveFile archiveFile = (ArchiveFile)theEObject;
-				Object result = caseArchiveFile(archiveFile);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			default: return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>JSF Library Registry</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>JSF Library Registry</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseJSFLibraryRegistry(JSFLibraryRegistry object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>JSF Library</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>JSF Library</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseJSFLibrary(JSFLibrary object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Archive File</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Archive File</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseArchiveFile(ArchiveFile object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Plugin Provided JSF Library</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Plugin Provided JSF Library</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePluginProvidedJSFLibrary(PluginProvidedJSFLibrary object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>EObject</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch, but this is the last case anyway.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-	public Object defaultCase(EObject object) {
-		return null;
-	}
-
-} //JSFLibraryRegistrySwitch
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryUpgradeUtil.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryUpgradeUtil.java
deleted file mode 100644
index f086212..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryUpgradeUtil.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-
-/**
- * Utility for checking for, and upgrading the JSF Library Registry when the EMF model changes.
- */
-public class JSFLibraryRegistryUpgradeUtil {	
-	static String v1Tov2UpgradeURL = "http://www.eclipse.org/JSFxxxxxxxxxxxxxxxxxxxxxx";
-	
-	/**
-	 * default state is OK, no upgrade
-	 */
-	private UpgradeStatus	upgradeStatus;
-
-	/**
-	 * The workspace-relative part of the URL of the JSF Library Registry 
-	 * persistence store. (version 1)
-	 */
-	public static final String JSF_LIBRARY_REGISTRY_V1_URL = ".metadata/.plugins/org.eclipse.jst.jsf.core/JSFLibraryRegistry.xml"; //$NON-NLS-1$
-
-	/**
-	 * The workspace-relative part of the URL of the JSF Library Registry 
-	 * persistence store. (version 2)
-	 */
-	public static final String JSF_LIBRARY_REGISTRY_V2_URL = ".metadata/.plugins/org.eclipse.jst.jsf.core/JSFLibraryRegistryV2.xml"; //$NON-NLS-1$
-
-	/**
-	 * The LATEST VERSION of the workspace-relative part of the URL of the JSF Library Registry 
-	 * persistence store. 
-	 */
-	public static final String JSF_LIBRARY_REGISTRY_LATESTVERSION_URL = JSF_LIBRARY_REGISTRY_V2_URL;
-	/**
-	 * The latest version value.
-	 */
-	public static final int	   LATESTVERSION = 2;
-
-	private static final int NO_VERSION = 0;
-	
-	private static JSFLibraryRegistryUpgradeUtil INSTANCE;
-		
-	/**
-	 * @return the stateful runtime singleton
-	 */
-	public static synchronized JSFLibraryRegistryUpgradeUtil getInstance(){
-		if (INSTANCE == null){
-			INSTANCE = new JSFLibraryRegistryUpgradeUtil();
-		}
-		return INSTANCE;
-	}
-	
-	/**
-	 * Return the URI for the specified JSF Library Registry
-	 * @param registryVersion
-	 * @return URI 
-	 * @throws MalformedURLException
-	 */
-	public static URI getRegistryURI(String registryVersion) throws MalformedURLException {
-		URL jsfLibRegURL = new URL(Platform.getInstanceLocation().getURL(), registryVersion);
-		return URI.createURI(jsfLibRegURL.toString());
-	}
-	
-	/**
-	 * @param originalFile
-	 * @return the backup file name for a file
-	 */
-	public static String getBackupFileName(final String originalFile)
-	{
-	    return originalFile.concat(".bkp");
-	}
-	
-	/**
-	 * Upgrades the JSF Library registry from oldest to newest
-	 * @param expectedVersion 
-	 */
-	public void upgradeRegistryIfNecessary(int expectedVersion) {
-		//when adding upgrades, the upgrades should progress from oldest to newest
-		try
-		{
-			int curVersion = getCurVersion();
-			
-			if (curVersion < expectedVersion && curVersion != NO_VERSION)
-			{
-				UpgradeOperation op = getUpgradeOperation(curVersion);
-				
-				if (op.canExecute())
-				{
-					try
-					{
-						// TODO: when move to Java 5, use co-variant return
-						upgradeStatus = (UpgradeStatus)
-							op.execute(new NullProgressMonitor(), null);
-						upgradeStatus.setUpgradeOperation(op);
-					}
-					catch (ExecutionException e)
-					{
-						// should never happen since we control the URL's
-						JSFCorePlugin.log(IStatus.ERROR, "Error during loading JSF Library registry", e);
-						//TODO: flag failure in status
-						upgradeStatus = 
-							new UpgradeStatus(IStatus.ERROR, true, "Error detected during upgrade!");
-					}
-				}
-				else
-				{
-    				// TODO: what if can't execute?
-                    upgradeStatus = 
-                        new UpgradeStatus(IStatus.ERROR, false, "Error detected during upgrade!");
-				}
-			}
-			else
-			{
-			    // everything ok, not upgrade
-			    upgradeStatus = new UpgradeStatus();
-			}
-		}
-	    catch (MalformedURLException e) {	
-			// should never happen since we control the URL's
-			JSFCorePlugin.log(IStatus.ERROR, "Error during loading JSF Library registry", e);
-		}
-	}
-
-	private int getCurVersion() throws MalformedURLException
-	{
-		// TODO: need generalized algorithm here
-		URI v2File = getRegistryURI(JSF_LIBRARY_REGISTRY_V2_URL);
-		File file = new File(v2File.toFileString());
-		if (file.exists())
-		{
-			return 2;
-		}
-		
-		URI v1File = getRegistryURI(JSF_LIBRARY_REGISTRY_V1_URL);
-		file = new File(v1File.toFileString());
-		if (file.exists())
-		{
-			return 1;
-		}
-		return NO_VERSION;
-	}
-	
-	/**
-	 * @param curVersion
-	 * @return the upgrade operation to move from curVersion to the latest
-	 * @throws MalformedURLException
-	 */
-	protected UpgradeOperation getUpgradeOperation(int curVersion) throws MalformedURLException
-	{
-		UpgradeOperation  op = new UpgradeOperation("JSF Registry Upgrade");
-		switch(curVersion)
-		{
-			case 1:
-				op.addVersionUpgrade(
-						new MigrateV1toV2Operation("Upgrade v1 to v2"
-								,getRegistryURI(JSF_LIBRARY_REGISTRY_V1_URL)
-								, getRegistryURI(JSF_LIBRARY_REGISTRY_V2_URL)));
-		}
-		
-		return op;
-	}
-	
-	
-	/**
-	 * @return array of {@link UpgradeStatus}s.  There can be more than one if the registry has been upgraded by more than one version.
-	 * Will not be null.   
-	 */
-	public UpgradeStatus getUpgradeStatus(){
-		return this.upgradeStatus;
-	}
-
-	static void deleteFile(String fileName) {
-		File f = new File(fileName);
-		if (f.exists()){
-			f.delete();
-			if (f.exists())
-				f.deleteOnExit();
-		}
-	}
-
-	static void copyFile(String srcFileName, String destFileName) {
-	
-		File srcFile = new File(srcFileName);
-		File destFile = new File(destFileName);
-		FileInputStream from = null;
-		FileOutputStream to = null;
-		try {
-			from = new FileInputStream(srcFile);
-			to = new FileOutputStream(destFile);
-			byte[] buffer = new byte[4096];
-			int bytesRead;
-
-			while ((bytesRead = from.read(buffer)) != -1)
-				to.write(buffer, 0, bytesRead); // write
-		} catch (IOException ioe){
-			JSFCorePlugin.log(ioe, "Error during file copy");
-		} finally {
-			if (from != null)
-				try {
-					from.close();
-				} catch (IOException e) {
-		            JSFCorePlugin.log(e, "Error during file close");
-				}
-			if (to != null)
-				try {
-					to.close();
-				} catch (IOException e) {
-                    JSFCorePlugin.log(e, "Error during file close");
-				}
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryXMLProcessor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryXMLProcessor.java
deleted file mode 100644
index 5607893..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryXMLProcessor.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: JSFLibraryRegistryXMLProcessor.java,v 1.2 2007/04/04 18:50:17 cbateman Exp $
- */
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.xmi.util.XMLProcessor;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-
-/**
- * This class contains helper methods to serialize and deserialize XML documents
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class JSFLibraryRegistryXMLProcessor extends XMLProcessor {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-
-	/**
-	 * Public constructor to instantiate the helper.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistryXMLProcessor() {
-		super((EPackage.Registry.INSTANCE));
-		JSFLibraryRegistryPackage.eINSTANCE.eClass();
-	}
-	
-	/**
-	 * Register for "*" and "xml" file extensions the JSFLibraryRegistryResourceFactoryImpl factory.
-	 * <!-- begin-user-doc -->
-	 * @return Map of registrations 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Map getRegistrations() {
-		if (registrations == null) {
-			super.getRegistrations();
-			registrations.put(XML_EXTENSION, new JSFLibraryRegistryResourceFactoryImpl());
-			registrations.put(STAR_EXTENSION, new JSFLibraryRegistryResourceFactoryImpl());
-		}
-		return registrations;
-	}
-
-} //JSFLibraryRegistryXMLProcessor
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/MigrateV1toV2Operation.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/MigrateV1toV2Operation.java
deleted file mode 100644
index 7ea6339..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/MigrateV1toV2Operation.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-
-class MigrateV1toV2Operation extends VersionUpgradeOperation {
-
-	private final URI		_v1Registry;
-	private final URI		_v2Registry;
-	
-	/**
-	 * @param label
-	 * @param v1Registry
-	 * @param v2Registry 
-	 */
-	public MigrateV1toV2Operation(String label, URI v1Registry, URI v2Registry) {
-		super(label, 1, 2);
-		_v1Registry = v1Registry;
-		_v2Registry = v2Registry;
-	}
-
-	public IStatus doCommit() {
-		JSFLibraryRegistryUpgradeUtil.deleteFile(_v1Registry.toFileString());
-		return Status.OK_STATUS;
-	}
-
-	public IStatus doExecute(IProgressMonitor monitor, IAdaptable info)
-	{
-		JSFLibraryRegistryUpgradeUtil.copyFile
-			(_v1Registry.toFileString(), JSFLibraryRegistryUpgradeUtil.getBackupFileName(_v1Registry.toFileString()));
-		JSFLibraryRegistryResourceFactoryImpl resourceFactory = new JSFLibraryRegistryResourceFactoryImpl();
-		JSFLibraryRegistryResourceImpl res = (JSFLibraryRegistryResourceImpl)resourceFactory.createResource(_v1Registry);
-		try {
-			URI newRegURI = 
-				JSFLibraryRegistryUpgradeUtil.getRegistryURI
-					(JSFLibraryRegistryUpgradeUtil.JSF_LIBRARY_REGISTRY_V2_URL);
-			Map options = new HashMap();
-			//disable notifications during load to avoid changing stored default implementation
-			options.put(XMLResource.OPTION_DISABLE_NOTIFY, Boolean.TRUE);
-			res.load(options);
-			//if we got this far then the registry was empty
-			//"upgrade" to v2 and then delete old.   no point in upgrade status being sent
-			JSFLibraryRegistryUtil.getInstance().saveJSFLibraryRegistry();
-			JSFLibraryRegistryUpgradeUtil.copyFile(_v1Registry.toFileString(), newRegURI.toFileString());//save as v2 file	
-			JSFLibraryRegistryUpgradeUtil.deleteFile(_v1Registry.toFileString());
-
-			return new UpgradeStatus();//all is ok and no need to alert user
-			
-		} catch(IOException ioe) {
-			//this was expected... if there was actual v1 contents in the regsistry... upgrade by saving
-			//perform save which will lose the ID
-			try {
-				res.save(Collections.EMPTY_MAP);
-				//create v2 xml file
-				URI newRegURI = 
-					JSFLibraryRegistryUpgradeUtil.getRegistryURI
-						(JSFLibraryRegistryUpgradeUtil.JSF_LIBRARY_REGISTRY_V2_URL);
-				JSFLibraryRegistryUpgradeUtil.copyFile(_v1Registry.toFileString(), newRegURI.toFileString());
-				//delete upgraded v1
-				JSFLibraryRegistryUpgradeUtil.deleteFile(_v1Registry.toFileString());
-				//restore backup to v1 name
-				JSFLibraryRegistryUpgradeUtil.copyFile(_v1Registry.toFileString().concat(".bkp"), _v1Registry.toFileString());
-				//Alert end user
-				return new UpgradeStatus(IStatus.OK, true, Messages.JSFRegistryMigration05_to_10_customMessage);
-			} catch(IOException e) {
-				JSFCorePlugin.log(IStatus.ERROR, "Error during repository upgrade from v1 to v2", e);
-				return new UpgradeStatus(IStatus.ERROR, false, 	
-						Messages.JSFRegistryMigrationCannot05_to_10_customMessage);
-			}
-		}
-		//return ;
-	}
-
-	public IStatus doRedo(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		return doExecute(monitor, info);
-	}
-
-	
-	public boolean canUndo() {
-		// commit is undoable for this operation
-		return super.canUndo() && !hasCommitted();
-	}
-
-	public IStatus doUndo(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException 
-	{
-		//restore backup to v1 name
-		JSFLibraryRegistryUpgradeUtil.copyFile(_v1Registry.toFileString().concat(".bkp"), _v1Registry.toFileString());
-
-		// delete the new registry 
-		JSFLibraryRegistryUpgradeUtil.deleteFile(_v2Registry.toFileString());
-		
-		//and the backup
-		JSFLibraryRegistryUpgradeUtil.deleteFile(_v1Registry.toFileString().concat(".bkp"));
-		
-		return Status.OK_STATUS;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/UpgradeOperation.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/UpgradeOperation.java
deleted file mode 100644
index 130a358..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/UpgradeOperation.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.AbstractOperation;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * Encapsulates a chain of one or more version steps into a full upgrade.
- * 
- * @author cbateman
- *
- */
-public class UpgradeOperation extends AbstractOperation {
-
-	private final List/*<VersionUpgradeOperation*/ _stepOperations;
-
-	/**
-	 * @param label
-	 */
-	public UpgradeOperation(String label) {
-		super(label);
-		_stepOperations = new ArrayList();
-	}
-
-	/**
-	 * Add upgrade operation to the list of operations.
-	 * Execute, undo and redo call each operation's corresponding
-	 * method in the order they are added to the list.
-	 * @param operation
-	 */
-	public void addVersionUpgrade(VersionUpgradeOperation operation)
-	{
-		_stepOperations.add(operation);
-	}
-	
-	/**
-	 * @param monitor 
-	 * @param info 
-	 * @return an OK status if all goes well.  The status for the first op
-	 * that fails otherwise.
-	 * @throws ExecutionException 
-	 */
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-	    
-	    boolean upgraded = false;
-	    
-		for (final Iterator it = _stepOperations.iterator(); it.hasNext();)
-		{
-			VersionUpgradeOperation op = (VersionUpgradeOperation) it.next();
-			// TODO: move to covariant
-			UpgradeStatus status = (UpgradeStatus) op.execute(monitor, info);
-			
-			// fail fast
-			if (status.getSeverity() != IStatus.OK)
-			{
-				return status;
-			}
-			
-			// once an upgrade is flagged, set flag
-			if (status.isUpgradeOccurred())
-			{
-			    upgraded = true;
-			}
-		}
-
-		return new UpgradeStatus(IStatus.OK, upgraded, "Upgrade succeeded");
-	}
-
-	/**
-	 * @param monitor 
-	 * @param info 
-	 * @return an OK status if all goes well.  The status for the first op
-	 * that fails otherwise.
-	 * @throws ExecutionException 
-	 */
-	public IStatus redo(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		for (final Iterator it = _stepOperations.iterator(); it.hasNext();)
-		{
-			VersionUpgradeOperation op = (VersionUpgradeOperation) it.next();
-			IStatus status = op.redo(monitor, info);
-			
-			// fail fast
-			if (status.getSeverity() != IStatus.OK)
-			{
-				return status;
-			}
-		}
-		
-		return new UpgradeStatus(IStatus.OK, true, "Upgrade succeeded");
-	}
-
-	/**
-	 * @param monitor 
-	 * @param info 
-	 * @return an OK status if all goes well.  The status for the first op
-	 * that fails otherwise.
-	 * @throws ExecutionException 
-	 */
-	public IStatus undo(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		for (final Iterator it = _stepOperations.iterator(); it.hasNext();)
-		{
-			VersionUpgradeOperation op = (VersionUpgradeOperation) it.next();
-			IStatus status = op.undo(monitor, info);
-			
-			// fail fast
-			if (status.getSeverity() != IStatus.OK)
-			{
-				return status;
-			}
-		}
-		
-		return Status.OK_STATUS;
-	}
-
-	/**
-	 * @return an OK status if all goes well.  The status for the first op
-	 * that fails otherwise.
-	 * @throws ExecutionException 
-	 */
-	public IStatus commit() throws ExecutionException
-	{
-		for (final Iterator it = _stepOperations.iterator(); it.hasNext();)
-		{
-			VersionUpgradeOperation op = (VersionUpgradeOperation) it.next();
-			
-			if (op.canCommit())
-			{
-				IStatus status = op.commit();
-				
-				// fail fast
-				if (status.getSeverity() != IStatus.OK)
-				{
-					return status;
-				}
-			}
-		}
-		
-		return Status.OK_STATUS;
-	}
-
-	public boolean canExecute()
-	{
-		for (final Iterator it = _stepOperations.iterator(); it.hasNext();)
-		{
-			IUndoableOperation op = (IUndoableOperation) it.next();
-			
-			// fail fast
-			if (!op.canExecute())
-			{
-				return false;
-			}
-		}
-		
-		return true;
-	}
-
-	public boolean canRedo() {
-		for (final Iterator it = _stepOperations.iterator(); it.hasNext();)
-		{
-			IUndoableOperation op = (IUndoableOperation) it.next();
-			
-			// fail fast
-			if (!op.canRedo())
-			{
-				return false;
-			}
-		}
-		
-		return true;
-	}
-
-	public boolean canUndo() {
-		for (final Iterator it = _stepOperations.iterator(); it.hasNext();)
-		{
-			IUndoableOperation op = (IUndoableOperation) it.next();
-			
-			// fail fast
-			if (!op.canUndo())
-			{
-				return false;
-			}
-		}
-		
-		return true;
-	}
-
-	public void dispose() 
-	{
-		for (final Iterator it = _stepOperations.iterator(); it.hasNext();)
-		{
-			IUndoableOperation op = (IUndoableOperation) it.next();
-			op.dispose();
-		}
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/UpgradeStatus.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/UpgradeStatus.java
deleted file mode 100644
index 4a75a1d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/UpgradeStatus.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-
-/**
- * Communicates the status of the JSF Library Registry
- *
- */
-public class UpgradeStatus extends Status
-{
-	private final boolean upgradeOccurred;
-	private UpgradeOperation  upgradeOperation;
-	
-	/**
-	 * All-is-well UpgradeStatus constructor 
-	 */
-	public UpgradeStatus(){		
-		super(IStatus.OK, JSFCorePlugin.getDefault().getPluginID(), "OK");
-		this.upgradeOccurred = false;
-	}
-	
-	/**
-	 * Constructor when registry upgrade has occured or there is a problem during upgrade
-	 * @param severity 
-	 * @param upgradeOccurred flag
-	 * @param message 
-	 * 
-	 */
-	public UpgradeStatus(int severity, boolean upgradeOccurred, String message){	
-		super(severity, JSFCorePlugin.getDefault().getPluginID(), message);
-		this.upgradeOccurred = upgradeOccurred;
-	}
-
-	/**
-	 * @return true if a registry upgrade occurred
-	 */
-	public boolean isUpgradeOccurred() {
-		return upgradeOccurred;
-	}
-
-	/**
-	 * @return the operation used to do the upgrade.
-	 */
-	protected UpgradeOperation getUpgradeOperation() {
-		return upgradeOperation;
-	}
-	
-	void setUpgradeOperation(UpgradeOperation upgradeOperation)
-	{
-		this.upgradeOperation = upgradeOperation;
-	}
-	
-	/**
-	 * Commits any upgrade that has occurred
-	 * @return the result of the commit
-	 */
-	public IStatus commit()
-	{
-		if (upgradeOperation != null)
-		{
-			try
-			{
-				return upgradeOperation.commit();
-			}
-			catch (ExecutionException e)
-			{
-				return new Status(IStatus.ERROR, JSFCorePlugin.getDefault().getPluginID(), "Error committing status", e);
-			}
-		}
-		return Status.OK_STATUS;
-	}
-	
-	/**
-	 * @return the result of rolling back any changes
-	 */
-	public IStatus rollback()
-	{
-		if (upgradeOperation != null)
-		{
-			try
-			{
-				return upgradeOperation.undo(new NullProgressMonitor(), null);
-			}
-			catch (ExecutionException e)
-			{
-				return new Status(IStatus.ERROR, JSFCorePlugin.getDefault().getPluginID(), "Error committing status", e);
-			}
-		}
-		return Status.OK_STATUS;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/VersionUpgradeOperation.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/VersionUpgradeOperation.java
deleted file mode 100644
index bd8f1c2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/VersionUpgradeOperation.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.AbstractOperation;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * Implements a single step (vX -> v(X+1)) version upgrade as an
- * Eclipse operation.  Adds an additional  "commit" abstract method.  This
- * can be called after execute in situations where further actions require
- * user approval etc.  See the javadocs for the method, it contains important
- * API rules
- * 
- * @author cbateman
- *
- */
-public abstract class VersionUpgradeOperation extends AbstractOperation 
-{
-	/**
-	 * the version being upgraded from
-	 */
-	protected final int		_oldVersion;
-	/**
-	 * the version being upgraded to
-	 */
-	protected final int		_newVersion;
-	
-	private boolean				_hasExecuted;
-	private boolean				_hasCommitted;
-	private boolean				_hasCleanState = true;
-	
-	/**
-	 * @param label
-	 * @param oldVersion 
-	 * @param newVersion 
-	 */
-	public VersionUpgradeOperation(String label, int oldVersion, int newVersion) {
-		super(label);
-		_oldVersion = oldVersion;
-		_newVersion = newVersion;
-	}
-	
-	/**
-	 * Allows selected functionality to be called after execute is called.
-	 * Commit must conform to following contract:
-	 * 
-	 *  1) should do nothing if execute() has not been called.
-	 *  2) must do nothing if canCommit == false
-	 *  3) once executed, undo should undo commit() first, then execute()
-	 *  4) once undone, redo should call commit only if it was called before undo()
-	 * @return must conform to same contract as execute() 
-	 * @throws ExecutionException 
-	 *  
-	 */
-	public final IStatus commit() throws ExecutionException
-	{
-		if (canCommit())
-		{
-			IStatus result =  doCommit();
-			if (result.getSeverity() == IStatus.OK)
-			{
-				_hasCommitted = true;
-			}
-			else
-			{
-				_hasCommitted = false;
-				_hasCleanState = false;
-			}
-			return result;
-		}
-		throw new ExecutionException("Cannot execute");
-	}
-
-	/**
-	 * @return the result of the actual commit
-	 * @throws ExecutionException
-	 */
-	protected abstract IStatus doCommit() throws ExecutionException;
-
-	/**
-	 * @return true if the operation can be committed
-	 */
-	public boolean canCommit() 
-	{
-		return _hasExecuted && !_hasCommitted && _hasCleanState;
-	}
-
-	public final IStatus execute(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException 
-	{
-		if (canExecute())
-		{
-			IStatus result = doExecute(monitor, info);
-			if (result.getSeverity() == IStatus.OK)
-			{
-				_hasExecuted = true;
-			}
-			else
-			{
-				_hasExecuted = false;
-				_hasCleanState = false;
-			}
-			return result;
-		}
-		throw new ExecutionException("Cannot execute");
-	}
-
-	/**
-	 * @param monitor
-	 * @param info
-	 * @return the status of the real execution
-	 * @throws ExecutionException 
-	 */
-	protected abstract IStatus doExecute(IProgressMonitor monitor, IAdaptable info)throws ExecutionException;
-
-	public final IStatus redo(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		if (canRedo())
-		{
-			IStatus result = doRedo(monitor, info);
-			if (result.getSeverity() == IStatus.OK)
-			{
-				_hasExecuted = true;
-			}
-			else
-			{
-				_hasExecuted = false;
-				_hasCleanState = false;
-			}
-			return result;
-		}
-		throw new ExecutionException("Cannot redo");
-	}
-
-	/**
-	 * @param monitor
-	 * @param info
-	 * @return the status of the real redo
-	 * @throws ExecutionException 
-	 */
-	protected abstract IStatus doRedo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException;
-
-	public final IStatus undo(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		if (canUndo())
-		{
-			IStatus result = doUndo(monitor, info);
-			if (result.getSeverity() == IStatus.OK)
-			{
-				_hasExecuted = false;
-			}
-			else
-			{
-				_hasExecuted = true;
-				_hasCleanState = false;
-			}
-			return result;
-		}
-		throw new ExecutionException("Cannot redo");
-	}
-
-	/**
-	 * @param monitor
-	 * @param info
-	 * @return the status of the real redo
-	 * @throws ExecutionException 
-	 */
-	protected abstract IStatus doUndo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException;
-
-	public boolean canExecute() {
-		return !_hasExecuted && _hasCleanState;
-	}
-
-	public boolean canRedo() {
-		return canExecute();
-	}
-
-	public boolean canUndo() {
-		return _hasExecuted && _hasCleanState;
-	}
-
-	/**
-	 * @param executed
-	 */
-	protected void setHasExecuted(boolean executed) {
-		_hasExecuted = executed;
-	}
-
-	/**
-	 * @param committed
-	 */
-	protected void setHasCommitted(boolean committed) {
-		_hasCommitted = committed;
-	}
-
-	/**
-	 * @param cleanState
-	 */
-	protected void setHasCleanState(boolean cleanState) {
-		_hasCleanState = cleanState;
-	}
-
-	/**
-	 * @return true if has executed
-	 */
-	protected boolean hasExecuted() {
-		return _hasExecuted;
-	}
-
-	/**
-	 * @return true if has committed
-	 */
-	protected boolean hasCommitted() {
-		return _hasCommitted;
-	}
-
-	/**
-	 * @return true if has clean state
-	 */
-	protected boolean hasCleanState() {
-		return _hasCleanState;
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/launch/JSFFileURL.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/launch/JSFFileURL.java
deleted file mode 100644
index bb3192d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/launch/JSFFileURL.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-
-package org.eclipse.jst.jsf.core.internal.launch;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.j2ee.internal.web.jfaces.extension.FileURL;
-import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.j2ee.model.ModelProviderManager;
-import org.eclipse.jst.j2ee.webapplication.Servlet;
-import org.eclipse.jst.j2ee.webapplication.ServletMapping;
-import org.eclipse.jst.j2ee.webapplication.WebApp;
-import org.eclipse.jst.jsf.core.internal.project.facet.JSFUtils11;
-import org.eclipse.jst.jsf.core.internal.project.facet.JSFUtils12;
-
-/**
- * Extends the FileURL extension-point so that a JSF JSP page
- * can have it's URL mapped to the Faces Servlet using the servlet-mapping 
- * specified in the web.xml file
- * 
- * @author Gerry Kessler - Oracle
- *
- */
-public class JSFFileURL implements FileURL {
-
-	/**
-	 * If this is a JSP page, this will return a URL using the first valid servlet-mapping to the Faces Servlet
-	 * if found.   If the faces servlet is not defined in the web.xml or there is no servlet-mapping, this will return null.
-	 * 
-	 * The resource's file extension is compared with the javax.faces.DEFAULT_SUFFIX context-param if set.   If the same, then 
-	 * extension mapping will be used if found in the web.xml.  If not set, "jsp" default is assumed.   If resource does not have the default
-	 * file extension, then it must have either: jsp,jspx, or jsf file extensions in order to be considered for launch.
-	 * 
-	 * This will not guarentee a page to be run.  The user will still need a properly configured server with valid URL mappings and
-	 * context-params.
-	 * 
-	 * TODO: We could detect and insert or just warn for context-params and url mappings to run.  However, this would better detected during a JSF App validation step.
-	 * 
-	 * @see org.eclipse.jst.j2ee.internal.web.jfaces.extension.FileURL#getFileURL(org.eclipse.core.resources.IResource, org.eclipse.core.runtime.IPath)
-	 */
-	public IPath getFileURL(IResource resource, IPath existingURL) {
-		
-		//is this is a Faces Project with a Faces Servlet?
-		//we will not check to see if facet is installed.  
-		// check to see if this resource is a JSF page (currently always true) and then,
-		//if servlet is present, we will change the url based on first mapping found 
-		IModelProvider provider = ModelProviderManager.getModelProvider(resource.getProject());
-		Object webAppObj = provider.getModelObject();
-		if (webAppObj != null){
-			//methods below returning the path are identical except for the APIs required
-			if (JSFUtils12.isWebApp25(webAppObj)){
-				return getJavaEEFileURLPath(webAppObj, resource, existingURL);
-			} 
-			else if (JSFUtils11.isWebApp24(webAppObj) || JSFUtils11.isWebApp23(webAppObj)) {
-				return getJ2EEFileURLPath(webAppObj, resource, existingURL);
-			}
-		}
-		return null;			
-	}
-	
-	private IPath getJ2EEFileURLPath(Object webAppObj, IResource resource,
-			IPath existingURL) {
-		WebApp webApp = (WebApp)webAppObj;
-		if (webApp != null){
-			Servlet servlet = JSFUtils11.findJSFServlet(webApp);
-			if (servlet == null)//if no faces servlet, do nothing
-				return null;
-			
-			//if not a JSF page, do nothing
-			if (!isJSFPage(resource))
-				return null;
-			
-			String defaultSuffix = JSFUtils11.getDefaultSuffix(webApp);
-			//is the resource using default_suffix
-			boolean canUseExtensionMapping = resource.getFileExtension().equalsIgnoreCase(defaultSuffix);
-			
-			//if not using default extension and is not a known file extension, then we will abort
-			if (! canUseExtensionMapping && ! isValidKnownExtension(resource.getFileExtension()))
-				return null;
-			
-			Iterator mappings = servlet.getMappings().iterator();
-			ServletMapping map = null;
-			String foundFileExtension = null;
-			String foundPrefixMapping = null;
-			while (mappings.hasNext()){
-				map = (ServletMapping)mappings.next();
-				
-				foundFileExtension = JSFUtils11.getFileExtensionFromMap(map);
-				if (foundFileExtension != null && canUseExtensionMapping) {
-					return existingURL.removeFileExtension().addFileExtension(foundFileExtension);
-				}
-				
-				if (foundPrefixMapping == null){
-					foundPrefixMapping = JSFUtils11.getPrefixMapping(map);				
-				}
-				
-			}
-			if (foundPrefixMapping != null)				
-				return new Path(foundPrefixMapping).append(existingURL); 
-				
-			if (! canUseExtensionMapping && foundFileExtension != null){
-				//we could prompt user that this may not work...
-				//for now we will return the extension mapping
-				return existingURL.removeFileExtension().addFileExtension(foundFileExtension);
-			}
-			
-			//we could, at this point, add a url mapping to the faces servlet, or prompt user that it may be a good idea to add one... ;-
-		}
-		return null;
-	}
-
-	private IPath getJavaEEFileURLPath(Object webAppObj, IResource resource,
-			IPath existingURL) {
-		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp )webAppObj;
-		if (webApp != null){
-			org.eclipse.jst.javaee.web.Servlet servlet = JSFUtils12.findJSFServlet(webApp);
-			if (servlet == null)//if no faces servlet, do nothing
-				return null;
-			
-			//if not a JSF page, do nothing
-			if (!isJSFPage(resource))
-				return null;
-			
-			String defaultSuffix = JSFUtils12.getDefaultSuffix(webApp);
-			//is the resource using default_suffix
-			boolean canUseExtensionMapping = resource.getFileExtension().equalsIgnoreCase(defaultSuffix);
-			
-			//if not using default extension and is not a known file extension, then we will abort
-			if (! canUseExtensionMapping && ! isValidKnownExtension(resource.getFileExtension()))
-				return null;
-			
-			Iterator mappings = webApp.getServletMappings().iterator();
-			org.eclipse.jst.javaee.web.ServletMapping map = null;
-			String foundFileExtension = null;
-			while (mappings.hasNext()){
-				map = (org.eclipse.jst.javaee.web.ServletMapping)mappings.next();
-				if (map.getServletName().equals(servlet.getServletName())){
-					foundFileExtension = JSFUtils12.getFileExtensionFromMap(map);
-					if (foundFileExtension != null && canUseExtensionMapping) {
-						return existingURL.removeFileExtension().addFileExtension(foundFileExtension);
-					}
-						
-					String foundPrefixMapping = JSFUtils12.getPrefixMapping(map);
-					if (foundPrefixMapping != null){						
-						return new Path(foundPrefixMapping).append(existingURL); 
-					}
-				}
-			}
-			
-			if (! canUseExtensionMapping && foundFileExtension != null){
-				//we could prompt user that this may not work...
-				//for now we will return the extension mapping
-				return existingURL.removeFileExtension().addFileExtension(foundFileExtension);
-			}
-			
-			//we could, at this point, add a url mapping to the faces servlet, or prompt user that it may be a good idea to add one... ;-
-		}
-
-		return null;
-	}
-
-	private boolean isValidKnownExtension(String fileExtension) {
-		if ((	fileExtension.equalsIgnoreCase("jsp") ||  //$NON-NLS-1$
-				fileExtension.equalsIgnoreCase("jspx") ||  //$NON-NLS-1$
-				fileExtension.equalsIgnoreCase("jsf") || //$NON-NLS-1$
-				fileExtension.equalsIgnoreCase("xhtml"))) //$NON-NLS-1$
-			return true;
-
-		return false;
-	}
-
-	
-	private boolean isJSFPage(IResource resource) {
-		// currently always return true.
-		// need to find quick way of determining whether this is a JSF JSP Page
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/messages.properties
deleted file mode 100644
index 4f8ac77..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/messages.properties
+++ /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:
-#    Gerry Kessler - initial API and implementation
-#    Ian Trimble - change key names for use with org.eclipse.osgi.util.NLS
-###############################################################################
-JSFLibraryRegistry_ErrorCreatingURL=Error creating URL for JSF Library Registry
-JSFLibraryRegistry_NoLoadCreatingNew=Could not load JSF Library Registry; creating new registry
-JSFLibraryRegistry_ErrorSaving=Error saving JSF Library Registry
-JSFLibraryRegistry_DEFAULT_IMPL_LABEL=<Default>
-JSFLibraryConfigModel_Null_Data_Source=Data Source is not provided.
-JSFLibraryRegistry_ErrorLoadingFromExtPt=Error while loading JSF Libaries from extension points
-JSFLibraryClasspathContainer_IMPL_LIBRARY=[JSF Library - implementation]
-
-JSFFacetInstallDataModelProvider_ValidateServletName=Specify a servlet name to use
-JSFLibraryConfigPersistData_SAVED_IMPLLIB_NOT_FOUND=Saved JSF implementation library in {0} is unavailable in JSF Library Registry
-JSFLibraryConfigPersistData_SAVED_COMPLIB_NOT_FOUND=Saved JSF component library in {0} is unavailable in JSF Library Registry
-JSFLibraryClasspathContainer_NON_IMPL_LIBRARY=[JSF Library]
-JSFLibrariesContainerInitializer_missing_library=[missing JSF Library]
-JSFFacetInstallDataModelProvider_ValidateJSFImpl=A JSF implementation library has not been chosen
-JSFFacetInstallDataModelProvider_DupeJarValidation=Duplicated jar on classpath: {0}
-JSFFacetInstallDataModelProvider_ValidateConfigFilePath=The configuration file path is not valid
-JSFFacetInstallDataModelProvider_ValidateConfigFileEmpty=Specify a valid name and location for JSF configuration file
-JSFFacetInstallDataModelProvider_ClientImplValidationMsg=JSF Implementation library must be specified.
-JSFFacetInstallDataModelProvider_ValidateConfigFileRelative1=Configuration file must be specified relative to the project's {0} folder
-JSFFacetInstallDataModelProvider_ValidateConfigFileRelative2=Configuration file must be located in the project's {0} folder
-JSFFacetInstallDataModelProvider_INITIAL_VALIDATION_IMPL_TYPE=Select an implementation library.   If a server supplied library is chosen , the chosen server adapter must be capable of providing the JSF Implementation jars, or the application will not validate or compile.
-JSFFacetInstallDataModelProvider_ValidateConfigFileXML=JSF configuration file must be an XML file
-JSFFacetInstallDataModelProvider_ValidateConfigFileSlashes=Configuration file path must not contain "\\"s.   Use "/" instead.
-JSFLibCfgDialogSettingData_Sticky_Component_Lib_Not_Exist=A sticky component library selection no longer exists.
-
-ArchiveFileImpl_CannotCopyFile=Cannot copy file
-ArchiveFileImpl_CannotCloseFile=Cannot close file
-ArchiveFileImpl_CannotLocatePluginRelativeFile=Cannot locate plugin-relative file "{0}"
-
-PluginProvidedJSFLibraryCreationHelper_ErrorCreating=Unable to create JSF Library: {0}
-PluginProvidedJSFLibraryCreationHelper_ErrorMultipleDefinition={0} defined multiple times in {1}
-
-JSFUtils_ErrorCreatingConfigFile=Error creating config file
-JSFUtils_ErrorClosingConfigFile=Error closing config file
-
-JSFAppConfigUtils_ErrorOpeningJarFile=Error opening JarFile "{0}"
-
-JARFileJSFAppConfigProvider_ErrorLoadingModel=Error loading model for file "{0}"
-JSFUtils_MissingJAR= Missing JSF Library Jar: {0} in {1}
-
-J2EEModuleDependencyDelegate_UpdatingJ2EEModuleDependencies=Updating J2EE Module Dependencies
-J2EEModuleDependencyDelegate_UpdatingJ2EEModuleDependenciesForProject=Updating J2EE Module Dependencies for project "{0}"
-
-JSFRegistryMigration05_to_10_title=User Intervention Required
-JSFRegistryMigration05_to_10_message=IMPORTANT! Please read below:
-JSFRegistryMigration05_to_10_customMessage=You have loaded a workspace created with a previous \
-version of JSF Tools.\nYour JSF Library Registry is out of date and needs to be migrated forward to continue.\n\
-If you choose to proceed, be aware of the following consequences:\n\
-\n\
-1) Projects in this workspace will need to be manually migrated by you to work in this version of JSF Tools.\n\
-2) Once migrated, this workspace will no longer work in older versions of JSF Tools.\n\
-\n\
-If this is not what you want, exit immediately and your workspace will still load in older versions.
-
-JSFRegistryMigrationCannot05_to_10_title=Error During Registry Upgrade
-JSFRegistryMigrationCannot05_to_10_message=IMPORTANT! Please read below:
-JSFRegistryMigrationCannot05_to_10_customMessage=You a loaded a workspace created with a previous \
-version of JSF Tools.\nYour JSF Library Registry is out of date and needs to be migrated forward to continue.\n\
-However, the existing registry has a problem and cannot be upgraded. 
-RegistryMigrationStartupHandler_Error_committing_migration=Error committing migration\!
-RegistryMigrationStartupHandler_Error_Rolling_Back_Migration=Error rolling back migration\!
-RegistryMigrationStartupHandler_Dialog_Confirm_Migration=Confirm
-RegistryMigrationStartupHandler_Dialog_Abort_And_Exit_Migration=Abort and Exit
-RegistryMigrationStartupHandler_Launch_Migration_Doc_On_Confirm=Launch Migration Doc on Confirm
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/IJSFFacetInstallDataModelProperties.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/IJSFFacetInstallDataModelProperties.java
deleted file mode 100644
index ad03d47..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/IJSFFacetInstallDataModelProperties.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:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetInstallDataModelProperties;
-
-/**
- * Defines properties used by the JSF facet install data model.
- * 
- * @author Gerry Kessler - Oracle
- */
-public interface IJSFFacetInstallDataModelProperties extends
-        IFacetInstallDataModelProperties {
-	
-    /**
-     * TODO:
-     */
-	public static final String IMPLEMENTATION_TYPE_PROPERTY_NAME = "IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE_PROPERTY_NAME"; //$NON-NLS-1$
-	
-    /**
-     * TODO:
-     */
-    public static final String IMPLEMENTATION = "IJSFFacetInstallDataModelProperties.IMPLEMENTATION"; //$NON-NLS-1$
-
-    /**
-     * TODO:
-     */
-    public static final String DEPLOY_IMPLEMENTATION = "IJSFFacetInstallDataModelProperties.DEPLOY_IMPLEMENTATION"; //$NON-NLS-1$
-
-    /**
-     * TODO:
-     */
-    public static final String CONFIG_PATH = "IJSFFacetInstallDataModelProperties.CONFIG_PATH"; //$NON-NLS-1$
-
-    /**
-     * TODO:
-     */
-    public static final String SERVLET_NAME = "IJSFFacetInstallDataModelProperties.SERVLET_NAME"; //$NON-NLS-1$
-
-    /**
-     * TODO:
-     */
-    public static final String SERVLET_CLASSNAME = "IJSFFacetInstallDataModelProperties.SERVLET_CLASSNAME"; //$NON-NLS-1$
-
-    /**
-     * TODO:
-     */
-    public static final String SERVLET_URL_PATTERNS = "IJSFFacetInstallDataModelProperties.SERVLET_URL_PATTERNS"; //$NON-NLS-1$
-
-    /**
-     * TODO:
-     */
-    public static final String WEBCONTENT_DIR = "IJSFFacetInstallDataModelProperties.WEBCONTENT_DIR"; //$NON-NLS-1$
-
-    /**
-     * TODO:
-     */
-    public static final String DEFAULT_IMPLEMENTATION_LIBRARY = "IJSFFacetInstallDataModelProperties.DEFAULT_IMPLEMENTATION_LIBRARY"; //$NON-NLS-1$
-
-    /**
-     * TODO:
-     */
-    public static final String IMPLEMENTATION_LIBRARIES = "IJSFFacetInstallDataModelProperties.IMPLEMENTATION_LIBRARIES"; //$NON-NLS-1$
-
-    /**
-     * TODO:
-     */
-    public static final String COMPONENT_LIBRARIES = "IJSFFacetInstallDataModelProperties.COMPONENT_LIBRARIES"; //$NON-NLS-1$	 
-    
-    /**
-     * Enumeration of implementation types
-     */
-    public enum IMPLEMENTATION_TYPE {
-    	
-    	/**
-    	 * Unknown
-    	 */
-    	UNKNOWN,
-    	/**
-    	 * Server supplied
-    	 */
-    	SERVER_SUPPLIED,
-    	/**
-    	 * Client supplied
-    	 */
-    	CLIENT_SUPPLIED;
-    	
-    	/**
-    	 * @param type
-    	 * @return String value
-    	 */
-    	public static String getStringValue(final IMPLEMENTATION_TYPE type){
-    		if (type == null)
-    			return "UNKNOWN"; //$NON-NLS-1$
-    		if (type ==  SERVER_SUPPLIED)
-    			return "SERVER_SUPPLIED";//$NON-NLS-1$
-    		if (type == CLIENT_SUPPLIED)
-    			return "CLIENT_SUPPLIED";//$NON-NLS-1$
-    		return "UNKNOWN"; //$NON-NLS-1$
-    	}
-    	
-    	/**
-    	 * @param type
-    	 * @return IMPLEMENTATION_TYPE
-    	 */
-    	public static IMPLEMENTATION_TYPE getValue(final String type){
-    		if (type == null)
-    			return UNKNOWN;
-    		if (type.equals("SERVER_SUPPLIED"))//$NON-NLS-1$
-    			return SERVER_SUPPLIED;
-    		if (type.equals("CLIENT_SUPPLIED"))//$NON-NLS-1$
-    			return CLIENT_SUPPLIED;
-    		return UNKNOWN; 
-    	}
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetDefaultVersionProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetDefaultVersionProvider.java
deleted file mode 100644
index 549f050..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetDefaultVersionProvider.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import org.eclipse.jst.jsf.core.IJSFCoreConstants;
-import org.eclipse.wst.common.project.facet.core.IDefaultVersionProvider;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-
-/**
- * Provides the default JSF project facet version.
- * Currently always returns "1.1" facet version.   Eventually should be computed from the project's facet context.
- */
-public final class JSFFacetDefaultVersionProvider implements IDefaultVersionProvider {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.project.facet.core.IDefaultVersionProvider#getDefaultVersion()
-	 */
-	public IProjectFacetVersion getDefaultVersion() {		
-		return ProjectFacetsManager.getProjectFacet(IJSFCoreConstants.JSF_CORE_FACET_ID).getVersion(IJSFCoreConstants.FACET_VERSION_1_1);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDataModelProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDataModelProvider.java
deleted file mode 100644
index 1c7b7db..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDataModelProvider.java
+++ /dev/null
@@ -1,388 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
-import org.eclipse.jst.jsf.core.IJSFCoreConstants;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.datamodel.FacetInstallDataModelProvider;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.operations.IProjectCreationPropertiesNew;
-
-/**
- * Provides a data model used by the JSF facet install.
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFFacetInstallDataModelProvider extends
-		FacetInstallDataModelProvider implements
-		IJSFFacetInstallDataModelProperties {
-
-	private String 	errorMessage;
-	
-	public Set getPropertyNames() {
-		Set names = super.getPropertyNames();
-		names.add(IMPLEMENTATION_TYPE_PROPERTY_NAME);
-		names.add(IMPLEMENTATION);
-		names.add(DEPLOY_IMPLEMENTATION);
-		names.add(CONFIG_PATH);
-		names.add(SERVLET_NAME);
-		names.add(SERVLET_CLASSNAME);
-		names.add(SERVLET_URL_PATTERNS);
-		names.add(WEBCONTENT_DIR);
-		
-		names.add(IMPLEMENTATION_LIBRARIES);
-		names.add(COMPONENT_LIBRARIES);
-		names.add(DEFAULT_IMPLEMENTATION_LIBRARY);
-		
-		return names;
-	}
-
-	public Object getDefaultProperty(String propertyName) {
-		if (propertyName.equals(IMPLEMENTATION_TYPE_PROPERTY_NAME)){
-			return IMPLEMENTATION_TYPE.UNKNOWN;
-		}
-		else if (propertyName.equals(IMPLEMENTATION)) {
-			if (JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry() == null)
-				return null;
-			return getDefaultImplementationLibrary();//JSFCorePlugin.getDefault().getJSFLibraryRegistry().getDefaultImplementation();
-		} else if (propertyName.equals(DEPLOY_IMPLEMENTATION)) {
-			return Boolean.TRUE;
-		} else if (propertyName.equals(CONFIG_PATH)) {
-			return JSFUtils.JSF_DEFAULT_CONFIG_PATH; 
-		} else if (propertyName.equals(SERVLET_NAME)) {
-			return JSFUtils.JSF_DEFAULT_SERVLET_NAME;
-		} else if (propertyName.equals(SERVLET_CLASSNAME)) {
-			return JSFUtils.JSF_SERVLET_CLASS;	
-		} else if (propertyName.equals(SERVLET_URL_PATTERNS)) {
-			return new String[] {JSFUtils.JSF_DEFAULT_URL_MAPPING };
-		} else if (propertyName.equals(FACET_ID)) {
-			return IJSFCoreConstants.JSF_CORE_FACET_ID;
-		} else if (propertyName.equals(WEBCONTENT_DIR)){
-			return "WebContent";  //not sure I need this //$NON-NLS-1$
-		} else if (propertyName.equals(COMPONENT_LIBRARIES)) {
-			return new JSFLibraryInternalReference[0];
-		} else if (propertyName.equals(IMPLEMENTATION_LIBRARIES)) {
-			return getDefaultJSFImplementationLibraries();
-		} else if (propertyName.equals(DEFAULT_IMPLEMENTATION_LIBRARY)) {
-			return getDefaultImplementationLibrary();
-		}
-		return super.getDefaultProperty(propertyName);
-	}
-	
-	public IStatus validate(String name) {
-		errorMessage = null;
-		if (name.equals(IMPLEMENTATION_TYPE_PROPERTY_NAME)) {
-			if (getProperty(IMPLEMENTATION_TYPE_PROPERTY_NAME) == IMPLEMENTATION_TYPE.UNKNOWN) {
-				return createErrorStatus(Messages.JSFFacetInstallDataModelProvider_INITIAL_VALIDATION_IMPL_TYPE);
-			}
-		}
-		else if (name.equals(IMPLEMENTATION)) {
-			if (getProperty(IMPLEMENTATION_TYPE_PROPERTY_NAME) == IMPLEMENTATION_TYPE.CLIENT_SUPPLIED) {
-				JSFLibraryInternalReference lib = (JSFLibraryInternalReference)getProperty(IMPLEMENTATION);
-				IStatus status = validateImpl(lib.getLibrary());
-				if (!OK_STATUS.equals(status))
-					return status;
-					
-	            return validateClasspath();
-			}
-		} else if (name.equals(CONFIG_PATH)) {
-			return validateConfigLocation(getStringProperty(CONFIG_PATH));
-		} else if (name.equals(SERVLET_NAME)) {			
-			return validateServletName(getStringProperty(SERVLET_NAME));
-		}
-		else if (name.equals(COMPONENT_LIBRARIES)) {
-			return validateClasspath();
-		}
-		return super.validate(name);
-	}
-	
-	private IStatus createErrorStatus(String msg) {		
-		return new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, msg);
-	}
-	
-	private IStatus validateServletName(String servletName) {
-		if (servletName == null || servletName.trim().length() == 0) {
-			errorMessage = Messages.JSFFacetInstallDataModelProvider_ValidateServletName;
-			return createErrorStatus(errorMessage);				
-		}
-		
-		return OK_STATUS;
-	}
-
-	private IStatus validateImpl(JSFLibrary impl) {
-		if (impl == null) {
-			errorMessage = Messages.JSFFacetInstallDataModelProvider_ValidateJSFImpl; 
-		}
-		if (errorMessage != null) {
-			return createErrorStatus(errorMessage);
-		}
-		return OK_STATUS;
-	}
-	
-	private IStatus validateConfigLocation(String text) {
-		if (text == null || text.trim().equals("")) { //$NON-NLS-1$
-			errorMessage = Messages.JSFFacetInstallDataModelProvider_ValidateConfigFileEmpty;
-			return createErrorStatus(errorMessage);
-		}
-		text = text.trim();
-		
-		if (getProjectPath() == null) //this circumstance occurs on page init
-			return OK_STATUS;
-		
-		IPath fullPath = getProjectPath().append(text);
-		IPath passedPath = new Path(text);
-		if (!fullPath.isValidPath(text)){
-			errorMessage = Messages.JSFFacetInstallDataModelProvider_ValidateConfigFilePath;
-			return createErrorStatus(errorMessage);
-		}
-		
-		//FIXME:  check for valid file path also [passedPath.toFile().isFile()] 
-		if (text.toLowerCase().lastIndexOf(".xml") != text.length() - 4) { //$NON-NLS-1$
-			errorMessage = Messages.JSFFacetInstallDataModelProvider_ValidateConfigFileXML;
-			return createErrorStatus(errorMessage);
-		}
-		
-		if (text.lastIndexOf("\\") >= 0){ //$NON-NLS-1$
-			errorMessage = Messages.JSFFacetInstallDataModelProvider_ValidateConfigFileSlashes;
-			return createErrorStatus(errorMessage);
-		} 
-//		if (1 == 1){
-//			//FIXME!!!!
-//			//until i can figure out how to get WebContent dir from the WebApp config,
-//			//skip validation here
-//			return OK_STATUS;
-//		}
-		if (passedPath.getDevice() != null) {
-			errorMessage = NLS.bind(
-					Messages.JSFFacetInstallDataModelProvider_ValidateConfigFileRelative1,
-					getWebContentFolderName());
-			return createErrorStatus(errorMessage);
-		}
-		IPath webContentFolder = getWebContentFolder();
-		IPath setPath = webContentFolder.append(passedPath);
-		if (!getWebContentFolder().isPrefixOf(setPath)) {
-			errorMessage = NLS.bind(
-					Messages.JSFFacetInstallDataModelProvider_ValidateConfigFileRelative2,
-					getWebContentFolderName());
-			return createErrorStatus(errorMessage);
-		}
-
-		return OK_STATUS;
-	}
-	
-	private IStatus validateClasspath(){
-		Set jars = new HashSet();
-		if (doesProjectExist()){
-			//validate actual classpath by loading jars from cp
-			try {
-				IClasspathEntry[] entries = getJavaProject().getResolvedClasspath(true);
-				for (int i=0;i<entries.length;i++){
-					IClasspathEntry entry = entries[i];
-					if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY){
-						jars.add(entry.getPath().makeAbsolute().toString());
-					}
-				}
-			} catch (JavaModelException e) {
-			    // FIXME: what should we do in this case?
-			    JSFCorePlugin.log(e, "Error searching class path"); //$NON-NLS-1$
-			}			
-		}
-		//else as we do not have a javaProject yet, all we can do is validate that there is no duplicate jars (absolute path)
-		
-		IStatus status = null;
-		
-		JSFLibraryInternalReference ref = null;
-		if (getProperty(IMPLEMENTATION_TYPE_PROPERTY_NAME) == IMPLEMENTATION_TYPE.CLIENT_SUPPLIED) {
-			ref = ((JSFLibraryInternalReference)getProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION));
-			if (ref != null){
-				status = checkForDupeArchiveFiles(jars, ((JSFLibraryInternalReference)getProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION)).getLibrary());
-				if (!OK_STATUS.equals(status)){
-					return status;
-				}
-			} else {
-				return createErrorStatus(Messages.JSFFacetInstallDataModelProvider_ClientImplValidationMsg);
-			}
-		}
-
-		JSFLibraryInternalReference[] compLibs = (JSFLibraryInternalReference[]) getProperty(IJSFFacetInstallDataModelProperties.COMPONENT_LIBRARIES);
-		if (compLibs != null){
-			for (int i=0;i<compLibs.length;i++){
-				JSFLibrary lib = compLibs[i].getLibrary();
-				status = checkForDupeArchiveFiles(jars, lib);
-					if (!OK_STATUS.equals(status)){
-						return status;
-					}
-			}		
-		}
-		return OK_STATUS;
-	}
-
-	private IJavaProject getJavaProject() {
-		IProject proj = getProject();
-		if (proj != null)
-			return JavaCore.create(proj); 
-		return null;
-	}
-
-	private IProject getProject(){
-		String projName = (String)getProperty(FACET_PROJECT_NAME);
-		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
-		return project;
-	}
-	
-	private boolean doesProjectExist() {
-		IProject project = getProject();
-		return (project != null) && project.exists();
-	}
-
-	private IStatus checkForDupeArchiveFiles(Set jars,
-			JSFLibrary aJSFLib) {
-		if (aJSFLib == null)
-			return OK_STATUS;
-		
-		for (Iterator it=aJSFLib.getArchiveFiles().iterator();it.hasNext();){
-			ArchiveFile jar = (ArchiveFile)it.next();
-			if (jars.contains(jar.getResolvedSourceLocation())){
-				return createErrorStatus(NLS.bind(Messages.JSFFacetInstallDataModelProvider_DupeJarValidation,jar.getResolvedSourceLocation()));				
-			}
-            jars.add(jar.getResolvedSourceLocation());
-		}
-		return OK_STATUS;
-	}
-	
-	private IPath getProjectPath() {
-		String projName = (String)getProperty(FACET_PROJECT_NAME);
-		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
-		if (project.exists()){
-			return project.getLocation();
-		} 
-		
-		IDataModel projModel = (IDataModel)getProperty(MASTER_PROJECT_DM);
-		if (projModel.getBooleanProperty(IProjectCreationPropertiesNew.USE_DEFAULT_LOCATION)){
-			return new Path(projModel.getStringProperty(IProjectCreationPropertiesNew.PROJECT_LOCATION)).append(projName);
-		}
-		
-		return new Path(projModel.getStringProperty(IProjectCreationPropertiesNew.USER_DEFINED_LOCATION)).append(projName);
-	}
-
-	private IPath getWebContentFolder() {
-		//One can get here 2 ways:
-		//if web app exists and user is adding a facet, or
-		// if creating a new web app.
-
-		IPath webContentPath = null;
-		String projName = model.getStringProperty(IFacetDataModelProperties.FACET_PROJECT_NAME);
-		IProject proj = ResourcesPlugin.getWorkspace().getRoot()
-				.getProject(projName);
-		
-		String webFolder = getWebContentFolderName();
-		if (proj.exists()) {
-			
-			webContentPath = ComponentCore.createComponent(proj).getRootFolder()
-						.getUnderlyingFolder().getRawLocation();
-		}
-		else {			
-
-			if (webFolder == null){
-				//we got problems... should not happen
-				return proj.getFullPath();
-			}
-			webContentPath = proj.getFullPath().append(webFolder);
-
-		}
-		return webContentPath;
-	}
-	
-	private String getWebContentFolderName() {
-		String projName = (String)getProperty(FACET_PROJECT_NAME);
-		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
-		if (project.exists()){
-			IPath webContentPath = ComponentCore.createComponent(project).getRootFolder()
-			.getUnderlyingFolder().getProjectRelativePath();
-
-			return webContentPath.toString();
-		}
-		
-		IDataModel projModel = (IDataModel)getProperty(MASTER_PROJECT_DM);
-		FacetDataModelMap dmMap = (FacetDataModelMap)projModel.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
-		IDataModel webFacet = dmMap.getFacetDataModel("jst.web"); //$NON-NLS-1$
-		return webFacet.getStringProperty(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER );
-	}
-
-//	private String getStringPropertyValueRecursively(final IDataModel amodel, final  String propName){
-//		if (hasProperty(amodel, propName))
-//			return amodel.getStringProperty(propName);
-//		for (Iterator it=amodel.getNestedModels().iterator();it.hasNext();){
-//			IDataModel nestedModel = (IDataModel)it.next();
-//			String propvalue = getStringPropertyValueRecursively(nestedModel, propName);
-//			if(propvalue != null)
-//				return propvalue;
-//		}
-//		return null;
-//	}
-//	private boolean hasProperty(IDataModel model, String propertyName) {
-//		for (Iterator it= model.getAllProperties().iterator();it.hasNext();){
-//			String prop = (String)it.next();
-////			System.out.println(prop);
-//			if (propertyName.equals(prop))
-//				return true;
-//		}
-//		return false;
-//	}
-
-	private List getDefaultJSFImplementationLibraries() {
-		List list = new ArrayList();
-		if (JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry() != null) {
-			JSFLibrary jsfLib = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getDefaultImplementation();
-			if (jsfLib != null){
-				JSFLibraryInternalReference prjJSFLib = new JSFLibraryInternalReference(jsfLib, true, true);
-				list.add(prjJSFLib);
-			}
-		}
-		return list;
-	}	
-	
-	private JSFLibraryInternalReference getDefaultImplementationLibrary() {		
-		if (JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry() != null) {
-			JSFLibrary jsfLib = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getDefaultImplementation();
-			return new JSFLibraryInternalReference(jsfLib, true, true);	
-		}
-		return null;	
-	}	
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDelegate.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDelegate.java
deleted file mode 100644
index 99c481e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDelegate.java
+++ /dev/null
@@ -1,357 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.core.IClasspathAttribute;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.common.project.facet.core.ClasspathHelper;
-import org.eclipse.jst.j2ee.classpathdep.ClasspathDependencyUtil;
-import org.eclipse.jst.j2ee.classpathdep.IClasspathDependencyConstants;
-import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
-import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.j2ee.model.ModelProviderManager;
-import org.eclipse.jst.javaee.web.Servlet;
-import org.eclipse.jst.javaee.web.WebApp;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryConfigurationHelper;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.project.facet.core.IDelegate;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-/**
- * JSF Facet Install Delegate for WTP faceted web projects.  Deals with 2.3, 2.4 and 2.5 web app models.
- * 
- * Uses <code>com.eclispe.jst.jsf.core.internal.project.facet.JSFFacetInstallDataModelProvider<code> for model
- * 	 <li> creates JSF configuration file if not already present.  It will not attempt to upgrade or downgrade the version if there is a mismatch.
- * 	 <li> updates web.xml for: servlet, servlet-mapping and context-param
- * 	 <li> adds implementation jars to WEB-INF/lib if user requests
- * 
- * @see org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetInstallDataModelProvider
- * @since 1.0
- */
-public final class JSFFacetInstallDelegate implements IDelegate {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.project.facet.core.IDelegate#execute(org.eclipse.core.resources.IProject, org.eclipse.wst.common.project.facet.core.IProjectFacetVersion, java.lang.Object, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void execute(final IProject project, final IProjectFacetVersion fv,
-			final Object cfg, final IProgressMonitor monitor)
-			throws CoreException
-
-	{
-
-		if (monitor != null) {
-			monitor.beginTask("", 1); //$NON-NLS-1$
-		}
-
-		try {
-			IDataModel config = null;
-
-			if (cfg != null) {
-				config = (IDataModel) cfg;
-			} else {
-				throw new CoreException(
-						new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID,
-								"Internal Error creating JSF Facet.  Missing configuration."));
-			}
-
-			// Create JSF Libs as classpath containers and set WTP dependencies
-			// as required
-			createClasspathEntries(project, fv, config, monitor);
-
-			// Create config file
-			createConfigFile(project, fv, config, monitor);
-
-			// Update web model
-			createServletAndModifyWebXML(project, config, monitor);
-
-			if (monitor != null) {
-				monitor.worked(1);
-			}
-
-		} finally {
-			if (monitor != null) {
-				monitor.done();
-			}
-		}
-	}
-
-	/**
-	 * Adds the JSF Library references specified in the wizard to the project as
-	 * classpath containers. Marks the containers as J2EE module dependencies as
-	 * required
-	 * 
-	 * @param project
-	 * @param config
-	 * @param monitor
-	 */
-	private void createClasspathEntries(final IProject project, final IProjectFacetVersion fv, final IDataModel config, final IProgressMonitor monitor) {
-		IJavaProject javaProject = JavaCore.create(project);	
-		List cpEntries = new ArrayList();
-		try {
-			for (int i=0;i<javaProject.getRawClasspath().length;i++){
-				cpEntries.add(javaProject.getRawClasspath()[i]);
-			}
-		} catch (JavaModelException e) {
-			JSFCorePlugin.log(e, "Unable to read classpath"); //$NON-NLS-1$
-		}
-		
-		IPath path, cp = null;
-		IClasspathEntry entry = null;
-		JSFLibraryInternalReference libref = null;
-		
-		//Implementation
-		if (config.getProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE_PROPERTY_NAME) 
-				== IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE.CLIENT_SUPPLIED){
-			cp = new Path(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID);		
-			libref = (JSFLibraryInternalReference)config.getProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION);
-			path = cp.append(new Path(libref.getID()));
-			entry = getNewCPEntry(path, libref);		
-			cpEntries.add(entry);
-		} 
-
-		JSFLibraryInternalReference[] compLibs = (JSFLibraryInternalReference[])config.getProperty(IJSFFacetInstallDataModelProperties.COMPONENT_LIBRARIES);
-		for (int i=0;i<compLibs.length;i++){
-			libref = compLibs[i];		
-			cp = new Path(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID);		
-			path = cp.append(new Path(libref.getID()));
-			entry = getNewCPEntry(path, libref);
-			if (entry != null)
-				cpEntries.add(entry);
-		}	
-
-		JSFLibraryRegistryUtil.setRawClasspath(javaProject, cpEntries, monitor);
-	
-		//allow for the raw classpath to be set from JSF Libs before setting the server supplied impl libs from the server, if available
-		if (config.getProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE_PROPERTY_NAME) 
-				== IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE.SERVER_SUPPLIED) {
-			try {
-				ClasspathHelper.removeClasspathEntries(project, fv);
-				ClasspathHelper.addClasspathEntries(project, fv);
-			} catch (CoreException e) {
-				JSFCorePlugin.log(IStatus.ERROR, "Unable to add server supplied implementation to the classpath.", e);//$NON-NLS-1$
-			}
-		}
-		
-	}
-
-	/**
-	 * @param path
-	 * @param lib
-	 * @return creates new IClasspathEntry with WTP dependency attribute set, if required
-	 */
-	private IClasspathEntry getNewCPEntry(final IPath path, final JSFLibraryInternalReference lib) {
-		
-		IClasspathEntry entry = null;
-		if (lib.isCheckedToBeDeployed()){
-			IClasspathAttribute depAttrib = JavaCore.newClasspathAttribute(IClasspathDependencyConstants.CLASSPATH_COMPONENT_DEPENDENCY,
-					 ClasspathDependencyUtil.getDefaultRuntimePath(true).toString());
-			entry = JavaCore.newContainerEntry(path,null, new IClasspathAttribute[]{depAttrib}, true);
-		}
-		else {
-			entry = JavaCore.newContainerEntry(path);
-		}
-		
-		return entry;
-	}		
-
-	/**
-	 * @param config
-	 * @return list of URL patterns from the datamodel
-	 */
-	private List getServletMappings(final IDataModel config) {
-		List mappings = new ArrayList();
-		String[] patterns = (String[])config.getProperty(IJSFFacetInstallDataModelProperties.SERVLET_URL_PATTERNS);
-		for (int i = 0; i < patterns.length; i++) {
-			String pattern = patterns[i];
-			mappings.add(pattern);
-		}
-
-		return mappings;
-	}
-
-	/**
-	 * @param project
-	 * @param jsfConfigPath
-	 * @return absolute IPath to jsfConfig
-	 */
-	private IPath resolveConfigPath(final IProject project, final String jsfConfigPath) {
-		return ComponentCore.createComponent(project).getRootFolder()
-				.getUnderlyingFolder().getRawLocation().append(
-						new Path(jsfConfigPath));
-
-	}
-
-	/**
-	 * Create the faces configuration file.  If the file already exist, then the file is left alone.
-	 * @param project
-	 * @param fv
-	 * @param config
-	 * @param monitor
-	 */
-	private void createConfigFile(final IProject project,
-			final IProjectFacetVersion fv, final IDataModel config,
-			final IProgressMonitor monitor) {
-
-
-		final IPath configPath = resolveConfigPath(project, config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH));
-		try {
-			// do not overwrite if the file exists
-			if (!configPath.toFile().exists()) {
-				final IWorkspaceRunnable op = new IWorkspaceRunnable(){
-					public void run(IProgressMonitor monitor_inner) throws CoreException{ 
-						if (shouldUseJ2EEConfig(fv)){
-							JSFUtils11.createConfigFile(fv.getVersionString(),
-									configPath);
-						} else {
-							JSFUtils12.createConfigFile(fv.getVersionString(),
-									configPath);
-						}
-						project.refreshLocal(IResource.DEPTH_INFINITE, monitor_inner);
-					}
-
-					private boolean shouldUseJ2EEConfig(final IProjectFacetVersion fv) {
-						if (fv.getVersionString().equals("1.1"))
-							return true;
-						else
-							return false;
-					}
-				};
-				op.run(monitor);
-			}
-		} catch (CoreException e) {
-			JSFCorePlugin.log(e, "Exception occured while creating faces-config.xml");//$NON-NLS-1$
-		}
-
-	}
-
-	/**
-	 * Create servlet and URL mappings and update the webapp
-	 * @param project
-	 * @param config
-	 * @param monitor
-	 */
-	private void createServletAndModifyWebXML(final IProject project,
-			final IDataModel config, final IProgressMonitor monitor) {
-		
-		IModelProvider provider = ModelProviderManager.getModelProvider(project); 
-		Object webAppObj = provider.getModelObject();
-		if (webAppObj == null){
-			JSFCorePlugin.log(IStatus.ERROR, project.getName()+": unable to configure web module for JavaServer Faces"); //$NON-NLS-1$
-			return;
-		}			
-		
-		IPath webXMLPath = new Path("WEB-INF").append("web.xml");
-		if (JSFUtils12.isWebApp25(webAppObj)) {			
-			final WebApp webApp = (WebApp)webAppObj;
-			provider.modify(new UpdateWebXMLForJavaEE(webApp, config), webXMLPath); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		else {//must be 2.3 or 2.4
-			final org.eclipse.jst.j2ee.webapplication.WebApp webApp = (org.eclipse.jst.j2ee.webapplication.WebApp)webAppObj;
-			provider.modify(new UpdateWebXMLForJ2EE(webApp, config), webXMLPath); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-	}
-	
-	private class UpdateWebXMLForJavaEE implements Runnable {
-		private WebApp webApp;
-		private IDataModel config;
-		
-		UpdateWebXMLForJavaEE(final WebApp webApp, final IDataModel config){
-			this.webApp = webApp;
-			this.config = config;
-		}
-		
-		public void run() {
-
-			// create or update servlet ref
-			Servlet servlet = JSFUtils12.findJSFServlet(webApp);// check to see
-																// if already
-// No longer removing any old mappings on install - see 194919 															// present
-//			if (servlet != null) {
-//				// remove old mappings
-//				JSFUtils12.removeURLMappings(webApp, servlet);
-//			}
-			
-			servlet = JSFUtils12
-					.createOrUpdateServletRef(webApp, config, servlet);
-	
-			// init mappings
-			List listOfMappings = getServletMappings(config);
-			JSFUtils12.setUpURLMappings(webApp, listOfMappings, servlet);
-	
-			// setup context params
-			JSFUtils12.setupConfigFileContextParamForV2_5(webApp, config);
-		}
-	}
-	
-	private class UpdateWebXMLForJ2EE implements Runnable {
-		private org.eclipse.jst.j2ee.webapplication.WebApp webApp;
-		private IDataModel config;
-		
-		UpdateWebXMLForJ2EE(final org.eclipse.jst.j2ee.webapplication.WebApp webApp, final IDataModel config){
-			this.webApp = webApp;
-			this.config = config;
-		}
-		
-		public void run() {
-			// create or update servlet ref
-			org.eclipse.jst.j2ee.webapplication.Servlet servlet = JSFUtils11.findJSFServlet(webApp);// check to see
-																// if already
-																// present
-			
-// No longer removing any old mappings on install - see 194919 
-//			if (servlet != null) {
-//				// remove old mappings
-//				JSFUtils11.removeURLMappings(webApp, servlet);
-//			}
-			
-			servlet = JSFUtils11
-					.createOrUpdateServletRef(webApp, config, servlet);
-	
-			// init mappings
-			List listOfMappings = getServletMappings(config);
-			JSFUtils11.setUpURLMappings(webApp, listOfMappings, servlet);
-	
-			// setup context params
-			setupContextParams(webApp, config);
-		}
-		
-		private void setupContextParams(final org.eclipse.jst.j2ee.webapplication.WebApp webApp, final IDataModel config) {
-			if (webApp.getVersionID() == J2EEVersionConstants.WEB_2_3_ID)//shouldn't have to do it this way, but that's the way it goes 119442
-				JSFUtils11.setupConfigFileContextParamForV2_3(webApp, config);
-			else 
-				JSFUtils11.setupConfigFileContextParamForV2_4(webApp, config);
-		}
-	}
-
-
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetPrimaryRuntimeChangedListener.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetPrimaryRuntimeChangedListener.java
deleted file mode 100644
index e855551..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetPrimaryRuntimeChangedListener.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.common.project.facet.core.ClasspathHelper;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryConfigurationHelper;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectEvent;
-import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectListener;
-import org.eclipse.wst.common.project.facet.core.events.IPrimaryRuntimeChangedEvent;
-
-/**
- * Handles primary runtime changed events when the JSF Facet is installed
- * 
- * @since JSF 1.0.1
- */
-public class JSFFacetPrimaryRuntimeChangedListener implements IFacetedProjectListener {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.project.facet.core.events.IFacetedProjectListener#handleEvent(org.eclipse.wst.common.project.facet.core.events.IFacetedProjectEvent)
-	 */
-	public void handleEvent(IFacetedProjectEvent event) {
-		if (event instanceof IPrimaryRuntimeChangedEvent &&
-				getJSFFacetedVersion(event.getProject().getProject()) != null && //must be a JSF faceted project
-				JSFLibraryConfigurationHelper.isConfiguredForSystemSuppliedImplementation(event.getProject().getProject())){
-			
-			try {				
-				IProject project = event.getProject().getProject();
-				IProjectFacetVersion fv = getJSFFacetedVersion(project);
-				ClasspathHelper.removeClasspathEntries(project, fv);
-				ClasspathHelper.addClasspathEntries(project, fv);
-			} catch (CoreException e) {
-				JSFCorePlugin.log(IStatus.ERROR, "Unable to replace server supplied implementation when runtime changed.", e);//$NON-NLS-1$
-			}
-		}
-		
-	}
-
-	/**
-	 * @param project
-	 * @return IProjectFacetVersion and null if not JSF faceted
-	 */
-	private IProjectFacetVersion getJSFFacetedVersion(IProject project) {
-		return JSFAppConfigUtils.getProjectFacet(project);		
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetUninstallDelegate.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetUninstallDelegate.java
deleted file mode 100644
index b447e72..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetUninstallDelegate.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.common.project.facet.core.ClasspathHelper;
-import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.j2ee.model.ModelProviderManager;
-import org.eclipse.jst.javaee.core.ParamValue;
-import org.eclipse.jst.javaee.web.Servlet;
-import org.eclipse.jst.javaee.web.WebApp;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryConfigurationHelper;
-import org.eclipse.wst.common.project.facet.core.IDelegate;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-/**
- * JSF Facet Un-install Delegate for WTP faceted projects.
- *	
- *	<li> removes JSF servlet, servlet-mappings and context-params
- *	<li> leaves JSF configuration files on disk
- *  <li> removes JSF classpath containers
- *  
- */
-public final class JSFFacetUninstallDelegate implements IDelegate {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.project.facet.core.IDelegate#execute(org.eclipse.core.resources.IProject, org.eclipse.wst.common.project.facet.core.IProjectFacetVersion, java.lang.Object, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void execute(final IProject project, final IProjectFacetVersion fv,
-			final Object config, final IProgressMonitor monitor) throws CoreException {
-		{
-
-			if (monitor != null) {
-				monitor.beginTask("", 1); //$NON-NLS-1$
-			}
-
-			try {
-				// Remove JSF Libraries
-				removeJSFLibaries(project, fv, monitor);
-
-				// remove servlet stuff from web.xml
-				uninstallJSFReferencesFromWebApp(project, monitor);
-
-				if (monitor != null) {
-					monitor.worked(1);
-				}
-			} finally {
-				if (monitor != null) {
-					monitor.done();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Removes JSF Lib CP Containers from project
-	 * @param project
-	 * @param monitor
-	 */
-	private void removeJSFLibaries(final IProject project, final IProjectFacetVersion fv, final IProgressMonitor monitor) {
-		 final IJavaProject jproj = JavaCore.create(project);
-		 List keptEntries = new ArrayList();
-		 try {
-			IClasspathEntry[] entries = jproj.getRawClasspath();
-			  keptEntries = new ArrayList();
-			 for (int i=0;i<entries.length;i++){
-				 IClasspathEntry entry = entries[i];
-				 if (entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER && 
-						 ! entry.getPath().segment(0)
-						 	.equals(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID))
-					 keptEntries.add(entry);
-			 }
-		} catch (JavaModelException e) {
-			JSFCorePlugin.log(e, "Cannot get classpath entries to remove JSF Libraries for: "+project.getName()); //$NON-NLS-1$
-		}
-		 
-		 if (keptEntries.size() > 0){
-			 try {
-				jproj.setRawClasspath((IClasspathEntry[])keptEntries.toArray(new IClasspathEntry[0]), monitor);
-			} catch (JavaModelException e) {
-				JSFCorePlugin.log(e, "Exception occured while removing JSF Libraries during JSF Facet uninstall"); //$NON-NLS-1$
-			}
-		 }	
-		
-		try {
-			ClasspathHelper.removeClasspathEntries(project, fv);				
-		} catch (CoreException e) {
-			JSFCorePlugin.log(IStatus.ERROR, "Unable to remove server supplied implementation from the classpath.", e);//$NON-NLS-1$
-		}
-	}
-	
-	private void uninstallJSFReferencesFromWebApp(final IProject project,
-			final IProgressMonitor monitor) {
-		
-		IModelProvider provider = ModelProviderManager.getModelProvider(project);
-		Object webAppObj = provider.getModelObject();
-		if (webAppObj != null) {
-			if (isJavaEEWebApp(webAppObj)){		
-				WebApp webApp = (WebApp)webAppObj;
-				Servlet servlet = JSFUtils12.findJSFServlet(webApp);
-				if (servlet == null)
-					return;
-
-				provider.modify(new RemoveJSFFromJavaEEWebAppOperation(webApp, servlet), new Path("WEB-INF").append("web.xml")); //$NON-NLS-1$ //$NON-NLS-2$
-			} else {//2.3 or 2.4 web app
-				org.eclipse.jst.j2ee.webapplication.WebApp webApp = (org.eclipse.jst.j2ee.webapplication.WebApp)webAppObj;
-				org.eclipse.jst.j2ee.webapplication.Servlet servlet = JSFUtils11.findJSFServlet(webApp);
-				if (servlet == null)
-					return;
-
-				provider.modify(new RemoveJSFFromJ2EEWebAppOperation(webApp, servlet), new Path("WEB-INF").append("web.xml")); //$NON-NLS-1$ //$NON-NLS-2$				
-			}
-		}
-
-	}
-
-	private boolean isJavaEEWebApp(final Object webAppObj) {
-		if (webAppObj instanceof WebApp) 
-			return true;
-
-		return false;
-		
-	}
-
-	class RemoveJSFFromJavaEEWebAppOperation implements Runnable {
-		private WebApp webApp;
-		private Servlet servlet;
-		
-		RemoveJSFFromJavaEEWebAppOperation(final WebApp webApp, final Servlet servlet){
-			this.webApp = webApp;
-			this.servlet = servlet;
-		}
-		
-		public void run() {
-			// remove faces url mappings
-			JSFUtils12.removeURLMappings(webApp, servlet);
-			// remove context params
-			removeJSFContextParams(webApp, servlet);
-			// remove servlet
-			removeJSFServlet(webApp, servlet);
-			
-		}
-		private void removeJSFContextParams(final WebApp webApp, final Servlet servlet) {
-			Iterator it = webApp.getContextParams().iterator();
-			while (it.hasNext()) {
-				ParamValue cp = (ParamValue) it.next();
-				if (cp.getParamName().equals(JSFUtils.JSF_CONFIG_CONTEXT_PARAM)) {
-					webApp.getContextParams().remove(cp);
-					break;
-				}
-			}
-		}
-
-		private void removeJSFServlet(final WebApp webApp, final Servlet servlet) {
-			webApp.getServlets().remove(servlet);
-		}
-		
-	}
-	
-	class RemoveJSFFromJ2EEWebAppOperation implements Runnable {
-		private org.eclipse.jst.j2ee.webapplication.WebApp webApp;
-		private org.eclipse.jst.j2ee.webapplication.Servlet servlet;
-		
-		RemoveJSFFromJ2EEWebAppOperation(final org.eclipse.jst.j2ee.webapplication.WebApp webApp, final org.eclipse.jst.j2ee.webapplication.Servlet servlet){
-			this.webApp = webApp;
-			this.servlet = servlet;
-		}
-		
-		public void run() {
-			// remove faces url mappings
-			JSFUtils11.removeURLMappings(webApp, servlet);
-			// remove context params
-			removeJSFContextParams(webApp, servlet);
-			// remove servlet
-			removeJSFServlet(webApp, servlet);
-			
-		}
-		private void removeJSFContextParams(final org.eclipse.jst.j2ee.webapplication.WebApp webApp, final org.eclipse.jst.j2ee.webapplication.Servlet servlet) {
-			Iterator it = webApp.getContextParams().iterator();
-			while (it.hasNext()) {
-				ParamValue cp = (ParamValue) it.next();
-				if (cp.getParamName().equals(JSFUtils.JSF_CONFIG_CONTEXT_PARAM)) {
-					webApp.getContextParams().remove(cp);
-					break;
-				}
-			}
-		}
-
-		private void removeJSFServlet(final org.eclipse.jst.j2ee.webapplication.WebApp webApp, final org.eclipse.jst.j2ee.webapplication.Servlet servlet) {
-			webApp.getServlets().remove(servlet);
-		}
-		
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils.java
deleted file mode 100644
index 9d8df2b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-
-
-/**
- * 
- */
-public class JSFUtils {
-	/**
-	 * The default name for the Faces servlet
-	 */
-	public static final String JSF_DEFAULT_SERVLET_NAME = "Faces Servlet"; //$NON-NLS-1$
-	/**
-	 * The default name of the Faces servlet class
-	 */
-	public static final String JSF_SERVLET_CLASS = "javax.faces.webapp.FacesServlet"; //$NON-NLS-1$
-	/**
-	 * The name of the context parameter used for JSF configuration files
-	 */
-	public static final String JSF_CONFIG_CONTEXT_PARAM = "javax.faces.CONFIG_FILES"; //$NON-NLS-1$
-	
-	/**
-	 * The name of the context parameter used for defining the default JSP file extension
-	 */
-	public static final String JSF_DEFAULT_SUFFIX_CONTEXT_PARAM = "javax.faces.DEFAULT_SUFFIX"; //$NON-NLS-1$
-	
-	/**
-	 * The path to the default application configuration file
-	 */
-	public static final String JSF_DEFAULT_CONFIG_PATH = "/WEB-INF/faces-config.xml";  //$NON-NLS-1$
-
-	/**
-	 * Default URL mapping to faces servlet
-	 */
-	public static final String JSF_DEFAULT_URL_MAPPING = "/faces/*"; //$NON-NLS-1$
-
-	/**
-	 * the key for implementation libraries in persistent properties
-     * TODO: should encapsulate the property somewhere and hide the constant
-	 */
-	public static final String PP_JSF_IMPLEMENTATION_LIBRARIES = "jsf.implementation.libraries"; //$NON-NLS-1$
-	/**
-	 * the key for component libraries in persistent properties
-     * TODO: should encapsulate the property somewhere and hide the constant
-	 */
-	public static final String PP_JSF_COMPONENT_LIBRARIES = "jsf.component.libraries"; //$NON-NLS-1$
-	/**
-	 * the key for implementation type in persistent properties
-     * TODO: should encapsulate the property somewhere and hide the constant
-	 */
-	public static final String PP_JSF_IMPLEMENTATION_TYPE = "jsf.implementation.type"; //$NON-NLS-1$
-	/**
-	 * Construct an array that hold paths for all JARs in a JSF library. 
-	 * However, archive files that no longer exist are filtered out.  
-	 * 
-	 * @param jsfLib
-	 * @param logMissingJar true to log an error for each invalid JAR.
-	 * @return elements
-	 */
-	public static IPath[] getJARPathforJSFLibwFilterMissingJars(JSFLibrary jsfLib, boolean logMissingJar) {
-		EList archiveFiles = jsfLib.getArchiveFiles();
-		int numJars = numberofValidJar(archiveFiles);
-		IPath[] elements = new IPath[numJars];
-		ArchiveFile ar = null;
-		int idxValidJar = 0;
-		for (int i= 0; i < archiveFiles.size(); i++) {
-			ar = (ArchiveFile)archiveFiles.get(i); 
-			if ( !ar.exists() ) {
-				if (logMissingJar) {
-					logErroronMissingJAR(jsfLib, ar);
-				}
-			} else {
-				elements[idxValidJar] = new Path(((ArchiveFile)archiveFiles.get(i)).getResolvedSourceLocation()).makeAbsolute();
-				idxValidJar++;
-			}
-		}
-		return elements;		
-	}
-	
-	/**
-	 * Construct an array that hold paths for all JARs in a JSF library. 
-	 * 
-	 * @param jsfLib
-	 * @param logMissingJar true to log an error for each invalid JAR.
-	 * @return elements
-	 */
-	public static IPath[] getJARPathforJSFLib(JSFLibrary jsfLib, boolean logMissingJar) {		
-		EList archiveFiles = jsfLib.getArchiveFiles();
-		int numJars = archiveFiles.size();
-		IPath[] elements = new IPath[numJars];
-		ArchiveFile ar = null;
-		for (int i= 0; i < numJars; i++) {
-			ar = (ArchiveFile)archiveFiles.get(i); 
-			if ( !ar.exists() && logMissingJar ) {
-				logErroronMissingJAR(jsfLib, ar);
-			}
-			elements[i] = new Path(((ArchiveFile)archiveFiles.get(i)).getResolvedSourceLocation()).makeAbsolute();
-		}
-		return elements;
-	}	
-	
-	private static int numberofValidJar(EList archiveFiles) {
-		int total = 0;
-		final Iterator it = archiveFiles.iterator();
-		ArchiveFile ar = null;
-		while(it.hasNext()) {
-			ar = (ArchiveFile) it.next();
-			if (ar.exists()) {
-				total++;
-			}
-		}
-		return total;
-	}
-	
-	private static void logErroronMissingJAR(JSFLibrary jsfLib, ArchiveFile ar) {
-		String msg = NLS.bind(Messages.JSFUtils_MissingJAR, 
-						ar.getName(),
-						jsfLib.getLabel());
-		JSFCorePlugin.log(IStatus.ERROR, msg);
-	}
-	
-
-	/**
-	 * @param config
-	 * @return servlet display name to use from wizard data model
-	 */
-	protected static String getDisplayName(IDataModel config) {
-		String displayName = config.getStringProperty(IJSFFacetInstallDataModelProperties.SERVLET_NAME);
-		if (displayName.equals("")) //$NON-NLS-1$
-			displayName = JSF_DEFAULT_SERVLET_NAME;
-		return displayName;
-	}
-	
-	/**
-	 * @param config
-	 * @return servlet display name to use from wizard data model
-	 */
-	protected static String getServletClassname(IDataModel config) {
-		String className = config.getStringProperty(IJSFFacetInstallDataModelProperties.SERVLET_CLASSNAME);
-		if (className.equals("")) //$NON-NLS-1$
-			className = JSF_SERVLET_CLASS;
-		return className;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils11.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils11.java
deleted file mode 100644
index 4660bc6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils11.java
+++ /dev/null
@@ -1,433 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.j2ee.common.CommonFactory;
-import org.eclipse.jst.j2ee.common.ParamValue;
-import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
-import org.eclipse.jst.j2ee.webapplication.ContextParam;
-import org.eclipse.jst.j2ee.webapplication.JSPType;
-import org.eclipse.jst.j2ee.webapplication.Servlet;
-import org.eclipse.jst.j2ee.webapplication.ServletMapping;
-import org.eclipse.jst.j2ee.webapplication.ServletType;
-import org.eclipse.jst.j2ee.webapplication.WebApp;
-import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
-import org.eclipse.jst.jsf.core.IJSFCoreConstants;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-
-/**
- * Utility file for JSF model v1.1
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFUtils11 extends JSFUtils {	
-	
-	/**
-	 * Convenience method for getting writeable WebApp model
-	 * @param project
-	 * @return WebArtifactEdit
-	 */
-	public static WebArtifactEdit getWebArtifactEditForWrite(IProject project) {
-		return WebArtifactEdit.getWebArtifactEditForWrite(project);
-	}
-
-	/**
-	 * Convenience method for getting read-only WebApp model
-	 * @param project
-	 * @return WebArtifactEdit
-	 */
-	public static WebArtifactEdit getWebArtifactEditForRead(IProject project) {
-		return WebArtifactEdit.getWebArtifactEditForRead(project);
-	}
-
-	/**
-	 * @param webApp as Object
-	 * @return Servlet - the JSF Servlet for the specified WebApp or null if not present
-	 */
-	public static Servlet findJSFServlet(Object webApp) {
-		Iterator it = null;
-		if (webApp == null)
-			return null;
-		else if (webApp instanceof WebApp)
-			it = ((WebApp)webApp).getServlets().iterator();
-		else if (webApp instanceof org.eclipse.jst.javaee.web.WebApp)
-			it = ((org.eclipse.jst.javaee.web.WebApp)webApp).getServlets().iterator();
-		else
-			return null;
-		
-		while (it.hasNext()) {
-            Servlet servlet = (Servlet) it.next();
-			if (servlet != null && servlet.getWebType() != null) {
-				
-				if(	servlet.getWebType().isServletType()) {
-					if (((ServletType) servlet.getWebType()).getClassName().equals(
-							JSF_SERVLET_CLASS)) {
-						return servlet;
-					}
-				} else if (servlet.getWebType().isJspType()) {
-					if (((JSPType) servlet.getWebType()).getJspFile().equals(
-							JSF_SERVLET_CLASS)) {
-						return servlet;
-					}
-				}
-			}
-		}
-        
-        // if we get to here then we have finished the loop
-        // without finding the servlet we're looking for
-		return null;
-	}
-
-	/**
-	 * Creates a stubbed JSF configuration file for specified JSF version and path
-	 * @param jsfVersion
-	 * @param configPath
-	 */
-	public static void createConfigFile(String jsfVersion, IPath configPath) {
-		FileOutputStream os = null;
-		PrintWriter pw = null;
-		final String QUOTE = new String(new char[] { '"' });
-		try {
-			IPath dirPath = configPath.removeLastSegments(1);
-			dirPath.toFile().mkdirs();
-			File file = configPath.toFile();
-			file.createNewFile();
-			os = new FileOutputStream(file);
-			pw = new PrintWriter(os);
-			pw.write("<?xml version=" + QUOTE + "1.0" + QUOTE + " encoding=" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					+ QUOTE + "UTF-8" + QUOTE + "?>\n\n"); //$NON-NLS-1$ //$NON-NLS-2$
-
-			if (jsfVersion.equals(IJSFCoreConstants.FACET_VERSION_1_1)) 
-            { 
-				pw.write("<!DOCTYPE faces-config PUBLIC\n"); //$NON-NLS-1$
-				pw
-						.write("    " //$NON-NLS-1$
-								+ QUOTE
-								+ "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" //$NON-NLS-1$
-								+ QUOTE + "\n"); //$NON-NLS-1$
-				pw.write("    " + QUOTE //$NON-NLS-1$
-						+ "http://java.sun.com/dtd/web-facesconfig_1_1.dtd" //$NON-NLS-1$
-						+ QUOTE + ">\n\n"); //$NON-NLS-1$
-
-				pw.write("<faces-config>\n\n"); //$NON-NLS-1$
-				pw.write("</faces-config>\n"); //$NON-NLS-1$
-			} 
-
-			pw.close();
-			pw = null;
-		} catch (FileNotFoundException e) {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.JSFUtils_ErrorCreatingConfigFile, e);
-		} catch (IOException e) {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.JSFUtils_ErrorCreatingConfigFile, e);
-		} finally {
-			if (pw != null)
-				pw.close();
-			if (os != null) {
-				try {
-					os.close();
-				} catch (IOException e) {
-					JSFCorePlugin.log(IStatus.ERROR, Messages.JSFUtils_ErrorClosingConfigFile, e);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Creates servlet reference in WebApp if not present or updates servlet name if found
-	 * using the passed configuration.
-	 * 
-	 * @param webApp
-	 * @param config
-	 * @param servlet
-	 * @return Servlet servlet - if passed servlet was null, will return created servlet
-	 */
-	public static Servlet createOrUpdateServletRef(WebApp webApp,
-			IDataModel config, Servlet servlet) {
-		
-		String displayName 	= getDisplayName(config);
-		String className 	= getServletClassname(config);
-		
-		if (servlet == null){			
-			// Create the servlet instance and set up the parameters from data
-			// model
-			servlet = WebapplicationFactory.eINSTANCE.createServlet();
-			servlet.setServletName(displayName);
-
-			ServletType servletType = WebapplicationFactory.eINSTANCE
-					.createServletType();
-			servletType.setClassName(className);
-			servlet.setWebType(servletType);
-			servlet.setLoadOnStartup(new Integer(1));
-			// Add the servlet to the web application model
-			webApp.getServlets().add(servlet);			
-		} else {
-			// update
-			servlet.setServletName(displayName);
-			servlet.setLoadOnStartup(new Integer(1));
-		}
-		return servlet;
-	}
-
-	/**
-	 * @param webApp as Object
-	 * @return true if webApp instanceof org.eclipse.jst.javaee.web.WebApp
-	 */
-	public static boolean isWebApp25(Object webApp) {
-		if (webApp instanceof org.eclipse.jst.javaee.web.WebApp)
-			return true;
-		return false;
-	}
-
-	/**
-	 * Creates servlet-mappings for the servlet
-	 * 
-	 * @param webApp
-	 * @param urlMappingList - list of string values to  be used in url-pattern for servlet-mapping
-	 * @param servlet
-	 */
-	public static void setUpURLMappings(WebApp webApp, List urlMappingList,
-			Servlet servlet) {
-		// Add mappings
-		Iterator it = urlMappingList.iterator();
-		while (it.hasNext()) {
-			String pattern = (String) it.next();
-			if (!(doesServletMappingExist(webApp, servlet, pattern))){
-				ServletMapping mapping = WebapplicationFactory.eINSTANCE
-						.createServletMapping();
-				mapping.setServlet(servlet);
-				mapping.setName(servlet.getServletName());
-				mapping.setUrlPattern(pattern);
-				webApp.getServletMappings().add(mapping);
-			}
-		}
-	}
-	
-
-	private static boolean doesServletMappingExist(final WebApp webApp, final Servlet servlet,
-			final String pattern) {	
-		
-		List mappings = webApp.getServletMappings();
-		String servletName = servlet.getServletName();
-		if (servletName != null) {
-			for (int i=mappings.size()-1;i>=0;--i){
-				ServletMapping mapping = (ServletMapping)mappings.get(i);
-				if (mapping != null && 
-						mapping.getServlet() != null && 
-						mapping.getServlet().getServletName() != null &&
-						mapping.getServlet().getServletName().equals(servletName) &&
-						mapping.getUrlPattern().equals(pattern)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Removes servlet-mappings for servlet using servlet-name.
-	 * @param webApp
-	 * @param servlet
-	 */
-	public static void removeURLMappings(WebApp webApp, Servlet servlet) {
-		List mappings = webApp.getServletMappings();
-		String servletName = servlet.getServletName();
-		if (servletName != null) {
-			for (int i=mappings.size()-1;i>=0;--i){
-				ServletMapping mapping = (ServletMapping)mappings.get(i);
-				if (mapping != null && 
-						mapping.getServlet() != null && 
-						mapping.getServlet().getServletName() != null &&
-						mapping.getServlet().getServletName()
-							.equals(servletName)) {
-					mappings.remove(mapping);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Creates or updates config file context-param in v 2.3 WebApp if non default configuration file is specified.
-	 * @param webApp
-	 * @param config
-	 */
-	public static void setupConfigFileContextParamForV2_3(WebApp webApp,
-			IDataModel config) {
-		// if not default name and location, then add context param
-		ContextParam cp = null;
-		ContextParam foundCP = null;
-		boolean found = false;
-		if (!config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH).equals(JSF_DEFAULT_CONFIG_PATH)) {
-			// check to see if present
-			Iterator it = webApp.getContexts().iterator();
-			while (it.hasNext()) {
-				cp = (ContextParam) it.next();
-				if (cp != null &&
-						cp.getParamName() != null &&
-						cp.getParamName().equals(JSF_CONFIG_CONTEXT_PARAM)) {
-					foundCP = cp;
-					found = true;
-				}
-			}
-			if (!found) {
-				cp = WebapplicationFactory.eINSTANCE.createContextParam();
-				cp.setParamName(JSF_CONFIG_CONTEXT_PARAM);
-				cp.setParamValue(config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH));
-				webApp.getContexts().add(cp);
-			} else {
-				cp = foundCP;
-				if (cp.getParamValue().indexOf(config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH)) < 0) {
-					String curVal = cp.getParamValue();
-					String val = config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH);
-					if (curVal != null || !curVal.trim().equals("")) { //$NON-NLS-1$
-						val = curVal + ",\n" + val; //$NON-NLS-1$
-					}
-					cp.setParamValue(val);
-				}
-			}
-		}
-	}
-	/**
-	 * Creates or updates config file context-param in v2.4 WebApp  if non default configuration file is specified.
-	 * @param webApp
-	 * @param config
-	 */
-	public static void setupConfigFileContextParamForV2_4(WebApp webApp,
-			IDataModel config) {
-		// if not default name and location, then add context param
-		ParamValue foundCP = null;
-		ParamValue cp = null;
-		boolean found = false;
-		if (!config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH).equals(JSF_DEFAULT_CONFIG_PATH)) {
-			// check to see if present
-			Iterator it = webApp.getContextParams().iterator();
-			while (it.hasNext()) {
-				cp = (ParamValue) it.next();
-				if (cp != null && 
-						cp.getName() != null &&
-						cp.getName().equals(JSF_CONFIG_CONTEXT_PARAM)) {
-					foundCP = cp;
-					found = true;
-				}
-			}
-			if (!found) {
-				ParamValue pv = CommonFactory.eINSTANCE.createParamValue();
-				pv.setName(JSF_CONFIG_CONTEXT_PARAM);
-				pv.setValue(config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH));
-				webApp.getContextParams().add(pv);
-			} else {
-				cp = foundCP;
-				if (cp.getValue().indexOf(config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH)) < 0) {
-					String curVal = cp.getValue();
-					String val = config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH);
-					if (curVal != null || !curVal.trim().equals("")) { //$NON-NLS-1$
-						val = curVal + ",\n" + val; //$NON-NLS-1$
-					}
-					cp.setValue(val);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param webAppObj as Object
-	 * @return true if webApp instanceof org.eclipse.jst.j2ee.web.WebApp and versionID == 24
-	 */
-	public static boolean isWebApp24(Object webAppObj) {
-		if (webAppObj instanceof WebApp &&
-				((WebApp)webAppObj).getVersionID() == 24)
-			return true;
-		return false;
-	}
-	
-	/**
-	 * @param webAppObj as Object
-	 * @return true if webApp instanceof org.eclipse.jst.j2ee.web.WebApp and versionID == 23
-	 */
-	public static boolean isWebApp23(Object webAppObj) {
-		if (webAppObj instanceof WebApp &&
-				((WebApp)webAppObj).getVersionID() == 23)
-			return true;
-		return false;
-	}
-	
-	/**
-	 * @param webApp
-	 * @return the default file extension from the context param.  Default is "jsp" if no context param.
-	 */
-	public static String getDefaultSuffix(WebApp webApp) {
-		String defaultSuffix = "jsp"; //$NON-NLS-1$
-		for (Iterator it = webApp.getContexts().iterator();it.hasNext();) {		
-			ContextParam cp = (ContextParam) it.next();		
-			if (cp != null &&
-					cp.getParamName() != null && 
-					cp.getParamName().equals(JSF_DEFAULT_SUFFIX_CONTEXT_PARAM)){				
-				String defSuffix = cp.getParamValue();
-				if (defSuffix.startsWith(".")) //$NON-NLS-1$
-					defSuffix = defSuffix.substring(1);
-								
-				return defSuffix;
-			}
-		}
-		return defaultSuffix;
-	}
-	
-	/**
-	 * @param map
-	 * @return prefix mapping.  may return null.
-	 */
-	public static String getPrefixMapping(ServletMapping map) {
-		IPath extPath = new Path(map.getUrlPattern());
-		if (extPath != null){
-			String ext = extPath.getFileExtension();
-			if (ext == null){
-				String lastSeg = extPath.lastSegment();
-				if (lastSeg != null && 
-						lastSeg.equals("*")) //$NON-NLS-1$
-				{
-					return extPath.removeLastSegments(1).toString();
-				}
-				
-				return extPath.toString();				
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * @param map
-	 * @return extension from map.  Will return null if file extension not found in url patterns.
-	 */
-	public static String getFileExtensionFromMap(ServletMapping map) {
-		IPath extPath = new Path(map.getUrlPattern());
-		if (extPath != null){
-			String ext = extPath.getFileExtension();
-			if (ext != null && !ext.equals("")) //$NON-NLS-1$
-				return ext;
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils12.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils12.java
deleted file mode 100644
index 192c141..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils12.java
+++ /dev/null
@@ -1,339 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.javaee.core.JavaeeFactory;
-import org.eclipse.jst.javaee.core.ParamValue;
-import org.eclipse.jst.javaee.core.UrlPatternType;
-import org.eclipse.jst.javaee.web.Servlet;
-import org.eclipse.jst.javaee.web.ServletMapping;
-import org.eclipse.jst.javaee.web.WebApp;
-import org.eclipse.jst.javaee.web.WebAppVersionType;
-import org.eclipse.jst.javaee.web.WebFactory;
-import org.eclipse.jst.jsf.core.IJSFCoreConstants;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-
-/**
- * Utility file for JSF v1.2 model
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFUtils12 extends JSFUtils{
-
-	/**
-	 * @param webApp
-	 * @return Servlet - the JSF Servlet for the specified WebApp or null if not present
-	 */
-	public static Servlet findJSFServlet(WebApp webApp) {
-
-		Iterator it = webApp.getServlets().iterator();
-		
-		while (it.hasNext()) {
-            Servlet servlet = (Servlet) it.next();
-			if (servlet.getServletClass() != null &&
-					servlet.getServletClass().equals (JSF_SERVLET_CLASS)) {
-				return servlet;
-			}
-		}
-        
-        // if we get to here then we have finished the loop
-        // without finding the servlet we're looking for
-		return null;
-	}
-
-	/**
-	 * Creates a stubbed JSF v1.2 configuration file for specified JSF version and path
-	 * @param jsfVersion
-	 * @param configPath
-	 */
-	public static void createConfigFile(String jsfVersion, IPath configPath) {
-		FileOutputStream os = null;
-		PrintWriter pw = null;
-		final String QUOTE = new String(new char[] { '"' });
-		try {
-			IPath dirPath = configPath.removeLastSegments(1);
-			dirPath.toFile().mkdirs();
-			File file = configPath.toFile();
-			file.createNewFile();
-			os = new FileOutputStream(file);
-			pw = new PrintWriter(os);
-			pw.write("<?xml version=" + QUOTE + "1.0" + QUOTE + " encoding=" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					+ QUOTE + "UTF-8" + QUOTE + "?>\n\n"); //$NON-NLS-1$ //$NON-NLS-2$
-
-			if (jsfVersion.equals(IJSFCoreConstants.FACET_VERSION_1_2)) 
-            {
-				pw.write("<faces-config\n"); //$NON-NLS-1$
-				pw.write("    " + "xmlns=" + QUOTE //$NON-NLS-1$ //$NON-NLS-2$
-						+ "http://java.sun.com/xml/ns/javaee" + QUOTE + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-				pw.write("    " + "xmlns:xsi=" + QUOTE //$NON-NLS-1$ //$NON-NLS-2$
-						+ "http://www.w3.org/2001/XMLSchema-instance" + QUOTE //$NON-NLS-1$
-						+ "\n"); //$NON-NLS-1$
-				pw
-						.write("    " //$NON-NLS-1$
-								+ "xsi:schemaLocation=" //$NON-NLS-1$
-								+ QUOTE
-								+ "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd" //$NON-NLS-1$
-								+ QUOTE + "\n"); //$NON-NLS-1$
-				pw.write("    " + "version=" + QUOTE + "1.2" + QUOTE + ">\n\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-				pw.write("</faces-config>\n"); //$NON-NLS-1$
-			}
-
-			pw.close();
-			pw = null;
-		} catch (FileNotFoundException e) {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.JSFUtils_ErrorCreatingConfigFile, e);
-		} catch (IOException e) {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.JSFUtils_ErrorCreatingConfigFile, e);
-		} finally {
-			if (pw != null)
-				pw.close();
-			if (os != null) {
-				try {
-					os.close();
-				} catch (IOException e) {
-					JSFCorePlugin.log(IStatus.ERROR, Messages.JSFUtils_ErrorClosingConfigFile, e);
-				}
-			}
-		}
-	}
-
-
-	/**
-	 * Creates servlet reference in WebApp if not present or updates servlet name if found
-	 * using the passed configuration.
-	 * 
-	 * @param webApp
-	 * @param config
-	 * @param servlet
-	 * @return Servlet servlet - if passed servlet was null, will return created servlet
-	 */
-	public static Servlet createOrUpdateServletRef(WebApp webApp,
-			IDataModel config, org.eclipse.jst.javaee.web.Servlet servlet) {
-		
-		String displayName = getDisplayName(config);		
-		String className = getServletClassname(config);
-		
-		if (servlet == null){			
-			// Create the servlet instance and set up the parameters from data
-			// model
-			servlet = WebFactory.eINSTANCE.createServlet();
-			servlet.setServletName(displayName);
-			servlet.setServletClass(className);
-			servlet.setLoadOnStartup(new Integer(1));
-			// Add the servlet to the web application model
-			webApp.getServlets().add(servlet);
-
-		} else {
-			// update
-			servlet.setServletName(displayName);
-			servlet.setLoadOnStartup(new Integer(1));
-		}
-		return servlet;
-	}
-
-	/**
-	 * @param webAppObj as Object
-	 * @return true if webApp instanceof org.eclipse.jst.javaee.web.WebApp and WebAppVersionType._25
-	 */
-	public static boolean isWebApp25(Object webAppObj) {
-		if (webAppObj instanceof WebApp &&
-				((WebApp)webAppObj).getVersion() == WebAppVersionType._25_LITERAL) 
-			return true;
-		return false;
-	}
-	
-	/**
-	 * Creates servlet-mappings for the servlet for 2.5 WebModules or greated
-	 * 
-	 * @param webApp
-	 * @param urlMappingList - list of string values to  be used in url-pattern for servlet-mapping
-	 * @param servlet
-	 */
-	public static void setUpURLMappings(WebApp webApp, List urlMappingList,
-			Servlet servlet) {
-		
-		if (urlMappingList.size() > 0) {
-			ServletMapping mapping = findServletMapping(webApp, servlet);
-			if (mapping == null){
-				mapping = WebFactory.eINSTANCE.createServletMapping();
-				mapping.setServletName(servlet.getServletName());
-				webApp.getServletMappings().add(mapping);
-			}
-			// Add patterns
-			Iterator it = urlMappingList.iterator();
-			while (it.hasNext()) {
-				String pattern = (String) it.next();
-				if (!(doesServletMappingPatternExist(webApp, mapping, pattern))){
-					UrlPatternType urlPattern = JavaeeFactory.eINSTANCE.createUrlPatternType();
-					urlPattern.setValue(pattern);				
-					mapping.getUrlPatterns().add(urlPattern);
-				}
-			}
-		}
-	}
-	
-	private static ServletMapping findServletMapping(final WebApp webApp, final Servlet servlet) {
-		for (Iterator it=webApp.getServletMappings().iterator();it.hasNext();){
-			ServletMapping mapping = (ServletMapping)it.next();
-			if (mapping.getServletName().equals(servlet.getServletName()))
-				return mapping;
-		}
-		return null;
-	}
-
-	private static boolean doesServletMappingPatternExist(final WebApp webApp, final ServletMapping mapping,
-			final String pattern) {	
-		for (Iterator it=mapping.getUrlPatterns().iterator();it.hasNext();){
-			if(pattern.equals(((UrlPatternType)it.next()).getValue()))
-				return true;
-		}
-		return false;
-	}
-	
-	/**
-	 * Removes servlet-mappings for servlet using servlet-name for >= 2.5 WebModules.
-	 * @param webApp
-	 * @param servlet
-	 */
-	public static void removeURLMappings(WebApp webApp, Servlet servlet) {
-		List mappings = webApp.getServletMappings();					
-		String servletName = servlet.getServletName();
-		if (servletName != null) {
-			for (int i=mappings.size()-1;i>=0;--i){
-				ServletMapping mapping = (ServletMapping)mappings.get(i);
-				if (mapping != null && 
-						mapping.getServletName() != null && 
-						mapping.getServletName()
-						.equals(servletName)) {
-					mappings.remove(mapping);
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Creates or updates config file context-param in v2.5 WebApp if non default configuration file is specified.
-	 * @param webApp
-	 * @param config
-	 */
-	public static void setupConfigFileContextParamForV2_5(org.eclipse.jst.javaee.web.WebApp webApp,
-			IDataModel config) {
-		// if not default name and location, then add context param
-		ParamValue foundCP = null;
-		ParamValue cp = null;
-		boolean found = false;
-		if (!config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH).equals(JSF_DEFAULT_CONFIG_PATH)) {
-			// check to see if present
-			Iterator it = webApp.getContextParams().iterator();
-			while (it.hasNext()) {
-				cp = (org.eclipse.jst.javaee.core.ParamValue) it.next();
-				if (cp != null && 
-						cp.getParamName()!= null &&
-						cp.getParamName().equals(JSF_CONFIG_CONTEXT_PARAM)) {
-					foundCP = cp;
-					found = true;
-				}
-			}
-			if (!found) {
-				ParamValue pv = JavaeeFactory.eINSTANCE.createParamValue();
-				pv.setParamName(JSF_CONFIG_CONTEXT_PARAM);
-				pv.setParamValue(config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH));
-				webApp.getContextParams().add(pv);
-			} else {
-				cp = foundCP;
-				if (cp.getParamValue().indexOf(config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH)) < 0) {
-					String curVal = cp.getParamValue();
-					String val = config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH);
-					if (curVal != null || !curVal.trim().equals("")) { //$NON-NLS-1$
-						val = curVal + ",\n" + val; //$NON-NLS-1$
-					}
-					cp.setParamValue(val);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param webApp
-	 * @return the default file extension from the context param.  Default is "jsp" if no context param
-	 */
-	public static String getDefaultSuffix(WebApp webApp) {
-		String defaultSuffix = "jsp"; //$NON-NLS-1$
-		for (Iterator it = webApp.getContextParams().iterator();it.hasNext();) {		
-			ParamValue cp = (ParamValue) it.next();		
-			if (cp != null && 
-					cp.getParamName() != null && 
-					cp.getParamName().equals(JSF_DEFAULT_SUFFIX_CONTEXT_PARAM)){				
-				String defSuffix = cp.getParamValue();
-				if (defSuffix.startsWith(".")) //$NON-NLS-1$
-					defSuffix = defSuffix.substring(1);
-								
-				return defSuffix;
-			}
-		}
-		return defaultSuffix;
-	}
-	
-	/**
-	 * @param map
-	 * @return prefix mapping 
-	 */
-	public static String getPrefixMapping(ServletMapping map) {
-		List urls = map.getUrlPatterns();
-		for (Iterator it=urls.iterator();it.hasNext();){
-			IPath extPath = new Path(((UrlPatternType)it.next()).getValue());
-			if (extPath != null){
-				String ext = extPath.getFileExtension();
-				if (ext == null){
-					String lastSeg = extPath.lastSegment();
-					if (lastSeg.equals("*")) //$NON-NLS-1$
-					{
-						return extPath.removeLastSegments(1).toString();
-					}
-					
-					return extPath.toString();				
-				}
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * @param map
-	 * @return extension from map.  Will return null if file extension not found in url patterns.
-	 */
-	public static String getFileExtensionFromMap(ServletMapping map) {
-		List urls = map.getUrlPatterns();
-		for (Iterator it=urls.iterator();it.hasNext();){
-			IPath extPath = new Path(((UrlPatternType)it.next()).getValue());
-			if (extPath != null){
-				String ext = extPath.getFileExtension();
-				if (ext != null && !ext.equals("")) //$NON-NLS-1$
-					return ext;
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/CMUtil.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/CMUtil.java
deleted file mode 100644
index b31f609..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/CMUtil.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.tld;
-
-import java.util.Iterator;
-
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jst.jsp.core.internal.contentmodel.TaglibController;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TLDCMDocumentManager;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TaglibTracker;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-import org.eclipse.wst.html.core.internal.contentmodel.HTMLElementDeclaration;
-import org.eclipse.wst.html.core.internal.provisional.HTMLCMProperties;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMNodeWrapper;
-import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapter;
-import org.w3c.dom.Element;
-
-/**
- * Utility class to content model related information.
- * 
- * @author mengbo
- */
-public final class CMUtil {
-	/**
-	 * If the element is a custom tag, get the URI of it. If the element is a
-	 * standard JSP tag, return null. If is not jsp tag, then return null
-	 * @param decl
-     *  
-	 * @return the tag uri as a string
-	 */
-	public static String getTagURI(CMElementDeclaration decl) {
-		if (decl instanceof CMNodeWrapper) {
-			decl = (CMElementDeclaration) ((CMNodeWrapper) decl)
-					.getOriginNode();
-		}
-		if (decl instanceof TLDElementDeclaration) {
-			CMDocument doc = ((TLDElementDeclaration) decl).getOwnerDocument();
-			if (doc instanceof TLDDocument) {
-				return ((TLDDocument) doc).getUri();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Test whether this is the JSP core tag.
-	 * 
-	 * @param decl
-	 * @return true if decl is a jsp element declaration
-	 */
-	public static boolean isJSP(CMElementDeclaration decl) {
-		if (!decl.supports(HTMLCMProperties.IS_JSP)) {
-			return false;
-		}
-		Boolean b = (Boolean) decl.getProperty(HTMLCMProperties.IS_JSP);
-		return b.booleanValue();
-	}
-
-	/**
-	 * @param decl
-	 * @return true if the element declartion is a non-JSP html element
-	 */
-	public static boolean isHTML(CMElementDeclaration decl) {
-		if (!isJSP(decl) && (decl instanceof HTMLElementDeclaration)) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * get element declaration of specified element
-	 * 
-	 * @param element
-	 * @return null if can't get it.
-	 */
-	public static CMElementDeclaration getElementDeclaration(Element element) {
-		if (element == null) {
-			return null;
-		}
-		INodeNotifier notifier = (INodeNotifier) element.getOwnerDocument();
-		if (notifier == null) {
-			return null;
-		}
-		ModelQueryAdapter mqa = (ModelQueryAdapter) notifier
-				.getAdapterFor(ModelQueryAdapter.class);
-		if (mqa == null) {
-			return null;
-		}
-		return mqa.getModelQuery().getCMElementDeclaration(element);
-	}
-
-	/**
-	 * @param element
-	 * @return the TLDElementDeclaration for element or null if not found
-	 */
-	public static TLDElementDeclaration getTLDElementDeclaration(Element element) {
-		CMNode decl = getElementDeclaration(element);
-		if (decl instanceof CMNodeWrapper) {
-			decl = ((CMNodeWrapper) decl).getOriginNode();
-		}
-		if (decl instanceof TLDElementDeclaration) {
-			return (TLDElementDeclaration) decl;
-		}
-        return null;
-	}
-	
-	/**
-	 * !!! NOTE: this function is intended to work around the problem that if your element
-	 * has not yet been added to an  IDOMModel, getElementDeclaration won't be able to find
-	 * it.  This method does nothing (unlike the ModelQuery-based approach in getElementDeclaration)
-	 * to ensure that the namespace "uri" provided is valid in the structured document provided.  It is
-	 * therefore only advisable to use this method in cases where your node is not already a member of a 
-	 * IDOMModel.
-	 * 
-	 * @param uri
-	 * @param elementName
-	 * @param document 
-	 * @return the TLDElementDeclaration for this required tag or null if there  is nothing appropriate
-	 */
-	public static CMElementDeclaration getTLDElementDeclaration(final String uri, final String elementName, IDocument document)
-	{
-	    TLDCMDocumentManager tldmgr = TaglibController.getTLDCMDocumentManager(document);
-	    
-	    if (tldmgr != null)
-	    {
-            for (Iterator it = tldmgr.getTaglibTrackers().iterator();it.hasNext();)
-            {
-                TaglibTracker  tracker = (TaglibTracker) it.next();
-                
-                if (tracker.getURI().equals(uri))
-                {
-                    return (CMElementDeclaration) tracker.getElements().getNamedItem(tracker.getPrefix()+":"+elementName);
-                }
-            }
-	    }
-        // fallthrough
-        return null;
-	}
-
-	/**
-	 * give an element, get its namespace URI.
-	 * 
-	 * @param element
-	 * @return the namespace URI
-	 */
-	public static String getElementNamespaceURI(Element element) {
-	    //System.out.printf("uri for %s is %s\n", element.toString(), element.getNamespaceURI());
-
-	    CMElementDeclaration decl = getElementDeclaration(element);
-		if (decl == null) {
-		    
-		    // if the content model has nothing, see if the element 
-		    // itself has an xml namespace
-		    // TODO: should only apply this if the source document
-		    // is a valid XML doc?
-		    final String uri = element.getNamespaceURI();
-		    
-		    // may be null which the default state
-			return uri;
-		}
-
-		if (isJSP(decl)) {
-			return ITLDConstants.URI_JSP;
-		} else if (isHTML(decl)) {
-			return ITLDConstants.URI_HTML;
-		}
-
-		return getTagURI(decl);
-	}
-
-	/**
-	 * @param element
-	 * @return true if the element can have children
-	 */
-	public static boolean canHaveDirectTextChild(Element element) {
-		CMElementDeclaration decl = getElementDeclaration(element);
-		if (decl == null) {
-			return true;
-		}
-		int contentType = decl.getContentType();
-		return contentType != CMElementDeclaration.ELEMENT
-				&& contentType != CMElementDeclaration.EMPTY;
-
-	}
-    
-    private CMUtil()
-    {
-        // util class, no external instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/DocumentTagIdentifier.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/DocumentTagIdentifier.java
deleted file mode 100644
index 1af913f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/DocumentTagIdentifier.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.tld;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.w3c.dom.Element;
-
-/**
- * A tag wrapper for a DOM element.  This element may or may not be a JSP tag,
- * but must be contained in a DOM tree.
- * 
- * @author cbateman
- *
- */
-/*package*/ class DocumentTagIdentifier extends TagIdentifier 
-{
-    private final Element  _element;
-    
-    /**
-     * @param element
-     */
-    public DocumentTagIdentifier(Element element)
-    {
-        _element = element;
-    }
-    
-    public String getTagName() 
-    {
-        return _element.getLocalName();
-    }
-
-    public String getUri() {
-        String uri = CMUtil.getElementNamespaceURI(_element);
-        
-        // give the content model priority
-        if (uri == null)
-        {
-            uri = _element.getNamespaceURI();
-        }
-        
-        return uri;
-    }
-
-    public boolean isJSPTag() {
-        CMElementDeclaration elemDecl = getElementDeclaration();
-        
-        if (elemDecl != null)
-        {
-            return CMUtil.isJSP(elemDecl);
-        }
-        
-        return false;
-    }
-
-    /**
-     * @return the element declaration for this tag
-     */
-    protected final CMElementDeclaration getElementDeclaration()
-    {
-        return CMUtil.getElementDeclaration(_element);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/IJSFConstants.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/IJSFConstants.java
deleted file mode 100644
index 334a49b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/IJSFConstants.java
+++ /dev/null
@@ -1,951 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.tld;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-
-/**
- * Constants covering the JSF Core and JSF HTML tag and tag attribute names
- */
-public interface IJSFConstants 
-{
-
-	/**
-	 * actionListener tagname
-	 */
-	final static public String TAG_ACTIONLISTENER = "actionListener";
-
-	/**
-	 * attribute tagname
-	 */
-	final static public String TAG_ATTRIBUTE = "attribute";
-
-	/**
-	 * convertDateTime tagname
-	 */
-	final static public String TAG_CONVERTDATETIME = "convertDateTime";
-
-	/**
-	 * converter tagname
-	 */
-	final static public String TAG_CONVERTER = "converter";
-
-	/**
-	 * convertNumber tagname
-	 */
-	final static public String TAG_CONVERTNUMBER = "convertNumber";
-
-	/**
-	 * facet tagname
-	 */
-	final static public String TAG_FACET = "facet";
-
-	/**
-	 * loadBundle tagname
-	 */
-	final static public String TAG_LOADBUNDLE = "loadBundle";
-
-	/**
-	 * param tagname
-	 */
-	final static public String TAG_PARAM = "param";
-
-	/**
-	 * selectItem tagname
-	 */
-	final static public String TAG_SELECTITEM = "selectItem";
-
-	/**
-	 * selectItems tagname
-	 */
-	final static public String TAG_SELECTITEMS = "selectItems";
-
-	/**
-	 * subview tagname
-	 */
-	final static public String TAG_SUBVIEW = "subview";
-
-	/**
-	 * validateDoubleRange tagname
-	 */
-	final static public String TAG_VALIDATEDOUBLERANGE = "validateDoubleRange";
-
-	/**
-	 * validateLength tagname
-	 */
-	final static public String TAG_VALIDATELENGTH = "validateLength";
-
-	/**
-	 * validateLongRange tagname
-	 */
-	final static public String TAG_VALIDATELONGRANGE = "validateLongRange";
-
-	/**
-	 * validator tagname
-	 */
-	final static public String TAG_VALIDATOR = "validator";
-
-	/**
-	 * valueChangeListener tagname
-	 */
-	final static public String TAG_VALUECHANGELISTENER = "valueChangeListener";
-
-	/**
-	 * verbatim tagname
-	 */
-	final static public String TAG_VERBATIM = "verbatim";
-
-	/**
-	 * view tagname
-	 */
-	final static public String TAG_VIEW = "view";
-
-	/**
-	 * column tagname
-	 */
-	final static public String TAG_COLUMN = "column";
-
-	/**
-	 * commandButton tagname
-	 */
-	final static public String TAG_COMMANDBUTTON = "commandButton";
-
-	/**
-	 * commandLink tagname
-	 */
-	final static public String TAG_COMMANDLINK = "commandLink";
-
-	/**
-	 * dataTable tagname
-	 */
-	final static public String TAG_DATATABLE = "dataTable";
-
-	/**
-	 * form tagname
-	 */
-	final static public String TAG_FORM = "form";
-
-	/**
-	 * graphicImage tagname
-	 */
-	final static public String TAG_GRAPHICIMAGE = "graphicImage";
-
-	/**
-	 * inputHidden tagname
-	 */
-	final static public String TAG_INPUTHIDDEN = "inputHidden";
-
-	/**
-	 * inputSecret tagname
-	 */
-	final static public String TAG_INPUTSECRET = "inputSecret";
-
-	/**
-	 * inputText tagname
-	 */
-	final static public String TAG_INPUTTEXT = "inputText";
-
-	/**
-	 * inputTextarea tagname
-	 */
-	final static public String TAG_INPUTTEXTAREA = "inputTextarea";
-
-	/**
-	 * message tagname
-	 */
-	final static public String TAG_MESSAGE = "message";
-
-	/**
-	 * messages tagname
-	 */
-	final static public String TAG_MESSAGES = "messages";
-
-	/**
-	 * outputFormat tagname
-	 */
-	final static public String TAG_OUTPUTFORMAT = "outputFormat";
-
-	/**
-	 * outputLabel tagname
-	 */
-	final static public String TAG_OUTPUTLABEL = "outputLabel";
-
-	/**
-	 * outputLink tagname
-	 */
-	final static public String TAG_OUTPUTLINK = "outputLink";
-
-	/**
-	 * outputText tagname
-	 */
-	final static public String TAG_OUTPUTTEXT = "outputText";
-
-	/**
-	 * panelGrid tagname
-	 */
-	final static public String TAG_PANELGRID = "panelGrid";
-
-	/**
-	 * panelGroup tagname
-	 */
-	final static public String TAG_PANELGROUP = "panelGroup";
-
-	/**
-	 * selectBooleanCheckbox tagname
-	 */
-	final static public String TAG_SELECTBOOLEANCHECKBOX = "selectBooleanCheckbox";
-
-	/**
-	 * selectManyCheckbox tagname
-	 */
-	final static public String TAG_SELECTMANYCHECKBOX = "selectManyCheckbox";
-
-	/**
-	 * selectManyListbox tagname
-	 */
-	final static public String TAG_SELECTMANYLISTBOX = "selectManyListbox";
-
-	/**
-	 * selectManyMenu tagname
-	 */
-	final static public String TAG_SELECTMANYMENU = "selectManyMenu";
-
-	/**
-	 * selectOneListbox tagname
-	 */
-	final static public String TAG_SELECTONELISTBOX = "selectOneListbox";
-
-	/**
-	 * selectOneMenu tagname
-	 */
-	final static public String TAG_SELECTONEMENU = "selectOneMenu";
-
-	/**
-	 * selectOneMenu tagname
-	 */
-	final static public String TAG_SELECTONERADIO = "selectOneRadio";
-
-    // tag identifiers
-    /**
-     * TagIdentifier for TAG_VIEW
-     */
-    final static TagIdentifier TAG_IDENTIFIER_VIEW =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_VIEW);
-
-    /**
-     * TagIdentifier for TAG_LOADBUNDLE
-     */
-    final static TagIdentifier TAG_IDENTIFIER_LOADBUNDLE =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_LOADBUNDLE);
-
-    /**
-     * TagIdentifier for TAG_FACET
-     */
-    final static TagIdentifier TAG_IDENTIFIER_FACET =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_FACET);
-    
-    /**
-     * TagIdentifier for TAG_VERBATIM
-     */
-    final static TagIdentifier TAG_IDENTIFIER_VERBATIM =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_VERBATIM);
-    
-    /**
-     * TagIdentifier for TAG_DATATABLE
-     */
-    final static TagIdentifier TAG_IDENTIFIER_DATA_TABLE = 
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_DATATABLE);
-
-    /**
-     * TagIdentifier for TAG_PANELGRID
-     */
-    final static TagIdentifier TAG_IDENTIFIER_PANEL_GRID =
-       TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_PANELGRID);
-
-    /**
-     * TagIdentifier for TAG_COLUMN
-     */
-    final static TagIdentifier TAG_IDENTIFIER_COLUMN =
-       TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_COLUMN);
-
-    /**
-     * TagIdentifier for TAG_FORM
-     */
-    final static TagIdentifier TAG_IDENTIFIER_FORM =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_FORM);
-
-    /**
-     * TagIdentifier for TAG_INPUTTEXT
-     */
-    final static TagIdentifier TAG_IDENTIFIER_INPUTTEXT =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_INPUTTEXT);
-    
-    /**
-     * TagIdentifier for TAG_INPUTSECRET
-     */
-    final static TagIdentifier TAG_IDENTIFIER_INPUTSECRET =
-    	TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_INPUTSECRET);
-
-    /**
-     * TagIdentifier for TAG_INPUTTEXTAREA
-     */
-    final static TagIdentifier TAG_IDENTIFIER_INPUTTEXTAREA =
-    	TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_INPUTTEXTAREA);
-
-    /**
-     * TagIdentifier for TAG_OUTPUTTEXT
-     */
-    final static TagIdentifier TAG_IDENTIFIER_OUTPUTTEXT =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_OUTPUTTEXT);
-    
-    /**
-     * TagIdentifier for TAG_OUTPUTLABEL
-     */
-    final static TagIdentifier TAG_IDENTIFIER_OUTPUTLABEL =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_OUTPUTLABEL);
-    
-    /**
-     * TagIdentifier for TAG_GRAPHICIMAGE
-     */
-    final static TagIdentifier TAG_IDENTIFIER_GRAPHICIMAGE =
-    	TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_GRAPHICIMAGE);
-
-    /**
-     * TagIdentifier for TAG_COMMANDBUTTON
-     */
-    final static TagIdentifier TAG_IDENTIFIER_COMMANDBUTTON =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_COMMANDBUTTON);
-
-    /**
-     * TagIdentifier for TAG_COMMANDLINK
-     */
-    final static TagIdentifier TAG_IDENTIFIER_COMMANDLINK =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_COMMANDLINK);
-
-    /**
-     * TagIdentifier for TAG_INPUTHIDDEN
-     */
-    final static TagIdentifier TAG_IDENTIFIER_INPUTHIDDEN =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_INPUTHIDDEN);
-
-    /**
-     * TagIdentifier for TAG_MESSAGE
-     */
-    final static TagIdentifier TAG_IDENTIFIER_MESSAGE =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_MESSAGE);
-
-    /**
-     * TagIdentifier for TAG_MESSAGES
-     */
-    final static  TagIdentifier TAG_IDENTIFIER_MESSAGES =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_MESSAGES);
-
-    /**
-     * TagIdentifier for TAG_OUTPUTFORMAT
-     */
-    final static TagIdentifier TAG_IDENTIFIER_OUTPUTFORMAT =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_OUTPUTFORMAT);
-
-    /**
-     * TagIdentifier for TAG_PANELGROUP
-     */
-    final static TagIdentifier TAG_IDENTIFIER_PANEL_GROUP =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_PANELGROUP);
-
-    /**
-     * TagIdentifier for TAG_SELECTBOOLEANCHECKBOX
-     */
-    final static TagIdentifier TAG_IDENTIFIER_SELECTBOOLEANCHECKBOX = 
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_SELECTBOOLEANCHECKBOX);
-
-    /**
-     * TagIdentifier for TAG_SELECTMANYCHECKBOX
-     */
-    final static TagIdentifier TAG_IDENTIFIER_SELECTMANYCHECKBOX = 
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_SELECTMANYCHECKBOX);
-
-    /**
-     * TagIdentifier for TAG_SELECTMANYLISTBOX
-     */
-    final static TagIdentifier TAG_IDENTIFIER_SELECTMANYLISTBOX = 
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_SELECTMANYLISTBOX);
-
-    /**
-     * TagIdentifier for TAG_SELECTMANYMENU
-     */
-    final static  TagIdentifier TAG_IDENTIFIER_SELECTMANYMENU =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_SELECTMANYMENU);
-
-    /**
-     * TagIdentifier for TAG_SELECTONELISTBOX
-     */
-    final static TagIdentifier TAG_IDENTIFIER_SELECTONELISTBOX =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_SELECTONELISTBOX);
-    
-    /**
-     * TagIdentifier for TAG_SELECTONEMENU
-     */
-    final static TagIdentifier TAG_IDENTIFIER_SELECTONEMENU =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_SELECTONEMENU);
-
-    /**
-     * TagIdentifier for TAG_SELECTONERADIO
-     */
-    final static TagIdentifier TAG_IDENTIFIER_SELECTONERADIO =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_HTML, TAG_SELECTONERADIO);
-
-    /**
-     * TagIdentifier for TAG_ACTIONLISTENER
-     */
-    final static TagIdentifier TAG_IDENTIFIER_ACTIONLISTENER = 
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_ACTIONLISTENER);
-
-    /**
-     * TagIdentifier for TAG_ATTRIBUTE
-     */
-    final static TagIdentifier TAG_IDENTIFIER_ATTRIBUTE = 
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_ATTRIBUTE);
-
-    /**
-     * TagIdentifier for TAG_CONVERTDATETIME
-     */
-    final static TagIdentifier TAG_IDENTIFIER_CONVERTDATETIME = 
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_CONVERTDATETIME);
-
-    /**
-     * TagIdentifier for TAG_CONVERTNUMBER
-     */
-    final static TagIdentifier TAG_IDENTIFIER_CONVERTNUMBER = 
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_CONVERTNUMBER);
-
-    /**
-     * TagIdentifier for TAG_CONVERTER
-     */
-    final static TagIdentifier TAG_IDENTIFIER_CONVERTER = 
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_CONVERTER);
-
-    /**
-     * TagIdentifier for TAG_PARAM
-     */
-    final static TagIdentifier TAG_IDENTIFIER_PARAM =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_PARAM);
-
-    /**
-     * TagIdentifier for TAG_SELECTITEM
-     */
-    final static TagIdentifier TAG_IDENTIFIER_SELECTITEM = 
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_SELECTITEM);
-
-    /**
-     * TagIdentifier for TAG_SELECTITEMS
-     */
-    final static TagIdentifier TAG_IDENTIFIER_SELECTITEMS =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_SELECTITEMS);
-
-    /**
-     * TagIdentifier for TAG_SUBVIEW
-     */
-    final static TagIdentifier TAG_IDENTIFIER_SUBVIEW =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_SUBVIEW);
-
-    /**
-     * TagIdentifier for TAG_VALIDATEDOUBLERANGE
-     */
-    final static TagIdentifier TAG_IDENTIFIER_VALIDATEDOUBLERANGE =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_VALIDATEDOUBLERANGE);
-
-    /**
-     * TagIdentifier for TAG_VALIDATELENGTH
-     */
-    final static TagIdentifier TAG_IDENTIFIER_VALIDATELENGTH =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_VALIDATELENGTH);
-
-    /**
-     * TagIdentifier for TAG_VALIDATELONGRANGE
-     */
-    final static TagIdentifier TAG_IDENTIFIER_VALIDATELONGRANGE =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_VALIDATELONGRANGE);
-
-    /**
-     * TagIdentifier for TAG_VALIDATOR
-     */
-    final static TagIdentifier TAG_IDENTIFIER_VALIDATOR =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_VALIDATOR);
-
-    /**
-     * TagIdentifier for TAG_VALUECHANGELISTENER
-     */
-    final static TagIdentifier TAG_IDENTIFIER_VALUECHANGELISTENER = 
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSF_CORE, TAG_VALUECHANGELISTENER);
-
-    // attribute names
-	/**
-	 * accept tag attribute name
-	 */
-	final static public String ATTR_ACCEPT = "accept";
-
-	/**
-	 * acceptcharset tag attribute name
-	 */
-	final static public String ATTR_ACCEPTCHARSET = "acceptcharset";
-
-	/**
-	 * accesskey tag attribute name
-	 */
-	final static public String ATTR_ACCESSKEY = "accesskey";
-
-	/**
-	 * action tag attribute name
-	 */
-	final static public String ATTR_ACTION = "action";
-
-	/**
-	 * actionListener tag attribute name
-	 */
-	final static public String ATTR_ACTIONLISTENER = "actionListener";
-
-	/**
-	 * alt tag attribute name
-	 */
-	final static public String ATTR_ALT = "alt";
-
-	/**
-	 * basename tag attribute name
-	 */
-	final static public String ATTR_BASENAME = "basename";
-
-	/**
-	 * bgcolor tag attribute name
-	 */
-	final static public String ATTR_BGCOLOR = "bgcolor";
-
-	/**
-	 * binding tag attribute name
-	 */
-	final static public String ATTR_BINDING = "binding";
-
-	/**
-	 * border tag attribute name
-	 */
-	final static public String ATTR_BORDER = "border";
-
-	/**
-	 * cellpadding tag attribute name
-	 */
-	final static public String ATTR_CELLPADDING = "cellpadding";
-
-	/**
-	 * cellspacing tag attribute name
-	 */
-	final static public String ATTR_CELLSPACING = "cellspacing";
-
-	/**
-	 * charset tag attribute name
-	 */
-	final static public String ATTR_CHARSET = "charset";
-
-	/**
-	 * cols tag attribute name
-	 */
-	final static public String ATTR_COLS = "cols";
-
-	/**
-	 * columnClasses tag attribute name
-	 */
-	final static public String ATTR_COLUMNCLASSES = "columnClasses";
-
-	/**
-	 * columns tag attribute name
-	 */
-	final static public String ATTR_COLUMNS = "columns";
-
-	/**
-	 * converterId tag attribute name
-	 */
-	final static public String ATTR_CONVERTERID = "converterId";
-
-	/**
-	 * coords tag attribute name
-	 */
-	final static public String ATTR_COORDS = "coords";
-
-	/**
-	 * currencyCode tag attribute name
-	 */
-	final static public String ATTR_CURRENCYCODE = "currencyCode";
-
-	/**
-	 * currencySymbol tag attribute name
-	 */
-	final static public String ATTR_CURRENCYSYMBOL = "currencySymbol";
-
-	/**
-	 * dateStyle tag attribute name
-	 */
-	final static public String ATTR_DATESTYLE = "dateStyle";
-
-	/**
-	 * dir tag attribute name
-	 */
-	final static public String ATTR_DIR = "dir";
-
-	/**
-	 * disabled tag attribute name
-	 */
-	final static public String ATTR_DISABLED = "disabled";
-
-	/**
-	 * errorClass tag attribute name
-	 */
-	final static public String ATTR_ERRORCLASS = "errorClass";
-
-	/**
-	 * errorStyle tag attribute name
-	 */
-	final static public String ATTR_ERRORSTYLE = "errorStyle";
-
-	/**
-	 * escape tag attribute name
-	 */
-	final static public String ATTR_ESCAPE = "escape";
-
-	/**
-	 * fatalClass tag attribute name
-	 */
-	final static public String ATTR_FATALCLASS = "fatalClass";
-
-	/**
-	 * fatalStyle tag attribute name
-	 */
-	final static public String ATTR_FATALSTYLE = "fatalStyle";
-
-	/**
-	 * first tag attribute name
-	 */
-	final static public String ATTR_FIRST = "first";
-
-	/**
-	 * footerClass tag attribute name
-	 */
-	final static public String ATTR_FOOTERCLASS = "footerClass";
-
-	/**
-	 * for tag attribute name
-	 */
-	final static public String ATTR_FOR = "for";
-
-	/**
-	 * frame tag attribute name
-	 */
-	final static public String ATTR_FRAME = "frame";
-
-	/**
-	 * globalOnly tag attribute name
-	 */
-	final static public String ATTR_GLOBEONLY = "globalOnly";
-
-	/**
-	 * headerClass tag attribute name
-	 */
-	final static public String ATTR_HEADERCLASS = "headerClass";
-
-	/**
-	 * hreflang tag attribute name
-	 */
-	final static public String ATTR_HREFLANG = "hreflang";
-
-	/**
-	 * id tag attribute name
-	 */
-	final static public String ATTR_ID = "id";
-
-	/**
-	 * image tag attribute name
-	 */
-	final static public String ATTR_IMAGE = "image";
-
-	/**
-	 * immediate tag attribute name
-	 */
-	final static public String ATTR_IMMEDIATE = "immediate";
-
-	/**
-	 * infoClass tag attribute name
-	 */
-	final static public String ATTR_INFOCLASS = "infoClass";
-
-	/**
-	 * infoStyle tag attribute name
-	 */
-	final static public String ATTR_INFOSTYLE = "infoStyle";
-
-	/**
-	 * itemDescription tag attribute name
-	 */
-	final static public String ATTR_ITEMDESCRIPTION = "itemDescription";
-
-	/**
-	 * itemDisabled tag attribute name
-	 */
-	final static public String ATTR_ITEMDISABLED = "itemDisabled";
-
-	/**
-	 * itemLabel tag attribute name
-	 */
-	final static public String ATTR_ITEMLABEL = "itemLabel";
-
-	/**
-	 * itemValue tag attribute name
-	 */
-	final static public String ATTR_ITEMVALUE = "itemValue";
-
-	/**
-	 * lang tag attribute name
-	 */
-	final static public String ATTR_LANG = "lang";
-
-	/**
-	 * layout tag attribute name
-	 */
-	final static public String ATTR_LAYOUT = "layout";
-
-	/**
-	 * locale tag attribute name
-	 */
-	final static public String ATTR_LOCALE = "locale";
-
-	/**
-	 * maximum tag attribute name
-	 */
-	final static public String ATTR_MAXIMUM = "maximum";
-
-	/**
-	 * minimum tag attribute name
-	 */
-	final static public String ATTR_MINIMUM = "minimum";
-
-	/**
-	 * name tag attribute name
-	 */
-	final static public String ATTR_NAME = "name";
-
-	/**
-	 * onblur tag attribute name
-	 */
-	final static public String ATTR_ONBLUR = "onblur";
-
-	/**
-	 * onchange tag attribute name
-	 */
-	final static public String ATTR_ONCHANGE = "onchange";
-
-	/**
-	 * onclick tag attribute name
-	 */
-	final static public String ATTR_ONCLICK = "onclick";
-
-	/**
-	 * ondblclick tag attribute name
-	 */
-	final static public String ATTR_ONDBLCLICK = "ondblclick";
-
-	/**
-	 * onfocus tag attribute name
-	 */
-	final static public String ATTR_ONFOCUS = "onfocus";
-
-	/**
-	 * onkeydown tag attribute name
-	 */
-	final static public String ATTR_ONKEYDOWN = "onkeydown";
-
-	/**
-	 * onkeypress tag attribute name
-	 */
-	final static public String ATTR_ONKEYPRESS = "onkeypress";
-
-	/**
-	 * onkeyup tag attribute name
-	 */
-	final static public String ATTR_ONKEYUP = "onkeyup";
-
-	/**
-	 * onmousedown tag attribute name
-	 */
-	final static public String ATTR_ONMOUSEDOWN = "onmousedown";
-
-	/**
-	 * onmousemove tag attribute name
-	 */
-	final static public String ATTR_ONMOUSEMOVE = "onmousemove";
-
-	/**
-	 * onmouseout tag attribute name
-	 */
-	final static public String ATTR_ONMOUSEOUT = "onmouseout";
-
-	/**
-	 * onmouseover tag attribute name
-	 */
-	final static public String ATTR_ONMOUSEOVER = "onmouseover";
-
-	/**
-	 * onmouseup tag attribute name
-	 */
-	final static public String ATTR_ONMOUSEUP = "onmouseup";
-
-	/**
-	 * onselect tag attribute name
-	 */
-	final static public String ATTR_ONSELECT = "onselect";
-
-	/**
-	 * pattern tag attribute name
-	 */
-	final static public String ATTR_PATTERN = "pattern";
-
-	/**
-	 * readonly tag attribute name
-	 */
-	final static public String ATTR_READONLY = "readonly";
-
-	/**
-	 * rel tag attribute name
-	 */
-	final static public String ATTR_REL = "rel";
-
-	/**
-	 * rendered tag attribute name
-	 */
-	final static public String ATTR_RENDERED = "rendered";
-
-	/**
-	 * rev tag attribute name
-	 */
-	final static public String ATTR_REV = "rev";
-
-	/**
-	 * rowClasses tag attribute name
-	 */
-	final static public String ATTR_ROWCLASSES = "rowClasses";
-
-	/**
-	 * rows tag attribute name
-	 */
-	final static public String ATTR_ROWS = "rows";
-
-	/**
-	 * rules tag attribute name
-	 */
-	final static public String ATTR_RULES = "rules";
-
-	/**
-	 * shape tag attribute name
-	 */
-	final static public String ATTR_SHAPE = "shape";
-
-	/**
-	 *  showDetail tag attribute name
-	 */
-	final static public String ATTR_SHOWDETAIL = "showDetail";
-
-	/**
-	 * showSummary tag attribute name
-	 */
-	final static public String ATTR_SHOWSUMMARY = "showSummary";
-
-	/**
-	 * size tag attribute name
-	 */
-	final static public String ATTR_SIZE = "size";
-
-	/**
-	 * style tag attribute name
-	 */
-	final static public String ATTR_STYLE = "style";
-
-	/**
-	 * styleClass tag attribute name
-	 */
-	final static public String ATTR_STYLECLASS = "styleClass";
-
-	/**
-	 * summary tag attribute name
-	 */
-	final static public String ATTR_SUMMARY = "summary";
-
-	/**
-	 * tabindex tag attribute name
-	 */
-	final static public String ATTR_TABINDEX = "tabindex";
-
-	/**
-	 * target tag attribute name
-	 */
-	final static public String ATTR_TARGET = "target";
-
-	/**
-	 * timeStyle tag attribute name
-	 */
-	final static public String ATTR_TIMESTYLE = "timeStyle";
-
-	/**
-	 * title tag attribute name
-	 */
-	final static public String ATTR_TITLE = "title";
-
-	/**
-	 * tooltip tag attribute name
-	 */
-	final static public String ATTR_TOOLTIP = "tooltip";
-
-	/**
-	 * type tag attribute name
-	 */
-	final static public String ATTR_TYPE = "type";
-
-	/**
-	 * url tag attribute name
-	 */
-	final static public String ATTR_URL = "url";
-
-	/**
-	 * validatorId tag attribute name
-	 */
-	final static public String ATTR_VALIDATORID = "validatorId";
-
-	/**
-	 * value tag attribute name
-	 */
-	final static public String ATTR_VALUE = "value";
-
-	/**
-	 * var tag attribute name
-	 */
-	final static public String ATTR_VAR = "var";
-
-	/**
-	 * warnClass tag attribute name
-	 */
-	final static public String ATTR_WARNCLASS = "warnClass";
-
-	/**
-	 * warnStyle tag attribute name
-	 */
-	final static public String ATTR_WARNSTYLE = "warnStyle";
-
-	/**
-	 * width tag attribute name
-	 */
-	final static public String ATTR_WIDTH = "width";
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/ITLDConstants.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/ITLDConstants.java
deleted file mode 100644
index 3ec16f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/ITLDConstants.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.tld;
-
-/**
- * Global tag library constants
- * 
- * @author cbateman
- *
- */
-public interface ITLDConstants {
-
-    /**
-     * The JSF core (f) component URI
-     */
-    public static final String URI_JSF_CORE = "http://java.sun.com/jsf/core"; //$NON-NLS-1$
-    /**
-     * The JSF html (h) component URI
-     */
-    public static final String URI_JSF_HTML = "http://java.sun.com/jsf/html"; //$NON-NLS-1$
-    /**
-     * The last component of the html uri
-     */
-    public static final String URI_HTML = "html"; //$NON-NLS-1$
-    /**
-     * The last component of the core uri
-     */
-    public static final String URI_JSP = "jsp"; //$NON-NLS-1$
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/JSPTagIdentifier.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/JSPTagIdentifier.java
deleted file mode 100644
index 8546c38..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/JSPTagIdentifier.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.tld;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-
-/**
- * A tag wrapper for a JSP tag.
- * 
- * @author cbateman
- *
- */
-/*package*/ class JSPTagIdentifier extends TagIdentifier 
-{
-    private final String _uri;
-    private final String _tagName;
-    
-    /**
-     * @param uri
-     * @param tagName
-     */
-    public JSPTagIdentifier(final String uri, final String tagName)
-    {
-        _uri = uri;
-        _tagName = tagName;
-    }
-    public String getTagName() {
-        return _tagName;
-    }
-
-    public String getUri() {
-        return _uri;
-    }
-
-    public boolean isJSPTag() {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/LoadBundleUtil.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/LoadBundleUtil.java
deleted file mode 100644
index daf4e7a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/LoadBundleUtil.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.tld;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-
-/**
- * @author mengbo
- */
-public class LoadBundleUtil {
-
-	private LoadBundleUtil() {
-	    // no external instantiation
-	}
-
-
-	/**
-	 * @param project
-	 * @param baseName
-	 * @return an IStorage pointing to the request bundle or null if not found
-	 * @throws CoreException if the search for the file encounters a problem
-	 */
-	public static IStorage getLoadBundleResource(final IProject project,
-			final String baseName) throws CoreException {
-		if (project == null || baseName == null) {
-			return null;
-		}
-		IStorage loadBundleResource = null;
-		if (project.hasNature(JavaCore.NATURE_ID)) {
-			IJavaProject javaProject = JavaCore.create(project);
-			IFile sourceFile = getSourceFile(javaProject, baseName);
-			if (sourceFile == null || !sourceFile.exists()) {
-				loadBundleResource = getJarFile(javaProject, baseName);
-			} else {
-				loadBundleResource = sourceFile;
-			}
-		}
-
-		return loadBundleResource;
-	}
-
-	private static IFile getSourceFile(IJavaProject javaProject, String baseName)
-			throws JavaModelException {
-		IClasspathEntry[] classpathEntries = javaProject.getRawClasspath();
-		for (int i = 0; i < classpathEntries.length; i++) {
-			if (classpathEntries[i].getEntryKind() == IClasspathEntry.CPE_SOURCE) {
-				IPath path = classpathEntries[i].getPath().append(
-						getFilePath(baseName)).removeFirstSegments(1);
-				path = javaProject.getProject().getFullPath().append(path);
-				IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(
-						path);
-				if (file.exists()) {
-					return file;
-				}
-			}
-		}
-		return null;
-	}
-
-	private static IPath getFilePath(String baseName) {
-		IPath path = new Path(baseName.replace('.', '/'));//$NON-NLS-1$
-		path = path.addFileExtension("properties");//$NON-NLS-1$
-		return path;
-	}
-
-	private static IStorage getJarFile(IJavaProject javaProject, String baseName)
-			throws JavaModelException {
-		IClasspathEntry[] roots = javaProject.getRawClasspath();
-		for (int i = 0; i < roots.length; i++) {
-			if (roots[i].getEntryKind() != IClasspathEntry.CPE_LIBRARY) {
-				continue;
-			}
-
-			IPackageFragmentRoot[] packageFragmentRoots = javaProject
-					.findPackageFragmentRoots(roots[i]);
-			for (int j = 0; j < packageFragmentRoots.length; j++) {
-				String packageName = getPackageName(baseName);
-				Object[] resources = null;
-				if (packageName.length() == 0) {
-					resources = packageFragmentRoots[j].getNonJavaResources();
-				} else {
-					IPackageFragment fragment = packageFragmentRoots[j]
-							.getPackageFragment(getPackageName(baseName));
-					if (fragment != null && fragment.exists()) {
-						resources = fragment.getNonJavaResources();
-					}
-				}
-
-				if (resources != null && resources.length > 0) {
-					for (int k = 0; k < resources.length; k++) {
-						if (resources[k] instanceof IStorage) {
-							IStorage storage = (IStorage) resources[k];
-							if (getFileName(baseName).equalsIgnoreCase(
-									storage.getName())) {
-								return storage;
-							}
-						}
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	private static String getPackageName(String baseName) {
-		int index = baseName.lastIndexOf('.');//$NON-NLS-1$
-		if (index == -1) {
-			return "";//$NON-NLS-1$
-		}
-        return baseName.substring(0, index);
-	}
-
-	private static String getFileName(String baseName) {
-		int index = baseName.lastIndexOf('.');//$NON-NLS-1$
-		if (index == -1) {
-			return baseName + ".properties";
-		}
-        return baseName.substring(index + 1).concat(".properties");//$NON-NLS-1$
-	}
-
-    /**
-     * Encapsulates the hiearchy of bundle data sources in the hierarchy
-     * for a ResourceBundle base name.  In practice this is often simply
-     * a single IFile for a 
-     * @author cbateman
-     *
-     */
-//    public static class BundleHierarchy
-//    {
-//        // list in order from most specific (first queried) to least,
-//        // front to back
-//        //private final List        _hierarchy; 
-//    
-//        /**
-//         * Takes the list *by reference*.  Does not take a copy.
-//         * @param hierarchy
-//         */
-//        public BundleHierarchy(List hierarchy)
-//        {
-//            _hierarchy = hierarchy;
-//        }
-//        
-//        public BundleHierarchy()
-//        {
-//            _hierarchy = new ArrayList();
-//        }
-//    }
-    
-    /**
-     * Used to describe the design time approximation of the locale lookup precendence
-     * that will be used by ResourceBundle to find a localized resource bundle.
-     * 
-     * See the official JavaDoc for java.util.ResourceBundle.getBundle for docs on search
-     * order.  
-     * 
-     * @author cbateman
-     *
-     */
-    public static class LocaleDescriptor
-    {
-        private Locale            _locale;
-        private List              _possibleSuffices;
-        
-        /**
-         * @param language -- must not be null
-         */
-        public LocaleDescriptor(String language)
-        {
-            _locale = new Locale(language);
-        }
-        
-        /**
-         * All arguments must be non-null.  To set a language only descriptor,
-         * see others.
-         * 
-         * @param language -- must not be null
-         * @param country -- must not be null
-         */
-        public LocaleDescriptor(String language,
-                String country)
-        {
-            _locale = new Locale(language, country);
-        }
-        
-        /**
-         * All arguments must be non-null. Null arguments will cause an exception.
-         * To create descriptor without variant and/or country set, see other constructors
-         * @param language -- must not be null
-         * @param country -- must not be null
-         * @param variant -- must not be null
-         */
-        public LocaleDescriptor(String language,
-                String country, String variant) 
-        {
-            _locale = new Locale(language, country, variant);
-        }
-        
-        /**
-         * @param baseName
-         * @return an iterator through all possible bundle names starting with the most
-         * specific and becoming more general for base name based on this locale.
-         * 
-         * i.e. if baseName is "bundle" and the local is en_US_1 then in order the 
-         * iterator will produce:
-         * 
-         * bundle_en_US_1
-         * bundle_en_US
-         * bundle_en
-         * bundle
-         * 
-         * per the ResourceBundle API
-         * 
-         */
-        public Iterator getBundleNameIterator(final String baseName)
-        {
-            
-            return new Iterator()
-            {
-                final Iterator  it = getPossibleBaseNameSuffices().iterator();
-                
-                public boolean hasNext() {
-                   return it.hasNext();
-                }
-
-                public Object next() {
-                    return baseName+it.next(); 
-                }
-
-                public void remove() {
-                    // delegate; should throw exception
-                    it.remove();
-                }
-            };
-        }
-
-        private synchronized List getPossibleBaseNameSuffices()
-        {
-            if (_possibleSuffices == null)
-            {
-                List possibleSuffices = new ArrayList(3);
-
-                final String language = _locale.getLanguage();
-                final String country = _locale.getCountry();
-                final String variant = _locale.getVariant();
-
-                possibleSuffices.add("");
-                possibleSuffices.add("_"+language);
-                if (country != null)
-                {
-                    possibleSuffices.add(0, "_"+language + "_" + country);
-                    if (variant != null)
-                    {
-                        possibleSuffices.add(0, "_"+language+"_"+country+"_"+variant);
-                    }
-                }
-                _possibleSuffices = Collections.unmodifiableList(possibleSuffices);
-            }
-
-            return _possibleSuffices;
-       }
-
-        /**
-         * @return the local information as a standard locale object
-         */
-        public Locale getLocale()
-        {
-            return _locale;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/TagIdentifierFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/TagIdentifierFactory.java
deleted file mode 100644
index 0c8d702..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/tld/TagIdentifierFactory.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.internal.tld;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.w3c.dom.Element;
-
-/**
- * Factory creating tag identifiers
- * 
- * @author cbateman
- *
- */
-public final class TagIdentifierFactory 
-{
-    /**
-     * Create a tag identifier based on a uri and tagName
-     * 
-     * @param uri
-     * @param tagName
-     * @return a new tag identifier for (uri, tagName)
-     */
-    public static TagIdentifier createJSPTagWrapper(final String uri, final String tagName)
-    {
-        return new JSPTagIdentifier(uri, tagName);
-    }
-    
-    /**
-     * @param element
-     * @return a tag identifier based on a DOM element
-     */
-    public static TagIdentifier createDocumentTagWrapper(final Element element)
-    {
-        return new DocumentTagIdentifier(element);
-    }
-    
-    private TagIdentifierFactory()
-    {
-        // static class, no external instantiation
-    }
-}
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/AbstractJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/AbstractJSFAppConfigLocater.java
deleted file mode 100644
index 943fecb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/AbstractJSFAppConfigLocater.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-/**
- * Abstract implementation of {@link IJSFAppConfigLocater} that provides common
- * locater functionality. {@link IJSFAppConfigLocater} implementations should
- * extend this class or provide similar functionality.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class AbstractJSFAppConfigLocater implements IJSFAppConfigLocater {
-
-	/**
-	 * {@link JSFAppConfigManager} instance to which this locater belongs.
-	 */
-	protected JSFAppConfigManager manager = null;
-
-	/**
-	 * Set of known {@link IJSFAppConfigProvider} instances.
-	 */
-	protected Set configProviders = new LinkedHashSet();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigLocater#setJSFAppConfigManager(org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager)
-	 */
-	public void setJSFAppConfigManager(JSFAppConfigManager manager) {
-		this.manager = manager;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigLocater#getJSFAppConfigManager()
-	 */
-	public JSFAppConfigManager getJSFAppConfigManager() {
-		return manager;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigLocater#startLocating()
-	 */
-	public abstract void startLocating();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigLocater#stopLocating()
-	 */
-	public abstract void stopLocating();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigLocater#getJSFAppConfigProviders()
-	 */
-	public Set getJSFAppConfigProviders() {
-		return configProviders;
-	}
-
-	/**
-	 * Adds an {@link IJSFAppConfigProvider} instance to the set of known
-	 * instances and notifies {@link JSFAppConfigManager} instance of the
-	 * addition if successful.
-	 * 
-	 * @param configProvider {@link IJSFAppConfigProvider} instance to be
-	 * added.
-	 * @return true if instance was added, else false.
-	 */
-	protected boolean addConfigProvider(IJSFAppConfigProvider configProvider) {
-		boolean added = configProviders.add(configProvider);
-		if (added && manager != null) {
-			configProvider.setJSFAppConfigLocater(this);
-			manager.notifyJSFAppConfigProvidersChangeListeners(
-					configProvider,
-					JSFAppConfigProvidersChangeEvent.ADDED);
-		}
-		return added;
-	}
-
-	/**
-	 * Removes an {@link IJSFAppConfigProvider} instance from the set of known
-	 * instances and notifies {@link JSFAppConfigManager} instance of the
-	 * removal if successful.
-	 * 
-	 * @param configProvider {@link IJSFAppConfigProvider} instance to be
-	 * removed.
-	 * @return true if instance was removed, else false.
-	 */
-	protected boolean removeConfigProvider(IJSFAppConfigProvider configProvider) {
-		if (configProvider != null) {
-			configProvider.releaseFacesConfigModel();
-		}
-		boolean removed = configProviders.remove(configProvider);
-		if (removed && manager != null) {
-			manager.notifyJSFAppConfigProvidersChangeListeners(
-					configProvider,
-					JSFAppConfigProvidersChangeEvent.REMOVED);
-		}
-		return removed;
-	}
-
-	/**
-	 * Updates known set of {@link IJSFAppConfigProvider} instances by removing
-	 * instances that are in the existing set but not in the passed set and
-	 * adding instances that are in the passed set but not in the existing set.
-	 * Instances that are in both the existing set and the passed set are left
-	 * unchanged. The {@link JSFAppConfigManager} is notified of removals and
-	 * additions, and no notification is sent for instances that are left
-	 * unchanged.
-	 * 
-	 * @param newConfigProviders New set of {@link IJSFAppConfigProvider}
-	 * instances. 
-	 */
-	protected void updateConfigProviders(Set newConfigProviders) {
-		if (newConfigProviders != null) {
-			LinkedHashSet oldConfigProviders = new LinkedHashSet();
-			//iterate over existing set
-			Iterator itConfigProviders = configProviders.iterator();
-			while (itConfigProviders.hasNext()) {
-				IJSFAppConfigProvider configProvider = (IJSFAppConfigProvider)itConfigProviders.next();
-				//remove provider from new set if it is already in existing set
-				if (!newConfigProviders.remove(configProvider)) {
-					//stage removal of existing provider that is not in new set
-					oldConfigProviders.add(configProvider);
-				}
-			}
-			//remove providers that are not in new set from existing set
-			Iterator itOldConfigProviders = oldConfigProviders.iterator();
-			while (itOldConfigProviders.hasNext()) {
-				IJSFAppConfigProvider configProvider = (IJSFAppConfigProvider)itOldConfigProviders.next();
-				//call removeConfigProvider(...) method so manager's listeners are notified
-				removeConfigProvider(configProvider);
-			}
-			//add providers that are still in new set to existing set
-			Iterator itNewConfigProviders = newConfigProviders.iterator();
-			while (itNewConfigProviders.hasNext()) {
-				IJSFAppConfigProvider configProvider = (IJSFAppConfigProvider)itNewConfigProviders.next();
-				//call addConfigProvider(...) method so manager's listeners are notified
-				addConfigProvider(configProvider);
-			}
-		}
-	}
-
-	/**
-	 * Removes all {@link IJSFAppConfigProvider} instances from the known set,
-	 * sending notification of all removals to the {@link JSFAppConfigManager}
-	 * instance.
-	 */
-	protected void removeAllConfigProviders() {
-		updateConfigProviders(Collections.EMPTY_SET);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#finalize()
-	 */
-	protected void finalize() {
-		removeAllConfigProviders();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/AbstractJSFAppConfigProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/AbstractJSFAppConfigProvider.java
deleted file mode 100644
index baaf9e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/AbstractJSFAppConfigProvider.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-
-/**
- * Abstract implementation of {@link IJSFAppConfigProvider} that provides
- * common provider functionality. {@link IJSFAppConfigProvider} instances
- * should extend this class or provide similar functionality.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class AbstractJSFAppConfigProvider implements IJSFAppConfigProvider {
-
-	/**
-	 * {@link IJSFAppConfigLocater} instance that located this instance.
-	 */
-	protected IJSFAppConfigLocater jsfAppConfigLocater = null;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvider#setJSFAppConfigLocater(org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigLocater)
-	 */
-	public void setJSFAppConfigLocater(IJSFAppConfigLocater locater) {
-		this.jsfAppConfigLocater = locater;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvider#getFacesConfigModel()
-	 */
-	public abstract FacesConfigType getFacesConfigModel();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvider#releaseFacesConfigModel()
-	 */
-	public abstract void releaseFacesConfigModel();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ArtifactEditJSFAppConfigProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ArtifactEditJSFAppConfigProvider.java
deleted file mode 100644
index f9f39e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ArtifactEditJSFAppConfigProvider.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.util.FacesConfigArtifactEdit;
-
-/**
- * ArtifactEditJSFAppConfigProvider uses FacesConfigArtifactEdit to provide
- * the root element of an application configuration model.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class ArtifactEditJSFAppConfigProvider extends AbstractJSFAppConfigProvider {
-
-	/**
-	 * IFile instance that represents an application configuration resource
-	 * file.
-	 */
-	protected IFile appConfigFile = null;
-
-	/**
-	 * FacesConfigArtifactEdit instance used to get the application
-	 * configuration model.
-	 */
-	protected FacesConfigArtifactEdit facesConfigArtifactEdit = null;
-
-	/**
-	 * Cached {@link FacesConfigType} instance.
-	 */
-	protected FacesConfigType facesConfig = null;
-
-	/**
-	 * Creates an instance, storing the passed IFile instance for subsequent
-	 * processing.
-	 * 
-	 * @param appConfigFile IFile instance that represents an application
-	 * configuration resource file
-	 */
-	public ArtifactEditJSFAppConfigProvider(IFile appConfigFile) {
-		this.appConfigFile = appConfigFile;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvider#getFacesConfigModel()
-	 */
-	public FacesConfigType getFacesConfigModel() {
-		if (facesConfig == null) {
-			if (appConfigFile != null) {
-				IProject project = appConfigFile.getProject();
-				IPath appConfigFilePath = JSFAppConfigUtils.getWebContentFolderRelativePath(appConfigFile);
-				if (appConfigFilePath != null) {
-					facesConfigArtifactEdit = FacesConfigArtifactEdit.getFacesConfigArtifactEditForRead(project, appConfigFilePath.toString());
-					if (facesConfigArtifactEdit != null) {
-						facesConfig = facesConfigArtifactEdit.getFacesConfig();
-						if (facesConfig != null) {
-							jsfAppConfigLocater.getJSFAppConfigManager().addFacesConfigChangeAdapter(facesConfig);
-						}
-					}
-				}
-			}
-		}
-		return facesConfig;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvider#releaseFacesConfigModel()
-	 */
-	public void releaseFacesConfigModel() {
-		jsfAppConfigLocater.getJSFAppConfigManager().removeFacesConfigChangeAdapter(facesConfig);
-		if (facesConfigArtifactEdit != null) {
-			facesConfigArtifactEdit.dispose();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object otherObject) {
-		boolean equals = false;
-		if (otherObject != null && otherObject instanceof ArtifactEditJSFAppConfigProvider) {
-			IFile otherAppConfigFile = ((ArtifactEditJSFAppConfigProvider)otherObject).appConfigFile;
-			if (appConfigFile != null) {
-				equals = appConfigFile.equals(otherAppConfigFile);
-			} else {
-				equals = otherAppConfigFile == null;
-			}
-		}
-		return equals;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return appConfigFile != null ? appConfigFile.hashCode() : 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer sb = new StringBuffer("ArtifactEditJSFAppConfigProvider["); //$NON-NLS-1$
-		if (appConfigFile != null) {
-			sb.append(appConfigFile.toString());
-		} else {
-			sb.append("null"); //$NON-NLS-1$
-		}
-		sb.append("]"); //$NON-NLS-1$
-		return sb.toString();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#finalize()
-	 */
-	protected void finalize() {
-		releaseFacesConfigModel();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ContextParamSpecifiedJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ContextParamSpecifiedJSFAppConfigLocater.java
deleted file mode 100644
index 5df2941..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ContextParamSpecifiedJSFAppConfigLocater.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.j2ee.common.ParamValue;
-import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.j2ee.model.ModelProviderManager;
-import org.eclipse.jst.j2ee.webapplication.ContextParam;
-import org.eclipse.jst.j2ee.webapplication.WebApp;
-
-/**
- * ContextParamSpecifiedJSFAppConfigLocater attempts to locate application
- * configuration files specified by the JSF CONFIG_FILES context parameter.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- * TODO:cleanup once JavaEE API's stabilize
- */
-public class ContextParamSpecifiedJSFAppConfigLocater extends WebContentRelativeJSFAppConfigLocater {
-
-	/**
-	 * Cached instance of ContextParamAdapter.
-	 */
-	protected ContextParamAdapter 	contextParamAdapter = null;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.AbstractJSFAppConfigLocater#startLocating()
-	 */
-	public void startLocating() {
-		locateProviders();
-		Object webAppObj = getModelObject();
-		if (webAppObj != null){
-			contextParamAdapter = new ContextParamAdapter();
-			if (webAppObj instanceof WebApp) 
-				startLocatingJ2EEConfigs((WebApp)webAppObj);
-			else if (webAppObj instanceof org.eclipse.jst.javaee.web.WebApp)
-				startLocatingJEEConfigs((org.eclipse.jst.javaee.web.WebApp)webAppObj);
-		} else {
-			//TODO should never get here.  Log err?
-		}
-	}
-
-	private Object getModelObject() {
-		IModelProvider provider = ModelProviderManager.getModelProvider(getJSFAppConfigManager().getProject());
-		return provider.getModelObject();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.AbstractJSFAppConfigLocater#stopLocating()
-	 */
-	public void stopLocating() {
-		if (contextParamAdapter != null) {
-			Object webAppObj = getModelObject();
-			if (webAppObj != null){
-				if (webAppObj instanceof WebApp) 
-					stopLocatingJ2EEConfigs((WebApp)webAppObj);
-				else if (webAppObj instanceof org.eclipse.jst.javaee.web.WebApp)
-					stopLocatingJEEConfigs((org.eclipse.jst.javaee.web.WebApp)webAppObj);
-			} else {
-				//TODO should never get here.  Log err?
-			}
-			contextParamAdapter = null;
-		}
-	}
-
-	private void startLocatingJ2EEConfigs(WebApp webApp){
-		webApp.eAdapters().add(contextParamAdapter);
-		EList contexts = webApp.getContexts();
-		if (contexts != null) {
-			Iterator itContexts = contexts.iterator();
-			while (itContexts.hasNext()) {
-				ContextParam contextParam = (ContextParam)itContexts.next();
-				contextParam.eAdapters().add(contextParamAdapter);
-			}
-		}
-		EList contextParams = webApp.getContextParams();
-		if (contextParams != null) {
-			Iterator itContextParams = contextParams.iterator();
-			while (itContextParams.hasNext()) {
-				ParamValue paramValue = (ParamValue)itContextParams.next();
-				paramValue.eAdapters().add(contextParamAdapter);
-			}
-		}
-	}
-	
-	private void startLocatingJEEConfigs(org.eclipse.jst.javaee.web.WebApp webApp){
-		((EObject)webApp).eAdapters().add(contextParamAdapter);		
-//		System.out.println(((EObject)webApp).eDeliver());
-		List params = webApp.getContextParams();
-		if (params != null) {
-			Iterator itContexts = params.iterator();
-			while (itContexts.hasNext()) {
-				EObject contextParam = (EObject)itContexts.next();
-				contextParam.eAdapters().add(contextParamAdapter);
-			}
-		}
-	}
-	
-
-	private void stopLocatingJ2EEConfigs(WebApp webApp) {
-		webApp.eAdapters().remove(contextParamAdapter);
-		EList contexts = webApp.getContexts();
-		if (contexts != null) {
-			Iterator itContexts = contexts.iterator();
-			while (itContexts.hasNext()) {
-				ContextParam contextParam = (ContextParam)itContexts.next();
-				contextParam.eAdapters().remove(contextParamAdapter);
-			}
-		}
-		EList contextParams = webApp.getContextParams();
-		if (contextParams != null) {
-			Iterator itContextParams = contextParams.iterator();
-			while (itContextParams.hasNext()) {
-				ParamValue paramValue = (ParamValue)itContextParams.next();
-				paramValue.eAdapters().remove(contextParamAdapter);
-			}
-		}
-	}
-	
-	private void stopLocatingJEEConfigs(org.eclipse.jst.javaee.web.WebApp webApp) {
-		((EObject)webApp).eAdapters().remove(contextParamAdapter);
-		List contextParams = webApp.getContextParams();
-		if (contextParams != null) {
-			Iterator itContextParams = contextParams.iterator();
-			while (itContextParams.hasNext()) {
-				EObject paramValue = (EObject)itContextParams.next();
-				paramValue.eAdapters().remove(contextParamAdapter);
-			}
-		}
-	}
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.WebContentRelativeJSFAppConfigLocater#getFilenames()
-	 */
-	protected List getFilenames() {
-		return JSFAppConfigUtils.getConfigFilesFromContextParam(manager.getProject());
-	}
-
-	/**
-	 * Adapter implementation used to monitor addition/removal of context-param
-	 * nodes and change in name of existing nodes in order to respond to
-	 * changes to the JSF CONFIG_FILES context-param.
-	 * 
-	 * @author Ian Trimble - Oracle
-	 */
-	class ContextParamAdapter extends AdapterImpl {
-
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
-		 */
-		public void notifyChanged(Notification notification) {
-			Object objNotifier = notification.getNotifier();
-//			System.out.println(objNotifier.toString());
-			if (objNotifier instanceof WebApp ||
-					objNotifier instanceof org.eclipse.jst.javaee.web.WebApp) {
-				int eventType = notification.getEventType();
-				switch (eventType) {
-				case Notification.ADD:
-					Object objNewValue = notification.getNewValue();
-					if (objNewValue instanceof ContextParam ||
-							objNewValue instanceof org.eclipse.jst.javaee.core.ParamValue) {
-						contextParamAdded((EObject)objNewValue);
-					} else if (objNewValue instanceof ParamValue ) {		
-						paramValueAdded((EObject)objNewValue);
-					}
-					break;
-				case Notification.REMOVE:
-					Object objOldValue = notification.getOldValue();
-					if (objOldValue instanceof ContextParam ||
-							objOldValue instanceof org.eclipse.jst.javaee.core.ParamValue) {
-						contextParamRemoved((EObject)objOldValue);
-					} else if (objOldValue instanceof ParamValue) {
-						paramValueRemoved((EObject)objOldValue);
-					}
-					break;
-				}
-			} else if (objNotifier instanceof ContextParam ||
-					objNotifier instanceof org.eclipse.jst.javaee.core.ParamValue) {
-				if (notification.getEventType() != Notification.REMOVING_ADAPTER) {
-					locateProviders();
-				}
-			} else if (objNotifier instanceof ParamValue) {
-				if (notification.getEventType() != Notification.REMOVING_ADAPTER) {
-					locateProviders();
-				}
-			}
-		}
-
-		/**
-		 * Called when a new ContextParam instance is added.
-		 * 
-		 * @param contextParam ContextParam instance.
-		 */
-		protected void contextParamAdded(EObject contextParam) {
-			if (isConfigFilesContextParam(contextParam)) {
-				locateProviders();
-			}
-			contextParam.eAdapters().add(this);
-		}
-
-		/**
-		 * Called when a new ParamValue instance is added.
-		 * 
-		 * @param paramValue ParamValue instance.
-		 */
-		protected void paramValueAdded(EObject paramValue) {
-			if (isConfigFilesParamValue(paramValue)) {
-				locateProviders();
-			}
-			paramValue.eAdapters().add(this);
-		}
-
-		/**
-		 * Called when a ContextParam instance is removed.
-		 * 
-		 * @param contextParam ContextParam instance.
-		 */
-		protected void contextParamRemoved(EObject contextParam) {
-			if (isConfigFilesContextParam(contextParam)) {
-				locateProviders();
-			}
-			contextParam.eAdapters().remove(this);
-		}
-
-		/**
-		 * Called when a ParamValue instance is removed.
-		 * 
-		 * @param paramValue ParamValue instance.
-		 */
-		protected void paramValueRemoved(EObject paramValue) {
-			if (isConfigFilesParamValue(paramValue)) {
-				locateProviders();
-			}
-			paramValue.eAdapters().remove(this);
-		}
-
-		/**
-		 * Tests if the passed ContextParam instance is the JSF CONFIG_FILES
-		 * context parameter.
-		 * 
-		 * @param contextParam ContextParam instance.
-		 * @return true if the passed ContextParam instance is the JSF
-		 * CONFIG_FILES context parameter, else false
-		 */
-		protected boolean isConfigFilesContextParam(EObject contextParam) {
-			boolean isConfigFiles = false;
-			if (contextParam != null) {
-				String name = null;
-				if (contextParam instanceof ContextParam)
-					name = ((ContextParam)contextParam).getParamName();
-				else if (contextParam instanceof org.eclipse.jst.javaee.core.ParamValue)
-					name = ((org.eclipse.jst.javaee.core.ParamValue)contextParam).getParamName();
-
-				if (name != null && name.equals(JSFAppConfigUtils.CONFIG_FILES_CONTEXT_PARAM_NAME)) {
-					isConfigFiles = true;
-				}
-			}
-			return isConfigFiles;
-		}
-
-		/**
-		 * Tests if the passed ParamValue instance is the JSF CONFIG_FILES
-		 * context parameter.
-		 * 
-		 * @param paramVal as EObject ParamValue instance.
-		 * @return true if the passed ParamValue instance is the JSF
-		 * CONFIG_FILES context parameter, else false
-		 */
-		protected boolean isConfigFilesParamValue(EObject paramVal) {
-			boolean isConfigFiles = false;
-			if (paramVal != null) {
-				String name = null;
-				if (paramVal instanceof ParamValue)
-					name = ((ParamValue)paramVal).getName();
-				else if (paramVal instanceof org.eclipse.jst.javaee.core.ParamValue)
-					name = ((org.eclipse.jst.javaee.core.ParamValue)paramVal).getParamName();
-				
-				if (name != null && name.equals(JSFAppConfigUtils.CONFIG_FILES_CONTEXT_PARAM_NAME)) {
-					isConfigFiles = true;
-				}
-			}
-			return isConfigFiles;
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/DefaultJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/DefaultJSFAppConfigLocater.java
deleted file mode 100644
index 4cc953d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/DefaultJSFAppConfigLocater.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-
-/**
- * DefaultJSFAppConfigLocater attempts to locate the default application
- * configuration file, located at "/WEB-INF/faces-config.xml".
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class DefaultJSFAppConfigLocater extends WebContentRelativeJSFAppConfigLocater 
-	implements IResourceChangeListener {
-
-	/**
-	 * Web content folder-relative name of the default application
-	 * configuration resource file.
-	 */
-	public static final String DEF_APPCONFIGRESOURCE_FILENAME = "WEB-INF/faces-config.xml"; //$NON-NLS-1$
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.AbstractJSFAppConfigLocater#startLocating()
-	 */
-	public void startLocating() {
-		locateProviders();
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		workspace.addResourceChangeListener(this, IResourceChangeEvent.POST_BUILD);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.AbstractJSFAppConfigLocater#stopLocating()
-	 */
-	public void stopLocating() {
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		workspace.removeResourceChangeListener(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.WebContentRelativeJSFAppConfigLocater#getFilenames()
-	 */
-	protected List getFilenames() {
-		List filenames = new ArrayList();
-		filenames.add(DEF_APPCONFIGRESOURCE_FILENAME);
-		return filenames;
-	}
-
-	/**
-	 * Responds to resource change events.
-	 * 
-	 * @param event IResourceChangeEvent instance.
-	 */
-	public void resourceChanged(IResourceChangeEvent event) {
-		IResourceDelta delta = event.getDelta();
-		try {
-			delta.accept(new ResourceDeltaVisitor());
-		} catch (CoreException cex) {
-			JSFCorePlugin.log(
-					IStatus.WARNING,
-					cex.getLocalizedMessage(),
-					cex);
-		}
-	}
-
-	/**
-	 * ResourceDeltaVisitor is used to visit an IResourceDelta instance to
-	 * discover if the default application configuration resource file has
-	 * been added or removed.
-	 * 
-	 * @author Ian Trimble - Oracle
-	 */
-	class ResourceDeltaVisitor implements IResourceDeltaVisitor {
-
-		/**
-		 * Cached IPath instance for default configuration resource file.
-		 */
-		protected IPath defConfigPath = null;
-
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
-		 */
-		public boolean visit(IResourceDelta delta) {
-			boolean visitChildren = false;
-			initDefConfigPath();
-			if (defConfigPath != null) {
-				IPath deltaPath = delta.getFullPath();
-				if (deltaPath != null) {
-					if (defConfigPath.equals(deltaPath)) {
-						locateProviders();
-					} else if (deltaPath.isPrefixOf(defConfigPath)) {
-						visitChildren = true;
-					}
-				}
-			} else {
-				locateProviders();
-			}
-			return visitChildren;
-		}
-
-		/**
-		 * Determines IPath instance for default configuration resource file
-		 * and caches in class member.
-		 */
-		protected void initDefConfigPath() {
-			if (defConfigPath == null) {
-				IProject project = manager.getProject();
-				if (project != null) {
-					IVirtualFolder webContentFolder = JSFAppConfigUtils.getWebContentFolder(project);
-					if (webContentFolder != null) {
-						IVirtualResource defConfigFile = webContentFolder.findMember(DEF_APPCONFIGRESOURCE_FILENAME);
-						if (defConfigFile != null) {
-							defConfigPath = defConfigFile.getWorkspaceRelativePath();
-						}
-					}
-				}
-			}
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IFacesConfigChangeListener.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IFacesConfigChangeListener.java
deleted file mode 100644
index 7f40db6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IFacesConfigChangeListener.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import org.eclipse.emf.common.notify.Notification;
-
-/**
- * IFacesConfigChangeListener is the interface that must be implemented by
- * objects interested in receiving notification of changes to application
- * configuration models.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IFacesConfigChangeListener {
-
-	/**
-	 * Called when a change in an application configuration model for which
-	 * this listener has been registered occurs.
-	 * 
-	 * @param notification EMF {@link Notification} instance that describes the
-	 * model change.
-	 */
-	public void notifyChanged(Notification notification);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigLocater.java
deleted file mode 100644
index 6c0a6a2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigLocater.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import java.util.Set;
-
-/**
- * IJSFAppConfigLocater is the interface that Objects capable of locating
- * and providing JSF application configuration resources must implement.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IJSFAppConfigLocater {
-
-	/**
-	 * Sets the {@link JSFAppConfigManager} instance to which this locater
-	 * belongs.
-	 * 
-	 * @param manager {@link JSFAppConfigManager} instance to be set.
-	 */
-	public void setJSFAppConfigManager(JSFAppConfigManager manager);
-
-	/**
-	 * Gets the {@link JSFAppConfigManager} instance to which this locater
-	 * belongs.
-	 * 
-	 * @return {@link JSFAppConfigManager} instance to which this locater
-	 * belongs.
-	 */
-	public JSFAppConfigManager getJSFAppConfigManager();
-
-	/**
-	 * Starts locating JSF application configuration resources.
-	 */
-	public void startLocating();
-
-	/**
-	 * Stops locating JSF application configuration resources.
-	 */
-	public void stopLocating();
-
-	/**
-	 * Gets the set of {@link IJSFAppConfigProvider} instances that this
-	 * locater has located.
-	 * 
-	 * @return set of {@link IJSFAppConfigProvider} instances.
-	 */
-	public Set getJSFAppConfigProviders();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigProvider.java
deleted file mode 100644
index a351eaa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigProvider.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-
-/**
- * IJSFAppConfigProvider is the interface that Objects capable of providing
- * JSF application configuration models must implement.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IJSFAppConfigProvider {
-
-	/**
-	 * Sets the {@link IJSFAppConfigLocater} instance that located this
-	 * instance.
-	 * 
-	 * @param locater {@link IJSFAppConfigLocater} instance that located this
-	 * instance.
-	 */
-	public void setJSFAppConfigLocater(IJSFAppConfigLocater locater);
-
-	/**
-	 * Gets the root element of the application configuration model for read
-	 * access.
-	 * 
-	 * @return FacesConfigType instance, which is the root element of an
-	 * application configuration model.
-	 */
-	public FacesConfigType getFacesConfigModel();
-
-	/**
-	 * Releases resources associated with acquiring the application
-	 * configuration model (if any).
-	 */
-	public void releaseFacesConfigModel();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigProvidersChangeListener.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigProvidersChangeListener.java
deleted file mode 100644
index d8282c9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/IJSFAppConfigProvidersChangeListener.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-/**
- * Interface that an Object wishing to be notified about changes to the Set of
- * IJSFAppConfigProvider instances implements.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle.
- */
-public interface IJSFAppConfigProvidersChangeListener {
-
-	/**
-	 * Callback method indicating a change in the Set of JSFAppConfigProvider
-	 * instances.
-	 * 
-	 * @param event JSFAppConfigProvidersChangeEvent instance.
-	 */
-	public void changedJSFAppConfigProviders(JSFAppConfigProvidersChangeEvent event);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ImplicitRuntimeJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ImplicitRuntimeJSFAppConfigLocater.java
deleted file mode 100644
index eddcfeb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ImplicitRuntimeJSFAppConfigLocater.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-/**
- * ImplicitRuntimeJSFAppConfigLocater creates an {@link IJSFAppConfigProvider}
- * instance that provides an application configuration model that contains
- * implicit configuration elements that are specified as required to be
- * provided by a JSF implementation.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class ImplicitRuntimeJSFAppConfigLocater extends AbstractJSFAppConfigLocater {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.AbstractJSFAppConfigLocater#startLocating()
-	 */
-	public void startLocating() {
-		locateProviders();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.AbstractJSFAppConfigLocater#stopLocating()
-	 */
-	public void stopLocating() {
-		//nothing to do
-	}
-
-	/**
-	 * Adds an {@link IJSFAppConfigProvider} instance that provides an
-	 * application configuration model that contains implicit configuration
-	 * objects provided by a JSF implementation at runtime.
-	 */
-	public void locateProviders() {
-		Set newConfigProviders = new LinkedHashSet();
-		newConfigProviders.add(new ImplicitRuntimeJSFAppConfigProvider());
-		updateConfigProviders(newConfigProviders);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ImplicitRuntimeJSFAppConfigProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ImplicitRuntimeJSFAppConfigProvider.java
deleted file mode 100644
index eea8207..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/ImplicitRuntimeJSFAppConfigProvider.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-
-/**
- * ImplicitRuntimeJSFAppConfigProvider provides an application configuration
- * model that contains implicit configuration objects provided by a JSF
- * implementation at runtime.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class ImplicitRuntimeJSFAppConfigProvider extends AbstractJSFAppConfigProvider {
-
-	/**
-	 * Cached {@link FacesConfigType} instance.
-	 */
-	protected FacesConfigType facesConfig = null;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvider#getFacesConfigModel()
-	 */
-	public FacesConfigType getFacesConfigModel() {
-		if (facesConfig == null) {
-			createModel();
-			if (facesConfig != null) {
-				jsfAppConfigLocater.getJSFAppConfigManager().addFacesConfigChangeAdapter(facesConfig);
-			}
-		}
-		return facesConfig;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvider#releaseFacesConfigModel()
-	 */
-	public void releaseFacesConfigModel() {
-		jsfAppConfigLocater.getJSFAppConfigManager().removeFacesConfigChangeAdapter(facesConfig);
-		facesConfig = null;
-	}
-
-	/**
-	 * Creates the application configuration model and assigns it to the
-	 * facesConfig property.
-	 */
-	protected void createModel() {
-		facesConfig = FacesConfigFactory.eINSTANCE.createFacesConfigType();
-		//create and add converters
-		EList converters = facesConfig.getConverter();
-		converters.add(createConverter("BigDecimal")); //$NON-NLS-1$
-		converters.add(createConverter("BigInteger")); //$NON-NLS-1$
-		converters.add(createConverter("Boolean")); //$NON-NLS-1$
-		converters.add(createConverter("Byte")); //$NON-NLS-1$
-		converters.add(createConverter("Character")); //$NON-NLS-1$
-		converters.add(createConverter("DateTime")); //$NON-NLS-1$
-		converters.add(createConverter("Double")); //$NON-NLS-1$
-		converters.add(createConverter("Float")); //$NON-NLS-1$
-		converters.add(createConverter("Integer")); //$NON-NLS-1$
-		converters.add(createConverter("Long")); //$NON-NLS-1$
-		converters.add(createConverter("Number")); //$NON-NLS-1$
-		converters.add(createConverter("Short")); //$NON-NLS-1$
-		//create and add validators
-		EList validators = facesConfig.getValidator();
-		validators.add(createValidator("DoubleRange")); //$NON-NLS-1$
-		validators.add(createValidator("Length")); //$NON-NLS-1$
-		validators.add(createValidator("LongRange")); //$NON-NLS-1$
-		//create and add UI components
-		EList components = facesConfig.getComponent();
-		components.add(createUIComponent("Column")); //$NON-NLS-1$
-		components.add(createUIComponent("Command")); //$NON-NLS-1$
-		components.add(createUIComponent("Data")); //$NON-NLS-1$
-		components.add(createUIComponent("Form")); //$NON-NLS-1$
-		components.add(createUIComponent("Graphic")); //$NON-NLS-1$
-		components.add(createUIComponent("Input")); //$NON-NLS-1$
-		components.add(createUIComponent("Message")); //$NON-NLS-1$
-		components.add(createUIComponent("Messages")); //$NON-NLS-1$
-		components.add(createUIComponent("Output")); //$NON-NLS-1$
-		components.add(createUIComponent("Panel")); //$NON-NLS-1$
-		components.add(createUIComponent("Parameter")); //$NON-NLS-1$
-		components.add(createUIComponent("SelectBoolean")); //$NON-NLS-1$
-		components.add(createUIComponent("SelectItem")); //$NON-NLS-1$
-		components.add(createUIComponent("SelectItems")); //$NON-NLS-1$
-		components.add(createUIComponent("SelectMany")); //$NON-NLS-1$
-		components.add(createUIComponent("SelectOne")); //$NON-NLS-1$
-		components.add(createUIComponent("ViewRoot")); //$NON-NLS-1$
-		//create and add HTML components
-		components.add(createHTMLComponent("HtmlCommandButton")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlCommandLink")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlDataTable")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlForm")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlGraphicImage")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlInputHidden")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlInputSecret")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlInputText")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlInputTextarea")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlMessage")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlMessages")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlOutputFormat")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlOutputLabel")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlOutputLink")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlOutputText")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlPanelGrid")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlPanelGroup")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlSelectBooleanCheckbox")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlSelectManyCheckbox")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlSelectManyListbox")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlSelectManyMenu")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlSelectOneListbox")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlSelectOneMenu")); //$NON-NLS-1$
-		components.add(createHTMLComponent("HtmlSelectOneRadio")); //$NON-NLS-1$
-	}
-
-	/**
-	 * Creates a {@link ConverterType} instance.
-	 *
-	 * @param name Base name of converter from which converter-id and
-	 * converter-class are formed.
-	 * @return {@link ConverterType} instance.
-	 */
-	protected ConverterType createConverter(String name) {
-		ConverterType converterType = FacesConfigFactory.eINSTANCE.createConverterType();
-		//set converter-id
-		ConverterIdType converterIdType = FacesConfigFactory.eINSTANCE.createConverterIdType();
-		StringBuffer sb = new StringBuffer();
-		sb.append("javax.faces."); //$NON-NLS-1$
-		sb.append(name);
-		converterIdType.setTextContent(sb.toString());
-		converterType.setConverterId(converterIdType);
-		//set converter-class
-		ConverterClassType converterClassType = FacesConfigFactory.eINSTANCE.createConverterClassType();
-		sb = new StringBuffer();
-		sb.append("javax.faces.convert."); //$NON-NLS-1$
-		sb.append(name);
-		sb.append("Converter"); //$NON-NLS-1$
-		converterClassType.setTextContent(sb.toString());
-		converterType.setConverterClass(converterClassType);
-		return converterType;
-	}
-
-	/**
-	 * Creates a {@link ValidatorType} instance.
-	 * 
-	 * @param name Base name of validator from which validator-id and
-	 * validator-class are formed.
-	 * @return {@link ValidatorType} instance.
-	 */
-	protected ValidatorType createValidator(String name) {
-		ValidatorType validatorType = FacesConfigFactory.eINSTANCE.createValidatorType();
-		//set validator-id
-		ValidatorIdType validatorIdType = FacesConfigFactory.eINSTANCE.createValidatorIdType();
-		StringBuffer sb = new StringBuffer();
-		sb.append("javax.faces."); //$NON-NLS-1$
-		sb.append(name);
-		validatorIdType.setTextContent(sb.toString());
-		validatorType.setValidatorId(validatorIdType);
-		//set validator-class
-		ValidatorClassType validatorClassType = FacesConfigFactory.eINSTANCE.createValidatorClassType();
-		sb = new StringBuffer();
-		sb.append("javax.faces.validator."); //$NON-NLS-1$
-		sb.append(name);
-		sb.append("Validator"); //$NON-NLS-1$
-		validatorClassType.setTextContent(sb.toString());
-		validatorType.setValidatorClass(validatorClassType);
-		return validatorType;
-	}
-
-	/**
-	 * Creates a {@link ComponentType} instance to represent a standard UI
-	 * component.
-	 * 
-	 * @param name Base name of component from which component-type and
-	 * component-class are formed.
-	 * @return {@link ComponentType} instance.
-	 */
-	protected ComponentType createUIComponent(String name) {
-		ComponentType componentType = FacesConfigFactory.eINSTANCE.createComponentType();
-		//set component-type
-		ComponentTypeType componentTypeType = FacesConfigFactory.eINSTANCE.createComponentTypeType();
-		StringBuffer sb = new StringBuffer();
-		sb.append("javax.faces."); //$NON-NLS-1$
-		sb.append(name);
-		componentTypeType.setTextContent(sb.toString());
-		componentType.setComponentType(componentTypeType);
-		//set component-class
-		ComponentClassType componentClassType = FacesConfigFactory.eINSTANCE.createComponentClassType();
-		sb = new StringBuffer();
-		sb.append("javax.faces.component.UI"); //$NON-NLS-1$
-		sb.append(name);
-		componentClassType.setTextContent(sb.toString());
-		componentType.setComponentClass(componentClassType);
-		return componentType;
-	}
-
-	/**
-	 * Creates a {@link ComponentType} instance to represent a concrete HTML
-	 * component.
-	 * 
-	 * @param name Base name of component from which component-type and
-	 * component-class are formed.
-	 * @return {@link ComponentType} instance.
-	 */
-	protected ComponentType createHTMLComponent(String name) {
-		ComponentType componentType = FacesConfigFactory.eINSTANCE.createComponentType();
-		//set component-type
-		ComponentTypeType componentTypeType = FacesConfigFactory.eINSTANCE.createComponentTypeType();
-		StringBuffer sb = new StringBuffer();
-		sb.append("javax.faces."); //$NON-NLS-1$
-		sb.append(name);
-		componentTypeType.setTextContent(sb.toString());
-		componentType.setComponentType(componentTypeType);
-		//set component-class
-		ComponentClassType componentClassType = FacesConfigFactory.eINSTANCE.createComponentClassType();
-		sb = new StringBuffer();
-		sb.append("javax.faces.component.html."); //$NON-NLS-1$
-		sb.append(name);
-		componentClassType.setTextContent(sb.toString());
-		componentType.setComponentClass(componentClassType);
-		return componentType;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object otherObject) {
-		boolean equals = false;
-		if (otherObject instanceof ImplicitRuntimeJSFAppConfigProvider) {
-			equals = true;
-		}
-		return equals;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return ImplicitRuntimeJSFAppConfigProvider.class.getName().hashCode();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return "ImplicitRuntimeJSFAppConfigProvider[]"; //$NON-NLS-1$
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JARFileJSFAppConfigProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JARFileJSFAppConfigProvider.java
deleted file mode 100644
index b488336..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JARFileJSFAppConfigProvider.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Collections;
-import java.util.jar.JarFile;
-import java.util.zip.ZipEntry;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.util.FacesConfigResourceFactory;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * JARFileJSFAppConfigProvider provides the root element of an application
- * configuration model by loading the model from a /META-INF/faces-config.xml
- * entry in a JAR file.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class JARFileJSFAppConfigProvider extends AbstractJSFAppConfigProvider {
-
-	/**
-	 * Prefix required to turn filename into a JAR URI.
-	 */
-	public static final String JARFILE_URI_PREFIX = "jar:file:///";
-
-	/**
-	 * Suffix required to turn filename into a JAR URI.
-	 */
-	public static final String FACES_CONFIG_IN_JAR_SUFFIX = "!/META-INF/faces-config.xml";
-
-	/**
-	 * Name of a JAR file that contains a /META-INF/faces-config.xml entry.
-	 */
-	protected String filename = null;
-
-	/**
-	 * Cached {@link FacesConfigType} instance.
-	 */
-	protected FacesConfigType facesConfig = null;
-
-	/**
-	 * Flag to track if load error has been logged at least once.
-	 */
-	protected boolean loadErrorLogged = false;
-	
-	/**
-	 * Creates an instance, storing the passed IProject instance and file name
-	 * String to be used for subsequent processing.
-	 * 
-	 * @param filename Name of a JAR file that contains a
-	 * /META-INF/faces-config.xml entry.
-	 */
-	public JARFileJSFAppConfigProvider(String filename) {
-		this.filename = filename;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvider#getFacesConfigModel()
-	 */
-	public FacesConfigType getFacesConfigModel() {
-	    // TODO: should this job be pushed into the model?
-		if (facesConfig == null && filename != null) 
-		{
-			facesConfig = getFacesConfig();
-			
-			if (facesConfig != null)
-			{
-				jsfAppConfigLocater.getJSFAppConfigManager().addFacesConfigChangeAdapter(facesConfig);
-			}
-		}
-		return facesConfig;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigProvider#releaseFacesConfigModel()
-	 */
-	public void releaseFacesConfigModel() {
-		jsfAppConfigLocater.getJSFAppConfigManager().removeFacesConfigChangeAdapter(facesConfig);
-	}
-
-	/**
-	 * Called to log a load error; load error will be logged once only per
-	 * instance, per VM session.
-	 * 
-	 * @param ex Throwable instance to be logged.
-	 */
-	protected void logLoadError(Throwable ex) {
-		if (!loadErrorLogged) {
-			JSFCorePlugin.log(
-					IStatus.ERROR,
-					NLS.bind(Messages.JARFileJSFAppConfigProvider_ErrorLoadingModel, JARFILE_URI_PREFIX + filename + FACES_CONFIG_IN_JAR_SUFFIX),
-					ex);
-			loadErrorLogged = true;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object otherObject) {
-		boolean equals = false;
-		if (otherObject instanceof JARFileJSFAppConfigProvider) {
-			String otherFilename = ((JARFileJSFAppConfigProvider)otherObject).filename;
-			if (filename != null) {
-				equals = filename.equals(otherFilename);
-			} else {
-				equals = otherFilename == null;
-			}
-		}
-		return equals;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return filename != null ? filename.hashCode() : 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer sb = new StringBuffer("JARFileJSFAppConfigProvider["); //$NON-NLS-1$
-		if (filename != null) {
-			sb.append(filename);
-		} else {
-			sb.append("null"); //$NON-NLS-1$
-		}
-		sb.append("]"); //$NON-NLS-1$
-		return sb.toString();
-	}
-
-	private FacesConfigType getFacesConfig()
-	{
-		JarFile 		jarFile = null;
-		File    		tempFile = null;
-		OutputStream	tempFileStream = null;
-
-		try
-		{
-			jarFile = new JarFile(filename);
-			ZipEntry entry = jarFile.getEntry("META-INF/faces-config.xml");
-
-			if (entry != null)
-			{
-				InputStream stream = jarFile.getInputStream(entry);
-	
-				tempFile = File.createTempFile("tempfile", ".xml");
-				tempFileStream = new FileOutputStream(tempFile);
-	
-				int read = 0;
-				byte[]  buffer = new byte[4096];
-	
-				while ((read = stream.read(buffer)) != -1)
-				{
-					tempFileStream.write(buffer, 0, read);
-				}
-	
-				tempFileStream.close();
-				tempFileStream = null;
-	
-				FacesConfigResourceFactory factory = FacesConfigResourceFactory.createResourceFactoryForJar();
-				//FacesConfigResourceFactory.register(tempFile.toURI().toString());
-				Resource resource = factory.createResource(URI.createFileURI(tempFile.getAbsolutePath()));
-				
-				try {
-					resource.load(Collections.EMPTY_MAP);
-					if (resource != null) {
-						EList resourceContents = resource.getContents();
-						if (resourceContents != null && resourceContents.size() > 0) {
-							facesConfig = (FacesConfigType)resourceContents.get(0);
-							if (facesConfig != null) {
-								jsfAppConfigLocater.getJSFAppConfigManager().addFacesConfigChangeAdapter(facesConfig);
-							}
-						}
-					}
-				} catch(IllegalStateException ise) {
-					//log error
-					logLoadError(ise);
-				} catch(IOException ioe) {
-					//log error
-					logLoadError(ioe);
-				}
-			}
-
-			return facesConfig;
-		}
-		catch (IOException ioe)
-		{
-			logLoadError(ioe);
-			return null;
-		}
-		finally
-		{
-			if (jarFile != null)
-			{
-				try
-				{
-					jarFile.close();
-				}
-				catch (IOException ioe)
-				{
-					logLoadError(ioe);
-				}
-			}
-
-			if (tempFileStream != null)
-			{
-				try
-				{
-					tempFileStream.close();
-				}
-				catch(IOException ioe)
-				{
-					logLoadError(ioe);
-				}
-			}
-
-			if (tempFile != null && tempFile.exists())
-			{
-				if (!tempFile.delete())
-				{
-					tempFile.deleteOnExit();
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigManager.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigManager.java
deleted file mode 100644
index 381fc67..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigManager.java
+++ /dev/null
@@ -1,746 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EContentAdapter;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-
-/**
- * JSFAppConfigManager provides an entry point to an entire JSF application
- * configuration, which is defined in one or more application configuration
- * resource files.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class JSFAppConfigManager implements IResourceChangeListener {
-
-	/**
-	 * Key that is used for the IProject instance's session property that
-	 * holds a JSFAppConfigManager instance.
-	 */
-	public static final QualifiedName KEY_SESSIONPROPERTY =
-		new QualifiedName(JSFCorePlugin.PLUGIN_ID, "JSFAppConfigManager"); //$NON-NLS-1$
-
-	/**
-	 * IProject instance to which this JSFAppConfigManager instance is keyed.
-	 */
-	protected IProject project = null;
-
-	/**
-	 * Collection of {@link IJSFAppConfigLocater} instances.
-	 */
-	protected List configLocaters = null;
-
-	/**
-	 * Collection of {@link IJSFAppConfigProvidersChangeListener} instances.
-	 */
-	protected List configProvidersChangeListeners = null;
-
-	/**
-	 * Map of application configuration model EMF classes to
-	 * {@link IFacesConfigChangeListener} instances.
-	 */
-	protected Map facesConfigChangeListeners = null;
-
-	/**
-	 * Single {@link FacesConfigChangeAdapter} instance.
-	 */
-	protected FacesConfigChangeAdapter facesConfigChangeAdapter = null;
-
-	/**
-	 * Gets a JSFAppConfigManager instance that is keyed to the passed IProject
-	 * parameter. May return null if the project is not valid or if a
-	 * CoreException is thrown while attempting to get or set the instance as
-	 * a session property.
-	 * 
-	 * @param project IProject instance to which the returned
-	 * JSFAppConfigManager instance is keyed.
-	 * @return JSFAppConfigManager instance, or null.
-	 */
-	public static synchronized JSFAppConfigManager getInstance(IProject project) {
-		JSFAppConfigManager manager = null;
-		if (JSFAppConfigUtils.isValidJSFProject(project)) {
-			manager = getFromSessionProperty(project);
-			if (manager == null) {
-				manager = new JSFAppConfigManager(project);
-			}
-		}
-		return manager;
-	}
-
-	/**
-	 * Attempts to get a JSFAppConfigManager instance from a session property
-	 * of the passed IProject instance. Will return null if the session
-	 * property has not yet been set.
-	 * 
-	 * @param project IProject instance from which to retrieve the
-	 * JSFAppConfigManager instance.
-	 * @return JSFAppConfigManager instance, or null.
-	 */
-	protected static JSFAppConfigManager getFromSessionProperty(IProject project) {
-		JSFAppConfigManager manager = null;
-		try {
-			Object obj = project.getSessionProperty(KEY_SESSIONPROPERTY);
-			if (obj != null && obj instanceof JSFAppConfigManager) {
-				manager = (JSFAppConfigManager)obj;
-			}
-		} catch(CoreException ce) {
-			//log error
-			JSFCorePlugin.log(IStatus.ERROR, ce.getLocalizedMessage(), ce);
-		}
-		return manager;
-	}
-
-	/**
-	 * Sets this JSFAppConfigManager instance as a session property of its
-	 * IProject instance.
-	 */
-	protected void setAsSessionProperty() {
-		if (project != null && project.isAccessible()) {
-			try {
-				project.setSessionProperty(KEY_SESSIONPROPERTY, this);
-			} catch(CoreException ce) {
-				//log error
-				JSFCorePlugin.log(IStatus.ERROR, ce.getLocalizedMessage(), ce);
-			}
-		}
-	}
-
-	/**
-	 * Unsets this JSFAppConfigManager instance as a session property of its
-	 * IProject instance.
-	 */
-	protected void unsetAsSessionProperty() {
-		if (project != null && project.isAccessible()) {
-			try {
-				project.setSessionProperty(KEY_SESSIONPROPERTY, null);
-			} catch(CoreException ce) {
-				//log error
-				JSFCorePlugin.log(IStatus.ERROR, ce.getLocalizedMessage(), ce);
-			}
-		}
-	}
-
-	/**
-	 * Constructor is private to prevent direct instantiation; call
-	 * getInstance(IProject).
-	 * 
-	 * @param project IProject instance to which the new JSFAppConfigManager
-	 * instance is keyed.
-	 */
-	private JSFAppConfigManager(IProject project) {
-		this.project = project;
-		initialize();
-	}
-
-	/**
-	 * Gets this instance's IProject instance.
-	 * 
-	 * @return This instance's IProject instance.
-	 */
-	public IProject getProject() {
-		return project;
-	}
-
-	/**
-	 * Initializes instance by:
-	 * <ul>
-	 *  <li>creating facesConfigChangeListeners collection, </li>
-	 * 	<li>creating configProvidersChangeListeners collection, </li>
-	 * 	<li>creating and populating configLocaters collection, </li>
-	 * 	<li>invoking the startLocating() method on all configLocaters, </li>
-	 * 	<li>setting instance as a session property of the IProject instance, </li>
-	 *  <li>adding a resource change listener to the workspace.</li>
-	 * </ul>
-	 */
-	protected void initialize() {
-		//create collections
-		facesConfigChangeListeners = new HashMap();
-		configProvidersChangeListeners = new ArrayList();
-		configLocaters = new ArrayList();
-		//populate initial set of locaters
-		populateConfigLocaters();
-		//instruct locaters to start locating
-		startConfigLocaters();
-		//set as session property of project
-		setAsSessionProperty();
-		//add resource change listener
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		workspace.addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
-	}
-
-	/**
-	 * Populates configLocaters Set with "built-in" set of
-	 * {@link IJSFAppConfigLocater} implementations.
-	 */
-	protected void populateConfigLocaters() {
-		//implicit runtime-provided configuration
-		IJSFAppConfigLocater implicitRuntimeConfigLocater = new ImplicitRuntimeJSFAppConfigLocater();
-		implicitRuntimeConfigLocater.setJSFAppConfigManager(this);
-		configLocaters.add(implicitRuntimeConfigLocater);
-		//default ("/WEB-INF/faces-config.xml") locater
-		IJSFAppConfigLocater defaultConfigLocater = new DefaultJSFAppConfigLocater();
-		defaultConfigLocater.setJSFAppConfigManager(this);
-		configLocaters.add(defaultConfigLocater);
-		//web.xml context-parameter specified locater
-		IJSFAppConfigLocater contextParamConfigLocater = new ContextParamSpecifiedJSFAppConfigLocater();
-		contextParamConfigLocater.setJSFAppConfigManager(this);
-		configLocaters.add(contextParamConfigLocater);
-		//runtime classpath locater
-		IJSFAppConfigLocater classpathConfigLocater = new RuntimeClasspathJSFAppConfigLocater();
-		classpathConfigLocater.setJSFAppConfigManager(this);
-		configLocaters.add(classpathConfigLocater);
-	}
-
-	/**
-	 * Instructs set of {@link IJSFAppConfigLocater} instances to start
-	 * locating JSF application configuration resources.
-	 */
-	protected void startConfigLocaters() {
-		Iterator itConfigLocaters = configLocaters.iterator();
-		while (itConfigLocaters.hasNext()) {
-			IJSFAppConfigLocater configLocater = (IJSFAppConfigLocater)itConfigLocaters.next();
-			configLocater.startLocating();
-		}
-	}
-
-	/**
-	 * Instructs set of {@link IJSFAppConfigLocater} instances to stop
-	 * locating JSF application configuration resources.
-	 */
-	protected void stopConfigLocaters() {
-		Iterator itConfigLocaters = configLocaters.iterator();
-		while (itConfigLocaters.hasNext()) {
-			IJSFAppConfigLocater configLocater = (IJSFAppConfigLocater)itConfigLocaters.next();
-			configLocater.stopLocating();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
-	 */
-	public void resourceChanged(IResourceChangeEvent event) {
-		IResourceDelta delta = event.getDelta();
-		if (delta.getKind() == IResourceDelta.CHANGED) {
-			IResourceDelta[] removedDeltas = delta.getAffectedChildren(IResourceDelta.REMOVED);
-			if (removedDeltas.length == 1) {
-				IResourceDelta removedDelta = removedDeltas[0];
-				IResource removedResource = removedDelta.getResource();
-				if (removedResource != null && removedResource == project) {
-					IResourceDelta[] addedDeltas = delta.getAffectedChildren(IResourceDelta.ADDED);
-					if (addedDeltas.length == 1) {
-						IResourceDelta addedDelta = addedDeltas[0];
-						IResource addedResource = addedDelta.getResource();
-						if (addedResource != null && addedResource instanceof IProject) {
-							changeProject((IProject)addedResource);
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Called to respond to a change in the IProject instance to which this
-	 * instance belongs. Changes the cached IProject instance, stops all config
-	 * locaters, starts all config locaters.
-	 * 
-	 * @param newProject New IProject instance to which this manager belongs.
-	 */
-	protected void changeProject(IProject newProject) {
-		this.project = newProject;
-		stopConfigLocaters();
-		startConfigLocaters();
-	}
-
-	/**
-	 * Adds an instance of {@link IJSFAppConfigProvidersChangeListener}.
-	 * 
-	 * @param listener An instance of {@link IJSFAppConfigProvidersChangeListener}.
-	 * @return true if added, else false.
-	 */
-	public boolean addJSFAppConfigProvidersChangeListener(IJSFAppConfigProvidersChangeListener listener) {
-		return configProvidersChangeListeners.add(listener);
-	}
-
-	/**
-	 * Removes an instance of {@link IJSFAppConfigProvidersChangeListener}.
-	 * 
-	 * @param listener an instance of {@link IJSFAppConfigProvidersChangeListener}.
-	 * @return true if removed, else false.
-	 */
-	public boolean removeJSFAppConfigProvidersChangeListener(IJSFAppConfigProvidersChangeListener listener) {
-		return configProvidersChangeListeners.remove(listener);
-	}
-
-	/**
-	 * Notifies all {@link IJSFAppConfigProvidersChangeListener} instances of
-	 * a change in the Set of {@link IJSFAppConfigProvider} instances.
-	 * 
-	 * @param configProvider {@link IJSFAppConfigProvider} instance that has
-	 * changed.
-	 * @param eventType Event type.
-	 */
-	public void notifyJSFAppConfigProvidersChangeListeners(IJSFAppConfigProvider configProvider, int eventType) {
-		JSFAppConfigProvidersChangeEvent event = new JSFAppConfigProvidersChangeEvent(configProvider, eventType);
-		Iterator itListeners = configProvidersChangeListeners.iterator();
-		while (itListeners.hasNext()) {
-			IJSFAppConfigProvidersChangeListener listener =
-				(IJSFAppConfigProvidersChangeListener)itListeners.next();
-			listener.changedJSFAppConfigProviders(event);
-		}
-	}
-
-	/**
-	 * Adds an instance of {@link IFacesConfigChangeListener}. <br>
-	 * <br>
-	 * <b>NOTE:</b> Calling this method will cause all application
-	 * configuration models to be loaded, to ensure that a
-	 * {@link FacesConfigChangeAdapter} has been added to each model.
-	 * 
-	 * @param emfClass EMF class in which the listener is interested.
-	 * @param listener {@link IFacesConfigChangeListener} instance.
-	 * @return Previous {@link IFacesConfigChangeListener}, or null.
-	 */
-	public Object addFacesConfigChangeListener(Class emfClass, IFacesConfigChangeListener listener) {
-		/* 
-		 * Get all models, which will ensure that each one has had a
-		 * FacesConfigChangeAdapter added to it.
-		 */
-		getFacesConfigModels();
-		return facesConfigChangeListeners.put(emfClass, listener);
-	}
-
-	/**
-	 * Removes an instance of {@link IFacesConfigChangeListener}.
-	 * 
-	 * @param emfClass EMF class in which the listener was interested.
-	 * @return Removed {@link IFacesConfigChangeListener}, or null.
-	 */
-	public Object removeFacesConfigChangeListener(Class emfClass) {
-		return facesConfigChangeListeners.remove(emfClass);
-	}
-
-	/**
-	 * Notifies {@link IFacesConfigChangeListener} instances of model changes
-	 * in which they registered interest.
-	 * 
-	 * @param notification EMF {@link Notification} instance that describes the
-	 * model change.
-	 */
-	public void notifyFacesConfigChangeListeners(Notification notification) {
-		Object emfFeature = notification.getFeature();
-		if (emfFeature != null && emfFeature instanceof EStructuralFeature) {
-			Class emfClass = ((EStructuralFeature)emfFeature).getEType().getInstanceClass();
-			IFacesConfigChangeListener listener = (IFacesConfigChangeListener)facesConfigChangeListeners.get(emfClass);
-			if (listener != null) {
-				listener.notifyChanged(notification);
-			}
-		}
-	}
-
-	/**
-	 * Gets all {@link IJSFAppConfigProvider} instances from all
-	 * {@link IJSFAppConfigLocater} instances.
-	 * 
-	 * @return Set of all {@link IJSFAppConfigProvider} instances.
-	 */
-	public Set getJSFAppConfigProviders() {
-		Set allConfigProviders = new LinkedHashSet();
-		Iterator itConfigLocaters = configLocaters.iterator();
-		while (itConfigLocaters.hasNext()) {
-			IJSFAppConfigLocater configLocater = (IJSFAppConfigLocater)itConfigLocaters.next();
-			allConfigProviders.addAll(configLocater.getJSFAppConfigProviders());
-		}
-		return allConfigProviders;
-	}
-
-	/**
-	 * Gets all {@link FacesConfigType} instances from all
-	 * {@link IJSFAppConfigProvider} instances.
-	 * 
-	 * @return List of all {@link FacesConfigType} instances.
-	 */
-	public List getFacesConfigModels() {
-		List facesConfigModels = new ArrayList();
-		Iterator itConfigProviders = getJSFAppConfigProviders().iterator();
-		while (itConfigProviders.hasNext()) {
-			IJSFAppConfigProvider configProvider = (IJSFAppConfigProvider)itConfigProviders.next();
-			FacesConfigType facesConfig = configProvider.getFacesConfigModel();
-			if (facesConfig != null) {
-				facesConfigModels.add(facesConfig);
-			}
-		}
-		return facesConfigModels;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#finalize()
-	 */
-	protected void finalize() {
-		//remove resource change listener
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		workspace.removeResourceChangeListener(this);
-		//remove session property from project
-		unsetAsSessionProperty();
-		//instruct locaters to stop locating
-		stopConfigLocaters();
-		//clear collections
-		configLocaters.clear();
-		configProvidersChangeListeners.clear();
-		facesConfigChangeListeners.clear();
-	}
-
-	/**
-	 * Gets list of all ManagedBeanType instances from all known faces-config
-	 * models; list may be empty.
-	 * 
-	 * @return List of all ManagedBeanType instances from all known
-	 * faces-config models (list may be empty).
-	 */
-	public List getManagedBeans() {
-		List allManagedBeans = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList managedBeans = facesConfig.getManagedBean();
-			allManagedBeans.addAll(managedBeans);
-		}
-		return allManagedBeans;
-	}
-
-	/**
-	 * Gets list of all ValidatorType instances from all known faces-config
-	 * models; list may be empty.
-	 * 
-	 * @return List of all ValidatorType instances from all known faces-config
-	 * models (list may be empty).
-	 */
-	public List getValidators() {
-		List allValidators = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList validators = facesConfig.getValidator();
-			allValidators.addAll(validators);
-		}
-		return allValidators;
-	}
-
-	/**
-	 * Gets list of all ConverterType instances from all known faces-config
-	 * models; list may be empty.
-	 * 
-	 * @return List of all ConverterType instances from all known faces-config
-	 * models (list may be empty).
-	 */
-	public List getConverters() {
-		List allConverters = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList converters = facesConfig.getConverter();
-			allConverters.addAll(converters);
-		}
-		return allConverters;
-	}
-
-	/**
-	 * Gets list of all NavigationRuleType instances from all known
-	 * faces-config models; list may be empty.
-	 * 
-	 * @return List of all NavigationRuleType instances from all known
-	 * faces-config models (list may be empty).
-	 */
-	public List getNavigationRules() {
-		List allNavigationRules = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList navigationRules = facesConfig.getNavigationRule();
-			allNavigationRules.addAll(navigationRules);
-		}
-		return allNavigationRules;
-	}
-
-	/**
-	 * Gets list of all NavigationRuleType instances from all known
-	 * faces-config models where the navigation-rule's from-view-id value
-	 * matches the web content folder-relative value of the passed IFile
-	 * instance; list may be empty. Matching is performed in the same manner
-	 * as for a JSF implementation's default NavigationHandler.
-	 * 
-	 * @param pageFile IFile instance to match against the from-view-id value
-	 * of all NavigationRuleType instances. File is assumed to be relative to
-	 * the web content folder, but may be expressed in a more complete form;
-	 * its path will be calculated relative to the web content folder.
-	 * @return List of all NavigationRuleType instances from all known
-	 * faces-config models where the navigation-rule's from-view-id value
-	 * matches the web content folder-relative value of the passed IFile
-	 * instance (list may be empty).
-	 */
-	public List getNavigationRulesForPage(IFile pageFile) {
-		List navigationRulesForPage = new ArrayList();
-		IPath pageFilePath = JSFAppConfigUtils.getWebContentFolderRelativePath(pageFile);
-		if (pageFilePath != null) {
-			String pageFileString = pageFilePath.toString();
-			if (!pageFileString.startsWith("/")) {
-				pageFileString = "/" + pageFileString;
-			}
-			List navigationRules = getNavigationRules();
-			Iterator itNavigationRules = navigationRules.iterator();
-			while (itNavigationRules.hasNext()) {
-				NavigationRuleType navigationRule = (NavigationRuleType)itNavigationRules.next();
-				FromViewIdType fromViewIdType = navigationRule.getFromViewId();
-				if (fromViewIdType != null) {
-					String fromViewId = fromViewIdType.getTextContent();
-					if (fromViewId != null && fromViewId.length() > 0) {
-						if (!fromViewId.equals("*")) { //$NON-NLS-1$
-							if (fromViewId.equals(pageFileString)) {
-								//exact match
-								navigationRulesForPage.add(navigationRule);
-							} else if (fromViewId.endsWith("*")) { //$NON-NLS-1$
-								String prefixFromViewId = fromViewId.substring(0, fromViewId.length() - 1);
-								if (pageFileString.startsWith(prefixFromViewId)) {
-									//prefix match
-									navigationRulesForPage.add(navigationRule);
-								}
-							}
-						} else {
-							//from-view-id == "*" - matches all pages
-							navigationRulesForPage.add(navigationRule);
-						}
-					}
-				} else {
-					//no from-view-id element - matches all pages
-					navigationRulesForPage.add(navigationRule);
-				}
-			}
-		}
-		return navigationRulesForPage;
-	}
-
-	/**
-	 * Gets list of all ApplicationType instances from all known
-	 * faces-config models; list may be empty.
-	 * 
-	 * @return List of all ApplicationType instances from all known
-	 * faces-config models (list may be empty).
-	 */
-	public List getApplications() {
-		List allApplications = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList applications = facesConfig.getApplication();
-			allApplications.addAll(applications);
-		}
-		return allApplications;
-	}
-
-	/**
-	 * Gets list of all FactoryType instances from all known faces-config
-	 * models; list may be empty.
-	 * 
-	 * @return List of all FactoryType instances from all known faces-config
-	 * models (list may be empty).
-	 */
-	public List getFactories() {
-		List allFactories = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList factories = facesConfig.getFactory();
-			allFactories.addAll(factories);
-		}
-		return allFactories;
-	}
-
-	/**
-	 * Gets list of all ComponentType instances from all known faces-config
-	 * models; list may be empty.
-	 * 
-	 * @return List of all ComponentType instances from all known faces-config
-	 * models (list may be empty).
-	 */
-	public List getComponents() {
-		List allComponents = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList components = facesConfig.getComponent();
-			allComponents.addAll(components);
-		}
-		return allComponents;
-	}
-
-	/**
-	 * Gets list of all ReferencedBeanType instances from all known
-	 * faces-config models; list may be empty.
-	 * 
-	 * @return List of all ReferencedBeanType instances from all known
-	 * faces-config models (list may be empty).
-	 */
-	public List getReferencedBeans() {
-		List allReferencedBeans = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList referencedBeans = facesConfig.getReferencedBean();
-			allReferencedBeans.addAll(referencedBeans);
-		}
-		return allReferencedBeans;
-	}
-
-	/**
-	 * Gets list of all RenderKitType instances from all known faces-config
-	 * models; list may be empty.
-	 * 
-	 * @return List of all RenderKitType instances from all known faces-config
-	 * models (list may be empty).
-	 */
-	public List getRenderKits() {
-		List allRenderKits = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList renderKits = facesConfig.getRenderKit();
-			allRenderKits.addAll(renderKits);
-		}
-		return allRenderKits;
-	}
-
-	/**
-	 * Gets list of all LifecycleType instances from all known faces-config
-	 * models; list may be empty.
-	 * 
-	 * @return List of all LifecycleType instances from all known faces-config
-	 * models (list may be empty).
-	 */
-	public List getLifecycles() {
-		List allLifecycles = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList lifecycles = facesConfig.getLifecycle();
-			allLifecycles.addAll(lifecycles);
-		}
-		return allLifecycles;
-	}
-
-    /**
-     * @return the list of all resource bundles declared in all the FacesConfig
-     * configurations found.
-     */
-    public List getResourceBundles()
-    {
-        List allResourceBundles = new ArrayList();
-        List facesConfigs = getFacesConfigModels();
-        Iterator itFacesConfigs = facesConfigs.iterator();
-        while (itFacesConfigs.hasNext()) {
-            FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-            for (final Iterator applicationIt = facesConfig.getApplication().iterator(); applicationIt.hasNext();)
-            {
-                ApplicationType appType = (ApplicationType) applicationIt.next();
-                allResourceBundles.addAll(appType.getResourceBundle());
-            }
-        }
-        return allResourceBundles;
-    }
-    
-	/**
-	 * Adds this instance's {@link FacesConfigChangeAdapter} instance to the
-	 * passed application configuration model's adapters collection.
-	 * 
-	 * @param facesConfig Application configuration model's root object.
-	 */
-	public void addFacesConfigChangeAdapter(FacesConfigType facesConfig) {
-		if (facesConfig != null) {
-			if (facesConfigChangeAdapter == null) {
-				facesConfigChangeAdapter = new FacesConfigChangeAdapter();
-			}
-			facesConfig.eAdapters().add(facesConfigChangeAdapter);
-		}
-	}
-
-	/**
-	 * Removes this instance's {@link FacesConfigChangeAdapter} instance from
-	 * the passed application configuration model's adapters collection.
-	 * 
-	 * @param facesConfig Application configuration model's root object.
-	 */
-	public void removeFacesConfigChangeAdapter(FacesConfigType facesConfig) {
-		if (facesConfig != null && facesConfigChangeAdapter != null) {
-			facesConfig.eAdapters().remove(facesConfigChangeAdapter);
-		}
-	}
-
-	/**
-	 * FacesConfigChangeAdapter is an EMF adapter which provides a mechanism
-	 * for notification of changes to features in any application configuration
-	 * model for which {@link IFacesConfigChangeListener} instances have
-	 * registered an interest.
-	 * 
-	 * @author Ian Trimble - Oracle
-	 */
-	class FacesConfigChangeAdapter extends EContentAdapter {
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.emf.ecore.util.EContentAdapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-		 */
-		public void notifyChanged(Notification notification) {
-			super.notifyChanged(notification);
-			notifyFacesConfigChangeListeners(notification);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigProvidersChangeEvent.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigProvidersChangeEvent.java
deleted file mode 100644
index a946e4c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigProvidersChangeEvent.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-/**
- * JSFAppConfigProvidersChangeEvent provides change information to instances of
- * IJSFAppConfigProvidersChangeListener.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class JSFAppConfigProvidersChangeEvent {
-
-	/**
-	 * Event type; instance of IJSFAppConfigProvider was added (value == 1).
-	 */
-	public static final int ADDED = 1;
-
-	/**
-	 * Event type; instance of IJSFAppConfigProvider was removed (value == 2).
-	 */
-	public static final int REMOVED = 2;
-
-	/**
-	 * Instance of IJSFAppConfigProvider that was added or removed.
-	 */
-	protected IJSFAppConfigProvider configProvider = null;
-
-	/**
-	 * Event type.
-	 */
-	protected int eventType;
-
-	/**
-	 * Constructs an instance.
-	 * 
-	 * @param configProvider Instance of IJSFAppConfigProvider that was added
-	 * or removed
-	 * @param eventType Event type
-	 */
-	public JSFAppConfigProvidersChangeEvent(IJSFAppConfigProvider configProvider, int eventType) {
-		this.configProvider = configProvider;
-		this.eventType = eventType;
-	}
-
-	/**
-	 * Gets the instance of IJSFAppConfigProvider that was added or removed.
-	 * 
-	 * @return Instance of IJSFAppConfigProvider that was added or removed
-	 */
-	public IJSFAppConfigProvider getJSFAppConfigProvider() {
-		return configProvider;
-	}
-
-	/**
-	 * Gets the event type.
-	 * 
-	 * @return Event type
-	 */
-	public int getEventType() {
-		return eventType;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigUtils.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigUtils.java
deleted file mode 100644
index b9593f6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigUtils.java
+++ /dev/null
@@ -1,364 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.StringTokenizer;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jst.j2ee.common.ParamValue;
-import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
-import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.j2ee.model.ModelProviderManager;
-import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
-import org.eclipse.jst.j2ee.webapplication.ContextParam;
-import org.eclipse.jst.j2ee.webapplication.WebApp;
-import org.eclipse.jst.jsf.core.IJSFCoreConstants;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-
-/**
- * JSFAppConfigUtils provides utility methods useful in processing of a JSF
- * application configuration.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class JSFAppConfigUtils {
-
-	/**
-	 * Name of JSF CONFIG_FILES context parameter ("javax.faces.CONFIG_FILES").
-	 */
-	public static final String CONFIG_FILES_CONTEXT_PARAM_NAME = "javax.faces.CONFIG_FILES"; //$NON-NLS-1$
-
-	/**
-	 * Location in JAR file of application configuration resource file
-	 * ("META-INF/faces-config.xml"). 
-	 */
-	public static final String FACES_CONFIG_IN_JAR_PATH = "META-INF/faces-config.xml"; //$NON-NLS-1$
-
-    
-    /**
-     * @param project
-     * @param minVersion
-     * @return true if project is a JSF facet project and the version of the project
-     * is at least minVersion.
-     */
-    public static boolean isValidJSFProject(IProject project, String minVersion)
-    {
-        boolean isValid = false;
-        
-        final IProjectFacetVersion projectFacetVersion = getProjectFacet(project);
-        
-        if (projectFacetVersion != null)
-        {
-            try
-            {
-                final String versionString = 
-                    projectFacetVersion.getVersionString();
-                final Comparator comparator = 
-                    projectFacetVersion.getProjectFacet().getVersionComparator();
-                final int compareToMin = 
-                    comparator.compare(versionString, minVersion);
-                
-                if (compareToMin >=0)
-                {
-                    return true;
-                }
-            }
-            catch (CoreException ce)
-            {
-                JSFCorePlugin.log(ce, "Error checking facet version"); //$NON-NLS-1$
-            }
-        }
-        return isValid;
-    }
-    
-	/**
-	 * Tests if the passed IProject instance is a valid JSF project in the
-	 * following ways:
-	 * <ul>
-	 * <li>project is not null and is accessible, </li>
-	 * <li>project has the JSF facet set on it.</li>
-	 * </ul>
-	 * 
-	 * @param project IProject instance to be tested.
-	 * @return true if the IProject instance is a valid JSF project, else
-	 * false.
-	 */
-	public static boolean isValidJSFProject(IProject project) {
-		boolean isValid = false;
-        IProjectFacetVersion projectFacet = getProjectFacet(project);
-        if (projectFacet != null)
-        {
-            isValid = true;
-        }
-		return isValid;
-	}
-    /**
-     * Get the facet version for the project 
-     * @param project
-     * @return the project facet version or null if could not be found or if
-     * project is not accessible
-     */
-    public static IProjectFacetVersion getProjectFacet(IProject project)
-    {
-        //check for null or inaccessible project
-        if (project != null && project.isAccessible()) {
-            //check for JSF facet on project
-            try {
-                IFacetedProject facetedProject = ProjectFacetsManager.create(project);
-                if (facetedProject != null) {
-                    Set projectFacets = facetedProject.getProjectFacets();
-                    Iterator itProjectFacets = projectFacets.iterator();
-                    while (itProjectFacets.hasNext()) {
-                        IProjectFacetVersion projectFacetVersion = (IProjectFacetVersion)itProjectFacets.next();
-                        if (IJSFCoreConstants.JSF_CORE_FACET_ID.equals(projectFacetVersion.getProjectFacet().getId()))
-                        {
-                            return projectFacetVersion;
-                        }
-                    }
-                }
-            } catch(CoreException ce) {
-                //log error
-                JSFCorePlugin.log(IStatus.ERROR, ce.getLocalizedMessage(), ce);
-            }
-        }
-        return null;
-    }
-    
-	/**
-	 * Gets an IVirtualFolder instance which represents the root context's
-	 * web content folder.
-	 * 
-	 * @param project IProject instance for which to get the folder.
-	 * @return IVirtualFolder instance which represents the root context's
-	 * web content folder.
-	 */
-	public static IVirtualFolder getWebContentFolder(IProject project) {
-		IVirtualFolder folder = null;
-		IVirtualComponent component = ComponentCore.createComponent(project);
-		if (component != null) {
-			folder = component.getRootFolder();
-		}
-		return folder;
-	}
-
-	/**
-	 * Gets an IPath instance representing the path of the passed IFile
-	 * instance relative to the web content folder.
-	 * 
-	 * @param file IFile instance for which a path is required.
-	 * @return IPath instance representing the path relative to the web content
-	 * folder.
-	 */
-	public static IPath getWebContentFolderRelativePath(IFile file) {
-		IPath path = null;
-		if (file != null) {
-			IVirtualFolder webContentFolder = getWebContentFolder(file.getProject());
-			if (webContentFolder != null) {
-				IPath webContentPath = webContentFolder.getProjectRelativePath();
-				IPath filePath = file.getProjectRelativePath();
-				int matchingFirstSegments = webContentPath.matchingFirstSegments(filePath);
-				path = filePath.removeFirstSegments(matchingFirstSegments);
-			}
-		}
-		return path;
-	}
-
-	/**
-	 * Gets list of application configuration file names as listed in the JSF
-	 * CONFIG_FILES context parameter ("javax.faces.CONFIG_FILES"). Will return
-	 * an empty list if WebArtifactEdit is null, if WebApp is null, if context
-	 * parameter does not exist, or if trimmed context parameter's value is
-	 * an empty String.
-	 * 
-	 * @param project IProject instance for which to get the context
-	 * parameter's value.
-	 * @return List of application configuration file names as listed in the
-	 * JSF CONFIG_FILES context parameter ("javax.faces.CONFIG_FILES"); list
-	 * may be empty.
-	 */
-	public static List getConfigFilesFromContextParam(IProject project) {
-		List filesList = Collections.EMPTY_LIST;
-		if (isValidJSFProject(project)) {
-			IModelProvider provider = ModelProviderManager.getModelProvider(project);
-			Object webAppObj = provider.getModelObject();
-			if (webAppObj != null){
-				if (webAppObj instanceof WebApp)
-					filesList = getConfigFilesForJ2EEApp(project);
-				else if (webAppObj instanceof org.eclipse.jst.javaee.web.WebApp)
-					filesList = getConfigFilesForJEEApp((org.eclipse.jst.javaee.web.WebApp)webAppObj);
-			}
-			
-		}
-		return filesList;
-	}
-
-	private static List getConfigFilesForJEEApp(org.eclipse.jst.javaee.web.WebApp webApp) {
-		String filesString = null;
-		List contextParams = webApp.getContextParams();
-		Iterator itContextParams = contextParams.iterator();
-		while (itContextParams.hasNext()) {
-			org.eclipse.jst.javaee.core.ParamValue paramValue = (org.eclipse.jst.javaee.core.ParamValue)itContextParams.next();
-			if (paramValue.getParamName().equals(CONFIG_FILES_CONTEXT_PARAM_NAME)) {
-				filesString = paramValue.getParamValue();
-				break;
-			}
-		}		
-		return parseFilesString(filesString);	
-	}
-
-	private static List getConfigFilesForJ2EEApp(IProject project){
-		List filesList = new ArrayList();
-		WebArtifactEdit webArtifactEdit = WebArtifactEdit.getWebArtifactEditForRead(project);
-		if (webArtifactEdit != null) {
-			try {
-				WebApp webApp = null;
-				try {
-					webApp = webArtifactEdit.getWebApp();
-				} catch(ClassCastException cce) {
-					//occasionally thrown from WTP code in RC3 and possibly later
-					JSFCorePlugin.log(IStatus.ERROR, cce.getLocalizedMessage(), cce);
-					return filesList;
-				}
-				if (webApp != null) {
-					String filesString = null;
-					//need to branch here due to model version differences (BugZilla #119442)
-					if (webApp.getVersionID() == J2EEVersionConstants.WEB_2_3_ID) {
-						EList contexts = webApp.getContexts();
-						Iterator itContexts = contexts.iterator();
-						while (itContexts.hasNext()) {
-							ContextParam contextParam = (ContextParam)itContexts.next();
-							if (contextParam.getParamName().equals(CONFIG_FILES_CONTEXT_PARAM_NAME)) {
-								filesString = contextParam.getParamValue();
-								break;
-							}
-						}
-					} else {
-						EList contextParams = webApp.getContextParams();
-						Iterator itContextParams = contextParams.iterator();
-						while (itContextParams.hasNext()) {
-							ParamValue paramValue = (ParamValue)itContextParams.next();
-							if (paramValue.getName().equals(CONFIG_FILES_CONTEXT_PARAM_NAME)) {
-								filesString = paramValue.getValue();
-								break;
-							}
-						}
-					}					
-					filesList = parseFilesString(filesString);				
-				}
-			} finally {
-				webArtifactEdit.dispose();
-			}
-		}
-
-		return filesList;
-	}
-	
-	private static List parseFilesString(String filesString) {
-		List filesList = new ArrayList();
-		if (filesString != null && filesString.trim().length() > 0) {			
-			StringTokenizer stFilesString = new StringTokenizer(filesString, ","); //$NON-NLS-1$
-			while (stFilesString.hasMoreTokens()) {
-				String configFile = stFilesString.nextToken().trim();
-				filesList.add(configFile);
-			}
-		}
-		return filesList;
-	}
-
-	/**
-	 * Gets list of JAR file names, where each file name represents a JAR on
-	 * the classpath that contains a /META-INF/faces-config.xml entry. Will
-	 * return an empty list if no such JAR files are located.
-	 * 
-	 * @param project IProject instance for which to scan the classpath.
-	 * @return List of JAR file names, where each file name represents a JAR
-	 * on the classpath that contains a ...META-INF/faces-config.xml entry;
-	 * list may be empty.
-	 * @throws CoreException Thrown when underlying calls into JavaCore fail.
-	 * @throws IOException Thrown when attempt to open JAR to determine if it
-	 * contains a /META-INF/faces-config.xml entry fails.
-	 */
-	public static List getConfigFileJARsFromClasspath(IProject project) throws CoreException, IOException {
-		ArrayList JARsList = new ArrayList();
-		if (project.isAccessible()
-		        && project.hasNature(JavaCore.NATURE_ID)) {
-			IJavaProject javaProject = JavaCore.create(project);
-			if (javaProject != null) {
-				IClasspathEntry[] classpathEntries = javaProject.getResolvedClasspath(true);
-				if (classpathEntries != null && classpathEntries.length > 0) {
-					IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-					for (int i = 0; i < classpathEntries.length; i++) {
-						IClasspathEntry classpathEntry = classpathEntries[i];
-						if (classpathEntry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) {
-							IPath libraryPath = classpathEntry.getPath();
-							if (libraryPath.getFileExtension() != null && libraryPath.getFileExtension().length() > 0) {
-								if (libraryPath.getDevice() == null && workspaceRoot.getProject(libraryPath.segment(0)).exists()) {
-									libraryPath = workspaceRoot.getFile(libraryPath).getLocation();
-								}
-								String libraryPathString = libraryPath.toString();
-								JarFile jarFile = null;
-								try {
-									jarFile = new JarFile(libraryPathString);
-									if (jarFile != null) {
-										JarEntry jarEntry = jarFile.getJarEntry(FACES_CONFIG_IN_JAR_PATH);
-										if (jarEntry != null) {
-											JARsList.add(libraryPathString);
-										}
-									}
-								} catch(IOException ioe) {
-									JSFCorePlugin.log(
-											IStatus.ERROR,
-											NLS.bind(Messages.JSFAppConfigUtils_ErrorOpeningJarFile, libraryPathString),
-											ioe);
-								} finally {
-									if (jarFile != null) {
-										jarFile.close();
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		return JARsList;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/RuntimeClasspathJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/RuntimeClasspathJSFAppConfigLocater.java
deleted file mode 100644
index 7cb04b0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/RuntimeClasspathJSFAppConfigLocater.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.ElementChangedEvent;
-import org.eclipse.jdt.core.IElementChangedListener;
-import org.eclipse.jdt.core.IJavaElementDelta;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-
-/**
- * RuntimeClasspathJSFAppConfigLocater attempts to locate application
- * configuration files in JAR files on the runtime classpath. The runtime
- * classpath includes the server runtime classpath and the JAR files that will
- * be deployed to the web application's /WEB-INF/lib folder.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class RuntimeClasspathJSFAppConfigLocater extends AbstractJSFAppConfigLocater
-	implements IElementChangedListener {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.AbstractJSFAppConfigLocater#startLocating()
-	 */
-	public void startLocating() {
-		locateProviders();
-		JavaCore.addElementChangedListener(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsfappconfig.AbstractJSFAppConfigLocater#stopLocating()
-	 */
-	public void stopLocating() {
-		JavaCore.removeElementChangedListener(this);
-	}
-
-	/**
-	 * Locates application configuration resources specified in JAR files on
-	 * the runtime classpath, and updates the set of
-	 * {@link IJSFAppConfigProvider} instances accordingly.
-	 */
-	public void locateProviders() {
-		try {
-			List JARs = JSFAppConfigUtils.getConfigFileJARsFromClasspath(manager.getProject());
-			Iterator itJARs = JARs.iterator();
-			Set newConfigProviders = new LinkedHashSet();
-			while (itJARs.hasNext()) {
-				String JARFilename = (String)itJARs.next();
-				JARFileJSFAppConfigProvider configProvider = new JARFileJSFAppConfigProvider(JARFilename);
-				newConfigProviders.add(configProvider);
-			}
-			updateConfigProviders(newConfigProviders);
-		} catch(CoreException ce) {
-			//log error
-			JSFCorePlugin.log(IStatus.ERROR, ce.getLocalizedMessage(), ce);
-		} catch(IOException ioe) {
-			//log error
-			JSFCorePlugin.log(IStatus.ERROR, ioe.getLocalizedMessage(), ioe);
-		}
-	}
-
-	/**
-	 * Called when a Java element has changed.
-	 * 
-	 * @param event ElementChangedEvent instance describing the change.
-	 */
-	public void elementChanged(ElementChangedEvent event) {
-		if (classpathChanged(event.getDelta())) {
-			locateProviders();
-		}
-	}
-
-	/**
-	 * Recursively tests if the passed IJavaElementDelta instance or any of its
-	 * descendents indicate a classpath change has occurred.
-	 * 
-	 * @param delta IJavaElement instance to be tested.
-	 * @return true if a claspath change has occurred, else false.
-	 */
-	protected boolean classpathChanged(IJavaElementDelta delta) {
-		int deltaFlags = delta.getFlags();
-		if (((deltaFlags & IJavaElementDelta.F_ADDED_TO_CLASSPATH) == IJavaElementDelta.F_ADDED_TO_CLASSPATH) ||
-				((deltaFlags & IJavaElementDelta.F_ARCHIVE_CONTENT_CHANGED) == IJavaElementDelta.F_ARCHIVE_CONTENT_CHANGED) ||
-				((deltaFlags & IJavaElementDelta.F_REMOVED_FROM_CLASSPATH) == IJavaElementDelta.F_REMOVED_FROM_CLASSPATH)) {
-			return true;
-		}  
-		boolean changed = false;
-		IJavaElementDelta[] childDeltas = delta.getAffectedChildren();
-		if (childDeltas != null) {
-			for (int i = 0; i < childDeltas.length; i++) {
-				if (classpathChanged(childDeltas[i])) {
-					changed = true;
-					break;
-				}
-			}
-		}
-		return changed;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/WebContentRelativeJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/WebContentRelativeJSFAppConfigLocater.java
deleted file mode 100644
index 4359d21..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/WebContentRelativeJSFAppConfigLocater.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsfappconfig;
-
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-
-/**
- * WebContentRelativeJSFAppConfigLocater is an abstract base class that
- * attempts to locate specified application configuration files relative to a
- * web content folder. Subclasses must override the getFilenames() method to
- * return a list of filenames that the locateProviders() method will attempt to
- * locate, and call locateProviders().
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class WebContentRelativeJSFAppConfigLocater extends AbstractJSFAppConfigLocater {
-
-	/**
-	 * Locates application configuration resources specified by the filenames
-	 * (relative to the web content folder) returned by getFilenames(), and
-	 * updates the set of {@link IJSFAppConfigProvider} instances accordingly.
-	 */
-	public void locateProviders() {
-		IProject project = manager.getProject();
-		IVirtualFolder webContentFolder = JSFAppConfigUtils.getWebContentFolder(project);
-		if (webContentFolder != null) {
-			List filenames = getFilenames();
-			Iterator itFilenames = filenames.iterator();
-			Set newConfigProviders = new LinkedHashSet();
-			while (itFilenames.hasNext()) {
-				String filename = (String)itFilenames.next();
-				IVirtualResource appConfigResource = webContentFolder.findMember(filename);
-				if (appConfigResource != null && appConfigResource.getType() == IVirtualResource.FILE) {
-					IFile file = (IFile)appConfigResource.getUnderlyingResource();
-					if (file != null && file.exists()) {
-						ArtifactEditJSFAppConfigProvider configProvider = new ArtifactEditJSFAppConfigProvider(file);
-						newConfigProviders.add(configProvider);
-					}
-				}
-			}
-			updateConfigProviders(newConfigProviders);
-		}
-	}
-
-	/**
-	 * Gets a list of Strings representing the filenames (relative to the web
-	 * content folder) that locateProviders() will attempt to locate.
-	 * 
-	 * @return A list of Strings representing the filenames (relative to the
-	 * web content folder) that locateProviders() will attempt to locate.
-	 */
-	protected abstract List getFilenames();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryConfigurationHelper.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryConfigurationHelper.java
deleted file mode 100644
index 3c29cb1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryConfigurationHelper.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration;
-
-import java.util.Collection;
-import java.util.HashSet;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.internal.JSFLibraryReferenceFacadeFactory;
-
-/**
- * Helper class for adopters needing to deal with JSF Library References
- * @since WTP JSF 1.0
- */
-public final class JSFLibraryConfigurationHelper {
-	/**
-	 * container id for JSF Library Classpath Containers 
-	 */
-	public static final String JSF_LIBRARY_CP_CONTAINER_ID="org.eclipse.jst.jsf.core.internal.jsflibrarycontainer";
-
-	/**
-	 * @param project 
-	 * @return collection of references
-	 */
-	public static Collection<JSFLibraryReference> getJSFLibraryReferences(IProject project) {
-		Collection<JSFLibraryReference> results = new HashSet<JSFLibraryReference>();
-		IJavaProject jproj = JavaCore.create(project);
-		try {
-			IClasspathEntry[] entries = jproj.getRawClasspath();
-			boolean foundImpl = false;
-			for (int i=0;i<entries.length;i++){
-				JSFLibraryReference ref = JSFLibraryReferenceFacadeFactory.create(entries[i]);
-				if (ref != null){
-					results.add(ref);
-					if (ref.isJSFImplementation())
-						foundImpl = true;
-				}
-			}
-			if (! foundImpl){
-				results.add(JSFLibraryReferenceFacadeFactory.createServerSuppliedJSFLibRef());
-			}
-		} catch (JavaModelException e) {
-			JSFCorePlugin.log(e, "Exception occurred calling getJSFLibraryReferences for "+project.getName());
-		}
-		return results;
-	}
-
-	/**
-	 * @param cpEntry
-	 * @return boolean indicating that the classpath entry is a JSF Libary Classpath Container
-	 */
-	public static boolean isJSFLibraryContainer(IClasspathEntry cpEntry) {
-		if (cpEntry.getEntryKind() != IClasspathEntry.CPE_CONTAINER)
-			return false;
-		
-		IPath path = cpEntry.getPath();
-		return path != null && path.segmentCount() == 2 && JSF_LIBRARY_CP_CONTAINER_ID.equals(path.segment(0));
-	}
-	
-	/**
-	 * @param project
-	 * @return true if the JSF Faceted project is configured to use system supplied implementation
-	 */
-	public static boolean isConfiguredForSystemSuppliedImplementation(IProject project) {
-		Collection<JSFLibraryReference> refs = getJSFLibraryReferences(project);
-		for(JSFLibraryReference ref : refs){			
-			if (ref instanceof JSFLibraryReferenceServerSupplied)
-				return true;
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReference.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReference.java
deleted file mode 100644
index ee9ed62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReference.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration;
-
-import java.util.Collection;
-
-import org.eclipse.jdt.core.IClasspathEntry;
-
-/**
- * Represents a reference to a JSF Library on a project
- *
- */
-public abstract interface JSFLibraryReference {
-	/**
-	 * @return id for the library
-	 */
-	public String getId();	
-	/**
-	 * @return name
-	 */
-	public String getName();
-	/**
-	 * @return collection of jars as {@link IClasspathEntry}s
-	 */
-	public Collection<IClasspathEntry> getJars();
-	/**
-	 * @return {@link JSFVersion} value
-	 */
-	public JSFVersion getMaxSupportedVersion();
-	/**
-	 * @return label user sees for this library
-	 */
-	public String getLabel();
-	/**
-	 * @return flag 
-	 */
-	public boolean isJSFImplementation();
-	/**
-	 * @return is deployed (marked as J2EE Module Dependency)
-	 */
-	public boolean isDeployed();	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferencePluginProvided.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferencePluginProvided.java
deleted file mode 100644
index 7884124..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferencePluginProvided.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration;
-
-/**
- * A reference to a plugin defined JSF Library
- *
- */
-public interface JSFLibraryReferencePluginProvided extends JSFLibraryReferenceUserDefined {
-	/**
-	 * @return plugin id.  May return null if plugin id cannot be determined.  
-	 */
-	public String getPluginId();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceServerSupplied.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceServerSupplied.java
deleted file mode 100644
index 50617b1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceServerSupplied.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration;
-
-/**
- * @author gekessle
- *
- */
-public interface JSFLibraryReferenceServerSupplied extends
-		JSFLibraryReference {
-	
-	/**
-	 * Constant used for server supplied virtual JSF Library referencew
-	 */
-	public static final String ID = "_ServerSupplied_";
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceUserDefined.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceUserDefined.java
deleted file mode 100644
index 67d8808..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceUserDefined.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration;
-
-
-/**
- * Represents an reference to a user defined JSF Library
- */
-public interface JSFLibraryReferenceUserDefined extends JSFLibraryReference {
-	//
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFVersion.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFVersion.java
deleted file mode 100644
index a0f36cf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFVersion.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration;
-
-/**
- * @author gekessle
- *
- */
-public enum JSFVersion {
-	
-	/**
-	 * Unknown version support
-	 */
-	UNKNOWN, 
-	/**
-	 * Supports JSF Version 1.0
-	 */
-	V1_0,
-	/**
-	 * Supports JSF Version 1.1
-	 */
-	V1_1,
-	/**
-	 * Supports JSF Version 1.1
-	 */
-	V1_2;
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/AbstractJSFLibraryReferenceImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/AbstractJSFLibraryReferenceImpl.java
deleted file mode 100644
index ad6d8fe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/AbstractJSFLibraryReferenceImpl.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration.internal;
-
-
-
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryReference;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFVersion;
-/**
- * @author gekessle
- *
- */
-public abstract class AbstractJSFLibraryReferenceImpl implements JSFLibraryReference {
-	
-	/**
-	 * The {@link org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference} being wrapped
-	 */
-	protected JSFLibraryInternalReference libRef;
-	private String _id;
-	private String _label;
-	private boolean _isImplementation;
-	private boolean _isDeloyed;
-
-	/**
-	 * Constructor for "virtual" JSF Library References like "ServerSupplied"
-	 * @param id
-	 * @param label 
-	 * @param isImplementation 
-	 */
-	public AbstractJSFLibraryReferenceImpl(String id, String label, boolean isImplementation){
-		_id = id;
-		_label = label;
-		_isImplementation = isImplementation;
-	}
-	
-	/**
-	 * Constructor non-virtual library references
-	 * @param libRef
-	 * @param isDeployed 
-	 */
-	public AbstractJSFLibraryReferenceImpl(JSFLibraryInternalReference libRef, boolean isDeployed){
-		this.libRef = libRef;
-		_isDeloyed = isDeployed;
-	}
-	
-	public String getId() {
-		if (libRef != null)
-			return libRef.getID();
-		
-		return _id;
-	}
-
-	public String getLabel() {
-		if (libRef != null)
-			return libRef.getLabel();
-
-		return _label;
-	}
-
-	public boolean isDeployed() {
-		return _isDeloyed;
-	}
-
-	public boolean isJSFImplementation() {
-		if (libRef != null)
-			return libRef.isImplementation();
-		
-		return _isImplementation;
-	}
-	
-	/**
-	 * @return the JSFLibrary underpinning the reference.  
-	 * May be null if the library is missing or cannot be resolved from the registry.
-	 */
-	protected JSFLibrary getLibrary(){
-		return libRef.getLibrary();
-	}
-	
-	public Collection<IClasspathEntry> getJars() {
-		Set<IClasspathEntry> results = new HashSet<IClasspathEntry>();
-		if (getLibrary() != null){
-			List jars = getLibrary().getArchiveFiles();
-			for (Iterator it= jars.iterator();it.hasNext();){
-				ArchiveFile jar = (ArchiveFile)it.next();
-				String path = jar.getResolvedSourceLocation();
-				results.add(JavaCore.newLibraryEntry(new Path(path), null, null));
-			}
-		}			
-		return results;
-	}
-
-	public JSFVersion getMaxSupportedVersion() {
-		if (getLibrary() != null)
-			return adaptVersion(getLibrary().getJSFVersion());
-		return null;
-	}
-
-	private JSFVersion adaptVersion(
-			org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion version) {
-		
-		switch (version.getValue()){
-			case org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion.V1_1:
-				return JSFVersion.V1_1;				
-			case org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion.V1_2:
-				return JSFVersion.V1_2;		
-			default:
-				return JSFVersion.UNKNOWN;			
-				
-		}
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryReference#getName()
-	 */
-	public String getName() {
-		if (getLibrary()!= null) {
-			return getLibrary().getName();
-		}
-		return getId();
-	}
-
-	public String toString(){
-		StringBuffer buf = new StringBuffer("id: ");
-		buf.append(getId());
-		buf.append(", label: ");
-		buf.append(getLabel());
-		buf.append(", isDeployed: ");
-		buf.append(isDeployed());
-		buf.append(", isImpl: ");
-		buf.append(isJSFImplementation());
-		buf.append(", version: ");
-		buf.append(getMaxSupportedVersion().name());
-		
-		return buf.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceFacadeFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceFacadeFactory.java
deleted file mode 100644
index 8f371e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceFacadeFactory.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration.internal;
-
-import org.eclipse.jdt.core.IClasspathAttribute;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jst.j2ee.classpathdep.IClasspathDependencyConstants;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryConfigurationHelper;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryReference;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryReferenceServerSupplied;
-
-/**
- * Factory for producing facade objects for references to the internal EMF JSF Library classes
- */
-public class JSFLibraryReferenceFacadeFactory {
-	/**
-	 * Returns a JSFLibraryReferenceUserDefined or JSFLibraryReferencePluginProvided instance.
-	 * Will not create a JSFLibraryReferenceServerSupplied as there is no cp entry.   Use createServerSuppliedJSFLibRef instead.
-	 * @param cpEntry
-	 * @return an instance of JSFLibraryInternalReference.  Null will be returned if the cpEntry is not a 
-	 */
-	public static JSFLibraryReference create(final IClasspathEntry cpEntry) {
-		if (JSFLibraryConfigurationHelper.isJSFLibraryContainer(cpEntry)){
-			return createReference(cpEntry);
-		}
-		return null;
-	}
-
-	/**
-	 * @return instance of {@link JSFLibraryReferenceServerSupplied}
-	 */
-	public static JSFLibraryReferenceServerSupplied createServerSuppliedJSFLibRef(){
-		return new JSFLibraryReferenceServerSuppliedImpl();
-	}
-
-
-	/**
-	 * @param cpEntry
-	 * @return {@link JSFLibraryReference}
-	 */
-	private static JSFLibraryReference createReference(
-			final IClasspathEntry cpEntry) {
-		
-		String libID = cpEntry.getPath().segment(1).toString();
-		org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference libRef = JSFLibraryRegistryUtil.getInstance().getJSFLibraryReferencebyID(libID);
-		if (libRef!= null){
-			boolean isDeployed = getJ2EEModuleDependency(cpEntry);
-			if (libRef.getLibrary() != null && libRef.getLibrary() instanceof PluginProvidedJSFLibrary)
-				return new JSFLibraryReferencePluginProvidedImpl(libRef, isDeployed);
-			
-			return new JSFLibraryReferenceUserDefinedImpl(libRef, isDeployed);
-		}
-		return null;
-	}
-
-	private static boolean getJ2EEModuleDependency(IClasspathEntry cpEntry) {
-		IClasspathAttribute[] attrs = cpEntry.getExtraAttributes();
-		for (int i=0;i<attrs.length;i++){
-			IClasspathAttribute attr = attrs[i];
-			if (attr.getName().equals(IClasspathDependencyConstants.CLASSPATH_COMPONENT_DEPENDENCY)){
-				return true;
-			}
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferencePluginProvidedImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferencePluginProvidedImpl.java
deleted file mode 100644
index bb847ae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferencePluginProvidedImpl.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration.internal;
-
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryReferencePluginProvided;
-
-/**
- *
- */
-public class JSFLibraryReferencePluginProvidedImpl extends AbstractJSFLibraryReferenceImpl implements JSFLibraryReferencePluginProvided {
-
-	/**
-	 * Constructor
-	 * @param libRef
-	 * @param isDeployed 
-	 */
-	public JSFLibraryReferencePluginProvidedImpl(JSFLibraryInternalReference libRef, boolean isDeployed) {
-		super(libRef, isDeployed);
-	}
-
-	public String getPluginId() {
-		if (getLibrary() != null)
-			return ((PluginProvidedJSFLibrary) getLibrary()).getPluginID();
-		
-		return null;
-	}
-
-	public String toString() {
-		StringBuffer buf = new StringBuffer("PluginProvided: (");
-		buf.append(super.toString());
-		
-		return buf.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceServerSuppliedImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceServerSuppliedImpl.java
deleted file mode 100644
index 6ab76ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceServerSuppliedImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryconfiguration.internal;
-
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryReferenceServerSupplied;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFVersion;
-
-/**
- * @author gekessle
- *
- */
-public class JSFLibraryReferenceServerSuppliedImpl 
-	extends AbstractJSFLibraryReferenceImpl 
-	implements JSFLibraryReferenceServerSupplied {
-	
-	/**
-	 * Constructor
-	 */
-	public JSFLibraryReferenceServerSuppliedImpl(){
-		//TODO: replace label with constant
-		super(JSFLibraryReferenceServerSupplied.ID, "Server Supplied", true);
-	}
-	
-	public String toString() {
-		StringBuffer buf = new StringBuffer("ServerSupplied: (");
-		buf.append(super.toString());
-		buf.append(")");
-		
-		return buf.toString();
-	}
-	
-	protected JSFLibrary getLibrary(){
-		return null;
-	}
-	
-	public JSFVersion getMaxSupportedVersion() {
-		return JSFVersion.UNKNOWN;
-	}
-//
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceUserDefinedImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceUserDefinedImpl.java
deleted file mode 100644
index 98508e0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceUserDefinedImpl.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.core.jsflibraryconfiguration.internal;
-
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryReferenceUserDefined;
-
-/**
- * Implementation of a reference to a user defined JSF Library  
- *
- */
-public class JSFLibraryReferenceUserDefinedImpl extends AbstractJSFLibraryReferenceImpl implements JSFLibraryReferenceUserDefined{
-	/**
-	 * @param libRef of type {@link JSFLibraryInternalReference}
-	 * @param isDeployed
-	 */
-	public JSFLibraryReferenceUserDefinedImpl(
-			JSFLibraryInternalReference libRef, boolean isDeployed) {
-
-		super(libRef, isDeployed);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.jsflibraryconfiguration.internal.AbstractJSFLibraryReferenceImpl#toString()
-	 */
-	public String toString() {
-		StringBuffer buf = new StringBuffer("UserDefined: (");
-		buf.append(super.toString());
-		buf.append(")");
-		
-		return buf.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/InvalidArchiveFilesCreationException.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/InvalidArchiveFilesCreationException.java
deleted file mode 100644
index d76849c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/InvalidArchiveFilesCreationException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsflibraryregistry;
-
-/**
- * Exception class thrown by PluginProvidedJSFLibraryCreationHelper.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @deprecated
- */
-public class InvalidArchiveFilesCreationException extends Exception {
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Creates an instance with the specified message.
-	 * @param msg This instance's message
-	 */
-	public InvalidArchiveFilesCreationException(String msg) {
-		super(msg);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/JSFLibraryArchiveFilesDelegate.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/JSFLibraryArchiveFilesDelegate.java
deleted file mode 100644
index e4422b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/JSFLibraryArchiveFilesDelegate.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsflibraryregistry;
-
-import java.util.Collection;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.osgi.framework.Bundle;
-
-/**
- * Abstract delegate class used by jsfLibraries ext-pt to return collection of 
- * ArchiveFiles to PluginProvidedJSFLibraryCreationHelper.
- * 
- * Caller must first setConfigurationElement(IConfigurationElement element)
- * before a call to getArchiveFiles().
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @deprecated along with the jsflibraries extension-point
- */
-public abstract class JSFLibraryArchiveFilesDelegate {
-	private IConfigurationElement extPtElement;
-	private String libID = null;
-	private IPath pluginPath = null;
-	private String pluginID;
-	private String relativeDestLocation = "WEB-INF/lib"; //$NON-NLS-1$
-
-	/**
-	 * Returns a Collection of <code>org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile</code>
-	 * instances.
-	 * 
-	 * @return A Collection of <code>org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile</code>
-	 * instances
-	 */
-	public abstract Collection getArchiveFiles();
-
-	/**
-	 * Sets the IConfigurationElement instance to be subsequently used to get
-	 * the plugin ID and the name defined for the JSF Library.
-	 * 
-	 * @param extPtElement IConfigurationElement instance
-	 */
-	public final void setConfigurationElement(IConfigurationElement extPtElement){
-		this.extPtElement = extPtElement;
-	}
-
-	/**
-	 * Constructs an instance.
-	 */
-	public JSFLibraryArchiveFilesDelegate() {
-		super();
-	}
-
-	/**
-	 * Sets the relative destination location subsequently used to set the
-	 * corresponding property on each created ArchiveFile.
-	 * 
-	 * @param relPath Relative destination location for ArchiveFile instances
-	 */
-	protected void setRelativeDestinationLocation(String relPath){
-		relativeDestLocation = relPath;
-	}
-	
-	/**
-	 * Returns ArchiveFile where the location is set relative to the plugin.   
-	 * As long as the ArchiveFile is on the local machine somewhere, it should
-	 * be locatable.
-	 *  
-	 * @param relativePathFileName Relative location of the ArchiveFile
-	 * @return ArchiveFile instance.
-	 */
-	protected ArchiveFile createArchiveFile(String relativePathFileName){
-		ArchiveFile file = JSFLibraryRegistryFactory.eINSTANCE.createArchiveFile();
-		file.setRelativeToWorkspace(false);
-		file.setSourceLocation(relativePathFileName);
-		file.setRelativeDestLocation(relativeDestLocation);
-		return file;
-	}
-	
-//	protected ArchiveFile createArchiveFileWithAbsolutePath(String fullPath){
-//		ArchiveFile file = JSFLibraryRegistryFactory.eINSTANCE.createArchiveFile();
-//		file.setRelativeToWorkspace(false);
-//		file.setSourceLocation(fullPath);
-//		file.setRelativeDestLocation(relativeDestLocation);
-//		return file;
-//	}
-
-	/**
-	 * Returns the JSFLibrary ID as set on the extension point.
-	 * 
-	 * @return JSFLibrary ID
-	 */
-	protected String getLibID(){
-		if (libID == null){
-			StringBuffer buf = new StringBuffer(getPluginID());
-			buf.append("/").append(extPtElement.getAttribute(PluginProvidedJSFLibraryCreationHelper.NAME)); //$NON-NLS-1$
-			libID = buf.toString();
-		}
-		return libID;
-	}
-
-	/**
-	 * Returns the plugin's path.
-	 * 
-	 * @return The plugin's path.
-	 */
-	protected IPath getPluginPath(){
-		if (pluginPath == null){
-			Bundle bundle = Platform.getBundle(getPluginID());
-			pluginPath = new Path(bundle.getLocation());
-		}
-		return pluginPath;
-	}
-
-	/**
-	 * Returns the plugin's ID.
-	 * 
-	 * @return The plugin's ID.
-	 */
-	private String getPluginID() {
-		if (pluginID == null){
-			pluginID = extPtElement.getDeclaringExtension().getContributor().getName();
-		}
-		return pluginID;
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/PluginProvidedJSFLibraryArchiveFilesDelegate.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/PluginProvidedJSFLibraryArchiveFilesDelegate.java
deleted file mode 100644
index e260f69..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/PluginProvidedJSFLibraryArchiveFilesDelegate.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.jsflibraryregistry;
-
-import org.eclipse.jst.jsf.core.jsflibraryregistry.internal.PluginProvidedJSFLibraryCreationHelper2;
-
-/**
- * Abstract class to be used for supplying the jar file names for a plugin provided jsf library.
- * <br>Adopters must implement getArchiveFiles() making use of the addArchiveFile(String pluginRootRelativePath) method.
- * <br><em>Note: A plugin providing jsf libraries cannot be jarred at this time. </em>
- * <br><br>ex.
- * <br>  <pre><code>public void getArchiveFiles() {
-						addArchiveFile("/lib/JAR1.jar");
-						addArchiveFile("/lib/JAR2.jar");
-					}
-		</code>
-		</pre>
- *
- * <p><b>Provisional API - subject to change</b></p>
- * 
- */
-public abstract class PluginProvidedJSFLibraryArchiveFilesDelegate {
-	private PluginProvidedJSFLibraryCreationHelper2 helper;
-	
-	/**
-	 * Constructs an instance.
-	 */
-	public PluginProvidedJSFLibraryArchiveFilesDelegate() {
-		super();	
-	}
-	
-	/**
-	 * Concrete delegate must implement this method to define jars in the library.
-	 * Use addJarFile(String pluginRootRelativePath) within this method to add jars to the library.
-	 */
-	public abstract void getArchiveFiles(); 
-	
-	/**
-	 * Adds jar file to the library.  Verification of file existence does not occur at this point.
-	 * 
-	 * Jar must be specified as being relative to the plugin.  
-	 * ex.  "/lib/MyJar.jar" where the lib directory is a child of the root.
-	 *  
-	 * @param pluginRootRelativePath
-	 */
-	protected void addArchiveFile(String pluginRootRelativePath) {
-		helper.addArchiveFile(pluginRootRelativePath);//getArchiveFiles().add(helper.createArchiveFile(pluginRootRelativePath));
-	}
-
-	/**
-	 * Not to be implemented by subclasses
-	 * @param helper
-	 */
-	public void setCreationHelper(
-			PluginProvidedJSFLibraryCreationHelper2 helper) {		
-		this.helper = helper;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/PluginProvidedJSFLibraryCreationHelper.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/PluginProvidedJSFLibraryCreationHelper.java
deleted file mode 100644
index cda0083..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/PluginProvidedJSFLibraryCreationHelper.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsflibraryregistry;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Helper class used to create JSF Libraries from the
- * <code>org.eclipse.jst.jsf.core.jsflibraries</code> extension-point.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @deprecated - clients should not use
- */
-public final class PluginProvidedJSFLibraryCreationHelper {
-	private IConfigurationElement config_element;
-
-	/**
-	 * Key of the 'name' attribute of the extension point.
-	 */
-	public final static String NAME 		= "name"; //$NON-NLS-1$
-	/**
-	 * Key of the 'isImplementation' attribute of the extension point.
-	 */
-	public final static String IS_IMPL 		= "isImplementation"; //$NON-NLS-1$
-	/**
-	 * Key of the 'maxVersionSupported' attribute of the extension point.
-	 */
-	public final static String VERSION 		= "maxVersionSupported"; //$NON-NLS-1$
-	/**
-	 * Key of the 'archiveFilesDelegate' attribute of the extension point.
-	 */
-	public final static String DELEGATE 	= "archiveFilesDelegate"; //$NON-NLS-1$
-
-	/**
-	 * Creates an instance with the specified IConfigurationElement instance.
-	 * 
-	 * @param jsfLibrary IConfigurationElement instance
-	 */
-	public PluginProvidedJSFLibraryCreationHelper (IConfigurationElement jsfLibrary){
-		this.config_element = jsfLibrary;
-	}
-
-	/**
-	 * Creates a new PluginProvidedJSFLibrary from the JSFLibrary extension point.
-	 * 
-	 * @return PluginProvidedJSFLibrary instance.
-	 */
-	public JSFLibrary create(){
-		PluginProvidedJSFLibrary newLib = JSFLibraryRegistryFactory.eINSTANCE.createPluginProvidedJSFLibrary();
-//		newLib.setID(getLibID());
-		newLib.setPluginID(getPluginID());
-		newLib.setName(config_element.getAttribute(NAME));
-		newLib.setImplementation(config_element.getAttribute(IS_IMPL).equals("true") ? true : false); //$NON-NLS-1$		
-		newLib.setJSFVersion(JSFVersion.getJSFVersion(config_element.getAttribute(VERSION)));
-		
-		try {
-			addArchives(newLib);			
-			return newLib;
-		} catch (Exception e) {
-			JSFCorePlugin.log(
-					e,
-					NLS.bind(
-							Messages.PluginProvidedJSFLibraryCreationHelper_ErrorCreating,
-							newLib.getName()));
-		}
-		return null;
-	}
-
-	/**
-	 * Adds ArchiveFile instances to the specified JSFLibrary instance.
-	 * 
-	 * @param newLib JSFLibrary instance
-	 * @throws InvalidArchiveFilesCreationException on attempt to create
-	 * multiple instances at same location.
-	 * @throws CoreException on core failure.
-	 */
-	private void addArchives(JSFLibrary newLib) throws InvalidArchiveFilesCreationException, CoreException {
-		JSFLibraryArchiveFilesDelegate jarCol = null;
-		ArchiveFile jar = null;
-
-		jarCol = (JSFLibraryArchiveFilesDelegate)config_element.createExecutableExtension(DELEGATE);
-		if (jarCol != null){
-			jarCol.setConfigurationElement(config_element);
-			Collection jars = jarCol.getArchiveFiles();
-			if (jars == null)//TODO: better validation and error handling
-				return;
-			Iterator it = jars.iterator();
-			while (it.hasNext()){
-				Object aJar = it.next();
-				if (aJar instanceof ArchiveFile){//for now check to see ArchiveFiles were being returned
-					jar = (ArchiveFile)aJar;
-					if (!newLib.containsArchiveFile(jar.getSourceLocation()))
-						newLib.getArchiveFiles().add(jar);
-				}
-				else {
-					throw new InvalidArchiveFilesCreationException(
-							NLS.bind(
-									Messages.PluginProvidedJSFLibraryCreationHelper_ErrorMultipleDefinition,
-									jar.getSourceLocation(),
-									config_element.getName()));
-				}
-					
-			}
-		}
-	}
-	
-	/**
-	 * Returns the plugin's ID.
-	 * 
-	 * @return The plugin's ID
-	 */
-	private String getPluginID() {
-		return config_element.getDeclaringExtension().getContributor().getName();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/internal/PluginProvidedJSFLibraryCreationHelper2.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/internal/PluginProvidedJSFLibraryCreationHelper2.java
deleted file mode 100644
index 7c280ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/internal/PluginProvidedJSFLibraryCreationHelper2.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsflibraryregistry.internal;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-import org.eclipse.jst.jsf.core.jsflibraryregistry.PluginProvidedJSFLibraryArchiveFilesDelegate;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Helper class used to create plugin-rovided JSF Libraries from the
- * <code>org.eclipse.jst.jsf.core.pluginProvidedJsfLibraries</code> extension-point.
- * <br>
- * 
- * @author Gerry Kessler - Oracle
- */
-public final class PluginProvidedJSFLibraryCreationHelper2 {
-	private PluginProvidedJSFLibrary newLib;
-	private IConfigurationElement config_element;
-	private String relativeDestLocation = "WEB-INF/lib"; //$NON-NLS-1$
-	
-	/**
-	 * Key of the 'name' attribute of the extension point.
-	 */
-	public final static String NAME 		= "name"; //$NON-NLS-1$
-	/**
-	 * Key of the 'isImplementation' attribute of the extension point.
-	 */
-	public final static String IS_IMPL 		= "isImplementation"; //$NON-NLS-1$
-	/**
-	 * Key of the 'maxVersionSupported' attribute of the extension point.
-	 */
-	public final static String VERSION 		= "maxVersionSupported"; //$NON-NLS-1$
-	/**
-	 * Key of the 'archiveFilesDelegate' attribute of the extension point.
-	 */
-	public final static String DELEGATE 	= "archiveFilesDelegate"; //$NON-NLS-1$
-	/**
-	 * Key of the 'label' attribute of the extension point.
-	 */
-	public final static String LABEL 		= "label"; //$NON-NLS-1$
-	
-	/**
-	 * Creates an instance with the specified IConfigurationElement instance.
-	 * 
-	 * @param jsfLibrary IConfigurationElement instance
-	 */
-	public PluginProvidedJSFLibraryCreationHelper2 (IConfigurationElement jsfLibrary){
-		this.config_element = jsfLibrary;
-	}
-	
-	/**
-	 * Add a jar file to the library
-	 * @param pluginRootRelativePath
-	 */
-	public void addArchiveFile(String pluginRootRelativePath) {
-		ArchiveFile jar = createArchiveFile(pluginRootRelativePath);
-		if (!newLib.containsArchiveFile(jar.getSourceLocation()))
-			newLib.getArchiveFiles().add(jar);
-	}
-	
-	/**
-	 * Creates a new PluginProvidedJSFLibrary from the JSFLibrary extension point.
-	 * 
-	 * @return PluginProvidedJSFLibrary instance.
-	 */
-	public JSFLibrary create(){
-		newLib = JSFLibraryRegistryFactory.eINSTANCE.createPluginProvidedJSFLibrary();
-		newLib.setPluginID(getPluginID());
-		newLib.setName(config_element.getAttribute(NAME));
-		String label = config_element.getAttribute(LABEL);
-		if (label != null && label.length() > 0){
-			newLib.setLabel(label);
-		}
-		newLib.setImplementation(config_element.getAttribute(IS_IMPL).equals("true") ? true : false); //$NON-NLS-1$		
-		newLib.setJSFVersion(JSFVersion.getJSFVersion(config_element.getAttribute(VERSION)));
-		
-		try {
-			addArchives();			
-			return newLib;
-		} catch (Exception e) {
-			JSFCorePlugin.log(
-					e,
-					NLS.bind(
-							Messages.PluginProvidedJSFLibraryCreationHelper_ErrorCreating,
-							newLib.getName()));
-		}
-		return null;
-	}
-
-	/**
-	 * Adds ArchiveFile instances to the specified JSFLibrary instance.
-	 * 
-	 * @param newLib JSFLibrary instance
-	 * @throws CoreException on core failure.
-	 */
-	private void addArchives() throws CoreException {
-		PluginProvidedJSFLibraryArchiveFilesDelegate jarCol = null;
-
-		jarCol = (PluginProvidedJSFLibraryArchiveFilesDelegate)config_element.createExecutableExtension(DELEGATE);
-		if (jarCol != null){
-			jarCol.setCreationHelper(this);
-			jarCol.getArchiveFiles();
-		}
-	}
-	/**
-	 * Returns ArchiveFile where the location is set relative to the plugin.   
-	 * As long as the ArchiveFile is on the local machine somewhere, it should
-	 * be locatable.
-	 *  
-	 * @param relativePathFileName Relative location of the ArchiveFile
-	 * @return ArchiveFile instance.
-	 */
-	private ArchiveFile createArchiveFile(String pluginRootRelativePath){
-		ArchiveFile file = JSFLibraryRegistryFactory.eINSTANCE.createArchiveFile();
-		file.setRelativeToWorkspace(false);
-		file.setSourceLocation(pluginRootRelativePath);
-		file.setRelativeDestLocation(relativeDestLocation);
-		return file;
-	}
-
-	/**
-	 * Returns the plugin's ID.
-	 * 
-	 * @return The plugin's ID
-	 */
-	private String getPluginID() {
-		return config_element.getDeclaringExtension().getContributor().getName();
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/constraint/MemberConstraint.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/constraint/MemberConstraint.java
deleted file mode 100644
index e6e69ca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/constraint/MemberConstraint.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.set.constraint;
-
-import org.eclipse.emf.common.util.BasicDiagnostic;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.sets.AxiomaticSet;
-import org.eclipse.jst.jsf.common.sets.constraint.AbstractSetConstraint;
-
-/**
- * A set constraint that is satisfied if a test set contains all of the specified
- * mustBeMembers.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class MemberConstraint extends AbstractSetConstraint 
-{
-    private final AxiomaticSet      _mustBeMembers;
-    
-    /**
-     * @param mustBeMembers -- the set of objects that must occur in the
-     * input set for the constraint to satisfy.  
-     */
-    public MemberConstraint(AxiomaticSet  mustBeMembers)
-    {
-        _mustBeMembers = mustBeMembers;
-    }
-    
-    /**
-     * Members of set must be comparable with thos in mustBeMembers using equals()
-     * @param set 
-     * @return whether or not the constraint is satisfied.  If not satisfied, the
-     * diagnostic's data array will contain the objects that are missing.
-     */
-    public Diagnostic isSatisfied(AxiomaticSet set) 
-    {
-        // the constraint is satisfied iff _mustBeMembers is a subset
-        // of set.  In other words, if every member of _mustBeMembers
-        // is also in set.
-        
-        // we  want to take _mustBeMembers - set.  If the result is empty, then
-        // all of the required elements are members of set.  If the set is non-empty,
-        // this tells us what is missing
-        final AxiomaticSet complement = _mustBeMembers.subtract(set);
-        
-        if (complement.isEmpty())
-        {
-            return Diagnostic.OK_INSTANCE;
-        }
-
-        return new BasicDiagnostic(Diagnostic.ERROR, this.getClass().getName(),
-            0, "Failed membership constraint", complement.toArray());
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/mapping/ElementToTagIdentifierMapping.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/mapping/ElementToTagIdentifierMapping.java
deleted file mode 100644
index 5af60bf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/set/mapping/ElementToTagIdentifierMapping.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.set.mapping;
-
-import org.eclipse.jst.jsf.common.sets.mapping.AbstractObjectInjectiveSetMapping;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.w3c.dom.Element;
-
-/**
- * Converts a set of DOM element's to a set of (object) injective set
- * of TagIdentifiers.  If the element is a JSP tag, the tag uri will
- * be looked up.
- * 
- * IMPORTANT: the returned TagIdentifiers are wrapper objects, so they only
- * maintain immutability and idempotency as long as the input dom elements
- * do not change. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class ElementToTagIdentifierMapping extends
-        AbstractObjectInjectiveSetMapping 
-{
-    public Object map(Object element) {
-        Element domElement = (Element) element;
-        return TagIdentifierFactory.createDocumentTagWrapper(domElement);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/EvaluationException.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/EvaluationException.java
deleted file mode 100644
index 0774212..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/EvaluationException.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.tagmatcher;
-
-/**
- * Wraps an exception thrown during algorithm evaluation
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class EvaluationException extends RuntimeException {
-
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -3250608181004283586L;
-
-    /**
-     * 
-     */
-    public EvaluationException() {
-        super();
-    }
-
-    /**
-     * @param message
-     */
-    public EvaluationException(String message) {
-        super(message);
-    }
-
-    /**
-     * @param cause
-     */
-    public EvaluationException(Throwable cause) {
-        super(cause);
-    }
-
-    /**
-     * @param message
-     * @param cause
-     */
-    public EvaluationException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/InvalidExpressionException.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/InvalidExpressionException.java
deleted file mode 100644
index 2651db8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/InvalidExpressionException.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.tagmatcher;
-
-/**
- * Indicates an exception trapped while compiling or evaluating an
- * expression.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class InvalidExpressionException extends RuntimeException {
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 1445871263234840885L;
-
-    /**
-     * @see RuntimeException
-     */
-    public InvalidExpressionException() {
-        super();
-    }
-
-    /**
-     * @param message
-     * @param cause
-     */
-    public InvalidExpressionException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-    /**
-     * @param message
-     */
-    public InvalidExpressionException(String message) {
-        super(message);
-    }
-
-    /**
-     * @param cause
-     */
-    public InvalidExpressionException(Throwable cause) {
-        super(cause);
-    }
-    
-    
-    
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/TagMatchingAlgorithm.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/TagMatchingAlgorithm.java
deleted file mode 100644
index 11bce86..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/TagMatchingAlgorithm.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.tagmatcher;
-
-import org.eclipse.jst.jsf.common.sets.AxiomaticSet;
-import org.w3c.dom.Node;
-
-/**
- * An algorithm that can be applied at a particular DOM node.  The result
- * may be expressed as a boolean or a set of matching nodes.  The following
- * are equivalent:
- * 
- *    false and empty set
- *    true and non-empty set
- * 
- * Concrete implementations must be idempotent on evaluate():
- * 
- * 1) evaluate(node) must always return the same set if called repeatedly on
- *    the same node in the same DOM tree.
- * 2) evaluate must be able to be called on any number of nodes in order and always
- * produce the same result independent of what was called before and in what order.
- *  
- * <p><b>Provisional API - subject to change</b></p>
- *
- * @author cbateman
- *
- */
-public abstract class TagMatchingAlgorithm 
-{
-    private boolean             _isInvalid; // = false;
-    
-    private boolean             _isInitialized;
-    /**
-     * The expression being passed to the algorithm
-     */
-    protected final String      _expression;
-    
-    /**
-     * Constructor.
-     * 
-     * @param expression
-     */
-    protected TagMatchingAlgorithm(String expression)
-    {
-        _expression = expression;
-    }
-    
-    /**
-     * Called exactly once to initialize any pre-evaluation setup for
-     * the expression set for the algorithm.  This is public to allow
-     * the client control when this initialization occurs in case it is expensive.
-     * evaluate() will call this method automatically if it has never been called
-     * @throws InvalidExpressionException if the underlying algorithm throws an 
-     * exception during init
-     * @throws IllegalStateException if it has already been determined that the
-     * expression is invalid.
-     */
-    public final void initialize() 
-    {
-        if (_isInvalid)
-        {
-            throw new IllegalStateException("Expression: "+_expression+" has already been determined to be invalid");
-        }
-        
-        if (!_isInitialized)
-        {
-            try
-            {
-                doInitialize();
-            }
-            catch (Exception e)
-            {
-                _isInvalid = true;
-                throw new InvalidExpressionException(e);
-            }
-            _isInitialized = true;
-        }
-    }
-    
-    /**
-     * @param applyTo
-     * @return the set matching the configured expression applied to applyTo
-     * using the algorithm represented by this instance.
-     * @throws InvalidExpressionException of a problem occurs initializing the expression
-     * @throws EvaluationException if the internal algorithm throws an exception while
-     * evaluating.
-     * @throws IllegalStateException if evaluate is called again once InvalidExpressionException
-     * has already been thrown.
-     */
-    public final AxiomaticSet evaluate(Node applyTo)
-    {
-        initialize();
-        return doEvaluate(applyTo);
-    }
-    
-    /**
-     * Implementers must override to the evaluation of the target,expression pair
-     * @param target
-     * @return the algorithm evaluated with
-     */
-    protected abstract AxiomaticSet doEvaluate(Node target);
-    
-    /**
-     * Do any initialization that is required before the algorithm is used
-     * to evaluate an expression on any node.  This will get called exactly once and
-     * is guaranteed to be called, at latest, immediately before doEvaluate
-     * 
-     * Method may throw runtime exceptions.  These will be repropagated as
-     * InvalidExpressionException's with the original exception wrapped.
-     * @throws Exception 
-     */
-    protected abstract void doInitialize() throws Exception;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/XPathMatchingAlgorithm.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/XPathMatchingAlgorithm.java
deleted file mode 100644
index 9ce74dd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/tagmatcher/XPathMatchingAlgorithm.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.core.tagmatcher;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpression;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.eclipse.jst.jsf.common.sets.AxiomaticSet;
-import org.eclipse.jst.jsf.common.sets.ConcreteAxiomaticSet;
-import org.eclipse.jst.jsf.common.sets.NodeSet;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * A algorithm that uses an XPath expression to evaluate a result.  The
- * algorithm assumes (although cannot verify beforehand) that the expression
- * provided can be evaluated with a node set return type (see JAXP).  If the
- * algorithm's underlying XPath evaluator throws an exception indicating that
- * the return type cannot be coerced to a node set, the algorithm will return
- * an empty set (no match) unless the strictMatching flag is set to true, in which
- * case it will re-throw the exception wrapped as an unchecked EvaluationException.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class XPathMatchingAlgorithm extends TagMatchingAlgorithm 
-{
-    private final boolean  _isStrictMatching;
-    private final XPath    _xpath;
-    private XPathExpression _compiledExpr;
-    
-    /**
-     * @param expression
-     */
-    public XPathMatchingAlgorithm(String expression)
-    {
-        this(expression, false);
-    }
-
-    /**
-     * @param expression
-     * @param isStrictMatching 
-     */
-    public XPathMatchingAlgorithm(String expression, boolean isStrictMatching) 
-    {
-        super(expression);
-        _isStrictMatching = isStrictMatching;
-        _xpath = XPathFactory.newInstance().newXPath();
-    }
-
-    protected AxiomaticSet doEvaluate(Node target) 
-    {
-        try
-        {
-            NodeList nodeList = 
-                (NodeList) _compiledExpr.evaluate(target, XPathConstants.NODESET);
-            return new NodeSet(nodeList);
-        }
-        catch (XPathExpressionException  xpam)
-        {
-            if (_isStrictMatching)
-            {
-                throw new EvaluationException(xpam);
-            }
-            // if not strict checking, return empty set
-            return new ConcreteAxiomaticSet();
-        }
-    }
-
-    protected void doInitialize() throws XPathExpressionException {
-        // compile the xpath expr
-        _compiledExpr = _xpath.compile(_expression);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/DesignTimeApplicationManager.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/DesignTimeApplicationManager.java
deleted file mode 100644
index 5c6b21e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/DesignTimeApplicationManager.java
+++ /dev/null
@@ -1,358 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime;
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.context.AbstractDTExternalContextFactory;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.eclipse.jst.jsf.designtime.context.IExternalContextFactoryLocator;
-import org.eclipse.jst.jsf.designtime.el.AbstractDTMethodResolver;
-import org.eclipse.jst.jsf.designtime.el.AbstractDTPropertyResolver;
-import org.eclipse.jst.jsf.designtime.el.AbstractDTVariableResolver;
-
-
-/**
- * Per-web-application manager that manages design time information for a corresponding
- * project.
- * 
- * @author cbateman
- *
- */
-public final class DesignTimeApplicationManager 
-{
-    // TODO: load from property file?
-    private static final String   PROPERTY_QUALIFIER = "org.eclipse.jst.jsf.designtime.internal"; //$NON-NLS-1$
-    private static final String   SESSION_PROPERTY_NAME_PROJECT = "DesignTimeApplicationManager"; //$NON-NLS-1$
-    private static final QualifiedName  SESSION_PROPERTY_KEY_PROJECT 
-        = new QualifiedName(PROPERTY_QUALIFIER, SESSION_PROPERTY_NAME_PROJECT);
-    
-    private static final String   SESSION_PROPERTY_NAME_FACES_CONTEXT = "DTFacesContext"; //$NON-NLS-1$
-    private static final QualifiedName SESSION_PROPERTY_KEY_FACES_CONTEXT
-       =  new QualifiedName(PROPERTY_QUALIFIER, SESSION_PROPERTY_NAME_FACES_CONTEXT);
-    
-    private static final String   PERSIST_PROPERTY_NAME_EXTERNAL_CONTEXT_PROVIDER =
-        "ExternalContextProvider"; //$NON-NLS-1$
-    private static final QualifiedName PERSIST_PROPERTY_KEY_EXTERNAL_CONTEXT_PROVIDER =
-        new QualifiedName(PROPERTY_QUALIFIER, PERSIST_PROPERTY_NAME_EXTERNAL_CONTEXT_PROVIDER);
-    
-    private static final String   PERSIST_PROPERTY_NAME_VARIABLE_RESOLVER_PROVIDER =
-        "VariableResolverProvider"; //$NON-NLS-1$
-    private static final QualifiedName PERSIST_PROPERTY_KEY_VARIABLE_RESOLVER_PROVIDER 
-       = new QualifiedName(PROPERTY_QUALIFIER, PERSIST_PROPERTY_NAME_VARIABLE_RESOLVER_PROVIDER);
-
-    private static final String   PERSIST_PROPERTY_NAME_PROPERTY_RESOLVER_PROVIDER =
-        "PropertyResolverProvider"; //$NON-NLS-1$
-    private static final QualifiedName PERSIST_PROPERTY_KEY_PROPERTY_RESOLVER_PROVIDER =
-        new QualifiedName(PROPERTY_QUALIFIER, PERSIST_PROPERTY_NAME_PROPERTY_RESOLVER_PROVIDER);
-
-    private static final String    PERSIST_PROPERTY_NAME_METHOD_RESOLVER_PROVIDER =
-        "MethodResolverProvider"; //$NON-NLS-1$
-    private static final QualifiedName PERSIST_PROPERTY_KEY_METHOD_RESOLVER_PROVIDER =
-        new QualifiedName(PROPERTY_QUALIFIER, PERSIST_PROPERTY_NAME_METHOD_RESOLVER_PROVIDER);
-
-    private static final String   DEFAULT_EXTERNAL_CONTEXT_ID = 
-        "org.eclipse.jst.jsf.core.externalcontext.default"; //$NON-NLS-1$
-    
-    private static final String   DEFAULT_VARIABLE_RESOLVER_ID = 
-        "org.eclipse.jst.jsf.core.variableresolver.default"; //$NON-NLS-1$
-    
-    private static final String   DEFAULT_PROPERTY_RESOLVER_ID =
-        "org.eclipse.jst.jsf.core.propertyresolver.default"; //$NON-NLS-1$
-        
-    private static final String   DEFAULT_METHOD_RESOLVER_ID =
-        "org.eclipse.jst.jsf.core.methodresolver.default"; //$NON-NLS-1$
-
-    /**
-     * @param project
-     * @return the app manager associated with project
-     */
-    public final static DesignTimeApplicationManager getInstance(IProject project)
-    {
-        if (project == null)
-        {
-            return null;
-        }
-        
-        try
-        {
-            synchronized(project)
-            {
-                DesignTimeApplicationManager manager = 
-                    (DesignTimeApplicationManager) project.getSessionProperty(SESSION_PROPERTY_KEY_PROJECT);
-
-                if (manager == null)
-                {
-                    manager = new DesignTimeApplicationManager(project);
-                    project.setSessionProperty(SESSION_PROPERTY_KEY_PROJECT, manager);
-                }
-                // bug 147729: if project was renamed, the project param will be
-                // valid, but it will not be in sync with the one for _project
-                // unfortunately, since we are using session propertie
-                else if (!project.equals(manager._project))
-                {
-                    manager._project = project;
-                }
-
-                return manager;
-            }
-        }
-        catch (CoreException ce)
-        {
-            Platform.getLog(JSFCorePlugin.getDefault().getBundle()).log(new Status(IStatus.ERROR, JSFCorePlugin.getDefault().getBundle().getSymbolicName(), 0, "Problem loading design time appmanager", new Throwable(ce))); //$NON-NLS-1$
-        }
-        
-        return null;
-    }
-    
-    // instance definition
-    // _project must be writable in case the manager needs to be retargetted
-    // after a rename/move etc.
-    private IProject                                    _project;
-    private final IExternalContextFactoryLocator        _locator;
-    
-    private DesignTimeApplicationManager(IProject project)
-    {
-        _project = project;
-        _locator = new MyExternalContextFactoryLocator();
-    }
-    
-    /**
-     * @param file must not be null
-     * @return the faces context for the file or null if not found
-     */
-    public DTFacesContext getFacesContext(IFile file)
-    {
-        assert file != null;
-        
-        try
-        {
-            synchronized(file)
-            {
-                Object context = file.getSessionProperty(SESSION_PROPERTY_KEY_FACES_CONTEXT);
-                
-                if (context == null)
-                {
-                    context = new DTFacesContext(_locator);
-                    file.setSessionProperty(SESSION_PROPERTY_KEY_PROJECT, context);
-                }
-                
-                return (DTFacesContext) context;
-            }
-        }
-        catch (CoreException ce)
-        {
-            Platform.getLog(JSFCorePlugin.getDefault().getBundle())
-                .log(new Status(IStatus.ERROR, 
-                        JSFCorePlugin.getDefault().getBundle().getSymbolicName(), 
-                        0, "Problem loading design time facescontext",  //$NON-NLS-1$
-                        new Throwable(ce)));
-        }
-        
-        return null;
-    }
-    
-    /**
-     * @param resolverPluginId
-     * @throws CoreException
-     */
-    public synchronized void setExternalContextProvider(final String resolverPluginId)
-                                throws CoreException
-    {
-        _project.setPersistentProperty
-            (PERSIST_PROPERTY_KEY_EXTERNAL_CONTEXT_PROVIDER, resolverPluginId);
-    }
-    
-    /**
-     * @return the id of the active design time external context provider
-     */
-    public synchronized String getExternalContextProvider()
-    {
-        return getResolverId(PERSIST_PROPERTY_KEY_EXTERNAL_CONTEXT_PROVIDER,
-                DEFAULT_EXTERNAL_CONTEXT_ID);
-    }
-    
-    /**
-     * @return the designtime variable resolver for this application
-     */
-    public synchronized AbstractDTVariableResolver getVariableResolver()
-    {
-        return getResolver(PERSIST_PROPERTY_KEY_VARIABLE_RESOLVER_PROVIDER,
-                                                        JSFCorePlugin.getVariableResolvers(),
-                                                        DEFAULT_VARIABLE_RESOLVER_ID);
-    }
-    
-    /**
-     * Sets the plugin used to determine the designtime variable resolver.  To 
-     * reset to the default, pass null.
-     * 
-     * @param resolverPluginId
-     * @throws CoreException -- if the setting the new value fails
-     */
-    public synchronized void setVariableResolverProvider(final String resolverPluginId)
-                                throws CoreException
-    {
-        _project.setPersistentProperty
-            (PERSIST_PROPERTY_KEY_VARIABLE_RESOLVER_PROVIDER, resolverPluginId);
-    }
-    
-    /**
-     * @return the id of the active design time variable resolver
-     */
-    public synchronized String getVariableResolverProvider()
-    {
-        return getResolverId(PERSIST_PROPERTY_KEY_VARIABLE_RESOLVER_PROVIDER,
-                             DEFAULT_VARIABLE_RESOLVER_ID);
-    }
-    
-    
-    /**
-     * @return the designtime property resolver for this application 
-     */
-    public synchronized AbstractDTPropertyResolver getPropertyResolver()
-    {
-        return getResolver(PERSIST_PROPERTY_KEY_PROPERTY_RESOLVER_PROVIDER,
-                JSFCorePlugin.getPropertyResolvers(),
-                DEFAULT_PROPERTY_RESOLVER_ID);
-    }
-    
-    /**
-     * @param resolverPluginId
-     * @throws CoreException -- if setting the provider fails
-     */
-    public synchronized void setPropertyResolverProvider(final String resolverPluginId)
-                                                  throws CoreException
-    {
-        _project.setPersistentProperty
-            (PERSIST_PROPERTY_KEY_PROPERTY_RESOLVER_PROVIDER, resolverPluginId);       
-    }
-
-    /**
-     * @return the id of the active design time variable resolver
-     */
-    public synchronized String getPropertyResolverProvider()
-    {
-        return getResolverId(PERSIST_PROPERTY_KEY_PROPERTY_RESOLVER_PROVIDER,
-                             DEFAULT_PROPERTY_RESOLVER_ID);
-    }
-
-    /**
-     * @return the designtime method resolver for this application
-     */
-    public synchronized AbstractDTMethodResolver getMethodResolver()
-    {
-        return getResolver(PERSIST_PROPERTY_KEY_METHOD_RESOLVER_PROVIDER,
-                JSFCorePlugin.getMethodResolvers(),
-                DEFAULT_METHOD_RESOLVER_ID);
-    }
-
-    /**
-     * @param resolverPluginId
-     * @throws CoreException -- if setting the plugin fails
-     */
-    public synchronized void setMethodResolverProvider(final String resolverPluginId)
-                                            throws CoreException
-    {
-        _project.setPersistentProperty
-            (PERSIST_PROPERTY_KEY_METHOD_RESOLVER_PROVIDER, resolverPluginId);       
-
-    }
-    
-    /**
-     * @return the id of the active design time variable resolver
-     */
-    public synchronized String getMethodResolverProvider()
-    {
-        return getResolverId(PERSIST_PROPERTY_KEY_METHOD_RESOLVER_PROVIDER,
-                             DEFAULT_METHOD_RESOLVER_ID);
-    }
-
-    
-    private <ResolverProvider> ResolverProvider getResolver(final QualifiedName pluginKey,
-                               final Map<String, ResolverProvider>   registry,
-                               final String defaultId)
-    {
-        String pluginId = defaultId;
-        
-        try
-        {
-           pluginId =
-                _project.getPersistentProperty(pluginKey);
-           
-           // if don't have the plugin in the registry, then 
-           // revert to default
-           if (pluginId == null)
-           {
-               pluginId = defaultId;
-           }
-           else if (registry.get(pluginId) == null)
-           {
-               JSFCorePlugin.getDefault().getLog().log(
-                       new Status(IStatus.WARNING, JSFCorePlugin.PLUGIN_ID,
-                                   0, "Plugin: "+pluginId+" not found", //$NON-NLS-1$ //$NON-NLS-2$
-                                   new Throwable()));
-               pluginId = defaultId;
-           }
-        }
-        catch (CoreException ce)
-        {
-            JSFCorePlugin.getDefault().getLog().log(
-                    new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID,
-                                0, "Error getting plugin property", //$NON-NLS-1$
-                                ce));
-            pluginId = defaultId;
-            // fall-through and use the default
-        }
-
-        return registry.get(pluginId);
-    }
-    
-    private String getResolverId(final QualifiedName key, final String defaultValue)
-    {
-        String id = defaultValue; 
-
-        try
-        {
-            final String userId = 
-                _project.getPersistentProperty(key);
-            
-            if (userId != null)
-            {
-                id = userId;
-            }
-        }
-        catch (CoreException ce)
-        {
-            // do nothing; fall through and return default
-        }
-
-        return id;
-    }
-    
-    private class MyExternalContextFactoryLocator implements IExternalContextFactoryLocator
-    {
-        public AbstractDTExternalContextFactory getFactory() {
-            return getResolver(PERSIST_PROPERTY_KEY_EXTERNAL_CONTEXT_PROVIDER,
-                    JSFCorePlugin.getExternalContextProviders(),
-                        DEFAULT_EXTERNAL_CONTEXT_ID);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/AbstractDTExternalContext.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/AbstractDTExternalContext.java
deleted file mode 100644
index 44c2fc6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/AbstractDTExternalContext.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.context;
-
-import java.util.Collections;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolConstants;
-
-/**
- * The parent of all IDTExternalContext implementations
- * 
- * Clients must sub-class to create IDTExternalContext implementations
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDTExternalContext implements IDTExternalContext 
-{
-    
-    /**
-     * Return a map of available symbols in each of the masked scopes
-     * indexed by symbol name
-     * 
-     * Called by {@link #getMapForScope(int)} to satify the interface.
-     * If null is returned {@link #getMapForScope(int)} will automatically
-     * return an EMPTY_MAP.
-     * 
-     * @param scopeMask
-     * @return the map of symbols
-     */
-    protected abstract Map<String, ISymbol> doGetMapForScope(int scopeMask);
-    
-    
-    public final  Map<String, ISymbol> getMapForScope(final int scopeMask)
-    {
-        Map<String, ISymbol> mapForScope = doGetMapForScope(scopeMask);
-        
-        if (mapForScope == null)
-        {
-            mapForScope = Collections.EMPTY_MAP;
-        }
-        else
-        {
-            mapForScope = Collections.unmodifiableMap(mapForScope);
-        }
-        return mapForScope;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.designtime.context.IDTExternalContext#getRequestMap()
-     */
-    public final Map<String, ISymbol> getRequestMap()
-    {
-        return getMapForScope(ISymbolConstants.SYMBOL_SCOPE_REQUEST);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.designtime.context.IDTExternalContext#getSessionMap()
-     */
-    public final Map<String, ISymbol> getSessionMap()
-    {
-        return getMapForScope(ISymbolConstants.SYMBOL_SCOPE_SESSION);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.designtime.context.IDTExternalContext#getApplicationMap()
-     */
-    public final Map<String, ISymbol> getApplicationMap()
-    {
-        return getMapForScope(ISymbolConstants.SYMBOL_SCOPE_APPLICATION);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.designtime.context.IDTExternalContext#getNoneMap()
-     */
-    public final Map<String, ISymbol> getNoneMap() 
-    {
-        return getMapForScope(ISymbolConstants.SYMBOL_SCOPE_NONE);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/AbstractDTExternalContextFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/AbstractDTExternalContextFactory.java
deleted file mode 100644
index b2fbbbf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/AbstractDTExternalContextFactory.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.context;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * Super-class of all external context factories
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDTExternalContextFactory 
-{
-    /**
-     * @param containerContext
-     * @return a new IDTExternalContext for the containerContext refered 
-     * to by containerContext.
-     */
-    public abstract IDTExternalContext create(IAdaptable containerContext);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/AbstractExternalContextFactoryLocator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/AbstractExternalContextFactoryLocator.java
deleted file mode 100644
index 77ae086..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/AbstractExternalContextFactoryLocator.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.context;
-
-/**
- * Parent of all implementers of IExternalContextFactoryLocator
- * @author cbateman
- *
- */
-public abstract class AbstractExternalContextFactoryLocator implements
-        IExternalContextFactoryLocator 
-{
-    /**
-     * @return the current external context factory
-     */
-    public abstract AbstractDTExternalContextFactory getFactory();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/DTFacesContext.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/DTFacesContext.java
deleted file mode 100644
index d0ae967..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/DTFacesContext.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.context;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * Represents a design-time version of the JSF FacesContext for a particular
- * web application.
- * 
- * Client may not sub-class.
- * 
- * @author cbateman
- *
- */
-public final class DTFacesContext 
-{
-    private final IExternalContextFactoryLocator   _locator;
-    
-    /**
-     * @param locator
-     */
-    public DTFacesContext(final IExternalContextFactoryLocator locator)
-    {
-        _locator = locator;
-    }
-    
-    /**
-     * @param contextObject -- the object corresponding to the external context.
-     * Usually an IFile point to a file containing the external context.  It must
-     * be adaptable to an IFile.
-     * 
-     * @return the designtime external context or null if one is not defined
-     * for this contextObject
-     */
-    public IDTExternalContext getDTExternalContext(final IAdaptable contextObject)
-    {
-        
-        IDTExternalContext externalContext = null;
-        
-        // if the context object is an IFile or can be adapted to one, create a
-        // new externalContext for it
-        if (contextObject instanceof IFile
-                || (contextObject != null && contextObject.getAdapter(IFile.class)!=null))
-        {
-                
-            AbstractDTExternalContextFactory factory = _locator.getFactory();
-            externalContext = factory.create(contextObject);
-        }
-        
-        return externalContext;
-    }
-    
-    private String _localeString = ""; //$NON-NLS-1$
-    
-    /**
-     * @return the current locale string
-     */
-    public String getLocaleString()
-    {
-        return _localeString;
-    }
-    
-    /**
-     * @param newLocaleString
-     */
-    public void setLocaleString(final String newLocaleString)
-    {
-        _localeString = newLocaleString;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/DTJSPExternalContext.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/DTJSPExternalContext.java
deleted file mode 100644
index a04f3ba..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/DTJSPExternalContext.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.context;
-
-import java.io.PrintStream;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolConstants;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolSourceProvider;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolSourceProviderFactory;
-
-
-/**
- * A designtime proxy for the Faces ExternalContext
- * 
- * Clients may sub-class.
- * 
- * @author cbateman
- *
- */
-public class DTJSPExternalContext extends AbstractDTExternalContext 
-{
-    /**
-     * 
-     */
-    private final IFile     _jspFile;
-
-    /**
-     * Construct a default external context
-     * 
-     * @param jspFile
-     */
-    protected DTJSPExternalContext(final IAdaptable  jspFile)
-    {
-        if (jspFile instanceof IFile)
-        {
-            _jspFile = (IFile) jspFile;
-        }
-        else if (jspFile != null)
-        {
-            IFile file = (IFile) jspFile.getAdapter(IFile.class);
-            
-            if (file != null)
-            {
-                _jspFile = file;
-            }
-            else
-            {
-                _jspFile = null;
-                throw new AssertionError("jspFile must be adapable to an IFile"); //$NON-NLS-1$
-            }
-        }
-        else
-        {
-            _jspFile = null;
-            throw new AssertionError("jspFile must be adapable to an IFile"); //$NON-NLS-1$
-        }
-    }
-
-    @Override
-    protected Map doGetMapForScope(final int scopeMask) 
-    {
-        final Map  map = new HashMap();
-        
-        for (final Iterator it = JSFCommonPlugin.getSymbolSourceProviders().iterator(); it.hasNext();)
-        {
-            final ISymbolSourceProviderFactory  factory = (ISymbolSourceProviderFactory) it.next();
-            final ISymbolSourceProvider provider = factory.createInstance(_jspFile.getProject());
-            
-            final ISymbol[] symbols = provider.getSymbols(_jspFile, scopeMask);
-            
-            for (int i = 0; i < symbols.length; i++)
-            {
-                map.put(symbols[i].getName(), symbols[i]);
-            }
-        }
-
-        return map;
-    }
-
-    /**
-     * @param stream
-     */
-    public final void trace(PrintStream stream)
-    {
-        String[]  scopeNames = {ISymbolConstants.SYMBOL_SCOPE_REQUEST_STRING, 
-                                ISymbolConstants.SYMBOL_SCOPE_SESSION_STRING, 
-                                ISymbolConstants.SYMBOL_SCOPE_APPLICATION_STRING,
-                                ISymbolConstants.SYMBOL_SCOPE_NONE_STRING
-                                };
-        Map[]     symbolMaps = {getRequestMap(), getSessionMap(), getApplicationMap(), getNoneMap()};
-
-        for (int i = 0; i < scopeNames.length; i++)
-        {
-            stream.println("--------------"); //$NON-NLS-1$
-            stream.println(scopeNames[i]+" Scope:"); //$NON-NLS-1$
-            stream.println("--------------"); //$NON-NLS-1$
-
-            for (final Iterator it = symbolMaps[i].values().iterator(); it.hasNext();)
-            {
-                ISymbol symbol = (ISymbol) it.next();
-                System.out.println(symbol.getName());
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/DefaultDTExternalContextFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/DefaultDTExternalContextFactory.java
deleted file mode 100644
index 1d2af78..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/DefaultDTExternalContextFactory.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.context;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * Creates external contexts for JSPs
- * 
- * Clients may sub-class
- * 
- * @author cbateman
- *
- */
-public class DefaultDTExternalContextFactory extends
-        AbstractDTExternalContextFactory 
-{
-
-    /**
-     * @param containerContext -- must be adaptable to an IFile of content type
-     * JSP
-     *  
-     * @return a new DT external context
-     */
-    public IDTExternalContext create(final IAdaptable containerContext) 
-    {
-        return new DTJSPExternalContext(containerContext);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/IDTExternalContext.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/IDTExternalContext.java
deleted file mode 100644
index 3df048c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/IDTExternalContext.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.context;
-
-import java.util.Map;
-
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-
-/**
- * Interface that must be implemented by all design time external contexts
- * 
- * Clients may implement but should not sub-class. If implementing, sub-class
- * AbstractDTExternalContext instead.
- * 
- * @author cbateman
- *
- */
-public interface IDTExternalContext 
-{
-    /**
-     * @param scopeMask -- the scope for which to return the symbol map
-     * @return a map of ISymbols representing the currently available
-     * scope variables.  Never null, empty if no symbols
-     * 
-     * Map is unmodifiable (throws exception on mutation operations)
-     */
-    public abstract Map<String, ISymbol> getMapForScope(int scopeMask);
-
-    /**
-     * @return a map of ISymbols representing the currently available
-     * request scope variables.  Never null, empty if no symbols
-     * 
-     * Map is unmodifiable (throws exception on mutation operations)
-     */
-    public abstract Map<String, ISymbol> getRequestMap();
-
-    /**
-     * @return a map of ISymbols representing the currently available
-     * session scope variables.  Never null, empty if no symbols
-     * Map is unmodifiable (throws exception on mutation operations)
-     */
-    public abstract Map<String, ISymbol> getSessionMap();
-
-    /**
-     * @return a map of ISymbols representing the currently available
-     * application scope variables.  Never null, empty if no symbols
-     * Map is unmodifiable (throws exception on mutation operations)
-     */
-    public abstract Map<String, ISymbol> getApplicationMap();
-    
-    /**
-     * @return a map of ISymbols representing the currently available
-     * none scope variables.  Never null, empty if no symbols
-     * Map is unmodifiable (throws exception on mutation operations)
-     */
-    public abstract Map<String, ISymbol> getNoneMap();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/IExternalContextFactoryLocator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/IExternalContextFactoryLocator.java
deleted file mode 100644
index 0842ed8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/context/IExternalContextFactoryLocator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.context;
-
-/**
- * This interface is used to decouple the faces context from the 
- * DesignTimeApplicationManager
- * 
- * Client must NOT implement or subclass.
- * Extend AbstractExternalContextFactoryLocator instead
- * 
- * @author cbateman
- *
- */
-public interface IExternalContextFactoryLocator 
-{
-    /**
-     * @return the current external context factory
-     */
-    AbstractDTExternalContextFactory getFactory();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/AbstractDTMethodResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/AbstractDTMethodResolver.java
deleted file mode 100644
index da11512..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/AbstractDTMethodResolver.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.el;
-
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-
-/**
- * Sub-class of all design time method resolvers
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDTMethodResolver 
-{
-    /**
-     * Returns a symbol encapsulating the method on base with the name
-     * methodId
-     * 
-     * @param base
-     * @param methodId
-     * @return the symbol for the named methodId or null if not found
-     */
-    public abstract IMethodSymbol getMethod(IObjectSymbol base, Object methodId);
-
-    
-    /**
-     * @param base
-     * @return all method binding symbols for base
-     */
-    public abstract ISymbol[] getMethods(IObjectSymbol base);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/AbstractDTPropertyResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/AbstractDTPropertyResolver.java
deleted file mode 100644
index 23e6b57..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/AbstractDTPropertyResolver.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.el;
-
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-
-/**
- * Super-class of all design time property resolvers
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDTPropertyResolver 
-{
-    /**
-     * Returns a symbol encapsulating the property on base with the name
-     * properyId.  Note that getProperty may return *more* property symbols
-     * for the same 'base' because some ISymbol's have unconstrained type
-     * descriptors.  For example, a bean that implements java.util.Map,
-     * may have any number of possible properties add at runtime that cannot
-     * be determined at design time.  It is up to implementers of this interface
-     * to decide how (whether) to return these objects at design time 
-     * 
-     * @param base
-     * @param propertyId
-     * @return the symbol for the named propertyId or null if not found
-     */
-    public abstract ISymbol getProperty(ISymbol base, Object propertyId);
-    
-    /**
-     * @param base
-     * @param offset
-     * @return the symbol for the property referred to by the offset 
-     * into base when it is treated as either an array or a list.
-     * The symbol returned is *not* found in the getAllProperties list.
-     */
-    public abstract ISymbol getProperty(ISymbol base, int offset);
-    
-    /**
-     * @param base
-     * @return all properties of base that can be determined concretely
-     * at designtime.  Note that getProperty(base, x) may return non-null
-     * for objects not found in the return from this method. @see getProperty
-     */
-    public abstract ISymbol[] getAllProperties(ISymbol base);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/AbstractDTVariableResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/AbstractDTVariableResolver.java
deleted file mode 100644
index 532fc5d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/AbstractDTVariableResolver.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.el;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-
-/**
- * Super-class of all design-time variable resolver.  A design time variable
- * resolver 
- * 
- * Clients may sub-class.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDTVariableResolver 
-{
-    /**
-     * @param context
-     * @param name
-     * @param externalContextKey -- an adapter that identifies the external application
-     * context within which to resolve name.  For example, this could be an IFile
-     * representing a JavaServer Page in which we want to resolve the symbol name
-     * @return the symbol corresponding to name in the faces context or null
-     * if not found
-     */
-    public abstract ISymbol resolveVariable(DTFacesContext context, String name, IAdaptable externalContextKey);
-    
-    /**
-     * @param facesContext
-     * @param externalContextKey
-     * @return all variables
-     */
-    public abstract ISymbol[] getAllVariables(DTFacesContext facesContext, 
-            IAdaptable externalContextKey);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/DefaultDTMethodResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/DefaultDTMethodResolver.java
deleted file mode 100644
index bc6814b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/DefaultDTMethodResolver.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.el;
-
-import java.util.Iterator;
-
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-
-/**
- * This resolver has no direct analogue at runtime.  JSF Components implement
- * method bindings at runtime in a runtime specific way.  But at design time
- * we have no direct DTComponent so instead we use this resolver to resolve
- * an IInstanceSymbol and method name to an IMethodSymbol (if one exists).
- * 
- * Clients may sub-class
- * 
- * @author cbateman
- *
- */
-public class DefaultDTMethodResolver extends AbstractDTMethodResolver
-{
-    /**
-     * Returns a symbol encapsulating the method on base with the name
-     * methodId
-     * 
-     * @param base
-     * @param methodId
-     * @return the symbol for the named methodId or null if not found
-     */
-    public IMethodSymbol getMethod(IObjectSymbol base, Object methodId)
-    {
-        for (final Iterator it = base.getTypeDescriptor().getMethods().iterator(); it.hasNext();)
-        {
-            IMethodSymbol element = (IMethodSymbol) it.next();
-            if (element.getName().equals(methodId))
-            {
-                return element;
-            }
-        }
-
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.designtime.el.AbstractDTMethodResolver#getMethods(org.eclipse.jst.jsf.context.symbol.IInstanceSymbol)
-     */
-    public ISymbol[] getMethods(IObjectSymbol base) 
-    {
-        return (ISymbol[])
-            base.getTypeDescriptor().getMethods().
-                toArray(new ISymbol[0]);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/DefaultDTPropertyResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/DefaultDTPropertyResolver.java
deleted file mode 100644
index d4a5eee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/DefaultDTPropertyResolver.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.el;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.StringLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.symbol.IBoundedTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
-
-/**
- * A design time proxy for the runtime PropertyResolver.  This is used to
- * resolve all but the first element of a var.prop.prop2 type of sub-expression in
- * a JSF EL expression. @see DefaultDTVariableResolver for how to resolve 'var' at
- * designtime
- *
- * Clients may implement
- * 
- * @author cbateman
- */
-public class DefaultDTPropertyResolver extends AbstractDTPropertyResolver
-{
-    /**
-     * Returns a symbol encapsulating the property on base with the name
-     * properyId
-     * 
-     * @param base
-     * @param propertyId
-     * @return the symbol for the named propertyId or null if not found
-     */
-    public ISymbol getProperty(ISymbol base, Object propertyId)
-    {
-        ITypeDescriptor typeDesc = null;
-
-        Object[] factoredProperties = new Object[] {propertyId};
-
-        // check for expected interface types per JSP.2.3.4
-        if (base instanceof IObjectSymbol)
-        {
-            final IObjectSymbol objSymbol = (IObjectSymbol) base;
-            typeDesc = objSymbol.getTypeDescriptor();
-
-            // although not stated explicitly stated by the spec, in practice (based on Sun RI),
-            // a list cannot have non-numeric indexed properties
-            // note: due to remove(Object) having different return types
-            // an object can't be both a List and a Map!  So we can consider
-            // a List instanceof out of order
-            if (objSymbol.supportsCoercion(TypeConstants.TYPE_LIST))
-            {
-                typeDesc = null;
-            }
-            // per JSP.2.3.4, if instance of map (unconstrained in our terminology)
-            else if (objSymbol.supportsCoercion(TypeConstants.TYPE_MAP))
-            {
-                EList<ValueType>  args = new BasicEList<ValueType>();
-                args.add(new StringLiteralType(propertyId.toString()));
-                
-                ISymbol prop = objSymbol.call("get", args, propertyId.toString()); //$NON-NLS-1$
-                
-                if (prop != null)
-                {
-                    return prop;
-                }
-                
-                typeDesc = objSymbol.coerce(TypeConstants.TYPE_MAP);
-
-                // handle string keys into maps that contain dots.  Because type descriptor
-                // handle dotted property ids (i.e. 'x.y.z') as separate properties with
-                // intermediate parts, we need to handle this specially.
-                if (propertyId instanceof String && ((String)propertyId).indexOf('.')>-1)
-                {
-                    factoredProperties = factorKey(propertyId);
-                }
-            }
-
-            // check unconstrained type
-            if (typeDesc instanceof IBoundedTypeDescriptor)
-            {
-                // TODO: propertyId may need to change when supporting
-                // template types
-                if (((IBoundedTypeDescriptor)typeDesc).isUnboundedForType(TypeConstants.TYPE_JAVAOBJECT))
-                {
-                    // the most we know is that it could be an Object
-                    return ((IBoundedTypeDescriptor)typeDesc).getUnboundedProperty(propertyId, TypeConstants.TYPE_JAVAOBJECT);
-                }
-            }
-        }
-
-        int i = 0;
-        ISymbol  matchedSymbol;
-
-        do
-        {
-            matchedSymbol = null; // always reset so if the for completes without setting, the
-                                  // while ends
-            SEARCH_SEGMENT: for (final Iterator it = getIterator(typeDesc); it.hasNext();)
-            {
-                final ISymbol element = (ISymbol) it.next();
-
-                if (element.getName().equals(factoredProperties[i])
-                        && element instanceof IObjectSymbol)
-                {
-                    matchedSymbol = element;
-                    typeDesc = ((IObjectSymbol)matchedSymbol).getTypeDescriptor();
-                    break SEARCH_SEGMENT;
-                }
-            }
-        } while(++i < factoredProperties.length && matchedSymbol != null);
-
-        // may be null if none matched
-        return matchedSymbol;
-    }
-    
-    /**
-     * @param base
-     * @return all properties of base
-     */
-    public ISymbol[] getAllProperties(ISymbol base)
-    {
-        // if nothing found, return an empty array
-        List  symbolsList =  Collections.EMPTY_LIST;
-        
-        if (base instanceof IObjectSymbol)
-        {
-            ITypeDescriptor typeDesc = null;
-            
-            // per JSP.2.3.4, if instance of map (unconstrained in our terminology)
-            if (((IObjectSymbol)base).supportsCoercion(TypeConstants.TYPE_MAP))
-            {
-                typeDesc = 
-                    ((IObjectSymbol)base).coerce(TypeConstants.TYPE_MAP);
-            }
-            // Lists have no properties, even if they are also beans
-            else if (((IObjectSymbol)base).supportsCoercion(TypeConstants.TYPE_LIST))
-            {
-                typeDesc = null;
-            }
-            else
-            {
-                typeDesc = ((IObjectSymbol)base).getTypeDescriptor();
-            
-            }
-            
-            if (typeDesc != null)
-            {
-                symbolsList =  typeDesc.getProperties();
-            }
-        }
-
-        return (ISymbol[]) symbolsList.toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.designtime.el.AbstractDTPropertyResolver#getProperty(org.eclipse.jst.jsf.context.symbol.ISymbol, int)
-     */
-    public ISymbol getProperty(ISymbol base, int offset) 
-    {
-        ITypeDescriptor typeDesc = null;
-
-        if (offset < 0)
-        {
-        	// should never be called with offset < 0
-        	throw new AssertionError("offsets must be >=0 to be valid"); //$NON-NLS-1$
-        }
-        
-        // check for expected interface types per JSP.2.3.4
-        if (base instanceof IObjectSymbol)
-        {
-
-        	final IObjectSymbol objSymbol = (IObjectSymbol) base;
-            typeDesc = objSymbol.getTypeDescriptor();
-
-            // per JSP.2.3.4, if instance of array (unconstrained in our terminology)
-            if (typeDesc.isArray())
-            {
-                ISymbol arrayElement = typeDesc.getArrayElement();
-                // reset the name
-                arrayElement.setName(base.getName()+"["+offset+"]"); //$NON-NLS-1$ //$NON-NLS-2$
-                return arrayElement;
-            }
-            
-            // per JSP.2.3.4, if instance of list (unbounded in our terminology)
-            if (objSymbol.supportsCoercion(TypeConstants.TYPE_LIST))
-            {
-                //typeDesc = objSymbol.coerce(TypeConstants.TYPE_LIST);
-                final EList<ValueType> args = new BasicEList<ValueType>();
-                args.add(new ValueType(Signature.SIG_INT, ValueType.ASSIGNMENT_TYPE_RHS));
-                return objSymbol.call("get", args, base.getName()+"["+offset+"]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-            }
-
-            // check unconstrained type
-//            if (typeDesc instanceof IBoundedTypeDescriptor)
-//            {
-//                // TODO: propertyId may need to change when supporting
-//                // template types
-//                if (((IBoundedTypeDescriptor)typeDesc).isUnboundedForType(TypeConstants.TYPE_BOXED_INTEGER))
-//                {
-                    // the most we know is that it could be an Object
-//                    return ((IBoundedTypeDescriptor)typeDesc)
-//                        .getUnboundedProperty
-//                            (new Integer(offset), TypeConstants.TYPE_BOXED_INTEGER);
-//                    final EList<Object> args = new BasicEList<Object>();
-//                    args.add(offset);
-//                    return ((IBoundedTypeDescriptor)typeDesc)
-//                          .call("get", args, base.getName()+"["+offset+"]");
-//                }
-//            }
-        }
-        
-        return null;
-    }
-    
-    /**
-     * @param typeDesc
-     * @return the type descriptor's property iterator or empty list
-     * if null
-     */
-    protected final Iterator getIterator(ITypeDescriptor typeDesc)
-    {
-        if (typeDesc != null)
-        {
-            return typeDesc.getProperties().iterator();
-        }
-        return Collections.EMPTY_LIST.iterator();
-    }
-    
-    /**
-     * Takes a key expression and factors it down to into all property segments it contains.
-     * Property segments occur mainly when String keys contain '.' characters, indicating that
-     * more one than property actually must be traversed to evaluate the whole expr.
-     * @param key
-     * @return an array containing all property segments of the key.  If the key contains only
-     * one property, then this is returned a single element in the array
-     */
-    protected final Object[] factorKey(Object key)
-    {
-        if (key instanceof String)
-        {
-            List  segments = new ArrayList();
-            
-            String stringKey = (String) key;
-            int nextPos = -1;
-            
-            while ((nextPos = stringKey.indexOf('.')) > -1)
-            {
-                segments.add(stringKey.substring(0, nextPos));
-                stringKey = stringKey.substring(nextPos+1);
-            }
-            
-            if (stringKey != null && stringKey.length() > 0)
-            {
-                segments.add(stringKey);
-            }
-            
-            return segments.toArray();
-        }
-
-        return new Object[] {key};
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/DefaultDTVariableResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/DefaultDTVariableResolver.java
deleted file mode 100644
index 7b9aee5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/el/DefaultDTVariableResolver.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.el;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolConstants;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.eclipse.jst.jsf.designtime.context.IDTExternalContext;
-import org.eclipse.jst.jsf.designtime.symbols.DefaultBeanSymbolSourceProvider;
-import org.eclipse.jst.jsf.designtime.symbols.DefaultBuiltInSymbolProvider;
-
-/**
- * A design time proxy for the runtime VariableResolver.  This is used to
- * resolve the first element of a var.prop.prop2 type of sub-expression in
- * a JSF EL expression
- * 
- * Clients may sub-class
- *  
- * @author cbateman
- *
- */
-public class DefaultDTVariableResolver extends AbstractDTVariableResolver
-{
-    /**
-     * Tries to mirror the JSF 1.1 runtime VariableResolver
-     * 
-     * @see org.eclipse.jst.jsf.designtime.el.AbstractDTVariableResolver#resolveVariable(org.eclipse.jst.jsf.designtime.context.DTFacesContext, java.lang.String, org.eclipse.core.runtime.IAdaptable)
-     */
-    public ISymbol resolveVariable(DTFacesContext context, String name, IAdaptable externalContextKey)
-    {
-        // check implicits first
-        final DefaultBuiltInSymbolProvider builtins =
-            DefaultBuiltInSymbolProvider.getInstance();
-        
-        ISymbol  symbol = builtins.getSymbol(name, externalContextKey, ISymbolConstants.SYMBOL_SCOPE_ALL);
-        
-        if (symbol != null)
-        {
-            return symbol;
-        }
-        
-        // next check the scope maps from request up to application
-        final IDTExternalContext externalContext = 
-            context.getDTExternalContext(externalContextKey);
-        
-        if (externalContext == null)
-        {
-            // TODO: try to find bean here?
-            return null;
-        }
-        
-        symbol = externalContext.getRequestMap().get(name);
-        
-        // check request scope
-        if (symbol == null)
-        {
-            symbol = externalContext.getSessionMap().get(name);
-            
-            // then check session scope
-            if (symbol == null)
-            {
-                symbol = externalContext.getApplicationMap().get(name);
-                
-                // if the symbol is not found at any scope, then look for a
-                // a bean.
-                if (symbol == null)
-                {
-                    final DefaultBeanSymbolSourceProvider beanProvider =
-                        DefaultBeanSymbolSourceProvider.getInstance();
-                    
-                    symbol = beanProvider.getSymbol(name, externalContextKey, 
-                                             ISymbolConstants.SYMBOL_SCOPE_ALL);
-                }
-            }
-        }
-        
-        return symbol;
-    }
-    
-    /**
-     * @param facesContext
-     * @param externalContextKey
-     * @return all variables
-     */
-    public ISymbol[] getAllVariables(DTFacesContext facesContext, 
-                                     IAdaptable externalContextKey)
-    {
-        final List  allSymbols = new ArrayList();
-
-        addBuiltins(allSymbols, externalContextKey);
-
-        final IDTExternalContext externalContext =  
-            facesContext.getDTExternalContext(externalContextKey);
-
-        if (externalContext != null)
-        {
-            addExternalContextSymbols(allSymbols, externalContext);
-        }
-
-        addBeanSymbols(allSymbols, externalContextKey);
-        
-        return (ISymbol[]) allSymbols.toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-    }
-        
-    /**
-     * Adds the built-in symbols to the list.  This behaviour is standarized and should
-     * not be overriden in general.  However, you may wish to change the default
-     * built-in symbol provider with your own.
-     * 
-     * @param list
-     * @param externalContextKey
-     */
-    protected  void addBuiltins(final List list, final IAdaptable externalContextKey)
-    {
-        // check implicits first
-        final DefaultBuiltInSymbolProvider builtins =
-            DefaultBuiltInSymbolProvider.getInstance();
-
-        list.addAll(Arrays.asList(builtins.getSymbols(externalContextKey, 
-                                     ISymbolConstants.SYMBOL_SCOPE_ALL)));
-    }
-    
-    /**
-     * Simulate resolution of symbols from the request, session, application and none
-     * scope maps.  Use a symbol provider instead if you simply want to add
-     * new symbols for a tag variable or other symbol source.
-     * 
-     * @param list
-     * @param externalContext
-     */
-    protected void addExternalContextSymbols(final List list, 
-                                           final IDTExternalContext externalContext)
-    {
-        if (externalContext != null)
-        {
-            final ISymbol[] externalContextSymbols =
-                    externalContext.getMapForScope
-                  (ISymbolConstants.SYMBOL_SCOPE_ALL).values().
-                                    toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-            list.addAll(Arrays.asList(externalContextSymbols));
-        }
-    }
-
-    /**
-     * Gets all the bean symbols.  If you wish to override it would be advisable
-     * to look at and/or sub-class the default bean symbol source provider
-     * 
-     * @param list
-     * @param externalContextKey
-     */
-    protected void addBeanSymbols(final List list, final IAdaptable externalContextKey)
-    {
-        final DefaultBeanSymbolSourceProvider beanProvider =
-            DefaultBeanSymbolSourceProvider.getInstance();
-
-        final ISymbol[] beanSymbols = 
-            beanProvider.getSymbols(externalContextKey, 
-                                    ISymbolConstants.SYMBOL_SCOPE_ALL);
-
-        list.addAll(Arrays.asList(beanSymbols));
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/DataModelVariableFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/DataModelVariableFactory.java
deleted file mode 100644
index 95cde30..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/DataModelVariableFactory.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.jsp;
-
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.designtime.symbols.AbstractDataModelVariableFactory;
-import org.eclipse.jst.jsf.designtime.symbols.DefaultDataTableSymbolFactory;
-import org.w3c.dom.Element;
-
-/**
- * Constructs an EL IObjectSymbol for a particular data table row access variable
- * based on the type of the bound data (the value attribute)
- *  
- * 
- * @author cbateman
- *
- */
-class DataModelVariableFactory extends DefaultDataTableSymbolFactory
-{
-    private static DataModelVariableFactory INSTANCE;
-    
-    /**
-     * @return an instance of the factory
-     */
-    public synchronized static DataModelVariableFactory getInstance()
-    {
-        if (INSTANCE == null)
-        {
-            INSTANCE = new DataModelVariableFactory();
-        }
-        
-        return INSTANCE;
-    }
-    
-    @Override
-    public ISymbol createSymbolForDataTableValue(String symbolName,
-            Element dataTableElement, IStructuredDocumentContext context) 
-    {
-        if (!IJSFConstants.TAG_DATATABLE.equals(dataTableElement.getLocalName()))
-        {
-            throw new AssertionError("dataTableElement must be a dataTable"); //$NON-NLS-1$
-        }
-
-        return super.createSymbolForDataTableValue(symbolName, dataTableElement, context);
-    }
-
-    //private String getELText(IStructuredDocumentConte)
-    private DataModelVariableFactory()
-    {
-        // no external instantiation
-        super(new MyDataModelVariableFactory());
-    }
-    
-    private static class MyDataModelVariableFactory extends AbstractDataModelVariableFactory
-    {
-        @Override
-        protected String getVariableSourceName() {
-            return "dataTable"; //$NON-NLS-1$
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPDefaultSymbolFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPDefaultSymbolFactory.java
deleted file mode 100644
index 876ccfa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPDefaultSymbolFactory.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.internal.jsp;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.symbol.IComponentSymbol;
-import org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.source.AbstractContextSymbolFactory;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.jsf.designtime.internal.symbols.ResourceBundleMapSourceFactory;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-/**
- * @author cbateman
- *
- */
-public class JSPDefaultSymbolFactory extends AbstractContextSymbolFactory 
-{
-    protected ISymbol internalCreate(String symbolName,int scope,IAdaptable context,List problems) 
-    {
-        final IStructuredDocumentContext sContext =
-            (IStructuredDocumentContext) 
-                context.getAdapter(IStructuredDocumentContext.class);
-        
-        final IDOMContextResolver domResolver = 
-            IStructuredDocumentContextResolverFactory.INSTANCE.getDOMContextResolver(sContext);
-        
-        if (domResolver != null)
-        {
-            final Node curNode = domResolver.getNode();
-            
-            if (curNode instanceof Attr)
-            {
-                final Attr attr = (Attr) curNode;
-                final Node owningElement = attr.getOwnerElement();
-                
-                if (owningElement != null)
-                {
-                    return handleSymbolCreation(symbolName, sContext, attr, owningElement, problems);
-                }
-            }
-        }
-        
-        return null;
-    }
-
-    
-    private ISymbol handleSymbolCreation(final String symbolName, 
-                                         final IStructuredDocumentContext context,
-                                         final Attr attr, 
-                                         final Node owningElement,
-                                         final List problems)
-    {
-        final ITaglibContextResolver resolver = 
-            IStructuredDocumentContextResolverFactory.INSTANCE.getTaglibContextResolver(context);
-        
-        
-        if (resolver == null
-                || !resolver.canResolveContext(context))
-        {
-            return null;
-        }
-        
-        final String uri = resolver.getTagURIForNodeName(owningElement);
-        
-        // process core taglib
-        if (ITLDConstants.URI_JSF_CORE.equals(uri))
-        {
-            return handleCoreTags(symbolName, owningElement, attr, context, problems);
-        }
-        else if (ITLDConstants.URI_JSF_HTML.equals(uri))
-        {
-            return handleHtmlTags(symbolName, owningElement, attr, context, problems);
-        }
-        
-        return null;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.context.symbol.source.AbstractContextSymbolFactory#supports(org.eclipse.core.runtime.IAdaptable)
-     */
-    public boolean supports(IAdaptable context) 
-    {
-        return context != null && 
-        	context.getAdapter(IStructuredDocumentContext.class) != null;
-    }
-    
-    private ISymbol handleHtmlTags(String symbolName, Node owningElement, Attr attr, IStructuredDocumentContext context, List problems)
-    {
-        final String elementName = owningElement.getLocalName();
-        final String attrName = attr.getName();
-        
-        if (IJSFConstants.TAG_DATATABLE.equals(elementName))
-        {
-            if (IJSFConstants.ATTR_VAR.equals(attrName))
-            {
-                return DataModelVariableFactory.getInstance()
-                    .createSymbolForDataTableValue(symbolName, (Element) owningElement, context);
-            }
-        }
-
-        return null;
-    }
-    
-    private ISymbol handleCoreTags(String symbolName, Node owningElement, Attr attr, IStructuredDocumentContext context, List problems)
-    {
-        final String elementName = owningElement.getLocalName();
-        
-        if (IJSFConstants.TAG_LOADBUNDLE.equals(elementName))
-        {
-//            long startTime = System.currentTimeMillis();
-            ISymbol symbol = handleLoadBundleTag(symbolName, owningElement, attr, context, problems);
-            
-//            long endTime = System.currentTimeMillis();
-//            long totalTime = endTime-startTime;
-            //System.out.println("Loadbundle resolution for symbol "+symbolName+" took: "+totalTime+"ms");
-            return symbol;
-        }
-        return null;
-    }
-    
-    private ISymbol handleLoadBundleTag(String symbolName, Node owningElement, Attr attr, IStructuredDocumentContext context, List problems)
-    {
-        final String attrName = attr.getName();
-        if (IJSFConstants.ATTR_VAR.equals(attrName))
-        {
-            final NamedNodeMap attrMap = owningElement.getAttributes();
-            final Node baseNameNode = attrMap.getNamedItem(IJSFConstants.ATTR_BASENAME);
-
-            
-            if (baseNameNode != null)
-            {
-                try
-                {
-                    final IWorkspaceContextResolver wkspaceResolver =
-                        IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context);
-                    IProject project = wkspaceResolver.getProject();
-                    
-                    if (project == null)
-                    {
-                        throw new RuntimeException("Error acquiring project"); //$NON-NLS-1$
-                    }
-                    
-                    final Map source = 
-                        ResourceBundleMapSourceFactory
-                            .getResourceBundleMapSource(project, baseNameNode.getNodeValue());
-                    final IMapTypeDescriptor typeDesc = 
-                        SymbolFactory.eINSTANCE.createIMapTypeDescriptor();
-                    typeDesc.setMapSource(source);
-                    final IComponentSymbol symbol = 
-                        SymbolFactory.eINSTANCE.createIComponentSymbol();
-                    symbol.setName(symbolName);
-                    symbol.setTypeDescriptor(typeDesc);
-                    symbol.setDetailedDescription(Messages.getString("JSPDefaultSymbolFactory.Resource.bundle.map.detailedDescription")+baseNameNode.getNodeValue()+"</i>"); //$NON-NLS-1$ //$NON-NLS-2$
-                    
-                    return symbol;
-                }
-                catch (IOException ioe)
-                {
-                    problems.add(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0,Messages.getString("JSPDefaultSymbolFactory.Problem.ErrorCreatingVariable"), ioe)); //$NON-NLS-1$
-                }
-                catch (JavaModelException jme)
-                {
-                    problems.add(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0,Messages.getString("JSPDefaultSymbolFactory.Problem.ErrorCreatingVariable"), jme)); //$NON-NLS-1$
-                }
-                catch (CoreException ce)
-                {
-                    problems.add(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0,Messages.getString("JSPDefaultSymbolFactory.Problem.ErrorCreatingVariable"), ce)); //$NON-NLS-1$
-                }
-            }
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPModelProcessor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPModelProcessor.java
deleted file mode 100644
index 45d3407..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPModelProcessor.java
+++ /dev/null
@@ -1,679 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.internal.jsp;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.locks.ReentrantLock;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
-import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener;
-import org.eclipse.jst.jsf.common.internal.resource.LifecycleListener;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.EventType;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.ReasonType;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.context.symbol.IComponentSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.source.AbstractContextSymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolConstants;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.DesignTimeApplicationManager;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.eclipse.jst.jsp.core.internal.domdocument.DOMModelForJSP;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-
-/**
- * Processes a JSP model to determine information of interest about it such
- * as what tags are currently in use.  Listens to the model and updates it's 
- * information when the model changes.
- * 
- * @author cbateman
- *
- */
-public class JSPModelProcessor
-{
-    private final static Map<IFile, JSPModelProcessor>  RESOURCE_MAP = 
-        new HashMap<IFile, JSPModelProcessor>();
-    private final static java.util.concurrent.locks.Lock CRITICAL_SECTION =
-        new  ReentrantLock();
-    private static LifecycleListener  LIFECYCLE_LISTENER;
-
-    /**
-     * @param file The file to get the model processor for  
-     * @return the processor for a particular model, creating it if it does not
-     *         already exist
-     * @throws CoreException if an attempt to get the model associated with file
-     *         fails due to reasons other than I/O problems
-     */
-    public static JSPModelProcessor get(IFile file) throws CoreException
-    {
-        CRITICAL_SECTION.lock();
-        try
-        {
-            if (!file.isAccessible())
-            {
-                throw new CoreException(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, "File must be accessible"));
-            }
-
-            JSPModelProcessor processor = RESOURCE_MAP.get(file);
-
-            if (processor == null)
-            {
-                if (LIFECYCLE_LISTENER == null)
-                {
-                    LIFECYCLE_LISTENER = new LifecycleListener(file);
-                }
-                else
-                {
-                    LIFECYCLE_LISTENER.addResource(file);
-                }
-
-                processor = new JSPModelProcessor(file,LIFECYCLE_LISTENER);
-                RESOURCE_MAP.put(file, processor);
-            }
-
-            return processor;
-        }
-        finally
-        {
-            CRITICAL_SECTION.unlock();
-        }
-    }
-
-    /**
-     * Disposes of the JSPModelProcessor associated with model
-     * @param file the model processor to be disposed
-     */
-    private static void dispose(IFile file)
-    {
-        CRITICAL_SECTION.lock();
-        try
-        {
-            JSPModelProcessor processor = RESOURCE_MAP.get(file);
-
-            if (processor != null)
-            {
-                RESOURCE_MAP.remove(file);
-                
-                if (!processor.isDisposed())
-                {
-                    processor.dispose();
-                    LIFECYCLE_LISTENER.removeResource(file);
-                }
-                
-            }
-
-            if (RESOURCE_MAP.size() == 0)
-            {
-                // if we no longer have any resources being tracked,
-                // then dispose the lifecycle listener
-                LIFECYCLE_LISTENER.dispose();
-                LIFECYCLE_LISTENER = null;
-            }
-        }
-        finally
-        {
-            CRITICAL_SECTION.unlock();
-        }
-    }
-
-    private final IFile             _file;
-    private LifecycleListener       _lifecycleListener;
-    private IResourceLifecycleListener  _resListener;
-    private boolean                 _isDisposed;
-    private Map<Object, ISymbol>    _requestMap;
-    private Map<Object, ISymbol>    _sessionMap;
-    private Map<Object, ISymbol>    _applicationMap;
-    private Map<Object, ISymbol>    _noneMap;
-    private long                    _lastModificationStamp;
-
-    // used to avoid infinite recursion in refresh.  Must never be null
-    private final CountingMutex     _lastModificationStampMonitor = new CountingMutex();
-
-    /**
-     * Construct a new JSPModelProcessor for model
-     * 
-     * @param model
-     */
-    private JSPModelProcessor(final IFile  file, final LifecycleListener lifecycleListener)
-    {
-        //_model = getModelForFile(file);
-        //_modelListener = new ModelListener();
-        //_model.addModelLifecycleListener(_modelListener);
-        _file = file;
-        _lifecycleListener = lifecycleListener;
-        _resListener = new IResourceLifecycleListener()
-        {
-            public EventResult acceptEvent(ResourceLifecycleEvent event)
-            {
-                final EventResult result = EventResult.getDefaultEventResult();
-
-                // not interested
-                if (!_file.equals(event.getAffectedResource()))
-                {
-                    return result; 
-                }
-
-                if (event.getEventType() == EventType.RESOURCE_INACCESSIBLE)
-                {
-                    dispose(_file);
-                }
-                else if (event.getEventType() == EventType.RESOURCE_CHANGED)
-                {
-                    // if the file has changed contents on disk, then
-                    // invoke an unforced refresh of the JSP file
-                    if (event.getReasonType() == ReasonType.RESOURCE_CHANGED_CONTENTS)
-                    {
-                        refresh(false);
-                    }
-                }
-
-                return result;
-            }
-        };
-
-        lifecycleListener.addListener(_resListener);
-        
-        // a negative value guarantees that refresh(false) will
-        // force a refresh on the first run
-        _lastModificationStamp = -1;
-    }
-
-    private DOMModelForJSP getModelForFile(final IFile file)
-            throws CoreException, IOException
-    {
-        final IModelManager modelManager = 
-            StructuredModelManager.getModelManager();
-
-        IStructuredModel model = modelManager.getModelForRead(file);
-
-        if (model instanceof DOMModelForJSP)
-        {
-            return (DOMModelForJSP) model;
-        }
-        else if (model != null)
-        {
-            // only release from read if we don't find a DOMModelForJSP
-            // if the model is correct, it will be released in dispose
-            model.releaseFromRead();
-        }
-        
-        throw new CoreException
-            (new Status(IStatus.ERROR
-                        , "org.eclipse.blah"
-                        , 0  //$NON-NLS-1$
-                        ,"model not of expected type"
-                        , new Throwable())); //$NON-NLS-1$
-    }
-
-    private void dispose()
-    {
-        if (!_isDisposed)
-        {
-            // ensure the resource listener is disposed
-            _lifecycleListener.removeListener(_resListener);
-            _resListener = null;
-            _lifecycleListener = null;
-
-            if (_requestMap != null)
-            {
-                _requestMap.clear();
-                _requestMap = null;
-            }
-
-            if (_sessionMap != null)
-            {
-                _sessionMap.clear();
-                _sessionMap = null;
-            }
-
-            if (_applicationMap != null)
-            {
-                _applicationMap.clear();
-                _applicationMap = null;
-            }
-
-            if (_noneMap != null)
-            {
-                _noneMap.clear();
-                _noneMap = null;
-            }
-
-            // mark as disposed
-            _isDisposed = true;
-        }
-    }
-
-    /**
-     * @return true if this model processor has been disposed.  Disposed
-     * processors should not be used.
-     */
-    public boolean isDisposed()
-    {
-        return _isDisposed;
-    }
-
-    /**
-     * If isModelDirty() returns true, then it means that a call
-     * to refresh(false) will trigger a reprocess of the underlying document.
-     *
-     * @return true if the underlying JSP model is considered to be dirty
-     */
-    public boolean isModelDirty()
-    {
-        final long currentModificationStamp = _file.getModificationStamp();
-        return _lastModificationStamp != currentModificationStamp;
-    }
-    
-    /**
-     * Updates the internal model
-     * @param forceRefresh -- if true, always refreshes, if false,
-     * then it only refreshes if the file's modification has changed
-     * since the last refresh
-     * @throws IllegalStateException if isDisposed() == true
-     */
-    public void refresh(final boolean forceRefresh)
-    {
-        if (isDisposed())
-        {
-            throw new IllegalStateException("Processor is disposed for file: "+_file.toString());
-        }
-
-        synchronized(_lastModificationStampMonitor)
-        {
-            if (_lastModificationStampMonitor.isSignalled())
-            {
-                // if this calls succeeds, then this thread has obtained the
-                // lock already and has called through here before.  
-                // return immediately to ensure that we don't recurse infinitely
-                return;
-            }
-
-            DOMModelForJSP  model = null;
-            try
-            {
-                _lastModificationStampMonitor.setSignalled(true);
-                
-
-                // only refresh if forced or if the underlying file has changed
-                // since the last run
-                if (forceRefresh
-                        || isModelDirty())
-                {
-                    model = getModelForFile(_file);
-                    refreshInternal(model);
-                    _lastModificationStamp = _file.getModificationStamp();
-                }
-            }
-            catch (CoreException e) {
-               JSFCorePlugin.log(new RuntimeException(e), "Error refreshing internal model");
-            } catch (IOException e) {
-                JSFCorePlugin.log(new RuntimeException(e), "Error refreshing internal model");
-            }
-            // make sure that we unsignal the monitor before releasing the
-            // mutex
-            finally
-            {
-                _lastModificationStampMonitor.setSignalled(false);
-            }
-        }
-    }
-    
-    private void refreshInternal(DOMModelForJSP model)
-    {
-        final IStructuredDocumentContext context = 
-            IStructuredDocumentContextFactory.INSTANCE.getContext(model.getStructuredDocument(), -1);
-        final ITaglibContextResolver taglibResolver =
-            IStructuredDocumentContextResolverFactory.INSTANCE.getTaglibContextResolver(context);
-        IDOMDocument document = model.getDocument();
-        getApplicationMap().clear();
-        getRequestMap().clear();
-        getSessionMap().clear();
-        //long curTime = System.currentTimeMillis();
-        recurseChildNodes(model, document.getChildNodes(), taglibResolver);
-        //long netTime = System.currentTimeMillis() - curTime;
-        //System.out.println("Net time to recurse document: "+netTime);
-    }
-
-    private void recurseChildNodes(final DOMModelForJSP model,
-                                   final NodeList nodes, 
-                                    final ITaglibContextResolver taglibResolver)
-    {
-        for (int i = 0; i < nodes.getLength(); i++)
-        {
-            final Node child = nodes.item(i);
-            
-            // process attributes at this node before recursing
-            processAttributes(model, child, taglibResolver);
-            recurseChildNodes(model, child.getChildNodes(), taglibResolver);
-        }
-    }
-
-    private void processAttributes(final DOMModelForJSP model, final Node node, 
-                                    final ITaglibContextResolver taglibResolver)
-    {
-        if (taglibResolver.hasTag(node))
-        {
-            final String uri =
-                taglibResolver.getTagURIForNodeName(node);
-            final String elementName = node.getLocalName();
-            
-            for (int i = 0; i < node.getAttributes().getLength(); i++)
-            {
-                final Node attribute = node.getAttributes().item(i);
-
-                processSymbolContrib(model, uri, elementName, attribute);
-                processSetsLocale(uri, elementName, attribute);
-            }
-        }
-    }
-
-    private void processSymbolContrib(final DOMModelForJSP model, final String uri, final String elementName, Node attribute)
-    {
-        final SymbolContribAggregator  aggregator =
-            SymbolContribAggregator.
-               create(_file.getProject(), uri, elementName, attribute.getLocalName());
-  
-        if (aggregator != null)
-        {    
-            final AbstractContextSymbolFactory factory = aggregator.getFactory();
-            final String symbolName = attribute.getNodeValue();
-
-            if (factory != null)
-            {
-//                long curTime = System.currentTimeMillis();
-                 
-                final List problems = new ArrayList();
-                ISymbol symbol =
-                    factory.create(symbolName, 
-                                  ISymbolConstants.SYMBOL_SCOPE_REQUEST, //TODO:
-                                  IStructuredDocumentContextFactory.INSTANCE.
-                                      getContext(model.getStructuredDocument(), 
-                                                 attribute),
-                                  problems);
-
-//                long netTime = System.currentTimeMillis() - curTime;
-//                System.out.println("Time to process loadBundle: "+netTime);
-
-                if (symbol != null)
-                {
-                    updateMap(symbol, aggregator.getScope());
-                }
-            }
-            else
-            {
-                IComponentSymbol componentSymbol = 
-                    SymbolFactory.eINSTANCE.createIComponentSymbol();
-                componentSymbol.setName(symbolName);
-
-                updateMap(componentSymbol, aggregator.getScope());
-            }
-        }
-    }
-    
-    private void processSetsLocale(final String uri, final String elementName, Node attribute)
-    {
-        LocaleSetAggregator  aggregator = LocaleSetAggregator.create(_file.getProject(), uri, elementName, attribute.getLocalName());
-
-        if (aggregator != null)
-        {
-            DesignTimeApplicationManager  dtAppMgr =
-                DesignTimeApplicationManager.getInstance(_file.getProject());
-
-            DTFacesContext facesContext = dtAppMgr.getFacesContext(_file);
-            
-            if (facesContext != null)
-            {
-                facesContext.setLocaleString(attribute.getNodeValue());
-            }
-        }
-    }
-
-   /**
-     * @param scopeName - one of "request", "session" or "application"
-     * @return an unmodifable map containing all known symbols for
-     * that scope.  If scopeName is not found, returns the empty map.
-     */
-    public Map<Object, ISymbol> getMapForScope(String scopeName)
-    {
-        final Map<Object, ISymbol> map = getMapForScopeInternal(scopeName);
-        
-        if (map != null)
-        {
-            return Collections.unmodifiableMap(map);
-        }
-
-        return Collections.EMPTY_MAP;
-    }
-
-    private void updateMap(ISymbol symbol, String  scopeName)
-    {
-        final Map<Object, ISymbol> map = getMapForScopeInternal(scopeName);
-
-        if (map != null)
-        {
-            map.put(symbol.getName(), symbol);
-        }
-        else
-        {
-            Platform.getLog(JSFCorePlugin.getDefault().getBundle()).log(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0, "Scope not found: "+scopeName, new Throwable())); //$NON-NLS-1$
-        }
-    }
-
-    private Map<Object, ISymbol> getMapForScopeInternal(String scopeName)
-    {
-        if (ISymbolConstants.SYMBOL_SCOPE_REQUEST_STRING.equals(scopeName))
-        {
-            return getRequestMap();
-        }
-        else if (ISymbolConstants.SYMBOL_SCOPE_SESSION_STRING.equals(scopeName))
-        {
-            return getSessionMap();
-        }
-        else if (ISymbolConstants.SYMBOL_SCOPE_APPLICATION_STRING.equals(scopeName))
-        {
-            return getApplicationMap();
-        }
-        else if (ISymbolConstants.SYMBOL_SCOPE_NONE_STRING.equals(scopeName))
-        {
-            return getNoneMap();
-        }
-        
-        Platform.getLog(JSFCorePlugin.getDefault().getBundle()).log(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0, "Scope not found: "+scopeName, new Throwable())); //$NON-NLS-1$
-        return null;
-    
-    }
-    
-    private Map getRequestMap()
-    {
-        if (_requestMap == null)
-        {
-            _requestMap = new HashMap<Object, ISymbol>();
-        }
-        
-        return _requestMap;
-    }
-    
-    private Map<Object, ISymbol> getSessionMap()
-    {
-        if (_sessionMap == null)
-        {
-            _sessionMap = new HashMap<Object, ISymbol>();
-        }
-        
-        return _sessionMap;
-    }
-    
-    private Map<Object, ISymbol> getApplicationMap()
-    {
-        if (_applicationMap == null)
-        {
-            _applicationMap = new HashMap<Object, ISymbol>();
-        }
-        
-        return _applicationMap;
-    }
-    
-    private Map<Object, ISymbol> getNoneMap()
-    {
-        if (_noneMap == null)
-        {
-            _noneMap = new HashMap<Object, ISymbol>();
-        }
-        
-        return _noneMap;
-    }
-
-    /**
-     * Aggregates the sets-locale meta-data
-     * 
-     * @author cbateman
-     */
-    private static class LocaleSetAggregator
-    {
-        private final static String SETS_LOCALE = "sets-locale"; //$NON-NLS-1$
-        
-        static LocaleSetAggregator create(IProject project, 
-                                              final String uri, 
-                                              final String elementName, final String attributeName)
-        {
-            final ITaglibDomainMetaDataModelContext mdContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, uri);
-            Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(mdContext, elementName+"/"+attributeName, SETS_LOCALE); //$NON-NLS-1$
-
-            if (TraitValueHelper.getValueAsBoolean(trait))
-            {
-                return new LocaleSetAggregator();
-            }
-
-            return null;
-        }
-    }
-    
-    /**
-     * Aggregates all the symbol contributor meta-data into a single object
-     * 
-     * @author cbateman
-     *
-     */
-    private static class SymbolContribAggregator
-    {
-        private final static String CONTRIBUTES_VALUE_BINDING = 
-            "contributes-value-binding"; //$NON-NLS-1$
-        private final static String VALUE_BINDING_SCOPE = "value-binding-scope"; //$NON-NLS-1$
-        private final static String VALUE_BINDING_SYMBOL_FACTORY = 
-            "value-binding-symbol-factory"; //$NON-NLS-1$
-
-        /**
-         * @param attributeName
-         * @return a new instance only if attributeName is a symbol contributor
-         */
-        static SymbolContribAggregator create(final IProject project, 
-                                              final String uri, 
-                                              final String elementName, 
-                                              final String attributeName)
-        {
-            final String entityKey = elementName+"/"+attributeName; //$NON-NLS-1$
-            final ITaglibDomainMetaDataModelContext mdContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, uri);
-            Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(mdContext, entityKey, CONTRIBUTES_VALUE_BINDING);
-
-            boolean contribsValueBindings = TraitValueHelper.getValueAsBoolean(trait);
-
-            if (contribsValueBindings)
-            {
-                String scope = null;
-                String symbolFactory = null;
-                
-                trait = TaglibDomainMetaDataQueryHelper.getTrait(mdContext, entityKey, VALUE_BINDING_SCOPE);
-                scope = TraitValueHelper.getValueAsString(trait);
-
-                if (scope != null && !scope.equals("")) //$NON-NLS-1$
-                {
-                    trait = TaglibDomainMetaDataQueryHelper.getTrait(mdContext, entityKey, VALUE_BINDING_SYMBOL_FACTORY);
-                    symbolFactory = TraitValueHelper.getValueAsString(trait);                      
-                }
-
-                return new SymbolContribAggregator(scope, symbolFactory);
-            }
-
-            return null;
-        }
-
-        private final Map   _metadata = new HashMap(4);
-
-        SymbolContribAggregator(final String scope, final String factory)
-        {
-            _metadata.put("scope", scope); //$NON-NLS-1$
-            _metadata.put("factory", factory); //$NON-NLS-1$
-        }
-
-        /**
-         * @return the scope
-         */
-        public String getScope()
-        {
-            return (String) _metadata.get("scope"); //$NON-NLS-1$
-        }
-        
-        /**
-         * @return the factory
-         */
-        public AbstractContextSymbolFactory getFactory()
-        {
-            return JSFCommonPlugin.getSymbolFactories().get(_metadata.get("factory")); //$NON-NLS-1$
-        }
-    }
-    
-    private static class CountingMutex extends Object
-    {
-        private boolean _signalled = false;
-
-        /**
-         * @return true if the state of mutex is signalled
-         */
-        public synchronized boolean isSignalled() {
-            return _signalled;
-        }
-
-        /**
-         * @param signalled
-         */
-        public synchronized void setSignalled(boolean signalled) {
-            this._signalled = signalled;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/Messages.java
deleted file mode 100644
index de41104..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/Messages.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.internal.jsp;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * Message resource class
- * 
- * @author cbateman
- *
- */
-/*package*/ final class Messages {
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.designtime.messages"; //$NON-NLS-1$
-
-    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-            .getBundle(BUNDLE_NAME);
-
-    private Messages() {
-        // no external instatiation
-    }
-
-    /**
-     * @param key
-     * @return the message string for key or  !key! if not found
-     */
-    public static String getString(String key) {
-        try {
-            return RESOURCE_BUNDLE.getString(key);
-        } catch (MissingResourceException e) {
-            return '!' + key + '!';
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/StartupHandler.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/StartupHandler.java
deleted file mode 100644
index b3b4377..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/StartupHandler.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.internal.jsp;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.common.internal.JSPUtil;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.IStartup;
-import org.eclipse.ui.IWindowListener;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * On workbench startup, registers a part listener that triggers when
- * a JSP editor opens.
- * 
- * @author cbateman
- *
- */
-public class StartupHandler implements IStartup 
-{
-    private final JSPEditorListener    _partListener = new JSPEditorListener();
-
-    public void earlyStartup() 
-    {
-        PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable()
-        {
-            public void run()
-            {
-                IWorkbenchWindow  windows[] = 
-                    PlatformUI.getWorkbench().getWorkbenchWindows();
-                
-                for (int i = 0; i < windows.length; i++)
-                {
-                    IWorkbenchPage pages[] = windows[i].getPages();
-                    for (int j = 0; j < pages.length; j++)
-                    {
-                        IEditorReference[]  editorReferences = 
-                            pages[j].getEditorReferences();
-                        
-                        for (int k = 0; k < editorReferences.length; k++)
-                        {
-                            if (_partListener.isValidJSPEditor(editorReferences[k]))
-                            {
-                                _partListener.setJSPModelListener(editorReferences[k]);
-                            }
-                        }
-                    }
-                    windows[i].getPartService().addPartListener(_partListener);
-                }
-
-                // TODO: register with all windows?
-                PlatformUI.getWorkbench().addWindowListener(new IWindowListener()
-                {
-                    public void windowActivated(IWorkbenchWindow window) {
-                        // do nothing
-                    }
-
-                    public void windowDeactivated(IWorkbenchWindow window) {
-                        // do nothing
-                    }
-
-                    public void windowClosed(IWorkbenchWindow window) {
-                        window.getPartService().removePartListener(_partListener);
-                    }
-
-                    public void windowOpened(IWorkbenchWindow window) {
-                        window.getPartService().addPartListener(_partListener);
-                    }
-                });
-            }
-        });
-    }
-
-    private static class JSPEditorListener implements IPartListener2
-    {
-        private JSPModelProcessor         _processor;
-
-        public void partActivated(IWorkbenchPartReference partRef) {
-            // do nothing
-        }
-
-        public void partBroughtToTop(IWorkbenchPartReference partRef) {
-            // do nothing
-        }
-
-        public void partClosed(IWorkbenchPartReference partRef) {
-            // do nothing
-        }
-
-        public void partDeactivated(IWorkbenchPartReference partRef) {
-            // do nothing
-        }
-
-        public void partOpened(IWorkbenchPartReference partRef) {
-            if (isValidJSPEditor(partRef))
-            {
-                setJSPModelListener((IEditorReference)partRef);
-            }
-        }
-
-        public void partHidden(IWorkbenchPartReference partRef) {
-            // do nothing
-        }
-
-        public void partVisible(IWorkbenchPartReference partRef) {
-            // do nothing
-        }
-
-        public void partInputChanged(IWorkbenchPartReference partRef) {
-            // do nothing
-        }
-
-        private boolean isJSPEditor(IEditorReference editorRef)
-        {
-            IFile file = getIFile(editorRef);
-
-            if (file != null)
-            {
-                return JSPUtil.isJSPContentType(file);
-            }
-
-            return false;
-        }
-
-        /**
-         * @param editorRef
-         * @return true if the editor is editing the JSP content type and
-         * the owning project is a JSF project
-         */
-        boolean isValidJSPEditor(IEditorReference editorRef)
-        {
-            final IFile file = getIFile(editorRef);
-            
-            return file != null && 
-                    JSFAppConfigUtils.isValidJSFProject(file.getProject()) &&
-                        isJSPEditor(editorRef);
-        }
-
-        boolean isValidJSPEditor(IWorkbenchPartReference partRef)
-        {
-            if (partRef instanceof IEditorReference)
-            {
-                return isValidJSPEditor((IEditorReference)partRef);
-            }
-
-            return false;
-        }
-
-        void setJSPModelListener(IEditorReference editorRef)
-        {
-            IFile file = getIFile(editorRef);
-            
-            if (file != null)
-            {
-                try
-                {
-                    // implicitly creates if not present
-                    _processor = JSPModelProcessor.get(file);
-                    _processor.refresh(false);
-                }
-                catch (Exception e)
-                {
-                    JSFCorePlugin.getDefault().getLog().log(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0, "Error acquiring model processor",e)); //$NON-NLS-1$
-                }
-            }
-        }
-
-        IFile getIFile(IEditorReference editorRef)
-        {
-            try
-            {
-                IEditorInput editorInput = editorRef.getEditorInput();
-                Object adapt = editorInput.getAdapter(IFile.class);
-                
-                if (adapt instanceof IFile)
-                {
-                    return (IFile) adapt;
-                }
-            }
-            catch (PartInitException excp)
-            {
-                JSFCorePlugin.getDefault().getLog().log(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0, "Error acquiring editor input",excp)); //$NON-NLS-1$
-            }
-
-            return null;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/DataModelVariableTestFacade.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/DataModelVariableTestFacade.java
deleted file mode 100644
index 493dae5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/DataModelVariableTestFacade.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.symbols;
-
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.designtime.symbols.AbstractDataModelVariableFactory;
-
-/**
- * Used to expose protected final members of AbstractDataModelVariableFactory
- * for testing purposes.  May change without notice, should *never* be used in
- * production code.
- * 
- * @author cbateman
- *
- */
-public final class DataModelVariableTestFacade extends AbstractDataModelVariableFactory 
-{
-    /**
-     * Test facade for createArraySymbol
-     * 
-     * @param symbolName
-     * @param signature
-     * @param javaProject
-     * @return super.createArraySymbol()
-     */
-    public final ISymbol testCreateArraySymbol(final String symbolName, final String signature, final IJavaProject javaProject)
-    {
-        return createArraySymbol(symbolName, signature, javaProject);
-    }
-    
-    /**
-     * Test facade for createFromList
-     * 
-     * @param symbolName
-     * @param valueType
-     * @param javaProject
-     * @return super.createFromList()
-     */
-    public final ISymbol testCreateFromList(String symbolName, ValueType valueType, IJavaProject javaProject)
-    {
-        return createFromList(symbolName, valueType, javaProject);
-    }
-    
-    /**
-     * @param symbolName
-     * @param signature
-     * @param javaProject
-     * @return a symbol assuming a scalar type wrapping
-     */
-    public ISymbol testCreateScalarSymbol(String symbolName, String signature, IJavaProject javaProject)
-    {
-        return createScalarSymbol(symbolName, signature, javaProject);
-    }
-
-    
-    /**
-     * @param symbolName
-     * @param valueType
-     * @param javaProject
-     * @return a symbol from a proxied call to  super.createFromType
-     */
-    public ISymbol testCreateFromType(String symbolName, ValueType valueType,
-            IJavaProject javaProject) {
-        return super.createFromType(symbolName, valueType, javaProject);
-    }
-
-    @Override
-    protected final String getVariableSourceName() 
-    {
-        return "testFacade -- SHOULD NOT BE USED IN PRODUCTION CODE"; //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/JSPTagVariableSymbolSourceProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/JSPTagVariableSymbolSourceProvider.java
deleted file mode 100644
index ca109f7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/JSPTagVariableSymbolSourceProvider.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.internal.symbols;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.source.AbstractSymbolSourceProviderFactory;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolConstants;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolSourceProvider;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.internal.jsp.JSPModelProcessor;
-import org.eclipse.jst.jsf.designtime.symbols.FileContextUtil;
-import org.eclipse.jst.jsf.designtime.symbols.SymbolUtil;
-
-
-/**
- * Self-factory for a symbol provider that derives symbol information from
- * meta-data annotations on tag attributes that declare runtime EL variables
- * 
- * @author cbateman
- *
- */
-public class JSPTagVariableSymbolSourceProvider extends
-        AbstractSymbolSourceProviderFactory implements ISymbolSourceProvider 
-{
-    protected ISymbolSourceProvider create(IProject project) 
-    {
-        return this;
-    }
-
-    public ISymbol[] getSymbols(IAdaptable context, int symbolScopeMask) 
-    {
-        final IFile   fileContext = FileContextUtil.deriveIFileFromContext(context);
-        
-        if (isProvider(fileContext))
-        {
-        	JSPModelProcessor modelProcessor = null;
-        	
-            try
-            {
-                modelProcessor = JSPModelProcessor.get(fileContext);
-                
-                // ensure internal model is sync'ed with document
-                // but don't force refresh
-                modelProcessor.refresh(false);
-                final List<ISymbol> symbols = new ArrayList();
-                
-                if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_REQUEST) != 0)
-                {
-                    symbols.addAll(modelProcessor.getMapForScope(ISymbolConstants.SYMBOL_SCOPE_REQUEST_STRING).values());
-                }
-                if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_SESSION) != 0)
-                {
-                    symbols.addAll(modelProcessor.getMapForScope(ISymbolConstants.SYMBOL_SCOPE_SESSION_STRING).values());
-                }
-                if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_APPLICATION) != 0)
-                {
-                    symbols.addAll(modelProcessor.getMapForScope(ISymbolConstants.SYMBOL_SCOPE_APPLICATION_STRING).values());
-                }
-                if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_NONE) != 0)
-                {
-                    symbols.addAll(modelProcessor.getMapForScope(ISymbolConstants.SYMBOL_SCOPE_NONE_STRING).values());
-                }
-                    
-                return symbols.toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-            }
-            catch (Exception e)
-            {
-                JSFCorePlugin.getDefault().getLog().log(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0, "Error acquiring model processor",e)); //$NON-NLS-1$
-                // fall-through to empty symbol array
-            }
-        }
-        
-        return ISymbol.EMPTY_SYMBOL_ARRAY;
-    }
-
-    public ISymbol[] getSymbols(String prefix, IAdaptable context,
-            int symbolScopeMask) {
-        return SymbolUtil.
-            filterSymbolsByPrefix(getSymbols(context, symbolScopeMask), prefix);
-    }
-
-    public boolean isProvider(IAdaptable context) 
-    {
-        IFile file = FileContextUtil.deriveIFileFromContext(context);
-        
-        return (file != null
-                && file.getProject() == this.getProject());
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/Messages.java
deleted file mode 100644
index f555477..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/Messages.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.internal.symbols;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * Message resource class
- * 
- * @author cbateman
- *
- */
-/*package*/ final class Messages {
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.designtime.messages"; //$NON-NLS-1$
-
-    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-            .getBundle(BUNDLE_NAME);
-
-    private Messages() {
-        // no external instatiation
-    }
-
-    /**
-     * @param key
-     * @return the message string for key or  !key! if not found
-     */
-    public static String getString(String key) {
-        try {
-            return RESOURCE_BUNDLE.getString(key);
-        } catch (MissingResourceException e) {
-            return '!' + key + '!';
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSource.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSource.java
deleted file mode 100644
index 4e7d66c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSource.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.symbols;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.AbstractMap;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener;
-import org.eclipse.jst.jsf.common.internal.resource.LifecycleListener;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent;
-import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.EventType;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.tld.LoadBundleUtil;
-
-class ResourceBundleMapSource extends AbstractMap
-{
-    private static final String   PROPERTY_QUALIFIER = 
-    	"org.eclipse.jst.jsf.designtime.internal.jsp"; //$NON-NLS-1$
-    private static final String   SESSION_PROPERTY_NAME_PROJECT = 
-    	"ResourceBundleMapSource"; //$NON-NLS-1$
-    private static final QualifiedName  SESSION_PROPERTY_KEY_PROJECT = 
-        new QualifiedName(PROPERTY_QUALIFIER, SESSION_PROPERTY_NAME_PROJECT);
-
-    private static IFile    getCachedBundleFile(final IProject project, final String baseName)
-    {
-        if (project != null)
-        {
-            Map bundleFileCache = getBundleFileCache(project);
-            
-            if (bundleFileCache != null)
-            {
-                return (IFile) bundleFileCache.get(baseName);
-            }
-        }
-
-        return null;
-    }
-
-    private static Map getBundleFileCache(final IProject project)
-    {
-        synchronized(project)
-        {
-            Map bundleFileCache = null;
-
-            try
-            {
-                bundleFileCache = 
-                    (Map) project.getSessionProperty(SESSION_PROPERTY_KEY_PROJECT);
-
-                if (bundleFileCache == null)
-                {
-                    bundleFileCache = new HashMap();
-                    LifecycleListener listener = new LifecycleListener(project);
-                    listener.addListener(new IResourceLifecycleListener()
-                    {
-                        public EventResult acceptEvent(ResourceLifecycleEvent event) 
-                        {
-                            EventResult result = EventResult.getDefaultEventResult();
-                            
-                            if (event.getEventType() == EventType.RESOURCE_INACCESSIBLE)
-                            {
-                                try
-                                {
-                                    Map bundleCache = 
-                                        (Map) project.getSessionProperty(SESSION_PROPERTY_KEY_PROJECT);
-                                    bundleCache.clear();
-                                    project.setSessionProperty(SESSION_PROPERTY_KEY_PROJECT, null);
-                                }
-                                catch (CoreException ce)
-                                {
-                                    JSFCorePlugin.log("Error clearing bundle file cache", ce); //$NON-NLS-1$
-                                }
-                                result = EventResult.getDisposeAfterEventResult();
-                            }
-                            
-                            return result;
-                        }
-                    }
-                    );
-
-                    project.setSessionProperty(SESSION_PROPERTY_KEY_PROJECT, bundleFileCache);
-                }
-            }
-            catch (CoreException ce)
-            {
-                JSFCorePlugin.log("Error creating bundle file cache", ce); //$NON-NLS-1$
-            }
-
-            return bundleFileCache;
-        }
-    }
-
-    private static IFile createCachedBundleFile(final IProject project, 
-                                                   final String  resourcePathStr)
-                      throws IOException, CoreException
-    {
-        IStorage storage = 
-            LoadBundleUtil.getLoadBundleResource(project, resourcePathStr);
-
-        IFile bundleRes = null;
-
-        if (storage != null
-                && storage.getAdapter(IFile.class) != null)
-        {
-            bundleRes = (IFile) storage.getAdapter(IFile.class);
-            getBundleFileCache(project).put(resourcePathStr, bundleRes);
-            return bundleRes;
-        }
-
-        throw new IOException("Bundle "+resourcePathStr+" not found in classpath for project: "+project.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-    private Properties                  _resourceBundle; // = null; set on first access or changes
-    private final IFile                 _bundleFile;   // the resource
-    private final String                _resourcePathStr; // the key used in the file cache
-    // as returned by IResource.getModificationStamp() 
-    // the last time _resourceBundle was loaded
-    private long                        _lastModificationStamp;
-
-    ResourceBundleMapSource(final IProject context, 
-                            final String  resourcePathStr)
-                                throws IOException, JavaModelException, CoreException
-    {
-        IFile cachedBundleFile = getCachedBundleFile(context, resourcePathStr);
-
-        if (cachedBundleFile == null)
-        {
-            cachedBundleFile = createCachedBundleFile(context, resourcePathStr);
-        }
-
-        _bundleFile = cachedBundleFile;
-        _resourcePathStr = resourcePathStr;
-    }
-
-    private void checkAndRefreshBundle()
-    {
-        if (_bundleFile.isAccessible())
-        {
-            if (_resourceBundle == null  // doesn't exist yet
-                    // exists but ws is out of sync
-                    || !_bundleFile.isSynchronized(IResource.DEPTH_ZERO)
-                    // exists but user has changed in workspace
-                    || _bundleFile.getModificationStamp() 
-                            != _lastModificationStamp)
-            {
-                InputStream  bundleStream = null;
-                try
-                {
-                    // force refresh if out of sync
-                    bundleStream = _bundleFile.getContents(true);
-                    _resourceBundle = new Properties();
-                    _resourceBundle.load(bundleStream);
-                    _lastModificationStamp = _bundleFile.getModificationStamp();
-                }
-                catch (CoreException ce)
-                {
-                    JSFCorePlugin.log("Error refreshing bundle", ce); //$NON-NLS-1$
-                }
-                catch (IOException ioe)
-                {
-                    JSFCorePlugin.log("Error refreshing bundle", ioe); //$NON-NLS-1$
-                }
-                finally
-                {
-                    if (bundleStream != null)
-                    {
-                        try
-                        {
-                            bundleStream.close();
-                        }
-                        catch (IOException ioe)
-                        {
-                            JSFCorePlugin.log("Error closing bundle", ioe); //$NON-NLS-1$
-                        }
-                    }
-                }
-            }
-        }
-        else
-        {
-            // bundle no longer exists so remove it
-            Map bundleFileCache = getBundleFileCache(_bundleFile.getProject());
-
-            if (bundleFileCache != null &&
-                    bundleFileCache.containsKey(_resourcePathStr))
-            {
-                bundleFileCache.remove(_resourcePathStr);
-            }
-            // in either case, clear the bundle entry
-            if (_resourceBundle != null)
-            {
-                _resourceBundle.clear();
-                _resourceBundle = null;
-            }
-        }
-    }
-
-    public Set entrySet() 
-    {
-        checkAndRefreshBundle();
-
-        if (_resourceBundle == null)
-        {
-        	return Collections.EMPTY_SET;
-        }
-        return _resourceBundle.entrySet();
-    }
-
-    /** 
-     * @see java.util.AbstractMap#get(java.lang.Object)
-     * @overrride to optimize for the fact that we are doing a hash get
-     */
-    //
-    public Object get(Object key) 
-    {
-        checkAndRefreshBundle();
-
-        if (_resourceBundle == null)
-        {
-        	return null;
-        }
-        return _resourceBundle.get(key);
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSourceFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSourceFactory.java
deleted file mode 100644
index dc2209c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSourceFactory.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
- 
-package org.eclipse.jst.jsf.designtime.internal.symbols;
-
-import java.io.IOException;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.JavaModelException;
-
-/**
- * Factory class for acquiring a ResourceBundleMapSourceFactory outside the local
- * package.   This is intended only for internal testing and related use and 
- * should not be used for normal feature development
- * 
- * @author cbateman
- *
- */
-public class ResourceBundleMapSourceFactory 
-{
-    /**
-     * @param project
-     * @param resourcePathStr
-     * @return a ResourceBundleMapSource
-     * @throws CoreException 
-     * @throws IOException 
-     * @throws JavaModelException 
-     */
-    public static Map getResourceBundleMapSource(final IProject project, 
-                                                 final String resourcePathStr) 
-            throws JavaModelException, IOException, CoreException 
-    {
-        return new ResourceBundleMapSource(project, resourcePathStr);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleSymbolSourceProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleSymbolSourceProvider.java
deleted file mode 100644
index b96b8a8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleSymbolSourceProvider.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.internal.symbols;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.jsf.context.symbol.IComponentSymbol;
-import org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.source.AbstractSymbolSourceProviderFactory;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolSourceProvider;
-import org.eclipse.jst.jsf.core.IJSFCoreConstants;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils;
-import org.eclipse.jst.jsf.designtime.symbols.FileContextUtil;
-import org.eclipse.jst.jsf.designtime.symbols.SymbolUtil;
-import org.eclipse.jst.jsf.facesconfig.emf.BaseNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType;
-import org.eclipse.jst.jsf.facesconfig.emf.VarType;
-
-/**
- * WARNING: this is an interim solution to supporting Faces 1.2 resource
- * bundle variables.  This class will become obsolete by design once
- * the dt framework for Unified EL symbol resolution is added
- * 
- * DO NOT USE THIS CLASS EXTERNALLY, IT WILL BE REMOVED WITHOUT WARNING IN THE FUTURE
- * WITH NO MIGRATION PATH
- * 
- * Self-factory for symbol source providers that contribute symbols for
- * the resource bundle variables declared in Faces 1.2 and greater 
- * app configuration files.
- * 
- * @author cbateman
- *
- */
-public final class ResourceBundleSymbolSourceProvider extends
-        AbstractSymbolSourceProviderFactory implements ISymbolSourceProvider {
-
-    protected final ISymbolSourceProvider create(IProject project) {
-        return this;
-    }
-
-    public final ISymbol[] getSymbols(IAdaptable context, int symbolScopeMask) 
-    {
-       if (isProvider(context))
-       {
-           final List symbols = new ArrayList();
-           final IFile   fileContext = FileContextUtil.deriveIFileFromContext(context);
-           final IProject project = fileContext.getProject();
-           
-           final JSFAppConfigManager appconfigMgr = JSFAppConfigManager.getInstance(project);
-           final List resourceBundles = appconfigMgr.getResourceBundles();
-           
-           for (final Iterator it = resourceBundles.iterator(); it.hasNext();)
-           {
-               ResourceBundleType  resBundle = (ResourceBundleType) it.next();
-               final String  basename = getBaseName(resBundle);
-               final String  name = getVarName(resBundle);
-               
-               if (basename != null && name != null)
-               {
-                   try 
-                   {
-                       symbols.add(createSymbolForResourceBundle(project, name, basename));
-                   } catch (JavaModelException e) {
-                       JSFCorePlugin.log(e, "Error creating base name for: "+basename); //$NON-NLS-1$
-                    } catch (IOException e) {
-                        JSFCorePlugin.log(e, "Error creating base name for: "+basename); //$NON-NLS-1$
-                    } catch (CoreException e) {
-                        JSFCorePlugin.log(e, "Error creating base name for: "+basename); //$NON-NLS-1$
-                    }
-               }
-           }     
-           return (ISymbol[]) symbols.toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-       }
-       return ISymbol.EMPTY_SYMBOL_ARRAY;
-    }
-
-    private ISymbol createSymbolForResourceBundle(IProject project, 
-                                                  final String name,
-                                                  final String basename) throws JavaModelException, IOException, CoreException
-    {
-        // TODO: push down into ResourceBundleMapSourceFactory and share
-        // with loadBundle
-        final Map mapSource = ResourceBundleMapSourceFactory
-            .getResourceBundleMapSource(project, basename);
-        final IMapTypeDescriptor typeDesc = 
-            SymbolFactory.eINSTANCE.createIMapTypeDescriptor();
-        typeDesc.setMapSource(mapSource);
-        final IComponentSymbol symbol = 
-            SymbolFactory.eINSTANCE.createIComponentSymbol();
-        symbol.setName(name);
-        symbol.setTypeDescriptor(typeDesc);
-        symbol.setDetailedDescription(Messages.getString("ResourceBundleSymbolSourceProvider.DetailedDescription")+basename+"</i>");  //$NON-NLS-1$//$NON-NLS-2$
-        return symbol;
-    }
-
-    private String getBaseName(ResourceBundleType resBundle)
-    {
-        final BaseNameType  baseNameType = resBundle.getBaseName();
-        if (baseNameType != null)
-        {
-            return baseNameType.getTextContent();
-        }
-        return null;
-    }
-
-    private String getVarName(ResourceBundleType resBundle)
-    {
-        final VarType  varName = resBundle.getVar();
-        if (varName != null)
-        {
-            return varName.getTextContent();
-        }
-        return null;
-    }
-    
-    public final ISymbol[] getSymbols(String prefix, IAdaptable context,
-            int symbolScopeMask) {
-        return SymbolUtil.
-            filterSymbolsByPrefix(getSymbols(context, symbolScopeMask), prefix);
-    }
-
-    public final boolean isProvider(IAdaptable context) {
-        IFile file = FileContextUtil.deriveIFileFromContext(context);
-        
-        if (file != null)
-        {
-            final IProject project = file.getProject();
-            
-            if (project != null && project.isAccessible())
-            {
-                // to be valid, the jsf project must be at least version 1.2
-                return JSFAppConfigUtils.isValidJSFProject(project, IJSFCoreConstants.FACET_VERSION_1_2);
-            }
-        }
-        
-        return false;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/messages.properties
deleted file mode 100644
index adccd45..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/messages.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-AbstractDataModelVariableFactory.DataModel.Symbol.RowVariable.DetailedDescription=Row variable for dataTable
-JSPDefaultSymbolFactory.Resource.bundle.map.detailedDescription=Resource bundle map for bundle <i>
-JSPDefaultSymbolFactory.Problem.ErrorCreatingVariable=Error creating loadBundle variable
-ResourceBundleSymbolSourceProvider.DetailedDescription=Resource bundle map for bundle <i>
-DefaultBeanSymbolSourceProvider.AdditionalInformation.Name=Name:
-DefaultBeanSymbolSourceProvider.AdditionalInformation.Type=Type:
-DefaultBeanSymbolSourceProvider.AdditionalInformation.Scope=Scope:
-DefaultBeanSymbolSourceProvider.AdditionalInformation.Description=Description:
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/AbstractSymbolContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/AbstractSymbolContextResolver.java
deleted file mode 100644
index 2657732..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/AbstractSymbolContextResolver.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.designtime.resolver;
-
-import org.eclipse.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-
-
-/**
- * An abstract that should sub-classed by clients wishing to implement
- * the ISymbolContextResolver interface
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractSymbolContextResolver implements ISymbolContextResolver 
-{
-    public abstract ISymbol[] getAllVariables();
-
-    public abstract IMethodSymbol getMethod(IObjectSymbol base, Object methodName);
-
-    public abstract ISymbol[] getMethods(IObjectSymbol base);
-
-    public abstract ISymbol[] getProperties(ISymbol symbol);
-
-    public abstract ISymbol getProperty(ISymbol symbol, Object propertyName);
-    
-    public abstract ISymbol getVariable(String name);
-
-    public abstract boolean canResolveContext(IModelContext modelContext);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/ISymbolContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/ISymbolContextResolver.java
deleted file mode 100644
index e6f876e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/ISymbolContextResolver.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.resolver;
-
-import org.eclipse.jst.jsf.context.resolver.IDocumentContextResolver;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-
-/**
- * Resolves symbols and possible symbols in a given context
- * 
- * May NOT be sub-classed or implemented by clients.
- * Sub-class SymbolContextResolver.
- * 
- * @author cbateman
- *
- */
-public interface ISymbolContextResolver extends IDocumentContextResolver 
-{
-	/**
-	 * Gets the most appropriate symbol in the current context
-	 * based on name.  Most "appropriate" may take into account
-	 * scoping and other rules.
-	 * 
-	 * @param name
-	 * @return a symbol
-	 */
-	ISymbol  getVariable(String name);
-	
-	/**
-	 * @return all valid symbols in the current context
-	 */
-	ISymbol[] getAllVariables();
-    
-    /**
-     * @param symbol
-     * @param propertyName
-     * @return the property symbol called propertyName or null if not found
-     */
-    ISymbol getProperty(ISymbol symbol, Object propertyName);
-
-    /**
-     * @param symbol
-     * @return all properties of symbol
-     */
-    ISymbol[]  getProperties(ISymbol symbol);
-    
-    /**
-     * @param base
-     * @param methodName
-     * @return the method of base matching methodName or null if not found
-     */
-    IMethodSymbol getMethod(IObjectSymbol base, Object methodName);
-    
-    /**
-     * @param base
-     * @return all methods belonging to base
-     */
-    ISymbol[] getMethods(IObjectSymbol base);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/StructuredDocumentSymbolResolverFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/StructuredDocumentSymbolResolverFactory.java
deleted file mode 100644
index c0fd95f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/StructuredDocumentSymbolResolverFactory.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.resolver;
-
-import org.eclipse.jst.jsf.context.AbstractDelegatingFactory;
-import org.eclipse.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-/**
- * Factory create resolver capable of resolving symbols in a structured document
- * 
- * Clients may not sub-class.
- * 
- * @author cbateman
- *
- */
-public final class StructuredDocumentSymbolResolverFactory extends
-        AbstractDelegatingFactory 
-{
-    private static StructuredDocumentSymbolResolverFactory INSTANCE;
-    
-    /**
-     * @return the singleton factory instance
-     */
-    public final static synchronized StructuredDocumentSymbolResolverFactory getInstance()
-    {
-        if (INSTANCE == null)
-        {
-            // no delegates supported
-            INSTANCE = new StructuredDocumentSymbolResolverFactory(new Class[0]);
-        }
-        
-        return INSTANCE;
-    }
-    
-    private StructuredDocumentSymbolResolverFactory(Class[] supportedDelegateTypes) 
-    {
-        super(supportedDelegateTypes);
-    }
-
-    /**
-     * @param context
-     * @return a new instance of symbol resolver for context
-     */
-    public ISymbolContextResolver getSymbolContextResolver(IModelContext context) {
-        ISymbolContextResolver  resolver = internalGetSymbolContextResolver(context);
-        
-        if (resolver == null)
-        {
-            resolver = delegateGetSymbolContextResolver(context);
-        }
-        
-        return resolver;
-    }
-    
-    private ISymbolContextResolver internalGetSymbolContextResolver(IModelContext context)
-    {
-        if (context instanceof IStructuredDocumentContext &&
-                ((IStructuredDocumentContext)context).getStructuredDocument() instanceof IStructuredDocument)
-        {
-            return new SymbolContextResolver((IStructuredDocumentContext) context);
-        }
-        
-        return null;
-    }
-    
-    private ISymbolContextResolver delegateGetSymbolContextResolver(IModelContext context)
-    {
-        // no delegates currently supported
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/SymbolContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/SymbolContextResolver.java
deleted file mode 100644
index 981fd83..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/resolver/SymbolContextResolver.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.resolver;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jst.jsf.context.IModelContext;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.designtime.DesignTimeApplicationManager;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-
-/**
- * A symbol context resolver
- * Clients may NOT sub-class.
- * 
- * @author cbateman
- *
- */
-/*package*/ final class SymbolContextResolver extends AbstractSymbolContextResolver 
-{
-    private final IStructuredDocumentContext		_context;
-    private IWorkspaceContextResolver               _wkspResolver; // = null; lazy created through getWorkspaceResolver
-
-	/**
-	 * @param context
-	 */
-	/*package*/ SymbolContextResolver(IStructuredDocumentContext context)
-	{
-		_context = context;
-	}
-
-    public ISymbol getVariable(String name) 
-    {
-        final IFile file = getFile();
-        
-        if (file != null)
-        {
-            final DesignTimeApplicationManager manager =
-                DesignTimeApplicationManager.getInstance(file.getProject());
-            
-            final DTFacesContext facesContext = manager.getFacesContext(file);
-    
-            return manager.getVariableResolver().
-                resolveVariable(facesContext, name, file);
-        }
-        
-        return null;
-    }
-
-    public ISymbol[] getAllVariables() 
-    {
-        final IFile file = getFile();
-        
-        if (file != null)
-        {
-            final DesignTimeApplicationManager manager =
-                DesignTimeApplicationManager.getInstance(file.getProject());
-            
-            final DTFacesContext facesContext = manager.getFacesContext(file);
-            
-            if (facesContext != null)
-            {
-                return manager.getVariableResolver().
-                        getAllVariables(facesContext, file);
-            }
-        }
-        
-        return ISymbol.EMPTY_SYMBOL_ARRAY;
-    }
-    
-    public ISymbol getProperty(ISymbol symbol, Object propertyName) 
-    {
-        final IFile file = getFile();
-        
-        if (file != null)
-        {
-            final DesignTimeApplicationManager manager =
-                DesignTimeApplicationManager.getInstance(file.getProject());
-            return manager.getPropertyResolver().getProperty(symbol, propertyName);
-        }
-        
-        return null;
-    }
-
-    public ISymbol[] getProperties(ISymbol symbol) 
-    {
-        final IFile file = getFile();
-        
-        if (file != null)
-        {
-            final DesignTimeApplicationManager manager =
-                DesignTimeApplicationManager.getInstance(file.getProject());
-            return manager.getPropertyResolver().getAllProperties(symbol);
-        }
-        return ISymbol.EMPTY_SYMBOL_ARRAY;
-    }
-
-    public IMethodSymbol getMethod(IObjectSymbol base, Object methodName)
-    {
-        final IFile file = getFile();
-        
-        if (file != null)
-        {
-            final DesignTimeApplicationManager manager =
-                DesignTimeApplicationManager.getInstance(file.getProject());
-            return manager.getMethodResolver().getMethod(base, methodName);
-        }
-        
-        return null;
-    }
-    
-    public ISymbol[] getMethods(IObjectSymbol base) 
-    {
-        final IFile file = getFile();
-        
-        if (file != null)
-        {
-            final DesignTimeApplicationManager manager =
-                DesignTimeApplicationManager.getInstance(file.getProject());
-            return manager.getMethodResolver().getMethods(base);
-        }
-        
-        return new IMethodSymbol[0];
-    }
-
-    
-	public boolean canResolveContext(IModelContext modelContext)
-    {
-		return modelContext.getAdapter(IStructuredDocumentContext.class) != null;
-	}
-	
-    /**
-     * @return a lazily loaded workspace resolver for this resolver's context
-     */
-    protected final IWorkspaceContextResolver  getWorkspaceResolver()
-    {
-        if (_wkspResolver == null)
-        {
-            _wkspResolver = IStructuredDocumentContextResolverFactory.
-                                INSTANCE.getWorkspaceContextResolver(_context);
-        }
-        
-        return _wkspResolver;
-    }
-    
-    /**
-     * @return the underlying IFile for my context or null if can't be determined
-     */
-    protected final IFile getFile()
-    {
-        final IWorkspaceContextResolver  resolver = getWorkspaceResolver();
-        
-        if (resolver != null)
-        {
-            IResource curRes = resolver.getResource();
-            
-            if (curRes instanceof IFile)
-            {
-                return (IFile) curRes;
-            }
-        }
-        
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/AbstractDataModelVariableFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/AbstractDataModelVariableFactory.java
deleted file mode 100644
index a4dfba4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/AbstractDataModelVariableFactory.java
+++ /dev/null
@@ -1,308 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.designtime.symbols;
-
-import java.util.Arrays;
-import java.util.HashMap;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.common.util.TypeUtil;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.symbol.ERuntimeSource;
-import org.eclipse.jst.jsf.context.symbol.IComponentSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.validation.internal.ValidationPreferences;
-import org.eclipse.jst.jsf.validation.internal.appconfig.AppConfigValidationUtil;
-import org.eclipse.jst.jsf.validation.internal.el.ELExpressionValidator;
-import org.eclipse.jst.jsf.validation.internal.el.IExpressionSemanticValidator;
-import org.w3c.dom.Element;
-
-/**
- * A framework provided variable factory for EL model objects that are
- * constructed based on DataModel's dervied from an EL expression. 
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDataModelVariableFactory 
-{
-    /**
-     * @param elText The EL expression text. Must not be null
-     * @param elContext The document context pointing to elText in the source document. Must not be null
-     * @param file The workspace resource that contains elText. Must not be null.
-     * @return the value expression resolved from elText or null if it cannot
-     * be resolved or elText doesn't resolve to value expression (i.e. is a method expression)
-     */
-    public final ValueType createValueExpression(final String elText, final IStructuredDocumentContext elContext, final IFile file)
-    {
-        assert elText != null;
-        assert elContext != null;
-        assert file != null;
-
-        final ValidationPreferences prefs = 
-            new ValidationPreferences(JSFCorePlugin.getDefault().getPreferenceStore());
-        prefs.load();
-
-        final ELExpressionValidator validator = 
-            new ELExpressionValidator(elContext, elText, file, prefs.getElPrefs());
-        validator.validateXMLNode();
-        final IExpressionSemanticValidator semValidator = 
-            validator.getSemanticValidator();
-        if (semValidator != null
-                && semValidator.getExpressionType() instanceof ValueType)
-        {
-            return (ValueType) semValidator.getExpressionType();
-        }
-        return null;
-    }
-    
-    /**
-     * @param symbolName The name of the symbol to be created. Must not be null
-     * @param signature The type signature of the array type. Must not be null
-     * @param javaProject must not be null
-     * @return a symbol based approximating an implicit DataModel wrapper for an array
-     */
-    protected final ISymbol createArraySymbol(final String symbolName, final String signature, final IJavaProject javaProject)
-    {
-        assert symbolName != null;
-        assert signature != null;
-        assert javaProject != null;
-        
-        final String arrayElementType = Signature.getElementType(signature);
-        final int arrayCount = Signature.getArrayCount(signature);
-        String  adjustedSignature = null;
-        
-        // if it is a single array nesting, then it will just be the element type,
-        // but if it is a multi-dim array, then the scalar element will be an array
-        // with one less nesting level.  It's a strange corner case to have an implicit
-        // array of something as a row type, but it is a valid case.  I suppose
-        // it may be happen if you want to have tables of tables in which the nested tables
-        // in turn use nested variables as their type...
-        if (arrayCount > 0)
-        {
-            adjustedSignature = Signature.createArraySignature(arrayElementType, arrayCount-1);
-        }
-        else
-        {
-            adjustedSignature = arrayElementType;
-        }
-        
-        return createScalarSymbol(symbolName, adjustedSignature, javaProject);
-    }
-
-    /**
-     * Implements default rules for taking an non-array value expression
-     * and resolving it to a ISymbol modelling a JSF DataModel
-     * 
-     * @param symbolName
-     * @param valueType
-     * @param javaProject
-     * @return a symbol where valueType is considered to be the base type upon
-     * which a data model would be created.  This combines the possibility that the
-     * value expression is either an explicit DataModel implementation or a
-     * non-DataModel type for which JSF be default provides an implicit wrapper model.
-     * 
-     * List is treated as a special case here, since their are two subcases:
-     *    1) the list is a raw type, in which case it must be treated as implicit and opaque (as to the type of the variable created)
-     *    2) the list has Java 5 type argument information that can be used to infer the type of the row variable
-     */
-    public ISymbol createFromType(String symbolName, ValueType valueType,
-            IJavaProject javaProject)
-    {
-        return internalCreateFromBaseType(symbolName, valueType, javaProject);
-    }
-    
-    private ISymbol internalCreateFromBaseType(String symbolName, ValueType valueType,
-            IJavaProject javaProject) 
-    {
-        // based on JSF 1.1 spec section 4.2.1.4 the data model
-        // value binding can be one of a number of object that will
-        // get an implicit DataModel wrapper at runtime
-
-        // could be an array
-        if (Signature.getArrayCount(valueType.getSignature())>0)
-        {
-            return createArraySymbol(symbolName, valueType.getSignature(), javaProject);
-        }
-
-        // if is a list, then we have extra work to do if it
-        // is generic and has info about its contents
-        if (valueType.isInstanceOf(TypeConstants.TYPE_LIST))
-        {
-            return createFromList(symbolName, valueType, javaProject);
-        }
-        // if is JSTL ResultSet, java ResultSet or DataModel
-        // return the default symbol -- in the absence of definite
-        // template info, these row containers are opaque to us
-        else if (valueType.isInstanceOf(TypeConstants.TYPE_JAVAX_SERVLET_JSP_JSTL_SQL_RESULT)
-                || valueType.isInstanceOf(TypeConstants.TYPE_RESULT_SET)
-                || valueType.isInstanceOf(TypeConstants.TYPE_DATA_MODEL))
-        {
-            return createDefaultSymbol(symbolName);
-        }
-            
-        // in other cases, we assume that the value is an explicit single row
-        // scalar object
-        return createScalarSymbol(symbolName, valueType.getSignature(), javaProject);
-    }
-
-    /**
-     * @param symbolName The name of the symbol to create. Must not be null.
-     * @param valueType The value expression representing the implicit list.  The signature
-     * on the valueType must be a list. Must not be null.
-     * @param javaProject The JavaProject whose classpath will be used to resolve types.  Must not be null.
-     * 
-     * @return a symbol that approximates as best as possible an implicit DataModel for java.util.List value expressions.  If the List has
-     * resolvable Java 5 type arguments, then a scalar symbol will be created
-     * using this type information.  If it is a raw type, then 
-     * createDefaultSymbol() is called
-     */
-    protected final ISymbol createFromList(String symbolName, ValueType valueType, IJavaProject javaProject) 
-    {
-        assert symbolName != null;
-        assert valueType != null;
-        assert javaProject != null;
-        assert TypeConstants.TYPE_LIST.equals(valueType.getSignature());
-        
-        final String[] typeArguments = valueType.getTypeArguments();
-        
-        if (typeArguments != null && typeArguments.length > 0)
-        {
-            // a list has a single type argument
-            final String typeArg = typeArguments[0];
-
-            if (Signature.getTypeSignatureKind(typeArg) == Signature.CLASS_TYPE_SIGNATURE)
-            {
-                return createScalarSymbol(symbolName, typeArg, javaProject);
-            }
-        }
-        
-        // if no resolvable type signatures, do the default thing
-        return createDefaultSymbol(symbolName);
-    }
-
-
-    /**
-     * @param symbolName The name of the symbol to create. Must not be null.
-     * @param signature The fully resolved type signature of the scalar.  Must not be null.
-     * @param javaProject The JavaProject whose classpath is to be used to resolve type information for signture. Must not be null.
-     * @return a symbol approximating a scalar object DataModel wrapper.  The row variable for the
-     * data model becomes of type signature
-     */
-    protected final ISymbol createScalarSymbol(final String symbolName, final String signature, final IJavaProject javaProject)
-    {
-        assert symbolName != null;
-        assert signature != null;
-        assert javaProject != null;
-
-        final String elementType = Signature.getElementType(signature);
-        
-        IJavaTypeDescriptor2 desc = 
-            SymbolFactory.eINSTANCE.createIJavaTypeDescriptor2();
-        final int arrayCount = Signature.getArrayCount(signature);
-        if (arrayCount > 0)
-        {
-            desc.setArrayCount(arrayCount);
-        }
-        
-        IType type = TypeUtil.resolveType(javaProject, elementType);
-        if (type != null)
-        {
-            desc.setType(type);
-        }
-        else
-        {
-            desc.setTypeSignatureDelegate(Signature.getTypeErasure(signature));
-        }
-        desc.getTypeParameterSignatures().addAll(Arrays.asList(Signature.getTypeArguments(signature)));
-
-        IComponentSymbol symbol = SymbolFactory.eINSTANCE.createIComponentSymbol();
-        symbol.setName(symbolName);
-        symbol.setTypeDescriptor(desc);
-        symbol.setRuntimeSource(ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL);
-        return symbol;
-    }
-   
-    /**
-     * @param symbolName The name of the symbol to create.  Must not be null
-     * @return a default symbol that eliminates bogus warnings for this dataTable's
-     * row variable in cases where something better is resolvable.  Note that this is
-     * not ideal, since will result in any property being accepted on the variable with
-     * this name.
-     */
-    public final ISymbol createDefaultSymbol(final String symbolName)
-    {
-        assert symbolName != null;
-        
-        final IMapTypeDescriptor typeDesc = 
-            SymbolFactory.eINSTANCE.createIBoundedMapTypeDescriptor();
-        // empty map source
-        typeDesc.setMapSource(new HashMap());
-        final IComponentSymbol symbol = 
-            SymbolFactory.eINSTANCE.createIComponentSymbol();
-        symbol.setName(symbolName);
-        symbol.setTypeDescriptor(typeDesc);
-        symbol.setDetailedDescription(Messages.getString("AbstractDataModelVariableFactory.DataModel.Symbol.RowVariable.DetailedDescription")); //$NON-NLS-1$
-        symbol.setRuntimeSource(ERuntimeSource.TAG_INSTANTIATED_SYMBOL_LITERAL);
-        return symbol;
-    }
-    
-    /**
-     * @param dataTableElement the DOM element that has a "value" attribute.
-     * Must not be null.
-     * @return the el text from the 'value attribute of a dataTable element
-     * or null if not found
-     */
-    protected static String getELText(final Element dataTableElement)
-    {
-        assert dataTableElement != null;
-        String attrVal = dataTableElement.getAttribute(IJSFConstants.ATTR_VALUE);
-        
-        if (attrVal != null)
-        {
-            return AppConfigValidationUtil.extractELExpression(attrVal).getElText();
-        }
-        return null;
-    }
-    
-    /**
-     * @return the variable source name.  Protects against null in the abstract method
-     */
-    protected final String internalGetVariableSourceName()
-    {
-        String variableSourceName = getVariableSourceName();
-        
-        if (variableSourceName == null)
-        {
-            JSFCorePlugin.log("Missing variableSourceName", new Throwable()); //$NON-NLS-1$
-            return "**missing variable source name**"; //$NON-NLS-1$
-        }
-        
-        return variableSourceName;
-    }
-
-    /**
-     * @return a user displayable name for the source of variables created by this factory
-     * Must not return null.
-     */
-    protected abstract String getVariableSourceName();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultBeanSymbolSourceProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultBeanSymbolSourceProvider.java
deleted file mode 100644
index 29614fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultBeanSymbolSourceProvider.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.symbols;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jst.jsf.context.symbol.ERuntimeSource;
-import org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolConstants;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-
-/**
- * Self-factory provider of bean symbol information for a particular project.
- * 
- * Context is determined by querying all known managed beans declared in a 
- * web project.
- * 
- * Client may sub-class
- * 
- * @author cbateman
- *
- */
-public class DefaultBeanSymbolSourceProvider
-{
-    private static DefaultBeanSymbolSourceProvider  INSTANCE;
-
-    /**
-     * @return the singleton instance of the provider
-     */
-    public static DefaultBeanSymbolSourceProvider getInstance()
-    {
-        if (INSTANCE == null)
-        {
-            INSTANCE = new DefaultBeanSymbolSourceProvider();
-        }
-
-        return INSTANCE;
-    }
-
-    /**
-     * No external instantiation
-     * 
-     * Left protected to allow sub-classing
-     */
-    protected DefaultBeanSymbolSourceProvider() {/* empty */}
-    
-    /**
-     * @param context
-     * @param symbolScopeMask
-     * @return all bean symbols for the context at scopes matching symbolScopeMask
-     */
-    public ISymbol[] getSymbols(IAdaptable context, int symbolScopeMask) 
-    {
-        final IFile file = FileContextUtil.deriveIFileFromContext(context);
-        if (file != null)
-        {
-            final IProject  myProject = file.getProject();
-            List  managedBeans = getManagedBeanSymbols(myProject, symbolScopeMask);
-            return (ISymbol[]) managedBeans.toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-        }
-        
-        return ISymbol.EMPTY_SYMBOL_ARRAY;
-    }
-
-    /**
-     * @param name
-     * @param context
-     * @param symbolScopeMask
-     * @return the symbol called name, in context/symbolScope
-     */
-    public ISymbol getSymbol(final String name, final IAdaptable context, 
-                             final int symbolScopeMask)
-    {
-        return SymbolUtil.
-                findSymbolByName(getSymbols(context, symbolScopeMask), name);
-    }
-    
-    /**
-     * @param prefix
-     * @param context
-     * @param symbolScopeMask
-     * @return all symbols for context and symbolScopeMask that start with
-     * prefix
-     */
-    public ISymbol[] getSymbols(String prefix, IAdaptable context,
-            int symbolScopeMask) {
-        return SymbolUtil.
-            filterSymbolsByPrefix(getSymbols(context, symbolScopeMask), prefix);
-    }
-
-    private List getManagedBeanSymbols(IProject iProject, int symbolScopeMask)
-    {
-        List   symbols = new ArrayList();
-        
-        final JSFAppConfigManager  configManager = JSFAppConfigManager.getInstance(iProject);
-        
-
-        if (configManager != null)
-        {
-            for (final Iterator aIt = configManager.getManagedBeans().iterator(); aIt.hasNext();)
-            {
-                ManagedBeanType  bean = (ManagedBeanType) aIt.next();
-                
-                // only bother with all this if we care about the scope of this bean
-                if (isBeanScopeInMask(bean.getManagedBeanScope(), symbolScopeMask))
-                {
-                    final String name = bean.getManagedBeanName().getTextContent();
-                    final String detailedDescription = createAdditionalProposalInfo(bean);
-                    IBeanInstanceSymbol symbol = SymbolFactory.eINSTANCE.createIBeanInstanceSymbol();
-                    symbol.setName(name);
-                    symbol.setDetailedDescription(detailedDescription);
-                    symbol.setRuntimeSource(ERuntimeSource.MANAGED_BEAN_SYMBOL_LITERAL);
-                    try
-                    {
-                        IJavaProject javaProject = JavaCore.create(iProject);
-                        IType type = javaProject.findType(bean.getManagedBeanClass().getTextContent());
-                        
-                        // don't bother setting a type descriptor if we
-                        // can't find a type
-                        if (type != null)
-                        {
-                            IJavaTypeDescriptor2 javaTypeDescriptor = SymbolFactory.eINSTANCE.createIJavaTypeDescriptor2();
-                            javaTypeDescriptor.setType(type);
-                            symbol.setJavaTypeDescriptor(javaTypeDescriptor);
-                        }
-                    }
-                    catch (Exception t)
-                    {
-                        // do nothing; skip type info for this bean
-                    }
-                    symbols.add(symbol);
-                }
-            }
-        }
-            
-        return symbols;
-    }
-    
-    private String createAdditionalProposalInfo(ManagedBeanType beanType)
-    {
-        StringBuffer additionalInfo = new StringBuffer("<p><b>"); //$NON-NLS-1$
-        additionalInfo.append(Messages.getString("DefaultBeanSymbolSourceProvider.AdditionalInformation.Name")); //$NON-NLS-1$
-        additionalInfo.append("</b>"); //$NON-NLS-1$
-        additionalInfo.append(beanType.getManagedBeanName().getTextContent());
-        additionalInfo.append("</p><p><b>"); //$NON-NLS-1$
-        additionalInfo.append(Messages.getString("DefaultBeanSymbolSourceProvider.AdditionalInformation.Type")); //$NON-NLS-1$
-        additionalInfo.append(" </b>"); //$NON-NLS-1$
-        additionalInfo.append(beanType.getManagedBeanClass().getTextContent());
-        additionalInfo.append("</p><p><b>"); //$NON-NLS-1$
-        additionalInfo.append(Messages.getString("DefaultBeanSymbolSourceProvider.AdditionalInformation.Scope")); //$NON-NLS-1$
-        additionalInfo.append("</b>"); //$NON-NLS-1$
-        additionalInfo.append(beanType.getManagedBeanScope().getTextContent());
-        additionalInfo.append("</p>"); //$NON-NLS-1$
-        
-        StringBuffer descBuffer = new StringBuffer();
-        
-        for (final Iterator it = beanType.getDescription().iterator(); it.hasNext();)
-        {
-            final DescriptionType descType = (DescriptionType) it.next();
-            final String appendString = descType.getTextContent();
-            if (appendString != null)
-            {
-                descBuffer.append(appendString);
-            }
-        }
-        
-        if (descBuffer.length() > 0)
-        {
-            additionalInfo.append("<p><b>"); //$NON-NLS-1$
-            additionalInfo.append(Messages.getString("DefaultBeanSymbolSourceProvider.AdditionalInformation.Description")); //$NON-NLS-1$
-            additionalInfo.append("</b>"); //$NON-NLS-1$
-            additionalInfo.append(descBuffer);
-            additionalInfo.append("</p>"); //$NON-NLS-1$
-        }
-        
-        return additionalInfo.toString();
-    }
-
-   
-    private boolean isBeanScopeInMask(final ManagedBeanScopeType scope, final int scopeMask)
-    {
-        final int testScope = ISymbolConstants.getMaskForString(scope.getTextContent());
-        
-        if (testScope != -1)
-        {
-            return (scopeMask & testScope) != 0;
-        }
-        
-        // no other cases supported
-        return false;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultBuiltInSymbolProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultBuiltInSymbolProvider.java
deleted file mode 100644
index 5d10944..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultBuiltInSymbolProvider.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.symbols;
-
-import java.util.AbstractMap;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.context.symbol.ERuntimeSource;
-import org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
-import org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.SymbolFactory;
-import org.eclipse.jst.jsf.context.symbol.source.ISymbolConstants;
-import org.eclipse.jst.jsf.designtime.DesignTimeApplicationManager;
-import org.eclipse.jst.jsf.designtime.context.IDTExternalContext;
-
-/**
- * Provides the default built-in JSF symbols
- * 
- * Clients may sub-class
- * 
- * @author cbateman
- *
- */
-public class DefaultBuiltInSymbolProvider 
-{
-    private static DefaultBuiltInSymbolProvider  INSTANCE;
-    
-    /**
-     * @return the singleton instance
-     */
-    public synchronized static DefaultBuiltInSymbolProvider getInstance()
-    {
-        if (INSTANCE == null)
-        {
-            INSTANCE = new DefaultBuiltInSymbolProvider();
-        }
-        
-        return INSTANCE;
-    }
-    
-    
-    private static final String APPLICATION_SCOPE = "applicationScope"; //$NON-NLS-1$
-    private static final String SESSION_SCOPE = "sessionScope"; //$NON-NLS-1$
-    private static final String REQUEST_SCOPE = "requestScope"; //$NON-NLS-1$
-    private static final String COOKIE_IMPLICIT_OBJ = "cookie"; //$NON-NLS-1$
-    private static final String FACES_CONTEXT_IMPLICIT_OBJ = "facesContext"; //$NON-NLS-1$
-    private static final String HEADER_IMPLICIT_OBJ = "header"; //$NON-NLS-1$
-    private static final String HEADER_VALUES_IMPLICIT_OBJ = "headerValues"; //$NON-NLS-1$
-    private static final String INIT_PARAM_IMPLICIT_OBJ = "initParam"; //$NON-NLS-1$
-    private static final String PARAM_IMPLICIT_OBJ = "param"; //$NON-NLS-1$
-    private static final String PARAM_VALUES_IMPLICIT_OBJ = "paramValues"; //$NON-NLS-1$
-    private static final String VIEW_IMPLICIT_OBJ = "view"; //$NON-NLS-1$
-
-    private static final String FACES_CONTEXT_FULLY_QUALIFIED_CLASS =
-        "javax.faces.context.FacesContext"; //$NON-NLS-1$
-    private static final String VIEW_FULLY_QUALIFIED_CLASS =
-        "javax.faces.component.UIViewRoot"; //$NON-NLS-1$
-    
-    /**
-     * Now direct instantiation -- use getInstance
-     * 
-     * Made protected to allow sub-classing
-     */
-    protected DefaultBuiltInSymbolProvider() {/* empty; do nothing */}
-    
-    /**
-     * @param context
-     * @param symbolScopeMask
-     * @return all symbols for context in scopes matching symbolScopeMask
-     */
-    public ISymbol[] getSymbols(IAdaptable context, int symbolScopeMask) 
-    {
-        final IFile   fileContext = FileContextUtil.deriveIFileFromContext(context);
-        return (ISymbol[]) getSymbolsForScope(fileContext, symbolScopeMask).toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-    }
-
-    /**
-     * @param name
-     * @param context
-     * @param symbolScopeMask 
-     * @return the symbol in context matching name or null if not found
-     */
-    public ISymbol getSymbol(String name, IAdaptable context, int symbolScopeMask)
-    {
-        return SymbolUtil.
-                    findSymbolByName(getSymbols(context, symbolScopeMask), name);
-    }
-    
-    /**
-     * @param prefix
-     * @param context
-     * @param symbolScopeMask
-     * @return all implicit symbols for context starting with prefix in
-     * scopes matching symbolScopeMask
-     */
-    public ISymbol[] getSymbols(String prefix, IAdaptable context, int symbolScopeMask) 
-    {
-        return SymbolUtil.
-            filterSymbolsByPrefix(getSymbols(context, symbolScopeMask), prefix);
-    }
-
-    private List getSymbolsForScope(final IFile file, final int symbolScopeMask)
-    {
-        List symbols = new ArrayList();
-        if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_REQUEST) != 0)
-        {
-            symbols.addAll(getRequestScopeSymbols(file));
-        }
-        if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_SESSION) != 0)
-        {
-            symbols.addAll(getSessionScopeSymbols(file));
-        }
-        if ((symbolScopeMask & ISymbolConstants.SYMBOL_SCOPE_APPLICATION) != 0)
-        {
-            symbols.addAll(getApplicationScopeSymbols(file));
-        }
-
-        return symbols;
-    }
-    
-    private List getRequestScopeSymbols(final IFile file)
-    {
-        List symbols = new ArrayList();
-        
-        symbols.add(createScopeSymbol(file, ISymbolConstants.SYMBOL_SCOPE_REQUEST, REQUEST_SCOPE));
-        symbols.add(createUnresolvedMapSymbol(COOKIE_IMPLICIT_OBJ));
-        symbols.add(createUnresolvedMapSymbol(HEADER_IMPLICIT_OBJ));
-        symbols.add(createUnresolvedMapSymbol(HEADER_VALUES_IMPLICIT_OBJ));
-        symbols.add(createUnresolvedMapSymbol(PARAM_IMPLICIT_OBJ));
-        symbols.add(createUnresolvedMapSymbol(PARAM_VALUES_IMPLICIT_OBJ));
-        // TODO: these aren't maps; need to find way to handle
-        symbols.add(createJavaInstanceSymbol(file.getProject(), FACES_CONTEXT_FULLY_QUALIFIED_CLASS, FACES_CONTEXT_IMPLICIT_OBJ));
-        symbols.add(createJavaInstanceSymbol(file.getProject(), VIEW_FULLY_QUALIFIED_CLASS, VIEW_IMPLICIT_OBJ));
-
-        return symbols;
-    }
-    
-    private List getSessionScopeSymbols(final IFile file)
-    {
-        return Collections.
-            singletonList
-                (createScopeSymbol
-                        (file, ISymbolConstants.SYMBOL_SCOPE_SESSION, SESSION_SCOPE));
-    }
-    
-    private List getApplicationScopeSymbols(final IFile file)
-    {
-        List symbols = new ArrayList();
-
-        // TODO: may be able to resolve this one based on web.xml
-        symbols.add(createUnresolvedMapSymbol(INIT_PARAM_IMPLICIT_OBJ));
-        symbols.add(createScopeSymbol
-                        (file, ISymbolConstants.SYMBOL_SCOPE_APPLICATION, APPLICATION_SCOPE));
-        
-        return symbols;
-    }
-    
-    private ISymbol createScopeSymbol(final IFile file, final int scopeMask, final String name)
-    {
-        final Map  mapSource = new ScopeMap(file, 
-                scopeMask);
-        final IMapTypeDescriptor typeDesc = 
-            SymbolFactory.eINSTANCE.createIMapTypeDescriptor();
-        typeDesc.setMapSource(mapSource);
-        typeDesc.setImmutable(false);  // scope maps are mutable
-        final IInstanceSymbol symbol = 
-            SymbolFactory.eINSTANCE.createIInstanceSymbol();
-        symbol.setName(name);
-        symbol.setRuntimeSource(ERuntimeSource.BUILT_IN_SYMBOL_LITERAL);
-        symbol.setTypeDescriptor(typeDesc);
-        // TODO:symbol.setDetailedDescription("A Map of the application scope attribute values, keyed by attribute name");
-        
-        return symbol;
-    }
-
-    // TODO: this one may be able to be factored up to the symbols plugin
-    private ISymbol createUnresolvedMapSymbol(final String name)
-    {
-        final IMapTypeDescriptor typeDesc = 
-            SymbolFactory.eINSTANCE.createIMapTypeDescriptor();
-        typeDesc.setMapSource(Collections.EMPTY_MAP);
-        final IInstanceSymbol symbol =
-            SymbolFactory.eINSTANCE.createIInstanceSymbol();
-        symbol.setName(name);
-        symbol.setRuntimeSource(ERuntimeSource.BUILT_IN_SYMBOL_LITERAL);
-        symbol.setTypeDescriptor(typeDesc);
-
-        return symbol;
-    }
-    
-    private ISymbol createJavaInstanceSymbol(IProject project,
-                                             String fullyQualifiedClass,
-                                             String symbolName)
-    {
-        final IJavaProject javaProject = JavaCore.create(project);
-        try
-        {
-            final IType type =
-                javaProject.findType(fullyQualifiedClass);
-            
-            // TODO: this is a high-bred since it consists of a java instance
-            // but also has properties we can populate at designtime such as
-            // the maps.  Need to add the second part
-            if (type != null)
-            {
-                final IJavaTypeDescriptor2 typeDesc =
-                    SymbolFactory.eINSTANCE.createIJavaTypeDescriptor2();
-                typeDesc.setType(type);
-                IBeanInstanceSymbol  facesContextVar =
-                    SymbolFactory.eINSTANCE.createIBeanInstanceSymbol();
-                facesContextVar.setTypeDescriptor(typeDesc);
-                facesContextVar.setName(symbolName);
-                return facesContextVar;
-            }
-        }
-        catch(JavaModelException jme)
-        {
-            // fall-through and fail with unresolved map
-        }
-        
-        ISymbol symbol = createUnresolvedMapSymbol(symbolName);
-        ((IInstanceSymbol)symbol).getTypeDescriptor().
-                  setTypeSignatureDelegate(Signature.createTypeSignature(fullyQualifiedClass, true));
-        
-        return symbol;
-    }
-    
-    private static class ScopeMap extends AbstractMap
-    {
-        private final IFile              _externalContextKey;
-        private final int                _scopeMask;
-        
-        ScopeMap(   IFile   externalContextKey,
-                    int scopeMask)
-        {
-            _externalContextKey = externalContextKey;
-            _scopeMask = scopeMask;
-        }
-        
-        public Set entrySet() 
-        {
-            final Map  scopeMap = new HashMap(); 
-            final DesignTimeApplicationManager  manager =
-                DesignTimeApplicationManager.
-                    getInstance(_externalContextKey.getProject());
-
-            // do beans first so in case of name collision, beans are hidden
-            final DefaultBeanSymbolSourceProvider  beanProvider = 
-                DefaultBeanSymbolSourceProvider.getInstance();
-
-            final ISymbol beanSymbols[] = 
-                beanProvider.getSymbols(_externalContextKey, _scopeMask);
-            
-            for (int i = 0; i < beanSymbols.length; i++)
-            {
-                scopeMap.put(beanSymbols[i].getName(), beanSymbols[i]);
-            }
-
-            final IDTExternalContext  externalContext =
-                manager.getFacesContext(_externalContextKey).
-                    getDTExternalContext(_externalContextKey);
-
-            scopeMap.putAll(externalContext.getMapForScope(_scopeMask));
-            
-            return scopeMap.entrySet();
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultDataTableSymbolFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultDataTableSymbolFactory.java
deleted file mode 100644
index 94f2ce2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultDataTableSymbolFactory.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.designtime.symbols;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.w3c.dom.Element;
-
-/**
- * The default factory for creating DataModel symbols based on an value expression
- * in a dataTable.
- * 
- * Clients may sub-class.
- * 
- * @author cbateman
- *
- */
-public class DefaultDataTableSymbolFactory 
-{
-    private final AbstractDataModelVariableFactory  _dataModelSymbolFactory;
-    
-    /**
-     * @param dataModelSymbolFactory
-     */
-    public DefaultDataTableSymbolFactory(AbstractDataModelVariableFactory  dataModelSymbolFactory)
-    {
-        assert dataModelSymbolFactory != null;
-        _dataModelSymbolFactory = dataModelSymbolFactory;
-    }
-    
-    /**
-     * @param symbolName the name of the symbol to be created.  Must not be null.
-     * @param dataTableElement the DOM element representing the dataTable tag.
-     * @param context the document context pointing to dataTableElement
-     * @return a symbol named symbolName based on the variable declared
-     * by dataTableElement
-     */
-    public ISymbol createSymbolForDataTableValue(final String symbolName, 
-                                final Element  dataTableElement, 
-                                final IStructuredDocumentContext context)
-    {
-        final String elText = AbstractDataModelVariableFactory.getELText(dataTableElement);
-        final IFile file = FileContextUtil.deriveIFileFromContext(context);
-        
-        if (elText != null && file != null)
-        {
-            final IStructuredDocumentContext elContext =
-                IStructuredDocumentContextFactory.INSTANCE.getContext(context.getStructuredDocument(), dataTableElement.getAttributeNode("value"));   //$NON-NLS-1$
-
-            final IJavaProject javaProject = JavaCore.create(file.getProject());
-            
-            final ValueType valueExpr = _dataModelSymbolFactory.createValueExpression(elText, elContext, file);
-            
-            if (valueExpr != null)
-            {
-                // otherwise, we have to try to resolve the base type and see
-                // if it's an instanceof any of the supported implicit or explict types
-                return _dataModelSymbolFactory.createFromType(symbolName, valueExpr, javaProject);
-            }
-        }
-        
-        // by default create a default
-        return _dataModelSymbolFactory.createDefaultSymbol(symbolName);
-    }    
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/FileContextUtil.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/FileContextUtil.java
deleted file mode 100644
index 0e5c8cb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/FileContextUtil.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.symbols;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-
-/**
- * Utility for deriving an IFile from an IAdaptable
- * 
- * @author cbateman
- *
- */
-public final class FileContextUtil 
-{
-    /**
-     * @param context
-     * @return an IFile derived from context or null if not derivable
-     */
-    public static IFile deriveIFileFromContext(IAdaptable context)
-    {
-        // 
-        if (context instanceof IFile)
-        {
-            return (IFile) context;
-        }
-        else if (context.getAdapter(IFile.class) != null)
-        {
-            return (IFile) context.getAdapter(IFile.class);
-        }
-        else if (context instanceof IStructuredDocumentContext)
-        {
-            return deriveIFileFromContext((IStructuredDocumentContext)context);
-        }
-        else
-        {
-            IStructuredDocumentContext  sdContext = 
-                (IStructuredDocumentContext) context.getAdapter(IStructuredDocumentContext.class);
-            
-            if (sdContext != null)
-            {
-                return deriveIFileFromContext(sdContext);
-            }
-        }
- 
-        return null;
-    }
-    
-    private static IFile deriveIFileFromContext(IStructuredDocumentContext context)
-    {
-        IWorkspaceContextResolver resolver = 
-            IStructuredDocumentContextResolverFactory.
-                INSTANCE.
-                    getWorkspaceContextResolver(context);
-        
-        if (resolver != null)
-        {
-            IResource res = resolver.getResource();
-            
-            if (res instanceof IFile)
-            {
-                return (IFile) res;
-            }
-        }
-        
-        return null;
-    }
-    
-    private FileContextUtil()
-    {
-        // no instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/Messages.java
deleted file mode 100644
index e68910e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/Messages.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.designtime.symbols;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/*package*/ class Messages {
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.designtime.messages"; //$NON-NLS-1$
-
-    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-            .getBundle(BUNDLE_NAME);
-
-    private Messages() {
-        // no external instantiation
-    }
-
-    /**
-     * @param key
-     * @return the resource or !key! if not found.
-     */
-    public static String getString(String key) {
-        try {
-            return RESOURCE_BUNDLE.getString(key);
-        } catch (MissingResourceException e) {
-            return '!' + key + '!';
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/SymbolUtil.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/SymbolUtil.java
deleted file mode 100644
index 101310c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/SymbolUtil.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.designtime.symbols;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-
-/**
- * Utilities for symbol handling
- * 
- * @author cbateman
- *
- */
-public final class SymbolUtil 
-{
-    /**
-     * @param symbols
-     * @param name
-     * @return the symbol in symbols matching name or null if not there
-     */
-    public static ISymbol  findSymbolByName(final ISymbol[] symbols, final String name)
-    {
-        for (int i = 0; i < symbols.length; i++)
-        {
-            if (name.equals(symbols[i].getName()))
-            {
-                return symbols[i];
-            }
-        }
-        
-        // if not found, return null
-        return null;
-    }
-    
-    /**
-     * @param allSymbols
-     * @param prefix
-     * @return an array of symbols filtered based on name.startsWith(prefix)
-     */
-    public static ISymbol[]  filterSymbolsByPrefix(final ISymbol[] allSymbols, final String prefix) 
-    {
-        List   filteredSymbols = new ArrayList(allSymbols.length);
-        for (int i = 0; i < allSymbols.length; i++)
-        {
-            if (allSymbols[i].getName().startsWith(prefix))
-            {
-                filteredSymbols.add(allSymbols[i]);
-            }
-        }
-        
-        return (ISymbol[])
-            filteredSymbols.toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-    }
-    
-    private SymbolUtil()
-    {
-        // no external instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/AbstractMetaDataEnabledFeature.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/AbstractMetaDataEnabledFeature.java
deleted file mode 100644
index e6f65ab..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/AbstractMetaDataEnabledFeature.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.IImageDescriptorProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-
-/**
- * Simple abstract class that implementers of {@link IMetaDataEnabledFeature} can subclass in the <b>TagLibDomain</b> of metadata
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- * 
- *
- */
-public abstract class AbstractMetaDataEnabledFeature implements IMetaDataEnabledFeature{
-	
-	private MetaDataContext mdContext;
-	private IStructuredDocumentContext sdContext;
-	
-	private static final List EMPTY_LIST = new ArrayList(0);
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature#setMetaDataContext(org.eclipse.jst.jsf.metadataprocessors.MetaDataContext)
-	 */
-	public void setMetaDataContext(final MetaDataContext context) {
-		this.mdContext = context;		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature#getMetaDataContext()
-	 */
-	public MetaDataContext getMetaDataContext() {
-		return mdContext;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature#setStructuredDocumentContext(org.eclipse.wtp.jsf.context.structureddocument.IStructuredDocumentContext)
-	 */
-	public void setStructuredDocumentContext(final IStructuredDocumentContext context) {
-		this.sdContext = context;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature#getStructuredDocumentContext()
-	 */
-	public IStructuredDocumentContext getStructuredDocumentContext() {
-		return sdContext;
-	}
-	
-//	private IProject getProject(){
-//		if (_project == null){
-//			_project = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(sdContext).getProject();
-//		}
-//		return _project;
-//	}
-
-	
-	//common metadata accessors
-	/**
-	 * Return the single expected String value for a given property.
-	 * 
-	 * Since the MetaDataContext, where the type-id was found, 
-	 * may have come from a wild card, or the property being looked up now is,
-	 * we should first look for the named property on the specific element and
-	 * only if not found, look for it on the * element.
-	 * 
-	 * @param traitName property name
-	 * @return String value
-	 */
-	protected String getTraitValueAsString(final String traitName){	
-		Trait t = getTraitForEntityUsingContext(traitName);
-		if (t != null){
-			return TraitValueHelper.getValueAsString(t);
-		}
-				
-		return null;
-
-	}
-	
-	/**
-	 * Return the List of values for a given property.
-	 * 
-	 * Since the MetaDataContext, where the type-id was found, 
-	 * may have come from a wild card, or the property being looked up now is,
-	 * we should first look for the named property on the specific element and
-	 * only if not found, look for it on the * element.
-	 * 
-	 * @param traitName trait name
-	 * @return List of String values
-	 */
-	protected List getTraitValueAsListOfStrings(final String traitName){
-		Trait t = getTraitForEntityUsingContext(traitName);
-		if (t != null){
-			return TraitValueHelper.getValueAsListOfStrings(t);
-		}
-			
-		return EMPTY_LIST;
-	}
-
-	private Trait getTraitForEntityUsingContext(final String traitName) {
-		//look for trait on given entity
-		final Entity entity = ((TaglibMetadataContext)getMetaDataContext()).getEntity();
-		return TaglibDomainMetaDataQueryHelper.getTrait(entity, traitName);
-	}
-
-	/**
-	 * @return small-icon name 
-	 */
-	protected String getSmallIcon() {
-		return getTraitValueAsString(IPossibleValues.POSSIBLE_VALUES_SMALL_ICON_PROP_NAME);
-	}
-	
-	/**
-	 * @return ImageDescriptor from the small-icon property for annotation from the same
-	 * source model provider as the trait
-	 */
-	protected ImageDescriptor getImage() {
-		final String smallIcon = getSmallIcon();
-		if (smallIcon == null)
-			return null;
-		
-		try {
-			Trait t = getMetaDataContext().getTrait();
-			IMetaDataSourceModelProvider provider = t.getSourceModelProvider();
-			IImageDescriptorProvider ip = (IImageDescriptorProvider)provider.getAdapter(IImageDescriptorProvider.class);
-			if (ip != null){
-				return ip.getImageDescriptor(smallIcon);
-			}
-		} catch (RuntimeException e) {		
-			//TODO: log error?
-
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/AbstractRootTypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/AbstractRootTypeDescriptor.java
deleted file mode 100644
index 4a22c20..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/AbstractRootTypeDescriptor.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.jsf.metadataprocessors.internal.IMetaDataEnabledFeatureExtension;
-import org.eclipse.jst.jsf.metadataprocessors.internal.MetaDataEnabledFeatureAdapterFactory;
-import org.eclipse.jst.jsf.metadataprocessors.internal.MetaDataEnabledFeatureRegistry;
-
-
-/**
- * Default implementation that a metadata type should strongly consider for using as it's root.
- * This implementation allows for a class implementing {@link ITypeDescriptor} to also contain features so
- * that it is not necessary to declare the features using the MetaDataEnabledFeatures ext-pt 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public abstract class AbstractRootTypeDescriptor extends AbstractMetaDataEnabledFeature
-		implements ITypeDescriptor {
-	
-	private IType type;
-	
-	/**
-	 * Default implementation that will return <code>this</code> if it supports the processing feature,
-	 * and all {@link IMetaDataEnabledFeature}s that also support this feature on this type.   The caller can determine
-	 * which one or more of the returned processors to use.
-	 *    
-	 * @param processingFeature class
-	 * @return List of <code>IMetaDataEnabledFeature</code>s that support the
-	 * specified featureType interface.  
-	 * 
-	 * @see org.eclipse.jst.jsf.metadataprocessors.ITypeDescriptor#getFeatureAdapters(java.lang.Class)
-	 */
-	public List getFeatureAdapters(Class processingFeature) {
-		Assert.isTrue(processingFeature.isInterface());
-		List ret = new ArrayList(3);
-		if (processingFeature.isInstance(this)) {
-//			((IMetaDataEnabledFeature)this).setBundleID(type.getBundleID());
-			ret.add(this);
-		}
-		
-		//add extensions here
-		ret.addAll(findMetaDataEnabledFeaturesForThisType(processingFeature));
-		return ret;
-
-	}
-	
-	/**
-	 * This implementation relies on the the feature implementor using a subclass of AbstractRootTypeDescriptor 
-	 * which implements {@link IMetaDataEnabledFeature}.
-	 * 
-	 * @param processingFeature
-	 * @return list of <code>IMetaDataEnabledFeature</code>s
-	 */
-	protected final List findMetaDataEnabledFeaturesForThisType(Class processingFeature) {
-		List ret = new ArrayList(3); 
-		List extensions = MetaDataEnabledFeatureRegistry.getInstance()
-							.getFeatures(getTypeExtension().getTypeID());
-
-		if (!extensions.isEmpty()){
-			for (int i=0;i<extensions.size();i++){
-				IMetaDataEnabledFeatureExtension aFeature = (IMetaDataEnabledFeatureExtension)extensions.get(i);
-				IMetaDataEnabledFeature feature = MetaDataEnabledFeatureAdapterFactory.getInstance().getFeatureAdapter(aFeature, processingFeature);
-				if (feature != null && processingFeature.isInstance(feature)){
-					ret.add(feature);				
-				}
-			}
-		}
-		return ret;
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.ITypeDescriptor#getRuntimeType()
-	 */
-	public IType getTypeExtension() {
-		return type;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.ITypeDescriptor#setRuntimeType(org.eclipse.jst.jsf.metadataprocessors.internal.AbstractMetaDataEnabledType)
-	 */
-	public void setTypeExtension(IType type) {
-		this.type = type;
-	}
-
-	
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/DefaultTypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/DefaultTypeDescriptor.java
deleted file mode 100644
index 49b5ad9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/DefaultTypeDescriptor.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors;
-
-
-/**
- * Type descriptor that is created if no class if provided for the implementation 
- * in the AttributeValueRuntimeTypes extension point.
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- *
- */
-public class DefaultTypeDescriptor extends AbstractRootTypeDescriptor {
-    // abstract super contains no abstract methods, so do nothing: automatic default
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/IMetaDataEnabledFeature.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/IMetaDataEnabledFeature.java
deleted file mode 100644
index f25054d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/IMetaDataEnabledFeature.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors;
-
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-
-/**
- * Required interface used by the MetaData feature processing framework.
- * All features must extend this interface.
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- *
- */
-public abstract interface IMetaDataEnabledFeature {
-	
-	/**
-	 * Sets structured document context that this feature will operating on
-	 * @param context 
-	 */
-	public void setStructuredDocumentContext(IStructuredDocumentContext context);
-	
-	/**
-	 * Gets structured document context that this feature will operating on
-	 * @return IStructuredDocumentContext
-	 */
-	public IStructuredDocumentContext getStructuredDocumentContext();
-	
-	/**
-	 * Sets metadata model context that this feature will operating on
-	 * @param context 
-	 */
-	public void setMetaDataContext(MetaDataContext context);
-	
-	/**
-	 * Gets metadata model context that this feature will be operating on. 
-	 * @return MetaDataContext
-	 */
-	public MetaDataContext getMetaDataContext();
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/IType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/IType.java
deleted file mode 100644
index 7466b57..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/IType.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors;
-
-
-/**
- * Interface representing the information contained by the type registries.
- * Encapsulates the IConfigurationElement information.
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- *
- */
-public interface IType {
-	/**
-	 * @return type id
-	 */
-	public String getTypeID();	
-	/**
-	 * @return bundle id where it is defined
-	 */
-	public String getBundleID();
-	/**
-	 * @return classname for the type that must be located within the bundle
-	 */
-	public String getClassName();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/ITypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/ITypeDescriptor.java
deleted file mode 100644
index bbf8aa9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/ITypeDescriptor.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors;
-
-import java.util.List;
-
-/**
- * Interface describing the runtime type of a metadata enabled annotation. 
- * The type descriptor will load the feature adapters for a certain kind of 
- * feature that it supports.  The type descriptor is registered by an extension point.
- * <p><b>Provisional API - subject to change</b></p>
- * @see IMetaDataEnabledFeature
- * @see AbstractRootTypeDescriptor
- * @see org.eclipse.jst.jsf.metadataprocessors.internal.AbstractMetaDataEnabledTypeFactory
- * @see IType
- * 
- * @author Gerry Kessler - Oracle
- *
- */
-public interface ITypeDescriptor {
-	/**
-	 * @param type 
-	 * The IType must be set after the ITypeDescriptor is constructed
-	 */
-	public void setTypeExtension(IType type);
-	/**
-	 * @return IType
-	 * Must not be null
-	 */
-	public IType getTypeExtension();
-
-	/**
-	 * @param processingFeature interface class
-	 * @return List of <code>IMetaDataEnabledFeature</code>s that support the
-	 * specified processingFeature interface.  
-	 */
-	public List getFeatureAdapters(Class processingFeature);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/MetaDataContext.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/MetaDataContext.java
deleted file mode 100644
index 237745a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/MetaDataContext.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-
-
-/**
- * The current metadata model context being used for processing. 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- *
- */
-public class MetaDataContext {
-	private Trait trait;
-	private Entity entity;
-	
-	/**
-	 * Constructor
-	 * @param entity
-	 * @param trait
-	 */
-	public MetaDataContext(Entity entity, Trait trait) {
-		this.entity = entity;
-		this.trait = trait;
-	}
-	
-	/**
-	 * @return Entiry
-	 */
-	public Entity getEntity(){
-		return entity;
-	}
-	/**
-	 * @return Trait
-	 */
-	public Trait getTrait(){
-		return trait;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/MetaDataEnabledProcessingFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/MetaDataEnabledProcessingFactory.java
deleted file mode 100644
index fca3105..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/MetaDataEnabledProcessingFactory.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors;
-
-import java.util.ArrayList;
-import java.util.List;
-
-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.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.metadataprocessors.internal.AttributeValueRuntimeTypeFactory;
-
-
-/**
- * Singleton class that will produce <code>IMetaDataEnabledFeature</code>s that the
- * caller can use for processing.
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- *
- */
-public final class MetaDataEnabledProcessingFactory {
-	private static MetaDataEnabledProcessingFactory INSTANCE;
-	
-	/**
-	 * Name of property in annotation file to use when applying a runtime type to an attribute value 
-	 */
-	public static final String ATTRIBUTE_VALUE_RUNTIME_TYPE_PROP_NAME = "attribute-value-runtime-type";
-	
-	/**
-	 * @return singleton instance
-	 */
-	public static MetaDataEnabledProcessingFactory getInstance(){
-		if (INSTANCE == null){
-			INSTANCE = new MetaDataEnabledProcessingFactory();	
-		}
-		return INSTANCE;
-	}
-	
-	private MetaDataEnabledProcessingFactory(){
-		super();
-	}
-	
-	/**
-	 * Returns list of <code>IMetaDataEnabledFeature</code> adapters for the given Taglibrary attribute.  
-	 * 
-	 * Adapters will be scanned for first by uri, element, attribute and if not found,
-	 * 	uri, "*", attribute and if still not found by "*", "*", attribute.
-	 * @param featureType feature type.  eg. <code>IPossibleValues</code>, <code>IValidValues</code>, etc.  Must be subclass of IMetaDataEnabledFeature. 
-	 * @param sdContext 
-	 * @param uri annotation file uri
-	 * @param elementName
-	 * @param attributeName
-	 * @return	returns null - if the metadata was not found 
-	 * 			<br>returns empty list - if not a <code>IMetaDataEnabledFeature</code> proccessor or is not valid or does not support the specified feature
-	 * 
-	 * @see MetaDataEnabledProcessingFactory#ATTRIBUTE_VALUE_RUNTIME_TYPE_PROP_NAME
-	 */
-	public List getAttributeValueRuntimeTypeFeatureProcessors(Class featureType, IStructuredDocumentContext sdContext, String uri, String elementName, String attributeName){
-		List retList = new ArrayList(2);		
-		//look up the attribute's runtime type from MD
-		IProject _project = null; 
-		if (sdContext !=null){
-			IWorkspaceContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(sdContext);
-			_project = resolver != null ? resolver.getProject() : null; 
-		}
-		String _elem = elementName + "/" + attributeName;
-		String _uri = uri;
-		ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(_project, _uri);
-		Entity entity = TaglibDomainMetaDataQueryHelper.getEntity(modelContext, _elem);
-		Trait trait = null;
-		if (entity != null){
-			trait = TaglibDomainMetaDataQueryHelper.getTrait(entity, ATTRIBUTE_VALUE_RUNTIME_TYPE_PROP_NAME);
-		}
-		
-		if (trait==null){
-			return retList;
-		}
-		
-		String typeId = TraitValueHelper.getValueAsString(trait);
-		
-		//get the implementing class for the type
-		ITypeDescriptor type = AttributeValueRuntimeTypeFactory.getInstance().getType(typeId);
-		if (type != null){
-			TaglibMetadataContext context = new TaglibMetadataContext(uri, elementName, attributeName, entity, trait);
-			//get all the feature adapters (IMetaDataEnabledFeature) for this type
-			List aList = type.getFeatureAdapters(featureType);
-			for (int j=0;j<aList.size();j++){
-				//set the context in the feature
-				((IMetaDataEnabledFeature)aList.get(j)).setMetaDataContext(context);
-				((IMetaDataEnabledFeature)aList.get(j)).setStructuredDocumentContext(sdContext);
-				retList.add(aList.get(j));
-			}
-
-		}
-		//return list of IMetaDataEnabledFeatures for this type
-		return retList;
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/TaglibMetadataContext.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/TaglibMetadataContext.java
deleted file mode 100644
index 89978e6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/TaglibMetadataContext.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.metadataprocessors;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-
-/**
- * Binds tag library context to the metadata context 
- * <p><b>Provisional API - subject to change</b></p>
- */
-public class TaglibMetadataContext extends MetaDataContext {
-
-	private String uri;
-	private String tagName;
-	private String attributeName;
-
-	/**
-	 * Constructor 
-	 * 
-	 * @param uri - must not be null
-	 * @param tagName - must not be null
-	 * @param attributeName - may be null
-	 * @param entity - the metadata entity represented by the tag or attribute
-	 * @param trait - the metadata trait of interest
-	 */
-	public TaglibMetadataContext(String uri, String tagName, String attributeName, Entity entity, Trait trait){
-		super(entity, trait);
-		this.uri = uri;
-		this.tagName = tagName;
-		this.attributeName = attributeName;
-	}
-
-	/**
-	 * @return URI
-	 */
-	public String getUri() {
-		return uri;
-	}
-
-	/**
-	 * @return Tag name - should not be null
-	 */
-	public String getTagName() {
-		return tagName;
-	}
-
-	/**
-	 * @return Attribute name  - may be null
-	 */
-	public String getAttributeName() {
-		return attributeName;
-	}
-	
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/ELIsNotValidException.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/ELIsNotValidException.java
deleted file mode 100644
index f1b5b16..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/ELIsNotValidException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.features;
-
-/**
- * Exception
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-public class ELIsNotValidException extends Exception {
-	private static final long serialVersionUID = 1L;
-	
-	/**
-	 * Constructor
-	 * @param msg
-	 */
-	public ELIsNotValidException(String msg){
-		super(msg);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/ICreateValues.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/ICreateValues.java
deleted file mode 100644
index 6c25a65..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/ICreateValues.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.features;
-
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-
-/**
- * @author Gerry Kessler - Oracle
- * 
- * Experimental - not currently used
- * <p><b>Provisional API - subject to change</b></p>
- *
- */
-public interface ICreateValues extends IMetaDataEnabledFeature{
-	/**
-	 * @return object created
-	 */
-	public Object createValue();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IDefaultValue.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IDefaultValue.java
deleted file mode 100644
index 93d93b8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IDefaultValue.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.features;
-
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-
-/**
- * Interface providing a default value.
- * 
- * @author Gerry Kessler - Oracle
- * 
- * <p><b>Provisional API - subject to change</b></p>
- *
- */
-public interface IDefaultValue extends IMetaDataEnabledFeature {
-	/**
-	 * Default name of property in annotation file to use when supplying default values from meta-data 
-	 */
-	String DEFAULT_VALUE_PROP_NAME = "default-value";	
-	
-	/**
-	 * @return default value or null if one not defined
-	 */
-	public String getDefaultValue();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IPossibleValue.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IPossibleValue.java
deleted file mode 100644
index d4cdbf9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IPossibleValue.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.features;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * Interface for providing lists of possible values
- * Values can be different than displayed values.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- *
- */
-public interface IPossibleValue {
-	/**
-	 * @return value to set.  should not return null.
-	 */
-	public String getValue();
-	/**
-	 * @return value to display in a proposal which can be different than what is set.  Must not return null.
-	 */
-	public String getDisplayValue();
-	/**
-	 * @return ImageDescriptor for image to be displayed in a proposal.   May be null.
-	 */
-	public ImageDescriptor getIcon();
-	/**
-	 * @return true if is known to be the default value.  
-	 */
-	public boolean isDefaultValue();
-	
-	/**
-	 * @return additional information that could be used for descriptive help
-	 * May be null
-	 */
-	public String getAdditionalInformation();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IPossibleValues.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IPossibleValues.java
deleted file mode 100644
index 4d43d87..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IPossibleValues.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.features;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-
-/**
- * Interface for providing possible values.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- *
- */
-public interface IPossibleValues extends IMetaDataEnabledFeature{
-	
-	/**
-	 * Default name of property in annotation file to use when supplying possible values from meta-data 
-	 */
-	public static final String POSSIBLE_VALUES_PROP_NAME = "valid-values";	
-	/**
-	 * Default name of property in annotation file to use when supplying possible displayed values from meta-data 
-	 */
-	public static final String POSSIBLE_VALUES_FOR_DISPLAY_PROP_NAME = "displayed-values";	
-	/**
-	 * Default name of property in annotation file to use when supplying icon displayed values from meta-data 
-	 */
-	public static final String POSSIBLE_VALUES_SMALL_ICON_PROP_NAME = "small-icon";	
-	/**
-	 * @return List of IPossibleValue instances representing possible values
-	 * Implementer must ensure that an empty rather than null list is returned if no values are posssible.
-	 */
-	public List getPossibleValues();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IValidELValues.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IValidELValues.java
deleted file mode 100644
index ca0b8f6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IValidELValues.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.features;
-
-import org.eclipse.jst.jsf.common.internal.types.CompositeType;
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-
-/**
- * An {@link IMetaDataEnabledFeature} for semantic validation of EL Values 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface IValidELValues extends IMetaDataEnabledFeature {
-	/**
-	 * Expected runtime type for EL value
-	 * @return CompositeType
-	 * @throws ELIsNotValidException
-	 */
-	public CompositeType getExpectedRuntimeType() throws ELIsNotValidException;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IValidValues.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IValidValues.java
deleted file mode 100644
index 25baa40..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IValidValues.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.features;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-
-/**
- * An {@link IMetaDataEnabledFeature} for validating values using metadata
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface IValidValues extends IMetaDataEnabledFeature{
-	/**
-	 * Trait name for valid-values
-	 */
-	public static final String VALID_VALUES_PROP_NAME = "valid-values";
-	
-	/**
-	 * Trait name for valid-values-code
-	 */
-	public static final String VALID_VALUES_CODE_PROP_NAME = VALID_VALUES_PROP_NAME + "-code";
-	/**
-	 * Trait name for valid-values-severity
-	 */
-	public static final String VALID_VALUES_SEVERITY_PROP_NAME = VALID_VALUES_PROP_NAME + "-severity";
-	/**
-	 * Trait name for valid-values-message
-	 */
-	public static final String VALID_VALUES_MESSAGE_PROP_NAME = VALID_VALUES_PROP_NAME + "-message";
-	/**
-	 * Trait name for valid-maximum
-	 */
-	public static final String VALID_VALUES_MAX_PROP_NAME = "valid-maximum";
-	/**
-	 * Trait name for valid-minimum
-	 */
-	public static final String VALID_VALUES_MIN_PROP_NAME = "valid-minimum";
-	/**
-	 * @param value fully resolved value as String
-	 * @return true if is valid
-	 */
-	public boolean isValidValue(String value);
-	/**
-	 * @return List of IValidationMessage objects if invalid
-	 * Must return empty list rather than null
-	 * Call to isValidValue(String value) required before this should be called.
-	 */
-	public List getValidationMessages();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IValidationMessage.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IValidationMessage.java
deleted file mode 100644
index 4f29c78..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/IValidationMessage.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.features;
-
-/**
- * Interface for validation messages for metadata features
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface IValidationMessage {
-	/**
-	 * @return localized string desribing validation issue
-	 * Should not be null;
-	 */
-	public String getMessage();
-
-	/**
-	 * @return String representing a validation code associated with validation issue 
-	 * Can return null
-	 */
-	public String getCode();
-	
-	/**
-	 * @return integer value representing severity. 
-	 * Valid values are 0 (IStatus.INFO), 1 (IStatus.WARNING) and 4 (IStatus.ERROR)
-	 */
-	public int getSeverity();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/PossibleValue.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/PossibleValue.java
deleted file mode 100644
index dbbde06..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/PossibleValue.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.features;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-
-
-/**
- * Implements {@link IPossibleValues}
- * 
- * <p><b>Provisional API - subject to change</b></p>
- *
- */
-public class PossibleValue implements IPossibleValue {
-	private String value;
-	private String displayValue;
-	private ImageDescriptor smallIcon;
-	private boolean isDefault = false;
-	private String additionalInfo;
-
-	/**
-	 * Constructor when display value is same as stored value
-	 * @param value
-	 */
-	public PossibleValue(String value){
-		this.value = value;
-	}
-	
-	/**
-	 * Constructor when display-value may be different than stored value
-	 * @param value
-	 * @param displayValue
-	 */
-	public PossibleValue(String value, String displayValue){
-		this.value = value;
-		this.displayValue = displayValue;
-	}
-
-	/**
-	 * Constructor when display-value may be different than stored value 
-	 * and a default value is known
-	 * @param value
-	 * @param displayValue
-	 * @param isDefaultValue
-	 */
-	public PossibleValue(String value, String displayValue, boolean isDefaultValue) {
-		this.value = value;
-		this.displayValue = displayValue;
-		this.isDefault = isDefaultValue;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValue#getValue()
-	 */
-	public String getValue() { 
-		return value;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValue#getDisplayValue()
-	 */
-	public String getDisplayValue() {
-		if (displayValue == null)
-			return value;
-		return displayValue;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValue#getIcon()
-	 */
-	public ImageDescriptor getIcon() {		
-		return smallIcon;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValue#isDefaultValue()
-	 */
-	public boolean isDefaultValue() {
-		return isDefault;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValue#getAdditionalInformation()
-	 */
-	public String getAdditionalInformation() {
-		return additionalInfo;
-	}
-	
-	/**
-	 * @param value
-	 */
-	public void setValue(String value) {
-		this.value = value;
-	}
-
-	/**
-	 * @param displayValue
-	 */
-	public void setDisplayValue(String displayValue) {
-		this.displayValue = displayValue;
-	}
-
-	/**
-	 * @param smallIcon
-	 */
-	public void setIcon(ImageDescriptor smallIcon) {
-		this.smallIcon = smallIcon;
-	}
-
-	/**
-	 * @param isDefault
-	 */
-	public void setIsDefault(boolean isDefault) {
-		this.isDefault = isDefault;
-	}
-	
-	/**
-	 * @param additionalInfo
-	 */
-	public void setAdditionalInformation(String additionalInfo){
-		this.additionalInfo = additionalInfo;
-	}
-
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/ValidationMessage.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/ValidationMessage.java
deleted file mode 100644
index 5aaf29e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/ValidationMessage.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.features;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * Metadata Validation Message implementation 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-public class ValidationMessage implements IValidationMessage {
-
-	private String code;
-	private String msg;
-	private int severity = IStatus.WARNING;
-
-	/**
-	 * Constructor
-	 * @param msg
-	 */
-	public ValidationMessage(String msg){
-		this.msg = msg;
-	}
-	
-	/**
-	 * Constructor
-	 * @param msg
-	 * @param code
-	 * @param severity
-	 */
-	public ValidationMessage(String msg, String code, int severity){
-		this.msg = msg;
-		this.code = code;
-		this.severity = severity;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage#getMessage()
-	 */
-	public String getMessage() {
-		return msg;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage#getCode()
-	 */
-	public String getCode() {
-		return code;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage#getSeverity()
-	 */
-	public int getSeverity() {
-		return severity;
-	}
-
-	/**
-	 * @param msg
-	 */
-	public void setMessage(String msg) {
-		this.msg = msg;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/package-info.java
deleted file mode 100644
index 5922fbf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/features/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * This package is used to provide tooling services for tag attribute values
- * based on the org.eclipse.jst.jsf.core.AttributeValueRuntimeTypes. 
- * 
- * New features can added to the system using the org.eclipse.jst.jsf.core.MetaDataEnabledFeatures 
- * extension-point.  This extension point provides the binding of a AttributeValueRuntimeTypes to a feature
- * so that new behaviors can be added to existing types. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.metadataprocessors.features;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AbstractMetaDataEnabledType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AbstractMetaDataEnabledType.java
deleted file mode 100644
index 0ae2de2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AbstractMetaDataEnabledType.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.internal;
-
-import org.eclipse.jst.jsf.metadataprocessors.IType;
-
-
-/**
- * Class that encapuslates the information from the 
- * <code>AttributeValueRuntimeTypes</code> and 
- * <code>MetaDataEnabledFeatures</code>
- * extension points.
- * 
- * @author Gerry Kessler - Oracle
- *
- */
-public class AbstractMetaDataEnabledType implements IType{
-	String typeId;
-	String bundleId;
-	String klass;
-	
-	AbstractMetaDataEnabledType(String bundleID, String id, String klass){
-		this.bundleId = bundleID;
-		this.typeId = bundleId + "." + id;
-		this.klass = klass;
-	}
-	
-	public String getTypeID(){		
-		return typeId;
-	}
-	
-	public String getBundleID(){
-		return bundleId;
-	}
-	
-	public String getClassName(){
-		return klass;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AbstractMetaDataEnabledTypeFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AbstractMetaDataEnabledTypeFactory.java
deleted file mode 100644
index b03b522..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AbstractMetaDataEnabledTypeFactory.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.internal;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.metadataprocessors.IType;
-import org.eclipse.jst.jsf.metadataprocessors.ITypeDescriptor;
-import org.osgi.framework.Bundle;
-
-/**
- * Abstract factory producing <code>ITypeDescriptor</code>s 
- * from instances of <code>AbstractMetaDataEnabledType</code>s
- * 
- * @author Gerry Kessler - Oracle
- *
- */
-public abstract class AbstractMetaDataEnabledTypeFactory {
-	/**
-	 * The factory instance
-     * TODO: why is this defined here it is only used in sub-classes??
-	 */
-	protected static AbstractMetaDataEnabledTypeFactory INSTANCE;
-	
-	/**
-	 * No arg constructor
-	 */
-	protected AbstractMetaDataEnabledTypeFactory(){
-		super();
-	}
-	
-	/**
-	 * Concrete factory must pass instances of the it's types.
-	 * 
-	 * @param typeId
-	 * @return list of instances identified by the type id
-	 */
-	public abstract ITypeDescriptor getType(String typeId);
-	
-	/**
-	 * @param type 
-	 * @return list of instances identified by the type id
-	 */
-	public ITypeDescriptor getType(AbstractMetaDataEnabledType type){ 
-		
-		return createType(type);
-
-	}
-
-	/**
-	 * Creates instances of <code>ITypeDescriptor</code>s from 
-	 * <code>AbstractMetaDataEnabledType</code>s
-	 * 
-	 * @param atype
-	 * @return the meta-data type descriptor
-	 */
-	protected ITypeDescriptor createType(IType atype){
-		if (atype != null){
-			ITypeDescriptor desc = createDescriptor(atype);
-			if (desc != null){
-				desc.setTypeExtension(atype);
-				return desc;
-			}
-		}
-		return null;
-	}
-
-	
-	private ITypeDescriptor createDescriptor(IType type){
-		String className = type.getClassName();
-		try {
-			Bundle bundle =Platform.getBundle(type.getBundleID());
-			if (bundle == null){
-				JSFCorePlugin.log(IStatus.ERROR, type.getBundleID() + " could not be created to load " + className);
-				return null;
-			}
-			Class klass = bundle.loadClass(className);
-			if (klass != null){
-				//make sure the class can support the feature/extended interface
-				if (ITypeDescriptor.class.isAssignableFrom(klass))
-                {
-					return (ITypeDescriptor)klass.newInstance();
-                }
-                JSFCorePlugin.log(IStatus.INFO, className + " was not found in " + type.getBundleID() +" for " + type.getTypeID());
-			}
-		} catch (ClassNotFoundException e) {
-			JSFCorePlugin.log(IStatus.ERROR, className + " was not found in " + type.getBundleID() +" for " + type.getTypeID());
-		} catch (InstantiationException e) {
-			JSFCorePlugin.log(IStatus.ERROR, "InstantiationException: " + className + " in " + type.getBundleID() +" for " + type.getTypeID());
-		} catch (IllegalAccessException e) {
-			JSFCorePlugin.log(IStatus.ERROR,  "IllegalAccessException: " + className + " in " + type.getBundleID() +" for " + type.getTypeID());
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AbstractMetaDataEnabledTypeRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AbstractMetaDataEnabledTypeRegistry.java
deleted file mode 100644
index 5c4b0b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AbstractMetaDataEnabledTypeRegistry.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.internal;
-
-import java.util.HashMap;
-
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.InvalidRegistryObjectException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-
-/**
- * Abstract registry of <code>AbstractMetaDataEnabledType<code>
- * mapped by type id.
- * 
- * @author Gerry Kessler - Oracle
- *
- */
-public abstract class AbstractMetaDataEnabledTypeRegistry {
-	private final HashMap typeMap;  //map of types keyed by id
-	private final String ext_pt_id; //type ext-pt id
-	
-	/**
-	 * @param extPtId
-	 */
-	public AbstractMetaDataEnabledTypeRegistry(String extPtId){
-		typeMap = new HashMap();		
-		ext_pt_id = extPtId;
-		
-		readRegistry();
-	}
-	
-	/**
-	 * @param bundleID
-	 * @param id
-	 * @param klass
-	 * @param runtimeType
-	 */
-	protected void registerType(String bundleID, String id, String klass, String runtimeType){
-		AbstractMetaDataEnabledType atype = new AbstractMetaDataEnabledType(bundleID, id, klass);
-		if (!typeMap.containsKey(atype.getTypeID())){
-			typeMap.put(atype.getTypeID(), atype);
-		}
-		else {
-			//is there any point in putting this more in the user's face?  this is really an internal error.
-			JSFCorePlugin.log(IStatus.ERROR, "Duplicate RuntimeTypeId being registered from " + ext_pt_id + ": " + atype.getTypeID());
-		}
-	}
-	
-	/**
-	 * Return the metadata enabled type for the given id
-	 * @param id
-	 * @return type
-	 */
-	public AbstractMetaDataEnabledType getType(String id){
-		if (typeMap.containsKey(id))
-        {
-			return (AbstractMetaDataEnabledType)typeMap.get(id);
-        }
-        return null;
-	}
-
-	/**
-	 * Reads the extensions for a particular type id
-	 */
-	protected void readRegistry() {
-		try {
-			IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(JSFCorePlugin.PLUGIN_ID, ext_pt_id);
-			IExtension[] extensions = point.getExtensions();
-			for (int i=0;i < extensions.length;i++){
-				IExtension ext = extensions[i];
-				for (int j=0;j < ext.getConfigurationElements().length;j++){
-					final String bundleId = ext.getConfigurationElements()[j].getContributor().getName();
-					final String id = ext.getConfigurationElements()[j].getAttribute("id");
-					String klass = ext.getConfigurationElements()[j].getAttribute("class");
-					final String runtimeType = ext.getConfigurationElements()[j].getAttribute("runtime-type");
-					if (klass == null || klass.trim().equals("")){
-						klass = getDefaultClassName();
-					}
-					registerType(bundleId, id, klass, runtimeType);
-				}
-			}
-		} catch (InvalidRegistryObjectException e) {
-			JSFCorePlugin.log(e, "Unable to read " + JSFCorePlugin.PLUGIN_ID + ext_pt_id + " registry");
-		}
-	}
-	
-	/**
-	 * @return default classname to use for the type
-	 */
-	protected abstract String getDefaultClassName();
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AttributeValueRuntimeTypeFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AttributeValueRuntimeTypeFactory.java
deleted file mode 100644
index 78638e2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AttributeValueRuntimeTypeFactory.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.internal;
-
-import org.eclipse.jst.jsf.metadataprocessors.ITypeDescriptor;
-
-
-/**
- * Factory producing <code>IMetaDataEnabledFeature</code>s from 
- * <code>AttributeValueRuntimeType</code> objects
- * 
- * @author Gerry Kessler - Oracle
- *
- */
-public class AttributeValueRuntimeTypeFactory extends AbstractMetaDataEnabledTypeFactory{
-	
-	/**
-	 * @return the single instance... TODO: why is this allocated here if it is
-     * declared in super?
-	 */
-	public static AttributeValueRuntimeTypeFactory getInstance(){
-		if (INSTANCE == null){
-			INSTANCE = new AttributeValueRuntimeTypeFactory();	
-		}
-		return (AttributeValueRuntimeTypeFactory)INSTANCE;
-	}
-	
-	private AttributeValueRuntimeTypeFactory(){
-		super();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.internal.AbstractMetaDataEnabledTypeFactory#getType(java.lang.String)
-	 */
-	public ITypeDescriptor getType(String typeId){ 
-		
-		return createType(AttributeValueRuntimeTypeRegistry.getInstance().getType(typeId));
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AttributeValueRuntimeTypeRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AttributeValueRuntimeTypeRegistry.java
deleted file mode 100644
index 9deab17..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/AttributeValueRuntimeTypeRegistry.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.internal;
-
-/**
- * Registry of <code>AbstractMetaDataEnabledType</code>s that are loaded from 
- * the <code>AttributeValueRuntimeValueType</code> extension point
- * 
- * @author Gerry Kessler - Oracle
- *
- */
-public class AttributeValueRuntimeTypeRegistry extends AbstractMetaDataEnabledTypeRegistry {
-
-	private static final String EXTPTID = "AttributeValueRuntimeTypes";
-	private static final String DEFAULT_CLASS = "org.eclipse.jst.jsf.metadataprocessors.DefaultTypeDescriptor";
-	private static AttributeValueRuntimeTypeRegistry INSTANCE;
-	
-	/**
-	 * @return singleton instance
-	 */
-	public static AttributeValueRuntimeTypeRegistry getInstance(){
-		if (INSTANCE == null){
-			INSTANCE = new AttributeValueRuntimeTypeRegistry();	
-		}
-		return INSTANCE;
-	}
-	
-	private AttributeValueRuntimeTypeRegistry(){
-		super(EXTPTID);
-	}
-
-	protected String getDefaultClassName() {
-		return DEFAULT_CLASS;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/IMetaDataEnabledFeatureExtension.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/IMetaDataEnabledFeatureExtension.java
deleted file mode 100644
index bde9ca6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/IMetaDataEnabledFeatureExtension.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.internal;
-
-/**
- * Interface used to bind feature extensions to metadata enabled types 
- *
- */
-public interface IMetaDataEnabledFeatureExtension {
-	/**
-	 * @return bundle id
-	 */
-	public String getBundleID();
-	/**
-	 * @return type id
-	 */
-	public String getTypeID();
-	/**
-	 * @return class name to use for type.   Must be located within the bundle.
-	 */
-	public String getClassName();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/MetaDataEnabledFeatureAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/MetaDataEnabledFeatureAdapterFactory.java
deleted file mode 100644
index e821ec1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/MetaDataEnabledFeatureAdapterFactory.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.internal;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-import org.osgi.framework.Bundle;
-
-/**
- * Factory producing <code>IMetaDataEnabledFeature</code>s from 
- * <code>IType</code> objects that implement a specified feature
- * 
- * @author Gerry Kessler - Oracle
- *
- */
-public final class MetaDataEnabledFeatureAdapterFactory {
-	private static MetaDataEnabledFeatureAdapterFactory INSTANCE;
-	
-	/**
-	 * @return singleton instance
-	 */
-	public static MetaDataEnabledFeatureAdapterFactory getInstance(){
-		if (INSTANCE == null){
-			INSTANCE = new MetaDataEnabledFeatureAdapterFactory();	
-		}
-		return INSTANCE;
-	}
-	
-	private MetaDataEnabledFeatureAdapterFactory(){
-		super();
-	}
-	
-	/**
-	 * Given the feature extension, create and return the {@link IMetaDataEnabledFeature} for a given processing feature
-	 * @param feature
-	 * @param processingFeature class
-	 * @return IMetaDataEnabledFeature
-	 */
-	public IMetaDataEnabledFeature getFeatureAdapter(IMetaDataEnabledFeatureExtension feature, Class processingFeature){ 
-		if (feature != null){
-			return createFeature(feature, processingFeature);			
-		}
-		return null;
-	}
-
-	private IMetaDataEnabledFeature createFeature(IMetaDataEnabledFeatureExtension featureExt, Class processingFeature){
-		String className = featureExt.getClassName();
-		try {
-			Bundle bundle =Platform.getBundle(featureExt.getBundleID());
-			if (bundle == null){
-				JSFCorePlugin.log(IStatus.ERROR, featureExt.getBundleID() + " could not be created to load " + className);
-				return null;
-			}
-			Class klass = bundle.loadClass(className);
-			if (klass != null){
-				if (!IMetaDataEnabledFeature.class.isAssignableFrom(klass)){
-					JSFCorePlugin.log(IStatus.INFO, className + " is not a IMetaDataEnabledFeature. " + featureExt.getBundleID() +" : " + featureExt.getTypeID());
-				} 
-				else if (processingFeature.isAssignableFrom(klass)){
-					IMetaDataEnabledFeature obj = (IMetaDataEnabledFeature)klass.newInstance();
-//					obj.setBundleID(featureExt.getBundleID());
-					return obj;
-				}
-			}
-		} catch (ClassNotFoundException e) {
-			JSFCorePlugin.log(IStatus.ERROR, className + " was not found in " + featureExt.getBundleID() +" for " + featureExt.getTypeID());
-		} catch (InstantiationException e) {
-			JSFCorePlugin.log(IStatus.ERROR, "InstantiationException: " + className + " in " + featureExt.getBundleID() +" for " + featureExt.getTypeID());
-		} catch (IllegalAccessException e) {
-			JSFCorePlugin.log(IStatus.ERROR,  "IllegalAccessException: " + className + " in " + featureExt.getBundleID() +" for " + featureExt.getTypeID());
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/MetaDataEnabledFeatureExtension.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/MetaDataEnabledFeatureExtension.java
deleted file mode 100644
index ae90a9a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/MetaDataEnabledFeatureExtension.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.internal;
-
-
-/**
- * 
- * @author Gerry Kessler - Oracle
- *
- */
-public class MetaDataEnabledFeatureExtension implements IMetaDataEnabledFeatureExtension{
-
-	private String klass;
-	private String typeId;
-	private String bundleId;
-
-	MetaDataEnabledFeatureExtension(String bundleID, String typeId, String klass) {		
-		this.bundleId = bundleID;
-		this.typeId = typeId;
-		this.klass = klass;
-	}
-
-	public String getBundleID() {
-		return bundleId;
-	}
-
-	public String getClassName() {
-		return klass;
-	}
-
-	public String getTypeID() {
-		return typeId;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/MetaDataEnabledFeatureRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/MetaDataEnabledFeatureRegistry.java
deleted file mode 100644
index 47bb44b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/internal/MetaDataEnabledFeatureRegistry.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.metadataprocessors.internal;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.InvalidRegistryObjectException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-
-/**
- * Registry of <code>AbstractMetaDataEnabledType</code>s loaded from 
- * the <code>MetaDataEnabledFeatures</code> extension point
- * 
- * A map of features keyed by type id
- * 
- * @author Gerry Kessler - Oracle
- *
- */
-public class MetaDataEnabledFeatureRegistry{
-	private static final String EXTPTID = "MetaDataEnabledFeatures";
-	private Map featuresMap;
-	private List EMPTY_LIST = new ArrayList(0);
-	
-	private static MetaDataEnabledFeatureRegistry INSTANCE;
-	
-	/**
-	 * @return the singleton instance of the MetaDataEnabledFeatureRegistry
-	 */
-	public static synchronized MetaDataEnabledFeatureRegistry getInstance(){
-		if (INSTANCE == null){
-			INSTANCE = new MetaDataEnabledFeatureRegistry();	
-		}
-		return INSTANCE;
-	}
-	
-	private MetaDataEnabledFeatureRegistry(){
-		featuresMap = new HashMap();
-		readRegistry();		
-	}
-	
-	/**
-	 * Reads the MetaDataEnabledFeatures extensions into a registry
-	 */
-	protected void readRegistry() {
-		try {
-			IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(JSFCorePlugin.PLUGIN_ID, EXTPTID);
-			IExtension[] extensions = point.getExtensions();
-			for (int i=0;i < extensions.length;i++){
-				IExtension ext = extensions[i];
-				for (int j=0;j < ext.getConfigurationElements().length;j++){
-					final String bundleId = ext.getConfigurationElements()[j].getContributor().getName();
-					final String id = ext.getConfigurationElements()[j].getAttribute("typeid");
-					final String klass = ext.getConfigurationElements()[j].getAttribute("class");
-					registerFeature(bundleId, id, klass);
-				}
-			}
-		} catch (InvalidRegistryObjectException e) {
-			JSFCorePlugin.log(e, "Unable to read " + JSFCorePlugin.PLUGIN_ID + EXTPTID + " registry");
-		}
-	}
-	
-	/**
-	 * Create {@link IMetaDataEnabledFeatureExtension}s and add to registry
-	 * @param bundleID
-	 * @param typeId
-	 * @param klass
-	 */
-	protected void registerFeature(String bundleID, String typeId, String klass){
-		IMetaDataEnabledFeatureExtension aFeature = new MetaDataEnabledFeatureExtension(bundleID, typeId, klass);
-		if (!featuresMap.containsKey(typeId)){
-			List list = new ArrayList();
-			list.add(aFeature);
-			featuresMap.put(typeId, list);
-		}
-		else {
-			List list = (List)featuresMap.get(typeId);
-			list.add(aFeature);
-		}
-	}
-
-	/**
-	 * @param typeId
-	 * @return List of <code>AbstractMetaDataEnabledRuntimeTypeExtensions</code>
-	 * for a given by type id
-	 */
-	public List getFeatures(String typeId) {
-		if (featuresMap.containsKey(typeId))
-        {
-			return (List)featuresMap.get(typeId);			
-        }
-		return EMPTY_LIST;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/package-info.java
deleted file mode 100644
index f791e43..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/metadataprocessors/package-info.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * This package is used to provide tooling support for taglibraries using the Design-time Metadata
- * feature (org.eclipse.jst.jsf.common.metadata).<p>
- * The MetaDataEnabledProcessingFactory singleton instance is the entry point.   The tool requests
- * the IMetaDataEnabled feature for a particular tag attribute, and through metadata, will locate the 
- * "metadata processing" feature using the attribute value runtime type system.
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.metadataprocessors;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ActionType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ActionType.java
deleted file mode 100644
index 7723b6d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ActionType.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.ValidationMessage;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.Bundle;
-
-/**
- * Meta-data processing type representing an "action" attribute
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public class ActionType extends MethodBindingType implements IPossibleValues{
-	/**
-	 * Image to use if metadata defined image cannot be created
-	 */
-	protected static final ImageDescriptor MISSING_IMAGE = ImageDescriptor.getMissingImageDescriptor();
-	
-	private static final String IMAGE_NAME = "/icons/full/obj16/NavigationCaseType.gif"; //$NON-NLS-1$
-	private ImageDescriptor imageDescriptor;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.MethodBindingType#isValidValue(java.lang.String)
-	 */
-	public boolean isValidValue(String value){
-		if (value == null || (value != null && value.length() == 0)) {
-			IValidationMessage msg = new ValidationMessage(Messages.ActionType_invalid_empty_value);
-			getValidationMessages().add(msg);
-			return false;
-		}
-		//any other value should be one of the possible values
-		//optimize
-		IWorkspaceContextResolver wr = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(getStructuredDocumentContext());
-		if (wr == null)
-			return true;//shouldn't get here
-		
-		//in case that this is not JSF faceted or missing configs, need to pass
-		if (JSFAppConfigManager.getInstance(wr.getProject()) == null) 
-			return true;
-			
-		IFile jsp = (IFile)wr.getResource();
-		List rules = JSFAppConfigManager.getInstance(wr.getProject()).getNavigationRulesForPage(jsp);
-		for(Iterator it=rules.iterator();it.hasNext();){
-			NavigationRuleType rule = (NavigationRuleType)it.next();
-			for (Iterator cases=rule.getNavigationCase().iterator();cases.hasNext();){				
-				NavigationCaseType navCase = (NavigationCaseType)cases.next();					
-				if (value.equals(navCase.getFromOutcome().getTextContent().trim()))
-					return true;				
-			}
-		}
-		IValidationMessage msg = new ValidationMessage(Messages.ActionType_invalid_value);
-		getValidationMessages().add(msg);
-		return false;
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues#getPossibleValues()
-	 */
-	public List getPossibleValues() {
-		List ret = new ArrayList();
-		IWorkspaceContextResolver wr = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(getStructuredDocumentContext());
-		if (wr != null && JSFAppConfigManager.getInstance(wr.getProject()) != null) {//may not be JSF faceted project or know faces-config){			
-			IFile jsp = (IFile)wr.getResource();
-			List rules = JSFAppConfigManager.getInstance(wr.getProject()).getNavigationRulesForPage(jsp);
-			for(Iterator it=rules.iterator();it.hasNext();){
-				NavigationRuleType rule = (NavigationRuleType)it.next();
-				if (rule != null)
-					ret.addAll(createProposals(rule));
-			}
-		}
-		return ret;
-	}
-
-	private List createProposals(NavigationRuleType rule) {
-		List ret = new ArrayList();
-		List cases = rule.getNavigationCase();
-		for(Iterator it=cases.iterator();it.hasNext();){
-			NavigationCaseType navCase = (NavigationCaseType)it.next();
-			PossibleValue pv = createProposal(rule, navCase);
-			if (pv != null)
-				ret.add(pv);
-		}
-		return ret;
-	}
-
-	private PossibleValue createProposal(NavigationRuleType rule, NavigationCaseType navCase) {
-		PossibleValue pv = null;
-		String value = null;
-		String ruleDisp = null;
-		String navDisplay = null;
-		String navAction = null;
-		String toViewId = null;
-		
-		if (navCase.getFromOutcome() != null)
-			value = navCase.getFromOutcome().getTextContent();
-		if (navCase.getToViewId()!= null)
-			toViewId = navCase.getToViewId().getTextContent();
-		if (rule.getFromViewId() != null)
-			ruleDisp = rule.getFromViewId().getTextContent();
-		if (navCase.getDisplayName() != null
-				&& navCase.getDisplayName().size() > 0) {
-			navDisplay = ((DisplayNameType) navCase
-					.getDisplayName().get(0)).getTextContent();	
-		}
-		if (navCase.getFromAction() != null) {
-			navAction= navCase.getFromAction().getTextContent();	
-		}
-		if (navDisplay == null || navDisplay.trim().equals("")) //$NON-NLS-1$
-			navDisplay = NLS.bind(Messages.ActionType_navcase_display, new String[]{value, toViewId});
-		
-		if (value != null){
-			pv = new PossibleValue(value, navDisplay);
-			pv.setIcon(getNavCaseImageDescriptor());
-			pv.setAdditionalInformation("from-outcome: "+value  //$NON-NLS-1$
-										+ "<br>to-view-id: " + toViewId //$NON-NLS-1$
-										+ "<br>from-view-id: " + ruleDisp //$NON-NLS-1$
-										+ "<br>from-action: " + (navAction == null ? "null" : navAction)); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		return pv;
-	}
-
-	
-	private ImageDescriptor getNavCaseImageDescriptor() {
-		ImageDescriptor ret = super.getImage();
-		if (ret != null && ret != MISSING_IMAGE)
-			return ret;
-
-		if (imageDescriptor == null){				
-			imageDescriptor = getImageDesc(IMAGE_NAME);
-		}
-		return imageDescriptor;
-
-	}
-	
-	private ImageDescriptor getImageDesc(String img) 
-    {
-		Bundle bundle = FacesConfigPlugin.getPlugin().getBundle();
-		URL url = FileLocator.find(bundle, new Path(img), null);
-		ImageDescriptor desc = ImageDescriptor.createFromURL(url);
-		if (desc == MISSING_IMAGE){
-			return null;
-		}
-		return desc;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/BindingType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/BindingType.java
deleted file mode 100644
index 6932796..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/BindingType.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import org.eclipse.jst.jsf.metadataprocessors.AbstractRootTypeDescriptor;
-
-/**
- * Abstract meta-data processing type representing a binding
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public abstract class BindingType extends AbstractRootTypeDescriptor{
-    // TODO: what's the point of this?
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/BooleanType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/BooleanType.java
deleted file mode 100644
index cd90e74..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/BooleanType.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-
-/**
- * Meta-data processing type representing a boolean attribute value runtime type
- * that implements IPossibleValues, IValidValues, IDefaultValue, IValidELValues
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public class BooleanType extends EnumerationType implements IValidValues, IPossibleValues, IDefaultValue{
-	private static final String TRUE_VAL = "true"; //$NON-NLS-1$
-	private static final String FALSE_VAL = "false"; //$NON-NLS-1$
-	
-	private static final String BOOLTYPE_VALIDATION_MSG = Messages.BooleanType_invalid_values;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.EnumerationType#getReturnType()
-	 */
-	protected String getReturnType(){ return "boolean";} //$NON-NLS-1$
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues#getPossibleValues()
-	 */
-	public List getPossibleValues() {
-		String def = getDefaultValue();
-		List vals = new ArrayList();
-		vals.add(new PossibleValue(TRUE_VAL, TRUE_VAL, def != null && def.equals(TRUE_VAL) ));
-		vals.add(new PossibleValue(FALSE_VAL, FALSE_VAL, def != null && def.equals(FALSE_VAL) ));
-		return vals;
-	}
-	
-	/**
-	 * Type coercion according to JSP 2.0 spec: JSP.1.14.2.1 Conversions from String values
-	 * Although not completely faithful to spec, we will validate values as either 'true' or 'false'
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 **/
-	public boolean isValidValue(String value) {		
-		if(TRUE_VAL.equalsIgnoreCase(value) || FALSE_VAL.equalsIgnoreCase(value)) {
-			return true;
-		}
-		addNewValidationMessage(BOOLTYPE_VALIDATION_MSG);	
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ColorType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ColorType.java
deleted file mode 100644
index 0bd700d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ColorType.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation., and others
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Yury Kats/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.PaletteData;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * Meta-data processing type representing a color.
- * A color is defined as in html spec http://www.w3.org/TR/html4/types.html#type-color
- * 
- * @author ykats
- */
-
-public class ColorType extends EnumerationType implements IPossibleValues {
-	
-	/**
-	 * List of standard colors
-	 * See http://www.w3.org/TR/html4/types.html#type-color
-	 */
-	public static String[] COLORS = {"Black", "Silver", "Gray", "White", "Maroon", "Red", "Purple",
-				"Fuchsia", "Green", "Lime", "Olive", "Yellow", "Navy", "Blue", "Teal","Aqua"};
-		//if ordering changes, must change RGB[] ordering
-
-	private RGB[] _rgb;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.EnumerationType#getReturnType()
-	 */
-	protected String getReturnType(){ return "java.lang.String";} //$NON-NLS-1$
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 */
-	public boolean isValidValue(String value) {	
-		boolean bValid = true;
-		String trimmedVal = value.trim();
-		if (trimmedVal.length() == 0)
-			bValid = false;
-		else if (trimmedVal.charAt(0) == '#' && trimmedVal.length() == 7) {
-			for (int i=1; i<7; i++) {
-				if (trimmedVal.charAt(i) < '0' ||
-					(trimmedVal.charAt(i) > '9' && trimmedVal.charAt(i) < 'A') ||
-					(trimmedVal.charAt(i) > 'F' && trimmedVal.charAt(i) < 'a') ||
-					trimmedVal.charAt(i) > 'f') {
-					bValid = false;
-					break;
-				}
-			}
-		}
-		else {
-			bValid = false;
-			for (int i = 0; i < COLORS.length; i++) {
-				if(trimmedVal.equalsIgnoreCase(COLORS[i])) {
-					bValid = true;
-					break;
-				}
-			}
-		}
-		
-		if(!bValid) {
-			addNewValidationMessage(Messages.ColorType_invalid_color);
-		}
-		
-		return getValidationMessages().isEmpty();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues#getPossibleValues()
-	 */
-	public List getPossibleValues() {
-		List ret = new ArrayList(COLORS.length);
-		for (int i=0;i < COLORS.length;i++){
-			PossibleValue pv = new PossibleValue(COLORS[i]);
-			pv.setIcon(createImage(i));
-			ret.add(pv);
-		}
-		return ret;
-	}
-
-	private ImageDescriptor createImage(int color) {
-		PaletteData pd = getPaletteData(color);
-		return ImageDescriptor.createFromImageData(new ImageData(16, 16, 1, pd));
-	}
-
-	private PaletteData getPaletteData(int color){
-		if (_rgb == null){
-			_rgb = new RGB[16];
-			_rgb[0] = new RGB(0,0,0);//black
-			_rgb[1] = new RGB(192,192,192);//silver
-			_rgb[2] = new RGB(128,128,128);//gray
-			_rgb[3] = new RGB(255,255,255);//white
-			_rgb[4] = new RGB(128,0,0);//Maroon
-			_rgb[5] = new RGB(255,0,0);//Red
-			_rgb[6] = new RGB(128,0,128);//Purple
-			_rgb[7] = new RGB(255,0,255);//Fuchsia
-			_rgb[8] = new RGB(0,128,0);//Green
-			_rgb[9] = new RGB(0,255,0);//Lime
-			_rgb[10] = new RGB(128,128,0);//Olive
-			_rgb[11] = new RGB(255,255,0);//Yellow
-			_rgb[12] = new RGB(0,0,128);//Navy
-			_rgb[13] = new RGB(0,0,255);//Blue
-			_rgb[14] = new RGB(0,128,128);//Teal
-			_rgb[15] = new RGB(0,255,255);//Aqua
-		}
-		RGB[] rgbColor = new RGB[1];
-		System.arraycopy(_rgb, color, rgbColor, 0, 1);
-		return new PaletteData(rgbColor);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ComponentBindingType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ComponentBindingType.java
deleted file mode 100644
index 4e394ed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ComponentBindingType.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage;
-import org.eclipse.jst.jsf.metadataprocessors.features.ValidationMessage;
-
-/**
- * Meta-data processing type representing a "binding" attribute
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public class ComponentBindingType extends ValueBindingType implements
-		IValidValues, IValidELValues {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 */
-	public boolean isValidValue(String value) {
-		//Strings are invalid.   Requires a EL value binding.
-		IValidationMessage msg = new ValidationMessage(Messages.ComponentBindingType_invalid_value);
-		getValidationMessages().add(msg);
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ComponentIDType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ComponentIDType.java
deleted file mode 100644
index 016d21b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ComponentIDType.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-
-import org.eclipse.jst.jsf.common.internal.types.CompositeType;
-import org.eclipse.jst.jsf.metadataprocessors.features.ELIsNotValidException;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage;
-import org.eclipse.jst.jsf.metadataprocessors.features.ValidationMessage;
-
-/**
- * Meta-data processing type representing an "id" attribute
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public class ComponentIDType extends ValueBindingType implements
-		IValidValues, IValidELValues {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.ValueBindingType#getExpectedRuntimeType()
-	 */
-	public CompositeType getExpectedRuntimeType() throws ELIsNotValidException {
-		throw new ELIsNotValidException(Messages.ComponentIDType_invalid_as_el);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 */
-	public boolean isValidValue(String value) {
-		IValidationMessage msg = null;
-		if (value != null && value.trim().length() == 0)
-			msg = new ValidationMessage(Messages.ComponentIDType_invalid_value);
-		else {
-			//we could validate uniqueness, but will not for the time being.  This would require a DT FacesContext.
-			//any other coercion rules apply here?
-			return true;
-		}			
-		getValidationMessages().add(msg);
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/DirectBindingType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/DirectBindingType.java
deleted file mode 100644
index 2c5f7c0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/DirectBindingType.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-/**
- * Abstract meta-data processing type
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public abstract class DirectBindingType extends BindingType {
-    // TODO: what is the point of this?
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/DoubleType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/DoubleType.java
deleted file mode 100644
index 0e73d4a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/DoubleType.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.List;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Meta-data processing type representing a "double" attribute value runtime type
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public class DoubleType extends NumberType {
-	private static final String INVALID_DOUBLE = Messages.DoubleType_invalid_double;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.EnumerationType#getReturnType()
-	 */
-	protected String getReturnType(){ return "double";} //$NON-NLS-1$
-	
-	/**
-	 * Type coercion according to JSP 2.0 spec: JSP.1.14.2.1 Conversions from String values
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 **/
-	public boolean isValidValue(String value) {		
-		try {
-			Double dbl = Double.valueOf(value);
-			exceedsMaxValue(dbl.doubleValue());
-			lessThanMinValue(dbl.doubleValue());
-			if (!(minFound || maxFound)){
-				List validVals = getMDValidValues();
-				if (!validVals.isEmpty()){
-					if (!validVals.contains(value)){
-						addNewValidationMessage(Messages.DoubleType_invalid_member);//fix me
-					}
-				}
-			}
-			return getValidationMessages().isEmpty();
-		} catch (NumberFormatException e) {
-			addNewValidationMessage(INVALID_DOUBLE);
-			return false;
-		}
-
-	}
-
-	private void exceedsMaxValue(double dbl) {
-		String strMax = getValidMaximumValue();
-		if (strMax != null){
-			try {
-				double max = Double.valueOf(strMax).doubleValue();
-				maxFound = true;
-				if (dbl > max){
-					addNewValidationMessage(NLS.bind(EXCEEDS_MAX, strMax));
-				}
-			} catch (NumberFormatException e) {
-				//TODO: ignore error????  or log it????
-			}
-		}
-		
-	}
-	
-	private void lessThanMinValue(double dbl) {
-		String strMin = getValidMinimumValue();
-		if (strMin != null){
-			try {
-				double max = Double.valueOf(strMin).doubleValue();
-				minFound = true;
-				if (dbl < max){
-					addNewValidationMessage(NLS.bind(LESS_THAN_MIN, strMin));
-				}
-			} catch (NumberFormatException e) {
-				//TODO: ignore error????  or log it????
-			}
-		}
-		
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/EnumerationType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/EnumerationType.java
deleted file mode 100644
index e1bb995..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/EnumerationType.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.CompositeType;
-import org.eclipse.jst.jsf.metadataprocessors.AbstractRootTypeDescriptor;
-import org.eclipse.jst.jsf.metadataprocessors.features.ELIsNotValidException;
-import org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.ValidationMessage;
-
-/**
- * Abstract meta-data processing type representing an enumeration attribute value runtime type
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public abstract class EnumerationType extends AbstractRootTypeDescriptor implements IValidValues, IDefaultValue, IValidELValues{
-	private List validationMessages;
-	
-	/**
-	 * An empty list
-	 */
-	protected static List EMPTY_LIST = new ArrayList(0);
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#getValidationMessages()
-	 */
-	public List getValidationMessages() {
-		if (validationMessages == null){
-			validationMessages = new ArrayList();
-		}
-		return validationMessages;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue#getDefaultValue()
-	 */
-	public String getDefaultValue() {
-		return getTraitValueAsString(IDefaultValue.DEFAULT_VALUE_PROP_NAME);		
-	}
-	
-	/**
-	 * @return possible values of type as list of Strings using 
-	 * {@link IPossibleValues}.POSSIBLE_VALUES_PROP_NAME trait name
-	 */
-	protected List getMDPossibleValues() {
-		return getTraitValueAsListOfStrings(IPossibleValues.POSSIBLE_VALUES_PROP_NAME);
-	}
-	
-	/**
-	 * @return possible values of type to dislay as list of Strings using 
-	 * {@link IPossibleValues}.POSSIBLE_VALUES_FOR_DISPLAY_PROP_NAME trait name
-	 */
-	protected List getMDPossibleValuesForDisplay() {
-		return getTraitValueAsListOfStrings(IPossibleValues.POSSIBLE_VALUES_FOR_DISPLAY_PROP_NAME);
-	}
-	
-	/**
-	 * @return  list of valid values as list of Strings using 
-	 * {@link IValidValues}.VALID_VALUES_PROP_NAME trait name
-	 */
-	protected List getMDValidValues() {
-		return getTraitValueAsListOfStrings(IValidValues.VALID_VALUES_PROP_NAME);		
-	}
-	
-	/**
-	 * @return Validation message for type using
-	 * {@link IValidValues}.VALID_VALUES_MESSAGE_PROP_NAME trait name
-	 */
-	protected String getMDValidationMessage() {
-		return getTraitValueAsString(IValidValues.VALID_VALUES_MESSAGE_PROP_NAME);			
-	}
-
-	/**
-	 * @return Validation severity int value for type using
-	 * {@link IValidValues}.VALID_VALUES_SEVERITY_PROP_NAME trait name
-	 */
-	protected int getMDValidationSeverity() {
-		String val = getTraitValueAsString(IValidValues.VALID_VALUES_SEVERITY_PROP_NAME);		
-		if (val == null)
-			return IStatus.WARNING;
-		
-		int severity = Integer.valueOf(val).intValue();
-		return severity;
-	}
-
-	/**
-	 * @return Validation code as String value for type using
-	 * {@link IValidValues}.VALID_VALUES_CODE_PROP_NAME trait name
-	 */
-	protected String getMDValidationCode() {
-		return getTraitValueAsString(IValidValues.VALID_VALUES_CODE_PROP_NAME);		
-	}
-	
-	/**
-	 * Create a {@link ValidationMessage} from metadata or use default message
-	 * and add it to the collection of validation messages
-	 * @param defaultMsg
-	 */
-	protected void addNewValidationMessage(String defaultMsg) {
-		String msg = getMDValidationMessage();
-		if (msg == null || msg.equals("")) //$NON-NLS-1$
-			msg = defaultMsg;
-		
-		String code = getMDValidationCode();
-		int severity = getMDValidationSeverity();
-		ValidationMessage val = new ValidationMessage(msg, code, severity);
-		getValidationMessages().add(val);
-	}
-	
-	/**
-	 * @return return Java type as string (i.e. boolean, java.lang.String, etc.)
-	 * Must not be null.
-	 */
-	protected abstract String getReturnType();
-	
-	/**
-	 * @return the value of {@link org.eclipse.jst.jsf.common.internal.types.IAssignable}.ASSIGNMENT_TYPE_NONE.  Subclasses to override.
-	 */
-	protected int getAssignmentType(){
-		return 0;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues#getExpectedRuntimeType()
-	 */
-	public CompositeType getExpectedRuntimeType() throws ELIsNotValidException {
-		String type = Signature.createTypeSignature(getReturnType(), true);
-		return new CompositeType(type, getAssignmentType());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ExpressionBindingType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ExpressionBindingType.java
deleted file mode 100644
index 1ae1d98..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ExpressionBindingType.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Abstract meta-data processing type representing an expression binding attribute value runtime type
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public abstract class ExpressionBindingType extends BindingType  {
-	/**
-	 * Valid values is any fully qualified Java type or primitive.  
-	 * Assign a value for each parameter in order
-	 */
-	public static final String RUNTIME_PARAMS_TYPES = "runtime-param-types"; //$NON-NLS-1$
-	/**
-	 * Valid values is any fully qualified Java type or primitive.  
-	 */
-	public static final String RUNTIME_RETURN_TYPE = "runtime-return-type"; //$NON-NLS-1$
-	/**
-	 * Value should be set true or false.   If not specified, the default inmplementation assumes false. 
-	 */
-	public static final String RUNTIME_SETTER_REQUIRED = "runtime-type-setter-required"; //$NON-NLS-1$
-	private List validationMessages;
-	
-
-	/**
-	 * @return String value of the "runtime-return-type" trait 
-	 */
-	protected String getReturnType() {
-		return getTraitValueAsString(RUNTIME_RETURN_TYPE);		
-	}
-
-	/**
-	 * @return String[] value of the "runtime-param-types" trait 
-	 */
-	protected String[] getParams() {
-		List params = getTraitValueAsListOfStrings(RUNTIME_PARAMS_TYPES);
-		
-		return (String[])params.toArray(new String[0]);
-	}
-
-	/**
-	 * @return lits of validation messages
-	 */
-	public List getValidationMessages() {
-		if (validationMessages == null){
-			validationMessages = new ArrayList();
-		}
-		return validationMessages;
-	}
-
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigConverterIDFeatures.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigConverterIDFeatures.java
deleted file mode 100644
index bcad219..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigConverterIDFeatures.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Meta-data processing feature representing an attribute value requiring a "converterid"
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public class FacesConfigConverterIDFeatures extends FacesConfigIdentifierFeatures {
-
-	/**
-	 * Faces converter classname
-	 */
-	protected static final String CONVERTER = "javax.faces.convert.Converter"; //$NON-NLS-1$
-	/**
-	 * Imagename to use when displaying converter
-	 */
-	protected static final String IMAGE_NAME = "/icons/full/obj16/FacesConfig_Converter.gif"; //$NON-NLS-1$
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getElements(org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager)
-	 */
-	protected List getElements(JSFAppConfigManager mgr) {
-		if (mgr != null)
-			return mgr.getConverters();
-		return new ArrayList(0);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getReturnType()
-	 */
-	protected String getReturnType(){ return CONVERTER;}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getPossibleValueProposals(java.util.List)
-	 */
-	protected List getPossibleValueProposals(List elements) {
-		List ret = new ArrayList();
-		Collections.sort(elements, new ConverterSorter());
-		for (Iterator it = elements.iterator();it.hasNext();){
-			ConverterType obj = (ConverterType)it.next();
-			if (obj.getConverterId() != null && obj.getConverterId().getTextContent() != null){
-				PossibleValue pv = createProposal(obj.getConverterId().getTextContent(), obj.getDisplayName(), obj.getDescription());
-				if (pv != null){
-					pv.setIcon(getImage());
-					ret.add(pv);
-				}
-			}
-		}
-		return ret;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getImageName()
-	 */
-	protected String getImageName() {		
-		return IMAGE_NAME;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getMyValidationMessage(java.lang.String)
-	 */
-	protected String getMyValidationMessage(String value) {		
-		if (value == null || value.trim().equals("")) //$NON-NLS-1$
-			return Messages.FacesConfigConverterIDFeatures_converterid_empty;
-		
-		return NLS.bind(Messages.FacesConfigIdentifierType_invalid_converter_id, new String[]{singleQuote(value)});
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getElementIDs(org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager)
-	 */
-	protected List getElementIDs(JSFAppConfigManager mgr) {
-		List elements = getElements(mgr);
-		List ret = new ArrayList(elements.size());		
-		for (Iterator it = elements.iterator();it.hasNext();){
-			ConverterType aType = (ConverterType)it.next();
-			if (aType.getConverterId() != null && aType.getConverterId().getTextContent() != null){
-				String id = aType.getConverterId().getTextContent();
-				if (id != null)
-					ret.add(id.trim());
-			}
-		}
-		return ret;
-	}
-	
-	/**
-	 * 
-	 * Converter ID Sorter - incomplete
-	 */
-	class ConverterSorter implements Comparator {
-
-		public int compare(Object o1, Object o2) {		
-			//TODO
-			return 0;
-
-		}
-		
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigConverterIDType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigConverterIDType.java
deleted file mode 100644
index 3e81d04..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigConverterIDType.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-/**
- * Type representing a FacesConfig Converter attribute
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-public class FacesConfigConverterIDType extends FacesConfigIdentifierType {
-    // FIXME: why do we have an empty class?
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigIdentifierFeatures.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigIdentifierFeatures.java
deleted file mode 100644
index b22f4d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigIdentifierFeatures.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.common.internal.types.CompositeType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.metadataprocessors.AbstractMetaDataEnabledFeature;
-import org.eclipse.jst.jsf.metadataprocessors.features.ELIsNotValidException;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.ValidationMessage;
-import org.osgi.framework.Bundle;
-
-/**
- * Abstract meta-data processing feature representing a faces-config type
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public abstract class FacesConfigIdentifierFeatures extends AbstractMetaDataEnabledFeature  
-		implements IPossibleValues, IValidValues, IValidELValues{
-	
-	/**
-	 * Meta-data property name to use for identifying the faces-config type
-	 * 
-	 * see jsf_core.xml converterID and validatorID attributes
-	 */
-	public static final String ID_TYPE_PROP_NAME = "config-type"; //$NON-NLS-1$
-
-	/**
-	 *  Missing image descriptor
-	 */
-	protected static final ImageDescriptor MISSING_IMAGE = ImageDescriptor.getMissingImageDescriptor();
-	
-	/**
-	 * Name of image file to use with content assist proposals
-	 */
-	protected String imageName;
-	private ImageDescriptor imageDescriptor;
-	/**
-	 * Validation messages to return
-	 */
-	protected List validationMessages;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues#getPossibleValues()
-	 */
-	public List getPossibleValues() {
-		List ret = new ArrayList();
-		List idTypes = getConfigTypes();
-		
-		if (idTypes != null){
-			for (int i=0;i<idTypes.size();i++){
-				//verify this feature can deal with this type
-				if (getReturnType().equals(idTypes.get(i))){
-					ret.addAll(createPossibleValues());
-				}
-			}
-		}
-		
-		return ret;
-	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 */
-	public boolean isValidValue(String value) {	
-		List idTypes = getConfigTypes();
-		if (idTypes != null){
-			for (int i=0;i<idTypes.size();i++){
-				if (getReturnType().equals(idTypes.get(i))){
-					if (hasValue(getElementIDs(getJSFAppConfigMgr()), value)){
-						getValidationMessages().clear();					
-						return true;
-					}
-                    getValidationMessages().add(getValidationMessage(value));
-				}
-			}
-		}
-		return false;
-	}
-	
-	private boolean hasValue(List elements, String value) {
-		for (Iterator it=elements.iterator();it.hasNext();){
-			if (value.equals(it.next()))
-				return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @param value of the attribute
-	 * @return the validation message String
-	 */
-	protected abstract String getMyValidationMessage(String value);
-	
-	/**
-	 * Creates an IValidationMessage
-	 * @param value
-	 * @return IValidationMessage
-	 */
-	protected IValidationMessage getValidationMessage(String value) {
-		String msg;
-		msg = getCMValidationMessage();
-		if (msg == null){
-				msg = getMyValidationMessage(value);
-		}		
-		String code = getCMValidationCode();
-		int severity = getCMValidationSeverity();
-		
-		IValidationMessage valMsg = new ValidationMessage(msg, code, severity);
-		return valMsg;
-	}
-
-	/**
-	 * 
-	 * @param value
-	 * @return single-quoted value
-	 */
-	protected String singleQuote(String value){
-		return "'" + value+"'"; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#getValidationMessages()
-	 */
-	public List getValidationMessages(){
-		if (validationMessages == null){
-			validationMessages = new ArrayList();
-		}
-		return validationMessages;
-	}
-	
-	/**
-	 * @param jsfAppConfigManager
-	 * @return list of faces-config element for the specified config-type
-	 */
-	protected abstract List getElements(JSFAppConfigManager jsfAppConfigManager);
-	/**
-	 * @param elements
-	 * @return list of IPossibleValue objects for the specified list of config elements
-	 */
-	protected abstract List getPossibleValueProposals(List elements);
-	/**
-	 * @return image name relative to the FacesConfigEditPlugin where the images are stored
-	 */
-	protected abstract String getImageName();
-	
-	private List createPossibleValues() {		
-		return getPossibleValueProposals(getElements(getJSFAppConfigMgr()));
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.AbstractMetaDataEnabledFeature#getImage()
-	 */
-	protected ImageDescriptor getImage() {
-		ImageDescriptor ret = super.getImage();
-		if (ret != null && ret != MISSING_IMAGE)
-			return ret;
-
-		if (imageDescriptor == null){				
-			imageDescriptor = getImageDesc(getImageName());
-		}
-		return imageDescriptor;
-
-	}
-	
-	//return FacesConfigPlugin relative image descriptor
-	private ImageDescriptor getImageDesc(String img) {
-		Bundle bundle = FacesConfigPlugin.getPlugin().getBundle();
-		URL url = FileLocator.find(bundle, new Path(img), null);
-		ImageDescriptor desc = ImageDescriptor.createFromURL(url);
-		if (desc == MISSING_IMAGE){
-			return null;
-		}
-		return desc;
-	}
-
-	/**
-	 * @param value
-	 * @param displayName
-	 * @param description
-	 * @return PossibleValue object
-	 */
-	protected PossibleValue createProposal(String value, EList displayName, EList description) {
-		String display = value;
-		if (displayName.size() > 0) {
-			DisplayNameType displayNameType= (DisplayNameType) displayName.get(0);
-			display = displayNameType.getTextContent();
-		}
-		String desc = null;
-		if (description.size() > 0) {
-			DescriptionType descType= (DescriptionType) description.get(0);
-			desc = descType.getTextContent();
-		}		
-		PossibleValue pv = new PossibleValue(value, display);
-		if (desc != null)
-			pv.setAdditionalInformation(desc);
-		
-		return pv;
-		
-	}
-
-	private List getConfigTypes() {
-		return getTraitValueAsListOfStrings(ID_TYPE_PROP_NAME);
-		
-//		return CMAnnotationHelper.getCMAttributePropertyValues(getMetaDataContext().getBundleId(), 
-//				getMetaDataContext().getUri(), getMetaDataContext().getElementName(),
-//				getMetaDataContext().getAttributeName(), ID_TYPE_PROP_NAME);
-	}
-
-	private JSFAppConfigManager getJSFAppConfigMgr(){
-		return JSFAppConfigManager.getInstance(getProject());
-	}
-
-	private IProject getProject() {
-		IWorkspaceContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(getStructuredDocumentContext());
-		if (resolver != null)
-			return resolver.getProject();
-		
-		return null;
-	}
-
-	/**
-	 * @param jsfAppConfigManager
-	 * @return list of identifier Strings for config-type
-	 */
-	protected abstract List getElementIDs(JSFAppConfigManager jsfAppConfigManager);
-
-	/**
-	 * @return the config-type
-	 */
-	protected abstract String getReturnType();
-	/**
-	 * @return int value of {@link IAssignable}.ASSIGNMENT_TYPE_RHS & {@link IAssignable}.ASSIGNMENT_TYPE_LHS 
-	 */
-	protected int getAssignmentType(){
-		//TODO: fix me to get from meta-data(?)
-		return IAssignable.ASSIGNMENT_TYPE_RHS & IAssignable.ASSIGNMENT_TYPE_LHS;
-	}
-	public CompositeType getExpectedRuntimeType() throws ELIsNotValidException {
-		String type = Signature.createTypeSignature(getReturnType(), true);
-		return new CompositeType(type, getAssignmentType());
-	}
-	
-	/**
-	 * @return String value of {@link IValidValues}.VALID_VALUES_MESSAGE_PROP_NAME trait
-	 */
-	protected String getCMValidationMessage() {
-		//TODO: Standard Validation stuff - should be moved somewhere else
-		return getTraitValueAsString(IValidValues.VALID_VALUES_MESSAGE_PROP_NAME);			
-	}
-
-	/**
-	 * @return int value of {@link IValidValues}.VALID_VALUES_SEVERITY_PROP_NAME trait
-	 */
-	protected int getCMValidationSeverity() {
-		String val = getTraitValueAsString(IValidValues.VALID_VALUES_SEVERITY_PROP_NAME);		
-		if (val == null)
-			return IStatus.WARNING;
-		
-		int severity = Integer.valueOf(val).intValue();
-		return severity;
-	}
-
-	/**
-	 * @return String value of {@link IValidValues}.VALID_VALUES_CODE_PROP_NAME trait
-	 */
-	protected String getCMValidationCode() {
-		return getTraitValueAsString(IValidValues.VALID_VALUES_CODE_PROP_NAME);		
-	}
-	
-}
-
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigIdentifierType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigIdentifierType.java
deleted file mode 100644
index 5ac934d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigIdentifierType.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-/**
- * Meta-data processing type representing a faces-config type
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public abstract class FacesConfigIdentifierType extends IdentifierType	 {
-    // FIXME: why do we have an empty class?
-}
-	
-
-
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigValidatorIDFeatures.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigValidatorIDFeatures.java
deleted file mode 100644
index b402817..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigValidatorIDFeatures.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * ValidatorID attribute feature
- * 
- * <p><b>Provisional API - subject to change</b></p>
- *
- */
-public class FacesConfigValidatorIDFeatures extends FacesConfigIdentifierFeatures {
-
-	/**
-	 * Faces validator classname
-	 */
-	protected static final String VALIDATOR = "javax.faces.validator.Validator"; //$NON-NLS-1$
-	/**
-	 * Imagename to use when displaying validator
-	 */
-	protected static final String IMAGE_NAME = "/icons/full/obj16/FacesConfig_Validator.gif"; //$NON-NLS-1$
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getReturnType()
-	 */
-	protected String getReturnType(){ return VALIDATOR;}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getElements(org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager)
-	 */
-	protected List getElements(JSFAppConfigManager mgr) {
-		if (mgr != null)
-			return mgr.getValidators();
-		return new ArrayList(0);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getPossibleValueProposals(java.util.List)
-	 */
-	protected List getPossibleValueProposals(List elements) {
-		List ret = new ArrayList();
-		Collections.sort(elements, new ValidatorSorter());
-		for (Iterator it = elements.iterator();it.hasNext();){
-			ValidatorType obj = (ValidatorType)it.next();
-			if (obj.getValidatorId() != null && obj.getValidatorId().getTextContent() != null){
-				PossibleValue pv = createProposal(obj.getValidatorId().getTextContent(), obj.getDisplayName(), obj.getDescription());
-				if (pv != null){
-					pv.setIcon(getImage());
-					ret.add(pv);
-				}
-			}
-		}
-		return ret;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getImageName()
-	 */
-	protected String getImageName() {		
-		return IMAGE_NAME;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getMyValidationMessage(java.lang.String)
-	 */
-	protected String getMyValidationMessage(String value) {		
-		if (value == null || value.trim().equals("")) //$NON-NLS-1$
-			return Messages.FacesConfigValidatorIDFeatures_validatorid_empty;
-		
-		return NLS.bind(Messages.FacesConfigIdentifierType_invalid_validator_id, new String[]{singleQuote(value)});
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.FacesConfigIdentifierFeatures#getElementIDs(org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager)
-	 */
-	protected List getElementIDs(JSFAppConfigManager mgr) {
-		List elements = getElements(mgr);
-		List ret = new ArrayList(elements.size());		
-		for (Iterator it = elements.iterator();it.hasNext();){
-			ValidatorType aType = (ValidatorType)it.next();
-			if (aType.getValidatorId() != null && aType.getValidatorId().getTextContent() != null){
-				String id = aType.getValidatorId().getTextContent();
-				if (id != null)
-					ret.add(id.trim());
-			}
-		}
-		return ret;
-	}
-	
-	/**
-	 * Validator id sorter - incomplete
-	 */
-	class ValidatorSorter implements Comparator {
-
-		public int compare(Object o1, Object o2) {		
-			//TODO
-			return 0;
-
-		}
-		
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigValidatorIDType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigValidatorIDType.java
deleted file mode 100644
index 65f0504..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigValidatorIDType.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-/**
- * Type representing a FacesConfig Validator attribute
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-public class FacesConfigValidatorIDType extends FacesConfigIdentifierType {
-    // FIXME: why do we have an empty class?
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/IdentifierType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/IdentifierType.java
deleted file mode 100644
index 134e23d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/IdentifierType.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-/**
- * Abstract meta-data processing type representing an identifier binding type
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public abstract class IdentifierType extends DirectBindingType {
-    // TODO: parent is already abstract; what's the point?
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/IntegerType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/IntegerType.java
deleted file mode 100644
index 6fcbdb7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/IntegerType.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.List;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Meta-data processing type representing an integer attribute value runtime type
- * that implements IValidValues, IDefaultValue, IValidELValues
- * 
- * <p><b>Provisional API - subject to change</b></p> 
- * @author Gerry Kessler - Oracle
- */
-public class IntegerType extends NumberType {
-	private static final String INVALID_INTEGER = Messages.IntegerType_invalid_integer;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.EnumerationType#getReturnType()
-	 */
-	protected String getReturnType(){ return "int";} //$NON-NLS-1$
-	
-	/**
-	 * Type coercion according to JSP 2.0 spec: JSP.1.14.2.1 Conversions from String values
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 **/
-	public boolean isValidValue(String value) {		
-		try {
-			Integer anInt = Integer.valueOf(value);
-			exceedsMaxValue(anInt.intValue());
-			lessThanMinValue(anInt.intValue());
-			if (!(minFound || maxFound)){
-				List validVals = getMDValidValues();
-				if (!validVals.isEmpty()){
-					if (!validVals.contains(value)){
-						addNewValidationMessage(Messages.IntegerType_invalid_member);//fix me
-					}
-				}
-			}
-			return getValidationMessages().isEmpty();
-		} catch (NumberFormatException e) {
-			addNewValidationMessage(INVALID_INTEGER);
-			return false;
-		}
-
-	}
-
-	private void exceedsMaxValue(int anInt) {
-		String strMax = getValidMaximumValue();
-		if (strMax != null){
-			try {
-				int max = Integer.valueOf(strMax).intValue();
-				maxFound = true;
-				if (anInt > max){
-					addNewValidationMessage(NLS.bind(EXCEEDS_MAX, strMax));
-				}
-			} catch (NumberFormatException e) {
-				//TODO: ignore error????  or log it????
-			}
-		}
-		
-	}
-	
-	private void lessThanMinValue(int anInt) {
-		String strMin = getValidMinimumValue();
-		if (strMin != null){
-			try {
-				int max = Integer.valueOf(strMin).intValue();
-				minFound = true;
-				if (anInt < max){
-					addNewValidationMessage(NLS.bind(LESS_THAN_MIN, strMin));
-				}
-			} catch (NumberFormatException e) {
-				//TODO: ignore error????  or log it????
-			}
-		}
-		
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/JavaClassType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/JavaClassType.java
deleted file mode 100644
index 48c37d0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/JavaClassType.java
+++ /dev/null
@@ -1,498 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.SearchEngine;
-import org.eclipse.jdt.core.search.SearchMatch;
-import org.eclipse.jdt.core.search.SearchParticipant;
-import org.eclipse.jdt.core.search.SearchPattern;
-import org.eclipse.jdt.core.search.SearchRequestor;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.ValidationMessage;
-
-/**
- * Provides possible values and validates attribute values that should be fully qualified Java types.
- * A type can be verified against multiple "valid-interfaces" and/or a "valid-superclass" from meta-data.
- * Code checks to ensure the class can be instantiated (i.e. not abstract, anonymous or inner class)
- * Search is scoped to within the current project only. 
- * 
- * (Until https://bugs.eclipse.org/bugs/show_bug.cgi?id=142044 is fixed, only the first found will be used)
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- *
- */
-public class JavaClassType extends ObjectType implements IPossibleValues, IValidValues{
-	/**
-	 * Trait name for valid interfaces
-	 */
-	public static final String POSSIBLE_VALUES_INTERFACES_PROP_NAME = "valid-interfaces"; //$NON-NLS-1$
-	/**
-	 * Trait name for valid superclass
-	 */
-	public static final String POSSIBLE_VALUES_SUPERCLASS_PROP_NAME = "valid-superclass"; //$NON-NLS-1$
-	
-	private List validationMsgs;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues#getPossibleValues()
-	 */
-	public List getPossibleValues() {
-		List results = getTypes();
-		if (results != null && !results.isEmpty()){
-			
-			Set vals = new HashSet(results.size());
-			Set checkedTypes = new HashSet();
-			for (Iterator it = results.iterator();it.hasNext();){
-				SearchMatch match = (SearchMatch)it.next();
-				IType res = (IType)match.getElement();
-				addValidSubClasses(res, vals, checkedTypes);					
-			}
-			return createPossibleValues(vals);
-		}						
-		return new ArrayList(0);
-	}
-	
-	private List createPossibleValues(Set vals) {
-		List list = new ArrayList(vals.size());
-		Iterator it = vals.iterator();
-		while(it.hasNext()){
-			IJavaElement elem = (IJavaElement)it.next();
-			list.add(createPossibleValue(elem));
-		}
-		return list;
-	}
-
-	private void addValidSubClasses(IType res, Set vals, Set checkedTypes) {
-
-		try {
-			//check to see if we have already checked the hiearchy
-			if (checkedTypes.contains(res))
-				return;
-						
-			//should we add itself?
-			if (isInnerOrAnonymousClass(res))
-				return;
-			if (!isAbstractClass(res))
-				vals.add(res);  //since it is a set, dupes will not be added
-			
-
-			ITypeHierarchy hierarchy = res.newTypeHierarchy(getJavaProject(), null);			
-			IType[] subclasses = hierarchy.getSubclasses(res);
-			checkedTypes.add(res);
-			for (int i=0;i<subclasses.length;i++){
-				addValidSubClasses(subclasses[i], vals, checkedTypes);
-			}
-		} catch (JavaModelException e) {
-			//ignore
-		}
-	}
-
-	private IWorkspaceContextResolver getWorkspaceContextResolver(){
-		if (getStructuredDocumentContext() == null)
-			return null;
-		
-		 return IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(getStructuredDocumentContext());
-	}
-	
-	private List getTypes(){
-		IJavaProject jp = getJavaProject();
-		if (jp == null)
-			return null;
-		
-		List elems = new ArrayList();
-		elems.addAll(getInterfaces(jp));
-		IType sc = getSuperClass(jp);
-		if (sc != null)
-			elems.add(sc);
-			
-		if (elems.size() > 0){				
-			SearchRequestor requestor = new Searcher();
-			SearchEngine engine = new SearchEngine();
-			
-			IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[]{jp});//, IJavaSearchScope.SOURCES | IJavaSearchScope.APPLICATION_LIBRARIES | IJavaSearchScope.);
-			SearchPattern combined = SearchPattern.createPattern((IJavaElement)elems.get(0), IJavaSearchConstants.IMPLEMENTORS, 0);
-
-//			 Until this bug is fixed, stub it out...  only the first interface/superclass will be used.
-//							https://bugs.eclipse.org/bugs/show_bug.cgi?id=142044
-//							for(int i=1;i<elems.size();i++){
-//								final SearchPattern other = SearchPattern.createPattern((IJavaElement)elems.get(i), IJavaSearchConstants.IMPLEMENTORS, 0);
-//								combined = SearchPattern.createAndPattern(combined, other);
-//							}
-			
-			try {
-				engine.search(combined, new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()}, scope, requestor, null);
-				
-			} catch (CoreException e) {
-				//ignore
-			}
-
-			return ((Searcher)requestor).getResults();	
-		}
-
-		return Collections.EMPTY_LIST;
-	}
-	
-	private IJavaProject getJavaProject() {
-		IWorkspaceContextResolver resolver = getWorkspaceContextResolver();
-		if (resolver != null){
-			IProject proj = resolver.getProject();
-			if (proj != null)
-				return JavaCore.create(proj);
-		}
-		return null;
-	}
-
-	private List getInterfaces(IJavaProject jp) {
-		List ret = new ArrayList();
-		List propVals = getInterfaceNames();		
-		
-		for (Iterator it = propVals.iterator();it.hasNext();){
-			String propVal = (String)it.next();
-			IType interfase = null;
-			try {
-				interfase = findType(jp, propVal);
-				if (interfase != null){
-					ret.add(interfase);
-				}
-			} catch (JavaModelException e) {
-                // suppress and fall-through to return empty list
-			}
-
-		}
-		return ret;
-	}
-	
-	private IType getSuperClass(IJavaProject jp){
-		IType superclass = null;
-		try {
-			String sc = getSuperClassName();
-			if (sc != null && !sc.trim().equals("")){ //$NON-NLS-1$
-				superclass = findType(jp, sc );
-				if (superclass != null){
-					return superclass;
-				}
-			}
-		} catch (JavaModelException e) {
-			//ignore
-		}
-		return null;
-	}
-	
-	private PossibleValue createPossibleValue(IJavaElement val) {
-		return new PossibleValue(((IType)val).getFullyQualifiedName());		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#getValidationMessages()
-	 */
-	public List getValidationMessages() {
-		if (validationMsgs == null){
-			validationMsgs = new ArrayList();			
-		}
-		return validationMsgs;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 */
-	public boolean isValidValue(String value) {
-		if (value == null || value.trim().equals("")){ //$NON-NLS-1$
-			getValidationMessages().add(new ValidationMessage(Messages.JavaClassType_invalid_type));
-			return false;
-		}
-		IJavaProject jp = getJavaProject();
-		if (jp == null)
-			return false;
-		
-		//first verify that the value specified is a resolvable type
-		IType type = getTypeForValue(jp, value);
-		if (type != null){			
-			//ensure that it is not abstract or anonymous
-			if (!isInnerOrAnonymousClass(type) && !isAbstractClass(type)){
-				//now verify that it meets the criteria
-				ITypeHierarchy hierarchy;
-				try {
-					hierarchy = type.newTypeHierarchy(jp, null);
-				} catch (JavaModelException e) {
-					return false;
-				}
-						
-				//check that all interfaces
-				List<String> interfaceNames = getInterfaceNames();
-				for (Iterator<String> it=interfaceNames.iterator();it.hasNext();){
-					//check that all interfaces are satisfied by type
-					IType interfase = getTypeForValue(jp, it.next());
-					if (interfase == null){
-						addNewValidationMessage(Messages.JavaClassType_not_found);
-						return false;
-					}
-					else if (! containsType(hierarchy.getAllSupertypes(type), interfase)){
-						addNewValidationMessage(Messages.JavaClassType_not_found);
-						return false;
-					}
-				}
-				//interfaces have been satisfied now check the superclass if specified				
-				IType superClass = getSuperClass(jp); 
-				if (superClass != null && superClass.equals(type))
-					return true;
-				else if (superClass != null && !containsType(hierarchy.getAllSuperclasses(type), superClass )){
-					addNewValidationMessage(Messages.JavaClassType_not_found);
-					return false;
-				}
-				return true;
-//				List results = getTypes();
-//				if (!results.isEmpty()){					
-//					for (Iterator it = results.iterator();it.hasNext();){
-//						SearchMatch match = (SearchMatch)it.next();
-//						IType res = (IType)match.getElement();
-//						if (!isInnerOrAnonymousClass(res) ){
-//							//if this is the class, then optimize to reduce expense of creating hierarchy
-//							if (!isAbstractClass(type) && (res.getFullyQualifiedName().equals(value)) )
-//								return true;
-//							//check to see if value is a subtype in the hierarchy
-//							try {
-//								ITypeHierarchy hierarchy = res.newTypeHierarchy(jp, null);
-//								if (containsType(hierarchy.getAllSubtypes(res), type)) 									
-//									return true;
-//								
-//							} catch (JavaModelException e) {
-//								//ignore
-//							}
-//						}
-//					}
-//				}
-			}
-		}
-		addNewValidationMessage(Messages.JavaClassType_not_found);
-		return false;
-	}
-	
-	private boolean containsType(IType[] types, IType type) {
-		for (int i=0;i < types.length;i++) {
-			if (type.equals(types[i]))
-				return true;
-		}
-		return false;
-	}
-
-	private IType getTypeForValue(IJavaProject jp, String value) {
-		try {
-			return findType(jp, value);
-		} catch (JavaModelException e) {
-            // suppress and fall through to return null
-		}
-		return null;
-	}
-
-	/**
-	 * @return String value of {@link #POSSIBLE_VALUES_SUPERCLASS_PROP_NAME}
-	 */
-	protected String getSuperClassName(){
-		return getTraitValueAsString(POSSIBLE_VALUES_SUPERCLASS_PROP_NAME);
-//		return CMAnnotationHelper.getCMAttributePropertyValue(getMetaDataContext().getBundleId(), getMetaDataContext().getUri(),
-//				getMetaDataContext().getElementName(), getMetaDataContext().getAttributeName(),
-//				POSSIBLE_VALUES_SUPERCLASS_PROP_NAME);
-
-	}
-	
-	/**
-	 * @return List of values from {@link #POSSIBLE_VALUES_INTERFACES_PROP_NAME}
-	 */
-	protected List getInterfaceNames(){
-		return getTraitValueAsListOfStrings(POSSIBLE_VALUES_INTERFACES_PROP_NAME);
-		
-//		return CMAnnotationHelper.getCMAttributePropertyValues(getMetaDataContext().getBundleId(), getMetaDataContext().getUri(),
-//				getMetaDataContext().getElementName(), getMetaDataContext().getAttributeName(),
-//				POSSIBLE_VALUES_INTERFACES_PROP_NAME);
-
-	}
-
-	/**
-	 * Create a {@link ValidationMessage} from metadata or use default message
-	 * and add it to the collection of validation messages
-	 * @param defaultMsg
-	 */
-	protected void addNewValidationMessage(String defaultMsg) {
-		//TODO: need to refactor below as this as also in Enumeration
-		String msg = getCMValidationMessage();
-		if (msg == null || msg.equals("")) //$NON-NLS-1$
-			msg = defaultMsg;
-		
-		String code = getValidationCode();
-		int severity = getValidationSeverity();
-		ValidationMessage val = new ValidationMessage(msg, code, severity);
-		getValidationMessages().add(val);
-	}
-	
-	
-	/**
-	 * @return validation message from meta-data using {@link IValidValues}.VALID_VALUES_MESSAGE_PROP_NAME trait.   Can be null.
-	 */
-	protected String getCMValidationMessage() {
-		return getTraitValueAsString(IValidValues.VALID_VALUES_MESSAGE_PROP_NAME);			
-	}
-	
-	/**
-	 * @return validation severity as int from meta-data using {@link IValidValues}.VALID_VALUES_SEVERITY_PROP_NAME trait.   IStatus.WARNING is default.
-	 */
-	protected int getValidationSeverity() {
-		String val = getTraitValueAsString(IValidValues.VALID_VALUES_SEVERITY_PROP_NAME);		
-		if (val == null)
-			return IStatus.WARNING;
-		
-		int severity = Integer.valueOf(val).intValue();
-		return severity;
-	}
-
-	/**
-	 * @return validation code as String from meta-data.   Can be null.
-	 */
-	protected String getValidationCode() {
-		return getTraitValueAsString(IValidValues.VALID_VALUES_CODE_PROP_NAME);		
-	}
-	
-	private boolean isInnerOrAnonymousClass(IType res) {
-		try {
-			if (res.isClass() && (res.isAnonymous() || 
-									(Flags.isPrivate(res.getFlags())) || 
-									res.getFullyQualifiedName().indexOf("$") > 0)) //must be better way to discover if it is an inner class //$NON-NLS-1$
-				return true;
-		} catch (JavaModelException e) {
-			//ignore
-		}
-		return false;
-	}
-
-
-	private boolean isAbstractClass(IType res) {	
-		try {
-			if (res.isClass() && Flags.isAbstract(res.getFlags()))
-				return true;
-		} catch (JavaModelException e) {
-			//ignore
-		}
-		return false;
-	}
-	
-	private class Searcher extends SearchRequestor{
-		private List results = new ArrayList();
-		public void acceptSearchMatch(SearchMatch match) throws CoreException {
-			results.add(match);
-		}
-		
-		/**
-		 * @return list of serach results
-		 */
-		public List getResults(){
-			return results;
-		}
-	}
-	
-/////////////////  ///////////////////////////////////////////////////////////////////////
-//remainder of this class copied from org.eclipse.jdt.internal.corext.util.JavaCoreUtil //
-//TODO: find public version of this functionality										//
-//////////////////////////////////////////////////////////////////////////////////////////
-	private IType findType(IJavaProject jproject, String fullyQualifiedName) throws JavaModelException {
-		//workaround for bug 22883
-		IType type= jproject.findType(fullyQualifiedName);
-		if (type != null)
-			return type;
-
-		IPackageFragmentRoot[] roots= jproject.getPackageFragmentRoots();
-		for (int i= 0; i < roots.length; i++) {
-			IPackageFragmentRoot root= roots[i];
-			type= findType(root, fullyQualifiedName);
-			if (type != null && type.exists())
-				return type;
-		}	
-		return null;
-	}
-	
-	private IType findType(IPackageFragmentRoot root, String fullyQualifiedName) throws JavaModelException{
-		IJavaElement[] children= root.getChildren();
-		for (int i= 0; i < children.length; i++) {
-			IJavaElement element= children[i];
-			if (element.getElementType() == IJavaElement.PACKAGE_FRAGMENT){
-				IPackageFragment pack= (IPackageFragment)element;
-				if (! fullyQualifiedName.startsWith(pack.getElementName()))
-					continue;
-				IType type= findType(pack, fullyQualifiedName);
-				if (type != null && type.exists())
-					return type;
-			}
-		}		
-		return null;
-	}
-	
-	private IType findType(IPackageFragment pack, String fullyQualifiedName) throws JavaModelException{
-		ICompilationUnit[] cus= pack.getCompilationUnits();
-		for (int i= 0; i < cus.length; i++) {
-			ICompilationUnit unit= cus[i];
-			IType type= findType(unit, fullyQualifiedName);
-			if (type != null && type.exists())
-				return type;
-		}
-		return null;
-	}
-	
-	private IType findType(ICompilationUnit cu, String fullyQualifiedName) throws JavaModelException{
-		IType[] types= cu.getAllTypes();
-		for (int i= 0; i < types.length; i++) {
-			IType type= types[i];
-			if (getFullyQualifiedName(type).equals(fullyQualifiedName))
-				return type;
-		}
-		return null;
-	}
-	
-	private String getFullyQualifiedName(IType type) {
-		try {
-			if (type.isBinary() && !type.isAnonymous()) {
-				IType declaringType= type.getDeclaringType();
-				if (declaringType != null) {
-					return getFullyQualifiedName(declaringType) + '.' + type.getElementName();
-				}
-			}
-		} catch (JavaModelException e) {
-			// ignore
-		}		
-		return type.getFullyQualifiedName('.');
-	}
-////////////////////////////////////////////////////////////////////////
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LengthType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LengthType.java
deleted file mode 100644
index 43bcbaa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LengthType.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-/**
- * Meta-data processing type representing an length attribute value runtime type.
- * Does not support min and max values from MD.  Length must be positive.
- * that implements IValidValues, IDefaultValue, IValidELValues.
- */
-public class LengthType extends IntegerType {	
-	private static final String INVALID_LENGTH = Messages.LengthType_invalid_integer;
-	/**
-	 * Type coercion according to JSP 2.0 spec: JSP.1.14.2.1 Conversions from String values
-	 * Allows a percentage.
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 **/
-	public boolean isValidValue(String value) {	
-		if (value == null) return true;
-		String aValue = stripPercentIfPresent(value);		
-		try {
-			int anInt = Integer.valueOf(aValue);
-			if (anInt < 0)
-				addNewValidationMessage(INVALID_LENGTH);
-			
-			return getValidationMessages().isEmpty();
-		} catch (NumberFormatException e) {
-			addNewValidationMessage(INVALID_LENGTH);
-			return false;
-		}
-
-	}
-	//will strip '%' if at end of string.  If string is only '%', then will return empty which will be invalid.
-	private String stripPercentIfPresent(String value) {
-		//"%" is allowed at end
-		if (value.length() > 0
-			&& value.lastIndexOf('%') == value.length() - 1)
-				return value.replaceFirst("%","");
-		
-		return value;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LongType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LongType.java
deleted file mode 100644
index a7791e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LongType.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.List;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Meta-data processing type representing a long attribute value runtime type
- * that implements IValidValues, IDefaultValue, IValidELValues
- *  
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public class LongType extends NumberType {
-	private static final String INVALID_LONG = Messages.LongType_invalid_long;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.EnumerationType#getReturnType()
-	 */
-	protected String getReturnType(){ return "long";} //$NON-NLS-1$
-
-	/**
-	 * Type coercion according to JSP 2.0 spec: JSP.1.14.2.1 Conversions from String values
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 **/
-	public boolean isValidValue(String value) {			
-		try {
-			Long aLong = Long.valueOf(value);
-			exceedsMaxValue(aLong.longValue());
-			lessThanMinValue(aLong.longValue());
-			if (!(minFound || maxFound)){
-				List validVals = getMDValidValues();
-				if (!validVals.isEmpty()){
-					if (!validVals.contains(value)){
-						addNewValidationMessage(Messages.LongType_invalid_member);
-					}
-				}
-			}
-			return getValidationMessages().isEmpty();
-		} catch (NumberFormatException e) {
-			addNewValidationMessage(INVALID_LONG);
-			return false;
-		}
-
-	}
-
-	private void exceedsMaxValue(long aLong) {
-		String strMax = getValidMaximumValue();
-		if (strMax != null){
-			try {
-				long max = Long.valueOf(strMax).longValue();
-				maxFound = true;
-				if (aLong > max){
-					addNewValidationMessage(NLS.bind(EXCEEDS_MAX, strMax));
-				}
-			} catch (NumberFormatException e) {
-				//TODO: ignore error????  or log it????
-			}
-		}
-		
-	}
-	
-	private void lessThanMinValue(long aLong) {
-		String strMin = getValidMinimumValue();
-		if (strMin != null){
-			try {
-				long min = Long.valueOf(strMin).longValue();
-				minFound = true;
-				if (aLong < min){
-					addNewValidationMessage(NLS.bind(LESS_THAN_MIN, strMin));
-				}
-			} catch (NumberFormatException e) {
-				//TODO: ignore error????  or log it????
-			}
-		}
-		
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/Messages.java
deleted file mode 100644
index 8eb89f0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/Messages.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Message bundle for attributevalue types/features
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.taglibprocessing.attributevalues.messages"; //$NON-NLS-1$
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-	/**
-	 * see messages.properties
-	 */
-	public static String ActionType_navcase_display;
-    /**
-     * see messages.properties
-     */
-	public static String ActionType_invalid_value;
-    /**
-     * see messages.properties
-     */
-	public static String ActionType_invalid_empty_value;
-    /**
-     * see messages.properties
-     */
-	public static String BooleanType_invalid_values;
-    /**
-     * see messages.properties
-     */
-	public static String ComponentBindingType_invalid_value;
-    /**
-     * see messages.properties
-     */
-	public static String ComponentIDType_invalid_as_el;
-    /**
-     * see messages.properties
-     */
-	public static String ComponentIDType_invalid_value;
-    /**
-     * see messages.properties
-     */
-	public static String DoubleType_invalid_double;
-    /**
-     * see messages.properties
-     */
-	public static String DoubleType_invalid_member;
-    /**
-     * see messages.properties
-     */
-	public static String FacesConfigConverterIDFeatures_converterid_empty;
-    /**
-     * see messages.properties
-     */
-	public static String FacesConfigIdentifierType_invalid_converter_id;
-    /**
-     * see messages.properties
-     */
-	public static String FacesConfigIdentifierType_invalid_validator_id;
-    /**
-     * see messages.properties
-     */
-	public static String FacesConfigValidatorIDFeatures_validatorid_empty;
-    /**
-     * see messages.properties
-     */
-	public static String IntegerType_invalid_integer;
-    /**
-     * see messages.properties
-     */
-	public static String IntegerType_invalid_member;
-    /**
-     * see messages.properties
-     */
-	public static String JavaClassType_invalid_type;
-    /**
-     * see messages.properties
-     */
-	public static String JavaClassType_not_found;
-    /**
-     * see messages.properties
-     */
-	public static String LongType_invalid_long;
-    /**
-     * see messages.properties
-     */
-	public static String LongType_invalid_member;
-    /**
-     * see messages.properties
-     */
-	public static String MethodBindingType_invalid_value;
-    /**
-     * see messages.properties
-     */
-	public static String NumberType_max_val;
-    /**
-     * see messages.properties
-     */
-	public static String NumberType_min_val;
-    /**
-     * see messages.properties
-     */
-	public static String StringType_invalid_value;
-    /**
-     * see messages.properties
-     */
-	public static String ValueType_invalid_value;
-    /**
-     * see messages.properties
-     */
-	public static String ValueType_invalid_value_without_setter;
-    /**
-     * see messages.properties
-     */	
-	public static String LengthType_invalid_integer;
-    /**
-     * see messages.properties
-     */	
-	public static String ColorType_invalid_color;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/MethodBindingType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/MethodBindingType.java
deleted file mode 100644
index fbc20fa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/MethodBindingType.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.CompositeType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.metadataprocessors.features.ELIsNotValidException;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage;
-import org.eclipse.jst.jsf.metadataprocessors.features.ValidationMessage;
-
-/**
- * Meta-data processing type representing an method-binding attribute value runtime type
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public class MethodBindingType extends ExpressionBindingType implements IValidELValues, IValidValues{
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues#getExpectedRuntimeType()
-	 */
-	public CompositeType getExpectedRuntimeType() throws ELIsNotValidException {
-		String[] params = getParams();
-        
-        // need to "signaturize" each parameter
-        for (int param = 0; param < params.length; param++)
-        {
-            params[param] = Signature.createTypeSignature(params[param],true);
-        }
-        
-		String returnType = Signature.createTypeSignature(getReturnType(), true);
-		if (returnType == null)
-        {
-			return null;
-        }
-		
-		String methodSig = Signature.createMethodSignature(params, returnType);
-		return new CompositeType(methodSig, IAssignable.ASSIGNMENT_TYPE_NONE);
-	}
-
-	/**
-	 * Non-EL values are invalid for method bound attribute values
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 */
-	public boolean isValidValue(String value) {		
-		//if this is being called, we are being called in an non-EL context which is invalid.
-		IValidationMessage msg = new ValidationMessage(Messages.MethodBindingType_invalid_value);
-		getValidationMessages().add(msg);
-		return false;
-	}
-
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/NumberType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/NumberType.java
deleted file mode 100644
index 4ee78b9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/NumberType.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-
-/**
- * Abstract meta-data processing type representing a numeric attribute value runtime type
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public abstract class NumberType extends EnumerationType{
-	/**
-	 * flag indicating max value metadata was found
-	 */
-	protected boolean maxFound = false;
-	/**
-	 *  flag indicating min value metadata was found
-	 */
-	protected boolean minFound = false;
-	
-	/**
-	 * Validation message when value has exceeded maximum
-	 */
-	protected String EXCEEDS_MAX = Messages.NumberType_max_val;
-	/**
-	 * Validation message when value is less than minimum
-	 */
-	protected String LESS_THAN_MIN = Messages.NumberType_min_val;
-	
-	/**
-	 * @return maximum value from property named IValidValues.VALID_VALUES_MAX_PROP_NAME
-	 */
-	protected String getValidMaximumValue(){
-		return getTraitValueAsString(IValidValues.VALID_VALUES_MAX_PROP_NAME);
-	}
-		
-	/**
-	 * @return minimum value from property named IValidValues.VALID_VALUES_MIN_PROP_NAME
-	 */
-	protected String getValidMinimumValue(){
-		return getTraitValueAsString(IValidValues.VALID_VALUES_MIN_PROP_NAME);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ObjectType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ObjectType.java
deleted file mode 100644
index 07120d4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ObjectType.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-/**
- * Abstract meta-data processing type representing an Object attribute value runtime type
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public abstract class ObjectType extends DirectBindingType {
-    // TODO: ????
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/StringType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/StringType.java
deleted file mode 100644
index 709497d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/StringType.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.PossibleValue;
-
-/**
- * Meta-data processing type representing a String attribute value runtime type
- * that implements IPossibleValues, IValidValues and IDefaultValues
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public class StringType extends EnumerationType implements IValidValues,
-		IPossibleValues, IDefaultValue {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.taglibprocessing.attributevalues.EnumerationType#getReturnType()
-	 */
-	protected String getReturnType(){ return "java.lang.String";} //$NON-NLS-1$
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 */
-	public boolean isValidValue(String value) {		
-		List vals = getMDValidValues();
-		if (vals.isEmpty())
-			return true;
-		
-		//if the value is empty but there is a default value, consider it valid		
-		if (getDefaultValue() != null  && (value == null || value.trim().equals("")))
-			return true;
-		
-		if(! vals.contains(value)){
-			addNewValidationMessage(Messages.StringType_invalid_value);
-		}
-		return getValidationMessages().isEmpty();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues#getPossibleValues()
-	 */
-	public List getPossibleValues() {
-		List pvs = getMDPossibleValues();
-		if (pvs.isEmpty())
-			return EMPTY_LIST;
-		
-		List pdvs = getMDPossibleValuesForDisplay();
-		
-		//if there are no display vals or the meta-data list sizes are different, use the values list for display also
-		if (pdvs.isEmpty() || pvs.size() != pdvs.size())
-			pdvs = pvs;
-	
-		ImageDescriptor icon = getImage();
-		
-		String defaultValue = getDefaultValue();
-		List ret = new ArrayList(pvs.size());
-		for(int i=0;i<pvs.size();i++){
-			PossibleValue pv = new PossibleValue((String)pvs.get(i), (String)pdvs.get(i));
-			pv.setIcon(icon);
-			pv.setIsDefault(((String)pvs.get(i)).equals(defaultValue));
-			ret.add(pv);
-		}
-		return ret;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ValueBindingType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ValueBindingType.java
deleted file mode 100644
index ef9c455..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ValueBindingType.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.CompositeType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.metadataprocessors.features.ELIsNotValidException;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues;
-
-/**
- * Meta-data processing type representing a Value Bound attribute value runtime type
- * that implements IValidValues
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public class ValueBindingType extends ExpressionBindingType implements IValidELValues{
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues#getExpectedRuntimeType()
-	 */
-	public CompositeType getExpectedRuntimeType() throws ELIsNotValidException {
-		String returnType = getReturnType();
-		if (returnType == null)
-			return null;
-		
-		String methodSig = Signature.createTypeSignature(returnType, true);
-		return new CompositeType(methodSig, getAssignmentValue());
-	}
-	
-	/**
-	 * @return {@link IAssignable}.LHS or {@link IAssignable}.RHS 
-	 */
-	protected int getAssignmentValue(){
-		return (getIsSetValueRequired() ? IAssignable.ASSIGNMENT_TYPE_LHS : 0) | IAssignable.ASSIGNMENT_TYPE_RHS;
-		
-	}
-	
-	/**
-	 * @return is runtime setter required?
-	 */
-	protected boolean getIsSetValueRequired(){
-		String value = getTraitValueAsString(RUNTIME_SETTER_REQUIRED);
-		if (value == null || value.trim().length() == 0)
-			return false; 
-		else if (value.trim().equals("true")) //$NON-NLS-1$
-			return true;
-		else
-			return false;		
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ValueType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ValueType.java
deleted file mode 100644
index 7c03fae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ValueType.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
-
-
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-
-/**
- * Meta-data processing type representing a "value" attribute 
- * that implements IValidValues and IValidELValues
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author Gerry Kessler - Oracle
- */
-public class ValueType extends ValueBindingType implements IValidValues, IValidELValues {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.metadataprocessors.features.IValidValues#isValidValue(java.lang.String)
-	 */
-	public boolean isValidValue(String value){
-		//value can be a string or a value binding expression
-		return true; 
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/messages.properties
deleted file mode 100644
index eb00fe6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/messages.properties
+++ /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
-###############################################################################
-IntegerType_invalid_integer=Value is not a valid integer.
-IntegerType_invalid_member=Value is not a member of the provided valid values
-LengthType_invalid_integer=Value is not a valid positive integer or positive integer percentage.
-LongType_invalid_long=Value is not a valid Long.
-LongType_invalid_member=Value is not a member of the provided valid values
-BooleanType_invalid_values=Valid values are "true" or "false"
-NumberType_max_val=Value exceeds maximum of {0}
-NumberType_min_val=Value is less than minimum of {0}
-DoubleType_invalid_double=Value is not a valid double.
-DoubleType_invalid_member=Value is not a member of the provided valid values
-StringType_invalid_value=Value is not valid.
-FacesConfigIdentifierType_invalid_validator_id= {0} validator id is is not registered.
-FacesConfigIdentifierType_invalid_converter_id= {0} converter id is not registered.
-FacesConfigConverterIDFeatures_converterid_empty=Converter ids must not be null or empty.
-FacesConfigValidatorIDFeatures_validatorid_empty=Validator ids must not be null or empty.
-ValueType_invalid_value_without_setter=This 'value' attribute value must be a value binding expression that can take a value assignment.
-ValueType_invalid_value=The 'value' attribute must be a non-zero length String or be a value binding expression.
-ComponentBindingType_invalid_value=The 'binding' attribute requires an EL value binding reference to a UIComponent.
-ComponentIDType_invalid_as_el='id' attributes must be Strings.  Consider using 'binding' attribute instead.
-ComponentIDType_invalid_value=The 'id' attribute must be a non-zero length String and be uniquely defined on the page.
-ActionType_invalid_value=The action value does not match a navigation case outcome.
-ActionType_invalid_empty_value=The action attribute must be a non-zero length String or a method binding matching a navigation case outcome.
-ActionType_navcase_display={0}: goto {1} 
-MethodBindingType_invalid_value=MethodBinding attribute values must be EL expressions.
-JavaClassType_invalid_type=Value for type attribute must be valid Java class and not empty.
-JavaClassType_not_found=Java type not found, not instantiable, or does implement correct interfaces or extend correct superclass.
-ColorType_invalid_color=Value is not a valid color.
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/package-info.java
deleted file mode 100644
index 8cd9907..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * This package is used to provide types for tag attribute values so that the 
- * org.eclipse.jst.jsf.core.metadataprocessors.features can be applied.  
- * 
- * A type is added using the org.eclipse.jst.jsf.core.AttributeValueRuntimeTypes extension point.
- * These types are referenced using the design-time metadata framework in org.eclipse.jst.jsf.common
- * The org.eclipse.jst.jsf.metadataprocessors.features provides the interesting tooling services based upon the type.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/ELValidationPreferences.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/ELValidationPreferences.java
deleted file mode 100644
index 38b80de..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/ELValidationPreferences.java
+++ /dev/null
@@ -1,824 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal;
-
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Model object for EL validation preferences
- * 
- * @author cbateman
- */
-public class ELValidationPreferences implements IJSFPreferenceModel
-{
-    private final static String KEY_ENABLE_BUILD_VALIDATION = 
-        "org.eclipse.jst.jsf.ui.ValidateJSFELBuild";
-    private final static boolean DEFAULT_ENABLE_BUILD_VALIDATION = true;
-
-    private final static String KEY_ENABLE_INCREMENTAL_VALIDATION = 
-        "org.eclipse.jst.jsf.ui.ValidateJSFELIncremental";
-    private final static boolean DEFAULT_ENABLE_INCREMENTAL_VALIDATION = false;
-    
-
-    private boolean         _enableBuildValidation;
-    private boolean         _enableIncrementalValidation;
-    private int[]           _severities;
-
-    /**
-     * Loads the object from the preference store provided
-     * 
-     * @param prefStore
-     */
-    public void load(IPreferenceStore  prefStore)
-    {
-        if (!prefStore.contains(KEY_ENABLE_BUILD_VALIDATION))
-        {
-            prefStore.setDefault(KEY_ENABLE_BUILD_VALIDATION, DEFAULT_ENABLE_BUILD_VALIDATION);
-        }
-        _enableBuildValidation = 
-            prefStore.getBoolean(KEY_ENABLE_BUILD_VALIDATION);
-
-        if (!prefStore.contains(KEY_ENABLE_INCREMENTAL_VALIDATION))
-        {
-            prefStore.setDefault(KEY_ENABLE_INCREMENTAL_VALIDATION, DEFAULT_ENABLE_INCREMENTAL_VALIDATION);
-        }
-        _enableIncrementalValidation = 
-            prefStore.getBoolean(KEY_ENABLE_INCREMENTAL_VALIDATION);
-        
-        loadSeverities(prefStore);
-    }
-
-    private void loadSeverities(final IPreferenceStore  prefStore)
-    {
-        final int severities[] = getSeverities();
-        
-        for (int i = 0; i < DiagnosticFactory.NUM_IDS; i++)
-        {
-            final String key = getKeyById(i);
-            
-            if (!prefStore.contains(key))
-            {
-                final int diagSeverity = getDefaultSeverity(i); 
-                final Severity severity  = mapDiagToSeverity(diagSeverity);
-        
-                prefStore.setDefault(key, severity.toString());
-            }
-            final String  storedSeverity = prefStore.getString(key);
-            severities[i] = mapSeverityToDiag(storedSeverity);
-        }
-    }
-    /**
-     * Copies the object into the preference store but DOES NOT SAVE IT
-     * 
-     * @param prefStore
-     */
-    public void commit(IPreferenceStore prefStore)
-    {
-        prefStore.setValue(KEY_ENABLE_BUILD_VALIDATION, _enableBuildValidation);
-        prefStore.setValue(KEY_ENABLE_INCREMENTAL_VALIDATION, 
-                           _enableIncrementalValidation);
-        commitSeverities(prefStore);
-    }
-    
-    private void commitSeverities(final IPreferenceStore prefStore)
-    {
-        final int severities[] = getSeverities();
-        
-        for (int i = 0; i < severities.length; i++)
-        {
-            final String key = getKeyById(i);
-            prefStore.setValue(key
-                , mapDiagToSeverity(severities[i]).toString());
-        }
-    }
-    
-    /**
-     * Reverts the model to it's defaults.  Does not commit to pref store. 
-     */
-    public void setDefaults()
-    {
-        setEnableBuildValidation(DEFAULT_ENABLE_BUILD_VALIDATION);
-        setEnableIncrementalValidation(DEFAULT_ENABLE_INCREMENTAL_VALIDATION);
-        setProblemSeverityDefaults();
-    }
-    
-    private void setProblemSeverityDefaults()
-    {
-        final int[] severities = getSeverities();
-        
-        for (int i = 0; i < DiagnosticFactory.NUM_IDS; i++)
-        {
-            severities[i] = getDefaultSeverity(i); 
-        }
-    }
-    
-    public Object getValueByKey(IScopeContext context, String key) {
-        // ignore context for now; will be used when we have project overrides
-        if (KEY_ENABLE_BUILD_VALIDATION.equals(key))
-        {
-            return Boolean.valueOf(isEnableBuildValidation());
-        }
-        else if (KEY_ENABLE_INCREMENTAL_VALIDATION.equals(key))
-        {
-            return Boolean.valueOf(isEnableIncrementalValidation());
-        }
-        else
-        {
-            try
-            {
-                final Severity severity = getSeverity(key);
-                return severity.toString();
-            }
-            catch (IllegalArgumentException e)
-            {
-                // getIdByKey will throw this exception if key is not a valid
-                // severity key.  Ignore the exception here and fall-through
-            }
-        }
-        
-        return null; // not found
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel#getStoredValueByKey(org.eclipse.core.runtime.preferences.IScopeContext, java.lang.String)
-     */
-    public Object getStoredValueByKey(IScopeContext context, String key) {
-        // ignore context for now; will be used when we have project overrides
-        if (KEY_ENABLE_BUILD_VALIDATION.equals(key))
-        {
-            return Boolean.valueOf(context.getNode("org.eclipse.jst.jsf.ui").getBoolean(key, true));
-        }
-        else if (KEY_ENABLE_INCREMENTAL_VALIDATION.equals(key))
-        {
-            return Boolean.valueOf(context.getNode("org.eclipse.jst.jsf.ui").getBoolean(key, false));
-        }
-        else
-        {
-            try
-            {
-                return context.getNode("org.eclipse.jst.jsf.core").get(key, mapDiagToSeverity(getDefaultSeverity(getIdByKey(key))).toString());
-            }
-            catch (IllegalArgumentException e)
-            {
-                // getIdByKey will throw this exception if key is not a valid
-                // severity key.  Ignore the exception here and fall-through
-            }
-        }
-        
-        return null; // not found
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel#setValueByKey(org.eclipse.core.runtime.preferences.IScopeContext, java.lang.String, java.lang.Object)
-     */
-    public Object setValueByKey(IScopeContext context, String key, Object value) 
-    {
-        // ignore context for now; will be used when we have project overrides
-        if (KEY_ENABLE_BUILD_VALIDATION.equals(key))
-        {
-            boolean oldValue = isEnableBuildValidation();
-            boolean newValue = ((Boolean)value).booleanValue();
-            setEnableBuildValidation(newValue);
-            return Boolean.valueOf(oldValue);
-        }
-        else if (KEY_ENABLE_INCREMENTAL_VALIDATION.equals(key))
-        {
-            boolean oldValue = isEnableIncrementalValidation();
-            boolean newValue = ((Boolean)value).booleanValue();
-            setEnableIncrementalValidation(newValue);
-            return Boolean.valueOf(oldValue);
-        }
-        else
-        {
-            final Severity oldValue = getSeverity(key);
-            setSeverity(key, (Severity)value);
-            return oldValue;
-        }
-    }
-
-    /**
-     * @return the build validation enablement
-     */
-    public boolean isEnableBuildValidation() 
-    {
-        return _enableBuildValidation;
-    }
-
-    /**
-     * @return the incremental validation enablement
-     */
-    public boolean isEnableIncrementalValidation() 
-    {
-        return _enableIncrementalValidation;
-    }
-
-    /**
-     * @param enableBuildValidation
-     */
-    public void setEnableBuildValidation(boolean enableBuildValidation) {
-        _enableBuildValidation = enableBuildValidation;
-    }
-
-    /**
-     * @param enableIncrementalValidation
-     */
-    public void setEnableIncrementalValidation(boolean enableIncrementalValidation) {
-        _enableIncrementalValidation = enableIncrementalValidation;
-    }
-    
-    /**
-     * @param key
-     * @return the severity
-     */
-    public Severity getSeverity(final String key)
-    {
-        final int severityDiag = _severities[getIdByKey(key)];
-        final Severity severity = mapDiagToSeverity(severityDiag);
-        return severity;
-    }
-
-    /**
-     * @param key
-     * @param severity
-     */
-    public void setSeverity(final String key, final Severity severity)
-    {
-        final int newSeverityDiag = mapSeverityToDiag(severity.toString());
-        final int diagId = getIdByKey(key);
-        _severities[diagId] = newSeverityDiag;
-    }
-    
-    /**
-     * @param diagnosticId
-     * @return the severity as configured for diagnosticId.  The value
-     * is relative to the Diagnostic class severity scheme
-     */
-    public final int getDiagnosticSeverity(final int diagnosticId)
-    {
-        return getSeverities()[diagnosticId];
-    }
-    
-    private int[] getSeverities()
-    {
-        if (_severities == null)
-        {
-            _severities = new int[DiagnosticFactory.NUM_IDS];
-        }
-        
-        return _severities;
-    }
-    
-    /**
-     * @param diagSeverity
-     * @return a Severity preference value for a diagnostic severity
-     */
-    public static Severity mapDiagToSeverity(int diagSeverity)
-    {
-        switch(diagSeverity)
-        {
-            case Diagnostic.ERROR:
-                return Severity.ERROR;
-            case Diagnostic.WARNING:
-                return Severity.WARNING;
-            default:
-                return Severity.IGNORE;
-        }
-    }
-    
-    /**
-     * @param severity
-     * @return a Diagnostic severity level for a severity pref string
-     */
-    public static int mapSeverityToDiag(String severity)
-    {
-        if ("error".equals(severity))
-        {
-            return Diagnostic.ERROR;
-        }
-        else if ("warning".equals(severity))
-        {
-            return Diagnostic.WARNING;
-        }
-        else if ("ignore".equals(severity))
-        {
-            return Diagnostic.OK;
-        }
-        else
-        {
-            throw new IllegalArgumentException("Invalid enum name: "+severity);
-        }
-    }
-    
-    /**
-     * @param diagnosticId
-     * @return the default severity of a diagnostic
-     */
-    public static int getDefaultSeverity(final int diagnosticId)
-    {
-        switch(diagnosticId)
-        {
-            case DiagnosticFactory.BINARY_OP_BOTH_OPERANDS_NULL_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.BINARY_OP_POSSIBLE_DIVISION_BY_ZERO_ID:
-                return Diagnostic.ERROR;
-            case DiagnosticFactory.BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID:
-                return Diagnostic.ERROR;
-            case DiagnosticFactory.BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID:
-                return Diagnostic.ERROR;
-            case DiagnosticFactory.BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.BINARY_OP_NO_AVAILABLE_TYPE_COERCION_ID:
-                return Diagnostic.ERROR;
-            case DiagnosticFactory.BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS_ID:
-                return Diagnostic.ERROR;
-            case DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID:
-                return Diagnostic.ERROR;
-            case DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID:
-                return Diagnostic.ERROR;
-            case DiagnosticFactory.TERNARY_OP_CHOICE_IS_ALWAYS_SAME_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN_ID:
-                return Diagnostic.ERROR;
-            case DiagnosticFactory.UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING_ID:
-                return Diagnostic.ERROR;
-            case DiagnosticFactory.MEMBER_NOT_FOUND_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.VARIABLE_NOT_FOUND_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.MISSING_CLOSING_EXPR_BRACKET_ID:
-                return Diagnostic.ERROR;
-            case DiagnosticFactory.GENERAL_SYNTAX_ERROR_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.EMPTY_EL_EXPRESSION_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.BINARY_OP_DOT_WITH_VALUEB_NULL_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME_ID:
-                return Diagnostic.WARNING;
-            case DiagnosticFactory.BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE_ID:
-                return Diagnostic.ERROR;
-            case DiagnosticFactory.MEMBER_IS_INTERMEDIATE_ID:
-                return Diagnostic.WARNING;
-            default:
-                throw new IllegalArgumentException("Diagnostic Id: "+ diagnosticId +" is out of range");
-        }
-    }
-
-    /**
-     * @param diagnosticId
-     * @return the preference key for the corresponding diagnosticId in the el DiagnosticFactory
-     */
-    public static String getKeyById(final int diagnosticId)
-    {
-        switch(diagnosticId)
-        {
-            case DiagnosticFactory.BINARY_OP_BOTH_OPERANDS_NULL_ID:
-                return BINARY_OP_BOTH_OPERANDS_NULL;
-            case DiagnosticFactory.BINARY_OP_POSSIBLE_DIVISION_BY_ZERO_ID:
-                return BINARY_OP_POSSIBLE_DIVISION_BY_ZERO;
-            case DiagnosticFactory.BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID:
-                return BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION;
-            case DiagnosticFactory.BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME_ID:
-                return BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME;
-            case DiagnosticFactory.BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME_ID:
-                return BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME;
-            case DiagnosticFactory.BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID:
-                return BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN;
-            case DiagnosticFactory.BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS_ID:
-                return BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS;
-            case DiagnosticFactory.BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME_ID:
-                return BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME;
-            case DiagnosticFactory.BINARY_OP_NO_AVAILABLE_TYPE_COERCION_ID:
-                return BINARY_OP_NO_AVAILABLE_TYPE_COERCION;
-            case DiagnosticFactory.BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS_ID:
-                return BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS;
-            case DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID:
-                return UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME;
-            case DiagnosticFactory.UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE_ID:
-                return UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE;
-            case DiagnosticFactory.UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO_ID:
-                return UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO;
-            case DiagnosticFactory.UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID:
-                return UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION;
-            case DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID:
-                return UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN;
-            case DiagnosticFactory.TERNARY_OP_CHOICE_IS_ALWAYS_SAME_ID:
-                return TERNARY_OP_CHOICE_IS_ALWAYS_SAME;
-            case DiagnosticFactory.TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN_ID:
-                return TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN;
-            case DiagnosticFactory.UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED_ID:
-                return UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED;
-            case DiagnosticFactory.CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING_ID:
-                return CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING;
-            case DiagnosticFactory.MEMBER_NOT_FOUND_ID:
-                return MEMBER_NOT_FOUND;
-            case DiagnosticFactory.VARIABLE_NOT_FOUND_ID:
-                return VARIABLE_NOT_FOUND;
-            case DiagnosticFactory.MISSING_CLOSING_EXPR_BRACKET_ID:
-                return MISSING_CLOSING_EXPR_BRACKET;
-            case DiagnosticFactory.GENERAL_SYNTAX_ERROR_ID:
-                return GENERAL_SYNTAX_ERROR;
-            case DiagnosticFactory.EMPTY_EL_EXPRESSION_ID:
-                return EMPTY_EL_EXPRESSION;
-            case DiagnosticFactory.BINARY_OP_DOT_WITH_VALUEB_NULL_ID:
-                return BINARY_OP_DOT_WITH_VALUEB_NULL;
-            case DiagnosticFactory.BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY_ID:
-                return BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY;
-            case DiagnosticFactory.POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS_ID:
-                return POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS;
-            case DiagnosticFactory.BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME_ID:
-                return BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME;
-            case DiagnosticFactory.BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE_ID:
-                return BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE;
-            case DiagnosticFactory.MEMBER_IS_INTERMEDIATE_ID:
-                return MEMBER_IS_INTERMEDIATE;
-            default:
-                throw new IllegalArgumentException("Diagnostic Id: "+ diagnosticId +" is out of range");
-        }
-    }
-    
-    /**
-     * @param key
-     * @return the preference key for the corresponding diagnosticId in the el DiagnosticFactory
-     */
-    public static int getIdByKey(final String key)
-    {
-        if (BINARY_OP_BOTH_OPERANDS_NULL.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_BOTH_OPERANDS_NULL_ID;
-        }
-        else if (BINARY_OP_POSSIBLE_DIVISION_BY_ZERO.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_POSSIBLE_DIVISION_BY_ZERO_ID;
-        }
-        else if (BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID;
-        }
-        else if (BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME_ID;
-        }
-        else if (BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME_ID;
-        }
-        else if (BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID;
-        }
-        else if (BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS_ID;
-        }
-        else if (BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME_ID;
-        }
-        else if (BINARY_OP_NO_AVAILABLE_TYPE_COERCION.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_NO_AVAILABLE_TYPE_COERCION_ID;
-        }
-        else if (BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS_ID;
-        }
-        else if (UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME.equals(key))
-        {
-            return DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID;
-        }
-        else if (UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE.equals(key))
-        {
-            return DiagnosticFactory.UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE_ID;
-        }
-        else if (UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO.equals(key))
-        {
-            return DiagnosticFactory.UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO_ID;
-        }
-        else if (UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION.equals(key))
-        {
-            return DiagnosticFactory.UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID;
-        }
-        else if (UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN.equals(key))
-        {
-            return DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID;
-        }
-        else if (TERNARY_OP_CHOICE_IS_ALWAYS_SAME.equals(key))
-        {
-            return DiagnosticFactory.TERNARY_OP_CHOICE_IS_ALWAYS_SAME_ID;
-        }
-        else if (TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN.equals(key))
-        {
-            return DiagnosticFactory.TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN_ID;
-        }
-        else if (UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED.equals(key))
-        {
-            return DiagnosticFactory.UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED_ID;
-        }
-        else if (CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING.equals(key))
-        {
-            return DiagnosticFactory.CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING_ID;
-        }
-        else if (MEMBER_NOT_FOUND.equals(key))
-        {
-            return DiagnosticFactory.MEMBER_NOT_FOUND_ID;
-        }
-        else if (VARIABLE_NOT_FOUND.equals(key))
-        {
-            return DiagnosticFactory.VARIABLE_NOT_FOUND_ID;
-        }
-        else if (MISSING_CLOSING_EXPR_BRACKET.equals(key))
-        {
-            return DiagnosticFactory.MISSING_CLOSING_EXPR_BRACKET_ID;
-        }
-        else if (GENERAL_SYNTAX_ERROR.equals(key))
-        {
-            return DiagnosticFactory.GENERAL_SYNTAX_ERROR_ID;
-        }
-        else if (EMPTY_EL_EXPRESSION.equals(key))
-        {
-           return DiagnosticFactory.EMPTY_EL_EXPRESSION_ID;
-        }
-        else if (BINARY_OP_DOT_WITH_VALUEB_NULL.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_DOT_WITH_VALUEB_NULL_ID;
-        }
-        else if (BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY_ID;
-        }
-        else if (POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS.equals(key))
-        {
-            return DiagnosticFactory.POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS_ID;
-        }
-        else if (BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME.equals(key))
-        {
-            return DiagnosticFactory.BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME_ID;
-        }
-        else if (BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE.equals(key))
-        {
-            return DiagnosticFactory.BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE_ID;
-        }
-        else if (MEMBER_IS_INTERMEDIATE.equals(key))
-        {
-            return DiagnosticFactory.MEMBER_IS_INTERMEDIATE_ID;
-        }
-        else
-        {
-            throw new IllegalArgumentException("Severity Key: "+ key);
-        }
-    }
-    
-    /**
-     * e.g. createQualifiedKeyName("foo") -> org.eclipse.jst.jsf.core.foo
-     * @param baseName
-     * @return a plugin qualified key given the baseName
-     * 
-     */
-    private static String createQualifiedKeyName(final String baseName)
-    {
-        return JSFCorePlugin.PLUGIN_ID + "." + baseName;
-    }
-    
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_BOTH_OPERANDS_NULL = 
-        createQualifiedKeyName("BINARY_OP_BOTH_OPERANDS_NULL");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_POSSIBLE_DIVISION_BY_ZERO = 
-        createQualifiedKeyName("BINARY_OP_POSSIBLE_DIVISION_BY_ZERO");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION = 
-        createQualifiedKeyName("BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME = 
-        createQualifiedKeyName("BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME = 
-        createQualifiedKeyName("BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN = 
-        createQualifiedKeyName("BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS = 
-        createQualifiedKeyName("BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME =
-        createQualifiedKeyName("BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_NO_AVAILABLE_TYPE_COERCION = 
-        createQualifiedKeyName("BINARY_OP_NO_AVAILABLE_TYPE_COERCION");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS = 
-        createQualifiedKeyName("BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME = 
-        createQualifiedKeyName("UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE = 
-        createQualifiedKeyName("UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO = 
-        createQualifiedKeyName("UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION = 
-        createQualifiedKeyName("UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN = 
-        createQualifiedKeyName("UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String TERNARY_OP_CHOICE_IS_ALWAYS_SAME = 
-        createQualifiedKeyName("TERNARY_OP_CHOICE_IS_ALWAYS_SAME");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN = 
-        createQualifiedKeyName("TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN"); 
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED = 
-        createQualifiedKeyName("UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING = 
-        createQualifiedKeyName("CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String MEMBER_NOT_FOUND = 
-        createQualifiedKeyName("MEMBER_NOT_FOUND");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String VARIABLE_NOT_FOUND = 
-        createQualifiedKeyName("VARIABLE_NOT_FOUND");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String MISSING_CLOSING_EXPR_BRACKET = 
-        createQualifiedKeyName("MISSING_CLOSING_EXPR_BRACKET");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String GENERAL_SYNTAX_ERROR = 
-        createQualifiedKeyName("GENERAL_SYNTAX_ERROR");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String EMPTY_EL_EXPRESSION = 
-        createQualifiedKeyName("EMPTY_EL_EXPRESSION");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_DOT_WITH_VALUEB_NULL = 
-        createQualifiedKeyName("BINARY_OP_DOT_WITH_VALUEB_NULL");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY = 
-        createQualifiedKeyName("BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS = 
-        createQualifiedKeyName("POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME = 
-        createQualifiedKeyName("BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME");
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE = 
-        createQualifiedKeyName("BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE");
-    
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    public final static String MEMBER_IS_INTERMEDIATE =
-        createQualifiedKeyName("MEMBER_IS_INTERMEDIATE");
-    
-    // values
-    /**
-     * Severity levels of problems
-     */
-    public enum Severity
-    {
-        /**
-         * Indicates a problem severity of Error
-         */
-        ERROR 
-        {
-            public java.lang.String toString() {
-                return "error";
-            }
-        }
-        ,
-        /**
-         * Indicates a problem severity of Warning
-         */
-        WARNING
-        {
-            public java.lang.String toString() {
-                return "warning";
-            }
-        }
-        , 
-        /**
-         * Indicates no problem should be shown
-         */
-        IGNORE
-        {
-            public java.lang.String toString() {
-                return "ignore";
-            }
-        };
-        
-        /**
-         * @param value
-         * @return the enum based on the toString mappings
-         */
-        public static Severity valueOfString(String value)
-        {
-            if ("error".equals(value))
-            {
-                return ERROR;
-            }
-            else if ("warning".equals(value))
-            {
-                return WARNING;
-            }
-            else
-            {
-                return IGNORE;
-            }
-        }
-     }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/IJSPSemanticValidatorTest.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/IJSPSemanticValidatorTest.java
deleted file mode 100644
index f6d00af..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/IJSPSemanticValidatorTest.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.eclipse.jst.jsf.validation.internal;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.wst.validation.internal.provisional.core.IReporter;
-import org.w3c.dom.Element;
-
-/**
- * Exposes certain private members for use by testing. 
- * 
- * NOT intended for use by production code.
- * 
- * @author cbateman
- *
- */
-public interface IJSPSemanticValidatorTest 
-{
-	/**
-	 * Proxies the internal call to validate the containment of a particular
-	 * tag. 
-	 * 
-	 * @param node
-	 * @param uri
-	 * @param tagName
-	 * @param reporter
-	 * @param file
-	 * @param context
-	 */
-	void validateContainment(Element node, String uri, String tagName, IReporter reporter, IFile file, IStructuredDocumentContext context);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/JSPSemanticsValidator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/JSPSemanticsValidator.java
deleted file mode 100644
index 147c35f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/JSPSemanticsValidator.java
+++ /dev/null
@@ -1,678 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.validation.internal;
-
-import java.io.IOException;
-import java.text.MessageFormat;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.common.internal.JSPUtil;
-import org.eclipse.jst.jsf.common.internal.types.CompositeType;
-import org.eclipse.jst.jsf.common.internal.types.TypeComparator;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.sets.AxiomaticSet;
-import org.eclipse.jst.jsf.common.sets.ConcreteAxiomaticSet;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.jsf.core.set.constraint.MemberConstraint;
-import org.eclipse.jst.jsf.core.set.mapping.ElementToTagIdentifierMapping;
-import org.eclipse.jst.jsf.core.tagmatcher.EvaluationException;
-import org.eclipse.jst.jsf.core.tagmatcher.InvalidExpressionException;
-import org.eclipse.jst.jsf.core.tagmatcher.XPathMatchingAlgorithm;
-import org.eclipse.jst.jsf.metadataprocessors.MetaDataEnabledProcessingFactory;
-import org.eclipse.jst.jsf.metadataprocessors.features.ELIsNotValidException;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidELValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage;
-import org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint;
-import org.eclipse.jst.jsf.validation.internal.constraints.TagId;
-import org.eclipse.jst.jsf.validation.internal.constraints.TagSet;
-import org.eclipse.jst.jsf.validation.internal.el.ELExpressionValidator;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.ValidationMessageFactory;
-import org.eclipse.jst.jsp.core.internal.domdocument.DOMModelForJSP;
-import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
-import org.eclipse.jst.jsp.core.internal.validation.JSPValidator;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionCollection;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
-import org.eclipse.wst.sse.ui.internal.reconcile.validator.ISourceValidator;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-import org.eclipse.wst.validation.internal.provisional.core.IReporter;
-import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * A JSP page validator that makes use of the JSF metadata processing framework so that JSP page
- * semantics can be validated.
- * 
- * This implementation currently only validates attribute values. 
- * @author Gerry Kessler - Oracle
- */
-public class JSPSemanticsValidator extends JSPValidator implements ISourceValidator
-{
-    // TODO: should the source validator be a separate class in jsp.ui?
-    // problem with simple split off is that preference must also be split off
-	static final boolean DEBUG;
-	static {
-		String value = Platform.getDebugOption("org.eclipse.jst.jsf.validation.internal.el/debug/jspsemanticsvalidator"); //$NON-NLS-1$
-		DEBUG = value != null && value.equalsIgnoreCase("true"); //$NON-NLS-1$
-	}
-    private final static ElementToTagIdentifierMapping elem2TagIdMapper = new ElementToTagIdentifierMapping();
-	private IDocument fDocument;
-	private int		  containmentValidationCount;  // = 0; 
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsp.core.internal.validation.JSPValidator#validateFile(org.eclipse.core.resources.IFile, org.eclipse.wst.validation.internal.provisional.core.IReporter)
-	 */
-	protected void validateFile(IFile file, IReporter reporter) {	
-		IStructuredModel model = null;		
-		if (DEBUG)
-			System.out.println("executing JSPSemanticsValidator.validateFile");
-		try {
-			model = StructuredModelManager.getModelManager().getModelForRead(file);
-
-			if (model instanceof DOMModelForJSP)
-			{
-			    ValidationPreferences prefs= new ValidationPreferences(JSFCorePlugin.getDefault().getPreferenceStore());
-			    prefs.load();
-			    DiagnosticFactory diagnosticFactory = new DiagnosticFactory();
-
-				// zero the containment validation count for each mondel
-				containmentValidationCount = 0;
-    			DOMModelForJSP jspModel = (DOMModelForJSP) model;
-    			IStructuredDocument structuredDoc = jspModel.getStructuredDocument();
-    			IStructuredDocumentRegion curNode = structuredDoc.getFirstStructuredDocumentRegion();
-    			while (null != curNode && !reporter.isCancelled()) {
-    				if (curNode.getFirstRegion().getType() == DOMRegionContext.XML_TAG_OPEN ) 
-                    {
-    					validateTag(curNode, reporter, file, false, prefs, diagnosticFactory);
-    				}				
-    				curNode = curNode.getNext();
-    			}
-			}
-		}
-        catch (CoreException e)
-        {
-            JSFCorePlugin.log("Error validating JSF", e);
-        }
-		catch (IOException e) 
-        {
-            JSFCorePlugin.log("Error validating JSF", e);
-		}
-		finally 
-        {
-			if (null != model)
-				model.releaseFromRead();
-			
-			// zero the containment count before exit
-			containmentValidationCount = 0;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.sse.ui.internal.reconcile.validator.ISourceValidator#validate(org.eclipse.jface.text.IRegion, org.eclipse.wst.validation.internal.provisional.core.IValidationContext, org.eclipse.wst.validation.internal.provisional.core.IReporter)
-	 */
-	public void validate(IRegion dirtyRegion, IValidationContext helper, IReporter reporter) {
-		if (DEBUG)
-			System.out.println("exec JSPSemanticsValidator.validateRegion");
-
-		ValidationPreferences prefs = new ValidationPreferences(JSFCorePlugin.getDefault().getPreferenceStore());
-		prefs.load();
-		DiagnosticFactory diagnosticFactory = new DiagnosticFactory();
-		if (fDocument instanceof IStructuredDocument) {
-			IStructuredDocument sDoc = (IStructuredDocument) fDocument;
-			IStructuredDocumentRegion[] regions = sDoc.getStructuredDocumentRegions(dirtyRegion.getOffset(), dirtyRegion.getLength());
-			if (regions != null){
-					validateTag(regions[0], reporter, getFile(helper), true, prefs, diagnosticFactory);
-			}
-		}		
-	}
-
-	private IFile getFile(IValidationContext helper) {
-		String[] uris = helper.getURIs();
-		IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
-		if (uris.length > 0) 
-			return wsRoot.getFile(new Path(uris[0]));
-
-		return null;
-	}
-
-
-	/**
-	 * Validates a JSP tag.
-	 * 
-	 * Currently only attribute values with supplied annotation meta-data is being validated.
-	 * Also, only JSF EL is being validated and not JSP EL.
-	 * 
-	 * This method may be extended in the future to validate tag semantics an other cross attribute
-	 * validations.
-     * 
-	 * @param container 
-	 * @param reporter 
-	 * @param file 
-	 * @param isIncremental -- true if this validation is "as you type"
-	 *  
-	 */
-	private void validateTag(ITextRegionCollection container, IReporter reporter, IFile file, boolean isIncremental, ValidationPreferences prefs, DiagnosticFactory diagnosticFactory) 
-	{
-		ITextRegionCollection containerRegion = container;
-		Iterator regions = containerRegion.getRegions().iterator();
-		ITextRegion region = null;
-		String uri = null;
-		String tagName = null;
-		String attrName = null;		
-		while (regions.hasNext() && !reporter.isCancelled()) 
-		{
-			region = (ITextRegion) regions.next();
-			String type = region.getType();
-			IDOMContextResolver resolver = null;
-			ITaglibContextResolver tagLibResolver = null; 
-			if (type != null  && (type == DOMRegionContext.XML_TAG_NAME || type == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME || type == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE))
-			{											
-				IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE.getContext(((IStructuredDocumentRegion)containerRegion).getParentDocument(), containerRegion.getStartOffset() + region.getStart());
-				resolver = IStructuredDocumentContextResolverFactory.INSTANCE.getDOMContextResolver(context);
-				if	(type == DOMRegionContext.XML_TAG_NAME) 
-				{					
-					tagLibResolver = IStructuredDocumentContextResolverFactory.INSTANCE.getTaglibContextResolver(context);
-                    Node node = resolver.getNode();
-					tagName = resolver.getNode().getLocalName();
-					uri = tagLibResolver.getTagURIForNodeName(resolver.getNode());
-                    
-                    if (node instanceof Element && uri != null)
-                    {
-                        validateContainment((Element)node, uri, tagName, reporter, file, context);
-                    }
-                    
-					if (DEBUG)
-						System.out.println(addDebugSpacer(1)+"tagName= "+ (tagName!= null ? tagName : "null") +": uri= "+(uri != null ? uri : "null") );
-				} 
-				else if (type == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME)
-				{
-					attrName = resolver.getNode().getNodeName();
-					if (DEBUG)
-						System.out.println(addDebugSpacer(2)+"attrName= "+(attrName != null ? attrName : "null" ));
-					if (uri != null && tagName != null)
-                    {
-						// TODO: validateAttribute(context, region, uri, resolver.getNode(), file);
-                    }
-				}
-				else if (type == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE)
-				{
-                    final String attributeVal = 
-                        resolver.getNode().getNodeValue();    
-
-                    // if there's  elText then validate it
-                    // TODO: this approach will fail with mixed expressions
-                    if (!checkIfELAndValidate(region, 
-                                              context,
-                                              uri,
-                                              tagName,
-                                              attrName,
-                                              attributeVal,
-                                              isIncremental,
-                                              reporter,
-                                              file,
-                                              prefs,
-                                              diagnosticFactory)
-                                              )
-                    {
-                        // else validate as static attribute value 
-                        if (DEBUG)
-                            System.out.println(addDebugSpacer(3)+"attrVal= "+(attributeVal != null ? attributeVal : "null") );
-
-                        if (uri != null && tagName != null && attrName != null)
-                            validateAttributeValue(context, uri, tagName, attrName, attributeVal, reporter, file);
-                    }
-				}
-			}
-		}
-	}
-
-    /**
-     * Checks the region to see if it contains an EL attribute value.  If it
-     * does, validates it
-     * @return true if validated EL, false otherwise
-     */
-    private boolean checkIfELAndValidate(ITextRegion region, 
-                                         IStructuredDocumentContext context,
-                                         String uri,
-                                         String tagName,
-                                         String attrName,
-                                         String attrValue,
-                                         boolean isIncremental,
-                                         IReporter reporter,
-                                         IFile  file,
-                                         ValidationPreferences validationPrefs,
-                                         DiagnosticFactory  diagnosticFactory)
-    {
-        if (region instanceof ITextRegionCollection) {
-            ITextRegionCollection parentRegion = ((ITextRegionCollection) region);
-            if (parentRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE)
-            {
-                // look for attribute pattern "#{}"
-                // TODO: need to generalize this for RValue concatenation
-                final ITextRegionList  regionList = parentRegion.getRegions();
-                if (regionList.size() >= 4)
-                {
-                    ITextRegion  openQuote = regionList.get(0);
-                    ITextRegion  openVBLQuote = regionList.get(1);
-
-                    if (    (openQuote.getType() == DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE
-                                || openQuote.getType() == DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_SQUOTE)
-                                && (openVBLQuote.getType() == DOMJSPRegionContexts.JSP_VBL_OPEN))
-                    {
-                        // we appear to be inside "#{", so next should be a VBL_CONTENT if there's anything
-                        // here to validate
-                        final ITextRegion content = regionList.get(2);
-                        if (content.getType() == DOMJSPRegionContexts.JSP_VBL_CONTENT)
-                        {
-                            final int contentStart = 
-                                parentRegion.getStartOffset(content);
-                            final IStructuredDocumentContext elContext =
-                                IStructuredDocumentContextFactory.INSTANCE.
-                                    getContext(context.getStructuredDocument(), 
-                                            contentStart);
-
-                            final String elText = parentRegion.getText(content);
-                            
-                            if (DEBUG)
-                                System.out.println(addDebugSpacer(3)+"EL attrVal= "+elText);
-
-                            // EL validation is user configurable because
-                            // it can be computationally costly.
-                            if (checkShouldValidateEL(validationPrefs, isIncremental))
-                            {
-                                List elVals = MetaDataEnabledProcessingFactory.getInstance().getAttributeValueRuntimeTypeFeatureProcessors(IValidELValues.class, elContext, uri, tagName, attrName);
-                                validateELExpression(context, 
-                                                     elContext, 
-                                                     elVals, 
-                                                     attrValue,
-                                                     elText, 
-                                                     reporter, 
-                                                     file,
-                                                     validationPrefs.getElPrefs());
-                            }
-                        }
-                        else if (content.getType() == DOMJSPRegionContexts.JSP_VBL_CLOSE)
-                        {
-                            final int offset = parentRegion.getStartOffset(openVBLQuote)+1;
-                            final int length = 2;
-                            
-                            // detected empty EL expression
-                            IMessage message = ValidationMessageFactory.createFromDiagnostic(
-                                    diagnosticFactory.create_EMPTY_EL_EXPRESSION(),
-                                     offset, length, file, validationPrefs.getElPrefs());
-                            
-                            reportFinding(reporter, message);
-                        }
-                        
-                        boolean foundClosingQuote = false;
-                        for (int i = 2; !foundClosingQuote && i < regionList.size(); i++)
-                        {
-                            ITextRegion  searchRegion = regionList.get(i);
-                            if (searchRegion.getType() == DOMJSPRegionContexts.JSP_VBL_CLOSE)
-                            {
-                                foundClosingQuote = true;
-                            }
-                        }
-                          
-                        if (!foundClosingQuote)
-                        {
-                            int offset = context.getDocumentPosition()+1;
-                            int length = parentRegion.getText().length();
-
-                            reportFinding(reporter, 
-                               ValidationMessageFactory.
-                                  createFromDiagnostic(
-                                          diagnosticFactory.create_MISSING_CLOSING_EXPR_BRACKET(), 
-                                              offset, length, file, validationPrefs.getElPrefs()));
-                        }
-                        
-                        return true;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-            
-	private void validateELExpression(IStructuredDocumentContext context,
-                                     IStructuredDocumentContext elContext, 
-                                     List elVals, 
-                                     String attributeVal,
-                                     String elText, 
-                                     IReporter reporter, 
-                                     IFile file,
-                                     ELValidationPreferences prefs) 
-    {
-        //Call EL validator which will perform at least the syntactical validation
-        final ELExpressionValidator elValidator = 
-            new ELExpressionValidator(elContext, elText,file,prefs);
-        elValidator.validateXMLNode();
-        elValidator.reportFindings(this, reporter);
-        
-		CompositeType exprType = elValidator.getExpressionType();
-		if (exprType != null)
-        {
-			for (Iterator it=elVals.iterator();it.hasNext();){
-				IValidELValues elval = (IValidELValues)it.next();
-				CompositeType expectedType;
-				IMessage message = null;
-				try {
-					expectedType = elval.getExpectedRuntimeType();
-                    
-                    if (expectedType != null)
-                    {
-    					Diagnostic status = TypeComparator.calculateTypeCompatibility
-                            (expectedType, exprType);
-    					if (status.getSeverity() != Diagnostic.OK){
-    						message = createValidationMessage(context, attributeVal, getSeverity(status.getSeverity()), status.getMessage(), file);						
-    					}
-                    }
-				} catch (ELIsNotValidException e) {
-					message = createValidationMessage(context, attributeVal, IMessage.NORMAL_SEVERITY, e.getMessage(), file);						
-				}
-				if (message != null) {
-					reportFinding(reporter, message);
-				}
-			}
-        }
-	}
-
-//    private void validateAttribute(IStructuredDocumentContext context, ITextRegion region, String uri, Node attr, IFile file) {
-		//Not doing anything until the resolver can help me
-		
-		//validate that attribute can be part of the tag
-//		ITaglibContextResolver tagLibResolver = IStructuredDocumentContextResolverFactory.INSTANCE.getTaglibContextResolver(context);
-//		if (tagLibResolver.getTagURIForNodeName(attr) == null){
-//			System.out.println("not ok: "+attr.getNodeName());
-//		}
-//		else
-//			System.out.println("ok");
-		
-//	}
-
-	/**
-	 * Validates an attribute value in context using the JSF metadata processing framework
-	 * 
-	 * @param context
-	 * @param region
-	 * @param uri
-	 * @param tagName
-	 * @param attrName
-	 * @param attributeVal
-	 * @param reporter
-	 * @param file
-	 */
-	private void validateAttributeValue(IStructuredDocumentContext context, String uri, String tagName, String attrName, String attributeVal, IReporter reporter, IFile file) {						
-		List vv = MetaDataEnabledProcessingFactory.getInstance().getAttributeValueRuntimeTypeFeatureProcessors(IValidValues.class, context, uri, tagName, attrName);
-		if (!vv.isEmpty()){
-			for (Iterator it = vv.iterator();it.hasNext();){
-				IValidValues v = (IValidValues)it.next();
-				if (attributeVal == null) attributeVal = "";//ensure to be non-null
-				if (!v.isValidValue(attributeVal.trim())){	
-					if (DEBUG)
-						System.out.println(addDebugSpacer(4)+"NOT VALID ");
-					
-					for (Iterator msgs = v.getValidationMessages().iterator();msgs.hasNext();){
-						IValidationMessage msg = (IValidationMessage)msgs.next();
-						IMessage message = createValidationMessage(context, attributeVal, getSeverity(msg.getSeverity()), msg.getMessage(), file);						
-						if (message != null) {
-							reportFinding(reporter, message);
-						}
-					}
-				}
-				else
-					if (DEBUG)
-						System.out.println(addDebugSpacer(5) + "VALID ");
-			}			
-		}
-		else if (DEBUG)
-			System.out.println(addDebugSpacer(4)+"NO META DATA ");
-	}
-	
-	private IMessage createValidationMessage(IStructuredDocumentContext context, String attributeValue, int severity, String msg, IFile file){
-		IMessage message = new LocalizedMessage(severity, msg, file);						
-		if (message != null) {
-			final int start = context.getDocumentPosition() + 1;
-			final int length = attributeValue.length();
-			
-			int lineNo = 0;
-			try {
-				lineNo = context.getStructuredDocument().getLineOfOffset(start);
-			} catch (BadLocationException e) {
-                //  TODO: C.B why need line number? Length and offset should be
-			    //  sufficient
-			}
-			
-			message.setLineNo(lineNo);
-			message.setOffset(start);
-			message.setLength(length);
-		}
-		return message;
-	}
-	/**
-	 * Maps IStatus codes to IMessage severity
-	 * @param IStatus codesseverity
-	 * @return IMessage severity
-	 */
-	private int getSeverity(int severity) {
-
-		switch (severity){
-			case IStatus.ERROR:
-				return IMessage.HIGH_SEVERITY;
-			case IStatus.WARNING:
-				return IMessage.NORMAL_SEVERITY;
-			case IStatus.INFO:
-				return IMessage.LOW_SEVERITY;
-		}
-		return IMessage.NORMAL_SEVERITY;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.sse.ui.internal.reconcile.validator.ISourceValidator#connect(org.eclipse.jface.text.IDocument)
-	 */
-	public void connect(IDocument document) {
-		fDocument = document;
-		containmentValidationCount = 0; // ensure is zeroed before we start
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.sse.ui.internal.reconcile.validator.ISourceValidator#disconnect(org.eclipse.jface.text.IDocument)
-	 */
-	public void disconnect(IDocument document) {
-		containmentValidationCount = 0; // ensure is zeroed when we are finished
-	}
-	
-	private String addDebugSpacer(int count){
-		String TAB = "\t";
-		StringBuffer ret = new StringBuffer("");
-		for(int i=0;i<=count;i++){
-			ret.append(TAB);
-		}
-		return ret.toString();
-	}
-
-    /**
-     * @param isIncremental -- true if this is "as-you-type" validation, false
-     * if this is "Build" or "Run Validation" validation
-     * @return true if user preferences say we should do EL validation,
-     * false otherwise
-     */
-    private boolean checkShouldValidateEL(ValidationPreferences prefs, boolean isIncremental)
-    {
-        prefs.load();
-        if (isIncremental)
-        {
-            return prefs.getElPrefs().isEnableIncrementalValidation();
-        }
-
-        return prefs.getElPrefs().isEnableBuildValidation();
-    }
-    
-    private void validateContainment(Element node, String uri, String tagName, IReporter reporter, IFile file, IStructuredDocumentContext context)
-    {
-    	// don't validate JSP fragments since the necessary containment may existing
-    	// in the JSP files that include them
-    	// also only validate the first instance of containment violation in a file
-    	if (JSPUtil.isJSPFragment(file) || containmentValidationCount > 0)
-    	{
-    		return;
-    	}
-    	
-        final ITaglibDomainMetaDataModelContext modelContext = 
-            TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(file.getProject(), uri);
-        final Entity entity = 
-        	TaglibDomainMetaDataQueryHelper.getEntity(modelContext, tagName);
-        if (entity != null)
-        {
-            final Trait trait = 
-            	TaglibDomainMetaDataQueryHelper.getTrait
-                    (entity, "containment-constraint");
-            
-            if (trait != null)
-            {
-                final ContainsTagConstraint tagConstraint = 
-                    (ContainsTagConstraint) trait.getValue();
-
-                final String algorithm = tagConstraint.getSetGenerator().getAlgorithm();
-                
-                // TODO: need generalized factory mechanism for registering and constructing
-                // algorithms.
-                if (!"xpath".equals(algorithm))
-                {
-                    return;
-                }
-                
-                final String expr = tagConstraint.getSetGenerator().getExpression();
-                
-                // TODO: optimize on the expression and cache for reuse
-                final XPathMatchingAlgorithm  xpathAlg = 
-                    new XPathMatchingAlgorithm(expr);
-                
-                AxiomaticSet set = null;
-                
-                try
-                {
-                    set = xpathAlg.evaluate(node);
-                    // map dom nodes to tag identifiers
-                    set = elem2TagIdMapper.map(set);
-                }
-                catch(InvalidExpressionException  e)
-                {
-                    JSFCorePlugin.log(e, "Problem with expression: "+expr+" on node "+node);
-                    return;
-                }
-                catch (EvaluationException  e)
-                {
-                    JSFCorePlugin.log(e, "Problem evaluating expression: "+expr+" on node "+node);
-                    return;
-                }
-
-                final TagSet constraintData = tagConstraint.getSatisfiesSet();
-                final AxiomaticSet constraintSet = new ConcreteAxiomaticSet();
-                for (final Iterator it = constraintData.getTags().iterator(); it.hasNext();)
-                {
-                    final TagId tagId = (TagId) it.next();
-                    constraintSet.add(TagIdentifierFactory.createJSPTagWrapper(tagId.getUri(), tagId.getName()));
-                }
-                final MemberConstraint memberConstraint = new MemberConstraint(constraintSet);
-                final Diagnostic diag = memberConstraint.isSatisfied(set);
-
-                if (diag.getSeverity() != Diagnostic.OK)
-                {
-                	containmentValidationCount++; // found a violation
-                	
-                    final String messagePattern = "Tag {0} is missing required parent tag \"{1}\" ({2})";
-
-                    List data = diag.getData();
-
-                    for (Iterator it = data.iterator(); it.hasNext();)
-                    {
-                        TagIdentifier missingParent = (TagIdentifier) it.next();
-
-                        IMessage message =
-                            createTagValidationMessage(context, node.getNodeName(), 
-                                IMessage.NORMAL_SEVERITY, 
-                                MessageFormat.format(messagePattern, new Object[]{node.getNodeName(), missingParent.getTagName(), missingParent.getUri()})
-                                , file);
-                        reportFinding(reporter, message);
-                    }
-                }
-            }
-        }
-    }
-    
-    /**
-     * @return the test interface
-     */
-    public IJSPSemanticValidatorTest getTestInterface()
-    {
-    	return new IJSPSemanticValidatorTest()
-    	{
-			public void validateContainment(Element node, String uri,
-					String tagName, IReporter reporter, IFile file,
-					IStructuredDocumentContext context) {
-				
-				JSPSemanticsValidator.this.validateContainment(node, uri, tagName, reporter, file, context);
-			}
-    	};
-    }
-    
-    // TODO: need a diagnostic factory
-    private IMessage createTagValidationMessage(IStructuredDocumentContext context, String attributeValue, int severity, String msg, IFile file)
-    {
-        IMessage message = new LocalizedMessage(severity, msg, file);                       
-        final int start = context.getDocumentPosition();
-        final int length = attributeValue.length();
-        
-        message.setOffset(start);
-        message.setLength(length);
-        return message;
-    }
-    
-    private void reportFinding(IReporter reporter, IMessage message)
-    {
-        if ((message.getSeverity() & IMessage.ALL_MESSAGES) != 0)
-        {
-            reporter.addMessage(this, message);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/ValidationPreferences.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/ValidationPreferences.java
deleted file mode 100644
index 9b00a3a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/ValidationPreferences.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.validation.internal;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * @author cbateman
- *
- */
-public class ValidationPreferences 
-{
-    private final IPreferenceStore          _prefStore;
-    private final ELValidationPreferences   _elPrefs;
-    
-    /**
-     * Constructor
-     * @param prefStore 
-     */
-    public ValidationPreferences(IPreferenceStore  prefStore)
-    {
-        _prefStore = prefStore;
-        _elPrefs = new ELValidationPreferences();
-    }
-
-    /**
-     * @return the el preferences
-     */
-    public ELValidationPreferences getElPrefs() 
-    {
-        return _elPrefs;
-    }
-
-    /**IPreferenceStore
-     * The default preference loader
-     */
-    public void load()
-    {
-        load(_prefStore);
-    }
-    
-    /**
-     * Loads preferences from prefStore
-     * 
-     * @param prefStore
-     */
-    private void load(IPreferenceStore prefStore)
-    {
-        _elPrefs.load(prefStore);
-    }
-
-    /**
-     * Commits but does not store the preferences
-     * 
-     * @param prefStore
-     */
-    public void commit(IPreferenceStore prefStore)
-    {
-        _elPrefs.commit(prefStore);
-    }
-    
-    /**
-     * Reverts the model to it's defaults.  Does not commit to pref store.
-     */
-    public void setDefaults()
-    {
-        _elPrefs.setDefaults();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/AppConfigValidationUtil.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/AppConfigValidationUtil.java
deleted file mode 100644
index 6746274..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/AppConfigValidationUtil.java
+++ /dev/null
@@ -1,441 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.io.StringReader;
-import java.util.Iterator;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-import org.eclipse.jst.jsp.core.internal.java.jspel.JSPELParser;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ParseException;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-import org.eclipse.wst.xml.core.internal.emf2xml.EMF2DOMSSEAdapter;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Node;
-
-/**
- * Common functions for app config validation
- * 
- * @author cbateman
- *
- */
-public final class AppConfigValidationUtil 
-{
-    /**
-     * Per the fully-qualified-classType in the Faces 1.2 schema and
-     * the ClassName entity in the 1.1 DTD
-     * 
-     * @param fullyQualifiedName
-     * @param instanceOf 
-     * @param project 
-     * @return null if no problems or a Message if problem found
-     */
-    public static IMessage validateClassName(final String fullyQualifiedName, 
-                                             final String instanceOf,
-                                             final IProject project)
-    {
-        try
-        {
-            IType type = getType(project, fullyQualifiedName);
-            if (type == null)
-            {
-                return DiagnosticFactory
-                        .create_CANNOT_FIND_CLASS_NAME(fullyQualifiedName);
-            }
-            
-            // must be a class, not an interface or enum
-            if (!type.isClass())
-            {
-                return DiagnosticFactory
-                        .create_FULLY_QUALIFIED_NAME_MUST_BE_A_CLASS
-                            (fullyQualifiedName);
-            }
-            
-            // must not be abstract since it must instantiable
-            if (Flags.isAbstract(type.getFlags()))
-            {
-                return DiagnosticFactory
-                        .create_CLASS_MUST_BE_CONCRETE(fullyQualifiedName);
-            }
-
-            if (instanceOf != null)
-            {
-                if (!isInstanceOf(type, instanceOf))
-                {
-                    // if we get to here, we haven't found the expected
-                    // the super type so error
-                    return DiagnosticFactory.create_CLASS_MUST_BE_INSTANCE_OF
-                        (fullyQualifiedName, Messages.AppConfigValidationUtil_0, instanceOf);
-                }
-            }
-        }
-        catch(JavaModelException jme)
-        {
-            // fall-through, not found
-            JSFCorePlugin.log(jme, 
-                "Error resolving fully qualified class name: "+fullyQualifiedName); //$NON-NLS-1$
-        }
-
-        // either found the class or had an exception so don't report error
-        return null;
-    }
-    
-    private static IType getType(final IProject project,
-                        final String fullyQualifiedName) throws JavaModelException
-    {
-        final IJavaProject javaProject = JavaCore.create(project);
-        return javaProject.findType(fullyQualifiedName);
-    }
-    
-    /**
-     * Per the faces-config-el-expressionType in the Faces 1.2 schema and
-     * the Action entity in the 1.1 DTD
-     * 
-     * @param textContent
-     * @return an validation diagnostic or null if the textContent
-     * represent an expected EL expression
-     */
-    public static IMessage validateELExpression(final String textContent)
-    {
-        final ELResultWrapper result = extractELExpression(textContent);
-        
-        if (result.elText != null)
-        {
-             JSPELParser parser = new JSPELParser(new StringReader(result.elText));
-            
-            try {
-                parser.Expression();
-            } catch (ParseException e) {
-                // syntax error
-                return DiagnosticFactory.create_SYNTAX_ERROR_IN_EL();
-            }
-            
-            return null;
-        }
-        
-        return result.message;
-    }
-
-    /**
-     * @param textContent
-     * @return the result of trying to extract an EL  expression from the
-     * textContent string.  The content is expected to be of the form
-     * #{elText}.  elText in the return value will be set to this value
-     * from within the braces.  If a syntax error occurs in this extraction
-     * message property of the result object will contain a validation message
-     * and elText will be set to null.
-     */
-    public static ELResultWrapper extractELExpression(final String textContent)
-    {
-        final String elRegex = "#\\{(.*)\\}"; //$NON-NLS-1$
-        Pattern pattern = Pattern.compile(elRegex);
-        Matcher matcher = pattern.matcher(textContent.trim());
-        if (matcher.matches())
-        {
-           final String elText = matcher.group(1).trim();
-            
-            if ("".equals(elText) || elText == null) //$NON-NLS-1$
-            {
-                return new ELResultWrapper(DiagnosticFactory.create_SYNTAX_ERROR_IN_EL(), null);
-            }
-            return new ELResultWrapper(null, elText);
-        }
-        return new ELResultWrapper(DiagnosticFactory.create_EL_EXPR_MUST_BE_IN_HASH_BRACES(), null);
-    }
-
-    /**
-     * Value object that wraps the result of trying
-     * to extract an EL expression from an arbitrary String
-     */
-    public static class ELResultWrapper
-    {
-        private final IMessage    message;
-        private final String      elText;
-        
-        ELResultWrapper(IMessage message, String elText) {
-            super();
-            this.message = message;
-            this.elText = elText;
-        }
-
-        /**
-         * @return a message indicating a problem encountered
-         * trying to extract, or null if no problem was encountered
-         */
-        public IMessage getMessage() {
-            return message;
-        }
-
-        /**
-         * @return the el expression string raw, stripped of any
-         * sorrounding #{} syntax or null if could not be extracted
-         */
-        public String getElText() {
-            return elText;
-        }
-    }
-    
-    /**
-     * @param eObj
-     * @return the offset character offset in to the XML document of the
-     * XML node that eObj was constructed from or -1 if not 
-     * computable
-     */
-    public static int getStartOffset(EObject eObj)
-    {
-        IDOMNode node = getDomNode(eObj);
-        
-        if (node != null)
-        {
-            return node.getStartStructuredDocumentRegion().getStartOffset();
-        }
-        
-        return -1;
-    }
-
-    /**
-     * @param eObj
-     * @return the length in characters of the XML node that
-     * eObj was constructed from or -1 if no computable
-     */
-    public static int getLength(EObject eObj)
-    {
-        IDOMNode node = getDomNode(eObj);
-        
-        if (node != null)
-        {
-            return node.getEndStructuredDocumentRegion().getEndOffset()
-                      - node.getStartStructuredDocumentRegion().getStartOffset();
-        }
-        
-        return -1;
-    }
-    
-    /**
-     * @param eObj
-     * @return the DOM node that eObj was constructed from or
-     * null if not computable
-     */
-    public static IDOMNode getDomNode(EObject eObj)
-    {
-        for (Iterator it = eObj.eAdapters().iterator(); it.hasNext();)
-        {
-            Adapter adapter = (Adapter) it.next();
-            
-            if (adapter instanceof EMF2DOMSSEAdapter)
-            {
-                final EMF2DOMSSEAdapter sseAdapter = (EMF2DOMSSEAdapter) adapter;
-                final Node node = sseAdapter.getNode();
-                if (node instanceof IDOMNode)
-                {
-                    return (IDOMNode) node;
-                }
-            }
-        }
-        
-        return null;
-    }
-    
-    /**
-     * @param scope
-     * @return an error message if scope does not match a valid
-     * scope enum.
-     */
-    public static IMessage validateManagedBeanScope(ManagedBeanScopeType scope)
-    {
-        // scope must be one of a few enums
-        if (!"request".equals(scope.getTextContent()) //$NON-NLS-1$
-                && !"session".equals(scope.getTextContent()) //$NON-NLS-1$
-                && !"application".equals(scope.getTextContent()) //$NON-NLS-1$
-                && !"none".equals(scope.getTextContent())) //$NON-NLS-1$
-        {
-            return DiagnosticFactory.create_BEAN_SCOPE_NOT_VALID();
-        }
-        
-        return null;
-    }
-
-    /**
-     * @param targetName 
-     * @param targetType the type of the object that mapEntries will be assigned to
-     * @param mapEntries
-     * @param project
-     * @return null if okay or an error message if the mapEntries type is 
-     * invalid in some way
-     * Note: when Java 1.5 support is added we can validate against the template types
-     */
-    public static IMessage validateMapEntries(String targetName, String targetType, MapEntriesType mapEntries, IProject project)
-    {
-        if (mapEntries == null || targetType == null || project == null)
-        {
-            throw new AssertionError("Arguments to validateMapEntries can't be null"); //$NON-NLS-1$
-        }
-        
-        try
-        {
-            // TODO: do a bean look-up for targetName to verify that it a) matches the type
-            // and b) exists on the bean
-            IType type = getType(project, targetType);
-            
-            if (type != null &&
-                    !(isInstanceOf(type, Signature.toString(TypeConstants.TYPE_MAP))))
-            {
-                return DiagnosticFactory
-                    .create_MAP_ENTRIES_CAN_ONLY_BE_SET_ON_MAP_TYPE(targetName);
-            }
-            // TODO: validate the the map entries
-            // TODO: validate the types of the map entries against the values present
-            // TODO: validate the map key and value types against the template
-        }
-        catch (JavaModelException jme)
-        {
-            JSFCorePlugin.log(new Exception(jme), "Exception while validating mapEntries"); //$NON-NLS-1$
-        }
-        // if we get to here, we have not found anything meaningful to report
-        return null;
-    }
-    
-    /**
-     * @param targetName 
-     * @param targetType the type of the object that mapEntries will be assigned to
-     * @param listEntries
-     * @param project
-     * @return null if okay or an error message if the listEntries type is 
-     * invalid in some way
-     * Note: when Java 1.5 support is added we can validate against the template types
-     */
-    public static IMessage validateListEntries(String targetName, String targetType, ListEntriesType listEntries, IProject project)
-    {
-        if (listEntries == null || targetType == null || project == null)
-        {
-            throw new AssertionError("Arguments to validateMapEntries can't be null"); //$NON-NLS-1$
-        }
-        
-        try
-        {
-            IType type = getType(project, targetType);
-            // TODO: do a bean look-up for targetName to verify that it a) matches the type
-            // and b) exists on the bean
-            if (type != null &&
-                    !(isInstanceOf(type, Signature.toString(TypeConstants.TYPE_LIST))))
-            {
-                return DiagnosticFactory
-                    .create_LIST_ENTRIES_CAN_ONLY_BE_SET_ON_LIST_TYPE(targetName);
-            }
-            // TODO: validate the the list entries
-            // TODO: validate the types of the list entries against the values present
-            // TODO: validate the value types against the template
-        }
-        catch (JavaModelException jme)
-        {
-            JSFCorePlugin.log(new Exception(jme), "Exception while validating mapEntries"); //$NON-NLS-1$
-        }
-        // if we get to here, we have not found anything meaningful to report
-        return null;
-    }
-    
-    /**
-     * @param localeType
-     * @return a diagnostic if 'localeType' does not match the
-     * expected format or null if all is clear
-     */
-    public static IMessage validateLocaleType(final String localeType)
-    {
-        // based on the localeType in the Faces 1.2 schema.  This is safe
-        // to apply to 1.1 since it expects the same pattern even though 
-        // the DTD cannot validate it
-        final String localeTypePattern = "[a-z]{2}(_|-)?([\\p{L}\\-\\p{Nd}]{2})?"; //$NON-NLS-1$
-        final Matcher matcher = Pattern.compile(localeTypePattern).matcher(localeType);
-        
-        if (!matcher.matches())
-        {
-            return DiagnosticFactory.create_LOCALE_FORMAT_NOT_VALID();
-        }
-        
-        return null;
-    }
-    
-    /**
-     * @param type
-     * @param instanceOf
-     * @return true if type instanceof instanceOf is true
-     * 
-     * @throws JavaModelException
-     */
-    public static boolean isInstanceOf(final IType type, final String instanceOf) throws JavaModelException
-    {
-        if (instanceOf != null)
-        {
-            // must have either a no-arg constructor or an adapter constructor
-            // that is of the type of instanceOf
-//            IType  constructorParam = getType(project, instanceOf);
-//            if (constructorParam != null)
-//            {
-//                final String constructorMethodName = 
-//                    type.getElementName();
-//                final IMethod defaultConstructor = 
-//                    type.getMethod(constructorMethodName, new String[0]);
-//                final IMethod adapterConstructor =
-//                    type.getMethod(constructorMethodName, new String[]{instanceOf});
-//                final boolean isDefaultConstructor =
-//                    defaultConstructor != null && defaultConstructor.isConstructor();
-//                final boolean isAdapterConstructor =
-//                    adapterConstructor != null && adapterConstructor.isConstructor();
-//                if (!isDefaultConstructor && !isAdapterConstructor)
-//                {
-                    // TODO: no constructor == default constructor...
-//                }
-//            }
-
-            // if the type is an exact match
-            if (instanceOf.equals(type.getFullyQualifiedName()))
-            {
-                return true;
-            }
-
-            final ITypeHierarchy typeHierarchy = 
-                type.newSupertypeHierarchy(new NullProgressMonitor());
-            
-            final IType[] supers = typeHierarchy.getAllSupertypes(type);
-            for (int i = 0; i < supers.length; i++)
-            {
-                if (instanceOf.equals(supers[i].getFullyQualifiedName()))
-                {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-    
-    private AppConfigValidationUtil()
-    {
-        // no external construction
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/AppConfigValidator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/AppConfigValidator.java
deleted file mode 100644
index 0ae9104..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/AppConfigValidator.java
+++ /dev/null
@@ -1,363 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.jst.jsf.core.IJSFCoreConstants;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.util.FacesConfigArtifactEdit;
-import org.eclipse.jst.jsp.core.internal.Logger;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-import org.eclipse.wst.validation.internal.core.ValidationException;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-import org.eclipse.wst.validation.internal.provisional.core.IReporter;
-import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
-import org.eclipse.wst.validation.internal.provisional.core.IValidatorJob;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.DocumentType;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/** 
- * General build-time validator for the JSF application configuration file  (faces-config.xml)b
- *
- * @author cbateman
- *
- */
-public class AppConfigValidator implements IValidatorJob {
-
-    public ISchedulingRule getSchedulingRule(IValidationContext helper) {
-        // no scheduling rule
-        return null;
-    }
-
-    public IStatus validateInJob(IValidationContext helper, IReporter reporter)
-            throws ValidationException {
-        IStatus status = Status.OK_STATUS;
-        try {
-            validate(helper, reporter);
-        }
-        catch (ValidationException e) {
-            Logger.logException(e);
-            status = new Status(IStatus.ERROR, JSFCorePlugin.getDefault().getPluginID(), IStatus.ERROR, e.getLocalizedMessage(), e);
-        }
-        return status;
-    }
-
-    public void cleanup(IReporter reporter) {
-        // no cleanup
-
-    }
-
-    public void validate(IValidationContext helper, IReporter reporter)
-            throws ValidationException 
-    {
-        String[] uris = helper.getURIs();
-        IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
-        if (uris.length > 0) {
-            IFile currentFile = null;
-
-            for (int i = 0; i < uris.length && !reporter.isCancelled(); i++) {
-                currentFile = wsRoot.getFile(new Path(uris[i]));
-                if (currentFile != null && currentFile.exists()) {
-//                    if (shouldValidate(currentFile) && fragmentCheck(currentFile)) {
-
-//                        int percent = (i * 100) / uris.length + 1;
-//Message message = new LocalizedMessage(IMessage.LOW_SEVERITY, percent + "% " + uris[i]);
-  //                      reporter.displaySubtask(this, message);
-
-                        validateFile(currentFile, reporter);
-                }
-            }
-        }
-        
-        // copied from JSPValidator TODO: perhaps just use app config locator?
-//        else {
-//
-//            // if uris[] length 0 -> validate() gets called for each project
-//            if (helper instanceof IWorkbenchContext) {
-//
-//                IProject project = ((IWorkbenchContext) helper).getProject();
-//                JSPFileVisitor visitor = new JSPFileVisitor(reporter);
-//                try {
-//                    // collect all jsp files for the project
-//                    project.accept(visitor, IResource.DEPTH_INFINITE);
-//                }
-//                catch (CoreException e) {
-//                    if (DEBUG)
-//                        e.printStackTrace();
-//                }
-//                IFile[] files = visitor.getFiles();
-//                for (int i = 0; i < files.length && !reporter.isCancelled(); i++) {
-//                    if (shouldValidate(files[i]) && fragmentCheck(files[i])) {
-//                        int percent = (i * 100) / files.length + 1;
-//                        Message message = new LocalizedMessage(IMessage.LOW_SEVERITY, percent + "% " + files[i].getFullPath().toString());
-//                        reporter.displaySubtask(this, message);
-//
-//                        validateFile(files[i], reporter);
-//                    }
-//                    if (DEBUG)
-//                        System.out.println("validating: [" + files[i] + "]"); //$NON-NLS-1$ //$NON-NLS-2$
-//                }
-//            }
-//        }
-    }
-
-    private void validateFile(IFile file, IReporter reporter)
-    {
-        FacesConfigArtifactEdit  facesConfigEdit = null;
-        
-        try
-        {
-            IPath path = JSFAppConfigUtils.getWebContentFolderRelativePath(file);
-            facesConfigEdit = FacesConfigArtifactEdit.
-                getFacesConfigArtifactEditForRead(file.getProject(), path.toString());
-            
-            if (facesConfigEdit != null
-                    && facesConfigEdit.getFacesConfig()!=null)
-            {
-                String version = validateVersioning(file, facesConfigEdit, reporter);
-                validateModel(file, facesConfigEdit,reporter, version);
-            }
-        }
-        finally
-        {
-            if (facesConfigEdit != null)
-            {
-                facesConfigEdit.dispose();
-            }
-        }
-    }
-    
-    /**
-     * Ensure that the expected project version (facet) jives with what is in
-     * the faces-config.  Generally this means:
-     * 
-     * if (version == 1.1) then no 1.2 artifacts (error)
-     * if (version == 1.2) then warn if using old artifacts (warning)
-     */
-    private String validateVersioning(IFile file, FacesConfigArtifactEdit facesConfigEdit, IReporter reporter)
-    {
-        final String appConfigFileVersion = getAppConfigFileVersion(facesConfigEdit);
-        
-        if (appConfigFileVersion != null)
-        {
-            final String projectVersion = getJSFVersion(file.getProject());
-            
-            if (IJSFCoreConstants.FACET_VERSION_1_1.equals(projectVersion)
-                    || IJSFCoreConstants.FACET_VERSION_1_0.equals(projectVersion))
-            {
-                if (IJSFCoreConstants.FACET_VERSION_1_2.equals(appConfigFileVersion))
-                {
-                    reporter.addMessage(this, 
-                        DiagnosticFactory
-                            .create_APP_CONFIG_IS_NEWER_THAN_JSF_VERSION(file));
-                }
-            }
-            else if (IJSFCoreConstants.FACET_VERSION_1_2.equals(projectVersion))
-            {
-                if (IJSFCoreConstants.FACET_VERSION_1_1.equals(appConfigFileVersion) 
-                        || IJSFCoreConstants.FACET_VERSION_1_0.equals(appConfigFileVersion))
-                {
-                    reporter.addMessage(this, 
-                        DiagnosticFactory
-                            .create_APP_CONFIG_IS_OLDER_THAN_JSF_VERSION(file
-                                    , appConfigFileVersion, projectVersion));
-                }
-            }
-            // if no exact match, don't make any assumptions
-        }
-        return appConfigFileVersion;
-    }
-    
-    /**
-     * @param facesConfigEdit
-     * @return the version of the app config file or null if not determinant
-     */
-    private String getAppConfigFileVersion(FacesConfigArtifactEdit facesConfigEdit)
-    {
-        String appConfigVersion = null;
-        
-        final IDOMModel domModel = facesConfigEdit.getIDOMModel();
-        final IDOMDocument document = domModel.getDocument();
-        if (document == null) {return null;}
-        
-        final DocumentType docType = domModel.getDocument().getDoctype();
-        
-        // if we have DTD doctype then we're looking at 1.1 or before
-        if (docType != null)
-        {
-            appConfigVersion = extractVersionFromPublicId(docType);
-            // if not found in the public id, try the system id
-            if (appConfigVersion == null)
-            {
-                appConfigVersion = extractVersionFromSystemId(docType);
-            }
-        }
-        else
-        {
-            NodeList rootNodes = domModel.getDocument().getChildNodes();
-            
-            for (int i = 0; i < rootNodes.getLength(); i++)
-            {
-                Node node = rootNodes.item(i);
-                if (node.getNodeType() == Node.ELEMENT_NODE
-                        && "faces-config".equals(node.getLocalName()))
-                {
-                    NamedNodeMap map = node.getAttributes();
-                    // the most accurate thing is the version
-                    Node versionAttrib = map.getNamedItem("version");
-                    
-                    if (versionAttrib != null)
-                    {
-                        appConfigVersion = versionAttrib.getNodeValue();
-                        break;
-                    }
-                    
-                    // TODO: add additional heuristic to parse out
-                    // the schema
-                }
-            }
-        }
-        
-        return appConfigVersion;
-    }
-    
-
-
-    private void validateModel(final IFile file, 
-                               final FacesConfigArtifactEdit facesConfigEdit, 
-                               final IReporter reporter,
-                               final String version)
-    {
-        final FacesConfigType facesConfigType = facesConfigEdit.getFacesConfig();
-        FacesConfigValidator validator = new FacesConfigValidator(version);
-        List messages = new ArrayList();
-        validator.validate(facesConfigType, messages, file);
-        
-        for (final Iterator it = messages.iterator(); it.hasNext();)
-        {
-            IMessage message = (IMessage) it.next();
-            reporter.addMessage(this, message);
-        }
-    }
-    
-    /**
-     * @param project
-     * @return the version string for the JSF facet on project
-     * or null if not found
-     */
-    private String getJSFVersion(final IProject project)
-    {
-        try
-        {
-            final IFacetedProject facetedProject = ProjectFacetsManager.create(project);
-            Set facets = facetedProject.getProjectFacets();
-            
-            for (final Iterator it = facets.iterator(); it.hasNext();)
-            {
-                IProjectFacetVersion  facetVersion = 
-                    (IProjectFacetVersion) it.next();
-                
-                if (IJSFCoreConstants.JSF_CORE_FACET_ID.equals(facetVersion.getProjectFacet().getId()))
-                {
-                    return facetVersion.getVersionString();
-                }
-            }
-        }
-        catch (CoreException ce)
-        {
-            JSFCorePlugin.log(ce, "Problem loading faceted project");
-            // fall-through and return null
-        }
-        return null;
-    }
-    
-    private String extractVersionFromPublicId(DocumentType docType)
-    {
-        final String publicId = docType.getPublicId();
-        final String publicIdRegex = "-\\/\\/(.*)\\/\\/(.*)\\/\\/.*";
-
-        if (publicId != null)
-        {
-            final Pattern pattern = Pattern.compile(publicIdRegex);
-            Matcher matcher = pattern.matcher(publicId);
-
-            if (matcher.matches())
-            {
-                final String classTypeString = matcher.group(2);
-                final String[] classTypes = classTypeString.split("\\s+");
-                
-                // verify that the class type is a DTD
-                if (classTypes.length > 0
-                        && "DTD".equals(classTypes[0]))
-                {
-                    // either 1.0 or 1.1; be most conservative
-                    String appConfigVersion = IJSFCoreConstants.JSF_VERSION_1_0;
-                   
-                    // see if the version is in the public id
-                    if (IJSFCoreConstants.JSF_VERSION_1_1.equals(classTypes[classTypes.length-1]))
-                    {
-                        appConfigVersion = IJSFCoreConstants.FACET_VERSION_1_1;
-                    }
-                    
-                    return appConfigVersion;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    private String extractVersionFromSystemId(DocumentType docType) 
-    {
-        final String systemId = docType.getSystemId();
-        final String systemIdRegEx = "http:\\/\\/java.sun.com\\/dtd\\/web-facesconfig_(.*)\\.dtd";
-        if (systemId != null)
-        {
-            final Pattern pattern = Pattern.compile(systemIdRegEx);
-            Matcher matcher = pattern.matcher(systemId);
-
-            if (matcher.matches())
-            {
-                final String version = matcher.group(1);
-                if ("1_1".equals(version)||"1_0".equals(version))
-                {
-                    return version.replaceAll("_", ".");
-                }
-            }
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ApplicationValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ApplicationValidationVisitor.java
deleted file mode 100644
index 2c2bd31..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ApplicationValidationVisitor.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.core.IJSFCoreConstants;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType;
-
-/**
- * Validator the <application> node of the app config model
- * @author cbateman
- *
- */
-public class ApplicationValidationVisitor extends EObjectValidationVisitor 
-{
-
-    /**
-     * Default constructure
-     * @param version 
-     */
-    public ApplicationValidationVisitor(String version) 
-    {
-        super(FacesConfigPackage.eINSTANCE.getFacesConfigType_Application(), version);
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) {
-        // nothing to validate
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() {
-        return new EObjectValidationVisitor[]
-        {
-            // TODO: validate message and resource bundles
-            // TODO: validate default render kit id
-            new ActionListenerValidationVisitor(getVersion()),
-            new NavigationHandlerValidationVisitor(getVersion()),
-            new ViewHandlerValidationVisitor(getVersion()),
-            new StateManagerValidationVisitior(getVersion()),
-            new PropertyResolverValidationVisitor(getVersion()),
-            new VariableResolverValidationVisitor(getVersion()),
-            new ELResolverValidationVisitor(getVersion()),
-            new LocaleConfigValidationVisitor(getVersion())
-        };
-    }
-    
-    /**
-     * @param facesConfig
-     * @param messages
-     * @param file
-     */
-    protected void validateManagedBeanNames(FacesConfigType facesConfig, List messages, IFile file)
-    {
-//        final Map  foundBeans = new HashMap();
-//        final List firstCollisionInstance = new ArrayList();
-//        
-//        for (final Iterator it = facesConfig.getManagedBean().iterator(); it.hasNext();)
-//        {
-//            final ManagedBeanType managedBean = (ManagedBeanType) it.next();
-//            
-//            if (managedBean.getManagedBeanName() == null
-//                    || managedBean.getManagedBeanName().getTextContent() == null
-//                    || "".equals(managedBean.getManagedBeanName().getTextContent()))
-//            {
-//                
-//            }
-            
-//            if (!foundBeans.containsKey(managedBean.getManagedBeanName()))
-//        }
-    }
-    
-    private static class LocaleConfigValidationVisitor extends EObjectValidationVisitor
-    {
-        /**
-         * @param version
-         */
-        public LocaleConfigValidationVisitor(String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getApplicationType_LocaleConfig()
-                    , version);
-        }
-
-        protected void doValidate(EObject object, List messages, IFile file) 
-        {
-            final LocaleConfigType localeConfig = (LocaleConfigType) object;
-
-            DefaultLocaleType defaultLocale = localeConfig.getDefaultLocale();
-
-            if (defaultLocale != null)
-            {
-                addMessageInfo(
-                    messages,
-                    AppConfigValidationUtil
-                        .validateLocaleType(defaultLocale.getTextContent())
-                        , defaultLocale, file);
-            }
-            
-            for (final Iterator it = localeConfig.getSupportedLocale().iterator(); it.hasNext();)
-            {
-                final SupportedLocaleType supportedLocale =
-                    (SupportedLocaleType) it.next();
-                addMessageInfo(
-                    messages,
-                    AppConfigValidationUtil
-                        .validateLocaleType(supportedLocale.getTextContent())
-                        , supportedLocale, file);
-            }
-            
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            // there are children, but we're going to validate in doValidate
-            return NO_CHILDREN;
-        }
-        
-    }
-    
-    private static class ActionListenerValidationVisitor extends ApplicationClassNameBasedValidationVisitor
-    {
-        /**
-         * @param version 
-         */
-        public ActionListenerValidationVisitor(final String version) {
-            super(FacesConfigPackage.eINSTANCE.getApplicationType_ActionListener(),
-                    version,"javax.faces.event.ActionListener");
-        }
-    }
-    
-    private static class NavigationHandlerValidationVisitor extends ApplicationClassNameBasedValidationVisitor
-    {
-        /**
-         * @param version 
-         */
-        public NavigationHandlerValidationVisitor(final String version) {
-            super(FacesConfigPackage.eINSTANCE.getApplicationType_NavigationHandler(),
-                    version,"javax.faces.application.NavigationHandler");
-        }
-    }
-    
-    private static class ViewHandlerValidationVisitor extends ApplicationClassNameBasedValidationVisitor
-    {
-        ViewHandlerValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getApplicationType_ViewHandler(),
-                    version,"javax.faces.application.ViewHandler");
-        }
-    }
-    
-    private static class StateManagerValidationVisitior extends ApplicationClassNameBasedValidationVisitor
-    {
-        StateManagerValidationVisitior(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getApplicationType_StateManager(),
-                    version,"javax.faces.application.StateManager");
-        }    
-    }
-    
-    private static class PropertyResolverValidationVisitor extends ApplicationClassNameBasedValidationVisitor
-    {
-        PropertyResolverValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getApplicationType_PropertyResolver(),
-                    version,"javax.faces.el.PropertyResolver");
-        }
-
-        protected void doValidate(EObject object, List messages, IFile file) {
-            super.doValidate(object, messages, file);
-            
-            // if this version greater than 1.1 then property resolvers are
-            // deprecated in favour of el-resolvers
-            final String version = getVersion();
-            if (!IJSFCoreConstants.FACET_VERSION_1_0.equals(version) && !IJSFCoreConstants.FACET_VERSION_1_1.equals(version))
-            {
-                addMessageInfo(messages, 
-                        DiagnosticFactory.create_API_DEPRECATED_AFTER_VERSION_ID
-                            ("property-resolver", IJSFCoreConstants.FACET_VERSION_1_1, "el-resolver")
-                        , object, file);
-            }
-        }
-    }
-
-    private static class VariableResolverValidationVisitor extends ApplicationClassNameBasedValidationVisitor
-    {
-        VariableResolverValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getApplicationType_VariableResolver(),
-                    version, "javax.faces.el.VariableResolver");
-        }
-
-        protected void doValidate(EObject object, List messages, IFile file) {
-            super.doValidate(object, messages, file);
-            // if this version greater than 1.1 then property resolvers are
-            // deprecated in favour of el-resolvers
-            final String version = getVersion();
-            if (!IJSFCoreConstants.JSF_VERSION_1_0.equals(version) && !IJSFCoreConstants.JSF_VERSION_1_1.equals(version))
-            {
-                addMessageInfo(messages, 
-                        DiagnosticFactory.create_API_DEPRECATED_AFTER_VERSION_ID
-                            ("variable-resolver", IJSFCoreConstants.JSF_VERSION_1_1, "el-resolver")
-                        , object, file);
-            }
-
-        }
-    }
-
-    private static class ELResolverValidationVisitor extends ApplicationClassNameBasedValidationVisitor
-    {
-        ELResolverValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getApplicationType_ELResolver(),
-                    version, "javax.el.ELResolver");
-        }
-
-        protected void doValidate(EObject object, List messages, IFile file) {
-            // if this version less than 1.2 then property resolvers are
-            // deprecated in favour of el-resolvers
-            final String version = getVersion();
-            if (IJSFCoreConstants.JSF_VERSION_1_0.equals(version) || IJSFCoreConstants.JSF_VERSION_1_1.equals(version))
-            {
-                addMessageInfo(messages, 
-                        DiagnosticFactory.create_API_NOT_AVAILABLE_BEFORE_VERSION
-                            ("el-resolver", IJSFCoreConstants.JSF_VERSION_1_2, "variable-resolver or property-resolver")
-                        , object, file);
-            }
-            else
-            {
-                super.doValidate(object, messages, file);
-            }
-        }
-    }
-    
-    private abstract static class ApplicationClassNameBasedValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        private final String _instanceOf;
-        
-        /**
-         * @param feature 
-         * @param version 
-         * @param instanceOf 
-         */
-        protected ApplicationClassNameBasedValidationVisitor(EStructuralFeature feature,
-                final String version, final String instanceOf) {
-            super(feature, version);
-            _instanceOf = instanceOf;
-        }
-
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            EStructuralFeature feature = eobj.eClass().getEStructuralFeature("textContent");
-            
-            if (feature != null)
-            {
-                return (String)eobj.eGet(feature);
-            }
-            
-            return null;
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            // no children
-            return NO_CHILDREN;
-        }
-
-        protected String getInstanceOf() {
-            return _instanceOf;
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/AttributeValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/AttributeValidationVisitor.java
deleted file mode 100644
index 291c802..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/AttributeValidationVisitor.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * Validates the <attribute> element of components, converters etc.
- * 
- * @author cbateman
- *
- */
-public class AttributeValidationVisitor extends EObjectValidationVisitor {
-
-    /**
-     * @param feature
-     * @param version
-     */
-    public AttributeValidationVisitor(EStructuralFeature feature, String version) {
-        // this validator can be attached to numerous parents so it
-        // cannot hard-code its feature
-        super(feature,version);
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) {
-        // nothing to do
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() {
-        return new EObjectValidationVisitor[]
-        {
-             new AttributeClassValidationVisitor(getVersion())
-        };
-    }
-
-    private static class AttributeClassValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        /**
-         * @param version
-         */
-        public AttributeClassValidationVisitor(
-                String version) {
-            super(FacesConfigPackage.eINSTANCE.getAttributeType_AttributeClass()
-                    , version);
-        }
-
-        protected String getFullyQualifiedName(EObject eobj) {
-            return ((AttributeClassType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            // null since there is no instance of enforcement here
-            return null;
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            return NO_CHILDREN;
-        }
-        
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ClassNameEObjectValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ClassNameEObjectValidationVisitor.java
deleted file mode 100644
index 3757298..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ClassNameEObjectValidationVisitor.java
+++ /dev/null
@@ -1,59 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Abstract validation visitor for classname based eobjects
- * 
- * @author cbateman
- *
- */
-public abstract class ClassNameEObjectValidationVisitor extends
-        EObjectValidationVisitor 
-{
-    /**
-     * @param structuralFeature
-     * @param version 
-     */
-    public ClassNameEObjectValidationVisitor(
-            EStructuralFeature structuralFeature, String version) {
-        super(structuralFeature, version);
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) 
-    {
-        String fullyQualifiedName = getFullyQualifiedName(object);
-        // protect against null
-        fullyQualifiedName = fullyQualifiedName == null ? "" : fullyQualifiedName;
-        addMessageInfo(messages,  
-            AppConfigValidationUtil
-                .validateClassName(fullyQualifiedName, getInstanceOf(), 
-                        file.getProject())
-                        ,object, file);
-    }
-
-    /**
-     * @param eobj
-     * @return the fully qualified name from the eobject
-     */
-    protected abstract String getFullyQualifiedName(EObject eobj);
-    
-    /**
-     * @return a fully-qualified 
-     */
-    protected abstract String getInstanceOf();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ComponentValidatorVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ComponentValidatorVisitor.java
deleted file mode 100644
index 0743670..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ComponentValidatorVisitor.java
+++ /dev/null
@@ -1,145 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetNameType;
-
-/**
- * Validator for a <component>
- * 
- * @author cbateman
- *
- */
-public class ComponentValidatorVisitor extends EObjectValidationVisitor 
-{
-    /**
-     * @param version
-     */
-    public ComponentValidatorVisitor(final String version)
-    {
-        super(FacesConfigPackage.eINSTANCE.getFacesConfigType_Component(),
-                version);
-    }
-    
-    protected void doValidate(EObject object, List messages, IFile file) {
-        // nothing in the tag to validate
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() {
-        return new EObjectValidationVisitor[]
-        {
-            new ComponentClassValidationVisitor(getVersion()),
-            new AttributeValidationVisitor(FacesConfigPackage.eINSTANCE.getComponentType_Attribute(), getVersion()),
-            new PropertyValidationVisitor
-                (FacesConfigPackage.eINSTANCE.getComponentType_Property()
-                ,FacesConfigPackage.eINSTANCE.getComponentType_ComponentClass()
-                ,getVersion()),
-            new ComponentFacetValidationVisitor(getVersion())
-        };
-    }
-
-    private static class ComponentClassValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        ComponentClassValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getComponentType_ComponentClass(),
-                    version);
-        }
-        
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((ComponentClassType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.component.UIComponent";
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            return NO_CHILDREN;
-        }
-    }
-    
-    private static class ComponentFacetValidationVisitor extends EObjectValidationVisitor
-    {
-        /**
-         * @param version
-         */
-        public ComponentFacetValidationVisitor(String version) 
-        {
-            super(FacesConfigPackage.eINSTANCE.getComponentType_Facet(), version);
-        }
-
-        protected void doValidate(EObject object, List messages, IFile file) {
-            // do nothing
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            return new EObjectValidationVisitor[]
-            {
-                    new FacetNameValidationVisitor(getVersion())
-            };
-        }
-        
-        private static class FacetNameValidationVisitor extends EObjectValidationVisitor
-        {
-            /**
-             * @param version
-             */
-            public FacetNameValidationVisitor(String version) {
-                super(FacesConfigPackage.eINSTANCE.getFacetType_FacetName(),
-                        version);
-            }
-
-            protected void doValidate(EObject object, List messages, IFile file) {
-                FacetNameType name = (FacetNameType) object;
-                boolean   isValid = false;
-                
-                if (name.getTextContent() != null
-                        || "".equals(name.getTextContent().trim()))
-                {
-                    String nameValue = name.getTextContent().trim();
-
-                    // TODO: isJavaIdentifierStart seems broken...
-                    if (Character.isJavaIdentifierStart(nameValue.charAt(0)));
-                    {
-                        isValid = true;
-                        for (int i = 1; i < nameValue.length(); i++)
-                        {
-                            if (!Character.isJavaIdentifierPart(nameValue.charAt(i)))
-                            {
-                                isValid = false;
-                            }
-                        }
-                    }
-                }
-                
-                if (!isValid)
-                {
-                    addMessageInfo(messages, 
-                            DiagnosticFactory.create_MUST_BE_A_VALID_JAVA_IDENT("Facet name")
-                            , object, file);
-                }
-            }
-
-            protected EObjectValidationVisitor[] getChildNodeValidators() {
-                return NO_CHILDREN;
-            }
-            
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ConverterValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ConverterValidationVisitor.java
deleted file mode 100644
index d46999c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ConverterValidationVisitor.java
+++ /dev/null
@@ -1,98 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * Validates the converter
- */
-public class ConverterValidationVisitor extends EObjectValidationVisitor
-{
-
-    /**
-     * @param version
-     */
-    public ConverterValidationVisitor(final String version)
-    {
-        super(FacesConfigPackage.eINSTANCE.getFacesConfigType_Converter(),
-                version);
-    }
-    
-    protected void doValidate(EObject object, List messages, IFile file) {
-        // nothing in the tag to validate
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() {
-        return new EObjectValidationVisitor[]
-        {
-            new ConverterClassValidationVisitor(getVersion())
-            , new AttributeValidationVisitor(FacesConfigPackage.eINSTANCE.getConverterType_Attribute(), getVersion())
-            , new PropertyValidationVisitor
-                (FacesConfigPackage.eINSTANCE.getConverterType_Property()
-                ,FacesConfigPackage.eINSTANCE.getConverterType_ConverterClass()
-                ,getVersion())
-            , new ConverterForClassValidationVisitor(getVersion())
-        };
-    }
-
-    private static class ConverterClassValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        ConverterClassValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getConverterType_ConverterClass(),
-                    version);
-        }
-        
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((ConverterClassType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.convert.Converter";
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            return NO_CHILDREN;
-        }
-    }
-    
-    private static class ConverterForClassValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        ConverterForClassValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getConverterType_ConverterForClass(),
-                    version);
-        }
-        
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((ConverterForClassType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            // no instanceof enforcement
-            return null;
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            return NO_CHILDREN;
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/DiagnosticFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/DiagnosticFactory.java
deleted file mode 100644
index b614f9a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/DiagnosticFactory.java
+++ /dev/null
@@ -1,412 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.text.MessageFormat;
-import java.util.Locale;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.wst.validation.internal.core.Message;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-/**
- * Factory for constructing diagnostic objects for AppConfig file validation
- * 
- * @author cbateman
- *
- */
-public final class DiagnosticFactory 
-{
-    /**
-     * Problem id
-     */
-    public final static int EL_EXPR_MUST_BE_IN_HASH_BRACES_ID = 0;
-    
-    /**
-     * Problem id
-     */
-    public final static int SYNTAX_ERROR_IN_EL_ID = 1;
-    
-    /**
-     * Problem id
-     */
-    public final static int CANNOT_FIND_CLASS_NAME_ID = 2;
-    
-    /**
-     * Problem id
-     */
-    public final static int FULLY_QUALIFIED_NAME_MUST_BE_A_CLASS_ID = 3;
-    
-    /**
-     * Problem id
-     */
-    public final static int CLASS_MUST_BE_INSTANCE_OF_ID = 4;
-    
-    /**
-     * Problem id
-     */
-    public final static int CLASS_MUST_BE_CONCRETE_ID = 5;
-    
-    /**
-     * TODO:
-     */
-    public final static int CLASS_MUST_HAVE_DEFAULT_OR_ADAPTER_CONSTRUCTOR_ID = 6;
-
-    /**
-     * Problem id
-     */
-    public final static int API_DEPRECATED_AFTER_VERSION_ID = 7;
-    
-    /**
-     * Problem id
-     */
-    public final static int BEAN_PROPERTY_NOT_FOUND_ID = 8;
-    
-    /**
-     * Problem id
-     */
-    public final static int MUST_BE_A_VALID_JAVA_IDENT_ID = 9;
-    
-    /**
-     * Problem id
-     */
-    public final static int BEAN_SCOPE_NOT_VALID_ID = 10;
-    
-    /**
-     * Problem id
-     */
-    public final static int MAP_ENTRIES_CAN_ONLY_BE_SET_ON_MAP_TYPE_ID = 11;
-    
-    /**
-     * Problem id
-     */
-    public final static int LIST_ENTRIES_CAN_ONLY_BE_SET_ON_LIST_TYPE_ID = 12;
-    
-    /**
-     * Problem id
-     */
-    public final static int API_NOT_AVAILABLE_BEFORE_VERSION_ID = 13;
-    
-    /**
-     * Problem id
-     */
-    public final static int APP_CONFIG_IS_NEWER_THAN_JSF_VERSION_ID = 14;
-    /**
-     * Problem id
-     */
-    public final static int APP_CONFIG_IS_OLDER_THAN_JSF_VERSION_ID = 15;
-    
-    /**
-     * Problem id
-     */
-    public final static int LOCALE_FORMAT_NOT_VALID_ID = 16;
-    
-    /**
-     * @return message indicating text that should be EL was
-     * not found sorrounded in #{} values
-     */
-    public static IMessage create_EL_EXPR_MUST_BE_IN_HASH_BRACES()
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-                Messages.EL_EXPR_MUST_BE_IN_HASH_BRACES_ID,
-                null, EL_EXPR_MUST_BE_IN_HASH_BRACES_ID);
-    }
-    
-    /**
-     * @return message indicating that EL was found that
-     * was empty or did not parse
-     */
-    public static IMessage create_SYNTAX_ERROR_IN_EL()
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-                Messages.SYNTAX_ERROR_IN_EL_ID,
-                null, SYNTAX_ERROR_IN_EL_ID);
-    }
-    
-    /**
-     * @param className
-     * @return message indicating that className can't be found as 
-     * a valid fully qualified class name
-     */
-    public static IMessage create_CANNOT_FIND_CLASS_NAME(final String className)
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-                MessageFormat.format(Messages.CANNOT_FIND_CLASS_NAME_ID,new Object[]{className}),
-                null, SYNTAX_ERROR_IN_EL_ID);
-    }
-    
-    /**
-     * @param fullyQualifiedName
-     * @return the error message for a fullyQualifiedName that resolves to a type
-     * that is not a class (i.e. an interface or enum) but is expected to be
-     */
-    public static IMessage create_FULLY_QUALIFIED_NAME_MUST_BE_A_CLASS(final String fullyQualifiedName)
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-                MessageFormat.format(Messages.FULLY_QUALIFIED_NAME_MUST_BE_A_CLASS_ID
-                        ,new Object[]{fullyQualifiedName})
-                        ,null, FULLY_QUALIFIED_NAME_MUST_BE_A_CLASS_ID);
-    }
-
-    /**
-     * @param className
-     * @param extensionType 
-     * @param expectedSuper
-     * @return an error when a class name must be of type expectedSuper
-     */
-    public static IMessage create_CLASS_MUST_BE_INSTANCE_OF(final String className, 
-                                                            final String extensionType,
-                                                            final String expectedSuper)
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-                MessageFormat.format(Messages.CLASS_MUST_BE_INSTANCE_OF_ID
-                        ,new Object[]{className, extensionType, expectedSuper})
-                        ,null, CLASS_MUST_BE_INSTANCE_OF_ID);
-    }
-    
-    
-    /**
-     * @param className
-     * @return error indicating that className must specify a class
-     * that is concrete
-     */
-    public static IMessage create_CLASS_MUST_BE_CONCRETE(final String className)
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-                MessageFormat.format(Messages.CLASS_MUST_BE_CONCRETE_ID
-                        ,new Object[]{className})
-                        ,null, CLASS_MUST_BE_CONCRETE_ID);
-    }
-    
-    /**
-     * @param apiName -- name of deprecated API
-     * @param afterVersion -- version after which deprecation is effective
-     * @param useInstead -- name of API to use instead
-     * @return an error indicating the use of a deprecated API
-     */
-    public static IMessage create_API_DEPRECATED_AFTER_VERSION_ID(final String apiName, final String afterVersion, final String useInstead)
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-                MessageFormat.format(Messages.API_DEPRECATED_AFTER_VERSION_ID
-                        ,new Object[]{apiName, afterVersion, useInstead})
-                        ,null, API_DEPRECATED_AFTER_VERSION_ID);
-    }
-    
-    /**
-     * @param propertyName
-     * @param beanClassName
-     * @return an error indicating that the propertyName was not
-     * found on beanClassName
-     */
-    public static IMessage create_BEAN_PROPERTY_NOT_FOUND(final String propertyName, final String beanClassName)
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-                MessageFormat.format(Messages.BEAN_PROPERTY_NOT_FOUND_ID
-                        ,new Object[]{propertyName, beanClassName})
-                        ,null, BEAN_PROPERTY_NOT_FOUND_ID);
-            
-    }
-    
-    
-    /**
-     * @param nameOfId
-     * @return an error indicating that some id must be a valid
-     * Java identifier
-     */
-    public static IMessage create_MUST_BE_A_VALID_JAVA_IDENT(final String nameOfId)
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-            MessageFormat.format(Messages.MUST_BE_A_VALID_JAVA_IDENT_ID
-                ,new Object[]{nameOfId})
-                ,null, MUST_BE_A_VALID_JAVA_IDENT_ID);    
-    }
-    
-    /**
-     * @return an error indicating an invalid bean scope enum value
-     */
-    public static IMessage create_BEAN_SCOPE_NOT_VALID()
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-            Messages.BEAN_SCOPE_NOT_VALID_ID
-            , null, BEAN_SCOPE_NOT_VALID_ID);    
-    }
-    
-    /**
-     * @param targetName 
-     * @return an error indicating that a map entry is being set on a target
-     * object that is not a java.util.Map
-     */
-    public static IMessage create_MAP_ENTRIES_CAN_ONLY_BE_SET_ON_MAP_TYPE(String targetName)
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-            MessageFormat.format(Messages.MAP_ENTRIES_CAN_ONLY_BE_SET_ON_MAP_TYPE_ID,
-                                 new Object[]{targetName}),
-            null, MAP_ENTRIES_CAN_ONLY_BE_SET_ON_MAP_TYPE_ID);
-    }
-
-    /**
-     * @param targetName 
-     * @return an error indicating that a list entry is being set on a target
-     * object that is not a java.util.List
-     */
-    public static IMessage create_LIST_ENTRIES_CAN_ONLY_BE_SET_ON_LIST_TYPE(String targetName)
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-            MessageFormat.format(Messages.LIST_ENTRIES_CAN_ONLY_BE_SET_ON_LIST_TYPE_ID,
-                                 new Object[]{targetName}),
-            null, LIST_ENTRIES_CAN_ONLY_BE_SET_ON_LIST_TYPE_ID);
-    }
-    
-    /**
-     * @param apiName
-     * @param beforeVersion
-     * @param useInstead
-     * @return a diagnostic indicating that an API is being used that is not yet
-     * available in the current JSF version.
-     */
-    public static IMessage create_API_NOT_AVAILABLE_BEFORE_VERSION(final String apiName, final String beforeVersion, final String useInstead)
-    {
-        return new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-            MessageFormat.format(Messages.API_NOT_AVAILABLE_BEFORE_VERSION_ID
-                ,new Object[]{apiName, beforeVersion, useInstead})
-                ,null, API_NOT_AVAILABLE_BEFORE_VERSION_ID);
-    }
-    
-    /**
-     * @param file
-     * @return a diagnostic indicating that the app config model in use is too
-     * new for the selected JSF runtime version.
-     */
-    public static IMessage create_APP_CONFIG_IS_NEWER_THAN_JSF_VERSION(IFile file)
-    {
-        final IMessage message = new MyLocalizedMessage(IMessage.HIGH_SEVERITY,
-            Messages.APP_CONFIG_IS_NEWER_THAN_JSF_VERSION_ID
-                ,null, APP_CONFIG_IS_NEWER_THAN_JSF_VERSION_ID);
-        message.setTargetObject(file);
-        return message;
-    }
-    
-    /**
-     * @param file
-     * @param appConfigVersion 
-     * @param projectVersion 
-     * @return a diagnostic indicating that the app config model in use is older
-     * than the selected JSF runtime version.
-     */
-    public static IMessage create_APP_CONFIG_IS_OLDER_THAN_JSF_VERSION(IFile file, String appConfigVersion, String projectVersion)
-    {
-        final IMessage message = new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-            MessageFormat.format(
-                Messages.APP_CONFIG_IS_OLDER_THAN_JSF_VERSION_ID,
-                    new Object[] {appConfigVersion, projectVersion})
-            ,null, APP_CONFIG_IS_OLDER_THAN_JSF_VERSION_ID);
-        message.setTargetObject(file);
-        return message;
-    }
-    
-    /**
-     * @return a diagnostic indicating that the locale format does
-     * not match what is expected
-     */
-    public static IMessage create_LOCALE_FORMAT_NOT_VALID()
-    {
-        IMessage message = new MyLocalizedMessage(IMessage.NORMAL_SEVERITY,
-                    Messages.LOCALE_FORMAT_NOT_VALID_ID
-                ,null, LOCALE_FORMAT_NOT_VALID_ID);
-        return message;
-    }
-    
-    /**
-     * Customized localizable message for app config validation
-     * @author cbateman
-     *
-     */
-    static class MyLocalizedMessage extends Message implements ILocalizedMessage
-    {
-        private final String _message;
-        private final int    _errorCode;
-
-        /**
-         * @param severity
-         * @param messageText
-         * @param targetObject
-         * @param errorCode 
-         */
-        public MyLocalizedMessage(int severity, String messageText, IResource targetObject, int errorCode) {
-            this(severity, messageText, (Object) targetObject, errorCode);
-        }
-
-        /**
-         * @param severity
-         * @param messageText
-         * @param targetObject
-         * @param errorCode 
-         */
-        private MyLocalizedMessage(int severity, String messageText, Object targetObject, int errorCode) {
-            super(JSFCorePlugin.getDefault().getBundle().getSymbolicName(), severity, 
-                    messageText);
-            _message = messageText;
-            setTargetObject(targetObject);
-            _errorCode = errorCode;
-        }
-
-        /**
-         * @return the localized message
-         */
-        public String getLocalizedMessage() {
-            return _message;
-        }
-
-        /**
-         * @see org.eclipse.wst.validation.internal.core.Message#getText()
-         */
-        public String getText() {
-            return getLocalizedMessage();
-        }
-
-        /**
-         * @see org.eclipse.wst.validation.internal.core.Message#getText(java.lang.ClassLoader)
-         */
-        public String getText(ClassLoader cl) {
-            return getLocalizedMessage();
-        }
-
-        /**
-         * @see org.eclipse.wst.validation.internal.core.Message#getText(java.util.Locale)
-         */
-        public String getText(Locale l) {
-            return getLocalizedMessage();
-        }
-
-        public String getText(Locale l, ClassLoader cl) {
-            return getLocalizedMessage();
-        }
-
-        /**
-         * @return the error code related to this message
-         */
-        public int getErrorCode() {
-            return _errorCode;
-        }
-
-
-        /**
-         * @param offset
-         * @return true if this message applies to document offset
-         */
-        public boolean appliesTo(int offset)
-        {
-            return (offset >= getOffset() && offset < getOffset()+getLength());
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/EObjectValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/EObjectValidationVisitor.java
deleted file mode 100644
index 619c746..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/EObjectValidationVisitor.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-/**
- *  
- * @author cbateman
- */
-public abstract class EObjectValidationVisitor 
-{
-    private EStructuralFeature    _structuralFeature;
-    private Map                   _childFeatures; // == null; lazy initialized in validate
-    private final String          _version;
-    
-    /**
-     * Used to indicate no child nodes
-     */
-    protected final static EObjectValidationVisitor[] NO_CHILDREN = 
-        new EObjectValidationVisitor[0];
-    
-    /**
-     * @param version 
-     * 
-     */
-    public EObjectValidationVisitor(String version)
-    {
-        _version = version;
-    }
-
-    private EObjectValidationVisitor getVisitorForFeature(EStructuralFeature feature)
-    {
-        if (_childFeatures == null)
-        {
-            _childFeatures = new HashMap();
-
-            EObjectValidationVisitor[] children = getChildNodeValidators();
-            
-            for (int i = 0; i < children.length; i++)
-            {
-                final EObjectValidationVisitor child = children[i];
-                _childFeatures.put(child.getStructuralFeature(), child);
-            }
-        }
-
-        return (EObjectValidationVisitor) _childFeatures.get(feature);
-    }
-    
-    /**
-     * @param structuralFeature 
-     * @param version 
-     */
-    public EObjectValidationVisitor(EStructuralFeature structuralFeature, String version)
-    {
-        this(version);
-        _structuralFeature = structuralFeature;
-    }
-
-    /**
-     * @param eObject 
-     * @param messages
-     * @param file 
-     */
-    public final void validate(EObject eObject, List messages, IFile file)
-    {
-        doValidate(eObject, messages, file);
-        
-        List features = eObject.eClass().getEAllStructuralFeatures();
-        
-        for (final Iterator it = features.iterator(); it.hasNext();)
-        {
-            final EStructuralFeature feature = (EStructuralFeature) it.next();
-            final EObjectValidationVisitor visitor = 
-                getVisitorForFeature(feature);
-            
-            if (visitor != null)
-            {
-                final Object obj = eObject.eGet(feature);
-                
-                if (obj instanceof List
-                        && feature.isMany())
-                {
-                    for (final Iterator childIt = ((List)obj).iterator(); 
-                            childIt.hasNext();)
-                    {
-                        Object child = childIt.next();
-                        if (child instanceof EObject)
-                        {
-                            visitor.validate((EObject)child, messages, file);
-                        }
-                    }
-                }
-                else if (obj instanceof EObject)
-                {
-                    visitor.validate((EObject)obj , messages, file);
-                }
-            }
-        }
-    }
-
-    /**
-     * Do the validation for this visitor on this node.  Add any Message's to
-     * the messages list
-     * 
-     * @param eObject 
-     * @param messages
-     * @param file 
-     */
-    protected abstract void doValidate(EObject eObject, List messages, IFile file);
-    
-    /**
-     * @return an array of visitors that validate children of the current node
-     */
-    protected abstract EObjectValidationVisitor[] getChildNodeValidators();
-
-    /**
-     * @return the structural feature
-     */
-    protected final EStructuralFeature getStructuralFeature() 
-    {
-        return _structuralFeature;
-    }
-    
-    /**
-     * @return the version of the runtime
-     */
-    protected final String getVersion()
-    {
-        return _version;
-    }
-    
-    /**
-     * @param messages 
-     * @param message
-     * @param eObj
-     * @param file
-     */
-    protected static void addMessageInfo(List messages, IMessage message, EObject eObj, IFile file)
-    {
-        if (message != null)
-        {
-            message.setOffset(AppConfigValidationUtil.getStartOffset(eObj));
-            message.setLength(AppConfigValidationUtil.getLength(eObj));
-            message.setTargetObject(file);
-            messages.add(message);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/FacesConfigValidator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/FacesConfigValidator.java
deleted file mode 100644
index 53a63fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/FacesConfigValidator.java
+++ /dev/null
@@ -1,97 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType;
-
-/**
- * Top-level validator for the faces-config model
- * 
- * @author cbateman
- *
- */
-public class FacesConfigValidator extends EObjectValidationVisitor
-{
-    /**
-     * constructor
-     * @param version 
-     */
-    public FacesConfigValidator(String version) 
-    {
-        super(version);
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() 
-    {
-        return new EObjectValidationVisitor[]
-        {
-            new NavigationRuleValidator(getVersion())
-            , new ApplicationValidationVisitor(getVersion())
-            , new LifecycleValidationVisitor(getVersion())
-            , new FactoryValidationVisitor(getVersion())
-            , new ComponentValidatorVisitor(getVersion())
-            , new ValidatorTypeValidationVisitor(getVersion())
-            , new ConverterValidationVisitor(getVersion())
-            , new ManagedBeanValidationVisitor(getVersion())
-            , new RenderKitValidationVisitor(getVersion())
-        };
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) 
-    {
-        // nothing to do
-    }
-    
-    private static class LifecycleValidationVisitor extends EObjectValidationVisitor
-    {
-        LifecycleValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getFacesConfigType_Lifecycle(),
-                  version);
-        }
-        
-        protected void doValidate(EObject object, List messages, IFile file) {
-            // nothing to validate except in children
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            return new EObjectValidationVisitor[] {
-                 new PhaseListenerValidation(getVersion())
-            };
-        }
-        
-        private static class PhaseListenerValidation extends ClassNameEObjectValidationVisitor
-        {
-            PhaseListenerValidation(final String version)
-            {
-                super(FacesConfigPackage.eINSTANCE.getLifecycleType_PhaseListener(),
-                        version);
-            }
-            protected String getFullyQualifiedName(EObject eobj) {
-                return ((PhaseListenerType)eobj).getTextContent();
-            }
-
-            protected String getInstanceOf() {
-                return "javax.faces.event.PhaseListener";
-            }
-
-            protected EObjectValidationVisitor[] getChildNodeValidators() {
-                // no children
-                return NO_CHILDREN;
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/FactoryValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/FactoryValidationVisitor.java
deleted file mode 100644
index 5b187d5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/FactoryValidationVisitor.java
+++ /dev/null
@@ -1,148 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType;
-
-/**
- * @author cbateman
- *
- */
-public class FactoryValidationVisitor extends EObjectValidationVisitor 
-{
-    /**
-     * @param version
-     */
-    public FactoryValidationVisitor(String version) {
-        super(FacesConfigPackage.eINSTANCE.getFacesConfigType_Factory()
-                ,version);
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) {
-        // nothing to do except vaildate children
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() 
-    {
-        return new EObjectValidationVisitor[]
-        {
-                new ApplicationFactoryValidationVisitor(getVersion())
-                , new FacesContextFactoryValidationVisitor(getVersion())
-                , new LifecycleFactoryValidationVisitor(getVersion())
-                , new RenderkitFactoryValidationVisitor(getVersion())
-        };
-    }
-
-    private static class ApplicationFactoryValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        ApplicationFactoryValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getFactoryType_ApplicationFactory(),
-                    version);
-        }
-        
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((ApplicationFactoryType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.application.ApplicationFactory";
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            // none
-            return NO_CHILDREN;
-        }
-        
-    }
-    
-    private static class FacesContextFactoryValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        FacesContextFactoryValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getFactoryType_FacesContextFactory(),
-                    version);
-        }
-        
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((FacesContextFactoryType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.context.FacesContextFactory";
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            // none
-            return NO_CHILDREN;
-        }
-        
-    }
-
-    private static class LifecycleFactoryValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        LifecycleFactoryValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getFactoryType_LifecycleFactory(),
-                    version);
-        }
-        
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((LifecycleFactoryType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.lifecycle.LifecycleFactory";
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            // none
-            return NO_CHILDREN;
-        }
-        
-    }
-
-    private static class RenderkitFactoryValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        RenderkitFactoryValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getFactoryType_RenderKitFactory(),
-                    version);
-        }
-        
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((RenderKitFactoryType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.render.RenderKitFactory";
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            // none
-            return NO_CHILDREN;
-        }
-        
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ILocalizedMessage.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ILocalizedMessage.java
deleted file mode 100644
index f50207f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ILocalizedMessage.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-/**
- * Used to expose internal message data to unit tests.  Should not be used by clients
- * @author cbateman
- *
- */
-public interface ILocalizedMessage {
-    /**
-     * @return the error code
-     */
-    public int getErrorCode();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ManagedBeanValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ManagedBeanValidationVisitor.java
deleted file mode 100644
index 19791d6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ManagedBeanValidationVisitor.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-/**
- * Managed bean validator
- * 
- * @author cbateman
- *
- */
-public class ManagedBeanValidationVisitor extends EObjectValidationVisitor 
-{
-    /**
-     * @param version
-     */
-    public ManagedBeanValidationVisitor(final String version) 
-    {
-        super(FacesConfigPackage.eINSTANCE.getFacesConfigType_ManagedBean()
-                ,version);
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) 
-    {
-        final ManagedBeanType managedBean = (ManagedBeanType) object;
-        
-        // TODO: validate managedBeanName is a valid Java id
-//        final String managedBeanName = 
-//            managedBean.getManagedBeanName().getTextContent();
-        validateScope(managedBean.getManagedBeanScope(), messages, file);
-        validateClass(managedBean.getManagedBeanClass(), messages, file);
-        validateEntryTypes(managedBean, messages, file);
-    }
-    
-    private void validateScope(ManagedBeanScopeType scope, List messages, IFile file)
-    {
-        if (scope != null && scope.getTextContent() != null)
-        {
-            addMessageInfo(messages
-                    , AppConfigValidationUtil.validateManagedBeanScope(scope)
-                    , scope, file);
-        }
-    }
-    
-    private void validateClass(ManagedBeanClassType classType, List messages, IFile file)
-    {
-        if (classType != null)
-        {
-            String classTypeValue = classType.getTextContent();
-            addMessageInfo(messages
-                , AppConfigValidationUtil.validateClassName
-                    (classTypeValue == null ? "" : classTypeValue, 
-                            null, file.getProject()), classType, file);
-        }
-    }
-    
-    private void validateEntryTypes(ManagedBeanType managedBeanType, List messages, IFile file)
-    {
-        // TODO: do a bean look-up for targetName to verify that it a) matches the type
-        // and b) exists on the bean
-        if (managedBeanType.getManagedBeanName()!= null
-                && managedBeanType.getManagedBeanClass() != null)
-        {
-            final String propertyName =
-                managedBeanType.getManagedBeanName().getTextContent();
-            final String propertyClass =
-                managedBeanType.getManagedBeanClass().getTextContent();
-            
-            if (propertyName == null || propertyClass == null
-                    || "".equals(propertyName.trim())
-                    || "".equals(propertyClass.trim()))
-            {
-                return;
-            }
-            
-            IMessage message = null;
-            EObject eObj = null;
-            if (managedBeanType.getMapEntries() != null)
-            {
-                eObj = managedBeanType.getMapEntries();
-                message =
-                    AppConfigValidationUtil
-                        .validateMapEntries
-                            (propertyName
-                            , propertyClass
-                            , (MapEntriesType) eObj
-                            , file.getProject());
-            }
-            else if (managedBeanType.getListEntries() != null)
-            {
-                eObj = managedBeanType.getListEntries();
-                message =
-                    AppConfigValidationUtil
-                        .validateListEntries(
-                            propertyName
-                            , propertyClass
-                            , (ListEntriesType) eObj
-                            , file.getProject());
-            }
-            addMessageInfo(messages, message, eObj, file);
-        }
-    }
-    
-    protected EObjectValidationVisitor[] getChildNodeValidators() {
-        return new EObjectValidationVisitor[]
-        {
-            new ManagedPropertyValidationVisitor(getVersion())
-        };
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ManagedPropertyValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ManagedPropertyValidationVisitor.java
deleted file mode 100644
index 6c74b9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ManagedPropertyValidationVisitor.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-/**
- * Validates managed bean properties
- * 
- */
-public class ManagedPropertyValidationVisitor extends EObjectValidationVisitor
-{
-    /**
-     * @param version
-     */
-    public ManagedPropertyValidationVisitor(String version) {
-        super(FacesConfigPackage.eINSTANCE.getManagedBeanType_ManagedProperty()
-                ,version);
-    }
-
-    protected void doValidate(final EObject object, final List messages, final IFile file) 
-    {
-        // TODO: do a bean look-up for propertyName to verify that it a) matches the type
-        // and b) exists on the bean
-        final ManagedPropertyType managedPropertyType = 
-            (ManagedPropertyType) object;
-
-        if (managedPropertyType.getPropertyName() == null
-                || managedPropertyType.getPropertyClass() == null)
-        {
-            // don't bother if the basics aren't correct
-            return;
-        }
-        
-        final String propertyName =
-            managedPropertyType.getPropertyName().getTextContent();
-        final String propertyClass =
-            managedPropertyType.getPropertyClass().getTextContent();
-        
-        if (propertyName == null || propertyClass == null
-                || "".equals(propertyName.trim())
-                || "".equals(propertyClass.trim()))
-        {
-            return;
-        }
-        
-        IMessage message = null;
-        EObject eObj = null;
-        if (managedPropertyType.getMapEntries() != null)
-        {
-            eObj = managedPropertyType.getMapEntries();
-            message =
-                AppConfigValidationUtil
-                    .validateMapEntries
-                        (propertyName
-                        , propertyClass
-                        , (MapEntriesType) eObj
-                        , file.getProject());
-        }
-        else if (managedPropertyType.getListEntries() != null)
-        {
-            eObj = managedPropertyType.getListEntries();
-            message =
-                AppConfigValidationUtil
-                    .validateListEntries(
-                        propertyName
-                        , propertyClass
-                        , (ListEntriesType) eObj
-                        , file.getProject());
-        }
-        
-        addMessageInfo(messages, message, eObj, file);
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() {
-        return new EObjectValidationVisitor[]
-        {
-             new PropertyNameValidationVisitor(FacesConfigPackage.eINSTANCE.getManagedPropertyType_PropertyName(),
-                     FacesConfigPackage.eINSTANCE.getManagedBeanType_ManagedBeanClass(), getVersion())
-        };
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/Messages.java
deleted file mode 100644
index fb62b62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/Messages.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import org.eclipse.osgi.util.NLS;
-
-class Messages extends NLS {
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.validation.internal.appconfig.messages"; //$NON-NLS-1$
-
-
-
-
-    static {
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-
-    /**
-     * see messages.properties
-     */
-    public static String AppConfigValidationUtil_0;
-
-    /**
-     * see messages.properties
-     */
-    public static String EL_EXPR_MUST_BE_IN_HASH_BRACES_ID;
-    
-    /**
-     * see messages.properties
-     */
-    public static String SYNTAX_ERROR_IN_EL_ID;
-    
-    /**
-     * see messages.properties
-     */
-    public static String CANNOT_FIND_CLASS_NAME_ID;
-    
-    /**
-     * see messages.properties
-     */
-    public static String FULLY_QUALIFIED_NAME_MUST_BE_A_CLASS_ID;
-    
-    /**
-     * see messages.properties
-     */
-    public static String CLASS_MUST_BE_INSTANCE_OF_ID;
-
-    /**
-     * see messages.properties
-     */
-    public static String CLASS_MUST_BE_CONCRETE_ID;
-
-    /**
-     * see messages.properties
-     */
-    public static String API_DEPRECATED_AFTER_VERSION_ID;
-
-    /**
-     * see messages.properties
-     */
-    public static String BEAN_PROPERTY_NOT_FOUND_ID;
-
-    /**
-     * see messages.properties
-     */
-    public static String MUST_BE_A_VALID_JAVA_IDENT_ID;
-
-    /**
-     * see messages.properties
-     */
-    public static String BEAN_SCOPE_NOT_VALID_ID;
-
-    /**
-     * see messages.properties
-     */
-    public static String MAP_ENTRIES_CAN_ONLY_BE_SET_ON_MAP_TYPE_ID;
-
-    /**
-     * see messages.properties
-     */
-    public static String LIST_ENTRIES_CAN_ONLY_BE_SET_ON_LIST_TYPE_ID;
-    
-    /**
-     * see messages.properties
-     */
-    public static String API_NOT_AVAILABLE_BEFORE_VERSION_ID;
-    
-    /**
-     * see messages.properties
-     */
-    public static String APP_CONFIG_IS_NEWER_THAN_JSF_VERSION_ID;
-
-    /**
-     * see messages.properties 
-     */
-    public static String APP_CONFIG_IS_OLDER_THAN_JSF_VERSION_ID;
-
-    /**
-     * see messages.properties
-     */
-    public static String LOCALE_FORMAT_NOT_VALID_ID;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/NavigationCaseValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/NavigationCaseValidationVisitor.java
deleted file mode 100644
index 47a1271..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/NavigationCaseValidationVisitor.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromActionType;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-/**
- * NavigationCase validation visitor.
- * 
- * @author cbateman
- *
- */
-public class NavigationCaseValidationVisitor extends EObjectValidationVisitor 
-{
-    /**
-     * @param version 
-     * 
-     */
-    public NavigationCaseValidationVisitor(final String version) 
-    {
-        super(FacesConfigPackage.eINSTANCE.getNavigationRuleType_NavigationCase()
-                , version);
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) 
-    {
-        // nothing to do
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() 
-    {
-        return new EObjectValidationVisitor[]
-        {
-            new FromActionValidationVisitor(getVersion())
-        };
-    }
-
-    private static class FromActionValidationVisitor extends EObjectValidationVisitor
-    {
-        /**
-         * @param version 
-         * 
-         */
-        public FromActionValidationVisitor(String version) {
-            super(FacesConfigPackage.eINSTANCE.getNavigationCaseType_FromAction(),
-                    version);
-        }
-
-        protected void doValidate(EObject object, List messages, IFile file) 
-        {
-            if (object instanceof FromActionType)
-            {
-                final FromActionType actionType = (FromActionType) object;
-                IMessage message = AppConfigValidationUtil.validateELExpression
-                    (actionType.getTextContent());
-                addMessageInfo(messages, message, actionType, file);
-            }
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() 
-        {
-            return NO_CHILDREN;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/NavigationRuleValidator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/NavigationRuleValidator.java
deleted file mode 100644
index b1b6e1b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/NavigationRuleValidator.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * Recursive validator for navigation-rule
- * 
- * @author cbateman
- *
- */
-public class NavigationRuleValidator extends EObjectValidationVisitor 
-{
-    /**
-     * Constructor
-     * @param version 
-     */
-    public NavigationRuleValidator(final String version) 
-    {
-        super(FacesConfigPackage.eINSTANCE.getFacesConfigType_NavigationRule()
-                , version);
-    }
-
-    protected void doValidate(EObject eobj, List messages, IFile file) 
-    {
-        // nothing to do
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() 
-    {
-        return new EObjectValidationVisitor[]
-        {
-            new NavigationCaseValidationVisitor(getVersion())
-        };
-    }
-//    private static class FromViewIdValidator extends ViewIdValidator
-//    {
-//        FromViewIdValidator()
-//        {
-//            super(Node.ELEMENT_NODE, "from-view-id");
-//        }
-//
-//        protected void doValidate(Node node, List messages, IFile file) 
-//        {
-//            // only validate if a custom navigation handler is not set
-//            // since we can only validate against what the default navigation
-//            // handler will expect
-//            if (!hasCustomNavigationHandler(file))
-//            {
-//                final String textContent = node.getTextContent();
-//                final IProject project = file.getProject();
-//                
-//                
-//            }
-//        }
-//        
-//        private boolean hasCustomNavigationHandler(IFile file)
-//        {
-//            JSFAppConfigManager configManager = 
-//                JSFAppConfigManager.getInstance(file.getProject());
-//            
-//            for (final Iterator appIt = configManager.getApplications().iterator(); appIt.hasNext();)
-//            {
-//                ApplicationType appType = (ApplicationType) appIt.next();
-//                if (appType.getNavigationHandler().size() > 0)
-//                {
-//                    return true;
-//                }
-//            }
-//            
-//            return false;
-//        }
-//
-//        protected NodeValidationVisitor[] getChildNodeValidators() {
-//            return EMPTY_CHILDREN;
-//        }
-//    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/NodeValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/NodeValidationVisitor.java
deleted file mode 100644
index 49eacac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/NodeValidationVisitor.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-/**
- * Visits an app config DOM tree and calls validators based on the
- * configured validator tree
- * 
- * @author cbateman
- *
- */
-public abstract class NodeValidationVisitor 
-{
-    private final short     _nodeType;
-    private final String    _nodeName;
-    private final Map       _attributeVisitors;
-    private final Map       _elementVisitors;
-    
-    /**
-     * Used to indicate no child nodes
-     */
-    protected final static NodeValidationVisitor[] EMPTY_CHILDREN = new NodeValidationVisitor[0];
-    
-    /**
-     * @param nodeType
-     * @param nodeName
-     */
-    public NodeValidationVisitor(short nodeType, String nodeName)
-    {
-        _nodeType = nodeType;
-        _nodeName = nodeName;
-        _attributeVisitors = new HashMap();
-        _elementVisitors = new HashMap();
-        
-        NodeValidationVisitor[] childVisitors = getChildNodeValidators();
-        
-        for (int i = 0; i < childVisitors.length; i++)
-        {
-            final NodeValidationVisitor visitor = childVisitors[i];
-            
-            switch(visitor.getNodeType())
-            {
-                case Node.ATTRIBUTE_NODE:
-                    _attributeVisitors.put(visitor.getNodeName(), visitor);
-                break;
-                
-                case Node.ELEMENT_NODE:
-                    _elementVisitors.put(visitor.getNodeName(), visitor);
-                break;
-            }
-        }
-    }
-    
-    /**
-     * @param node
-     * @param messages
-     * @param file 
-     */
-    public final void validate(Node node, List messages, IFile file)
-    {
-        doValidate(node, messages, file);
-        
-        final NamedNodeMap attributes = node.getAttributes();
-        
-        for (int i = 0; attributes != null && i < attributes.getLength(); i++)
-        {
-            final Node attr = attributes.item(i);
-            final NodeValidationVisitor  visitor = 
-                (NodeValidationVisitor) _attributeVisitors.get(attr.getNodeName());
-            if (visitor != null)
-            {
-                visitor.validate(attr, messages, file);
-            }
-        }
-        
-        for (int i = 0; i < node.getChildNodes().getLength(); i++)
-        {
-            final Node child = node.getChildNodes().item(i);
-            final NodeValidationVisitor  visitor = 
-                (NodeValidationVisitor) _elementVisitors.get(child.getNodeName());
-            if (visitor != null)
-            {
-                visitor.validate(child, messages, file);
-            }
-        }
-    }
-
-    /**
-     * Do the validation for this visitor on this node.  Add any Message's to
-     * the messages list
-     * 
-     * @param node
-     * @param messages
-     * @param file 
-     */
-    protected abstract void doValidate(Node node, List messages, IFile file);
-    
-    /**
-     * @return an array of visitors that validate children of the current node
-     */
-    protected abstract NodeValidationVisitor[] getChildNodeValidators();
-    
-    /**
-     * @return the node type for this validator
-     */
-    protected short getNodeType()
-    {
-        return _nodeType;
-    }
-    
-    /**
-     * @return the node name for this validator
-     */
-    protected String getNodeName()
-    {
-        return _nodeName;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/PropertyNameValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/PropertyNameValidationVisitor.java
deleted file mode 100644
index bce9301..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/PropertyNameValidationVisitor.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
-
-/**
- * Validate the validation property name
- * 
- * @author cbateman
- */
-class PropertyNameValidationVisitor extends EObjectValidationVisitor
-{
-    private final EStructuralFeature   _parentClassNameFeature;
-    
-    /**
-     * @param feature 
-     * @param parentClassNameFeature 
-     * @param version
-     */
-    public PropertyNameValidationVisitor(EStructuralFeature feature,
-            EStructuralFeature parentClassNameFeature, String version)
-    {
-        super(feature, version);
-        _parentClassNameFeature = parentClassNameFeature;
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() 
-    {
-        return PropertyValidationVisitor.NO_CHILDREN;
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) 
-    {
-        final String parentClassType = getParentClassType(object);
-        
-        if (parentClassType != null)
-        {
-            String typeSig = 
-                PropertyValidationVisitor.validateProperty((PropertyNameType)object
-                        , file.getProject(), parentClassType);
-            final String propertyName = 
-                ((PropertyNameType)object).getTextContent();
-            
-            if (typeSig == null)
-            {
-                PropertyValidationVisitor.addMessageInfo(messages,
-                        DiagnosticFactory
-                            .create_BEAN_PROPERTY_NOT_FOUND
-                                (propertyName, parentClassType)
-                        , object, file);
-            }
-        }
-    }
-
-    private String getParentClassType(EObject object)
-    {
-        String parentClassType = null;
-        
-        // need to derive the parent's type
-        final EObject property = object.eContainer();
-        if (property != null)
-        {
-            EObject owningObject = property.eContainer();
-            
-            if (owningObject != null)
-            {
-                final EObject parentClassTypeObject =
-                    (EObject) owningObject.eGet(_parentClassNameFeature);
-
-                if (parentClassTypeObject != null)
-                {
-                    final EStructuralFeature feature =
-                        parentClassTypeObject.eClass()
-                            .getEStructuralFeature("textContent");
-                    
-                    if (feature != null)
-                    {
-                        parentClassType = (String) 
-                            parentClassTypeObject.eGet(feature);
-                    }
-                }
-            }
-        }
-        
-        return parentClassType;
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/PropertyValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/PropertyValidationVisitor.java
deleted file mode 100644
index be9f5ec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/PropertyValidationVisitor.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.jsf.common.util.JDTBeanIntrospector;
-import org.eclipse.jst.jsf.common.util.JDTBeanProperty;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
-
-/**
- * Validates property's
- * 
- */
-public class PropertyValidationVisitor extends EObjectValidationVisitor 
-{
-    private final EStructuralFeature    _parentClassName;
-    
-    /**
-     * @param feature
-     * @param parentClassName 
-     * @param version
-     */
-    public PropertyValidationVisitor(EStructuralFeature feature, EStructuralFeature parentClassName, String version) {
-        // this validator can be attached to numerous parents so it
-        // cannot hard-code its feature
-        super(feature,version);
-        _parentClassName = parentClassName;
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) {
-        // validate the class type here because we need knowledge
-        // of the property name to do it
-        //TODO:
-//         final PropertyType property = (PropertyType) object;
-//         final String propertyClass = 
-//             property.getPropertyClass().getTextContent();
-//         final String propertySignature =
-//             validateProperty(property.getPropertyName()
-//                     , file.getProject(), _parentClassType);
-//         
-//         if (propertySignature != null
-//                 && Signature.)
-//         {
-//             Signature.create
-//         }
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() {
-        return new EObjectValidationVisitor[]
-        {
-             new PropertyNameValidationVisitor(FacesConfigPackage.eINSTANCE.getPropertyType_PropertyName(),
-                     _parentClassName, getVersion())
-        };
-    }
-
-    static String validateProperty(PropertyNameType object, IProject project, String parentClassType)
-    {
-        String signatureBeanProperty = null;
-        try
-        {
-           IJavaProject javaProject = JavaCore.create(project);
-           IType type = javaProject.findType(parentClassType);
-           
-           if (type != null)
-           {
-               final JDTBeanIntrospector introspector =
-                   new JDTBeanIntrospector(type);
-               
-               final Map properties = introspector.getProperties();
-
-               final String propertyName = object.getTextContent(); 
-               if (properties.containsKey(propertyName))
-               {
-                   final JDTBeanProperty beanProperty = 
-                       (JDTBeanProperty) properties.get(propertyName);
-                   signatureBeanProperty = 
-                       beanProperty.getTypeSignature();
-               }
-           }
-        }
-        catch(JavaModelException jme)
-        {
-            JSFCorePlugin
-                .log(new Exception(jme), 
-                     "Problem validating on parent: "+parentClassType);
-        }
-
-        return signatureBeanProperty;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/RenderKitValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/RenderKitValidationVisitor.java
deleted file mode 100644
index bb81efa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/RenderKitValidationVisitor.java
+++ /dev/null
@@ -1,73 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType;
-
-/**
- * Validates the renderkit
- */
-public class RenderKitValidationVisitor extends EObjectValidationVisitor 
-{
-
-    /**
-     * @param version
-     */
-    public RenderKitValidationVisitor(String version) 
-    {
-        super(FacesConfigPackage.eINSTANCE.getFacesConfigType_RenderKit()
-                ,version);
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) 
-    {
-        // nothing to do 
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators()
-    {
-        return new EObjectValidationVisitor[]
-        {
-            new RenderKitClassValidationVisitor(getVersion()),
-            new RendererValidationVisitor(getVersion())
-        };
-    }
-
-    private static class RenderKitClassValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        /**
-         * @param version
-         */
-        public RenderKitClassValidationVisitor(String version) 
-        {
-            super(FacesConfigPackage.eINSTANCE.getRenderKitType_RenderKitClass()
-                    , version);
-        }
-
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((RenderKitClassType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.render.RenderKit";
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            return NO_CHILDREN;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/RendererValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/RendererValidationVisitor.java
deleted file mode 100644
index 7c5cfb5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/RendererValidationVisitor.java
+++ /dev/null
@@ -1,73 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererClassType;
-
-/**
- * Renderer validation
- *
- */
-public class RendererValidationVisitor extends EObjectValidationVisitor {
-
-    /**
-     * @param version
-     */
-    public RendererValidationVisitor(String version)
-    {
-        super(FacesConfigPackage.eINSTANCE.getRenderKitType_Renderer(),
-                version);
-    }
-
-    protected void doValidate(EObject object, List messages, IFile file) {
-        // nothing to do
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() {
-        return new EObjectValidationVisitor[]
-        {
-            new RendererClassValidationVisitor(getVersion())
-            , new AttributeValidationVisitor
-                (FacesConfigPackage.eINSTANCE.getRendererType_Attribute()
-                        , getVersion())
-        };
-    }
-
-    private static class RendererClassValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        /**
-         * @param version
-         */
-        public RendererClassValidationVisitor(String version) 
-        {
-            super(FacesConfigPackage.eINSTANCE.getRendererType_RendererClass()
-                    , version);
-        }
-
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((RendererClassType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.render.Renderer";
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            return NO_CHILDREN;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ValidatorTypeValidationVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ValidatorTypeValidationVisitor.java
deleted file mode 100644
index 8068b0e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ValidatorTypeValidationVisitor.java
+++ /dev/null
@@ -1,73 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType;
-
-/**
- * Validation visitor for the Validator faces config model sub-type
- * @author cbateman
- *
- */
-public class ValidatorTypeValidationVisitor extends EObjectValidationVisitor {
-
-    /**
-     * @param version
-     */
-    public ValidatorTypeValidationVisitor(final String version)
-    {
-        super(FacesConfigPackage.eINSTANCE.getFacesConfigType_Validator(),
-                version);
-    }
-    
-    protected void doValidate(EObject object, List messages, IFile file) {
-        // nothing in the tag to validate
-    }
-
-    protected EObjectValidationVisitor[] getChildNodeValidators() {
-        return new EObjectValidationVisitor[]
-        {
-            new ValidatorClassValidationVisitor(getVersion()),
-            new AttributeValidationVisitor(FacesConfigPackage.eINSTANCE.getValidatorType_Attribute(), getVersion()),
-            new PropertyValidationVisitor
-                (FacesConfigPackage.eINSTANCE.getValidatorType_Property()
-                ,FacesConfigPackage.eINSTANCE.getValidatorType_ValidatorClass()
-                ,getVersion()),
-        };
-    }
-
-    private static class ValidatorClassValidationVisitor extends ClassNameEObjectValidationVisitor
-    {
-        ValidatorClassValidationVisitor(final String version)
-        {
-            super(FacesConfigPackage.eINSTANCE.getValidatorType_ValidatorClass(),
-                    version);
-        }
-        
-        protected String getFullyQualifiedName(EObject eobj) 
-        {
-            return ((ValidatorClassType)eobj).getTextContent();
-        }
-
-        protected String getInstanceOf() {
-            return "javax.faces.validator.Validator";
-        }
-
-        protected EObjectValidationVisitor[] getChildNodeValidators() {
-            return NO_CHILDREN;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ViewIdValidator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ViewIdValidator.java
deleted file mode 100644
index b925cff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ViewIdValidator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.appconfig;
-
-
-/**
- * @author cbateman
- *
- */
-public abstract class ViewIdValidator extends NodeValidationVisitor 
-{
-    /**
-     * @param nodeType
-     * @param nodeName
-     */
-    protected ViewIdValidator(final short nodeType, final String nodeName) 
-    {
-        super(nodeType, nodeName);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/messages.properties
deleted file mode 100644
index 37da684..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/messages.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-EL_EXPR_MUST_BE_IN_HASH_BRACES_ID=EL expression must be of the form #{expression}
-SYNTAX_ERROR_IN_EL_ID=Syntax error in EL
-CANNOT_FIND_CLASS_NAME_ID=Cannot find fully qualified class: {0}
-FULLY_QUALIFIED_NAME_MUST_BE_A_CLASS_ID=Fully qualified name must be a class: {0}
-CLASS_MUST_BE_INSTANCE_OF_ID=Class {0} must {1} the type {2}
-CLASS_MUST_BE_CONCRETE_ID=Class {0} must be concrete (not abstract)
-API_DEPRECATED_AFTER_VERSION_ID=API {0} is deprecated after JSF {1}.  Use {2} instead.
-BEAN_PROPERTY_NOT_FOUND_ID=Bean property {0} not found on parent class {1}
-MUST_BE_A_VALID_JAVA_IDENT_ID={0} must be a valid Java identifier
-BEAN_SCOPE_NOT_VALID_ID=Managed bean scope must be one of: request, session, application, none
-MAP_ENTRIES_CAN_ONLY_BE_SET_ON_MAP_TYPE_ID=Map entries can only be set on objects of type Map. {0} is not an instance of type java.util.Map
-LIST_ENTRIES_CAN_ONLY_BE_SET_ON_LIST_TYPE_ID=List entries can only be set on objects of type List. {0} is not an instance of type java.util.List
-API_NOT_AVAILABLE_BEFORE_VERSION_ID=API {0} is not avaiable before JSF {1}.  Use {2} instead.
-APP_CONFIG_IS_NEWER_THAN_JSF_VERSION_ID=Faces 1.2 application configuration cannot be used in projects for Faces 1.1 or before
-APP_CONFIG_IS_OLDER_THAN_JSF_VERSION_ID=Faces {0} application configuration being used in Faces {1} project.  Not all Faces {1} features will be available"
-LOCALE_FORMAT_NOT_VALID_ID=Locale format must be of the form lang_[_country[_variant]] like en or en_US or ja_JP_SJIS
-AppConfigValidationUtil_0=extend
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/ConstraintsFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/ConstraintsFactory.java
deleted file mode 100644
index 0df2966..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/ConstraintsFactory.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConstraintsFactory.java,v 1.1 2007/02/28 21:16:02 cbateman Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage
- * @generated
- */
-public interface ConstraintsFactory extends EFactory {
-    /**
-     * The singleton instance of the factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    ConstraintsFactory eINSTANCE = org.eclipse.jst.jsf.validation.internal.constraints.impl.ConstraintsFactoryImpl.init();
-
-    /**
-     * Returns a new object of class '<em>Tag Id</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Tag Id</em>'.
-     * @generated
-     */
-    TagId createTagId();
-
-    /**
-     * Returns a new object of class '<em>Tag Set</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Tag Set</em>'.
-     * @generated
-     */
-    TagSet createTagSet();
-
-    /**
-     * Returns a new object of class '<em>Contains Tag Constraint</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Contains Tag Constraint</em>'.
-     * @generated
-     */
-    ContainsTagConstraint createContainsTagConstraint();
-
-    /**
-     * Returns the package supported by this factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the package supported by this factory.
-     * @generated
-     */
-    ConstraintsPackage getConstraintsPackage();
-
-} //ConstraintsFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/ConstraintsPackage.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/ConstraintsPackage.java
deleted file mode 100644
index f21c649..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/ConstraintsPackage.java
+++ /dev/null
@@ -1,352 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConstraintsPackage.java,v 1.2 2007/04/16 17:50:08 cbateman Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsFactory
- * @model kind="package"
- * @generated
- */
-public interface ConstraintsPackage extends EPackage {
-    /**
-     * The package name.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNAME = "constraints";
-
-    /**
-     * The package namespace URI.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNS_URI = "http://org.eclipse.jst.jsf.core/constraints.ecore";
-
-    /**
-     * The package namespace name.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String eNS_PREFIX = "cnst";
-
-    /**
-     * The singleton instance of the package.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    ConstraintsPackage eINSTANCE = org.eclipse.jst.jsf.validation.internal.constraints.impl.ConstraintsPackageImpl.init();
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.validation.internal.constraints.impl.TagIdImpl <em>Tag Id</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.TagIdImpl
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.ConstraintsPackageImpl#getTagId()
-     * @generated
-     */
-    int TAG_ID = 0;
-
-    /**
-     * The feature id for the '<em><b>Uri</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int TAG_ID__URI = 0;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int TAG_ID__NAME = 1;
-
-    /**
-     * The number of structural features of the '<em>Tag Id</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int TAG_ID_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.validation.internal.constraints.impl.TagSetImpl <em>Tag Set</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.TagSetImpl
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.ConstraintsPackageImpl#getTagSet()
-     * @generated
-     */
-    int TAG_SET = 1;
-
-    /**
-     * The feature id for the '<em><b>Tags</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int TAG_SET__TAGS = 0;
-
-    /**
-     * The number of structural features of the '<em>Tag Set</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int TAG_SET_FEATURE_COUNT = 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.validation.internal.constraints.impl.ContainsTagConstraintImpl <em>Contains Tag Constraint</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.ContainsTagConstraintImpl
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.ConstraintsPackageImpl#getContainsTagConstraint()
-     * @generated
-     */
-    int CONTAINS_TAG_CONSTRAINT = 2;
-
-    /**
-     * The feature id for the '<em><b>Set Generator</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONTAINS_TAG_CONSTRAINT__SET_GENERATOR = 0;
-
-    /**
-     * The feature id for the '<em><b>Satisfies Set</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONTAINS_TAG_CONSTRAINT__SATISFIES_SET = 1;
-
-    /**
-     * The number of structural features of the '<em>Contains Tag Constraint</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONTAINS_TAG_CONSTRAINT_FEATURE_COUNT = 2;
-
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.validation.internal.constraints.TagId <em>Tag Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Tag Id</em>'.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.TagId
-     * @generated
-     */
-    EClass getTagId();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.validation.internal.constraints.TagId#getUri <em>Uri</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Uri</em>'.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.TagId#getUri()
-     * @see #getTagId()
-     * @generated
-     */
-    EAttribute getTagId_Uri();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.validation.internal.constraints.TagId#getName <em>Name</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Name</em>'.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.TagId#getName()
-     * @see #getTagId()
-     * @generated
-     */
-    EAttribute getTagId_Name();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.validation.internal.constraints.TagSet <em>Tag Set</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Tag Set</em>'.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.TagSet
-     * @generated
-     */
-    EClass getTagSet();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.validation.internal.constraints.TagSet#getTags <em>Tags</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Tags</em>'.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.TagSet#getTags()
-     * @see #getTagSet()
-     * @generated
-     */
-    EReference getTagSet_Tags();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint <em>Contains Tag Constraint</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Contains Tag Constraint</em>'.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint
-     * @generated
-     */
-    EClass getContainsTagConstraint();
-
-    /**
-     * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint#getSetGenerator <em>Set Generator</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference '<em>Set Generator</em>'.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint#getSetGenerator()
-     * @see #getContainsTagConstraint()
-     * @generated
-     */
-    EReference getContainsTagConstraint_SetGenerator();
-
-    /**
-     * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint#getSatisfiesSet <em>Satisfies Set</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference '<em>Satisfies Set</em>'.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint#getSatisfiesSet()
-     * @see #getContainsTagConstraint()
-     * @generated
-     */
-    EReference getContainsTagConstraint_SatisfiesSet();
-
-    /**
-     * Returns the factory that creates the instances of the model.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the factory that creates the instances of the model.
-     * @generated
-     */
-    ConstraintsFactory getConstraintsFactory();
-
-    /**
-     * <!-- begin-user-doc -->
-     * Defines literals for the meta objects that represent
-     * <ul>
-     *   <li>each class,</li>
-     *   <li>each feature of each class,</li>
-     *   <li>each enum,</li>
-     *   <li>and each data type</li>
-     * </ul>
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    interface Literals {
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.validation.internal.constraints.impl.TagIdImpl <em>Tag Id</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.TagIdImpl
-         * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.ConstraintsPackageImpl#getTagId()
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-        EClass TAG_ID = eINSTANCE.getTagId();
-
-        /**
-         * The meta object literal for the '<em><b>Uri</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-        EAttribute TAG_ID__URI = eINSTANCE.getTagId_Uri();
-
-        /**
-         * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-        EAttribute TAG_ID__NAME = eINSTANCE.getTagId_Name();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.validation.internal.constraints.impl.TagSetImpl <em>Tag Set</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.TagSetImpl
-         * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.ConstraintsPackageImpl#getTagSet()
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-        EClass TAG_SET = eINSTANCE.getTagSet();
-
-        /**
-         * The meta object literal for the '<em><b>Tags</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-        EReference TAG_SET__TAGS = eINSTANCE.getTagSet_Tags();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.validation.internal.constraints.impl.ContainsTagConstraintImpl <em>Contains Tag Constraint</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.ContainsTagConstraintImpl
-         * @see org.eclipse.jst.jsf.validation.internal.constraints.impl.ConstraintsPackageImpl#getContainsTagConstraint()
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-        EClass CONTAINS_TAG_CONSTRAINT = eINSTANCE.getContainsTagConstraint();
-
-        /**
-         * The meta object literal for the '<em><b>Set Generator</b></em>' reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-        EReference CONTAINS_TAG_CONSTRAINT__SET_GENERATOR = eINSTANCE.getContainsTagConstraint_SetGenerator();
-
-        /**
-         * The meta object literal for the '<em><b>Satisfies Set</b></em>' reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-        EReference CONTAINS_TAG_CONSTRAINT__SATISFIES_SET = eINSTANCE.getContainsTagConstraint_SatisfiesSet();
-
-    }
-
-} //ConstraintsPackage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/ContainsTagConstraint.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/ContainsTagConstraint.java
deleted file mode 100644
index d91e5c0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/ContainsTagConstraint.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ContainsTagConstraint.java,v 1.2 2007/04/16 19:53:29 itrimble Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Contains Tag Constraint</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint#getSetGenerator <em>Set Generator</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint#getSatisfiesSet <em>Satisfies Set</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage#getContainsTagConstraint()
- * @model
- * @generated
- */
-public interface ContainsTagConstraint extends EObject {
-    /**
-     * Returns the value of the '<em><b>Set Generator</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Set Generator</em>' reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Set Generator</em>' reference.
-     * @see #setSetGenerator(SetGenerator)
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage#getContainsTagConstraint_SetGenerator()
-     * @model extendedMetaData="kind='element' name='set-generator'"
-     * @generated
-     */
-    SetGenerator getSetGenerator();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint#getSetGenerator <em>Set Generator</em>}' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Set Generator</em>' reference.
-     * @see #getSetGenerator()
-     * @generated
-     */
-    void setSetGenerator(SetGenerator value);
-
-    /**
-     * Returns the value of the '<em><b>Satisfies Set</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Satisfies Set</em>' reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Satisfies Set</em>' reference.
-     * @see #setSatisfiesSet(TagSet)
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage#getContainsTagConstraint_SatisfiesSet()
-     * @model extendedMetaData="kind='element' name='satisfies-set'"
-     * @generated
-     */
-    TagSet getSatisfiesSet();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint#getSatisfiesSet <em>Satisfies Set</em>}' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Satisfies Set</em>' reference.
-     * @see #getSatisfiesSet()
-     * @generated
-     */
-    void setSatisfiesSet(TagSet value);
-
-} // ContainsTagConstraint
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/TagId.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/TagId.java
deleted file mode 100644
index 5c5ebb1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/TagId.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TagId.java,v 1.1 2007/02/28 21:16:02 cbateman Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag Id</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.validation.internal.constraints.TagId#getUri <em>Uri</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.validation.internal.constraints.TagId#getName <em>Name</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage#getTagId()
- * @model
- * @generated
- */
-public interface TagId extends EObject {
-    /**
-     * Returns the value of the '<em><b>Uri</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Uri</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Uri</em>' attribute.
-     * @see #setUri(String)
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage#getTagId_Uri()
-     * @model extendedMetaData="kind='element'"
-     * @generated
-     */
-    String getUri();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.validation.internal.constraints.TagId#getUri <em>Uri</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Uri</em>' attribute.
-     * @see #getUri()
-     * @generated
-     */
-    void setUri(String value);
-
-    /**
-     * Returns the value of the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Name</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Name</em>' attribute.
-     * @see #setName(String)
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage#getTagId_Name()
-     * @model extendedMetaData="kind='element'"
-     * @generated
-     */
-    String getName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.validation.internal.constraints.TagId#getName <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Name</em>' attribute.
-     * @see #getName()
-     * @generated
-     */
-    void setName(String value);
-
-} // TagId
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/TagSet.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/TagSet.java
deleted file mode 100644
index 5c60d5d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/TagSet.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TagSet.java,v 1.1 2007/02/28 21:16:02 cbateman Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag Set</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.validation.internal.constraints.TagSet#getTags <em>Tags</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage#getTagSet()
- * @model
- * @generated
- */
-public interface TagSet extends EObject {
-    /**
-     * Returns the value of the '<em><b>Tags</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.validation.internal.constraints.TagId}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Tags</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Tags</em>' reference list.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage#getTagSet_Tags()
-     * @model type="org.eclipse.jst.jsf.validation.internal.constraints.TagId"
-     * @generated
-     */
-    EList getTags();
-
-} // TagSet
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/ConstraintsFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/ConstraintsFactoryImpl.java
deleted file mode 100644
index f83091d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/ConstraintsFactoryImpl.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConstraintsFactoryImpl.java,v 1.2 2007/03/22 23:56:16 cbateman Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-
-import org.eclipse.jst.jsf.validation.internal.constraints.*;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class ConstraintsFactoryImpl extends EFactoryImpl implements ConstraintsFactory {
-    /**
-     * Creates the default factory implementation.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the constraints factory
-     * @generated
-     */
-    public static ConstraintsFactory init() {
-        try {
-            ConstraintsFactory theConstraintsFactory = (ConstraintsFactory)EPackage.Registry.INSTANCE.getEFactory("http://org.eclipse.jst.jsf.core/constraints.ecore"); 
-            if (theConstraintsFactory != null) {
-                return theConstraintsFactory;
-            }
-        }
-        catch (Exception exception) {
-            EcorePlugin.INSTANCE.log(exception);
-        }
-        return new ConstraintsFactoryImpl();
-    }
-
-    /**
-     * Creates an instance of the factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ConstraintsFactoryImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param eClass 
-     * @return the eobject for the class
-     * @generated
-     */
-    public EObject create(EClass eClass) {
-        switch (eClass.getClassifierID()) {
-            case ConstraintsPackage.TAG_ID: return createTagId();
-            case ConstraintsPackage.TAG_SET: return createTagSet();
-            case ConstraintsPackage.CONTAINS_TAG_CONSTRAINT: return createContainsTagConstraint();
-            default:
-                throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
-        }
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new tag id
-     * @generated
-     */
-    public TagId createTagId() {
-        TagIdImpl tagId = new TagIdImpl();
-        return tagId;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new tag set
-     * @generated
-     */
-    public TagSet createTagSet() {
-        TagSetImpl tagSet = new TagSetImpl();
-        return tagSet;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new Contains Tag Constraint
-     * @generated
-     */
-    public ContainsTagConstraint createContainsTagConstraint() {
-        ContainsTagConstraintImpl containsTagConstraint = new ContainsTagConstraintImpl();
-        return containsTagConstraint;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the constraints package
-     * @generated
-     */
-    public ConstraintsPackage getConstraintsPackage() {
-        return (ConstraintsPackage)getEPackage();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the package
-     * @deprecated
-     * @generated
-     */
-    public static ConstraintsPackage getPackage() {
-        return ConstraintsPackage.eINSTANCE;
-    }
-
-} //ConstraintsFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/ConstraintsPackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/ConstraintsPackageImpl.java
deleted file mode 100644
index fc60ec7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/ConstraintsPackageImpl.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConstraintsPackageImpl.java,v 1.3 2007/04/16 19:53:19 itrimble Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.TraitTypesPackage;
-
-import org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsFactory;
-import org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage;
-import org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint;
-import org.eclipse.jst.jsf.validation.internal.constraints.TagId;
-import org.eclipse.jst.jsf.validation.internal.constraints.TagSet;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class ConstraintsPackageImpl extends EPackageImpl implements ConstraintsPackage {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass tagIdEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass tagSetEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass containsTagConstraintEClass = null;
-
-    /**
-     * Creates an instance of the model <b>Package</b>, registered with
-     * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-     * package URI value.
-     * <p>Note: the correct way to create the package is via the static
-     * factory method {@link #init init()}, which also performs
-     * initialization of the package, or returns the registered package,
-     * if one already exists.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.emf.ecore.EPackage.Registry
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage#eNS_URI
-     * @see #init()
-     * @generated
-     */
-    private ConstraintsPackageImpl() {
-        super(eNS_URI, ConstraintsFactory.eINSTANCE);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private static boolean isInited = false;
-
-    /**
-     * Creates, registers, and initializes the <b>Package</b> for this
-     * model, and for any others upon which it depends.  Simple
-     * dependencies are satisfied by calling this method on all
-     * dependent packages before doing anything else.  This method drives
-     * initialization for interdependent packages directly, in parallel
-     * with this package, itself.
-     * <p>Of this package and its interdependencies, all packages which
-     * have not yet been registered by their URI values are first created
-     * and registered.  The packages are then initialized in two steps:
-     * meta-model objects for all of the packages are created before any
-     * are initialized, since one package's meta-model objects may refer to
-     * those of another.
-     * <p>Invocation of this method will not affect any packages that have
-     * already been initialized.
-     * <!-- begin-user-doc -->
-     * @return the initialized package 
-     * <!-- end-user-doc -->
-     * @see #eNS_URI
-     * @see #createPackageContents()
-     * @see #initializePackageContents()
-     * @generated
-     */
-    public static ConstraintsPackage init() {
-        if (isInited) return (ConstraintsPackage)EPackage.Registry.INSTANCE.getEPackage(ConstraintsPackage.eNS_URI);
-
-        // Obtain or create and register package
-        ConstraintsPackageImpl theConstraintsPackage = (ConstraintsPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof ConstraintsPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new ConstraintsPackageImpl());
-
-        isInited = true;
-
-        // Initialize simple dependencies
-        TraitTypesPackage.eINSTANCE.eClass();
-
-        // Create package meta-data objects
-        theConstraintsPackage.createPackageContents();
-
-        // Initialize created meta-data
-        theConstraintsPackage.initializePackageContents();
-
-        // Mark meta-data to indicate it can't be changed
-        theConstraintsPackage.freeze();
-
-        return theConstraintsPackage;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getTagId() {
-        return tagIdEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getTagId_Uri() {
-        return (EAttribute)tagIdEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getTagId_Name() {
-        return (EAttribute)tagIdEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getTagSet() {
-        return tagSetEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getTagSet_Tags() {
-        return (EReference)tagSetEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getContainsTagConstraint() {
-        return containsTagConstraintEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getContainsTagConstraint_SetGenerator() {
-        return (EReference)containsTagConstraintEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getContainsTagConstraint_SatisfiesSet() {
-        return (EReference)containsTagConstraintEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ConstraintsFactory getConstraintsFactory() {
-        return (ConstraintsFactory)getEFactoryInstance();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private boolean isCreated = false;
-
-    /**
-     * Creates the meta-model objects for the package.  This method is
-     * guarded to have no affect on any invocation but its first.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void createPackageContents() {
-        if (isCreated) return;
-        isCreated = true;
-
-        // Create classes and their features
-        tagIdEClass = createEClass(TAG_ID);
-        createEAttribute(tagIdEClass, TAG_ID__URI);
-        createEAttribute(tagIdEClass, TAG_ID__NAME);
-
-        tagSetEClass = createEClass(TAG_SET);
-        createEReference(tagSetEClass, TAG_SET__TAGS);
-
-        containsTagConstraintEClass = createEClass(CONTAINS_TAG_CONSTRAINT);
-        createEReference(containsTagConstraintEClass, CONTAINS_TAG_CONSTRAINT__SET_GENERATOR);
-        createEReference(containsTagConstraintEClass, CONTAINS_TAG_CONSTRAINT__SATISFIES_SET);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private boolean isInitialized = false;
-
-    /**
-     * Complete the initialization of the package and its meta-model.  This
-     * method is guarded to have no affect on any invocation but its first.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void initializePackageContents() {
-        if (isInitialized) return;
-        isInitialized = true;
-
-        // Initialize package
-        setName(eNAME);
-        setNsPrefix(eNS_PREFIX);
-        setNsURI(eNS_URI);
-
-        // Obtain other dependent packages
-        TraitTypesPackage theTraitTypesPackage = (TraitTypesPackage)EPackage.Registry.INSTANCE.getEPackage(TraitTypesPackage.eNS_URI);
-
-        // Add supertypes to classes
-
-        // Initialize classes and features; add operations and parameters
-        initEClass(tagIdEClass, TagId.class, "TagId", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getTagId_Uri(), ecorePackage.getEString(), "uri", null, 0, 1, TagId.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getTagId_Name(), ecorePackage.getEString(), "name", null, 0, 1, TagId.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(tagSetEClass, TagSet.class, "TagSet", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getTagSet_Tags(), this.getTagId(), null, "tags", null, 0, -1, TagSet.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(containsTagConstraintEClass, ContainsTagConstraint.class, "ContainsTagConstraint", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getContainsTagConstraint_SetGenerator(), theTraitTypesPackage.getSetGenerator(), null, "setGenerator", null, 0, 1, ContainsTagConstraint.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getContainsTagConstraint_SatisfiesSet(), this.getTagSet(), null, "satisfiesSet", null, 0, 1, ContainsTagConstraint.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        // Create resource
-        createResource(eNS_URI);
-
-        // Create annotations
-        // http:///org/eclipse/emf/ecore/util/ExtendedMetaData
-        createExtendedMetaDataAnnotations();
-    }
-
-    /**
-     * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void createExtendedMetaDataAnnotations() {
-        String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData";		
-        addAnnotation
-          (getTagId_Uri(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "uri"
-           });		
-        addAnnotation
-          (getTagId_Name(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "name"
-           });		
-        addAnnotation
-          (getTagSet_Tags(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "tagId"
-           });		
-        addAnnotation
-          (getContainsTagConstraint_SetGenerator(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "set-generator"
-           });		
-        addAnnotation
-          (getContainsTagConstraint_SatisfiesSet(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "satisfies-set"
-           });
-    }
-
-} //ConstraintsPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/ContainsTagConstraintImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/ContainsTagConstraintImpl.java
deleted file mode 100644
index d3fad71..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/ContainsTagConstraintImpl.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ContainsTagConstraintImpl.java,v 1.3 2007/04/16 19:53:19 itrimble Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.jsf.common.metadata.traittypes.traittypes.SetGenerator;
-
-import org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage;
-import org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint;
-import org.eclipse.jst.jsf.validation.internal.constraints.TagSet;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Contains Tag Constraint</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.validation.internal.constraints.impl.ContainsTagConstraintImpl#getSetGenerator <em>Set Generator</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.validation.internal.constraints.impl.ContainsTagConstraintImpl#getSatisfiesSet <em>Satisfies Set</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ContainsTagConstraintImpl extends EObjectImpl implements ContainsTagConstraint {
-    /**
-     * The cached value of the '{@link #getSetGenerator() <em>Set Generator</em>}' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getSetGenerator()
-     * @generated
-     * @ordered
-     */
-    protected SetGenerator setGenerator = null;
-
-    /**
-     * The cached value of the '{@link #getSatisfiesSet() <em>Satisfies Set</em>}' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getSatisfiesSet()
-     * @generated
-     * @ordered
-     */
-    protected TagSet satisfiesSet = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ContainsTagConstraintImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return ConstraintsPackage.Literals.CONTAINS_TAG_CONSTRAINT;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public SetGenerator getSetGenerator() {
-        if (setGenerator != null && setGenerator.eIsProxy()) {
-            InternalEObject oldSetGenerator = (InternalEObject)setGenerator;
-            setGenerator = (SetGenerator)eResolveProxy(oldSetGenerator);
-            if (setGenerator != oldSetGenerator) {
-                if (eNotificationRequired())
-                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SET_GENERATOR, oldSetGenerator, setGenerator));
-            }
-        }
-        return setGenerator;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the set generator
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public SetGenerator basicGetSetGenerator() {
-        return setGenerator;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setSetGenerator(SetGenerator newSetGenerator) {
-        SetGenerator oldSetGenerator = setGenerator;
-        setGenerator = newSetGenerator;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SET_GENERATOR, oldSetGenerator, setGenerator));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public TagSet getSatisfiesSet() {
-        if (satisfiesSet != null && satisfiesSet.eIsProxy()) {
-            InternalEObject oldSatisfiesSet = (InternalEObject)satisfiesSet;
-            satisfiesSet = (TagSet)eResolveProxy(oldSatisfiesSet);
-            if (satisfiesSet != oldSatisfiesSet) {
-                if (eNotificationRequired())
-                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SATISFIES_SET, oldSatisfiesSet, satisfiesSet));
-            }
-        }
-        return satisfiesSet;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * @return the tag set that must be satisfied 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public TagSet basicGetSatisfiesSet() {
-        return satisfiesSet;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setSatisfiesSet(TagSet newSatisfiesSet) {
-        TagSet oldSatisfiesSet = satisfiesSet;
-        satisfiesSet = newSatisfiesSet;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SATISFIES_SET, oldSatisfiesSet, satisfiesSet));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SET_GENERATOR:
-                if (resolve) return getSetGenerator();
-                return basicGetSetGenerator();
-            case ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SATISFIES_SET:
-                if (resolve) return getSatisfiesSet();
-                return basicGetSatisfiesSet();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SET_GENERATOR:
-                setSetGenerator((SetGenerator)newValue);
-                return;
-            case ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SATISFIES_SET:
-                setSatisfiesSet((TagSet)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SET_GENERATOR:
-                setSetGenerator((SetGenerator)null);
-                return;
-            case ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SATISFIES_SET:
-                setSatisfiesSet((TagSet)null);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SET_GENERATOR:
-                return setGenerator != null;
-            case ConstraintsPackage.CONTAINS_TAG_CONSTRAINT__SATISFIES_SET:
-                return satisfiesSet != null;
-        }
-        return super.eIsSet(featureID);
-    }
-
-} //ContainsTagConstraintImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/TagIdImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/TagIdImpl.java
deleted file mode 100644
index a4f9985..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/TagIdImpl.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TagIdImpl.java,v 1.1 2007/02/28 21:16:02 cbateman Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage;
-import org.eclipse.jst.jsf.validation.internal.constraints.TagId;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag Id</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.validation.internal.constraints.impl.TagIdImpl#getUri <em>Uri</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.validation.internal.constraints.impl.TagIdImpl#getName <em>Name</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagIdImpl extends EObjectImpl implements TagId {
-    /**
-     * The default value of the '{@link #getUri() <em>Uri</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getUri()
-     * @generated
-     * @ordered
-     */
-    protected static final String URI_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getUri() <em>Uri</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getUri()
-     * @generated
-     * @ordered
-     */
-    protected String uri = URI_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-    protected static final String NAME_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-    protected String name = NAME_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected TagIdImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return ConstraintsPackage.Literals.TAG_ID;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getUri() {
-        return uri;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setUri(String newUri) {
-        String oldUri = uri;
-        uri = newUri;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, ConstraintsPackage.TAG_ID__URI, oldUri, uri));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setName(String newName) {
-        String oldName = name;
-        name = newName;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, ConstraintsPackage.TAG_ID__NAME, oldName, name));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case ConstraintsPackage.TAG_ID__URI:
-                return getUri();
-            case ConstraintsPackage.TAG_ID__NAME:
-                return getName();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case ConstraintsPackage.TAG_ID__URI:
-                setUri((String)newValue);
-                return;
-            case ConstraintsPackage.TAG_ID__NAME:
-                setName((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case ConstraintsPackage.TAG_ID__URI:
-                setUri(URI_EDEFAULT);
-                return;
-            case ConstraintsPackage.TAG_ID__NAME:
-                setName(NAME_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case ConstraintsPackage.TAG_ID__URI:
-                return URI_EDEFAULT == null ? uri != null : !URI_EDEFAULT.equals(uri);
-            case ConstraintsPackage.TAG_ID__NAME:
-                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (uri: ");
-        result.append(uri);
-        result.append(", name: ");
-        result.append(name);
-        result.append(')');
-        return result.toString();
-    }
-
-} //TagIdImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/TagSetImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/TagSetImpl.java
deleted file mode 100644
index f389914..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/impl/TagSetImpl.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TagSetImpl.java,v 1.1 2007/02/28 21:16:02 cbateman Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-
-import org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage;
-import org.eclipse.jst.jsf.validation.internal.constraints.TagId;
-import org.eclipse.jst.jsf.validation.internal.constraints.TagSet;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag Set</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.validation.internal.constraints.impl.TagSetImpl#getTags <em>Tags</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagSetImpl extends EObjectImpl implements TagSet {
-    /**
-     * The cached value of the '{@link #getTags() <em>Tags</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTags()
-     * @generated
-     * @ordered
-     */
-    protected EList tags = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected TagSetImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return ConstraintsPackage.Literals.TAG_SET;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getTags() {
-        if (tags == null) {
-            tags = new EObjectResolvingEList(TagId.class, this, ConstraintsPackage.TAG_SET__TAGS);
-        }
-        return tags;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case ConstraintsPackage.TAG_SET__TAGS:
-                return getTags();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case ConstraintsPackage.TAG_SET__TAGS:
-                getTags().clear();
-                getTags().addAll((Collection)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case ConstraintsPackage.TAG_SET__TAGS:
-                getTags().clear();
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case ConstraintsPackage.TAG_SET__TAGS:
-                return tags != null && !tags.isEmpty();
-        }
-        return super.eIsSet(featureID);
-    }
-
-} //TagSetImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsAdapterFactory.java
deleted file mode 100644
index ff1de0e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsAdapterFactory.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConstraintsAdapterFactory.java,v 1.1 2007/02/28 21:16:02 cbateman Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.jsf.validation.internal.constraints.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage
- * @generated
- */
-public class ConstraintsAdapterFactory extends AdapterFactoryImpl {
-    /**
-     * The cached model package.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected static ConstraintsPackage modelPackage;
-
-    /**
-     * Creates an instance of the adapter factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ConstraintsAdapterFactory() {
-        if (modelPackage == null) {
-            modelPackage = ConstraintsPackage.eINSTANCE;
-        }
-    }
-
-    /**
-     * Returns whether this factory is applicable for the type of the object.
-     * <!-- begin-user-doc -->
-     * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-     * <!-- end-user-doc -->
-     * @return whether this factory is applicable for the type of the object.
-     * @generated
-     */
-    public boolean isFactoryForType(Object object) {
-        if (object == modelPackage) {
-            return true;
-        }
-        if (object instanceof EObject) {
-            return ((EObject)object).eClass().getEPackage() == modelPackage;
-        }
-        return false;
-    }
-
-    /**
-     * The switch the delegates to the <code>createXXX</code> methods.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ConstraintsSwitch modelSwitch =
-        new ConstraintsSwitch() {
-            public Object caseTagId(TagId object) {
-                return createTagIdAdapter();
-            }
-            public Object caseTagSet(TagSet object) {
-                return createTagSetAdapter();
-            }
-            public Object caseContainsTagConstraint(ContainsTagConstraint object) {
-                return createContainsTagConstraintAdapter();
-            }
-            public Object defaultCase(EObject object) {
-                return createEObjectAdapter();
-            }
-        };
-
-    /**
-     * Creates an adapter for the <code>target</code>.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param target the object to adapt.
-     * @return the adapter for the <code>target</code>.
-     * @generated
-     */
-    public Adapter createAdapter(Notifier target) {
-        return (Adapter)modelSwitch.doSwitch((EObject)target);
-    }
-
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.validation.internal.constraints.TagId <em>Tag Id</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.TagId
-     * @generated
-     */
-    public Adapter createTagIdAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.validation.internal.constraints.TagSet <em>Tag Set</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.TagSet
-     * @generated
-     */
-    public Adapter createTagSetAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint <em>Contains Tag Constraint</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.validation.internal.constraints.ContainsTagConstraint
-     * @generated
-     */
-    public Adapter createContainsTagConstraintAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for the default case.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @generated
-     */
-    public Adapter createEObjectAdapter() {
-        return null;
-    }
-
-} //ConstraintsAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsResourceFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsResourceFactoryImpl.java
deleted file mode 100644
index e0da2ca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsResourceFactoryImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConstraintsResourceFactoryImpl.java,v 1.1 2007/02/28 21:16:02 cbateman Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints.util;
-
-import org.eclipse.emf.common.util.URI;
-
-import org.eclipse.emf.ecore.resource.Resource;
-
-import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl;
-
-import org.eclipse.emf.ecore.xmi.XMLResource;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource Factory</b> associated with the package.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.validation.internal.constraints.util.ConstraintsResourceImpl
- * @generated
- */
-public class ConstraintsResourceFactoryImpl extends ResourceFactoryImpl {
-    /**
-     * Creates an instance of the resource factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ConstraintsResourceFactoryImpl() {
-        super();
-    }
-
-    /**
-     * Creates an instance of the resource.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Resource createResource(URI uri) {
-        XMLResource result = new ConstraintsResourceImpl(uri);
-        result.getDefaultSaveOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-        result.getDefaultLoadOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-
-        result.getDefaultSaveOptions().put(XMLResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE);
-
-        result.getDefaultLoadOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
-        result.getDefaultSaveOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
-
-        result.getDefaultLoadOptions().put(XMLResource.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);
-        return result;
-    }
-
-} //ConstraintsResourceFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsResourceImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsResourceImpl.java
deleted file mode 100644
index c397df0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsResourceImpl.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConstraintsResourceImpl.java,v 1.1 2007/02/28 21:16:02 cbateman Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints.util;
-
-import org.eclipse.emf.common.util.URI;
-
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource </b> associated with the package.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.validation.internal.constraints.util.ConstraintsResourceFactoryImpl
- * @generated
- */
-public class ConstraintsResourceImpl extends XMLResourceImpl {
-    /**
-     * Creates an instance of the resource.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param uri the URI of the new resource.
-     * @generated
-     */
-    public ConstraintsResourceImpl(URI uri) {
-        super(uri);
-    }
-
-} //ConstraintsResourceImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsSwitch.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsSwitch.java
deleted file mode 100644
index 9628616..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsSwitch.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConstraintsSwitch.java,v 1.2 2007/04/09 02:40:07 cbateman Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.jsf.validation.internal.constraints.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage
- * @generated
- */
-public class ConstraintsSwitch {
-    /**
-     * The cached model package
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected static ConstraintsPackage modelPackage;
-
-    /**
-     * Creates an instance of the switch.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ConstraintsSwitch() {
-        if (modelPackage == null) {
-            modelPackage = ConstraintsPackage.eINSTANCE;
-        }
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param theEObject 
-     * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    public Object doSwitch(EObject theEObject) {
-        return doSwitch(theEObject.eClass(), theEObject);
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param theEClass 
-     * @param theEObject 
-     * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    protected Object doSwitch(EClass theEClass, EObject theEObject) {
-        if (theEClass.eContainer() == modelPackage) {
-            return doSwitch(theEClass.getClassifierID(), theEObject);
-        }
-        List eSuperTypes = theEClass.getESuperTypes();
-        return
-            eSuperTypes.isEmpty() ?
-                defaultCase(theEObject) :
-                doSwitch((EClass)eSuperTypes.get(0), theEObject);
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-     * @param classifierID 
-     * @param theEObject 
-     * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-    protected Object doSwitch(int classifierID, EObject theEObject) {
-        switch (classifierID) {
-            case ConstraintsPackage.TAG_ID: {
-                TagId tagId = (TagId)theEObject;
-                Object result = caseTagId(tagId);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case ConstraintsPackage.TAG_SET: {
-                TagSet tagSet = (TagSet)theEObject;
-                Object result = caseTagSet(tagSet);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case ConstraintsPackage.CONTAINS_TAG_CONSTRAINT: {
-                ContainsTagConstraint containsTagConstraint = (ContainsTagConstraint)theEObject;
-                Object result = caseContainsTagConstraint(containsTagConstraint);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            default: return defaultCase(theEObject);
-        }
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Tag Id</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Tag Id</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseTagId(TagId object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Tag Set</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Tag Set</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseTagSet(TagSet object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Contains Tag Constraint</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Contains Tag Constraint</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseContainsTagConstraint(ContainsTagConstraint object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>EObject</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch, but this is the last case anyway.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>EObject</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-     * @generated
-     */
-    public Object defaultCase(EObject object) {
-        return null;
-    }
-
-} //ConstraintsSwitch
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsXMLProcessor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsXMLProcessor.java
deleted file mode 100644
index 3d80420..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/constraints/util/ConstraintsXMLProcessor.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConstraintsXMLProcessor.java,v 1.1 2007/02/28 21:16:02 cbateman Exp $
- */
-package org.eclipse.jst.jsf.validation.internal.constraints.util;
-
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EPackage;
-
-import org.eclipse.emf.ecore.xmi.util.XMLProcessor;
-
-import org.eclipse.jst.jsf.validation.internal.constraints.ConstraintsPackage;
-
-/**
- * This class contains helper methods to serialize and deserialize XML documents
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ConstraintsXMLProcessor extends XMLProcessor {
-    /**
-     * Public constructor to instantiate the helper.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ConstraintsXMLProcessor() {
-        super((EPackage.Registry.INSTANCE));
-        ConstraintsPackage.eINSTANCE.eClass();
-    }
-    
-    /**
-     * Register for "*" and "xml" file extensions the ConstraintsResourceFactoryImpl factory.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected Map getRegistrations() {
-        if (registrations == null) {
-            super.getRegistrations();
-            registrations.put(XML_EXTENSION, new ConstraintsResourceFactoryImpl());
-            registrations.put(STAR_EXTENSION, new ConstraintsResourceFactoryImpl());
-        }
-        return registrations;
-    }
-
-} //ConstraintsXMLProcessor
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/ASTSemanticValidator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/ASTSemanticValidator.java
deleted file mode 100644
index e1b340b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/ASTSemanticValidator.java
+++ /dev/null
@@ -1,637 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.types.BooleanLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.FloatLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.IntegerLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.MethodType;
-import org.eclipse.jst.jsf.common.internal.types.NullLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.SignatureBasedType;
-import org.eclipse.jst.jsf.common.internal.types.StringLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.symbol.IInstanceSymbol;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.internal.util.IObjectSymbolBasedValueType;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.resolver.ISymbolContextResolver;
-import org.eclipse.jst.jsf.designtime.resolver.StructuredDocumentSymbolResolverFactory;
-import org.eclipse.jst.jsf.validation.internal.ELValidationPreferences;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.ValidationMessageFactory;
-import org.eclipse.jst.jsf.validation.internal.el.operators.BinaryOperator;
-import org.eclipse.jst.jsf.validation.internal.el.operators.BracketOperator;
-import org.eclipse.jst.jsf.validation.internal.el.operators.DotOperator;
-import org.eclipse.jst.jsf.validation.internal.el.operators.TernaryChoiceOperator;
-import org.eclipse.jst.jsf.validation.internal.el.operators.UnaryOperator;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTAddExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTAndExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTChoiceExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTEqualityExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTFunctionInvocation;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTLiteral;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTMultiplyExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTOperatorExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTOrExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTRelationalExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTUnaryExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTValue;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTValuePrefix;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTValueSuffix;
-import org.eclipse.jst.jsp.core.internal.java.jspel.JSPELParser;
-import org.eclipse.jst.jsp.core.internal.java.jspel.JSPELParserConstants;
-import org.eclipse.jst.jsp.core.internal.java.jspel.JSPELParserVisitor;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ParseException;
-import org.eclipse.jst.jsp.core.internal.java.jspel.SimpleNode;
-import org.eclipse.jst.jsp.core.internal.java.jspel.Token;
-import org.eclipse.wst.validation.internal.core.Message;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-import org.eclipse.wst.validation.internal.provisional.core.IReporter;
-import org.eclipse.wst.validation.internal.provisional.core.IValidator;
-
-
-class ASTSemanticValidator implements JSPELParserVisitor, IExpressionSemanticValidator
-{
-	private final IFile								_targetFile;
-	private final ASTExpression 					_expr;
-	private final IStructuredDocumentContext		_context;
-	private final ISymbolContextResolver			_symbolResolver;
-	private final List<IMessage>					_messages;
-	private final EvaluationTracker                 _tracker;
-	private final DiagnosticFactory                 _diagnosticFactory;
-	private final ELValidationPreferences           _prefs;
-    private boolean                                 _validatorHasBeenCalled; //=false
-    
-	ASTSemanticValidator(ASTExpression expr, IStructuredDocumentContext context, ELValidationPreferences prefs)
-	{
-		final IWorkspaceContextResolver resolver = 
-            IStructuredDocumentContextResolverFactory.
-                INSTANCE.getWorkspaceContextResolver(context);
-        
-		if (resolver != null)
-		{
-			_targetFile = (IFile) resolver.getResource();
-		}
-		else
-		{
-			_targetFile = null;
-		}
-        
-		_expr = expr;
-		_context = context;
-		_symbolResolver = StructuredDocumentSymbolResolverFactory.getInstance().getSymbolContextResolver(_context);
-		_messages = new ArrayList<IMessage>();
-        _tracker = new EvaluationTracker();
-        _diagnosticFactory = new DiagnosticFactory();
-        _prefs = prefs;
-	}
-	
-	/* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.validation.internal.el.IExpressionSemanticValidator#validate()
-     */
-	public void validate()
-	{
-		_expr.jjtAccept(this, _tracker);
-        _validatorHasBeenCalled = true;
-	}
-	
-	public Object visit(ASTAddExpression node, Object data) 
-	{
-        performBinaryEvaluation(node, (EvaluationTracker)data);
-        return data;
-	}
-
-	public Object visit(ASTAndExpression node, Object data) 
-	{
-        performBinaryEvaluation(node, (EvaluationTracker)data);
-        return data;
-	}
-
-	public Object visit(ASTChoiceExpression node, Object data) 
-    {
-        if (node.jjtGetNumChildren() != 3)
-        {
-            throw new AssertionError("Binary operators should always have two sub-expressions");
-        }
-        
-        // evaluate choice argument
-        node.jjtGetChild(0).jjtAccept(this, data);
-        final ValueType choiceArg = ((EvaluationTracker)data).getValueType();
-        // evaluate when true argument
-        node.jjtGetChild(1).jjtAccept(this, data);
-        final ValueType whenTrueArg = ((EvaluationTracker)data).getValueType();
-        //evaluate when false argument
-        node.jjtGetChild(2).jjtAccept(this, data);
-        final ValueType whenFalseArg = ((EvaluationTracker)data).getValueType();
-        
-        
-        if (choiceArg != null && whenTrueArg != null && whenFalseArg != null)
-        {
-            final TernaryChoiceOperator operator = 
-                new TernaryChoiceOperator(_diagnosticFactory);
-            
-            final Diagnostic diagnostic = 
-                operator.validate(choiceArg/* whenTrueArg, whenFalseArg*/);
-            
-            if (diagnostic.getSeverity() != Diagnostic.OK)
-            {
-                final Token firstToken = node.getFirstToken();
-                final int offset = _context.getDocumentPosition() + firstToken.beginColumn - 1;
-                final int length = node.getLastToken().endColumn - firstToken.beginColumn+1;
-                final Message message = 
-                    ValidationMessageFactory.createFromDiagnostic(diagnostic, 
-                                                   offset, length, _targetFile, _prefs);
-                _messages.add(message);
-            }
-            
-            ((EvaluationTracker)data).setType(operator.perform(choiceArg, whenTrueArg, whenFalseArg));
-        }
-        else
-        {
-            ((EvaluationTracker)data).setType(null);
-        }
-
-        return data;
-	}
-
-	public Object visit(ASTEqualityExpression node, Object data) 
-    {
-        performBinaryEvaluation(node, (EvaluationTracker)data);
-        return data;
-    }
-
-	public Object visit(ASTExpression node, Object data) {
-		return node.childrenAccept(this, data);
-	}
-
-	public Object visit(ASTFunctionInvocation node, Object data) 
-    {
-	    // when we see a function invocation, null the type
-        // we do not validate function invocations currently
-        Object retVal = node.childrenAccept(this, data);
-        ((EvaluationTracker)data).setType(null);
-        return retVal;
-	}
-
-	public Object visit(ASTLiteral node, Object data) 
-    {
-        // note, there is an implicit assumption here that literals
-        // are all terminals (leafs in the tree)
-        if (node.jjtGetNumChildren() > 0)
-        {
-            throw new AssertionError("Literals should be terminal");
-        }
-        
-        LiteralType type = null;
-        
-        Token  literalToken = node.getFirstToken();
-        
-        switch (literalToken.kind)
-        {
-            case JSPELParserConstants.STRING_LITERAL:
-                type = new StringLiteralType(stripQuotes(literalToken.image));
-            break;
-            
-            case JSPELParserConstants.INTEGER_LITERAL:
-                type = new IntegerLiteralType(Long.parseLong(literalToken.image));
-            break;
-        
-            case JSPELParserConstants.FLOATING_POINT_LITERAL:
-                type = new FloatLiteralType(Double.parseDouble(literalToken.image));
-            break;
-            
-            case JSPELParserConstants.FALSE:
-                type = BooleanLiteralType.FALSE;
-            break;
-            
-            case JSPELParserConstants.TRUE:
-                type = BooleanLiteralType.TRUE;
-            break;
-            
-            case JSPELParserConstants.NULL:
-                type = NullLiteralType.SINGLETON;
-            break;
-            
-            default:
-                JSFCorePlugin.log("Unknown EL literal: " +literalToken.toString(), new Throwable("This throwable simply used to mark a stack trace"));
-        }
-
-        ((EvaluationTracker)data).setType(type);
-        return data;
-	}
-
-    private String stripQuotes(String stringLiteral)
-    {
-        if (stringLiteral.startsWith("'")
-                || stringLiteral.startsWith("\""))
-                        
-        {
-            if (stringLiteral.length() > 2)
-            {
-                // take 'literal' -> literal
-                return stringLiteral.substring(1, stringLiteral.length()-1);
-            }
-            // if only two characters, then the empty string
-            return "";
-        }
-        
-        return stringLiteral;
-    }
-    
-	public Object visit(ASTMultiplyExpression node, Object data) 
-    {
-        performBinaryEvaluation(node, (EvaluationTracker)data);
-        return data;
-	}
-
-	public Object visit(ASTOrExpression node, Object data) 
-    {
-	    performBinaryEvaluation(node, (EvaluationTracker)data);
-        return data;
-	}
-
-	public Object visit(ASTRelationalExpression node, Object data) 
-    {
-        performBinaryEvaluation(node, (EvaluationTracker)data);
-        return data;
-	}
-
-	public Object visit(ASTUnaryExpression node, Object data) 
-    {
-        // assertion here is that this expression decomposes:
-        // UnaryExpr -> Value
-        // UnaryExpr -> UnaryOp UnaryExpression
-        // since UnaryOp is a terminal (-,!,not,empty) node will
-        // always have exactly one child
-        node.childrenAccept(this, data);
-        final SignatureBasedType type = ((EvaluationTracker)data).getType();
-        
-        if (type != null)
-        {
-            final Token  firstToken = node.getFirstToken();
-            if (UnaryOperator.isUnaryOperator(firstToken))
-            {
-                if (type instanceof ValueType)
-                {
-                    final UnaryOperator unaryOp = UnaryOperator.createUnaryOperator(firstToken, _diagnosticFactory);
-                    final Diagnostic diagnostic = unaryOp.validate((ValueType)type);
-                    
-                    if (diagnostic.getSeverity() != Diagnostic.OK)
-                    {
-                        final int offset = _context.getDocumentPosition() + firstToken.beginColumn - 1;
-                        final int length = node.getLastToken().endColumn - firstToken.beginColumn+1;
-                        final Message message = 
-                            ValidationMessageFactory.createFromDiagnostic(diagnostic, offset, length, _targetFile,_prefs);
-                        _messages.add(message);
-                    }
-   
-                    ((EvaluationTracker)data).
-                            setType(unaryOp.performOperation ((ValueType)type));
-                }
-                // cannot apply operations to method bindings
-                else
-                {
-                    final int offset = _context.getDocumentPosition() + 
-                                    firstToken.beginColumn - 1;
-                    final int length = node.getLastToken().endColumn - 
-                                        firstToken.beginColumn+1;
-                    
-                    _messages.add(ValidationMessageFactory.
-                            createFromDiagnostic(_diagnosticFactory.create_CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING(),
-                                    offset, length, _targetFile,_prefs));
-                }
-            }
-        }
-
-        return data;
-	}
-
-	public Object visit(ASTValue node, final Object data) {
-        ValueExpressionTracker  tracker = new ValueExpressionTracker();
-        
-        ((EvaluationTracker)data).setValueTracker(tracker);
-        
-		node.childrenAccept(this, data);
-        
-        SignatureBasedType type = ((EvaluationTracker)data).getType();
-        
-        // now check the tracker.  If the last property in the expression
-        // is non-null (i.e. the value has one or more suffices) then we
-        // to very the leaf node (i.e. 'z' in #{x.y.z}) is more than just
-        // an intermediate value used to get to other properties
-        if (type instanceof IObjectSymbolBasedValueType
-                && ((IObjectSymbolBasedValueType)type).getSymbol() instanceof IPropertySymbol
-                && ((IPropertySymbol)((IObjectSymbolBasedValueType)type).getSymbol()).isIntermediate())
-        {
-            final int problemStartOffset = tracker.getCurPropertySymbolOffset();
-            final int length = tracker.getCurPropertySymbolLength();
-            _messages.add(ValidationMessageFactory.createFromDiagnostic(
-                    _diagnosticFactory.create_MEMBER_IS_INTERMEDIATE(
-                        ((IPropertySymbol)((IObjectSymbolBasedValueType)type).getSymbol()).getName())
-                        , problemStartOffset, length, _targetFile, _prefs));
-        }
-            
-        return data;
-	}
-
-	public Object visit(ASTValuePrefix node, final Object data) 
-    {
-		if (node.jjtGetNumChildren() == 0)
-		{
-			final Token token = node.getFirstToken();
-			final String image = token.image;
-
-			final ISymbol symbol = _symbolResolver.getVariable(image);
-
-			if (symbol == null)
-			{
-                final int problemStartOffset = 
-                    _context.getDocumentPosition() + token.beginColumn - 1;
-                final int length = token.endColumn - token.beginColumn + 1;
- 
-                final Diagnostic diag =  
-                    _diagnosticFactory.create_VARIABLE_NOT_FOUND(image);
-                
-                if (diag.getSeverity() != Diagnostic.OK)
-                {
-    				_messages.add(
-    				    ValidationMessageFactory.createFromDiagnostic(diag, 
-    	                        problemStartOffset, length, _targetFile, _prefs));
-                }
-			}
-			else if (symbol instanceof IInstanceSymbol)
-			{
-                final IObjectSymbolBasedValueType symbolType =
-                    IObjectSymbolBasedValueType.getInstance(symbol);
-                ((EvaluationTracker) data).setType(symbolType);
-			}
-		}
-
-		return node.childrenAccept(this, data);
-	}
-
-	public Object visit(final ASTValueSuffix node, final Object data) 
-    {
-        final ValueExpressionTracker tracker = ((EvaluationTracker) data).getValueTracker();
-        final SignatureBasedType type = ((EvaluationTracker) data).getType();
-        
-        if (type instanceof IObjectSymbolBasedValueType)
-        {
-            final IObjectSymbolBasedValueType symbolType = 
-                (IObjectSymbolBasedValueType) type;
-    		final Token firstToken = node.getFirstToken();
-    
-    		if (node.jjtGetNumChildren() == 0
-    				&& firstToken.kind == JSPELParserConstants.DOT)
-    		{
-    			final Token dotId = node.getLastToken();
-    
-                final int startOffset = 
-                    _context.getDocumentPosition() + dotId.beginColumn - 1;
-                final int length = dotId.endColumn - dotId.beginColumn + 1;
-
-                final DotOperator dotOp = new DotOperator(_diagnosticFactory, _targetFile);
-
-                final StringLiteralType  suffixLiteral = new StringLiteralType(dotId.image);
-                Diagnostic diag = 
-                    dotOp.validate(symbolType, 
-                                        suffixLiteral);
-                
-			    if (diag.getSeverity() != Diagnostic.OK)
-			    {
-			        _messages.add(ValidationMessageFactory.createFromDiagnostic(
-                         diag, startOffset, length, _targetFile, _prefs));
-                    ((EvaluationTracker) data).setType(null);
-                }
-                else
-                {
-//                    // if the base (value-a) is a map, then using the bracket value-a['y'] type
-//                    // syntax is recommended.  Note that we do this here instead of 
-//                    // DotOperator so that we don't tie the default property resolver
-//                    // behaviour to that operator class.  If someone changes the rules
-//                    // of how the prop resolver interprets the base, then they may want to
-//                    // write their own validator that doesn't do this
-//                    if (symbolType.getSymbol().supportsCoercion(TypeConstants.TYPE_MAP))
-//                    {
-//                        _messages.add(ValidationMessageFactory.createFromDiagnostic(
-//                                DiagnosticFactory.create_BINARY_OP_DOT_WITH_VALUEA_MAP_SHOULD_USE_ARRAY
-//                                    (symbolType.getSymbol().getName(), dotId.image), 
-//                                        startOffset, length, _targetFile));
-//                    }
-                    
-                    ((EvaluationTracker) data).setType(dotOp.performOperation(symbolType, 
-                            suffixLiteral));
-                    tracker.setCurMemberSymbol(startOffset, length);
-                }
-                
-                // we finished with the single dot suffix here
-                return data;
-    		}
-            else if (firstToken.kind == JSPELParserConstants.LBRACKET)
-            {
-                final EvaluationTracker subExprTracker = new EvaluationTracker();
-                node.childrenAccept(this, subExprTracker);
-
-                final SignatureBasedType subExprType = subExprTracker.getType();
-
-                if (subExprType instanceof ValueType)
-                {
-                    final Token lastToken = node.getLastToken();
-                    final int startOffset = 
-                        _context.getDocumentPosition() + firstToken.beginColumn - 1;
-                    final int length = lastToken.endColumn - firstToken.beginColumn + 1;
-
-                    final BracketOperator  bracketOperator = new BracketOperator(_diagnosticFactory, _targetFile);
-                    
-                    final Diagnostic diag = 
-                        bracketOperator.validate(symbolType, 
-                                            (ValueType)subExprType);
-
-                    if (diag.getSeverity() != Diagnostic.OK)
-                    {
-                        _messages.add(ValidationMessageFactory.createFromDiagnostic(
-                                diag, 
-                                startOffset, length, _targetFile, _prefs));
-                        ((EvaluationTracker) data).setType(null);
-                    }
-                    else
-                    {
-                        ((EvaluationTracker) data).setType(bracketOperator.performOperation(symbolType, 
-                                (ValueType)subExprType));
-                        tracker.setCurMemberSymbol(startOffset, length);
-                    }
-                }
-                // we are finished with the bracketed suffix at this point.
-                return data;
-            }
-        }
-        
-        // don't bother to accept children, since if we haven't done
-        // something above, there's not much sensible we can do with it
-        // clear the type first though
-        ((EvaluationTracker) data).setType(null);
-		return data; //node.childrenAccept(this, data);
-	}
-
-	public Object visit(SimpleNode node, Object data) {
-		return node.childrenAccept(this, data);
-	}
-
-	/**
-	 * Copies stored messages into the validation reporter 
-	 * @param validator
-	 * @param reporter
-	 */
-	public void reportFindings(IValidator validator, IReporter reporter)
-	{
-		for (final Iterator<IMessage> it = _messages.iterator(); it.hasNext();)
-		{
-		    IMessage message = it.next();
-		    
-		    // don't report messages that have no severity.
-		    if ((message.getSeverity() & IMessage.ALL_MESSAGES) != 0)
-		    {
-		        reporter.addMessage(validator, message);
-		    }
-		}
-	}
-    
-    private void performBinaryEvaluation(ASTOperatorExpression node, EvaluationTracker tracker)
-    {
-        if (node.jjtGetNumChildren() < 2)
-        {
-            throw new AssertionError("Binary operators should always have at least two sub-expressions");
-        }
-        else if (node.getOperatorTokens().size() != node.jjtGetNumChildren()-1)
-        {
-            throw new AssertionError("Binary operators should always have one operator token less than number of sub-expressions");
-        }
-        
-        // evaluate left-most argument
-        node.jjtGetChild(0).jjtAccept(this, tracker);
-        
-        ValueType curType = getValueTypeForBinaryOperation(tracker.getType(), (SimpleNode) node.jjtGetChild(0)); 
-            
-        for (int child = 1; child < node.jjtGetNumChildren(); child++)
-        {
-            // evaluate next argument running left-to-right
-            node.jjtGetChild(child).jjtAccept(this, tracker);
-            final ValueType secondType = 
-                getValueTypeForBinaryOperation(tracker.getType(), (SimpleNode) node.jjtGetChild(child));
-            
-            if (curType != null && secondType != null)
-            {
-                final BinaryOperator operator = 
-                    BinaryOperator.getBinaryOperator((Token)node.getOperatorTokens().get(child-1), _diagnosticFactory, _context);
-                
-                final Diagnostic diagnostic = operator.validate(curType, secondType);
-                
-                if (diagnostic.getSeverity() != Diagnostic.OK)
-                {
-                    final Token firstToken = node.getFirstToken();
-                    final int offset = _context.getDocumentPosition() + firstToken.beginColumn - 1;
-                    final int length = node.getLastToken().endColumn - firstToken.beginColumn+1;
-                    final Message message = 
-                        ValidationMessageFactory.createFromDiagnostic
-                                (diagnostic, offset, length, _targetFile, _prefs);
-                    _messages.add(message);
-                }
-                
-                curType = operator.performOperation(curType, secondType);
-            }
-        }
-        
-        tracker.setType(curType);
-    }
-
-    private ValueType getValueTypeForBinaryOperation(SignatureBasedType type, SimpleNode node)
-    {
-        if (type instanceof ValueType)
-        {
-            return (ValueType) type;
-        }
-        else if (type instanceof MethodType)
-        {
-            final int offset = _context.getDocumentPosition() + node.getFirstToken().beginColumn - 1;
-            final int length = node.getLastToken().endColumn - node.getFirstToken().beginColumn+1;
-            
-            _messages.add(ValidationMessageFactory.createFromDiagnostic
-                    (_diagnosticFactory.create_CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING(), 
-                            offset, length, _targetFile, _prefs));
-        }
-
-        return null;
-    }
-    
-	/* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.validation.internal.el.IExpressionSemanticValidator#getMessages()
-     */
-	public List getMessages()
-	{
-	    if (!_validatorHasBeenCalled)
-        {
-	        throw new AssertionError("Should not call getMessages before validate has been called");
-        }
-		return _messages;
-	}
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.validation.internal.el.IExpressionSemanticValidator#getExpressionType()
-     */
-    public SignatureBasedType getExpressionType()
-    {
-        return _tracker.getType();
-    }
-    
-    /**
-     * @param args
-     * @throws IOException
-     * @throws ParseException 
-     */
-    public static void main(String[] args) throws IOException, ParseException
-    {
-        String elText = "";
-        int nextCharacter;
-        
-        while(((nextCharacter = System.in.read()) != -1))
-        {
-            char nextChar = (char) nextCharacter;
-            
-            if (nextChar == '\n')
-            {
-                JSPELParser parser = JSPELParser.createParser(elText);
-                ASTExpression expr = parser.Expression();
-                expr.dump("");
-                
-                elText = "";
-            }
-            else
-            {
-                elText += nextChar;
-            }   
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/ELExpressionValidator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/ELExpressionValidator.java
deleted file mode 100644
index 351c8f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/ELExpressionValidator.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jst.jsf.common.internal.types.CompositeType;
-import org.eclipse.jst.jsf.common.internal.types.SignatureBasedType;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.validation.internal.ELValidationPreferences;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.ValidationMessageFactory;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ASTExpression;
-import org.eclipse.jst.jsp.core.internal.java.jspel.JSPELParser;
-import org.eclipse.jst.jsp.core.internal.java.jspel.ParseException;
-import org.eclipse.jst.jsp.core.internal.java.jspel.Token;
-import org.eclipse.jst.jsp.core.internal.java.jspel.TokenMgrError;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-import org.eclipse.wst.validation.internal.provisional.core.IReporter;
-import org.eclipse.wst.validation.internal.provisional.core.IValidator;
-
-/**
- * Validates a single expression string
- * 
- * @author cbateman
- *
- */
-public class ELExpressionValidator 
-{
-    private final IStructuredDocumentContext        _context;
-    private final String                            _elText;
-    private final IFile                             _file;
-    private final DiagnosticFactory                 _diagnosticFactory;
-    private final ELValidationPreferences           _prefs;
-    
-    private final List<IMessage>                    _syntaxProblems;
-    private ASTSemanticValidator                    _semanticValidator;
-    
-    /**
-     * @param context
-     * @param elText
-     * @param file
-     * @param prefs 
-     */
-    public ELExpressionValidator(final IStructuredDocumentContext context,
-                                 final String elText, 
-                                 final IFile file,
-                                 final ELValidationPreferences prefs)
-    {
-        _context = context;
-        _elText = elText;
-        _file = file;
-        _prefs = prefs;
-        _diagnosticFactory = new DiagnosticFactory();
-        _syntaxProblems = new ArrayList<IMessage>();
-    }
-    
-    /**
-     * Validates a single EL expression in an XML attribute value
-     * @return an ASTExpression for the node
-     */
-    public ASTExpression validateXMLNode() 
-    {
-        JSPELParser elParser = JSPELParser.createParser(_elText);
-        // = 
-        try {
-            //final long startParsing = System.currentTimeMillis();
-            final ASTExpression expr =  elParser.Expression();
-            //final long endParsing = System.currentTimeMillis();
-            //final long startSemantics = System.currentTimeMillis();
-            validateSemantics(expr, _context);
-            //final long endSemantics = System.currentTimeMillis();
-
-            
-            //System.out.println("Time to parse '"+elText+"' = "+(endParsing-startParsing));
-            //System.out.println("Time to semantic checking '"+elText+"' = "+(endSemantics-startSemantics));
-            
-            // if the parser bailed before parsing the whole
-            // expression, raise a warning that there is probably
-            // some syntatical issue
-            if (expr.getLastToken().endColumn < _elText.trim().length()-1)
-            {
-                int offset = _context.getDocumentPosition() + expr.getLastToken().endColumn;
-                int length = _elText.trim().length() - expr.getLastToken().endColumn;
-
-                _syntaxProblems.add(
-                    ValidationMessageFactory.createFromDiagnostic(
-                            _diagnosticFactory.create_GENERAL_SYNTAX_ERROR(), 
-                                offset, length, _file, _prefs));
-            }
-            
-            return expr;
-        }
-        catch (ParseException e) {
-            Token curTok = e.currentToken;
-            int offset = _context.getDocumentPosition() + curTok.beginColumn;
-            int length = curTok.endColumn - curTok.beginColumn + 1;
-            _syntaxProblems.add(
-                    ValidationMessageFactory.createFromDiagnostic(
-                            _diagnosticFactory.create_GENERAL_SYNTAX_ERROR(), 
-                                offset, length, _file, _prefs));
-            return null;
-        }
-        catch (TokenMgrError te) {
-            final int offset = _context.getDocumentPosition();
-            final int length = _elText.length();
-            _syntaxProblems.add(
-                    ValidationMessageFactory.createFromDiagnostic(
-                            _diagnosticFactory.create_GENERAL_SYNTAX_ERROR(), 
-                                offset, length, _file, _prefs));
-            return null;
-        }
-    }
-
-    /**
-     * Report the results of this EL Expression validation to reportor
-     * using validator as a source
-     * 
-     * @param validator
-     * @param reporter
-     */
-    public void reportFindings(IValidator validator, IReporter reporter)
-    {
-        for (final Iterator<IMessage> it = _syntaxProblems.iterator(); it.hasNext();)
-        {
-            IMessage message = it.next();
-            
-            // don't report messages that have no severity level
-            if ((message.getSeverity() & IMessage.ALL_MESSAGES) != 0)
-            {
-                reporter.addMessage(validator, message);
-            }
-        }
-        
-        if (_semanticValidator != null)
-        {
-            _semanticValidator.reportFindings(validator,reporter);
-        }
-    }
-
-    /**
-     * @return the type of the expression or null if 
-     * the type could not be evaluated
-     */
-    public CompositeType getExpressionType()
-    {
-        if (_semanticValidator != null)
-        {
-            final SignatureBasedType type = 
-                _semanticValidator.getExpressionType();
-            
-            if (type != null)
-            {
-                return type.toCompositeType();
-            }
-        }
-        
-        return null;
-    }
-    
-    /**
-     * @return an unmodifiable list containing all the detected syntax errors
-     * or an empty list if validate has not yet been called.
-     */
-    public List<IMessage> getSyntaxProblems()
-    {
-        return Collections.unmodifiableList(_syntaxProblems);
-    }
-    
-    /**
-     * @return the EL semantic validator for this expression validitor or
-     * null if one has not yet been constructor.  One will only be construct
-     * if validate is called and the expression does not have any syntax errors.
-     */
-    public IExpressionSemanticValidator getSemanticValidator()
-    {
-        return _semanticValidator;
-    }
-    
-    /**
-     * Validates the context-specific data for one EL expressino
-     * 
-     * @param expr
-     * @param file
-     * @param reporter
-     * @param context
-     */
-    private void validateSemantics(ASTExpression expr,IStructuredDocumentContext context)
-    {
-        _semanticValidator = new ASTSemanticValidator(expr, context, _prefs);
-        _semanticValidator.validate();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/EvaluationTracker.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/EvaluationTracker.java
deleted file mode 100644
index aec1b21..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/EvaluationTracker.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el;
-
-import org.eclipse.jst.jsf.common.internal.types.SignatureBasedType;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-
-/**
- * Used to track the evaulation of an EL expression AST
- * 
- * @author cbateman
- *
- */
-class EvaluationTracker 
-{
-    private ValueExpressionTracker  _valueTracker;
-    private SignatureBasedType      _type;
-    
-    /**
-     * @return the current value expression tracker or null if not set
-     */
-    public ValueExpressionTracker getValueTracker() {
-        return _valueTracker;
-    }
-
-    /**
-     * @param valueTracker
-     */
-    public void setValueTracker(ValueExpressionTracker valueTracker) {
-        _valueTracker = valueTracker;
-    }
-
-    /**
-     * @return the currently resolved type or null if not yet resolved
-     * or not able to resolve
-     */
-    public SignatureBasedType getType() {
-        return _type;
-    }
-
-    /**
-     * @param type
-     */
-    public void setType(SignatureBasedType type) {
-        _type = type;
-    }
-    
-    /**
-     * @return if getType() is a ValueType, returns it otherwise null
-     */
-    public ValueType getValueType()
-    {
-        if (_type instanceof ValueType)
-        {
-            return (ValueType) _type;
-        }
-        
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/IExpressionSemanticValidator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/IExpressionSemanticValidator.java
deleted file mode 100644
index 76b09de..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/IExpressionSemanticValidator.java
+++ /dev/null
@@ -1,43 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.el;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.internal.types.SignatureBasedType;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-/**
- * Exposes certain parts of the ASTSemanticValidator without exposing the whole class
- * Primarily this was done for JUnit testing
- * 
- * @author cbateman
- *
- */
-public interface IExpressionSemanticValidator {
-
-    /**
-     * Performs the semantic validatino
-     */
-    public abstract void validate();
-
-    /**
-     * @return the list of generated message (may be empty if validate has not been called).
-     */
-    public abstract List<IMessage> getMessages();
-
-    /**
-     * @return the value type of fully resolved expression
-     * or null if not resolved (or could not be resolved)
-     */
-    public abstract SignatureBasedType getExpressionType();
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/QuickFixAssistant.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/QuickFixAssistant.java
deleted file mode 100644
index 89ff50f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/QuickFixAssistant.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el;
-
-
-/**
- * @author cbateman
- *
- */
-public class QuickFixAssistant //extends CorrectionAssistantProvider
-{
-/*	public IContentAssistant getCorrectionAssistant(ISourceViewer sourceViewer) {
-		IContentAssistant ca = null;
-
-		if (sourceViewer != null) {
-			ContentAssistant assistant = new ContentAssistant();
-
-			if (sourceViewer != null) {
-				IContentAssistProcessor correctionProcessor = new CorrectionProcessorXML(sourceViewer);
-				assistant.setContentAssistProcessor(correctionProcessor, IJSPPartitions.JSP_DEFAULT_EL2);
-			}
-			ca = assistant;
-		}
-
-		return ca;
-
-	}
-
-	private class CorrectionProcessorXML extends StructuredCorrectionProcessor {
-		/**
-		 * quick assist processor
-		 */
-/*		protected IQuickAssistProcessor fQuickAssistProcessor;
-		/**
-		 * quick fix processor
-		 */
-/*		protected IQuickFixProcessor fQuickFixProcessor;
-
-		/**
-		 * @param sourceViewer
-		 */
-/*		public CorrectionProcessorXML(ISourceViewer sourceViewer) {
-			super(sourceViewer);
-		}
-
-		protected IQuickAssistProcessor getQuickAssistProcessor() {
-			if (fQuickAssistProcessor == null)
-				fQuickAssistProcessor = new IQuickAssistProcessor()
-				{
-					public boolean canAssist(StructuredTextViewer viewer, int offset)
-					{
-						return true;
-					}
-	
-					/**
-					 * Collects proposals for assistant at the given offset.
-					 */
-/*					public ICompletionProposal[] getProposals(StructuredTextViewer viewer, int offset) throws CoreException
-					{
-						final IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE.getContext(viewer, offset);
-						final ITextRegionContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE.getTextRegionResolver(context);
-						
-						if (resolver == null)
-						{
-							return new ICompletionProposal[0];
-						}
-						
-						final String regionType = resolver.getRegionType();
-						final List   proposals = new ArrayList();
-						
-						if (DOMJSPRegionContexts.JSP_VBL_CONTENT.equals(regionType))
-						{
-							final String elText = resolver.getRegionText();
-							final StringReader  reader = new StringReader(elText);
-							final JSPELParser  parser = new JSPELParser(reader);
-							
-							try
-							{
-								final ASTExpression expr = parser.Expression();
-								final IExpressionSemanticValidator validator = new ASTSemanticValidator(expr, context);
-								validator.validate();
-								
-//								for (final Iterator it = validator.getMessages().iterator(); it.hasNext();)
-//								{
-//									// TODO:MyLocalizedMessage message = (MyLocalizedMessage) it.next();
-//									
-//									if (message.appliesTo(offset))
-//									{
-                                       throw new UnsupportedOperationException("TODO:");
-//										switch(message.getErrorCode())
-//										{
-                                        //TODO:
-//											case Messages.ERROR_CODE_BEANNAME_NOT_FOUND:
-//											{
-//												final String beanName = 
-//													(String) message.getAttribute("name");
-//												proposals.add(new ELContentAssistProposal(beanName, ((IFile)message.getTargetObject()).getProject()));
-//											}
-//											break;
-//										}
-//									}
-//								}
-							}
-							catch (ParseException pe)
-							{
-								// left empty on purpose
-							}
-						}
-						
-						return (ICompletionProposal[]) proposals.toArray(new ICompletionProposal[0]);
-					}
-				};
-
-			return fQuickAssistProcessor;
-		}
-
-		protected IQuickFixProcessor getQuickFixProcessor() {
-			if (fQuickFixProcessor == null)
-			{
-				// TODO: should use the approach where possible, but the Annotation doesn't pass
-				// enough info
-				fQuickFixProcessor = new QuickFixProcessorXML()
-				{
-					public boolean canFix(Annotation annnotation)
-					{
-						return true;
-					}
-
-					public ICompletionProposal[] getProposals(Annotation annnotation) throws CoreException
-					{
-						return new ICompletionProposal[0];
-					}
-				};
-			}
-
-			return fQuickFixProcessor;
-		}
-	}*/
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/ValueExpressionTracker.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/ValueExpressionTracker.java
deleted file mode 100644
index 702f997..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/ValueExpressionTracker.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el;
-
-
-class ValueExpressionTracker
-{
-    private int                         _curPropertySymbolOffset;
-    private int                         _curPropertySymbolLength;
-
-    /**
-     * @param offset 
-     * @param length 
-     */
-    public void setCurMemberSymbol(int offset, int length) 
-    {
-        _curPropertySymbolOffset = offset;
-        _curPropertySymbolLength = length;
-    }
-    
-    /**
-     * @return the offset of the current property symbol or 0 if no current property symbol
-     */
-    public int getCurPropertySymbolOffset()
-    {
-        return _curPropertySymbolOffset;
-    }
-    
-    /**
-     * @return the length of the current property symbol or 0 if no current property symbol
-     */
-    public int getCurPropertySymbolLength()
-    {
-        return _curPropertySymbolLength;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/DiagnosticFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/DiagnosticFactory.java
deleted file mode 100644
index 2a91cfa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/DiagnosticFactory.java
+++ /dev/null
@@ -1,556 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation7
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.diagnostics;
-
-import java.text.MessageFormat;
-
-import org.eclipse.emf.common.util.BasicDiagnostic;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.validation.internal.ELValidationPreferences;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Factory for all operator diagnostics.  Class should
- * not be implemented, instantiated or sub-classed.
- * 
- * @author cbateman
- *
- */
-public final class DiagnosticFactory 
-{
-    
-    /**
-     * Problem id
-     */
-    public final static int BINARY_OP_BOTH_OPERANDS_NULL_ID = 0;
-    /**
-     * Problem id
-     */
-    public final static int BINARY_OP_POSSIBLE_DIVISION_BY_ZERO_ID = 1;
-    /**
-     * Problem id
-     */
-    public final static int BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID = 2;
-    /**
-     * Problem id
-     */
-    public final static int BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME_ID = 3;
-    /**
-     * Problem id
-     */
-    public final static int BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME_ID = 4;
-    /**
-     * Problem id
-     */
-    public final static int BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID = 5;
-    /**
-     * Problem id
-     */
-    public final static int BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS_ID = 6;
-    /**
-     * Problem id
-     */
-    public final static int BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME_ID = 7;
-    /**
-     * Problem id
-     */
-    public final static int BINARY_OP_NO_AVAILABLE_TYPE_COERCION_ID = 8;
-    /**
-     * Problem id
-     */
-    public final static int BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS_ID = 9;
-    /**
-     * Problem id
-     */
-    public final static int UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID = 10;
-    /**
-     * Problem id
-     */
-    public final static int UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE_ID = 11;
-    /**
-     * Problem id
-     */
-    public final static int UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO_ID = 12;
-    /**
-     * Problem id
-     */
-    public final static int UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID = 13;
-    /**
-     * Problem id
-     */
-    public final static int UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID = 14;
-    /**
-     * Problem id
-     */
-    public final static int TERNARY_OP_CHOICE_IS_ALWAYS_SAME_ID = 15;
-    /**
-     * Problem id
-     */
-    public final static int TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN_ID = 16; 
-    /**
-     * Problem id
-     */
-    public final static int UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED_ID = 17;
-    /**
-     * Problem id
-     */
-    public final static int CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING_ID = 18;
-    /**
-     * Problem id
-     */
-    public final static int MEMBER_NOT_FOUND_ID = 19;
-    /**
-     * Problem id
-     */
-    public final static int VARIABLE_NOT_FOUND_ID = 20;
-    /**
-     * Problem id
-     */
-    public final static int MISSING_CLOSING_EXPR_BRACKET_ID = 21;
-    /**
-     * Problem id
-     */
-    public final static int GENERAL_SYNTAX_ERROR_ID = 22;
-    /**
-     * Problem id
-     */
-    public final static int EMPTY_EL_EXPRESSION_ID = 23;
-    
-    /**
-     * 
-     */
-    public final static int BINARY_OP_DOT_WITH_VALUEB_NULL_ID = 24;
-    
-    /**
-     * Identifies a problem where we have x.y and x is a map.  In this case
-     * the recommend syntax is x['y']
-     */
-    public final static int BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY_ID = 25;
-    
-    /**
-     * Indicates that a numeric array accessor is being used with a value
-     * which is either < 0 or may be greater than the assumed size of the array
-     */
-    public final static int POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS_ID = 26;
-    
-    /**
-     * Identifies the problem where an expr like bean.enumProp == 'blah'
-     * but 'blah' does not match any of the possible enum constants, meaning
-     * that the operation will always resolve to a constant value (in this case false)
-     */
-    public final static int BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME_ID = 27;
-    
-    /**
-     * Identifies a problem where two enum variables are compared but the enums are
-     * not compatible.  i.e. bean.enum1 < bean.enum2.  Enum.compareTo() may throw
-     * an exception in this case (CCE).
-     */
-    public final static int BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE_ID = 28;
-    
-    /**
-     * Indicates a situation such as x.y where x is a bundle and 
-     * 'x.y.z' exists, but x.y while partially valid, does not have a value
-     * associated.
-     */
-    public final static int MEMBER_IS_INTERMEDIATE_ID = 29;
-    
-    /**
-     * Count of ids
-     */
-    public final static int NUM_IDS = 30;
-    
-    /**
-     * @param operatorName
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_BOTH_OPERANDS_NULL(final String operatorName)
-    {
-        final String message = NLS.bind(
-                Messages.BINARY_OP_BOTH_OPERANDS_NULL, operatorName);
-        return create(BINARY_OP_BOTH_OPERANDS_NULL_ID, message);
-    }
-    
-    private static Diagnostic DIAGNOSTIC_POSSIBLE_DIV_BY_ZERO;
-    
-    /**
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_POSSIBLE_DIVISION_BY_ZERO()
-    {
-        if (DIAGNOSTIC_POSSIBLE_DIV_BY_ZERO == null)
-        {
-            final String message = Messages.POSSIBLE_DIV_BY_ZERO;
-            DIAGNOSTIC_POSSIBLE_DIV_BY_ZERO = 
-                create(BINARY_OP_POSSIBLE_DIVISION_BY_ZERO_ID, message);
-        }
-        return DIAGNOSTIC_POSSIBLE_DIV_BY_ZERO;
-    }
-    
-    /**
-     * @param operatorName
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(final String operatorName)
-    {
-        final String message = 
-            NLS.bind(Messages.BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION, operatorName);
-        return create(BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID, message);
-    }
-    
-    /**
-     * @param operatorName
-     * @param value
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME(final String operatorName, final String value)
-    {
-        final String message =  
-            NLS.bind(Messages.BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME,operatorName, value);
-        return create(BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME_ID, message);
-    }
-    
-    /**
-     * @param value
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME(final String value)
-    {
-        final String message = 
-            NLS.bind(Messages.BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME, value);
-        return create(BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME_ID, message);
-    }
-
-    /**
-     * @param whichArgument
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN(final String whichArgument)
-    {
-        final String message = 
-            NLS.bind(Messages.BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN, whichArgument);
-        return create(BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID, message);
-    }
-    
-    /**
-     * @param shortCircuitValue
-     * @param operatorName
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS(boolean shortCircuitValue, String operatorName)
-    {
-        final String message = 
-            NLS.bind(Messages.BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS, 
-                    Boolean.valueOf(shortCircuitValue), operatorName);
-        return create(BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS_ID, message); 
-    }
-    
-    /**
-     * @param shortCircuitValue
-     * @param operatorName
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME(final boolean shortCircuitValue, final String operatorName)
-    {
-        final String message =
-            NLS.bind(Messages.BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME, 
-                    Boolean.valueOf(shortCircuitValue), operatorName);
-        
-        return create(BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME_ID, message); 
-    }
-
-    private static Diagnostic DIAGNOSTIC_NO_AVAILABLE_TYPE_COERCION;
-        
-    /**
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_NO_AVAILABLE_TYPE_COERCION()
-    {
-        if (DIAGNOSTIC_NO_AVAILABLE_TYPE_COERCION == null)
-        {
-            DIAGNOSTIC_NO_AVAILABLE_TYPE_COERCION = 
-              create(BINARY_OP_NO_AVAILABLE_TYPE_COERCION_ID, 
-                    Messages.BINARY_OP_NO_AVAILABLE_TYPE_COERCION);
-        }
-        
-        return DIAGNOSTIC_NO_AVAILABLE_TYPE_COERCION;
-    }
-
-    private static Diagnostic DIAGNOSTIC_COULD_NOT_COERCE_LITERALS;
-    
-    /**
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS()
-    {
-        if (DIAGNOSTIC_COULD_NOT_COERCE_LITERALS == null)
-        {
-            DIAGNOSTIC_COULD_NOT_COERCE_LITERALS = 
-                create(BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS_ID, 
-                    Messages.BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS);
-        }
-        
-        return DIAGNOSTIC_COULD_NOT_COERCE_LITERALS;
-    }
-    
-    /**
-     * @param operatorName
-     * @param value
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID(final String operatorName, final String value)
-    {
-        final String message = 
-            NLS.bind(Messages.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME, 
-                    operatorName, value);
-        return create(UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID, message);
-    }
-    
-    /**
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE()
-    {
-        return create(UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE_ID, 
-             Messages.UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE);
-    }
-    
-    /**
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO()
-    {
-        return create(UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO_ID, 
-            Messages.UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO);
-    }
-    
-    /**
-     * @param operatorName
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(final String operatorName)
-    {
-        final String message = 
-            NLS.bind(Messages.UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION,
-                    operatorName);
-        return create(UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID, message);
-    }
-    
-    /**
-     * @param operatorName
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED(final String operatorName)
-    {
-        final String message =
-            NLS.bind(Messages.UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED,
-                                operatorName);
-        return create(UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED_ID, message);
-    }
-    
-    /**
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN()
-    {
-        return create(UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID, 
-                Messages.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN);
-    }
-    
-    /**
-     * @param result
-     * @param whichSelected
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_TERNARY_OP_CHOICE_IS_ALWAYS_SAME(boolean result, String whichSelected)
-    {
-        final String message =
-            NLS.bind(Messages.TERNARY_OP_CHOICE_IS_ALWAYS_SAME, 
-                    Boolean.valueOf(result), whichSelected);
-        return create(TERNARY_OP_CHOICE_IS_ALWAYS_SAME_ID, message);
-    }
-    
-    /**
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN()
-    {
-        return create(TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN_ID, 
-                Messages.TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN_ID);
-    }
-    
-    /**
-     * Method bindings cannot participate in expressions involving operators
-     * Per JSP 1.1 spec section 5.2.1
-     * 
-     * @return a configured message
-     */
-    public Diagnostic create_CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING()
-    {
-        return create(CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING_ID, 
-                Messages.CANNOT_APPLY_OPERATORS_TO_MB);
-    }
-
-    /**
-     * @param curMemberSymbol
-     * @param owningMember
-     * @return a configured message
-     */
-    public Diagnostic create_MEMBER_NOT_FOUND(String curMemberSymbol, String owningMember)
-    {
-        return create(MEMBER_NOT_FOUND_ID,
-                NLS.bind(Messages.VM_PROP_NAME_NOT_FOUND, curMemberSymbol, owningMember));
-    }
-
-    /**
-     * @param variableName
-     * @return a configured message
-     */
-    public Diagnostic create_VARIABLE_NOT_FOUND(String variableName)
-    {
-        return create(VARIABLE_NOT_FOUND_ID
-                , NLS.bind(Messages.VM_ROOT_NAME_NOT_FOUND, variableName));
-    }
-
-    /**
-     * @return a configured message
-     */
-    public Diagnostic create_MISSING_CLOSING_EXPR_BRACKET()
-    {
-        return create(MISSING_CLOSING_EXPR_BRACKET_ID
-                , Messages.MISSING_CLOSING_EXPR_BRACKET);
-    }
-    
-    /**
-     * @return a configured message
-     */
-    public Diagnostic create_GENERAL_SYNTAX_ERROR()
-    {
-        return create(GENERAL_SYNTAX_ERROR_ID, Messages.GENERAL_SYNTAX_ERROR);
-    }
-
-    /**
-     * @return a configured message
-     */
-    public Diagnostic create_EMPTY_EL_EXPRESSION()
-    {
-        return create(EMPTY_EL_EXPRESSION_ID, Messages.EMPTY_EL_EXPRESSION);
-    }
-
-    /**
-     * @param operatorName 
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_DOT_WITH_VALUEB_NULL(final String operatorName)
-    {
-        return create(BINARY_OP_DOT_WITH_VALUEB_NULL_ID
-                , Messages.bind(Messages.BINARY_OP_DOT_WITH_VALUEB_NULL, operatorName));
-    }
-    
-    /**
-     * @param valAName
-     * @param valueBName
-     * @return a configured diagnostic
-     */
-    public Diagnostic create_BINARY_OP_DOT_WITH_VALUEA_MAP_SHOULD_USE_ARRAY(final String valAName, final String valueBName)
-    {
-        final Object[] formatArgs = new Object[] {valAName, valueBName};
-        return create(BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY_ID,
-                MessageFormat.format(Messages.BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY,formatArgs));
-    }
-    
-    /**
-     * @param value
-     * @return an array index out of bounds diagnostic
-     */
-    public Diagnostic create_POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS(final Integer value)
-    {
-        final Object[] formatArgs = new Object[] {value};
-
-        return create(POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS_ID
-                , MessageFormat.format(Messages.POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS,formatArgs));
-    }
-    
-    /**
-     * @param operatorName
-     * @param invariantResult
-     * @param enumName
-     * @param fieldName
-     * @return a diagnostic
-     */
-    public Diagnostic create_BINARY_COMPARISON_WITH_ENUM_AND_CONST_ALWAYS_SAME(final String operatorName, final boolean invariantResult, final String enumName,  final String fieldName)
-    {
-        return create(BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME_ID
-                , MessageFormat.format(Messages.BINARY_COMPARISON_WITH_ENUM_AND_CONST_ALWAYS_SAME
-                                      , new Object[] {operatorName
-                                      , Boolean.valueOf(invariantResult), enumName, fieldName}));
-    }
-
-    /**
-     * @param operatorName
-     * @param invariantResult
-     * @param enumName1
-     * @param enumName2
-     * @return a diagnostic
-     */
-    public Diagnostic create_BINARY_COMPARISON_WITH_TWO_ENUMS_ALWAYS_SAME(final String operatorName, final boolean invariantResult, final String enumName1, final String enumName2)
-    {
-        return create(BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME_ID
-                , MessageFormat.format(Messages.BINARY_COMPARISON_WITH_TWO_ENUMS_ALWAYS_SAME
-                                      , new Object[] {operatorName
-                                      , Boolean.valueOf(invariantResult), enumName1, enumName2}));
-    }
-    
-    /**
-     * @param operatorName
-     * @param invariantResult
-     * @param enumName
-     * @param nonEnum
-     * @return a diagnostic
-     */
-    public Diagnostic create_BINARY_COMPARISON_WITH_ENUM_AND_UNCOERCABLE_NONCONST_ALWAYS_SAME(final String operatorName, final boolean invariantResult, final String enumName, final String nonEnum)
-    {
-        return create(BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME_ID
-                , MessageFormat.format(Messages.BINARY_COMPARISON_WITH_ENUM_AND_UNCOERCABLE_NONCONST_ALWAYS_SAME
-                                      , new Object[] {operatorName
-                                      , Boolean.valueOf(invariantResult), enumName, nonEnum}));
-    }
-    
-    /**
-     * @return a diagnostic
-     */
-    public Diagnostic create_BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE()
-    {
-        return create(BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE_ID
-                , Messages.BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE);
-    }
-
-    /**
-     * @param intermediateMemberName
-     * @return a diagnostic
-     */
-    public Diagnostic create_MEMBER_IS_INTERMEDIATE(final String intermediateMemberName)
-    {
-        return create(MEMBER_IS_INTERMEDIATE_ID
-                        ,  NLS.bind(Messages.MEMBER_IS_INTERMEDIATE
-                                , intermediateMemberName));
-    }
-    
-    private BasicDiagnostic create(int diagnosticId, String message)
-    {
-        final int severity = ELValidationPreferences.getDefaultSeverity(diagnosticId);
-        return new BasicDiagnostic(severity, "" //$NON-NLS-1$
-                , diagnosticId
-                , message
-                , null);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/IELLocalizedMessage.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/IELLocalizedMessage.java
deleted file mode 100644
index 1d4b6a5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/IELLocalizedMessage.java
+++ /dev/null
@@ -1,37 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.el.diagnostics;
-
-/**
- * Allows certain elements of the message to be made public without exposing
- * the whole Message class
- * 
- * @author cbateman
- *
- */
-public interface IELLocalizedMessage 
-{
-    /**
-     * @return the unique error code for the message
-     */
-    public int getErrorCode();
-    
-    /**
-     * @return the absolute offset where the problem starts
-     */
-    public int getOffset();
-    
-    /**
-     * @return the number of characters starting from getOffset()
-     * where the mark stretches
-     */
-    public int getLength();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/Messages.java
deleted file mode 100644
index c14a851..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/Messages.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.diagnostics;
-
-import org.eclipse.osgi.util.NLS;
-
-class Messages extends NLS {
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.validation.internal.el.diagnostics.messages"; //$NON-NLS-1$
-
-
-    static {
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-
-    /**
-     * see messages.properties
-     */
-    public static String POSSIBLE_DIV_BY_ZERO;
-    /**
-     * see messages.properties
-     */
-    public static String UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE;
-    /**
-     * see messages.properties
-     */
-    public static String UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN; 
-    /**
-     * see messages.properties
-     */
-    public static String TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN_ID;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_BOTH_OPERANDS_NULL;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_NO_AVAILABLE_TYPE_COERCION;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS;
-    /**
-     * see messages.properties
-     */
-    public static String UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME;
-    /**
-     * see messages.properties
-     */
-    public static String UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO;
-    /**
-     * see messages.properties
-     */
-    public static String UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION;
-    /**
-     * see messages.properties
-     */
-    public static String UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED;
-    /**
-     * see messages.properties
-     */
-    public static String TERNARY_OP_CHOICE_IS_ALWAYS_SAME;
-    /**
-     * see messages.properties
-     */
-    public static String VM_PROP_NAME_NOT_FOUND;
-    /**
-     * see messages.properties
-     */
-    public static String VM_ROOT_NAME_NOT_FOUND;
-    /**
-     * see messages.properties
-     */
-    public static String CANNOT_APPLY_OPERATORS_TO_MB;
-    /**
-     * see messages.properties
-     */
-    public static String MISSING_CLOSING_EXPR_BRACKET;
-    /**
-     * see messages.properties
-     */
-    public static String GENERAL_SYNTAX_ERROR;
-    /**
-     * see messages.properties 
-     */
-    public static String EMPTY_EL_EXPRESSION;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_DOT_WITH_VALUEB_NULL;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY;
-    
-    /**
-     * see messages.properties
-     */
-    public static String POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_COMPARISON_WITH_ENUM_AND_CONST_ALWAYS_SAME;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_COMPARISON_WITH_TWO_ENUMS_ALWAYS_SAME;
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE;
-
-    /**
-     * see messages.properties
-     */
-    public static String BINARY_COMPARISON_WITH_ENUM_AND_UNCOERCABLE_NONCONST_ALWAYS_SAME;
-    /**
-     * see messages.properties
-     */
-    public static String MEMBER_IS_INTERMEDIATE;
-
-    private Messages() {
-        // do nothing; no external instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/MyLocalizedMessage.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/MyLocalizedMessage.java
deleted file mode 100644
index 80da97d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/MyLocalizedMessage.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.diagnostics;
-
-import java.util.Locale;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.wst.validation.internal.core.Message;
-
-/**
- * EL customized localizable validation message
- * @author cbateman
- *
- */
-class MyLocalizedMessage extends Message implements IELLocalizedMessage
-{
-	private final String _message;
-	private final int	 _errorCode;
-
-	/**
-	 * @param severity
-	 * @param messageText
-	 * @param targetObject
-	 * @param errorCode 
-	 */
-	public MyLocalizedMessage(int severity, String messageText, IResource targetObject, int errorCode) {
-		this(severity, messageText, (Object) targetObject, errorCode);
-	}
-
-	/**
-	 * @param severity
-	 * @param messageText
-	 * @param targetObject
-	 * @param errorCode 
-	 */
-	private MyLocalizedMessage(int severity, String messageText, Object targetObject, int errorCode) {
-		super(JSFCorePlugin.getDefault().getBundle().getSymbolicName(), severity, 
-                messageText);
-		_message = messageText;
-		setTargetObject(targetObject);
-		_errorCode = errorCode;
-	}
-
-	/**
-	 * @return the localized message
-	 */
-	public String getLocalizedMessage() {
-		return _message;
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.core.Message#getText()
-	 */
-	public String getText() {
-		return getLocalizedMessage();
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.core.Message#getText(java.lang.ClassLoader)
-	 */
-	public String getText(ClassLoader cl) {
-		return getLocalizedMessage();
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.core.Message#getText(java.util.Locale)
-	 */
-	public String getText(Locale l) {
-		return getLocalizedMessage();
-	}
-
-	public String getText(Locale l, ClassLoader cl) {
-		return getLocalizedMessage();
-	}
-
-	/**
-	 * @return the error code related to this message
-	 */
-	public int getErrorCode() {
-		return _errorCode;
-	}
-
-
-	/**
-	 * @param offset
-	 * @return true if this message applies to document offset
-	 */
-	public boolean appliesTo(int offset)
-	{
-		return (offset >= getOffset() && offset < getOffset()+getLength());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/ValidationMessageFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/ValidationMessageFactory.java
deleted file mode 100644
index d13b5b4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/ValidationMessageFactory.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.diagnostics;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.validation.internal.ELValidationPreferences;
-import org.eclipse.wst.validation.internal.core.Message;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-/**
- * Creates configured validation Message objects.
- * 
- * @author cbateman
- *
- */
-public final class ValidationMessageFactory 
-{
-    /**
-     * @param diagnostic
-     * @param offset
-     * @param length
-     * @param file
-     * @param prefs 
-     * @return a configured message
-     */
-    public static Message createFromDiagnostic(final Diagnostic diagnostic, int offset, int length, IFile file, ELValidationPreferences prefs)
-    {
-        final int severity = 
-            prefs.getDiagnosticSeverity(diagnostic.getCode()); 
-
-        final Message message =
-            new MyLocalizedMessage(
-                    convertSeverity(severity), 
-                    diagnostic.getMessage(), 
-                    file, 
-                    diagnostic.getCode());
-        
-        message.setOffset(offset);
-        message.setLength(length);
-        
-        return message;
-    }
-    
-    /**
-     * @param diagnostic
-     * @return a Message severity equivilent to diagnostic.getSeverity()
-     */
-    private static int convertSeverity(int severity)
-    {
-        switch (severity)
-        {
-            case Diagnostic.ERROR:
-                return IMessage.HIGH_SEVERITY;
-            case Diagnostic.WARNING:
-                return IMessage.NORMAL_SEVERITY;
-            case Diagnostic.INFO:
-                return IMessage.LOW_SEVERITY;
-            case Diagnostic.OK:
-            default:
-                // no bits set
-                return 0;
-        }
-    }
-    
-    private ValidationMessageFactory()
-    {
-        // no external instantiation
-    }
-}    
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/messages.properties
deleted file mode 100644
index 11a534e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/diagnostics/messages.properties
+++ /dev/null
@@ -1,44 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-GENERAL_SYNTAX_ERROR=Syntax error in EL
-EMPTY_EL_EXPRESSION=Empty EL expression
-
-VM_ROOT_NAME_NOT_FOUND = {0} cannot be resolved
-VM_PROP_NAME_NOT_FOUND = {0} cannot be resolved as a member of {1}
-CANNOT_APPLY_OPERATORS_TO_MB=Cannot apply expression operators to method bindings
-MISSING_CLOSING_EXPR_BRACKET=Missing closing bracket on expression
-
-POSSIBLE_DIV_BY_ZERO=Possible division by zero
-UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE=This empty expression always evaluates to false.  Only string, maps, arrays and collection have meaningful values for the empty operator
-UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN=Not operator does not support type coercion. 
-TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN_ID=Could not coerce choice argument to boolean
-BINARY_OP_BOTH_OPERANDS_NULL={0} with operand 'null' is always zero
-BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION=Could not make numeric conversion for {0} operation
-BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME=This {0} will always result a value of {1}
-BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME=Comparisons with null always evaluates to {0}
-BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN=Cannot coerce {0} argument to boolean
-BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS=The first boolean argument is always {0}.  The second argument will never be evaluated and the {1} will always evaluate to {0}.
-BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME=The second boolean argument is always {0}.  The {1} will always evaluate to {0}
-BINARY_OP_NO_AVAILABLE_TYPE_COERCION=Cannot coerce arguments for this operator
-BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS=Could not coerce literals to numbers
-UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME=This {0} will always result a value of {1}
-UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO=Unary minus applied to null is always zero
-UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION=Could not make numeric conversion for {0} operation
-UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED=Type coercion for {0} operator not guaranteed for possible runtime types: {1}
-TERNARY_OP_CHOICE_IS_ALWAYS_SAME=Choice argument is always {0}.  {1} argument is always returned
-BINARY_OP_DOT_WITH_VALUEB_NULL=Applying the {0} operator with null second argument always results in null
-BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY=Array syntax is preferred when accessing Map properties with keys containing dots (i.e. {0}[''{1}''])
-POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS=Possible array index out of bound on list/array access with value: {0}
-BINARY_COMPARISON_WITH_ENUM_AND_CONST_ALWAYS_SAME=Comparison using {0} will always evaluate to {1}.  Enumeration type {2} does not have a constant named {3}
-BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE=Comparison of incompatible enumeration vales may cause a ClassCastException.
-BINARY_COMPARISON_WITH_TWO_ENUMS_ALWAYS_SAME=Comparison using {0} will always evaulate to {1}.  Enumeration type {2} is not equality comparable with {3}
-BINARY_COMPARISON_WITH_ENUM_AND_UNCOERCABLE_NONCONST_ALWAYS_SAME=Comparison using {0} will always evaulate to {1}.  Enumeration type {2} is not equality comparable with non-enumeration type {3}
-MEMBER_IS_INTERMEDIATE={0} is an intermediate property which does not have its own value associated with it.
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/AddArithmeticBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/AddArithmeticBinaryOperator.java
deleted file mode 100644
index 56d1457..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/AddArithmeticBinaryOperator.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import java.math.BigDecimal;
-
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents the arithmetic + operator in EL
- * 
- * @author cbateman
- *
- */
-/*package*/ class AddArithmeticBinaryOperator extends NoDivArithmeticBinaryOperator {
-
-    private static final String ADDITION = "addition";
-
-    AddArithmeticBinaryOperator(DiagnosticFactory diagnosticFactory) {
-        super(diagnosticFactory);
-    }
-
-    protected Long doRealOperation(Long firstArg, Long secondArg) 
-    {
-        return new Long(firstArg.longValue() + secondArg.longValue());
-    }
-
-    protected Double doRealOperation(Double firstArg, Double secondArg) {
-        return new Double(firstArg.doubleValue() + secondArg.doubleValue());
-    }
-
-    protected BigDecimal doRealOperation(BigDecimal firstArg,
-            BigDecimal secondArg) 
-    {
-        return firstArg.add(secondArg);
-    }
-
-    protected String getOperatorName() {
-        return ADDITION;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/AndBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/AndBinaryOperator.java
deleted file mode 100644
index 2ce58ce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/AndBinaryOperator.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-
-/**
- * Encapsulates the 'and'/'&&' boolean-AND operator
- * Based on JSP.2.3.6.1
- * 
- * @author cbateman
- *
- */
-/*package*/class AndBinaryOperator extends LogicalBinaryOperator 
-{
-
-    AndBinaryOperator(DiagnosticFactory diagnosticFactory) {
-        super(diagnosticFactory);
-    }
-
-    protected boolean doRealOperation(Boolean firstArg, Boolean secondArg) 
-    {
-        return (firstArg.booleanValue() && secondArg.booleanValue());
-    }
-
-    protected String readableOperatorName() 
-    {
-        return "logical-AND";
-    }
-
-    protected boolean shortCircuitValue() {
-        // AND short-circuits on false 
-        return false;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/ArithmeticBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/ArithmeticBinaryOperator.java
deleted file mode 100644
index 3f70000..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/ArithmeticBinaryOperator.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import java.math.BigDecimal;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Super for all arithmetic binary operators -- +, -, *,/,%
- * 
- * @author cbateman
- *
- */
-/*package*/ abstract class ArithmeticBinaryOperator extends BinaryOperator 
-{
-    ArithmeticBinaryOperator(DiagnosticFactory diagnosticFactory) 
-    {
-        super(diagnosticFactory);
-    }
-    
-    public abstract ValueType performOperation(ValueType firstArg, ValueType secondArg); 
-    public abstract Diagnostic validate(ValueType firstArg, ValueType secondArg);
-    
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the result of firstArg op secondArg
-     */
-    protected abstract Long doRealOperation(Long firstArg, Long secondArg);
-    
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the result of firstArg op secondArg
-     */
-    protected abstract Double doRealOperation(Double firstArg, Double secondArg);
-
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the result of firstArg op secondArg
-     */
-    protected abstract BigDecimal doRealOperation(BigDecimal firstArg, BigDecimal secondArg);
-    
-    /**
-     * @return human-readable name of the operator
-     */
-    protected abstract String getOperatorName();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/BinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/BinaryOperator.java
deleted file mode 100644
index 58661da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/BinaryOperator.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-import org.eclipse.jst.jsp.core.internal.java.jspel.JSPELParserConstants;
-import org.eclipse.jst.jsp.core.internal.java.jspel.Token;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-/**
- * Represents an abstract EL binary operator that always
- * takes arguments and produces a single results
- * 
- * @author cbateman
- *
- */
-public abstract class BinaryOperator 
-{
-    /**
-     * the factory used to construct diagnostics
-     */
-    protected final DiagnosticFactory   _diagnosticFactory;
-    
-    /**
-     * @param operatorToken
-     * @param diagnosticFactory 
-     * @param context -- the current EL document context; must not be null
-     * @return a binary operator based on the provided token
-     * @throws IllegalArgumentException if the token is not a recognized
-     * EL binary operator token or if context is null
-     */
-    public static BinaryOperator getBinaryOperator(Token operatorToken, DiagnosticFactory diagnosticFactory, IStructuredDocumentContext context)
-    {
-        if (context == null)
-        {
-            throw new IllegalArgumentException("Context must not be null"); //$NON-NLS-1$
-        }
-        final String facetVersion = determineJSFVersion(context);
-        
-        switch (operatorToken.kind)
-        {
-            case JSPELParserConstants.AND1:
-            case JSPELParserConstants.AND2:
-                return new AndBinaryOperator(diagnosticFactory);
-                
-            case JSPELParserConstants.OR1:
-            case JSPELParserConstants.OR2:
-                return new OrBinaryOperator(diagnosticFactory);
-                
-            case JSPELParserConstants.EQ1:
-            case JSPELParserConstants.EQ2:
-                return new EqualsBinaryRelationalOperator(diagnosticFactory,facetVersion);
-                
-            case JSPELParserConstants.NEQ1:
-            case JSPELParserConstants.NEQ2:
-                return new NotEqualsBinaryRelationalOperator(diagnosticFactory,facetVersion);
-                
-            case JSPELParserConstants.GT1:
-            case JSPELParserConstants.GT2:
-                return new GreaterThanRelationalBinaryOperator(diagnosticFactory,facetVersion);
-                
-            case JSPELParserConstants.GE1:
-            case JSPELParserConstants.GE2:
-                return new GreaterThanEqRelationalBinaryOperator(diagnosticFactory,facetVersion);
-                
-            case JSPELParserConstants.LT1:
-            case JSPELParserConstants.LT2:
-                return new LessThanRelationalBinaryOperator(diagnosticFactory,facetVersion);
-                
-            case JSPELParserConstants.LE1:
-            case JSPELParserConstants.LE2:
-                return new LessThanEqRelationalBinaryOperator(diagnosticFactory,facetVersion);
-                
-            case JSPELParserConstants.PLUS:
-                return new AddArithmeticBinaryOperator(diagnosticFactory);
-                
-            case JSPELParserConstants.MINUS:
-                return new SubtractArithmeticBinaryOperator(diagnosticFactory);
-                
-            case JSPELParserConstants.MULTIPLY:
-                return new MultiplyArithmeticBinaryOperator(diagnosticFactory);
-                
-            case JSPELParserConstants.DIVIDE1:
-            case JSPELParserConstants.DIVIDE2:
-                return new DivArithmeticBinaryOperator(diagnosticFactory);
-            
-            case JSPELParserConstants.MODULUS1:
-            case JSPELParserConstants.MODULUS2:
-                return new ModArithmeticBinaryOperator(diagnosticFactory);
-        }
-        
-        throw new IllegalArgumentException("Unknown binary operator: "+operatorToken.image); //$NON-NLS-1$
-    }
-    
-    /**
-     * 
-     * Constructor
-     */
-    BinaryOperator(DiagnosticFactory diagnosticFactory) 
-    {
-        /* no construction or sub-classing outside package*/
-        _diagnosticFactory = diagnosticFactory;
-    }
-    
-    /**
-     * If both arguments are literals and the operation can be performed, then
-     * the return must be a new LiteralType transformed using this operator.
-     * 
-     * If one or both of the arg is not a literal and the operaton can be performed, then
-     * the return is a new ValueType transformed per the rules of the operator
-     * 
-     * If the operation cannot be performed on ValueType, return null
-     * 
-     * @param firstArg 
-     * @param secondArg 
-     * @return a new value type after the operation is performed
-     */
-    public abstract ValueType performOperation(ValueType firstArg, ValueType secondArg);
-    
-    
-    /**
-     * @param firstArg 
-     * @param secondArg 
-     * @return a Diagnostic interpreting whether it is valid to perform the
-     * operation on the two arguments
-     */
-    public abstract Diagnostic validate(ValueType firstArg, ValueType secondArg);
-    
-    private static String determineJSFVersion(IStructuredDocumentContext context)
-    {
-        final IWorkspaceContextResolver wkResolver = 
-            IStructuredDocumentContextResolverFactory.
-                INSTANCE.getWorkspaceContextResolver(context);
-        
-        IProject project = wkResolver.getProject();
-        
-        IProjectFacetVersion  projectVersion = JSFAppConfigUtils.getProjectFacet(project);
-        
-        if (projectVersion != null)
-        {
-            return projectVersion.getVersionString();
-        }
-        
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/BracketOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/BracketOperator.java
deleted file mode 100644
index 4cfc74e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/BracketOperator.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.SignatureBasedType;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercionException;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.internal.util.IObjectSymbolBasedValueType;
-import org.eclipse.jst.jsf.designtime.el.AbstractDTPropertyResolver;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Handles the operator 'bracket' where bracket(expr-a, id-b) == 'expr-a[id-b]' in EL syntax
- * 
- * @author cbateman
- *
- */
-public class BracketOperator extends MemberAccessorOperator
-{
-    private static final String OPERATOR_NAME_ARRAY_ACCESSOR = "array ('[]') accessor";
-
-    /**
-     * @param diagnosticFactory 
-     * @param file 
-     */
-    public BracketOperator(final DiagnosticFactory diagnosticFactory, final IFile file)
-    {
-        super(file, diagnosticFactory);
-    }
-
-	protected SignatureBasedType handlePerformObjectSymbolValue(
-			IObjectSymbolBasedValueType firstArg, ValueType secondArg)
-	{
-        // per JSP.2.3.4 step 5.2, if value-a is a list or array access
-        if (firstArg.isInstanceOf(TypeConstants.TYPE_LIST)
-                || Signature.getArrayCount(firstArg.getSignature()) > 0)
-        {
-            return handlePerformNumericPropertyAccessorBase(firstArg, secondArg);
-        }
-
-        // per JSP.2.3.4 step 5, if value-a is a map or if it is not 
-        // a list or array (and therefore a bean), treat it as named property accessed object
-        // if firstArg is a map then we must treat the access like a map.get(secondArg)
-
-        // if we don't have a literal value with which to derive value-b, then
-        // we can't get a property
-        if (secondArg instanceof LiteralType)
-        {
-        	return handlePerformNamedPropertyAccessorBase(firstArg, (LiteralType)secondArg);
-        }
-
-        return null;
-	}
-	
-	protected Diagnostic validateObjectSymbolValue(IObjectSymbolBasedValueType firstArg,
-			ValueType secondArg) 
-	{
-        // per JSP.2.3.4 step 5.2, if value-a is a list or array access
-        if (firstArg.isInstanceOf(TypeConstants.TYPE_LIST)
-                || firstArg.getSymbol().getTypeDescriptor().isArray())
-        {
-            return validateNumericPropertyAccessorBase(firstArg, secondArg);
-        }
-
-        // per JSP.2.3.4 step 5, if value-a is a map or if it is not 
-        // a list or array (and therefore a bean), treat it as named property accessed object
-        // if firstArg is a map then we must treat the access like a map.get(secondArg)
-		if (secondArg instanceof LiteralType)
-		{
-			return validateNamedPropertyAccessorBase(firstArg, (LiteralType) secondArg);
-		}
-        // otherwise, there's nothing we can guarantee
-        return Diagnostic.OK_INSTANCE;
-	}
-	
-	private Diagnostic validateNumericPropertyAccessorBase(IObjectSymbolBasedValueType firstArg, 
-															ValueType secondArg)
-	{
-        try
-        {
-        	// secondArg must successfully coerce to integer
-        	TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-        	
-        	if (secondArg instanceof LiteralType)
-        	{
-                // this will throw a TypeCoercionExceptino if it won't
-                // coerce
-                Integer integerValue = 
-                    (Integer) ((LiteralType)secondArg).coerceToNumber(Integer.class);
-
-        		if (integerValue.intValue() < 0)
-                {
-        		    return _diagnosticFactory.create_POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS(integerValue);
-                }
-        	}
-            else
-            {
-                // if the argument is a non-literal string, we can't verify
-                // that the coercion to integer won't throw an exception
-                // at runtime
-                if (TypeCoercer.typeIsString(secondArg.getSignature()))
-                {
-                    return _diagnosticFactory.create_UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED(OPERATOR_NAME_ARRAY_ACCESSOR);
-                }
-            }
-            
-            // TODO: attempt to detect ArrayIndexOutOfBoundsException
-            return Diagnostic.OK_INSTANCE;
-        }
-        catch (TypeCoercionException e)
-        {
-        	return _diagnosticFactory.create_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(OPERATOR_NAME_ARRAY_ACCESSOR);
-        }
-	}
-    
-    private SignatureBasedType handlePerformNumericPropertyAccessorBase(IObjectSymbolBasedValueType firstArg, 
-                                                            ValueType secondArg)
-    {
-        AbstractDTPropertyResolver propResolver = getPropertyResolver();
-        int index = 0;
-        if (secondArg instanceof LiteralType)
-        {
-            try {
-                index = ((LiteralType)secondArg).coerceToNumber(Integer.class).intValue();
-            } catch (TypeCoercionException e) {
-                // suppress, just use index = 0
-                // this maybe should be an assertion...
-            }
-        }
-        
-        final ISymbol symbol = 
-            propResolver.getProperty(firstArg.getSymbol(), index);
-        
-        if (symbol instanceof IObjectSymbol)
-        {
-            return IObjectSymbolBasedValueType.getInstance(symbol);
-        }
-        
-        // if can't be resolved, return null
-        return null;
-    }
-
-    @Override
-    protected String getOperatorName()
-    {
-        return Messages.getString("BracketOperator.Name");
-    }    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/DivArithmeticBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/DivArithmeticBinaryOperator.java
deleted file mode 100644
index 34c63c4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/DivArithmeticBinaryOperator.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import java.math.BigDecimal;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.FloatLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.common.internal.types.IntegerLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercionException;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents dividing EL binary operators: div and / (same operator)
- * Based on JSP.2.3.5.2
- * 
- * @author cbateman
- *
- */
-/*package*/ class DivArithmeticBinaryOperator extends ArithmeticBinaryOperator 
-{
-
-    private static final String DIVISION = "division";
-
-    DivArithmeticBinaryOperator(DiagnosticFactory diagnosticFactory) {
-        super(diagnosticFactory);
-        // TODO Auto-generated constructor stub
-    }
-
-    public ValueType performOperation(ValueType firstArg, ValueType secondArg) 
-    {
-        // JSP.2.3.5.2, step one: if both null then always 0
-        if (TypeCoercer.typeIsNull(firstArg.getSignature())
-                && TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            return new IntegerLiteralType(0);
-        }
-        
-        final String boxedFirstArg = TypeTransformer.transformBoxPrimitives(firstArg.getSignature());
-        final String boxedSecondArg = TypeTransformer.transformBoxPrimitives(secondArg.getSignature());
-        
-        // JSP.2.3.5.2, step 2: if one arg is BigInteger or BigDecimal
-        // then coerce to BigDecimal and do div
-        if (TypeConstants.TYPE_BIG_DOUBLE.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_DOUBLE.equals(boxedSecondArg)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondArg))
-        {
-            return performBigDecimal(firstArg, secondArg);
-        }
-        
-        return performDouble(firstArg, secondArg);
-    }
-
-    public Diagnostic validate(ValueType firstArg, ValueType secondArg) {
-        // JSP.2.3.5.2, step one: if both null then always 0
-        if (TypeCoercer.typeIsNull(firstArg.getSignature())
-                && TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            return _diagnosticFactory.create_BINARY_OP_BOTH_OPERANDS_NULL(DIVISION);
-        }
-        
-        final String boxedFirstArg = TypeTransformer.transformBoxPrimitives(firstArg.getSignature());
-        final String boxedSecondArg = TypeTransformer.transformBoxPrimitives(secondArg.getSignature());
-        
-        // JSP.2.3.5.2, step 2: if one arg is BigInteger or BigDecimal
-        // then coerce to BigDecimal and do div
-        if (TypeConstants.TYPE_BIG_DOUBLE.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_DOUBLE.equals(boxedSecondArg)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondArg))
-        {
-            return validateBigDecimal(firstArg, secondArg);
-        }
-        
-        return validateDouble(firstArg, secondArg);
-    }
-    
-    private ValueType performBigDecimal(ValueType firstArg, ValueType secondArg)
-    {
-        // since one or the other args must be either big decimal or big int,
-        // we don't have two literals, so it is sufficient to ensure that we can
-        // coerce both to numbers and check for div by zero and div of zero
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-
-            // if we get to here, the result is always BigDecimal unless we have
-            // a div by zero
-            if (secondArg instanceof LiteralType)
-            {
-                final Number coercedValue = ((LiteralType)secondArg).coerceToNumber(BigDecimal.class);
-                if (((BigDecimal)coercedValue).equals(new BigDecimal(0)))
-                {
-                    return null;
-                }
-            }
-            
-            return new ValueType(TypeConstants.TYPE_BIG_DOUBLE, IAssignable.ASSIGNMENT_TYPE_RHS);
-        }
-        catch (TypeCoercionException ce)
-        {
-            return null;
-        }
-    }
-    
-    private ValueType performDouble(ValueType firstArg, ValueType secondArg)
-    {
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-            
-            Number secondValue = null;
-            if (secondArg instanceof LiteralType)
-            {
-                secondValue = ((LiteralType)secondArg).coerceToNumber(Double.class);
-                // if the second value is definitely 0, then return null since
-                // we have a div by zero
-                if (secondValue.doubleValue() == 0.0)
-                {
-                    return null;
-                }
-            }
-
-            Number firstValue = null;
-            
-            if (firstArg instanceof LiteralType)
-            {
-                firstValue = ((LiteralType)firstArg).coerceToNumber(Double.class);
-            }
-            
-            if (firstValue != null && secondValue != null)
-            {
-                return new FloatLiteralType(
-                        doRealOperation(new Double(firstValue.doubleValue())
-                                , new Double(secondValue.doubleValue())).doubleValue());
-            }
-
-            // if not both literals and could coerce, then the type is double
-            return new ValueType(Signature.SIG_DOUBLE, IAssignable.ASSIGNMENT_TYPE_RHS);
-        }
-        catch (TypeCoercionException ce)
-        {
-            // could not coerce for the operation
-            return null;
-        }
-    }
-    
-    private Diagnostic validateBigDecimal(ValueType firstArg, ValueType secondArg)
-    {
-        // since one or the other args must be either big decimal or big int,
-        // we don't have two literals, so it is sufficient to ensure that we can
-        // coerce both to numbers and check for div by zero and div of zero
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-
-            // if we get to here, the result is always BigDecimal unless we have
-            // a div by zero
-            if (secondArg instanceof LiteralType)
-            {
-                final Number coercedValue = ((LiteralType)secondArg).coerceToNumber(BigDecimal.class);
-                if (((BigDecimal)coercedValue).equals(new BigDecimal(0)))
-                {
-                    return _diagnosticFactory.create_BINARY_OP_POSSIBLE_DIVISION_BY_ZERO();
-                }
-            }
-            
-            // everything's okay if we get here
-            return Diagnostic.OK_INSTANCE;
-        }
-        catch (TypeCoercionException ce)
-        {
-            return _diagnosticFactory.create_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(DIVISION);
-        }
-    }
-    
-    private Diagnostic validateDouble(ValueType firstArg, ValueType secondArg)
-    {
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-            
-            Number secondValue = null;
-            if (secondArg instanceof LiteralType)
-            {
-                secondValue = ((LiteralType)secondArg).coerceToNumber(Double.class);
-                // if the second value is definitely 0, then return null since
-                // we have a div by zero
-                if (secondValue.doubleValue() == 0.0)
-                {
-                    return _diagnosticFactory.create_BINARY_OP_POSSIBLE_DIVISION_BY_ZERO();
-                }
-            }
-
-            Number firstValue = null;
-            
-            if (firstArg instanceof LiteralType)
-            {
-                firstValue = ((LiteralType)firstArg).coerceToNumber(Double.class);
-            }
-            
-            if (firstValue != null && secondValue != null)
-            {
-                String result 
-                    = Double.toString(
-                            doRealOperation(new Double(firstValue.doubleValue()), 
-                                            new Double(secondValue.doubleValue())).doubleValue());
-
-                return _diagnosticFactory.create_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME(DIVISION, result);
-            }
-
-            // if not both literals and could coerce, then the type is double
-            return Diagnostic.OK_INSTANCE;
-        }
-        catch (TypeCoercionException ce)
-        {
-            // could not coerce for the operation
-            return _diagnosticFactory.create_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(DIVISION);
-        }
-    }
-
-    protected BigDecimal doRealOperation(BigDecimal firstArg, BigDecimal secondArg) {
-        // per JSP.2.3.5.2, step 2
-        return firstArg.divide(secondArg, BigDecimal.ROUND_HALF_UP);
-    }
-
-    protected Double doRealOperation(Double firstArg, Double secondArg) 
-    {
-        return new Double(firstArg.doubleValue() / secondArg.doubleValue());
-    }
-
-    protected Long doRealOperation(Long firstArg, Long secondArg) {
-        return new Long(firstArg.longValue() / secondArg.longValue());
-    }
-
-    protected String getOperatorName() {
-        return DIVISION;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/DotOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/DotOperator.java
deleted file mode 100644
index 414530e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/DotOperator.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.SignatureBasedType;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.symbol.internal.util.IObjectSymbolBasedValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Handles the operator 'dot' where dot(expr-a, id-b) == 'expr-a.id-b' in EL syntax
- * 
- * @author cbateman
- *
- */
-public class DotOperator extends MemberAccessorOperator
-{
-    /**
-     * @param diagnosticFactory 
-     * @param file
-     */
-    public DotOperator(final DiagnosticFactory diagnosticFactory, final IFile file) 
-    {
-        super(file, diagnosticFactory);
-    }
-
-	protected SignatureBasedType handlePerformObjectSymbolValue(
-			IObjectSymbolBasedValueType firstArg, ValueType secondArg) 
-    {
-        // the dot operator (unlike the bracket) can only treat firstArg as 
-        // a named property accessor object
-        // if we don't have a literal value with which to derive value-b, then
-        // we can't get a property
-        if (secondArg instanceof LiteralType)
-        {
-        	return handlePerformNamedPropertyAccessorBase(firstArg, (LiteralType)secondArg);
-        }
-        return null;
-	}
-
-	public Diagnostic validateObjectSymbolValue(IObjectSymbolBasedValueType firstArg,
-												ValueType secondArg) 
-	{
-	    Diagnostic diag = Diagnostic.OK_INSTANCE;
-	    
-        if (secondArg instanceof LiteralType)
-        {
-        	diag = validateNamedPropertyAccessorBase(firstArg, (LiteralType) secondArg);
-        }
-
-        return diag;
-	}
-	
-    @Override
-    protected String getOperatorName()
-    {
-        return Messages.getString("DotOperator.Name");
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EmptyUnaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EmptyUnaryOperator.java
deleted file mode 100644
index 812d1cb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EmptyUnaryOperator.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.BooleanLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.NullLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.StringLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents the EL unary operator '-' on a ValueType 
- * as described by JSP.2.3.7
- * 
- * @author cbateman
- *
- */
-/*package*/ class EmptyUnaryOperator extends UnaryOperator 
-{
-    private static final String EMPTY = "empty";
-
-    EmptyUnaryOperator(DiagnosticFactory diagnosticFactory) 
-    {
-        super(diagnosticFactory);
-    }
-
-    public ValueType performOperation(ValueType type) 
-    {
-        if (type instanceof StringLiteralType)
-        {
-            if ("".equals(((StringLiteralType)type).getLiteralValue()))
-            {
-                // if the string is empty, operator always returns true
-                return BooleanLiteralType.TRUE;
-            }
-
-            // if the string is empty, operator always returns true
-            return BooleanLiteralType.FALSE;
-        }
-
-        // empty(null) is always true
-        if (type instanceof NullLiteralType)
-        {
-            return BooleanLiteralType.TRUE;
-        }
-        
-        // if the type is not string, array, Map, or Collection 
-        // then empty is always false
-        String testSig = type.getSignature();
-        
-        if (!TypeConstants.TYPE_STRING.equals(testSig)
-                && !type.isInstanceOf(TypeConstants.TYPE_COLLECTION)
-                && !type.isInstanceOf(TypeConstants.TYPE_MAP)
-                && Signature.getTypeSignatureKind(testSig) != Signature.ARRAY_TYPE_SIGNATURE)
-        {
-            return BooleanLiteralType.FALSE;
-        }
-        
-        // otherwise, return a generic boolean type
-        return new ValueType(TypeConstants.TYPE_BOOLEAN, type.getAssignability());
-    }
-
-    public Diagnostic validate(ValueType type) 
-    {
-        // empty always validates to false unless:
-        // the value is an empty string, array, map or collection
-        // one thing we do is see if the thing is a literal.  If it is
-        // we can warn that the value could be folded
-        if (type instanceof StringLiteralType)
-        {
-            String condition;
-            
-            if ("".equals(((StringLiteralType)type).getLiteralValue()))
-            {
-                condition = "true";
-            }
-            else
-            {
-                condition = "false";
-            }
-
-            return _diagnosticFactory.
-                create_UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID
-                    (EMPTY,condition);
-        }
-        
-        // empty(null) is always true
-        if (type instanceof NullLiteralType)
-        {
-            return _diagnosticFactory.
-            create_UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID
-                (EMPTY,"true");
-        }
-        
-        // if the type is not string, array, Map, or Collection warn that
-        // this may be always false
-        String testSig = type.getSignature();
-        
-        if (!TypeConstants.TYPE_STRING.equals(testSig)
-                && !type.isInstanceOf(TypeConstants.TYPE_COLLECTION)
-                && !type.isInstanceOf(TypeConstants.TYPE_MAP)
-                && Signature.getTypeSignatureKind(testSig) != Signature.ARRAY_TYPE_SIGNATURE)
-        {
-            return _diagnosticFactory.create_UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE();
-        }
-        
-        return Diagnostic.OK_INSTANCE;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EqualityRelationalBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EqualityRelationalBinaryOperator.java
deleted file mode 100644
index de6881b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EqualityRelationalBinaryOperator.java
+++ /dev/null
@@ -1,538 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jst.jsf.common.internal.types.BooleanLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.StringLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercionException;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.common.util.TypeUtil;
-import org.eclipse.jst.jsf.context.symbol.internal.util.IObjectSymbolBasedValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * A relational binary operator for equality: "==" or "!="
- * 
- * @author cbateman
- *
- */
-/*package*/ abstract class EqualityRelationalBinaryOperator extends RelationalBinaryOperator 
-{
-    EqualityRelationalBinaryOperator(final DiagnosticFactory diagnosticFactory, String jsfVersion) 
-    {
-        super(diagnosticFactory, jsfVersion);
-    }
-
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the result of the operation
-     */
-    protected abstract boolean doRealOperation(Boolean firstArg, Boolean secondArg);
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.validation.internal.el.operators.BinaryOperator#performOperation(org.eclipse.jst.jsf.core.internal.types.ValueType, org.eclipse.jst.jsf.core.internal.types.ValueType)
-     */
-    public ValueType performOperation(ValueType firstArg, ValueType secondArg) 
-    {
-        // JSP.2.3.5.7 step 2 if either operand is null, then not equal
-        if (TypeCoercer.typeIsNull(firstArg.getSignature())
-                || TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            return BooleanLiteralType.FALSE;
-        }
-        
-        String boxedFirstType = TypeTransformer.transformBoxPrimitives(firstArg.getSignature());
-        String boxedSecondType = TypeTransformer.transformBoxPrimitives(secondArg.getSignature());
-        
-        // JSP.2.3.5.7 step 3, if either is BigDecimal, promote both and compare
-        if (TypeConstants.TYPE_BIG_DOUBLE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BIG_DOUBLE.equals(boxedSecondType))
-        {
-            return handleNumericComparison(firstArg, secondArg, BigDecimal.class);
-        }
-        
-        // JSP.2.3.5.7, step 4 if either is a float or double, promote both to 
-        // double and compare
-        if (TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedSecondType))
-        {
-            return handleNumericComparison(firstArg, secondArg, Double.class);
-        }
-        
-        // JSP.2.3.5.7, step 5 if either is a big integer, promote and compare
-        if (TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstType)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondType))
-        {
-            return handleNumericComparison(firstArg, secondArg, BigInteger.class);
-        }
-        
-        // JSP.2.3.5.7, step 6 if either is Long or smaller, coerce both to Long
-        if (TypeConstants.TYPE_BOXED_LONG.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_LONG.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_INTEGER.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_INTEGER.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_SHORT.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_SHORT.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_BYTE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_BYTE.equals(boxedSecondType)
-                || TypeConstants.SIGNATURE_BOXED_CHARACTER.equals(boxedFirstType)
-                || TypeConstants.SIGNATURE_BOXED_CHARACTER.equals(boxedSecondType))
-        {
-            return handleNumericComparison(firstArg, secondArg, Long.class);
-        }
-        
-        // JSP.2.3.5.7, step 7 if either is a boolean, coerce to boolean
-        if (TypeConstants.TYPE_BOXED_BOOLEAN.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_BOOLEAN.equals(boxedSecondType))
-        {
-            return handleBooleanComparison(firstArg, secondArg);
-        }
-        
-        // Unified EL 1.8.2, step 8 if either is a enum, then coerce both to enum
-        // NOTE: we handle the JSF 1.1 case also where enums are treated as non-coercable
-        // Object's
-        if (firstArg.isEnumType() || secondArg.isEnumType())
-        {
-            return handleEnumComparison(firstArg, secondArg);
-        }
-        
-        // JSP.2.3.5.7, step 8 if either is a string, coerce to string and
-        // compare lexically
-        if (TypeConstants.TYPE_STRING.equals(boxedFirstType)
-                || TypeConstants.TYPE_STRING.equals(boxedSecondType))
-        {
-            return handleStringComparison(firstArg, secondArg);
-        }
-        
-        // otherwise, an equal compare will be done A.equals(B).  Since 
-        return new ValueType(TypeConstants.TYPE_BOOLEAN, IAssignable.ASSIGNMENT_TYPE_RHS);        
-    }
-
-    private ValueType handleEnumComparison(ValueType firstArg,
-            ValueType secondArg) 
-    {
-        assert firstArg.isEnumType() || secondArg.isEnumType();
-        
-        // if the first is not an enum, then we have non-Enum == Enum case
-        if (!firstArg.isEnumType())
-        {
-            return handleComparsionOfEnumAndNonEnum(secondArg, firstArg);
-        }
-        
-        // if the second is not an enum, then we have Enum == non-Enum case
-        if (!secondArg.isEnumType())
-        {
-            return handleComparsionOfEnumAndNonEnum(firstArg, secondArg);
-        }
-        
-        // only other case is they are both enums.  Check if they are directly
-        // comparable.
-        if (TypeUtil.canNeverBeEqual(firstArg.getSignature(), secondArg.getSignature()))
-        {
-            boolean result = doRealOperation("foo", "notFoo");  // just simulate the operation where the operands are not equal //$NON-NLS-1$ //$NON-NLS-2$
-            
-            return BooleanLiteralType.valueOf(result);
-        }
-        
-        // otherwise, all we know is that it's a boolean
-        return new ValueType(TypeConstants.TYPE_BOOLEAN, IAssignable.ASSIGNMENT_TYPE_RHS);
-    }
-
-    private ValueType handleComparsionOfEnumAndNonEnum(ValueType enumType,
-            ValueType nonEnumType) 
-    {
-        // the only literal value that could have got us here is a 
-        // StringLiteralValue since the others a filtered out before this is
-        // called
-        if (nonEnumType instanceof LiteralType)
-        {
-            assert nonEnumType instanceof StringLiteralType;
-            
-            Diagnostic result = validateIfEnumToStringComparison(((StringLiteralType)nonEnumType).getLiteralValue(), enumType);
-            
-            if (result != null)
-            {
-                // compare two things that aren't equal
-                return BooleanLiteralType.valueOf(doRealOperation("foo", "foo_")); //$NON-NLS-1$ //$NON-NLS-2$
-            }
-            return new ValueType(TypeConstants.TYPE_BOOLEAN, IAssignable.ASSIGNMENT_TYPE_RHS);
-        }
-        
-        // if the arg is a String, then we can't prove anything before runtime
-        if (nonEnumType.isInstanceOf(TypeConstants.TYPE_STRING))
-        {
-            return new ValueType(TypeConstants.TYPE_BOOLEAN, IAssignable.ASSIGNMENT_TYPE_RHS);
-        }
-        // otherwise, we know it will result in a problem since one is an enum
-        // and the other isn't so simply do a comparison on two things that aren't equals
-        return BooleanLiteralType.valueOf(doRealOperation("foo", "foo_")); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-    public Diagnostic validate(ValueType firstArg, ValueType secondArg) {
-        
-        // JSP.2.3.5.7 step 2 if either operand is null, then not equal
-        if (TypeCoercer.typeIsNull(firstArg.getSignature())
-                || TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            final boolean result = doRealOperation(new Integer(4), null);
-            return _diagnosticFactory.create_BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME(Boolean.toString(result));
-        }
-
-        final String boxedFirstType = 
-            TypeTransformer.transformBoxPrimitives(firstArg.getSignature());
-        final String boxedSecondType = 
-            TypeTransformer.transformBoxPrimitives(secondArg.getSignature());
-        
-        // JSP.2.3.5.7 step 3, if either is BigDecimal, promote both and compare
-        if (TypeConstants.TYPE_BIG_DOUBLE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BIG_DOUBLE.equals(boxedSecondType))
-        {
-            return validateNumericComparison(firstArg, secondArg, BigDecimal.class);
-        }
-        
-        // JSP.2.3.5.7, step 4 if either is a float or double, promote both to 
-        // double and compare
-        if (TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedSecondType))
-        {
-            return validateNumericComparison(firstArg, secondArg, Double.class);
-        }
-        
-        // JSP.2.3.5.7, step 5 if either is a big integer, promote and compare
-        if (TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstType)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondType))
-        {
-            return validateNumericComparison(firstArg, secondArg, BigInteger.class);
-        }
-        
-        // JSP.2.3.5.7, step 6 if either is Long or smaller, coerce both to Long
-        if (TypeConstants.TYPE_BOXED_LONG.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_LONG.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_INTEGER.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_INTEGER.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_SHORT.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_SHORT.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_BYTE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_BYTE.equals(boxedSecondType)
-                || TypeConstants.SIGNATURE_BOXED_CHARACTER.equals(boxedFirstType)
-                || TypeConstants.SIGNATURE_BOXED_CHARACTER.equals(boxedSecondType))
-        {
-            return validateNumericComparison(firstArg, secondArg, Long.class);
-        }
-        
-        // JSP.2.3.5.7, step 7 if either is a boolean, coerce to boolean
-        if (TypeConstants.TYPE_BOXED_BOOLEAN.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_BOOLEAN.equals(boxedSecondType))
-        {
-            return validateBooleanComparison(firstArg, secondArg);
-        }
-        
-        // Unified EL 1.8.2, step 8 if either is a enum, then coerce both to enum
-        // NOTE: we handle the JSF 1.1 case also where enums are treated as non-coercable
-        // Object's
-        if (firstArg.isEnumType() || secondArg.isEnumType())
-        {
-            return validateEnumComparison(firstArg, secondArg);
-        }
-        
-        // JSP.2.3.5.7, step 8 if either is a string, coerce to string and
-        // compare lexically
-        if (TypeConstants.TYPE_STRING.equals(boxedFirstType)
-                || TypeConstants.TYPE_STRING.equals(boxedSecondType))
-        {
-            return validateStringComparison(firstArg, secondArg);
-        }
-
-        // otherwise, an equal compare will be done A.equals(B).  Since 
-        return Diagnostic.OK_INSTANCE;
-    }
-
-    
-    /**
-     * Both types are coerced to boolean before comparison
-     * 
-     * @param firstArg
-     * @param secondArg
-     * @return the result of the comparison
-     */
-    private ValueType handleBooleanComparison(ValueType firstArg, ValueType secondArg)
-    {
-        boolean canCoerceFirstArg =  
-            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-        boolean canCoerceSecondArg = TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-
-        if (! (canCoerceFirstArg && canCoerceSecondArg))
-        {
-            return null;
-        }
-        
-        if (firstArg instanceof LiteralType && secondArg instanceof LiteralType)
-        {
-            try
-            {
-                Boolean firstValue = ((LiteralType)firstArg).coerceToBoolean();
-                Boolean secondValue = ((LiteralType)secondArg).coerceToBoolean();
-                
-                if (firstValue != null && secondValue != null)
-                {
-                    boolean result = doRealOperation(firstValue, secondValue);
-                    return result ? 
-                               BooleanLiteralType.TRUE : 
-                                       BooleanLiteralType.FALSE;
-                }
-            }
-            catch (TypeCoercionException tce)
-            {
-                throw new AssertionError("should never get here; have already checked coercability above"); //$NON-NLS-1$
-            }
-        }
-        
-        // otherwise, we have a valid comparison that results in boolean
-        return new ValueType(TypeConstants.TYPE_BOOLEAN, IAssignable.ASSIGNMENT_TYPE_RHS);
-    }
-    
-    private Diagnostic validateBooleanComparison(ValueType firstType, ValueType secondType)
-    {
-        boolean canCoerceFirstArg =  
-            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(firstType.getSignature()));
-        boolean canCoerceSecondArg = TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(secondType.getSignature()));
-
-        if (!canCoerceFirstArg)
-        {
-            return _diagnosticFactory.create_BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN(Messages.getString("EqualityRelationalBinaryOperator.FirstArgument")); //$NON-NLS-1$
-        }
-        
-        if (!canCoerceSecondArg)
-        {
-            return _diagnosticFactory.create_BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN(Messages.getString("EqualityRelationalBinaryOperator.SecondArgument")); //$NON-NLS-1$
-        }
-        
-        if (firstType instanceof LiteralType && secondType instanceof LiteralType)
-        {
-            try
-            {
-                Boolean firstValue = ((LiteralType)firstType).coerceToBoolean();
-                Boolean secondValue = ((LiteralType)secondType).coerceToBoolean();
-                
-                if (firstValue != null && secondValue != null)
-                {
-                    final boolean result = 
-                        doRealOperation(firstValue, secondValue);
-                    return _diagnosticFactory.
-                        create_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME(getOperationName(), Boolean.toString(result));
-                }
-            }
-            catch (TypeCoercionException tce)
-            {
-                throw new AssertionError("should never get here; have already checked coercability above"); //$NON-NLS-1$
-            }
-        }
-        
-        // otherwise, we have a valid comparison
-        return Diagnostic.OK_INSTANCE;
-    }
-    
-    @Override
-    protected Diagnostic validateStringComparison(ValueType firstType,
-            ValueType secondType) 
-    {
-        String firstValue = null;
-
-        if (firstType instanceof LiteralType)
-        {
-            firstValue = ((LiteralType)firstType).getLiteralValue();
-        }
-
-        String secondValue = null;
-        if (secondType instanceof LiteralType)
-        {
-            secondValue = ((LiteralType)secondType).getLiteralValue();
-        }
-
-        if (firstValue != null)
-        { 
-            Diagnostic result = validateIfEnumToStringComparison(firstValue, secondType);
-            
-            if (result != null)
-            {
-                return result;
-            }
-        }
-
-        if (secondValue != null)
-        {
-            Diagnostic result = validateIfEnumToStringComparison(secondValue, firstType);
-            
-            if (result != null)
-            {
-                return result;
-            }
-        }
-        
-        // if it's a string to enum compare, do the default parent thing
-        return super.validateStringComparison(firstType, secondType);
-    }
-
-    
-    @Override
-    protected ValueType handleStringComparison(ValueType firstType,
-            ValueType secondType) 
-    {
-        String firstValue = null;
-
-        if (firstType instanceof LiteralType)
-        {
-            firstValue = ((LiteralType)firstType).getLiteralValue();
-        }
-
-        String secondValue = null;
-        if (secondType instanceof LiteralType)
-        {
-            secondValue = ((LiteralType)secondType).getLiteralValue();
-        }
-
-        if (firstValue != null)
-        { 
-            Diagnostic result = validateIfEnumToStringComparison(firstValue, secondType);
-            
-            if (result != null)
-            {
-                return handleIfEnumToNonMemberStringComparison(firstValue, secondType);
-            }
-        }
-
-        if (secondValue != null)
-        {
-            Diagnostic result = validateIfEnumToStringComparison(secondValue, firstType);
-            
-            if (result != null)
-            {
-                return handleIfEnumToNonMemberStringComparison(secondValue, firstType);
-            }
-        }
-
-        // otherwise, do the super thing
-        return super.handleStringComparison(firstType, secondType);
-    }
-
-    private Diagnostic validateEnumComparison(final ValueType firstArg, final ValueType secondArg)
-    {
-        assert firstArg.isEnumType() || secondArg.isEnumType();
-        
-        // if the first is not an enum, then we have non-Enum == Enum case
-        if (!firstArg.isEnumType())
-        {
-            return validateComparsionOfEnumAndNonEnum(firstArg, secondArg);
-        }
-        
-        // if the second is not an enum, then we have Enum == non-Enum case
-        if (!secondArg.isEnumType())
-        {
-            return validateComparsionOfEnumAndNonEnum(secondArg, firstArg);
-        }
-        
-        // only other case is they are both enums.  Check if they are directly
-        // comparable.
-        if (TypeUtil.canNeverBeEqual(firstArg.getSignature(), secondArg.getSignature()))
-        {
-            return _diagnosticFactory.
-                create_BINARY_COMPARISON_WITH_TWO_ENUMS_ALWAYS_SAME
-                    (getOperationName()
-                     , doRealOperation("foo", "notFoo")  // just simulate the operation where the operands are not equal //$NON-NLS-1$ //$NON-NLS-2$
-                     , TypeUtil.getFullyQualifiedName(firstArg.getSignature())
-                     , TypeUtil.getFullyQualifiedName(secondArg.getSignature())); 
-        }
-        
-        // otherwise, it's all good
-        return Diagnostic.OK_INSTANCE;
-    }
-    
-    private Diagnostic validateComparsionOfEnumAndNonEnum(final ValueType nonEnumType, final ValueType enumType)
-    {
-        // the only literal value that could have got us here is a 
-        // StringLiteralValue since the others a filtered out before this is
-        // called
-        if (nonEnumType instanceof LiteralType)
-        {
-            assert nonEnumType instanceof StringLiteralType;
-            
-            Diagnostic result = validateIfEnumToStringComparison(((StringLiteralType)nonEnumType).getLiteralValue(), enumType);
-            
-            if (result != null)
-            {
-                return result;
-            }
-            return Diagnostic.OK_INSTANCE;
-        }
-        
-        // if the arg is a String, then we can't prove anything before runtime
-        if (nonEnumType.isInstanceOf(TypeConstants.TYPE_STRING))
-        {
-            return Diagnostic.OK_INSTANCE;
-        }
-        // otherwise, we know it will result in a problem since one is an enum
-        // and the other isn't
-        return _diagnosticFactory.
-            create_BINARY_COMPARISON_WITH_ENUM_AND_UNCOERCABLE_NONCONST_ALWAYS_SAME
-                (getOperationName()
-                 , doRealOperation("foo", "notFoo")  // just simulate the operation where the operands are not equal //$NON-NLS-1$ //$NON-NLS-2$
-                 , TypeUtil.getFullyQualifiedName(enumType.getSignature())
-                 , TypeUtil.getFullyQualifiedName(nonEnumType.getSignature())); 
-    }
-    
-    private Diagnostic validateIfEnumToStringComparison(final String literalValue, final ValueType validateIfEnum)
-    {
-        if (validateIfEnum.isEnumType()
-                && validateIfEnum instanceof IObjectSymbolBasedValueType)
-        {
-            final IObjectSymbolBasedValueType symbolValueType =
-                (IObjectSymbolBasedValueType) validateIfEnum;
-            
-            IType type = symbolValueType.getSymbol().getTypeDescriptor().resolveType(symbolValueType.getSymbol().getTypeDescriptor().getTypeSignature());
-            
-            if (type != null && !TypeUtil.isEnumMember(type, literalValue))
-            {
-                return _diagnosticFactory.
-                    create_BINARY_COMPARISON_WITH_ENUM_AND_CONST_ALWAYS_SAME
-                        (getOperationName()
-                         , doRealOperation(literalValue, literalValue+"_")  // just simulate the operation where the operands are not equal //$NON-NLS-1$
-                         , TypeUtil.getFullyQualifiedName(validateIfEnum.getSignature())
-                         , literalValue);
-            }
-        }
-       
-        return null;
-    }
-    
-    private ValueType handleIfEnumToNonMemberStringComparison(final String literalValue, final ValueType enumValueType)
-    {
-        // we need to apply the real operation to literalValue and any string that !equals(literalValue)
-        // since it's not a member of the enum
-        return BooleanLiteralType.valueOf(doRealOperation(literalValue, literalValue+"_")); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EqualsBinaryRelationalOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EqualsBinaryRelationalOperator.java
deleted file mode 100644
index 3fa99f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EqualsBinaryRelationalOperator.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents the equals -- ==/eq EL binary operator
- * 
- * @author cbateman
- *
- */
-/*package*/ class EqualsBinaryRelationalOperator extends
-        EqualityRelationalBinaryOperator 
-{
-
-    EqualsBinaryRelationalOperator(final DiagnosticFactory diagnosticFactory, String jsfVersion) {
-        super(diagnosticFactory, jsfVersion);
-    }
-
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the result of the operation
-     */
-    protected boolean doRealOperation(Number firstArg, Number secondArg)
-    {
-        return firstArg.equals(secondArg);
-    }
-    
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the result of the operation
-     */
-    protected boolean doRealOperation(Boolean firstArg, Boolean secondArg)
-    {
-        return firstArg.equals(secondArg);
-    }
-    
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the result  of the operation
-     */
-    protected boolean doRealOperation(String firstArg, String secondArg)
-    {
-        return firstArg.equals(secondArg);
-    }
-
-    protected String getOperationName() 
-    {
-        return Messages.getString("EqualsBinaryRelationalOperator.OperationName"); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/GreaterThanEqRelationalBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/GreaterThanEqRelationalBinaryOperator.java
deleted file mode 100644
index edab570..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/GreaterThanEqRelationalBinaryOperator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Encapsulates the EL greater-than-eq operator -- ">="/ge
- * 
- * @author cbateman
- *
- */
-/*package*/ class GreaterThanEqRelationalBinaryOperator extends
-        LtGtRelationalBinaryOperator 
-{
-    GreaterThanEqRelationalBinaryOperator(final DiagnosticFactory diagnosticFactory, String jsfVersion) {
-        super(diagnosticFactory, jsfVersion);
-    }
-
-    protected boolean doRealOperation(Number firstArg, Number secondArg) 
-    {
-        return ((Comparable)firstArg).compareTo(secondArg) >= 0;
-    }
-
-    protected boolean doRealOperation(String firstArg, String secondArg) 
-    {
-        return firstArg.compareTo(secondArg) >= 0;
-    }
-
-    protected String getOperationName() 
-    {
-        return Messages.getString("GreaterThanEqRelationalBinaryOperator.OperationName"); //$NON-NLS-1$
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/GreaterThanRelationalBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/GreaterThanRelationalBinaryOperator.java
deleted file mode 100644
index 78a62a7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/GreaterThanRelationalBinaryOperator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents the EL greater than operator -- ">"/gt
- * @author cbateman
- *
- */
-/*package*/ class GreaterThanRelationalBinaryOperator extends
-        LtGtRelationalBinaryOperator {
-
-    GreaterThanRelationalBinaryOperator(final DiagnosticFactory diagnosticFactory, String jsfVersion) 
-    {
-        super(diagnosticFactory, jsfVersion);
-    }
-
-    protected boolean doRealOperation(Number firstArg, Number secondArg) 
-    {
-        return ((Comparable)firstArg).compareTo(secondArg) > 0;
-    }
-
-    protected boolean doRealOperation(String firstArg, String secondArg) 
-    {
-        return firstArg.compareTo(secondArg) > 0;
-    }
-
-    protected String getOperationName() 
-    {
-        return Messages.getString("GreaterThanRelationalBinaryOperator.OperationName"); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LessThanEqRelationalBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LessThanEqRelationalBinaryOperator.java
deleted file mode 100644
index 24dc5e2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LessThanEqRelationalBinaryOperator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-
-/**
- * Encapsulates the EL less-than-equal operator -- "<="/le
- * 
- * @author cbateman
- *
- */
-/*package*/ class LessThanEqRelationalBinaryOperator extends
-        LtGtRelationalBinaryOperator 
-{
-    LessThanEqRelationalBinaryOperator(final DiagnosticFactory diagnosticFactory, String jsfVersion) {
-        super(diagnosticFactory, jsfVersion);
-    }
-
-    protected boolean doRealOperation(Number firstArg, Number secondArg) 
-    {
-        return ((Comparable)firstArg).compareTo(secondArg) <= 0;
-    }
-
-    protected boolean doRealOperation(String firstArg, String secondArg) 
-    {
-        return firstArg.compareTo(secondArg) <= 0;
-    }
-
-    protected String getOperationName() 
-    {
-        return Messages.getString("LessThanEqRelationalBinaryOperator.OperationName"); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LessThanRelationalBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LessThanRelationalBinaryOperator.java
deleted file mode 100644
index 7b8e7ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LessThanRelationalBinaryOperator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * The "<"/"lt" less-than EL operator
- * 
- * @author cbateman
- *
- */
-/*package*/ class LessThanRelationalBinaryOperator extends
-        LtGtRelationalBinaryOperator 
-{
-    LessThanRelationalBinaryOperator(final DiagnosticFactory diagnosticFactory, String jsfVersion) 
-    {
-        super(diagnosticFactory, jsfVersion);
-    }
-
-    protected boolean doRealOperation(Number firstArg, Number secondArg) 
-    {
-        return ((Comparable)firstArg).compareTo(secondArg) < 0;
-    }
-
-    protected boolean doRealOperation(String firstArg, String secondArg) 
-    {
-        return firstArg.compareTo(secondArg) < 0;
-    }
-
-    protected String getOperationName() 
-    {
-        return Messages.getString("LessThanRelationalBinaryOperator.OperationName"); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LogicalBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LogicalBinaryOperator.java
deleted file mode 100644
index 41b897f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LogicalBinaryOperator.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.types.BooleanLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercionException;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents a logical binary operator per JSP.2.3.6.1 (logical and/or)
- * 
- * @author cbateman
- *
- */
-/*package*/abstract class LogicalBinaryOperator extends BinaryOperator 
-{
-    LogicalBinaryOperator(DiagnosticFactory diagnosticFactory) {
-        super(diagnosticFactory);
-    }
-
-    public ValueType performOperation(ValueType firstArg, ValueType secondArg) 
-    {
-        final boolean canCoerceFirstArg = 
-            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-        final boolean canCoerceSecondArg = 
-            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-        
-        // if can't perform, must return null
-        if (! (canCoerceFirstArg && canCoerceSecondArg))
-        {
-            return null;
-        }
-
-        Boolean  firstArgResolvedValue = null;
-        
-        if (firstArg instanceof LiteralType)
-        {
-            try
-            {
-                firstArgResolvedValue = ((LiteralType)firstArg).coerceToBoolean();
-            }
-            catch (TypeCoercionException tce)
-            {
-                // should never be throw due to already checking if can coerce
-                throw new AssertionError("coercion already checked; this should never be reached");
-            }
-        }
-    
-        Boolean secondArgResolvedValue = null;
-        if (secondArg instanceof LiteralType)
-        {
-            try
-            {
-                secondArgResolvedValue = ((LiteralType)secondArg).coerceToBoolean();
-            }
-            catch (TypeCoercionException tce)
-            {
-                // should never be throw due to already checking if can coerce
-                throw new AssertionError("coercion already checked; this should never be reached");
-            }
-        }
-
-        if (firstArgResolvedValue != null && secondArgResolvedValue != null)
-        {
-            boolean result = 
-                doRealOperation(firstArgResolvedValue, secondArgResolvedValue);
-            
-            return result ? BooleanLiteralType.TRUE : BooleanLiteralType.FALSE;
-            
-        }
-        
-        // otherwise, just return a boolean
-        // result can only be an rvalue
-        return new ValueType(TypeConstants.TYPE_BOOLEAN, IAssignable.ASSIGNMENT_TYPE_RHS);
-    }
-
-    public Diagnostic validate(ValueType firstArg, ValueType secondArg) 
-    {
-        final boolean canCoerceFirstArg = 
-            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-        final boolean canCoerceSecondArg = 
-            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-       
-        if (!canCoerceFirstArg)
-        {
-            return _diagnosticFactory.
-                    create_BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN("first");
-            //return new BasicDiagnostic(Diagnostic.ERROR, "", 0, "Cannot coerce first argument of "+readableOperatorName()+" to boolean", null);
-        }
-       
-        if (!canCoerceSecondArg)
-        {
-            return _diagnosticFactory.
-                create_BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN("first");
-
-            //return new BasicDiagnostic(Diagnostic.ERROR, "", 0, "Cannot coerce second argument of "+readableOperatorName()+" to boolean", null);
-        }
-           
-        if (firstArg instanceof LiteralType)
-        {
-            try
-            {
-                final Boolean boolValue = 
-                    ((LiteralType)firstArg).coerceToBoolean();
-         
-                if (boolValue.booleanValue() == shortCircuitValue())
-                {
-                    return _diagnosticFactory.
-                        create_BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS
-                            (shortCircuitValue(), readableOperatorName());
-                }
-            }
-            catch (TypeCoercionException tce)
-            {
-                // should never be throw due to already checking if can coerce
-                throw new AssertionError("coercion already checked; this should never be reached");
-            }
-        }
-        
-        if (secondArg instanceof LiteralType)
-        {
-            try
-            {
-                final Boolean boolValue =
-                    ((LiteralType)secondArg).coerceToBoolean();
- 
-                if (boolValue.booleanValue() == shortCircuitValue())
-                {
-                    return _diagnosticFactory.
-                        create_BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME
-                            (shortCircuitValue(), readableOperatorName());
-                }
-            }
-            catch (TypeCoercionException tce)
-            {
-                // should never be throw due to already checking if can coerce
-                throw new AssertionError("coercion already checked; this should never be reached");
-            }
-        }
-           
-        // otherwise, nothing to report
-        return Diagnostic.OK_INSTANCE;
-    }
-    
-    /**
-     * @return a human readable name for the operator
-     */
-    protected abstract String readableOperatorName();
-    
-    /**
-     * @return the boolean value on which the operator short-circuits
-     */
-    protected abstract boolean shortCircuitValue();
-    
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the result of performing the operator to two actual values
-     */
-    protected abstract boolean doRealOperation(Boolean firstArg, Boolean secondArg);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LtGtRelationalBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LtGtRelationalBinaryOperator.java
deleted file mode 100644
index e4695ac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/LtGtRelationalBinaryOperator.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.BooleanLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.common.util.TypeUtil;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Encapsulates the EL binary operators "<", ">", "<=", ">="
- * 
- * @author cbateman
- *
- */
-/*package*/ abstract class LtGtRelationalBinaryOperator extends RelationalBinaryOperator 
-{
-    LtGtRelationalBinaryOperator(final DiagnosticFactory diagnosticFactory, String jsfVersion) 
-    {
-        super(diagnosticFactory, jsfVersion);
-    }
-
-    protected abstract boolean doRealOperation(Number firstArg, Number secondArg);
-
-    protected abstract boolean doRealOperation(String firstArg, String secondArg); 
-
-    public ValueType performOperation(ValueType firstArg, ValueType secondArg) 
-    {
-        // JSP.2.3.5.6 step 2 if either operand is null, then always false
-        if (TypeCoercer.typeIsNull(firstArg.getSignature())
-                || TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            return BooleanLiteralType.FALSE;
-        }
-        
-        String boxedFirstType = TypeTransformer.transformBoxPrimitives(firstArg.getSignature());
-        String boxedSecondType = TypeTransformer.transformBoxPrimitives(secondArg.getSignature());
-        
-        // JSP.2.3.5.6 step 3, if either is BigDecimal, promote both and compare
-        if (TypeConstants.TYPE_BIG_DOUBLE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BIG_DOUBLE.equals(boxedSecondType))
-        {
-            return handleNumericComparison(firstArg, secondArg, BigDecimal.class);
-        }
-        
-        // JSP.2.3.5.6, step 4 if either is a float or double, promote both to 
-        // double and compare
-        if (TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedSecondType))
-        {
-            return handleNumericComparison(firstArg, secondArg, Double.class);
-        }
-        
-        // JSP.2.3.5.6, step 5 if either is a big integer, promote and compare
-        if (TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstType)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondType))
-        {
-            return handleNumericComparison(firstArg, secondArg, BigInteger.class);
-        }
-        
-        // JSP.2.3.5.6, step 6 if either is Long or smaller, coerce both to Long
-        if (TypeConstants.TYPE_BOXED_LONG.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_LONG.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_INTEGER.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_INTEGER.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_SHORT.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_SHORT.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_BYTE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_BYTE.equals(boxedSecondType)
-                || TypeConstants.SIGNATURE_BOXED_CHARACTER.equals(boxedFirstType)
-                || TypeConstants.SIGNATURE_BOXED_CHARACTER.equals(boxedSecondType))
-        {
-            return handleNumericComparison(firstArg, secondArg, Long.class);
-        }
-        
-        // JSP.2.3.5.7, step 7 if either is a string, coerce to string and
-        // compare lexically
-        if (TypeConstants.TYPE_STRING.equals(boxedFirstType)
-                || TypeConstants.TYPE_STRING.equals(boxedSecondType))
-        {
-            return handleStringComparison(firstArg, secondArg);
-        }
-        
-        // JSP.2.3.5.7, steps 8 and 9 -- if either one implements the
-        // Comparable interface, then as far as we can determine statically
-        // (compareTo may not work on the other arg, but who knows),
-        // we are good
-        if (firstArg.isInstanceOf(TypeConstants.TYPE_COMPARABLE)
-                || secondArg.isInstanceOf(TypeConstants.TYPE_COMPARABLE))
-        {
-            if (checkIfIncompatibleEnums(firstArg, secondArg))
-            {
-                // error: no point in validating further since expr will probably throw an exception
-                return null;
-            }
-            
-            return new ValueType(Signature.SIG_BOOLEAN, IAssignable.ASSIGNMENT_TYPE_RHS);
-        }
-        
-        // JSP.2.3.5.6, step 10 -- otherwise, error
-        return null;
-
-    }
-
-    public Diagnostic validate(ValueType firstArg, ValueType secondArg) 
-    {
-        // JSP.2.3.5.6 step 2 if either operand is null, then always false
-        if (TypeCoercer.typeIsNull(firstArg.getSignature())
-                || TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            return _diagnosticFactory.
-                create_BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME(Messages.getString("LtGtRelationalBinaryOperator.ConstantName.False")); //$NON-NLS-1$
-        }
-        
-        String boxedFirstType = TypeTransformer.transformBoxPrimitives(firstArg.getSignature());
-        String boxedSecondType = TypeTransformer.transformBoxPrimitives(secondArg.getSignature());
-        
-        // JSP.2.3.5.6 step 3, if either is BigDecimal, promote both and compare
-        if (TypeConstants.TYPE_BIG_DOUBLE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BIG_DOUBLE.equals(boxedSecondType))
-        {
-            return validateNumericComparison(firstArg, secondArg, BigDecimal.class);
-        }
-        
-        // JSP.2.3.5.6, step 4 if either is a float or double, promote both to 
-        // double and compare
-        if (TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedSecondType))
-        {
-            return validateNumericComparison(firstArg, secondArg, Double.class);
-        }
-        
-        // JSP.2.3.5.6, step 5 if either is a big integer, promote and compare
-        if (TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstType)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondType))
-        {
-            return validateNumericComparison(firstArg, secondArg, BigInteger.class);
-        }
-        
-        // JSP.2.3.5.6, step 6 if either is Long or smaller, coerce both to Long
-        if (TypeConstants.TYPE_BOXED_LONG.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_LONG.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_INTEGER.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_INTEGER.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_SHORT.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_SHORT.equals(boxedSecondType)
-                || TypeConstants.TYPE_BOXED_BYTE.equals(boxedFirstType)
-                || TypeConstants.TYPE_BOXED_BYTE.equals(boxedSecondType)
-                || TypeConstants.SIGNATURE_BOXED_CHARACTER.equals(boxedFirstType)
-                || TypeConstants.SIGNATURE_BOXED_CHARACTER.equals(boxedSecondType))
-        {
-            return validateNumericComparison(firstArg, secondArg, Long.class);
-        }
-        
-        // JSP.2.3.5.7, step 7 if either is a string, coerce to string and
-        // compare lexically
-        if (TypeConstants.TYPE_STRING.equals(boxedFirstType)
-                || TypeConstants.TYPE_STRING.equals(boxedSecondType))
-        {
-            return validateStringComparison(firstArg, secondArg);
-        }
-        
-        // JSP.2.3.5.7, steps 8 and 9 -- if either one implements the
-        // Comparable interface, then as far as we can determine statically
-        // (compareTo may not work on the other arg, but who knows),
-        // we are good
-        if (firstArg.isInstanceOf(TypeConstants.TYPE_COMPARABLE)
-                || secondArg.isInstanceOf(TypeConstants.TYPE_COMPARABLE))
-        {
-            Diagnostic diag = Diagnostic.OK_INSTANCE;
-            if(checkIfIncompatibleEnums(firstArg, secondArg))
-            {
-                diag = _diagnosticFactory.create_BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE();
-            }
-            return diag;
-        }
-        
-        // JSP.2.3.5.6, step 10 -- otherwise, error
-        return _diagnosticFactory.create_BINARY_OP_NO_AVAILABLE_TYPE_COERCION();
-    }
-
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return diagnostic if firstArg and secondArg are incompatible with each other
-     * for compareTo purpose or OK if not
-     */
-    private boolean checkIfIncompatibleEnums(ValueType firstArg,
-            ValueType secondArg) 
-    {
-        if (firstArg.isEnumType()
-                && secondArg.isEnumType()
-                && !TypeUtil.isEnumsCompareCompatible(firstArg.getSignature()
-                                                    , secondArg.getSignature()))
-        {
-            return true;
-        }
-        
-        return false;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MemberAccessorOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MemberAccessorOperator.java
deleted file mode 100644
index 37390d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MemberAccessorOperator.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.NullLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.SignatureBasedType;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.context.symbol.IMethodSymbol;
-import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
-import org.eclipse.jst.jsf.context.symbol.IPropertySymbol;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.context.symbol.internal.util.IMethodSymbolBasedType;
-import org.eclipse.jst.jsf.context.symbol.internal.util.IObjectSymbolBasedValueType;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.designtime.DesignTimeApplicationManager;
-import org.eclipse.jst.jsf.designtime.el.AbstractDTMethodResolver;
-import org.eclipse.jst.jsf.designtime.el.AbstractDTPropertyResolver;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Super-class for all operators whose function is to access members of an
- * EL object. i.e. the "." and "[]" operators
- * 
- * @author cbateman
- *
- */
-public abstract class MemberAccessorOperator 
-{
-    /**
-     * The source file for the EL expression in which this operator
-     * is being evaluated.
-     */
-    protected final IFile                   _file;
-
-    /**
-     * the common factory used to create diagnostics
-     */
-    protected final DiagnosticFactory       _diagnosticFactory;
-    
-    // TODO: need to reconcile with BinaryOperator? performOperation must return
-    // SignatureBasedType since it may return a method.  This can't happen
-    // with other operators (besides eqiv [])
-    /**
-     * @param file 
-     * @param diagnosticFactory 
-     */
-    protected MemberAccessorOperator(final IFile file, final DiagnosticFactory diagnosticFactory)
-    {
-        _file = file;
-        _diagnosticFactory = diagnosticFactory;
-    }
-
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the result of validating the dot operation with these arguments.
-     */
-    public Diagnostic validate(ValueType firstArg, ValueType secondArg) 
-    {
-        if (!(firstArg instanceof IObjectSymbolBasedValueType))
-        {
-            throw new AssertionError("The first argument of the member operator must always be a symbol resolvable value type");
-        }
-        
-        if (TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            return _diagnosticFactory.create_BINARY_OP_DOT_WITH_VALUEB_NULL(getOperatorName());
-        }
-
-        return validateObjectSymbolValue((IObjectSymbolBasedValueType) firstArg, secondArg);
-    }
-    
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the diagnostic for member(firstArg, secondArg)
-     */
-    protected abstract Diagnostic validateObjectSymbolValue(IObjectSymbolBasedValueType firstArg, ValueType secondArg);
-    
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return a validation of a named property accessible base (map or bean) given
-     * an a literal key argument
-     */
-    protected Diagnostic validateNamedPropertyAccessorBase(IObjectSymbolBasedValueType firstArg
-                                                  , LiteralType secondArg)
-    {
-		final IObjectSymbol curBaseSymbol = firstArg.getSymbol();
-		
-		final ISymbol nextSymbol = getMemberSymbol(firstArg.getSymbol(), 
-											secondArg.getLiteralValueRaw());
-		
-		// if the x in x.y is an unconstrained map an it returns
-		// a java.lang.Object, then return null.  We can't really say
-		// anything meaningful about such a property anyway.
-		// TODO: do we need to refine the type descriptor on such 
-		// a property object to make this more precise?
-		if (curBaseSymbol.supportsCoercion(TypeConstants.TYPE_MAP)
-				&& nextSymbol instanceof IPropertySymbol
-				&& TypeConstants.TYPE_JAVAOBJECT.equals(((IPropertySymbol)nextSymbol).getTypeDescriptor().getTypeSignature()))
-		{
-			// if we get a symbol back that's a generic object coming from a map
-			// then stop validating; we can't tell anything for sure
-			return Diagnostic.OK_INSTANCE;
-		}
-		
-		if (nextSymbol == null)
-		{
-			return _diagnosticFactory.create_MEMBER_NOT_FOUND(secondArg.getLiteralValue()
-			,firstArg.getSymbol().getName());
-		}
-		
-		return Diagnostic.OK_INSTANCE;
-    }
-    
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the resolved type for the operation or null if not computable
-     */
-    public SignatureBasedType performOperation(ValueType firstArg, ValueType secondArg) 
-    {
-        if (!(firstArg instanceof IObjectSymbolBasedValueType))
-        {
-        	return null;
-        }
-
-        // per JSP.2.3.4, if value-b is null, then return null (not literal null)
-        if (TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            return null;
-        }
-
-        return handlePerformObjectSymbolValue((IObjectSymbolBasedValueType)firstArg, secondArg);
-    }
-
-    /**
-     * @param firstArg -- represents value-a (expr-a after step 1) in JSP.2.3.4
-     * @param secondArg -- represents value-b (expr-b after step 3) in JSP.2.3.4
-     * @return the new ValueType for this operation or null
-     */
-    protected abstract SignatureBasedType handlePerformObjectSymbolValue(IObjectSymbolBasedValueType firstArg
-                                                  , ValueType secondArg);
-
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the resolved type for firstArg[secondArg] treating firstArg as a type
-     * that uses a named property accessor (i.e. a map or bean but not a list or array)
-     * or null if unresolved
-     */
-    protected SignatureBasedType handlePerformNamedPropertyAccessorBase(IObjectSymbolBasedValueType firstArg
-                                                  , LiteralType secondArg)
-    {
-        final ISymbol symbol = 
-            getMemberSymbol(firstArg.getSymbol(), secondArg.getLiteralValueRaw());
-
-        if (symbol instanceof IPropertySymbol)
-        {
-            return new IObjectSymbolBasedValueType((IPropertySymbol)symbol);
-        }
-        else if (symbol instanceof IMethodSymbol)
-        {
-            return new IMethodSymbolBasedType((IMethodSymbol) symbol);
-        }
-        
-        // fall-through and return null
-        // per JSP2.3.4 steps 5 and 6, return null literal if map, null (error) otherwise
-        if (firstArg.isInstanceOf(TypeConstants.TYPE_MAP))
-        {
-        	return NullLiteralType.SINGLETON;
-        }
-        return null;
-    }
-    
-    /**
-     * @param symbol
-     * @param name
-     * @return the member symbol of 'symbol' corresponding to 'name' or
-     * null if there is no such member
-     */
-    protected final ISymbol getMemberSymbol(final IObjectSymbol symbol, final Object name)
-    {
-        ISymbol  memberSymbol = getPropertySymbol(symbol, name);
-
-        if (memberSymbol != null)
-        {
-            return memberSymbol;
-        }
-
-        memberSymbol = getMethodSymbol(symbol, name);
-        
-        // otherwise, see if it's a valid method
-        if (memberSymbol != null)
-        {
-            return memberSymbol;
-        }
-        
-        // if not a property or method, then not a valid member
-        return null;
-    }
-    
-    /**
-     * @param symbol
-     * @param name
-     * @return the property symbol called name relative to 'symbol' or null
-     * if one doesn't exist
-     */
-    protected final ISymbol getPropertySymbol(final ISymbol symbol, final Object name)
-    {
-        AbstractDTPropertyResolver resolver = getPropertyResolver();
-        
-        if (resolver != null)
-        {
-            return resolver.getProperty(symbol,name);
-        }
-        
-        JSFCorePlugin.log("Error acquiring property resolver", new Throwable());
-        return null;
-    }
-
-    /**
-     * @param symbol
-     * @param name
-     * @return the method symbol on 'symbol' corresponding to
-     * 'name' or null if no such member
-     */
-    protected final IMethodSymbol getMethodSymbol(final IObjectSymbol symbol, final Object name)
-    {
-        AbstractDTMethodResolver resolver = getMethodResolver();
-        
-        if (resolver != null)
-        {
-            return resolver.getMethod(symbol, name);
-        }
-        
-        JSFCorePlugin.log("Error acquiring property resolver", new Throwable());
-        return null;
-
-    }
-    
-    /**
-     * @return the property resolver for the current source file
-     */
-    protected final AbstractDTPropertyResolver  getPropertyResolver()
-    {
-        return
-            DesignTimeApplicationManager.getInstance(_file.getProject())
-                .getPropertyResolver();
-    }
-    
-    /**
-     * @return the method resolver for the current source file
-     */
-    protected final AbstractDTMethodResolver getMethodResolver()
-    {
-        return
-            DesignTimeApplicationManager.getInstance(_file.getProject())
-                .getMethodResolver();
-    }
-    
-    /**
-     * @return a user-readable name of the operator (i.e. dot or bracket)
-     */
-    protected abstract String getOperatorName();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/Messages.java
deleted file mode 100644
index 99d0193..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/Messages.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-class Messages {
-    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.validation.internal.el.operators.messages"; //$NON-NLS-1$
-
-    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-            .getBundle(BUNDLE_NAME);
-
-    private Messages() {
-        // no external instantiation
-    }
-
-    /**
-     * @param key
-     * @return the string or !key! if not found
-     */
-    public static String getString(String key) {
-        try {
-            return RESOURCE_BUNDLE.getString(key);
-        } catch (MissingResourceException e) {
-            return '!' + key + '!';
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MinusUnaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MinusUnaryOperator.java
deleted file mode 100644
index 7dcdc3b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MinusUnaryOperator.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.FloatLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.common.internal.types.IntegerLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.StringLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercionException;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents the EL unary operator '-' on a ValueType 
- * as described by JSP.2.3.5.4
- * 
- * 
- * @author cbateman
- *
- */
-/*package*/class MinusUnaryOperator extends UnaryOperator 
-{
-    private static final String UNARY_MINUS = "unary minus";
-
-    MinusUnaryOperator(DiagnosticFactory diagnosticFactory) 
-    {
-        super(diagnosticFactory);
-    }
-
-    public Diagnostic validate(ValueType type)
-    {
-        // must coerce to numeric type
-        try
-        {
-            // if coerceTypeNumber doesn't throw an exception, then
-            // give the benefit of the doubt
-            final String coercedType =
-                TypeCoercer.
-                    coerceToNumber(TypeTransformer.
-                            transformBoxPrimitives(type.getSignature()));
-            
-            if (TypeCoercer.typeIsNull(coercedType))
-            {
-                // null always coerces to 0L on this operator
-                return _diagnosticFactory.
-                    create_UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO();
-            }
-
-            // JSP.2.3.5.4, step 2 if BigDecimal or BigInteger, then can't be
-            // literal and retains type
-            if (TypeConstants.TYPE_BIG_DOUBLE.equals(coercedType)
-                    || TypeConstants.TYPE_BIG_INTEGER.equals(coercedType))
-            {
-                return Diagnostic.OK_INSTANCE;
-            }
-
-            // JSP.2.4.5.4, step 3: if String
-            // note, use uncoerced type, since type coercer will return null for strings
-            if (TypeCoercer.typeIsString(type.getSignature()))
-            {
-                // if it's a string and we have the value, we can determine for
-                // sure whether or not it's coercable to a number
-                // per JSP.2.3.5.4 step 3.1
-                if (type instanceof StringLiteralType)
-                {
-                    String literalValue = ((LiteralType)type).getLiteralValue();
-                    if (literalValue.indexOf('.') > -1
-                            || literalValue.indexOf('e') > -1
-                            || literalValue.indexOf('E') > -1)
-                    {
-                        // if it coerces to double, then it's a double
-                        ((LiteralType)type).coerceToNumber(Double.class);
-                        // this is okay, because an expression like #{-3.3} can't be folded
-                        return Diagnostic.OK_INSTANCE;
-                    }
-                    // per JSP.2.3.5.4, step 3.2 try to coerce to long
-                    // if it coerces to long, then it's a long
-                    ((LiteralType)type).coerceToNumber(Long.class);
-                    // this is okay, because an expression like #{-3} can't be folded
-                    return Diagnostic.OK_INSTANCE;
-                }
-                // if non-literal string, warn that coercion to number is not 
-                // guaranteed since Long.valueOf and Double.valueOf 
-                // (unlike Boolean.valueOf) throw NumberFormatExceptions
-                return _diagnosticFactory.create_UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED(UNARY_MINUS);
-            }
-            
-            // JSP.2.3.5.4, step 4, for all numeric types, retain type,
-            // validate constant folding
-            // note that this return true for big int and decimal, so those cases
-            // must already have been handled.
-            if (TypeCoercer.typeIsNumeric(coercedType))
-            {
-                // otherwise, we are fine
-                return Diagnostic.OK_INSTANCE;
-            }
-            
-        }
-        catch (TypeCoercionException tce)
-        {
-            // fallthrough to error below
-        }
-        // otherwise, error
-        return _diagnosticFactory.create_UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(UNARY_MINUS);
-    }
-    
-    /**
-     * Based on JSP.2.3.5.4
-     * 
-     * @param type
-     * @return type of type after a minus is applied or null if unknown
-     */
-    public ValueType performOperation(ValueType type)
-    {
-        try
-        {
-            final String  boxedType = 
-                TypeTransformer.transformBoxPrimitives(type.getSignature());
-            // check for valid type coercion 
-            String coercedType = TypeCoercer.coerceToNumber(boxedType);
-
-            if (TypeCoercer.typeIsNull(coercedType))
-            {
-                // null always coerces to 0L on this operator
-                return new IntegerLiteralType(0L);
-            }
-
-            // JSP.2.3.5.4, step 2 if BigDecimal or BigInteger, then can't be
-            // literal and retains type
-            if (TypeConstants.TYPE_BIG_DOUBLE.equals(coercedType))
-            {
-                return new ValueType(TypeConstants.TYPE_BIG_DOUBLE, IAssignable.ASSIGNMENT_TYPE_RHS);
-            }
-            else if (TypeConstants.TYPE_BIG_INTEGER.equals(coercedType))
-            {
-                return new ValueType(TypeConstants.TYPE_BIG_INTEGER, IAssignable.ASSIGNMENT_TYPE_RHS);
-            }
-            
-            if (TypeCoercer.typeIsString(type.getSignature()))
-            {
-                // if it's string and we have the value, we can determine for
-                // sure whether or not it's coercable to a number
-                // per JSP.2.3.5.4 step 3
-                if (type instanceof StringLiteralType)
-                {
-                    String literalValue = ((LiteralType)type).getLiteralValue();
-                    if (literalValue.indexOf('.') > -1
-                            || literalValue.indexOf('e') > -1
-                            || literalValue.indexOf('E') > -1)
-                    {
-                        // if it coerces to double, then it's a double
-                        Number value = ((LiteralType)type).coerceToNumber(Double.class);
-                        return new FloatLiteralType(-1 * value.doubleValue());
-                    }
-    
-                    // if it coerces to long, then it's a long
-                    Number value = ((LiteralType)type).coerceToNumber(Long.class);
-                    return new IntegerLiteralType(-1 * value.longValue());
-                }
-                
-                // otherwise, just return a long typed value
-                return new ValueType(Signature.SIG_LONG, IAssignable.ASSIGNMENT_TYPE_RHS);
-            }
-            
-            // JSP.2.3.5.4
-            // big integer and big decimal retain type
-            // all numeric types retain type
-            if (TypeCoercer.typeIsNumeric(boxedType))
-            {
-                // integer and float literals are special because -1 or -1.0
-                // is syntically minusOp(1) and minusOp(1.0)
-                if (type instanceof IntegerLiteralType)
-                {
-                    return new IntegerLiteralType(-1 * ((IntegerLiteralType)type).coerceToNumber(Long.class).longValue());
-                }
-                else if (type instanceof FloatLiteralType)
-                {
-                    return new FloatLiteralType(-1 * ((FloatLiteralType)type).coerceToNumber(Double.class).doubleValue());
-                }
-                return type;
-            }
-           
-            // all other cases, return null
-            // even is type represents a String, without it's value, we have
-            // no idea how to coerce it without it's value
-            // fall through and return null
-        }
-        catch (TypeCoercionException tce)
-        {
-            // do nothing, fall through and return null
-        }
-        
-        return null;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/ModArithmeticBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/ModArithmeticBinaryOperator.java
deleted file mode 100644
index ed8e394..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/ModArithmeticBinaryOperator.java
+++ /dev/null
@@ -1,384 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.FloatLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.common.internal.types.IntegerLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercionException;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents the EL modulo operator: % or mod
- * Based JSP.2.3.5.3
- * 
- * @author cbateman
- *
- */
-/*package*/ class ModArithmeticBinaryOperator extends ArithmeticBinaryOperator 
-{
-    private static final String MODULO = "modulo";
-
-    ModArithmeticBinaryOperator(DiagnosticFactory diagnosticFactory) {
-        super(diagnosticFactory);
-        // TODO Auto-generated constructor stub
-    }
-
-    public ValueType performOperation(ValueType firstArg, ValueType secondArg) 
-    {
-        // JSP.2.3.5.3, step 1 if both null, then return zero
-        if (TypeCoercer.typeIsNull(firstArg.getSignature())
-                && TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            return IntegerLiteralType.ZERO;
-        }
-
-        final String boxedFirstArg = TypeTransformer.transformBoxPrimitives(firstArg.getSignature());
-        final String boxedSecondArg = TypeTransformer.transformBoxPrimitives(secondArg.getSignature());
-        
-        // JSP.2.3.5.3, step 2, if either arg is BigDecimal, Float, Double
-        // or String (ignoring whether it is value coercable), then coerce
-        // to Double and do op
-        if (TypeConstants.TYPE_BIG_DOUBLE.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_DOUBLE.equals(boxedSecondArg)
-                || TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedSecondArg)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedSecondArg))
-        {
-            // TODO: handle case where one is a literal or resolvable string value
-            // that containss ".", "e" or "E"
-            return performDouble(firstArg, secondArg);
-        }
-        
-        // JSP.2.3.5.3, step 3, if either arg is a BigInteger, coerce
-        // both to BigInteger
-        if (TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondArg))
-        {
-            return performBigInteger(firstArg, secondArg);
-        }
-        
-        // JSP.2.3.5.3, step 4, otherwise try to perform as a Long op
-        return performLong(firstArg, secondArg);
-    }
-
-    public Diagnostic validate(ValueType firstArg, ValueType secondArg) {
-        // JSP.2.3.5.3, step 1 if both null, then return zero
-        if (TypeCoercer.typeIsNull(firstArg.getSignature())
-                && TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            return _diagnosticFactory.create_BINARY_OP_BOTH_OPERANDS_NULL(MODULO);
-        }
-
-        final String boxedFirstArg = TypeTransformer.transformBoxPrimitives(firstArg.getSignature());
-        final String boxedSecondArg = TypeTransformer.transformBoxPrimitives(secondArg.getSignature());
-        
-        // JSP.2.3.5.3, step 2, if either arg is BigDecimal, Float, Double
-        // or String (ignoring whether it is value coercable), then coerce
-        // to Double and do op
-        if (TypeConstants.TYPE_BIG_DOUBLE.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_DOUBLE.equals(boxedSecondArg)
-                || TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedSecondArg)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BOXED_FLOAT.equals(boxedSecondArg))
-        {
-            // TODO: handle case where one is a literal or resolvable string value
-            // that containss ".", "e" or "E"
-            return validateDouble(firstArg, secondArg);
-        }
-        
-        // JSP.2.3.5.3, step 3, if either arg is a BigInteger, coerce
-        // both to BigInteger
-        if (TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondArg))
-        {
-            return validateBigInteger(firstArg, secondArg);
-        }
-        
-        // JSP.2.3.5.3, step 4, otherwise try to perform as a Long op
-        return validateLong(firstArg, secondArg);
-    }
-
-    private ValueType performDouble(ValueType firstArg, ValueType secondArg)
-    {
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-            
-            Number secondValue = null;
-            
-            if (secondArg instanceof LiteralType)
-            {
-                secondValue = ((LiteralType)secondArg).coerceToNumber(Double.class);
-                
-                if (secondValue.doubleValue() == 0.0)
-                {
-                    // division by zero
-                    return null;
-                }
-            }
-            
-            Number firstValue = null;
-            
-            if (firstArg instanceof LiteralType)
-            {
-                firstValue = ((LiteralType)firstArg).coerceToNumber(Double.class);
-            }
-            
-            if (firstValue != null && secondValue != null)
-            {
-                return new FloatLiteralType(
-                        doRealOperation(new Double(firstValue.doubleValue()), 
-                                        new Double(secondValue.doubleValue())).doubleValue());
-            }
-
-            // if we get to here, the coercion is valid, so a Double will be
-            // returned
-            return new ValueType(Signature.SIG_DOUBLE, IAssignable.ASSIGNMENT_TYPE_RHS);
-        }
-        catch (TypeCoercionException tce)
-        {
-            // could not coerce, so null
-            return null;
-        }
-    }
-    
-    private ValueType performBigInteger(ValueType firstArg, ValueType secondArg)
-    {
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-            
-            // check second arg for zero
-            if (secondArg instanceof LiteralType)
-            {
-                if (((LiteralType)secondArg).coerceToNumber(BigInteger.class).equals(BigInteger.ZERO))
-                {
-                    // division by zero
-                    return null;
-                }
-            }
-            
-            // since one of the args is BigInteger, they are not both literals,
-            // so if we get to here, we have a successful mod of two
-            // big integers to one big integer
-            return new ValueType(TypeConstants.TYPE_BIG_INTEGER, IAssignable.ASSIGNMENT_TYPE_RHS);
-        }
-        catch (TypeCoercionException tce)
-        {
-            // no coercion
-            return null;
-        }
-    }
-    
-    private ValueType performLong(ValueType firstArg, ValueType secondArg)
-    {
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-        
-            Number secondValue = null;
-            
-            if (secondArg instanceof LiteralType)
-            {
-                secondValue = ((LiteralType)secondArg).coerceToNumber(Long.class);
-                
-                if (secondValue.longValue() == 0)
-                {
-                    // division by zero
-                    return null;
-                }
-            }
-            
-            Number firstValue = null;
-            
-            if (firstArg instanceof LiteralType)
-            {
-                firstValue = ((LiteralType)firstArg).coerceToNumber(Long.class);
-            }
-            
-            if (firstValue != null && secondValue != null)
-            {
-                return new IntegerLiteralType(
-                        doRealOperation(new Long(firstValue.longValue()), 
-                                        new Long(secondValue.longValue())).longValue());
-            }
-
-            // if we get to here, the coercion is valid, so a Long will be
-            // returned
-            return new ValueType(Signature.SIG_LONG, IAssignable.ASSIGNMENT_TYPE_RHS);
-        }
-        catch (TypeCoercionException tce)
-        {
-            // could not coerce, so null
-            return null;
-        }
-    }
-    
-    private Diagnostic validateDouble(ValueType firstArg, ValueType secondArg)
-    {
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-            
-            Number secondValue = null;
-            
-            if (secondArg instanceof LiteralType)
-            {
-                secondValue = ((LiteralType)secondArg).coerceToNumber(Double.class);
-                
-                if (secondValue.doubleValue() == 0.0)
-                {
-                    // division by zero
-                    return _diagnosticFactory.create_BINARY_OP_POSSIBLE_DIVISION_BY_ZERO();
-                }
-            }
-            
-            Number firstValue = null;
-            
-            if (firstArg instanceof LiteralType)
-            {
-                firstValue = ((LiteralType)firstArg).coerceToNumber(Double.class);
-            }
-            
-            if (firstValue != null && secondValue != null)
-            {
-                return _diagnosticFactory.
-                    create_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME
-                        (MODULO, Double.toString(
-                                firstValue.doubleValue()%secondValue.doubleValue()));
-            }
-
-            // if we get to here, the coercion is valid, so a Double will be
-            // returned and everything is good
-            return Diagnostic.OK_INSTANCE;
-        }
-        catch (TypeCoercionException tce)
-        {
-            // could not coerce, so error
-            return _diagnosticFactory.
-                create_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(MODULO);
-        }
-    }
-    
-    private Diagnostic validateBigInteger(ValueType firstArg, ValueType secondArg)
-    {
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-            
-            // check second arg for zero
-            if (secondArg instanceof LiteralType)
-            {
-                if (((LiteralType)secondArg).coerceToNumber(BigInteger.class).equals(BigInteger.ZERO))
-                {
-                    // division by zero
-                    return _diagnosticFactory.create_BINARY_OP_POSSIBLE_DIVISION_BY_ZERO();
-                }
-            }
-            
-            // since one of the args is BigInteger, they are not both literals,
-            // so if we get to here, we have a successful mod of two
-            // big integers to one big integer
-            return Diagnostic.OK_INSTANCE;
-        }
-        catch (TypeCoercionException tce)
-        {
-            // no coercion
-            return _diagnosticFactory.
-                create_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(MODULO);
-        }        
-    }
-    
-    private Diagnostic validateLong(ValueType firstArg, ValueType secondArg)
-    {
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-        
-            Number secondValue = null;
-            
-            if (secondArg instanceof LiteralType)
-            {
-                secondValue = ((LiteralType)secondArg).coerceToNumber(Long.class);
-                
-                if (secondValue.longValue() == 0)
-                {
-                    // division by zero
-                    return _diagnosticFactory.
-                        create_BINARY_OP_POSSIBLE_DIVISION_BY_ZERO();
-                }
-            }
-            
-            Number firstValue = null;
-            
-            if (firstArg instanceof LiteralType)
-            {
-                firstValue = ((LiteralType)firstArg).coerceToNumber(Long.class);
-            }
-            
-            if (firstValue != null && secondValue != null)
-            {
-                return _diagnosticFactory.
-                    create_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME
-                        (MODULO, Long.toString(firstValue.longValue()%secondValue.longValue())); 
-            }
-
-            // if we get to here, the coercion is valid, so a Long will be
-            // returned
-            return Diagnostic.OK_INSTANCE;
-        }
-        catch (TypeCoercionException tce)
-        {
-            // could not coerce, so error
-            return _diagnosticFactory.
-                create_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(MODULO);
-        }
-    }
-    
-    protected Long doRealOperation(Long firstArg, Long secondArg) {
-        return new Long(firstArg.longValue() % secondArg.longValue());
-     }
-
-     protected Double doRealOperation(Double firstArg, Double secondArg) {
-         return new Double(firstArg.doubleValue() % secondArg.doubleValue());
-     }
-
-     protected BigDecimal doRealOperation(BigDecimal firstArg,
-             BigDecimal secondArg) {
-        return new BigDecimal(firstArg.doubleValue() % secondArg.doubleValue());
-     }
-
-    protected String getOperatorName() {
-        return MODULO;
-    }
-     
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MultiplyArithmeticBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MultiplyArithmeticBinaryOperator.java
deleted file mode 100644
index 01f8d9a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MultiplyArithmeticBinaryOperator.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import java.math.BigDecimal;
-
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents the EL Multiply arithmetic binary operator "*"
- * 
- * @author cbateman
- *
- */
-/*package*/ class MultiplyArithmeticBinaryOperator extends
-        NoDivArithmeticBinaryOperator 
-{
-    private static final String MULTIPLICATION = "multiplication";
-
-
-    MultiplyArithmeticBinaryOperator(DiagnosticFactory diagnosticFactory) 
-    {
-        super(diagnosticFactory);
-    }
-
-    protected Long doRealOperation(Long firstArg, Long secondArg) 
-    {
-        return new Long(firstArg.longValue() * secondArg.longValue());
-    }
-
-    protected Double doRealOperation(Double firstArg, Double secondArg) 
-    {
-        return new Double(firstArg.doubleValue() * secondArg.doubleValue());
-    }
-
-    protected BigDecimal doRealOperation(BigDecimal firstArg,
-            BigDecimal secondArg) 
-    {
-        return firstArg.multiply(secondArg);
-    }
-
-    protected String getOperatorName() {
-        return MULTIPLICATION;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/NoDivArithmeticBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/NoDivArithmeticBinaryOperator.java
deleted file mode 100644
index 5bdc163..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/NoDivArithmeticBinaryOperator.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.FloatLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.common.internal.types.IntegerLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercionException;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents non-dividing arithmetic EL operators: +,-,*
- * Based on JSP.2.3.5.1
- * 
- * @author cbateman
- *
- */
-/*package*/ abstract class NoDivArithmeticBinaryOperator extends ArithmeticBinaryOperator 
-{
-    NoDivArithmeticBinaryOperator(DiagnosticFactory diagnosticFactory) {
-        super(diagnosticFactory);
-    }
-
-    protected abstract Long doRealOperation(Long firstArg, Long secondArg);
-    
-    protected abstract Double doRealOperation(Double firstArg, Double secondArg);
-
-    public ValueType performOperation(ValueType firstArg, ValueType secondArg)
-    {
-        // JSP.2.3.5.1, step 1, if either arg is null, return (Long) 0
-        if (TypeCoercer.typeIsNull(firstArg.getSignature())
-                && TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            return new IntegerLiteralType(0);
-        }
-        
-        final String boxedFirstArg = TypeTransformer.transformBoxPrimitives(firstArg.getSignature());
-        final String boxedSecondArg = TypeTransformer.transformBoxPrimitives(secondArg.getSignature());
-        
-        // JSP.2.3.5.1, step 2, if either arg is a BigDecimal, coerce to BigDecimal
-        // and apply
-        if (TypeConstants.TYPE_BIG_DOUBLE.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_DOUBLE.equals(boxedSecondArg))
-        {
-            return handleNumericArithmetic(firstArg, secondArg, BigDecimal.class);
-        }
-        
-        // JSP.2.3.5.1, step 3, if either arg is float or double or 
-        // a String containing "., e or E", then coerce if the other is
-        // a big int, coerce up to BigDecimal, else to Double
-        // Note: we are ignoring strings we can't resolve to figure out
-        // if the contain "., e or E".  Assume they always do
-        if (TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedFirstArg)
-                ||TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedSecondArg)
-                ||TypeConstants.TYPE_BOXED_FLOAT.equals(boxedFirstArg)
-                ||TypeConstants.TYPE_BOXED_FLOAT.equals(boxedSecondArg))
-        {
-            if (TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstArg)
-                    ||TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondArg))
-            {
-                // if the other operand is BigInteger, treat as BigDecimal
-                return handleNumericArithmetic(firstArg, secondArg, BigDecimal.class);
-            }
-
-            // otherwise as double
-            return handleNumericArithmetic(firstArg, secondArg, Double.class);
-        }
-        
-        // JSP.2.3.5.1, step 4, if one is a big integer, coerce to big integer
-        if (TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondArg))
-        {
-            return handleNumericArithmetic(firstArg, secondArg, BigInteger.class);
-        }
-        
-        // JSP.2.3.5.1, step 5, otherwise, try to coerce to Long
-        return handleNumericArithmetic(firstArg, secondArg, Long.class);
-    }
-
-    public Diagnostic validate(ValueType firstArg, ValueType secondArg) 
-    {
-        // JSP.2.3.5.1, step 1, if either arg is null, return (Long) 0
-        if (TypeCoercer.typeIsNull(firstArg.getSignature())
-                && TypeCoercer.typeIsNull(secondArg.getSignature()))
-        {
-            return _diagnosticFactory.create_BINARY_OP_BOTH_OPERANDS_NULL(getOperatorName());
-        }
-        
-        final String boxedFirstArg = TypeTransformer.transformBoxPrimitives(firstArg.getSignature());
-        final String boxedSecondArg = TypeTransformer.transformBoxPrimitives(secondArg.getSignature());
-        
-        // JSP.2.3.5.1, step 2, if either arg is a BigDecimal, coerce to BigDecimal
-        // and apply
-        if (TypeConstants.TYPE_BIG_DOUBLE.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_DOUBLE.equals(boxedSecondArg))
-        {
-            return validateNumericArithmetic(firstArg, secondArg, BigDecimal.class);
-        }
-        
-        // JSP.2.3.5.1, step 3, if either arg is float or double or 
-        // a String containing "., e or E", then coerce if the other is
-        // a big int, coerce up to BigDecimal, else to Double
-        // Note: we are ignoring strings we can't resolve to figure out
-        // if the contain "., e or E".  Assume they always do
-        if (TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedFirstArg)
-                ||TypeConstants.TYPE_BOXED_DOUBLE.equals(boxedSecondArg)
-                ||TypeConstants.TYPE_BOXED_FLOAT.equals(boxedFirstArg)
-                ||TypeConstants.TYPE_BOXED_FLOAT.equals(boxedSecondArg))
-        {
-            if (TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstArg)
-                    ||TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondArg))
-            {
-                // if the other operand is BigInteger, treat as BigDecimal
-                return validateNumericArithmetic(firstArg, secondArg, BigDecimal.class);
-            }
-
-            // otherwise as double
-            return validateNumericArithmetic(firstArg, secondArg, Double.class);
-        }
-        
-        // JSP.2.3.5.1, step 4, if one is a big integer, coerce to big integer
-        if (TypeConstants.TYPE_BIG_INTEGER.equals(boxedFirstArg)
-                || TypeConstants.TYPE_BIG_INTEGER.equals(boxedSecondArg))
-        {
-            return validateNumericArithmetic(firstArg, secondArg, BigInteger.class);
-        }
-        
-        // JSP.2.3.5.1, step 5, otherwise, try to coerce to Long
-        return validateNumericArithmetic(firstArg, secondArg, Long.class);
-    }
-
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @param numberType
-     * @return a value type based on the result of the arithmetic operation
-     */
-    protected ValueType handleNumericArithmetic(ValueType firstArg, ValueType secondArg, Class numberType)
-    {
-        try
-        {
-//            final String coercedFirstArg = 
-                TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-//            final String coercedSecondArg = 
-                TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-            
-            if (firstArg instanceof LiteralType && secondArg instanceof LiteralType)
-            {
-                try
-                {
-                    Number firstValue = 
-                        ((LiteralType)firstArg).coerceToNumber(numberType);
-                    Number secondValue = 
-                        ((LiteralType)secondArg).coerceToNumber(numberType);
-                    
-                    LiteralType result = null;
-                    
-                    if (numberType == Double.class)
-                    {
-                        Double resultValue = 
-                            doRealOperation((Double)firstValue, 
-                                    (Double) secondValue);
-                        result = new FloatLiteralType(resultValue.doubleValue());
-                    }
-                    else if (numberType == Long.class)
-                    {
-                        Long resultValue = 
-                            doRealOperation((Long) firstValue, (Long) secondValue);
-                        result = new IntegerLiteralType(resultValue.longValue());
-                    }
-                    else
-                    {
-                        throw new AssertionError("unsupport arithmetic upcast type");
-                    }
-                    
-                    return result;  
-                }
-                catch (TypeCoercionException tce)
-                {
-                    // could happen if two string literals passed
-                    return null;
-                }
-            }
-            
-            // if we get to here, then we have two valid numeric arith
-            // types, but at least one is not a literal, so the best we can
-            // say is that the return will be the same asthe type of numeric
-            // coercion
-            if (numberType == BigDecimal.class)
-            {
-                return new ValueType(TypeConstants.TYPE_BIG_DOUBLE, IAssignable.ASSIGNMENT_TYPE_RHS);
-            }
-            else if (numberType == Double.class)
-            {
-                return new ValueType(Signature.SIG_DOUBLE, IAssignable.ASSIGNMENT_TYPE_RHS);
-            }
-            else if (numberType == BigInteger.class)
-            {
-                return new ValueType(TypeConstants.TYPE_BIG_INTEGER, IAssignable.ASSIGNMENT_TYPE_RHS);
-            }
-            else
-            {
-                return new ValueType(Signature.SIG_LONG, IAssignable.ASSIGNMENT_TYPE_RHS);
-            }
-        }
-        catch (TypeCoercionException tce)
-        {
-            // coercion to number failed, so no go
-            return null;
-        }
-    }
-    
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @param numberType
-     * @return a diagnostic validating the arithmetic expr firstArg op secondArg
-     */
-    protected Diagnostic validateNumericArithmetic(ValueType firstArg, ValueType secondArg, Class numberType)
-    {
-        try
-        {
-//            final String coercedFirstArg = 
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-//            final String coercedSecondArg = 
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-            
-            if (firstArg instanceof LiteralType && secondArg instanceof LiteralType)
-            {
-                try
-                {
-                    Number firstValue = 
-                        ((LiteralType)firstArg).coerceToNumber(numberType);
-                    Number secondValue = 
-                        ((LiteralType)secondArg).coerceToNumber(numberType);
-                    
-                    Number result = null;
-                    
-                    if (numberType == Double.class)
-                    {
-                        result =
-                            doRealOperation((Double)firstValue, 
-                                    (Double) secondValue);
-                    }
-                    else if (numberType == Long.class)
-                    {
-                        result =
-                            doRealOperation((Long) firstValue, (Long) secondValue);
-                    }
-                    else
-                    {
-                        throw new AssertionError("unsupport arithmetic upcast type");
-                    }
-                    
-                    return _diagnosticFactory.
-                        create_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME
-                            (getOperatorName(), result.toString());  
-                }
-                catch (TypeCoercionException tce)
-                {
-                    // could happen when two strings are passed
-                    return _diagnosticFactory.
-                        create_BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS();
-                }
-            }
-            
-            // if we get to here, then we have two valid numeric arith
-            // types, but at least one is not a literal
-            // everything should be ok
-            return Diagnostic.OK_INSTANCE;
-        }
-        catch (TypeCoercionException tce)
-        {
-            // coercion to number failed, so no go
-            return _diagnosticFactory.
-                create_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(getOperatorName());
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/NotEqualsBinaryRelationalOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/NotEqualsBinaryRelationalOperator.java
deleted file mode 100644
index 1d62454..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/NotEqualsBinaryRelationalOperator.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents the not equals -- "!="/ne EL binary operator
- * @author cbateman
- *
- */
-/*package*/ class NotEqualsBinaryRelationalOperator extends
-        EqualityRelationalBinaryOperator {
-
-    NotEqualsBinaryRelationalOperator(final DiagnosticFactory diagnosticFactory, String jsfVersion) 
-    {
-        super(diagnosticFactory, jsfVersion);
-    }
-
-    protected boolean doRealOperation(Number firstArg, Number secondArg) {
-        return !firstArg.equals(secondArg);
-    }
-
-    protected boolean doRealOperation(Boolean firstArg, Boolean secondArg) {
-        return !firstArg.equals(secondArg);
-    }
-
-    protected boolean doRealOperation(String firstArg, String secondArg) {
-        return !firstArg.equals(secondArg);
-    }
-
-    protected String getOperationName() 
-    {
-        return Messages.getString("NotEqualsBinaryRelationalOperator.OperationName"); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/NotUnaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/NotUnaryOperator.java
deleted file mode 100644
index dd1d5db..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/NotUnaryOperator.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.types.BooleanLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercionException;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents te EL unary operators "!" and "not" on a ValueType
- * as described by JSP.2.3.6.2
- * 
- * @author cbateman
- *
- */
-/*package*/ class NotUnaryOperator extends UnaryOperator 
-{
-    NotUnaryOperator(DiagnosticFactory diagnosticFactory) 
-    {
-        super(diagnosticFactory);
-    }
-
-    public Diagnostic validate(ValueType type)
-    {
-        boolean canCoerce =
-            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(type.getSignature()));
-
-        if (canCoerce)
-        {
-            // check for constant evaluation
-            if (type instanceof LiteralType)
-            {
-                try
-                {
-                    Boolean coercedValue = ((LiteralType)type).coerceToBoolean();
-                    
-                    // we are logically notting, so coerced is true, then false
-                    // if false then true
-                    return _diagnosticFactory.create_UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID(
-                                 "not"
-                                 , Boolean.valueOf(!coercedValue.booleanValue()).toString()); 
-                        
-                }
-                catch (TypeCoercionException tce)
-                {
-                    throw new AssertionError("coerce should not throw exception");
-                }
-            }
-            
-            return Diagnostic.OK_INSTANCE;
-        }
-        return _diagnosticFactory.create_UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN();
-    }
-    
-    public ValueType performOperation(ValueType type)
-    {
-        boolean canCoerce =
-            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(type.getSignature()));
-
-        if (canCoerce)
-        {
-            if (type instanceof LiteralType)
-            {
-                try
-                {
-                    Boolean coercedValue = ((LiteralType)type).coerceToBoolean();
-                    
-                    // we are logically notting, so coerced is true, then false
-                    // if false then true
-                    return 
-                        coercedValue.booleanValue() ? 
-                                  BooleanLiteralType.FALSE :
-                                      BooleanLiteralType.TRUE;
-                }
-                catch (TypeCoercionException tce)
-                {
-                    throw new AssertionError("coerce should not throw exception");
-                }
-            }
-            
-            return new ValueType(TypeConstants.TYPE_BOOLEAN, type.getAssignability());
-        }
-        return null;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/OrBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/OrBinaryOperator.java
deleted file mode 100644
index 33bd4be..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/OrBinaryOperator.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/** 
- * Encapsulates the 'and'/'&&' boolean-AND operator
- * Based on JSP.2.3.6.1
- * 
- * @author cbateman
- *
- */
-/*package*/class OrBinaryOperator extends LogicalBinaryOperator 
-{
-    OrBinaryOperator(DiagnosticFactory diagnosticFactory) 
-    {
-        super(diagnosticFactory);
-    }
-
-    protected boolean doRealOperation(Boolean firstArg, Boolean secondArg) 
-    {
-        return (firstArg.booleanValue() || secondArg.booleanValue());
-    }
-
-    protected String readableOperatorName()
-    {
-        return "logical-OR";
-    }
-
-    protected boolean shortCircuitValue() 
-    {
-        // OR short-circuits on true
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/RelationalBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/RelationalBinaryOperator.java
deleted file mode 100644
index 924ec98..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/RelationalBinaryOperator.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.types.BooleanLiteralType;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercionException;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.core.IJSFCoreConstants;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-
-/**
- * Super-class of all relational binary ops - "==", "!=", "<", ">", "<=", ">="
- * @author cbateman
- *
- */
-/*package*/ abstract class RelationalBinaryOperator extends BinaryOperator 
-{
-    private final String        _jsfVersion;
-    
-    RelationalBinaryOperator(final DiagnosticFactory diagnosticFactory, final String jsfVersion)
-    {
-        super(diagnosticFactory);
-        _jsfVersion = jsfVersion;
-    }
-    
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the result of the operation
-     */
-    protected abstract boolean doRealOperation(Number firstArg, Number secondArg);
-
-    /**
-     * @param firstArg
-     * @param secondArg
-     * @return the result  of the operation
-     */
-    protected abstract boolean doRealOperation(String firstArg, String secondArg);
-
-    /**
-     * @return the operation's user readable name
-     */
-    protected abstract String getOperationName();
-    
-    /**
-     * Performs a the operation, casting both args to BigDecimal first
-     * 
-     * @param firstArg
-     * @param secondArg
-     * @param numberType 
-     * @return the result of the comparison or null if indeterminate
-     */
-    protected ValueType handleNumericComparison(ValueType firstArg, ValueType secondArg, Class  numberType)
-    {
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
-            
-            Number firstValue = null;
-            if (firstArg instanceof LiteralType)
-            {
-                firstValue = ((LiteralType)firstArg).coerceToNumber(numberType);
-            }
-            
-            Number secondValue = null;
-            if (secondArg instanceof LiteralType)
-            {
-                secondValue = ((LiteralType)secondArg).coerceToNumber(numberType);
-            }
-            
-            if (firstValue != null && secondValue != null)
-            {
-                boolean result = doRealOperation(firstValue, secondValue);
-                
-                return result ? BooleanLiteralType.TRUE : BooleanLiteralType.FALSE;
-            }
-            
-            // if we get to here, we only know that both can be up cast to BigDecimal
-            // and compared.  This will yield a boolean result
-            // this value cannot be lhs
-            return new ValueType(TypeConstants.TYPE_BOOLEAN, IAssignable.ASSIGNMENT_TYPE_RHS);
-        }
-        catch (TypeCoercionException tce)
-        {
-            // no valid coercion, so return null
-            return null;
-        }
-    }
-    
-    /**
-     * @param firstType
-     * @param secondType
-     * @param numberType
-     * @return a diagnostic validating the relational comparison of firstType to secondType
-     */
-    protected Diagnostic validateNumericComparison(ValueType firstType, ValueType secondType, Class numberType)
-    {
-        try
-        {
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(firstType.getSignature()));
-            TypeCoercer.coerceToNumber(TypeTransformer.transformBoxPrimitives(secondType.getSignature()));
-            
-            Number firstValue = null;
-            if (firstType instanceof LiteralType)
-            {
-                firstValue = ((LiteralType)firstType).coerceToNumber(numberType);
-            }
-            
-            Number secondValue = null;
-            if (secondType instanceof LiteralType)
-            {
-                secondValue = ((LiteralType)secondType).coerceToNumber(numberType);
-            }
-            
-            if (firstValue != null && secondValue != null)
-            {
-                boolean result = doRealOperation(firstValue, secondValue);
-                
-                return _diagnosticFactory.
-                    create_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME
-                        (getOperationName(), Boolean.toString(result));
-            }
-            
-            // if we get to here, we only know that both can be up cast to BigDecimal
-            // and compared.  This condition is okay
-            return Diagnostic.OK_INSTANCE;
-        }
-        catch (TypeCoercionException tce)
-        {
-            // could not make numeric coercion for valid comparison
-            return _diagnosticFactory.create_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION(getOperationName());
-        }
-    }
-
-    /**
-     * @param firstType
-     * @param secondType
-     * @return the result of the operation
-     */
-    protected ValueType handleStringComparison(ValueType firstType, ValueType secondType)
-    {
-        String firstValue = null;
-        
-        if (firstType instanceof LiteralType)
-        {
-            firstValue = ((LiteralType)firstType).getLiteralValue();
-        }
-        
-        String secondValue = null;
-        if (secondType instanceof LiteralType)
-        {
-            secondValue = ((LiteralType)secondType).getLiteralValue();
-        }
-        
-        if (firstValue != null && secondValue != null)
-        {
-            boolean newValue = doRealOperation(firstValue, secondValue);
-            return newValue ? BooleanLiteralType.TRUE : BooleanLiteralType.FALSE;
-        }
-        
-        // if don't have all literals, just return boolean type
-        return new ValueType(TypeConstants.TYPE_BOOLEAN, IAssignable.ASSIGNMENT_TYPE_RHS);
-    }
-
-    /**
-     * @param firstType
-     * @param secondType
-     * @return a diagnostic validating the string comparison of firstType to secondType
-     */
-    protected Diagnostic validateStringComparison(ValueType firstType, ValueType secondType)
-    {
-        String firstValue = null;
-        
-        if (firstType instanceof LiteralType)
-        {
-            firstValue = ((LiteralType)firstType).getLiteralValue();
-        }
-        
-        String secondValue = null;
-        if (secondType instanceof LiteralType)
-        {
-            secondValue = ((LiteralType)secondType).getLiteralValue();
-        }
-        
-        if (firstValue != null && secondValue != null)
-        {
-            boolean newValue = doRealOperation(firstValue, secondValue);
-            return _diagnosticFactory.
-                create_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME
-                    (getOperationName(), Boolean.toString(newValue));
-        }
-        
-        // if don't have all literals, just return boolean type
-        return Diagnostic.OK_INSTANCE;
-    }
-    
-
-    /**
-     * @return the current JSF version string
-     */
-    protected final String getJsfVersion() {
-        return _jsfVersion;
-    }
-    
-    /**
-     * @return true if the JSF version for this operator is JSF 1.1 or 1.0
-     */
-    protected final boolean isPreJSF12()
-    {
-        return IJSFCoreConstants.JSF_VERSION_1_1.equals(_jsfVersion) 
-                || IJSFCoreConstants.JSF_VERSION_1_0.equals(_jsfVersion);
-    }
-    
-    /**
-     * @return true if the JSF version for this operator is JSF 1.2 or later
-     */
-    protected final boolean isJSF12OrLater()
-    {
-        return !isPreJSF12();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/SubtractArithmeticBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/SubtractArithmeticBinaryOperator.java
deleted file mode 100644
index bc1b97b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/SubtractArithmeticBinaryOperator.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import java.math.BigDecimal;
-
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents the EL arithmetic subtraction binary operator
- * 
- * @author cbateman
- *
- */
-/*package*/  class SubtractArithmeticBinaryOperator extends
-        NoDivArithmeticBinaryOperator 
-{
-
-    private static final String SUBTRACTION = "subtraction";
-
-    SubtractArithmeticBinaryOperator(DiagnosticFactory diagnosticFactory) {
-        super(diagnosticFactory);
-    }
-
-    protected Long doRealOperation(Long firstArg, Long secondArg) 
-    {
-        return new Long(firstArg.longValue() - secondArg.longValue());
-    }
-
-    protected Double doRealOperation(Double firstArg, Double secondArg) 
-    {
-        return new Double(firstArg.doubleValue() - secondArg.doubleValue());
-    }
-
-    protected BigDecimal doRealOperation(BigDecimal firstArg,
-            BigDecimal secondArg) 
-    {
-        return firstArg.subtract(secondArg);
-    }
-
-    protected String getOperatorName() 
-    {
-        return SUBTRACTION;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/TernaryChoiceOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/TernaryChoiceOperator.java
deleted file mode 100644
index c50d8ab..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/TernaryChoiceOperator.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.types.IAssignable;
-import org.eclipse.jst.jsf.common.internal.types.LiteralType;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
-import org.eclipse.jst.jsf.common.internal.types.TypeCoercionException;
-import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Represents the ternary choice op in EL: a ? b :c
- * Based on JSP.2.3.8
- * 
- * @author cbateman
- *
- */
-public class TernaryChoiceOperator 
-{
-    private final DiagnosticFactory     _diagnosticFactory;
-    
-    
-    /**
-     * @param diagnosticFactory
-     */
-    public TernaryChoiceOperator(DiagnosticFactory diagnosticFactory)
-    {
-        super();
-        _diagnosticFactory = diagnosticFactory;
-    }
-
-    /**
-     * @param choiceArg
-     * @param whenTrueArg
-     * @param whenFalseArg
-     * @return the result of the choice arguments or null if indeterminant
-     */
-    public ValueType perform(ValueType choiceArg, ValueType whenTrueArg, ValueType whenFalseArg)
-    {
-        final boolean isChoiceBoolean = 
-            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(choiceArg.getSignature()));
-        
-        if (isChoiceBoolean)
-        {
-            if (choiceArg instanceof LiteralType)
-            {
-                try
-                {
-                    Boolean result = ((LiteralType)choiceArg).coerceToBoolean();
-                    
-                    if (result != null)
-                    {
-                        return result.booleanValue() ? whenTrueArg : whenFalseArg;
-                    }
-                }
-                catch (TypeCoercionException tce)
-                {
-                    return null;
-                }
-            }
-            
-            final String boxedWhenTrueArg =
-                TypeTransformer.transformBoxPrimitives(whenTrueArg.getSignature());
-            
-            final String boxedWhenFalseArg =
-                TypeTransformer.transformBoxPrimitives(whenFalseArg.getSignature());
-            // check if the two results are the same type
-            // TODO: could increase accuracy by appoximating type:i.e. if both
-            // are numeric etc.
-            if (boxedWhenTrueArg.equals(boxedWhenFalseArg))
-            {
-                return new ValueType(whenTrueArg, IAssignable.ASSIGNMENT_TYPE_RHS);
-            }
-
-            // otherwise, we have no idea what the resulting type is
-            return null;
-        }
-        
-        // if choice is not boolean, then can't resolve
-        return null;
-    }
-    
-    /**
-     * @param choiceArg
-     * @return a diagnostic validating the choice expr with these arguments
-     */
-    public Diagnostic validate(ValueType choiceArg)
-    {
-        final boolean isChoiceBoolean = 
-            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(choiceArg.getSignature()));
-        
-        if (isChoiceBoolean)
-        {
-            if (choiceArg instanceof LiteralType)
-            {
-                try
-                {
-                    Boolean result = ((LiteralType)choiceArg).coerceToBoolean();
-                    
-                    if (result != null)
-                    {
-                        String whichSelected = result.booleanValue() ? "first" : "second";
-                        return _diagnosticFactory.
-                            create_TERNARY_OP_CHOICE_IS_ALWAYS_SAME
-                                (result.booleanValue(), whichSelected);
-                    }
-                }
-                catch (TypeCoercionException tce)
-                {
-                    return _diagnosticFactory.
-                        create_TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN();
-                }
-            }
-
-            // in both the case where the two arguments are the same and when
-            // they are different types, the best we can say is "OK", since
-            // we really don't know
-            return Diagnostic.OK_INSTANCE;
-        }
-        
-        // if choice is not boolean, then can't resolve
-        return _diagnosticFactory.
-            create_TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/UnaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/UnaryOperator.java
deleted file mode 100644
index d6a0759..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/UnaryOperator.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.validation.internal.el.operators;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.common.internal.types.ValueType;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-import org.eclipse.jst.jsp.core.internal.java.jspel.JSPELParserConstants;
-import org.eclipse.jst.jsp.core.internal.java.jspel.Token;
-
-/**
- * Encapsulates an EL unary operator
- * @author cbateman
- *
- */
-public abstract class UnaryOperator 
-{
-    /**
-     * The common factory used to construct diagnostics
-     */
-    protected final DiagnosticFactory     _diagnosticFactory;
-    
-    /**
-     * @param token
-     * @return true if the token is a unary operator
-     */
-    public static boolean isUnaryOperator(Token token)
-    {
-        return (token.kind == JSPELParserConstants.MINUS)
-                  || (token.kind == JSPELParserConstants.NOT1)
-                  || (token.kind == JSPELParserConstants.NOT2)
-                  || (token.kind == JSPELParserConstants.EMPTY);
-    }
-
-    /**
-     * @param token 
-     * @param diagnosticFactory 
-     * @return a new UnaryOperator instance matching token 
-     */
-    public static UnaryOperator createUnaryOperator(Token token, DiagnosticFactory diagnosticFactory)
-    {
-        if (!isUnaryOperator(token))
-        {
-            throw new IllegalArgumentException("token must be a unary operator");
-        }
-        
-        switch(token.kind)
-        {
-            case JSPELParserConstants.MINUS:
-                return new MinusUnaryOperator(diagnosticFactory);
-
-            case JSPELParserConstants.NOT1:
-            case JSPELParserConstants.NOT2:
-                return new NotUnaryOperator(diagnosticFactory);
-                
-            case JSPELParserConstants.EMPTY:
-                return new EmptyUnaryOperator(diagnosticFactory);
-        }
-
-        // should never get here because all four ops are covered
-        throw new AssertionError();
-    }
-
-    /**
-     * Constructor
-     */
-    UnaryOperator(DiagnosticFactory diagnosticFactory) 
-    {
-        /* no construction or sub-classing outside package*/
-        _diagnosticFactory = diagnosticFactory;
-    }
-    
-    /**
-     * If ValueType is a literal and the operation can be performed, then
-     * the return must be a new LiteralType transformed using this operator.
-     * 
-     * If ValueType is not a literal and the operaton can be performed, then
-     * the return is a new ValueType transformed per the rules of the operator
-     * (i.e. if it is a string type and the operator is "!", then the string
-     * must be coerced to a boolean and this is what will be returned)
-     * 
-     * If the operation cannot be performed on ValueType, return null
-     * 
-     * @param type
-     * @return a new value type after the operation is performed
-     */
-    public abstract ValueType performOperation(ValueType type);
-    
-    
-    /**
-     * @param type
-     * @return a Diagnostic interpreting whether it is valid to perform the
-     * operation on this type
-     */
-    public abstract Diagnostic validate(ValueType type);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/messages.properties
deleted file mode 100644
index 9d7d987..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/messages.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-EqualityRelationalBinaryOperator.FirstArgument=first
-EqualsBinaryRelationalOperator.OperationName=equals
-EqualityRelationalBinaryOperator.SecondArgument=second
-GreaterThanEqRelationalBinaryOperator.OperationName=greater than or equal to
-GreaterThanRelationalBinaryOperator.OperationName=greater than
-LessThanEqRelationalBinaryOperator.OperationName=less than or equal to
-LessThanRelationalBinaryOperator.OperationName=less than
-LtGtRelationalBinaryOperator.ConstantName.False=false
-NotEqualsBinaryRelationalOperator.OperationName=not equals
-BracketOperator.Name=bracket
-DotOperator.Name=dot
diff --git a/jsf/plugins/org.eclipse.jst.jsf.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 e45508d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,77 +0,0 @@
-#Tue Apr 10 09:09:10 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.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.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 3c89e44..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,55 +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.0.1.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin
-Bundle-Vendor: %plugin.provider
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.help;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.gef;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.xml.ui;bundle-version="[1.0.100,1.1.0)",
- org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,2.4.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.1.0)",
- org.eclipse.wst.common.ui.properties;bundle-version="[1.0.101,1.2.0)",
- org.eclipse.jface.text;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.common.emf;bundle-version="[1.1.103,2.0.0)",
- org.eclipse.jst.jsf.facesconfig;bundle-version="[1.0.0,1.1.0)",
- org.eclipse.wst.common.project.facet.core;bundle-version="[1.2.0,1.3.0)",
- org.eclipse.emf.edit.ui;bundle-version="[2.2.0,2.4.0)",
- org.eclipse.jst.jsf.common.ui;bundle-version="[1.0.0,1.1.0)",
- org.eclipse.jdt.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.jsf.core;bundle-version="[1.0.0,1.1.0)",
- org.eclipse.ui.ide;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.common.modulecore;bundle-version="[1.1.0,1.2.0)"
-Eclipse-LazyStart: true
-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.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 04d4782..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 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>
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 2776386..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 eidt a JSF
-			configuration file with Faces Config Editor.
-			<br />
-			<br />
-			To learn more about using cheat sheets, click the help
-			button in the top right corner (?).
-		</description>
-	</intro>
-
-	<!-- Item -->
-
-	<item title="Open the J2EE perspective"
-		href="/org.eclipse.jst.j2ee.doc.user/topics/cjpers.html"
-		dialog="false" skip="true">
-		<description>
-			To open the J2EE perspective, select
-			<b>Window-&gt;Open Perspective-&gt;Other...</b>
-			and choose
-			<b>J2EE</b>
-			.
-			<br />
-			<br />
-			Alternatively, click the following button to perform the
-			task.
-		</description>
-		<command
-			serialization="org.eclipse.ui.perspectives.showPerspective(org.eclipse.ui.perspectives.showPerspective.perspectiveId=org.eclipse.jst.j2ee.J2EEPerspective)" />
-	</item>
-
-	<!-- Item -->
-
-	<item title="Create the JSF web project"
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/create_jsf_app.html"
-		dialog="true" skip="false">
-		<description>
-			To create the JSF web application perform the following
-			steps
-		</description>
-		<subitem
-			label="Select &quot;File-&gt;New-&gt;Project...&quot; from the main menu and choose &quot;Dynamic Web Project&quot; from the resulting &quot;New Project&quot; dialog box"
-			skip="false">
-			<command
-				serialization="org.eclipse.ui.newWizard(newWizardId=org.eclipse.jst.servlet.ui.project.facet.WebProjectWizard)" />
-		</subitem>
-		<subitem
-			label="Input &quot;JSFApplication&quot; into the &quot;Project Name&quot; text box"
-			skip="false" />
-		<subitem
-			label="Select &quot;JavaServer Faces v1.1 Project&quot; in the &quot;Configurations&quot; dropdown box"
-			skip="false" />
-		<subitem
-			label="Accept the rest of the default preloaded values on the &quot;Dynamic Web Project&quot; page and click &quot;Next&quot;"
-			skip="false" />
-		<subitem
-			label="Accept the rest of the default preloaded values on the &quot;Project Facets&quot; page and click &quot;Next&quot;"
-			skip="false" />
-		<subitem
-			label="Accept the rest of the default preloaded values on the &quot;Web Module&quot; page and click &quot;Next&quot;"
-			skip="false" />
-		<subitem
-			label="Specify JSF Facet Settings on the &quot;JSF Capabilities&quot; page and click &quot;Finish&quot;"
-			skip="false" />
-	</item>
-
-	<item title="Open the JSF configuration file"
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/use_facesconfig_editor.html"
-		dialog="true" skip="false">
-		<description>
-			To open the JSF configuration file, Expand the
-			WebContent/WEB-INF/ folder in the &quot;Project
-			Explorer&quot; view; Double click on the
-			&quot;faces-config.xml&quot; file to open it. Or right click
-			on it then select &quot;Open With&quot; -> &quot;FacesConfig
-			Editor&quot;
-		</description>
-		<subitem
-			label="Expand the /JSFApplication/WebContent/WEB-INF/ folder in the &quot;Project Explorer&quot; view; "
-			skip="true">
-		</subitem>
-		<subitem
-			label="Double click on the &quot;faces-config.xml&quot; file to open it.
-			Or right click on it then select &quot;Open With&quot; -> &quot;FacesConfig Editor&quot;"
-			skip="false">
-			<command
-				serialization="org.eclipse.ui.navigate.openResource(filePath=JSFApplication/WebContent/WEB-INF/faces-config.xml)" />
-		</subitem>
-	</item>
-
-
-	<item href=" " title="Get an introduction on the FacesConfig Editor"
-		dialog="false" skip="true">
-		<description>
-			On the &quot;Introduction &quot; page, there are some
-			introductions about the FacesConfig Editor, and some links
-			to start work with it, or show user the tutorial and help
-			documentation.
-		</description>
-	</item>
-
-
-	<item href=" " title="Get an overview of the content" dialog="false"
-		skip="true">
-		<description>
-			On the &quot;Overview &quot; page, there are several tables
-			that list the main elements defined in the current faces
-			config file. By double-clicking on an element, user could be
-			guided to the corresponding page to edit it.
-		</description>
-	</item>
-
-	<item
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/define_navigations.html"
-		title="Create a Navigation Rule">
-		<description>
-			To create a navigation rule perform the following steps
-		</description>
-		<subitem
-			label="Use the JSP Page wizard to create a page called &quot; login.jsp &quot; in the Web Content folder of the new application. 
-			In the Select Templates page of the wizard, select the &quot;New JSP(html) &quot; template. Click Finish."
-			skip="false">
-			<command
-				serialization="org.eclipse.ui.newWizard(newWizardId=org.eclipse.jst.jsp.ui.internal.wizard.NewJSPWizard)" />
-		</subitem>
-		<subitem
-			label="In the same way, create a page called &quot;welcome.jsp &quot; ."
-			skip="false">
-			<command
-				serialization="org.eclipse.ui.newWizard(newWizardId=org.eclipse.jst.jsp.ui.internal.wizard.NewJSPWizard)" />
-		</subitem>
-		<subitem
-			label="Select the &quot;Page&quot; control from the &quot;Palette&quot; and drop it on the &quot;Navigation&quot; tab. 
-			Choose the page in the resulting &quot;Select JSP File&quot; dialog. "
-			skip="false" />
-		<subitem
-			label="Connect the two pages. Click on the &quot;Link&quot; control in the &quot;Palette&quot;, select the &quot;login&quot; page and draw a line to the &quot;welcome&quot; page. 
-			Select the line in the &quot;Navigation&quot; tab and in the property view, set the value of the &quot;from-outcome&quot; to &quot;login&quot; . "
-			skip="false" />
-		<subitem
-			label="Swith to the &quot;Source&quot; page, will find that there is a navigation-rule element created."
-			skip="false" />
-	</item>
-
-	<item
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/create_managedbean.html"
-		title="Create a Managed Bean">
-		<description>
-			To create a managed bean perform the following steps
-		</description>
-		<subitem
-			label="Switch to the &quot;ManagedBean&quot; page; click the &quot;New&quot; button, the new managed bean wizard pops up."
-			skip="false" />
-		<subitem
-			label="On the &quot;Java Class Selection&quot; page, choose &quot;Create a new Java class&quot;, then click &quot;Next&quot;."
-			skip="false" />
-		<subitem
-			label="On the &quot;Java Class&quot; page, input &quot;com.tutorial&quot; into the &quot;Package&quot; field and input &quot;LoginBean&quot; into the &quot;Name&quot; field, 
-			then click &quot;Next&quot; to the next page."
-			skip="false" />
-		<subitem
-			label="On the &quot;Managed Bean Configuration&quot; page, accept the default values and click &quot;Finish&quot; to finish this wizard."
-			skip="false" />
-		<subitem
-			label="Swith to the &quot;Source&quot; page, will find that there is a managed-bean element created."
-			skip="true" />
-	</item>
-
-	<item
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/facesconfig_ui/add_component.html"
-		title="Create a Component">
-		<description>
-			To create a component perform the following steps
-		</description>
-		<subitem
-			label="Switch to the &quot;Component&quot; page; expand the &quot;Components&quot; section; "
-			skip="false" />
-		<subitem
-			label="Click the &quot;New&quot; button, a new empty component element is created."
-			skip="false" />
-		<subitem
-			label="On the right part, fill in the essential fields for this component, for example &quot;Component Type&quot;, &quot;Component Class&quot;."
-			skip="false" />
-		<subitem
-			label="Swith to the &quot;Source&quot; page, will find that there is a component element created."
-			skip="false" />
-	</item>
-
-
-	<item
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/facesconfig_ui/add_converter.html"
-		title="Create a Converter">
-		<description>
-			To create a converter perform the following steps
-		</description>
-		<subitem
-			label="Switch to the &quot;Component&quot; page; expand the &quot;Converters&quot; section; "
-			skip="false" />
-		<subitem
-			label="Click the &quot;New&quot; button, a new empty converter element is created."
-			skip="false" />
-		<subitem
-			label="On the right part, fill in the essential fields for this converter, for example &quot;Converter ID&quot;, &quot;Converter Class&quot;."
-			skip="false" />
-		<subitem
-			label="Swith to the &quot;Source&quot; page, will find that there is a converter element created."
-			skip="false" />
-	</item>
-
-	<item
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/facesconfig_ui/add_renderkit.html"
-		title="Create a Render Kit">
-		<description>
-			To create a render-kit perform the following steps
-		</description>
-		<subitem
-			label="Switch to the &quot;Component&quot; page; expand the &quot;RenderKits&quot; section; "
-			skip="false" />
-		<subitem
-			label="Click the &quot;New&quot; button, a new empty render-kit element is created."
-			skip="false" />
-		<subitem
-			label="On the right part, fill in the essential fields for this converter, for example &quot;Renderkit ID&quot;, &quot;Renderkit Class&quot;."
-			skip="false" />
-		<subitem
-			label="Swith to the &quot;Source&quot; page, will find that there is a render-kit element created."
-			skip="false" />
-	</item>
-
-	<item
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/facesconfig_ui/add_validator.html"
-		title="Create a Validator">
-		<description>
-			To create a validator perform the following steps
-		</description>
-		<subitem
-			label="Switch to the &quot;Component&quot; page; expand the &quot;Validators&quot; section; "
-			skip="false" />
-		<subitem
-			label="Click the &quot;New&quot; button, a new empty validator element is created."
-			skip="false" />
-		<subitem
-			label="On the right part, fill in the essential fields for this converter, for example &quot;Validator ID&quot;, &quot;Validator Class&quot;."
-			skip="false" />
-		<subitem
-			label="Swith to the &quot;Source&quot; page, will find that there is a validator element created."
-			skip="false" />
-	</item>
-
-	<item
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/use_facesconfig_editor.html"
-		title="Editing other elements on the Others Page">
-		<description>
-			On the &quot;Others&quot; page, there are several sections
-			for editing the elements such as
-			&quot;action-listener&quot;, &quot;locale-config&quot;, and
-			so on.
-		</description>
-	</item>
-
-	<item title="Source Page">
-		<description>
-		   The &quot;Source&quot; page is a embeded XML editor, user can edit the xml source of faces config directly here.
-		</description>
-	</item>
-
-	<item title="Completion">
-		<description>
-			Congratulations, you should now be able to use this editor fluently.
-		</description>
-	</item>
-</cheatsheet>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_GotoEditor.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_GotoEditor.gif
deleted file mode 100644
index 0e5bcf6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_GotoEditor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_Introduction.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_Introduction.gif
deleted file mode 100644
index 44cd044..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_Introduction.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_Tutorial.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_Tutorial.gif
deleted file mode 100644
index ad8e5b6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_Tutorial.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope.gif
deleted file mode 100644
index d49078b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Application.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Application.gif
deleted file mode 100644
index 591ceb2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Application.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_None.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_None.gif
deleted file mode 100644
index 0a96aaa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_None.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Request.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Request.gif
deleted file mode 100644
index e875d01..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Request.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Session.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Session.gif
deleted file mode 100644
index cbe011b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Session.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_ManagedBean.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_ManagedBean.gif
deleted file mode 100644
index 6cdef7b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_ManagedBean.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_Pageflow16.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_Pageflow16.gif
deleted file mode 100644
index 5ea67da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_Pageflow16.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_Plugin.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_Plugin.gif
deleted file mode 100644
index 5ea67da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_Plugin.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Action16.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Action16.gif
deleted file mode 100644
index c241f5f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Action16.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_BooleanValue.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_BooleanValue.gif
deleted file mode 100644
index 5002791..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_BooleanValue.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_GenericValue.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_GenericValue.gif
deleted file mode 100644
index 7ef81e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_GenericValue.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_IntegralValue.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_IntegralValue.gif
deleted file mode 100644
index fea95ce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_IntegralValue.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Link.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Link.gif
deleted file mode 100644
index 6c10cea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Link.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Link24.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Link24.gif
deleted file mode 100644
index 8004b19..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Link24.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Outline.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Outline.gif
deleted file mode 100644
index f302d8c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Outline.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Outline_Overview.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Outline_Overview.gif
deleted file mode 100644
index 852dc81..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Outline_Overview.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page.gif
deleted file mode 100644
index 97cafa9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page16.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page16.gif
deleted file mode 100644
index 5b56ee3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page16.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page24.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page24.gif
deleted file mode 100644
index 2fc426f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page24.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Quickfix_Error.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Quickfix_Error.gif
deleted file mode 100644
index 1f0002b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Quickfix_Error.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_TextValue.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_TextValue.gif
deleted file mode 100644
index d483f48..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_TextValue.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/form_banner.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/form_banner.gif
deleted file mode 100644
index aebc0b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/form_banner.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/help.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/help.gif
deleted file mode 100644
index 9d70301..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/help.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/overview_obj.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/overview_obj.gif
deleted file mode 100644
index 03f656f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/overview_obj.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/plugin.properties
deleted file mode 100644
index 7fc983a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/plugin.properties
+++ /dev/null
@@ -1,57 +0,0 @@
-############################################################################
-# Copyright (c) 2004, 2005 Sybase, Inc. and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     Sybase, Inc. - initial API and implementation
-############################################################################
-plugin.name=JavaServer Faces Tools - FacesConfig Editor
-plugin.provider=Eclipse.org
-
-# Editors
-facesConfigEditor=Faces Config Editor
-facesConfigEditorIcon=icons/facesconfig/FacesConfig_Plugin.gif
-
-# Introduction
-pageflow.editor.intro.name = Introduction
-pageflow.editor.intro.description =
-pageflow.editor.intro.section.heading = The Faces Configuration Editor
-pageflow.editor.intro.section.description = The faces configuration editor helps you to complete the JSF web application development process by allowing you to edit faces configuration. Use the pages in this editor to define and edit page navigations, managed beans, component, converter, validator, renderkit and other element configurations.
-pageflow.editor.intro.cheatsheets.link = Tutorial
-pageflow.editor.intro.cheatsheets.text = Launch the cheat sheet for guidance in working with the editor.
-pageflow.editor.intro.help.link = Help
-pageflow.editor.intro.help.text = Launch the help system and review topics about working with faces configuration descriptor.
-pageflow.editor.intro.start.link = Start
-pageflow.editor.intro.start.text = Start working with the editor by selecting PageFlow and defining page navigations.
-
-#overview Section
-pageflow.editor.overview.name = Editor Information
-pageflow.editor.overview.description = This page summaries the editors information.
-pageflow.editor.overview.pageflow.link = PageFlow Editor
-pageflow.editor.overview.pageflow.text = Editor to create or modify Navigation Rules.
-
-pageflow.editor.intro.overview.mbean.text = Editor to create or modify Managed Beans.
-pageflow.editor.overview.mbean.link = ManagedBeans Editor
-pageflow.editor.intro.overview.components.text = Editor to create or modify component elements.
-pageflow.editor.overview.components.link = Components Editor
-pageflow.editor.intro.overview.others.text = Editor to create or modify other elements.
-pageflow.editor.overview.others.link = Others Editor
-pageflow.editor.intro.overview.source.text = Text Editor source.
-pageflow.editor.overview.source.link = Source Editor
-
-contentType.defaultFacesConfig.name = Default FacesConfig File
-contentType.webdotxmlfile.name = Web Application Description File
-
-#property tab's name
-propertyTab.general=Attributes
-propertyTab.attribute=Quick Edit
-
-cheatsheet.pagefloweditor.name = Pageflow Editor Cheat Sheet
-cheatsheet.pagefloweditor.description = Cheat Sheet for using the Pageflow Editor
-
-#preference page
-preferencepage.jsffacesconfigui.name=FacesConfig Editor
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/plugin.xml
deleted file mode 100644
index 19845ce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/plugin.xml
+++ /dev/null
@@ -1,105 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-  <extension
-        point="org.eclipse.ui.preferencePages">
-     <page
-           category="org.eclipse.wst.sse.ui.internal.provisional.preferences/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"
-        extensions="xml"
-        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.wst.common.ui.properties.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.wst.common.ui.properties.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
-           composite="false"
-           contentFile="cheatsheets/facesconfigeditor.xml"
-           id="FacesConfigEditor.CheatSheet"
-           name="FacesConfigEditor CheatSheet"/>
-  </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 0def039..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorMessages.java
+++ /dev/null
@@ -1,1541 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Provides localized messages from EditorMessages.properties.
- */
-public final class EditorMessages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facesconfig.ui.EditorMessages";
-
-	private EditorMessages() {
-		// Do not instantiate
-	}
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, EditorMessages.class);
-	}
-
-	public static String AddEditManagedPropertyDialog_Add;
-
-	public static String AddEditManagedPropertyDialog_Edit;
-
-	/**
-	 * 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;
-
-}
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 095ef07..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorMessages.properties
+++ /dev/null
@@ -1,449 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.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
-
-####################################################
-#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
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 69cbda4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorPlugin.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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.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 EditorPlugin extends AbstractUIPlugin {//implements IStartup {
-
-	// The shared instance.
-	private static EditorPlugin plugin;
-
-	private Logger log;
-
-	private ResourceBundle resourceBundle;
-
-	private static Alerts alerts;
-
-	private URL pluginBase;
-
-	/**
-	 * The constructor.
-	 */
-	public EditorPlugin() {
-		super();
-		plugin = this;
-	}
-	
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		try {
-			// get resource bundle.
-			resourceBundle = ResourceBundle
-					.getBundle("org.eclipse.jst.jsf.facesconfig.ui.EditorPluginResources");
-			alerts = new Alerts(this, resourceBundle);
-			pluginBase = getBundle().getEntry("/");
-
-			// set up logging for this plugin and everthing under it.
-			log = new Logger(this.getBundle(), resourceBundle);
-
-			// log.info("log.StartMessage", CommonPlugin.getVersion());
-		} catch (Exception ee) {
-			// only log if the logger was configured correctly.
-			if (log != null) {
-				log.error("log.msg",
-						"Problems starting plug-in Faces Config Editor.", ee);
-			}
-
-			throw new CoreException(new Status(IStatus.ERROR, getBundle()
-					.getSymbolicName(), IStatus.OK,
-					"Problems starting plug-in Faces Config Editor", ee));
-		}
-		
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns 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.
-	 */
-	public static Logger getLogger(Class theClass) {
-		return getDefault().getRootLogger(); // .getLogger(theClass);
-	}
-
-	/**
-	 * Returns the plugin's root logger
-	 */
-	public Logger getRootLogger() {
-		return log;
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 */
-	public ResourceBundle getResourceBundle() {
-		return resourceBundle;
-	}
-
-	/**
-	 * Returns the string from the plugin's resource bundle, or 'key' if not
-	 * found.
-	 */
-	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.
-	 */
-	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();
-	}
-
-	public static Shell getActiveShell() {
-		Shell shell = null;
-		IWorkbenchWindow workbenchWindow = getActiveWorkbenchWindow();
-		if (workbenchWindow.getShell() != null) {
-			shell = workbenchWindow.getShell();
-		} else {
-			shell = new Shell();
-		}
-		return shell;
-	}
-
-	/**
-	 * 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();
-	}
-
-	/**
-	 * Returns a shared image for the given name
-	 * <p>
-	 * Note: Images returned from this method will be automitically disposed of
-	 * when this plug-in shuts down. Callers must not dispose of these images
-	 * themselves.
-	 * </p>
-	 * 
-	 * @param name
-	 *            the image name found in /icons (with extension)
-	 * @return the image, null on error or not found.
-	 */
-	public Image getImage(String name) {
-		if (name == null) {
-			return null;
-		}
-
-		ImageRegistry images = getImageRegistry();
-		Image image = images.get(name);
-		if (image == null) {
-			try {
-				ImageDescriptor id = ImageDescriptor.createFromURL(new URL(
-						pluginBase, "icons/" + name));
-				images.put(name, id);
-
-				image = images.get(name);
-			} catch (MalformedURLException ee) {
-				// log.EditorPlugin.image.error=Image {0} not found.
-				log.error("log.msg", "log.EditorPlugin.image.error", name, ee);
-			}
-		}
-		return image;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given plug-in
-	 * relative path.
-	 * 
-	 * @param path
-	 *            the path
-	 * @return the image descriptor
-	 */
-	public ImageDescriptor getImageDescriptor(String path) {
-		if (path == null) {
-			return null;
-		}
-
-		ImageRegistry images = getImageRegistry();
-		ImageDescriptor id = images.getDescriptor(path);
-		if (id == null) {
-			try {
-				id = ImageDescriptor.createFromURL(new URL(pluginBase, "icons/"
-						+ path));
-				images.put(path, id);
-			} catch (MalformedURLException ee) {
-				// log.EditorPlugin.image.error=Image {0} not found.
-				log.error("log.msg", "log.EditorPlugin.image.error", path, ee);
-			}
-		}
-		return id;
-	}
-
-	/**
-	 * Returns this plugin's unique identifier
-	 * 
-	 * @retun this plugin's unique identifier
-	 * 
-	 */
-	public static String getPluginId() {
-		return getDefault().getBundle().getSymbolicName();
-	}
-
-	protected void initializeDefaultPluginPreferences() {
-		new GEMPreferences();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorPluginResources.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorPluginResources.properties
deleted file mode 100644
index c8eef1a..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, 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
-###############################################################################
-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} is already existed in current PageFlow.
-Pageflow.PageflowEditor.Alert.ExistingAction	= The action {0} is already existed 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 c8b00f2..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 {
-	protected SourcePageActionContributor sourceActionContributor = null;
-
-	protected PageflowActionBarContributor pageflowActionContributor = null;
-
-	protected EditingDomainActionBarContributor formbasedPageActionContributor = null;
-
-	private IEditorPart activeNestedEditor;
-
-	//private IEditorPart targetEditor;
-
-	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;
-	}
-
-	public SourcePageActionContributor getSourceActionContributor() {
-		if (sourceActionContributor == null) {
-			sourceActionContributor = new SourcePageActionContributor();
-		}
-		return sourceActionContributor;
-	}
-
-	public EditingDomainActionBarContributor getFormbasedPageActionContributor() {
-		if (formbasedPageActionContributor == null) {
-			formbasedPageActionContributor = new MyEditingDomainActionContributor();
-		}
-		return formbasedPageActionContributor;
-	}
-
-//	protected void declareGlobalActionKeys() {
-//        // 
-//	}
-
-	public PageflowActionBarContributor getPageflowActionContributor() {
-		if (pageflowActionContributor == null) {
-			pageflowActionContributor = new PageflowActionBarContributor();
-		}
-		return pageflowActionContributor;
-
-	}
-
-	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 0df29c3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/FacesConfigEditor.java
+++ /dev/null
@@ -1,1368 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EventObject;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
-import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
-import org.eclipse.gef.commands.CommandStack;
-import org.eclipse.gef.commands.CommandStackListener;
-import org.eclipse.gef.editparts.ZoomManager;
-import org.eclipse.gef.ui.actions.ActionRegistry;
-import org.eclipse.gef.ui.actions.EditorPartAction;
-import org.eclipse.gef.ui.actions.SaveAction;
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.common.ui.internal.actions.IOpenPage;
-import org.eclipse.jst.jsf.core.IJSFCoreConstants;
-import org.eclipse.jst.jsf.facesconfig.edit.provider.FacesConfigItemProviderAdapterFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.ui.page.ComponentsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IntroductionPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.ManagedBeanPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OverviewPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.WaitForLoadPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.DelegatingZoomManager;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.DelegatingCommandStack;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.EMFCommandStackGEFAdapter;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.layout.PageflowLayoutManager;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-import org.eclipse.jst.jsf.facesconfig.util.FacesConfigArtifactEdit;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorActionBarContributor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.dialogs.SaveAsDialog;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.editor.IFormPage;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.ide.IGotoMarker;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.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.common.ui.properties.internal.provisional.ITabbedPropertySheetPageContributor;
-import org.eclipse.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-
-/**
- * This is the main editor for the faces-config file.  Note that the model
- * load can involve long-running socket operations (shouldn't but can),
- * so the editor UI is load asynchronously.  This is means that any 
- * operations that need to be executed on editor open should be run
- * using AddPagesTask.pageSafeExecute() to ensure that they occur
- * after all editor pages have finished loading.
- * 
- * @author sfshi
- * 
- */
-public class FacesConfigEditor extends FormEditor implements
-		IEditingDomainProvider, ISelectionProvider {
-
-    /**
-     * This editor's ID.  TODO: this should prob be in plugin.properties?
-     */
-    public static final String EDITOR_ID = "org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor"; //$NON-NLS-1$
-
-	/**
-	 * editing domain that is used to track all changes to the model
-	 */
-	private AdapterFactoryEditingDomain editingDomain;
-
-	/**
-	 * adapter factory used for providing views of the model
-	 */
-	private ComposedAdapterFactory adapterFactory;
-
-	/** id of the pageflowPage */
-	private int pageflowPageID;
-
-	private int managedBeanPageID;
-
-	private int componentsPageID;
-
-	private int othersPageID;
-
-	private int sourcePageId;
-
-	private PageflowEditor pageflowPage;
-
-	/** The source text editor. */
-	private StructuredTextEditor sourcePage;
-
-	private Collection selectionChangedListeners = new ArrayList();
-
-	private ISelection editorSelection = StructuredSelection.EMPTY;
-
-	private IContentOutlinePage outlinePage;
-
-	private IProject currentProject;
-
-	private boolean isWebProject;
-	
-	private ModelLoader        _modelLoader;
-	
-	/**
-	 * only true once dispose() has been called
-	 * used to signal that the editor was disposed.
-	 */
-	private boolean _isDisposed; // = false;
-	
-    /**
-     * Used to load editor pages when the model is loaded
-     */
-    private final AddPagesTask     _addPagesTask = new AddPagesTask();
-        
-	/**
-	 * Default constructor
-	 */
-	public FacesConfigEditor() {
-		initializeEMF();
-	}
-
-	/**
-	 * This listens for workspace changes. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IResourceChangeListener resourceChangeListener = new IResourceChangeListener() {
-		public void resourceChanged(IResourceChangeEvent event) {
-			// Only listening to these.
-			// if (event.getType() == IResourceDelta.POST_CHANGE)
-			{
-				IResourceDelta delta = event.getDelta();
-				try {
-					class ResourceDeltaVisitor implements IResourceDeltaVisitor {
-						protected ResourceSet resourceSet = editingDomain
-								.getResourceSet();
-
-						@SuppressWarnings("hiding") //$NON-NLS-1$
-                        protected Collection changedResources = new ArrayList();
-
-						@SuppressWarnings("hiding") //$NON-NLS-1$
-                        protected Collection removedResources = new ArrayList();
-
-						public boolean visit(IResourceDelta delta_) {
-							if (delta_.getFlags() != IResourceDelta.MARKERS
-									&& delta_.getResource().getType() == IResource.FILE) {
-								if ((delta_.getKind() & (IResourceDelta.CHANGED | IResourceDelta.REMOVED)) != 0) {
-									Resource resource = resourceSet
-											.getResource(URI.createURI(delta_
-													.getFullPath().toString()),
-													false);
-									if (resource != null) {
-										if ((delta_.getKind() & IResourceDelta.REMOVED) != 0) {
-											removedResources.add(resource);
-										} else {
-											changedResources.add(resource);
-										}
-									}
-								}
-							}
-
-							return true;
-						}
-
-						public Collection getChangedResources() {
-							return changedResources;
-						}
-
-						public Collection getRemovedResources() {
-							return removedResources;
-						}
-					}
-
-					ResourceDeltaVisitor visitor = new ResourceDeltaVisitor();
-					delta.accept(visitor);
-
-					if (!visitor.getRemovedResources().isEmpty()) {
-						removedResources.addAll(visitor.getRemovedResources());
-						if (!isDirty()) {
-							getSite().getShell().getDisplay().asyncExec(
-									new Runnable() {
-										public void run() {
-											getSite().getPage().closeEditor(
-													FacesConfigEditor.this,
-													false);
-											FacesConfigEditor.this.dispose();
-										}
-									});
-						}
-					}
-
-					if (!visitor.getChangedResources().isEmpty()) {
-						changedResources.addAll(visitor.getChangedResources());
-					}
-				} catch (CoreException exception) {
-					// log it.
-					EditorPlugin.getDefault().getLog().log(
-							new Status(IStatus.ERROR, EditorPlugin
-									.getPluginId(), IStatus.OK, exception
-									.getMessage() == null ? "" : exception //$NON-NLS-1$
-									.getMessage(), exception));
-				}
-			}
-		}
-	};
-
-	/**
-	 * Resources that have been removed since last activation.
-	 * 
-	 * @generated
-	 */
-	Collection removedResources = new ArrayList();
-
-	/**
-	 * Resources that have been changed since last activation.
-	 * 
-	 * @generated
-	 */
-	Collection changedResources = new ArrayList();
-
-	/**
-	 * Resources that have been saved.
-	 * 
-	 * @generated
-	 */
-	Collection savedResources = new ArrayList();
-
-	/**
-	 * Initializes the EMF support.
-	 */
-	private void initializeEMF() {
-		// create an adapter factory that yields item providers
-		List factories = new ArrayList();
-		factories.add(new ResourceItemProviderAdapterFactory());
-		factories.add(new FacesConfigItemProviderAdapterFactory());
-		factories.add(new ReflectiveItemProviderAdapterFactory());
-		adapterFactory = new ComposedAdapterFactory(factories);
-
-		// create the command stack that will notify this editor as commands are
-		// executed
-		BasicCommandStack commandStack = new BasicCommandStack();
-		commandStack
-				.addCommandStackListener(new org.eclipse.emf.common.command.CommandStackListener() {
-					public void commandStackChanged(final EventObject event) {
-						getContainer().getShell().getDisplay().asyncExec(
-								new Runnable() {
-									public void run() {
-										editorDirtyStateChanged();
-										getActionBarContributor()
-												.updateActionBars();
-									}
-								});
-					}
-				});
-		// commandStack.addCommandStackListener(this);
-		// create the editing domain with a special command stack
-		editingDomain = new AdapterFactoryEditingDomain(adapterFactory,
-				commandStack, new HashMap());
-	}
-
-	/*
-	 * @see org.eclipse.ui.IEditorPart#init(org.eclipse.ui.IEditorSite,
-	 *      org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		try {
-			super.init(site, input);
-		} catch (Exception e) {
-			MessageDialog.openError(null,
-					EditorMessages.FacesConfigEditor_Error_OpenModel_Title,
-					EditorMessages.FacesConfigEditor_Error_OpenModel);
-			throw new PartInitException(
-					EditorMessages.FacesConfigEditor_Error_OpenModel);
-		}
-
-		setPartName(input.getName());
-		if (!isValidInput(input)) {
-			PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-					.getActivePage().openEditor(input,
-							"org.eclipse.ui.DefaultTextEditor"); //$NON-NLS-1$
-
-			close(false);
-			return;
-		}
-
-		createActions();
-
-		ResourcesPlugin.getWorkspace().addResourceChangeListener(
-				resourceChangeListener, IResourceChangeEvent.POST_CHANGE);
-	}
-
-	/*
-	 * @see org.eclipse.ui.part.EditorPart#setInput(org.eclipse.ui.IEditorInput)
-	 */
-	protected void setInput(IEditorInput input) 
-	{
-        isWebProject = matches(input);
-        super.setInput(input);
-
-		IFile inputFile = (IFile) input.getAdapter(IFile.class);
-		if (inputFile != null) 
-		{
-			final IProject project = inputFile.getProject();
-			final IPath inputPath = inputFile.getFullPath();
-			
-			_modelLoader = new ModelLoader(); 
-			_modelLoader.load(project, inputPath, isWebProject, _addPagesTask);
-		}
-	}
-
-
-	protected void addPages() 
-	{
-	    // try loading wait page
-	    // if we get to here before model load completes,
-	    // then wait page will give the user the indication
-	    // that something is happening in the background before
-	    // the editor full loads.
-	    // if the model is already loaded, this call should do nothing
-	    _addPagesTask.maybeAddWaitPage();
-	}
-
-	/**
-	 * This runnable is used to used to manage the loading of the 
-	 * editor pages for editor in a deferred fashion.  Because the model
-	 * loading for this editor can be noticably long and (unfortunately)
-	 * may involve socket calls that block, loadModel(), runs this on a
-	 * separate thread. This class is intended to be used in two ways:
-	 * 
-	 * 1) by the model loading code to signal it is finished by executing
-	 * the run() via a display.asyncExec().
-	 * 
-	 * 2) by the addPages() call back on the the main editor as a way to
-	 * load a "Please wait for loading" page if the loading is still running
-	 * by the time the editor is ready to visualize itself.
-	 * 
-	 * Note that in both cases methods of this class *must* be running on the
-	 * main display thread.
-	 * 
-	 * @author cbateman
-	 *
-	 */
-	private class AddPagesTask extends ModelLoader.ModelLoaderComplete
-	{
-	    private final AtomicBoolean    _arePagesLoaded = new AtomicBoolean(false);     // set to true when the regular editor pages are loaded
-	    private FormPage               _waitPage;
-	    private List<Runnable>         _deferredRunnables = new ArrayList<Runnable>();
-	    
-	    /**
-	     * If the editor pages are loaded, runnable.run() is invoked immediately
-	     * If the editor pages are not loaded yet, runnable is queued and will be 
-	     * executed in the order they are added immediately after the pages are loaded
-	     * 
-	     * @param runnable
-	     */
-	    public synchronized void pageSafeExecute(Runnable runnable)
-	    {
-	        if (!_isDisposed)
-	        {
-    	        if (!_arePagesLoaded.get())
-    	        {
-    	            _deferredRunnables.add(runnable);
-    	        }
-    	        else
-    	        {
-    	            runnable.run();
-    	        }
-	        }
-	    }
-	    
-        /**
-         * @return true if the pages are loaded
-         */
-        public synchronized boolean getArePagesLoaded() 
-        {
-            return _arePagesLoaded.get();
-        }
-        
-        /**
-         * Remove the wait page if present.
-         */
-        public synchronized void removeWaitPage()
-        {
-            if (_waitPage != null)
-            {
-                int index = _waitPage.getIndex();
-                
-                if (index >= 0)
-                {
-                    removePage(index);
-                }
-            }
-        }
-        
-        /**
-         * Add the wait page if the main pages aren't already loaded
-         */
-        public synchronized void maybeAddWaitPage()
-        {
-            // only load the wait page if the other pages haven't been loaded
-            if (!getArePagesLoaded())
-            {
-                _waitPage = new WaitForLoadPage(FacesConfigEditor.this, "WaitForLoad", EditorMessages.FacesConfigEditor_WaitForLoad_EditorTabTitle); //$NON-NLS-1$
-                
-                try
-                {
-                    addPage(0,_waitPage);
-                }
-                catch(PartInitException pie)
-                {
-                    _waitPage =null;
-                    EditorPlugin.getDefault().getLog().log(
-                            new Status(IStatus.ERROR, EditorPlugin.getPluginId(),
-                                    IStatus.OK, pie.getMessage() == null ? "" : pie //$NON-NLS-1$
-                                            .getMessage(), pie));
-                }
-            }
-        }
-
-        /**
-         * Must be run on the UI thread
-         */
-        public void doRun(FacesConfigArtifactEdit  edit) 
-        {
-            synchronized(this)
-            {
-                // ensure wait page gets removed
-                removeWaitPage();
-                
-                if (!getArePagesLoaded()
-                        && !_isDisposed)  // NOTE: we assume that access to variable does not need to
-                                          // to be synchronous since this method must 
-                                          // be run on the UI thread.  The only way
-                                          // that isDisposed should be true is if model loading took a long
-                                          // time and the user closed the editor before it completed (trigger dispose to be called)
-                {
-                    try 
-                    {
-                        if (isWebProject && edit != null && edit.getFacesConfig() != null) 
-                        {
-                            // only add the intro editor if the preference
-                            // is set to do so.
-                            if (GEMPreferences.getShowIntroEditor())
-                            {
-                                IntroductionPage page1 = new IntroductionPage(FacesConfigEditor.this);
-                                addPage(page1, null);
-                            }
-                            
-                            IFormPage overviewPage = new OverviewPage(FacesConfigEditor.this);
-                            addPage(overviewPage, null);
-        
-                            // Page flow
-                            createAndAddPageflowPage();
-        
-                            // pages
-                            IFormPage managedBeanPage = new ManagedBeanPage(FacesConfigEditor.this);
-                            managedBeanPageID = addPage(managedBeanPage, null);
-                            IFormPage componentsPage = new ComponentsPage(FacesConfigEditor.this);
-                            componentsPageID = addPage(componentsPage, null);
-                            IFormPage othersPage = new OthersPage(FacesConfigEditor.this);
-                            othersPageID = addPage(othersPage, null);
-                        }
-        
-                        sourcePage = new StructuredTextEditor();
-        
-                        sourcePage.setEditorPart(FacesConfigEditor.this);
-        
-                        sourcePageId = addPage(sourcePage, FacesConfigEditor.this.getEditorInput());
-                        setPageText(sourcePageId,
-                                EditorMessages.FacesConfigEditor_Source_TabName);
-                        sourcePage.update();
-                        
-                        // default active page to 0
-                        setActivePage(0);
-
-                        // execute deferred runnables
-                        for (Runnable runnable : _deferredRunnables)
-                        {
-                            runnable.run();
-                        }
-                        
-                        // flag the fact that the regular editor pages have been added
-                        _arePagesLoaded.set(true);
-                    } catch (PartInitException e) {
-                        EditorPlugin.getDefault().getLog().log(
-                                new Status(IStatus.ERROR, EditorPlugin.getPluginId(),
-                                        IStatus.OK, e.getMessage() == null ? "" : e //$NON-NLS-1$
-                                                .getMessage(), e));
-                    }
-                }
-            }
-        }
-	}
-	
-	/**
-	 * Creates the pageflow page of the multi-page editor.
-	 * @throws PartInitException 
-	 */
-	protected void createAndAddPageflowPage() throws PartInitException {
-		pageflowPage = new PageflowEditor(this);
-		pageflowPageID = addPage(pageflowPage, getEditorInput());
-		setPageText(pageflowPageID,
-				EditorMessages.FacesConfigEditor_Pageflow_TabName);
-		addPageActionRegistry(pageflowPage);
-		pageflowPage.getModelsTransform().setFacesConfig(getFacesConfig());
-		pageflowPage.getModelsTransform().setPageflow(
-				pageflowPage.getPageflow());
-		boolean fornew = pageflowPage.getModelsTransform()
-				.updatePageflowModelFromEMF();
-		pageflowPage.setGraphicalViewerContents(pageflowPage.getPageflow());
-		if (fornew) {
-			PageflowLayoutManager.getInstance().layoutPageflow(
-					pageflowPage.getPageflow());
-		}
-		pageflowPage.getModelsTransform().setListenToNotify(true);
-	}
-
-	/**
-	 * TODO: this is used only for testing
-	 * @return the page flow editor
-	 */
-	public PageflowEditor getPageflowPage() {
-		return pageflowPage;
-	}
-
-	/**
-	 * get the action's registry of sub pages.
-	 * @param page 
-	 * 
-	 */
-	protected void addPageActionRegistry(IEditorPart page) {
-		if (page != null) {
-			ActionRegistry pageActionRegisty = (ActionRegistry) page
-					.getAdapter(ActionRegistry.class);
-			if (pageActionRegisty != null) {
-				for (Iterator iter = pageActionRegisty.getActions(); iter
-						.hasNext();) {
-					getActionRegistry().registerAction((IAction) iter.next());
-				}
-			}
-		}
-	}
-
-	/** the editor's action registry */
-	private ActionRegistry actionRegistry = null;
-
-	/**
-	 * Returns the action registry of this editor.
-	 * 
-	 * @return - the action registry
-	 */
-	protected ActionRegistry getActionRegistry() {
-		if (null == actionRegistry)
-			actionRegistry = new ActionRegistry();
-
-		return actionRegistry;
-	}
-
-	/**
-	 * Returns the root object of the configuration model.
-	 * 
-	 * @return the root object.  Should not, but may return null.
-	 */
-	public FacesConfigType getFacesConfig() 
-	{
-	    FacesConfigArtifactEdit  edit = _modelLoader.getEdit();
-	    if (edit != null)
-	    {
-	        return edit.getFacesConfig();
-	    }
-	    return null;
-	}
-
-	/*
-	 * @see org.eclipse.ui.ISaveablePart#isDirty()
-	 */
-	public boolean isDirty() {
-		return ((BasicCommandStack) editingDomain.getCommandStack())
-				.isSaveNeeded()
-				|| super.isDirty();
-	}
-
-	/**
-	 * This class listens for command stack changes of the pages contained in
-	 * this editor and decides if the editor is dirty or not.
-	 */
-	private class MultiPageCommandStackListener implements CommandStackListener {
-
-		/** the observed command stacks */
-		private List commandStacks = new ArrayList(2);
-
-		/** to get the editorpart from command stack */
-		private HashMap mapEditorCommandStack = new HashMap();
-
-		private boolean saveLocation = false;
-
-		/**
-		 * Adds a <code>CommandStack</code> to observe.
-		 * 
-		 * @param commandStack
-		 * @param editor 
-		 */
-		public void addCommandStack(CommandStack commandStack,
-				IEditorPart editor) {
-			if (commandStack == null)
-				return;
-
-			if (mapEditorCommandStack.get(commandStack) == editor)
-				return;
-
-			commandStacks.add(commandStack);
-			commandStack.addCommandStackListener(this);
-			mapEditorCommandStack.put(commandStack, editor);
-		}
-
-		/**
-		 * set the dirty status for the models of different editor
-		 * 
-		 * @param editor -
-		 *            editor, e.g., pageflow or databinding page.
-		 * @param dirty -
-		 *            true or false
-		 */
-		private void setEditorDirty(IEditorPart editor, boolean dirty) {
-            // do nothing
-		}
-
-		/** the list of action ids that are to CommandStack actions */
-		private List stackActionIDs = new ArrayList();
-
-		/**
-		 * Updates the specified actions.
-		 * 
-		 * @param actionIds -
-		 *            the list of ids of actions to update
-		 */
-		private void updateActions(List actionIds) {
-			for (Iterator ids = actionIds.iterator(); ids.hasNext();) {
-				IAction action = getActionRegistry().getAction(ids.next());
-				if (null != action && action instanceof UpdateAction) {
-					((UpdateAction) action).update();
-				}
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see CommandStackListener#commandStackChanged(java.util.EventObject)
-		 */
-		public void commandStackChanged(EventObject event) {
-			// enable or disable the actions
-			updateActions(stackActionIDs);
-			if (((CommandStack) event.getSource()).isDirty()) {
-				// set the editor's model dirty status
-				setEditorDirty((IEditorPart) mapEditorCommandStack
-						.get(event.getSource()), true);
-				// at least one command stack is dirty,
-				// so the multi page editor is dirty too
-				setDirty(true);
-			} else {
-				// set the editor's model dirty status, if it is from not save
-				// location.
-				if (!saveLocation) {
-					setEditorDirty((IEditorPart) mapEditorCommandStack
-							.get(event.getSource()), true);
-					setDirty(true);
-				} else {
-					setDirty(false);
-				}
-			}
-		}
-
-		/** the pageflow page editor's dirty state */
-		private boolean isDirty = false;
-
-		/**
-		 * Changes the dirty state.
-		 * 
-		 * @param dirty -
-		 *            dirty state
-		 */
-		public void setDirty(boolean dirty) {
-			if (isDirty != dirty) {
-				isDirty = dirty;
-				firePropertyChange(IEditorPart.PROP_DIRTY);
-			}
-		}
-
-		/**
-		 * Disposed the listener
-		 */
-		public void dispose() {
-			for (Iterator stacks = commandStacks.iterator(); stacks.hasNext();) {
-				((CommandStack) stacks.next()).removeCommandStackListener(this);
-			}
-			commandStacks.clear();
-		}
-
-		/**
-		 * Marks every observed command stack beeing saved. This method should
-		 * be called whenever the editor/model was saved.
-		 */
-		public void markSaveLocations() {
-			saveLocation = true;
-			for (Iterator stacks = commandStacks.iterator(); stacks.hasNext();) {
-				CommandStack stack = (CommandStack) stacks.next();
-				stack.markSaveLocation();
-			}
-			saveLocation = false;
-		}
-
-		/**
-		 * Flushes every observed command stack and resets the save location to
-		 * zero.
-		 */
-		public void flush() {
-			for (Iterator stacks = commandStacks.iterator(); stacks.hasNext();) {
-				CommandStack stack = (CommandStack) stacks.next();
-				stack.flush();
-			}
-		}
-	}
-
-	/** the <code>CommandStackListener</code> */
-	private MultiPageCommandStackListener multiPageCommandStackListener = null;
-
-	/**
-	 * Returns the global command stack listener.
-	 * 
-	 * @return the <code>CommandStackListener</code>
-	 */
-	protected MultiPageCommandStackListener getMultiPageCommandStackListener() {
-		if (null == multiPageCommandStackListener)
-			multiPageCommandStackListener = new MultiPageCommandStackListener();
-
-		return multiPageCommandStackListener;
-	}
-
-	/*
-	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		// do the work within an operation because this is a long running
-		// activity that modifies the workbench
-		WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
-			public void execute(IProgressMonitor monitor_) {
-				try {
-					if (isWebProject &&
-					        _modelLoader.getEdit() != null) {
-						// modelResource.save(Collections.EMPTY_MAP);
-						_modelLoader.getEdit()
-								.getDeploymentDescriptorResource().save(
-										Collections.EMPTY_MAP);
-						IFile file = ((IFileEditorInput) getEditorInput())
-								.getFile();
-						pageflowPage.doSave(file, monitor_);
-					}
-					sourcePage.doSave(monitor_);
-					getMultiPageCommandStackListener().markSaveLocations();
-				} catch (Exception e) {
-					EditorPlugin.getDefault().getLog().log(
-							new Status(IStatus.ERROR, EditorPlugin
-									.getPluginId(), IStatus.OK,
-									e.getMessage() == null ? "" : e //$NON-NLS-1$
-											.getMessage(), e));
-				}
-			}
-		};
-		try {
-			// commit all pending changes in form pages
-			for (Iterator iter = pages.iterator(); iter.hasNext();) {
-				Object obj = iter.next();
-				if (obj instanceof FormPage) {
-					((FormPage) obj).doSave(monitor);
-				}
-				// else if (obj instanceof PageflowEditor) {
-				// ((PageflowEditor) obj).doSave(monitor);
-				// }
-
-			}
-			operation.run(null);// .run(true, false,
-			// operation;
-			// runs the operation, and shows progress
-			// new ProgressMonitorDialog();
-
-			// refresh the necessary state
-			((BasicCommandStack) editingDomain.getCommandStack()).saveIsDone();
-
-			editorDirtyStateChanged();
-		} catch (Exception e) {
-			EditorPlugin.getDefault().getLog().log(
-					new Status(IStatus.ERROR, EditorPlugin.getPluginId(),
-							IStatus.OK, e.getMessage(), e));
-		}
-	}
-
-	public void doSaveAs() {
-		SaveAsDialog saveAsDialog = new SaveAsDialog(getSite().getShell());
-		saveAsDialog.open();
-		IPath path = saveAsDialog.getResult();
-		if (path != null) {
-			IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
-			if (file != null) {
-				doSaveAs(URI.createPlatformResourceURI(file.getFullPath()
-						.toString()), 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) {
-                IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForEdit(doc);
-                if (model == null) {
-                    model = StructuredModelManager.getModelManager().getModelForEdit((IStructuredDocument) doc);
-                }
-                sourceCommandStack = new EMFCommandStackGEFAdapter(
-                        (BasicCommandStack) model.getUndoManager()
-                                .getCommandStack());
-            }
-            else
-            {
-                EditorPlugin.getDefault().getLog().log(
-                   new Status(IStatus.ERROR, EditorPlugin.getPluginId(), 0, 
-                           "Error getting undo stack for Faces Config editor.  Undo may be disabled", //$NON-NLS-1$
-                           new Throwable()));
-            }
-		}
-		return sourceCommandStack;
-	}
-
-	/** the list of action ids that are to CommandStack actions */
-	// private List stackActionIDs = new ArrayList();
-	/** the list of action ids that are editor actions */
-	private List editorActionIDs = new ArrayList();
-
-	/**
-	 * Adds an editor action to this editor.
-	 * <p>
-	 * Editor actions are actions that depend and work on the editor.
-	 * 
-	 * @param action -
-	 *            the editor action
-	 */
-	protected void addEditorAction(EditorPartAction action) {
-		getActionRegistry().registerAction(action);
-		editorActionIDs.add(action.getId());
-	}
-
-	/**
-	 * Creates different kinds of actions and registers them to the
-	 * ActionRegistry.
-	 */
-	protected void createActions() {
-		// register save action
-		addEditorAction(new SaveAction(this));
-	}
-
-	/**
-	 * Indicates that the current page has changed.
-	 * <p>
-	 * We update the DelegatingCommandStack, OutlineViewer and other things
-	 * here. //
-	 */
-	protected void currentPageChanged() {
-		IEditorPart activeEditor = getActiveEditor();
-		if (activeEditor == null) {
-			return;
-		}
-
-		// update command stack
-		CommandStack cmdStack = null;
-
-		if (activeEditor == pageflowPage) {
-			cmdStack = (CommandStack) activeEditor
-					.getAdapter(CommandStack.class);
-		} else if (activeEditor == sourcePage)// other page will delegate the
-		// GEF command stack to source
-		// page's.
-		{
-			cmdStack = this.getSourcePageCommandStack();
-		}
-
-		// Add command stacks
-		getMultiPageCommandStackListener().addCommandStack(cmdStack,
-				activeEditor);
-		getDelegatingCommandStack().setCurrentCommandStack(cmdStack);
-
-		// enable or disable the actions
-		// updateActions(stackActionIDs);
-
-		// update zoom actions
-		ZoomManager zoomManager = null;
-		zoomManager = (ZoomManager) activeEditor.getAdapter(ZoomManager.class);
-
-		if (zoomManager != null) {
-			getDelegatingZoomManager().setCurrentZoomManager(zoomManager);
-		}
-
-		IEditorActionBarContributor contributor = getEditorSite()
-				.getActionBarContributor();
-		if (contributor != null
-				&& contributor instanceof FacesConfigActionBarContributor) {
-			((FacesConfigActionBarContributor) contributor)
-					.setActivePage(activeEditor);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see MultiPageEditorPart#pageChange(int)
-	 */
-	protected void pageChange(int newPageIndex) {
-		super.pageChange(newPageIndex);
-		// getActionBarContributor().setActivePage(getActiveEditor());
-		// refresh content depending on current page
-		currentPageChanged();
-	}
-
-	public void dispose() 
-	{
-        // signal that we have been disposed
-        // do this before anything else
-	    _isDisposed = true;
-	    _modelLoader.dispose();
-	    
-	    ResourcesPlugin.getWorkspace().removeResourceChangeListener(
-				resourceChangeListener);
-
-		adapterFactory.dispose();
-
-		if (this.outlinePage != null) {
-			outlinePage.dispose();
-		}
-
-		super.dispose();
-	}
-
-	/**
-	 * get the project of the faces config file that the editor is working on.
-	 * 
-	 * @return IProject
-	 */
-	public IProject getProject() {
-		if (currentProject == null) {
-			if (_modelLoader.getEdit() != null) {
-				IFile file = _modelLoader.getEdit().getFile();
-				if (file != null)
-					currentProject = file.getProject();
-			}
-		}
-		return currentProject;
-	}
-
-	public EditingDomain getEditingDomain() {
-		return editingDomain;
-	}
-
-	/**
-	 * Returns the <code>IContentOutlinePage</code> for this editor.
-	 * 
-	 * @return - the <code>IContentOutlinePage</code>
-	 */
-	protected IContentOutlinePage getOutlinePage() {
-		if (null == outlinePage) {
-			outlinePage = new MultiPageEditorOutlinePage();
-		}
-		return outlinePage;
-	}
-
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	public ISelection getSelection() {
-		return editorSelection;
-	}
-
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	public void setSelection(ISelection selection) {
-		editorSelection = selection;
-		for (Iterator listeners = selectionChangedListeners.iterator(); listeners
-				.hasNext();) {
-			ISelectionChangedListener listener = (ISelectionChangedListener) listeners
-					.next();
-			listener
-					.selectionChanged(new SelectionChangedEvent(this, selection));
-		}
-	}
-
-	private void gotoMarker(IMarker marker) {
-		setActivePage(sourcePageId);
-		IDE.gotoMarker(this.sourcePage, marker);
-	}
-
-	/**
-	 * FIXME: this is used only for testing. Should isolate better
-	 * @return the action bar
-	 */
-	public FacesConfigActionBarContributor getActionBarContributor() {
-		return (FacesConfigActionBarContributor) getEditorSite()
-				.getActionBarContributor();
-	}
-
-	private IActionBars getActionBars() {
-		return getActionBarContributor().getActionBars();
-	}
-
-	/**
-	 * Shows a dialog that asks if conflicting changes should be discarded.
-	 * @return the user's response.
-	 */
-	protected boolean handleDirtyConflict() {
-		return MessageDialog
-				.openQuestion(
-						getSite().getShell(),
-						EditorMessages.FacesConfigEditor_ErrorHandlingUndoConflicts_DialogTitle,
-						EditorMessages.FacesConfigEditor_ErrorHandlingUndoConflicts_DialogMessage);
-	}
-
-	/**
-	 * Handles what to do with changed resources on activation.
-	 * 
-	 * @generated
-	 */
-	protected void handleChangedResources() {
-		if (!changedResources.isEmpty()
-				&& (!isDirty() || handleDirtyConflict())) {
-			editingDomain.getCommandStack().flush();
-
-			for (Iterator i = changedResources.iterator(); i.hasNext();) {
-				Resource resource = (Resource) i.next();
-				if (resource.isLoaded()) {
-					resource.unload();
-					try {
-						resource.load(Collections.EMPTY_MAP);
-					} catch (IOException exception) {
-						EditorPlugin.getDefault().getLog().log(
-								new Status(IStatus.ERROR, EditorPlugin
-										.getPluginId(), IStatus.OK, exception
-										.getMessage() == null ? "" : exception //$NON-NLS-1$
-										.getMessage(), exception));
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * TODO this is used only for testing.  Should be able to remove if we
-	 * go to true automated UI testing
-	 * @param pageID
-	 */
-	public void setActiveEditorPage(String pageID) {
-		if (pageID.equals(PageflowEditor.PAGE_ID)) {
-			setActivePage(pageflowPageID);
-		} else if (pageID.equals(ManagedBeanPage.PAGE_ID)) {
-			setActivePage(managedBeanPageID);
-		} else if (pageID.equals(ComponentsPage.PAGE_ID)) {
-			setActivePage(componentsPageID);
-		} else if (pageID.equals(OthersPage.PAGE_ID)) {
-			setActivePage(othersPageID);
-		}
-	}
-
-	private boolean matches(IEditorInput input) {
-		final IResource file = (IResource) input.getAdapter(IResource.class);
-		boolean hasWebFacet = false;
-		boolean hasJSFFacet = false;
-
-		if (file != null) {
-			final IProject project = file.getProject();
-
-			if (project != null) {
-				try {
-					final IFacetedProject facetedProject = ProjectFacetsManager
-							.create(project);
-
-					if (facetedProject != null) {
-						final Set facets = facetedProject.getProjectFacets();
-
-						for (final Iterator it = facets.iterator(); it
-								.hasNext();) {
-							final IProjectFacetVersion version = (IProjectFacetVersion) it
-									.next();
-
-							IProjectFacet facet = version.getProjectFacet();
-							if (IJSFCoreConstants.JSF_CORE_FACET_ID.equals(facet.getId())) {
-								hasJSFFacet = true;
-							} else if ("jst.web".equals(facet.getId())) { //$NON-NLS-1$
-								hasWebFacet = true;
-							}
-						}
-					}
-				} catch (CoreException ex) {
-					EditorPlugin.getDefault().getLog().log(
-							new Status(IStatus.ERROR, EditorPlugin
-									.getPluginId(), IStatus.OK,
-									ex.getMessage() == null ? "" : ex //$NON-NLS-1$
-											.getMessage(), ex));
-				}
-			}
-		}
-
-		return hasWebFacet && hasJSFFacet;
-	}
-	
-    /**
-     * DANGER!  This call is for testing only!  Should not be used,
-     * even internally, by production code.
-     * @param timeoutMs the time to wait in milliseconds
-     * @throws InterruptedException 
-     */	
-	public void doPageLoad(long timeoutMs) throws InterruptedException
-	{
-	    _modelLoader.waitForLoad(timeoutMs);
-	    _addPagesTask.doRun(_modelLoader.getEdit());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/IFacesConfigConstants.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/IFacesConfigConstants.java
deleted file mode 100644
index bb72553..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/IFacesConfigConstants.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-/**
- * @author jchoi
- * @version
- */
-public interface IFacesConfigConstants {
-
-	public static final String FACES_CONFIG = "faces-config";
-
-	public static final String MANAGED_PROPERTY = "managed-property";
-
-	public static final String VALUE = "value";
-
-	public static final String NULL_VALUE = "null-value";
-
-	public static final String MAP_ENTRIES = "map-entries";
-
-	public static final String MAP_ENTRY = "map-entry";
-
-	public static final String LIST_ENTRIES = "list-entries";
-
-	public static final String NAVIGATION_RULE = "navigation-rule";
-
-	public static final String COMPONENT_SUPER_CLASS = "javax.faces.component.UIComponent";
-
-	public static final String RENDER_KIT_SUPER_CLASS = "javax.faces.render.RenderKit";
-
-	public static final String CONVERTER_INTERFACE = "javax.faces.convert.Converter";
-
-	public static final String VALIDATOR_INTERFACE = "javax.faces.validator.Validator";
-
-	public static final String RENDERER_SUPER_CLASS = "javax.faces.render.Renderer";
-
-	public static final String ACTION_LISTENER_INTERFACE = "javax.faces.event.ActionListener";
-
-	public static final String NAVIGATION_HANDLE_SUPER_CLASS = "javax.faces.application.NavigationHandler";
-
-	public static final String PROPERTY_RESOLVER_SUPER_CLASS = "javax.faces.el.PropertyResolver";
-
-	public static final String STATE_MANAGER_SUPER_CLASS = "javax.faces.application.StateManager";
-
-	public static final String VARIABLE_RESOLVER_SUPER_CLASS = "javax.faces.el.VariableResolver";
-
-	public static final String VIEW_HANDLER_SUPER_CLASS = "javax.faces.application.ViewHandler";
-
-	public static final String APPLICATION_FACTORY_SUPER_CLASS = "javax.faces.application.ApplicationFactory";
-
-	public static final String FACES_CONTEXT_FACTORY_SUPER_CLASS = "javax.faces.context.FacesContextFactory";
-
-	public static final String LIFECYCLE_FACTORY_SUPER_CLASS = "javax.faces.lifecycle.LifecycleFactory";
-
-	public static final String RENDER_KIT_FACTORY_SUPER_CLASS = "javax.faces.render.RenderKitFactory";
-
-	public static final String PHASE_LISTENER_INTERFACE = "javax.faces.event.PhaseListener";
-
-	public static final String MANAGED_BEAN_SCOPE_APPLICATION = "application";
-
-	public static final String MANAGED_BEAN_SCOPE_SESSION = "session";
-
-	public static final String MANAGED_BEAN_SCOPE_REQUEST = "request";
-
-	public static final String MANAGED_BEAN_SCOPE_NONE = "none";
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/INestedActionContributor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/INestedActionContributor.java
deleted file mode 100644
index f50fc57..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/INestedActionContributor.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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 {
-	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 90e5cae..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.
-	 */
-	protected 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 93eb8e4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/MyEditingDomainActionContributor.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;
-
-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 {
-	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 055fffc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditAttributeDialog.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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;
-
-	public AddEditAttributeDialog(Shell parentShell, boolean isNew) {
-		super(parentShell);
-		this.isNew = isNew;
-	}
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param attributeName
-	 * @param attributeClass
-	 * @param defaultValue
-	 * @param suggestedValue
-	 */
-	public AddEditAttributeDialog(Shell parentShell, String attributeName,
-			String attributeClass, String defaultValue, String suggestedValue) {
-		super(parentShell);
-		this.attributeName = attributeName;
-		this.attributeClass = attributeClass;
-		this.defaultValue = defaultValue;
-		this.suggestedValue = suggestedValue;
-		this.isNew = false;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		if (isNew)
-			newShell.setText(EditorMessages.AttributeSection_Dialog_Title_Add);
-		else
-			newShell
-					.setText(EditorMessages.AttributeSection_Dialog_Title_Edit);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite container = new Composite(parent, SWT.FILL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = layout.marginHeight = 5;
-		container.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gd);
-
-		TabFolder tabFolder = new TabFolder(container, SWT.FILL);
-		tabFolder.setLayoutData(gd);
-		TabItem generalTabItem = new TabItem(tabFolder, SWT.NONE);
-		generalTabItem
-				.setText(EditorMessages.AttributeSection_Dialog_Tab_General);
-		Control control = createGeneralTabControl(generalTabItem.getParent());
-		generalTabItem.setControl(control);
-		return container;
-	}
-
-	/**
-	 * @param parent
-	 * @return
-	 */
-	private Control createGeneralTabControl(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 5;
-		composite.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(gd);
-		composite.setFont(parent.getFont());
-
-		attributeNameField = new StringDialogField();
-//		attributeNameField.setRequired(true);
-		attributeNameField
-				.setLabelText(EditorMessages.AttributeSection_Dialog_AttributeName);
-
-		attributeClassField = new ClassButtonDialogField(getProject());
-//		attributeClassField.setRequired(true);
-		attributeClassField
-				.setLabelText(EditorMessages.AttributeSection_Dialog_AttributeClass);//$NON-NLS-1$
-
-		attributeClassField.setAutoOpenResource(false);
-
-		defaultValueField = new StringDialogField();
-		defaultValueField
-				.setLabelText(EditorMessages.AttributeSection_Dialog_DefaultValue);
-
-		suggestedValueField = new StringDialogField();
-		suggestedValueField
-				.setLabelText(EditorMessages.AttributeSection_Dialog_SuggestedValue);
-
-		GridData data = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(data);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		composite.setLayout(gl);
-
-		attributeNameField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		attributeClassField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		defaultValueField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		suggestedValueField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		LayoutUtil.setHorizontalGrabbing(attributeClassField.getTextControl(
-				null, composite));
-
-		// set the initial value for these fields.
-		attributeNameField.setText(attributeName);
-		attributeClassField.setText(attributeClass);
-		defaultValueField.setText(defaultValue);
-		suggestedValueField.setText(suggestedValue);
-
-		return composite;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	public IProject getProject() {
-		return project;
-	}
-
-	/**
-	 * 
-	 */
-	protected void okPressed() {
-		attributeName = attributeNameField.getText();
-		attributeClass = attributeClassField.getText();
-		defaultValue = defaultValueField.getText();
-		suggestedValue = suggestedValueField.getText();
-
-		super.okPressed();
-	}
-
-	public String getAttributeClass() {
-		return attributeClass;
-	}
-
-	public void setAttributeClass(String attributeClass) {
-		this.attributeClass = attributeClass;
-	}
-
-	public String getAttributeName() {
-		return attributeName;
-	}
-
-	public void setAttributeName(String attributeName) {
-		this.attributeName = attributeName;
-	}
-
-	public String getDefaultValue() {
-		return defaultValue;
-	}
-
-	public void setDefaultValue(String defaultValue) {
-		this.defaultValue = defaultValue;
-	}
-
-	public String getSuggestedValue() {
-		return suggestedValue;
-	}
-
-	public void setSuggestedValue(String suggestedValue) {
-		this.suggestedValue = suggestedValue;
-	}
-
-	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 5b5a1f0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditFacetDialog.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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();
-	}
-
-	public String getDescription() {
-		return description;
-	}
-
-	public String getDisplayName() {
-		return displayName;
-	}
-
-	public String getFacetName() {
-		return facetName;
-	}
-
-	public void setDescription(String description) {
-		this.description = description;
-	}
-
-	public void setDisplayName(String displayName) {
-		this.displayName = displayName;
-	}
-
-	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 aa5aa21..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditManagedPropertyDialog.java
+++ /dev/null
@@ -1,497 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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;
-
-	public 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
-	 */
-	public AddEditManagedPropertyDialog(Shell parentShell,
-			ManagedBeanType managedBean, AbstractFacesConfigSection section) {
-		super(parentShell);
-		this.isNew = true;
-		this.managedBean = managedBean;
-		this.section = section;
-	}
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param managedProperty
-	 */
-	public AddEditManagedPropertyDialog(Shell parentShell,
-			ManagedPropertyType managedProperty, AbstractFacesConfigSection section) {
-		super(parentShell);
-		this.isNew = false;
-		this.managedProperty = managedProperty;
-		this.managedBean = (ManagedBeanType) managedProperty.eContainer();
-		this.section = section;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		if (isNew)
-			newShell.setText(EditorMessages.AddEditManagedPropertyDialog_Add);
-		else
-			newShell.setText(EditorMessages.AddEditManagedPropertyDialog_Edit);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent_) {
-		Composite container = new Composite(parent_, SWT.FILL);
-		this.parent = container;
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = layout.marginHeight = 5;
-		container.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gd);
-
-		nameField = new ComboDialogField(SWT.DROP_DOWN | SWT.READ_ONLY
-				| SWT.BORDER);
-		nameField.setLabelText(EditorMessages.ManagedBeanPropertyEditDialog_PropertyName);
-
-		int propertyCount = 0;
-		beanPropertyList = getBeanPropertyList(managedBean);
-		if (beanPropertyList != null)
-			propertyCount = beanPropertyList.size();
-
-		if (propertyCount > 0) {
-			String[] propertyNames = new String[propertyCount];
-
-			for (int i = 0; i < propertyCount; i++) {
-				JavaBeanProperty property = (JavaBeanProperty) beanPropertyList
-						.get(i);
-				propertyNames[i] = property.getName();
-			}
-			nameField.setItems(propertyNames);
-		}
-
-		nameField.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-			public void dialogFieldApplied(DialogField field) {
-				handleNameSelection(((ComboDialogField) field).getText());
-			}
-		});
-
-		classField = new ClassButtonDialogField(null);
-		classField.setProject(getProject());
-		classField.setLabelText(EditorMessages.ManagedBeanPropertyEditDialog_PropertyClass);
-
-		valueTypeField = new ComboDialogField(SWT.DROP_DOWN | SWT.READ_ONLY
-				| SWT.BORDER);
-		valueTypeField.setLabelText(EditorMessages.ManagedBeanPropertyEditDialog_ValueType);
-
-		valueTypeField.setItems(valueTypes);
-		valueTypeField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						updateValueStatus();
-					}
-				});
-
-		valueField = new StringButtonDialogField(new IStringButtonAdapter() {
-			public void changeControlPressed(DialogField field) {
-				handleChangeValue(valueTypeField.getText(),
-						((StringButtonDialogField) field).getText());
-			}
-
-		});
-
-		valueField.setLabelText(EditorMessages.ManagedBeanPropertyEditDialog_Value);//$NON-NLS-1$
-		valueField.setButtonLabel(EditorMessages.UI_Button_Edit_more);
-
-		valueField.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-			public void dialogFieldApplied(DialogField field) {
-				valueObject = ((StringButtonDialogField) field).getText();
-
-			}
-		});
-
-		GridData data = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(data);
-
-		int numberOfColumns = 5;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		container.setLayout(gl);
-
-		nameField.doFillIntoGrid(null, container, numberOfColumns);
-		LayoutUtil.setWidthHint(nameField.getComboControl(null, container),
-				DEFAULT_CONTROL_WIDTH);
-
-		classField.doFillIntoGrid(null, container, numberOfColumns - 1);
-		data = new GridData(SWT.FILL, SWT.CENTER, false, false);
-		data.horizontalSpan = 2;
-		classField.getChangeControl(null, container).setLayoutData(data);
-		LayoutUtil.setWidthHint(classField.getTextControl(null, container),
-				DEFAULT_CONTROL_WIDTH);
-
-		valueTypeField.doFillIntoGrid(null, container, numberOfColumns);
-
-		valueField.doFillIntoGrid(null, container, numberOfColumns);
-
-		LayoutUtil.setHorizontalGrabbing(classField.getTextControl(null,
-				container));
-
-		valueTypeField.selectItem(0);
-
-		if (!isNew && managedProperty != null) {
-			initFields();
-		}
-
-		return container;
-	}
-
-	private void initFields() {
-
-		if (managedProperty.getPropertyName() != null)
-			nameField.setText(managedProperty.getPropertyName()
-					.getTextContent());
-
-		if (managedProperty.getPropertyClass() != null)
-			classField.setText(managedProperty.getPropertyClass()
-					.getTextContent());
-
-		if (managedProperty.getValue() != null) {
-			valueTypeField.setText(valueTypes[0]);
-			valueField.setText(managedProperty.getValue().getTextContent());
-		} else if (managedProperty.getNullValue() != null)
-			valueTypeField.setText(valueTypes[1]);
-		else if (managedProperty.getMapEntries() != null)
-			valueTypeField.setText(valueTypes[2]);
-		else if (managedProperty.getListEntries() != null)
-			valueTypeField.setText(valueTypes[3]);
-		else
-			valueTypeField.setText(valueTypes[0]);
-		updateValueStatus();
-	}
-
-	/**
-	 * @param text
-	 */
-	protected void handleNameSelection(String text) {
-		int propertyCount = 0;
-		if (beanPropertyList != null)
-			propertyCount = beanPropertyList.size();
-
-		if (propertyCount > 0) {
-			for (int i = 0; i < propertyCount; i++) {
-				JavaBeanProperty property = (JavaBeanProperty) beanPropertyList
-						.get(i);
-
-				if (property.getName().equals(text.trim())) {
-					classField.setText(property.getQualifiedType());
-					break;
-				}
-			}
-		}
-
-	}
-
-	private void updateValueStatus() {
-		if (valueField == null) {
-			return;
-		}
-		valueObject = null;
-		if (valueTypeField.getText().equalsIgnoreCase(
-				IFacesConfigConstants.NULL_VALUE)) {
-			valueField.setEnabled(false);
-			valueObject = FacesConfigFactory.eINSTANCE.createNullValueType();
-		} else if (valueTypeField.getText().equalsIgnoreCase(
-				IFacesConfigConstants.MAP_ENTRIES)
-				|| valueTypeField.getText().equalsIgnoreCase(
-						IFacesConfigConstants.LIST_ENTRIES)) {
-			valueField.getTextControl(null, parent).setEditable(false);
-			valueField.setEnabled(true);
-		} else {
-			valueObject = ""; //$NON-NLS-1$
-			valueField.getTextControl(null, parent).setEditable(true);
-			valueField.setEnabled(true);
-		}
-	}
-
-	/**
-	 * @param valueType_ 
-	 * @param value 
-	 */
-	protected void handleChangeValue(String valueType_, String value) {
-		if (valueType_.equalsIgnoreCase(IFacesConfigConstants.VALUE)) {
-			handleChangeLongStringValue(value);
-		} else if (valueType_
-				.equalsIgnoreCase(IFacesConfigConstants.MAP_ENTRIES)) {
-			handleChangeMapEntries();
-		} else if (valueType_
-				.equalsIgnoreCase(IFacesConfigConstants.LIST_ENTRIES)) {
-			handleChangeListEntries();
-		}
-	}
-
-	/**
-	 * @param textControl
-	 */
-	private void handleChangeLongStringValue(String value) {
-		EditValueDialog valueDialog = new EditValueDialog(EditorPlugin
-				.getActiveShell(), value);
-		if (valueDialog.open() == Window.OK) {
-			valueField.setText((String) valueDialog.getResultData());
-			valueObject = valueDialog.getResultData();
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void handleChangeMapEntries() {
-
-		MapEntriesType mapEntries;
-
-		if (valueObject instanceof MapEntriesType)
-			mapEntries = (MapEntriesType) valueObject;
-		else if (isNew || managedProperty.getMapEntries() == null) {
-			mapEntries = FacesConfigFactory.eINSTANCE.createMapEntriesType();
-		} else {
-			mapEntries = (MapEntriesType) EcoreUtil.copy(managedProperty
-					.getMapEntries());
-		}
-
-		EditMapEntriesDialog dialog = new EditMapEntriesDialog(EditorPlugin
-				.getActiveShell(), mapEntries, section);
-		if (dialog.open() == Dialog.OK) {
-			valueObject = dialog.getMapEntries();
-		} else {
-			//user cancel the dialog, then restore.
-			if (!isNew && managedProperty.getMapEntries() != null)
-				valueObject = EcoreUtil.copy(managedProperty
-						.getMapEntries());
-			// else
-			//				valueObject = null;
-		}
-	}
-
-	private void handleChangeListEntries() {
-		ListEntriesType listEntries;
-
-		if (valueObject instanceof ListEntriesType)
-			listEntries = (ListEntriesType) valueObject;
-		else if (isNew || managedProperty.getListEntries() == null) {
-			listEntries = FacesConfigFactory.eINSTANCE.createListEntriesType();
-		} else {
-			listEntries = (ListEntriesType) EcoreUtil.copy(managedProperty
-					.getListEntries());
-		}
-
-		EditListEntriesDialog dialog = new EditListEntriesDialog(EditorPlugin
-				.getActiveShell(), listEntries, section);
-		if (dialog.open() == Dialog.OK) {
-			valueObject = dialog.getListEntries();
-		} else {
-			//user cancel the dialog, then restore.
-			if (!isNew && managedProperty.getListEntries() != null)
-				valueObject = EcoreUtil.copy(managedProperty
-						.getListEntries());
-			// else
-			// valueObject = null;
-		}
-	}
-
-	/**
-	 * Get a list of JavaBeanProperty that from the managed bean class.
-	 * 
-	 * @return
-	 */
-	private List getBeanPropertyList(ManagedBeanType managedBean_) {
-		if (managedBean_.getManagedBeanClass() == null)
-			return null;
-		String beanClassName = managedBean_.getManagedBeanClass()
-				.getTextContent();
-		IType classType = JavaClassUtils.getType(getProject(), beanClassName);
-		if (classType == null) {
-			return null;
-		}
-		List list = new ArrayList();
-		JavaBeanProperty[] properties = JavaBeanUtils
-				.getBeanProperties(classType);
-		if (properties != null) {
-			for (int i = 0; i < properties.length; i++) {
-				list.add(properties[i]);
-			}
-		}
-		return list;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	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();
-	}
-
-	public String getPropertyClass() {
-		return propertyClass;
-	}
-
-	public void setAttributeClass(String attributeClass) {
-		this.propertyClass = attributeClass;
-	}
-
-	public String getPropertyName() {
-		return propertyName;
-	}
-
-	public void setAttributeName(String attributeName) {
-		this.propertyName = attributeName;
-	}
-
-	public String getValueType() {
-		return valueType;
-	}
-
-	public void setValueType(String defaultValue) {
-		this.valueType = defaultValue;
-	}
-
-	public void setProject(IProject project) {
-		this.project = project;
-	}
-
-	public Object getValueObject() {
-		return 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 7586e73..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditMapEntryDialog.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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.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.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;
-
-	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("");
-			valueField.setEnabled(false);
-		} else {
-			nullValueTypeButton.setSelection(false);
-			valueField.setEnabled(true);
-			valueField.setText(value);
-		}
-	}
-
-	public void layoutKeySection(Composite parent) {
-		keyField = new StringDialogField();
-		keyField.setLabelText(EditorMessages.MapEntryEditGroup_Key); //$NON-NLS-1$
-		Composite
-
-		keySection = SWTUtils.createComposite(parent, SWT.NONE);
-
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		keySection.setLayoutData(gd);
-
-		int numberOfColumns = 3;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		keySection.setLayout(gl);
-
-		keyField.doFillIntoGrid(null, keySection, numberOfColumns);
-
-		LayoutUtil.setGrabHorizontal(keyField.getTextControl(null, keySection),
-				true);
-
-	}
-
-	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,
-				IFacesConfigConstants.NULL_VALUE, 2);
-
-		nullValueTypeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				valueField.setEnabled(!nullValueTypeButton.getSelection());
-
-			}
-
-		});
-		valueField = new StringDialogField(VALUE_DEFAULT_LINENUMS);
-
-		valueField.setLabelText(EditorMessages.ValueEditGroup_Value); //$NON-NLS-1$
-		valueField.doFillIntoGrid(null, valueSection, numberOfColumns);
-
-		gd = (GridData) valueField.getLabelControl(null, valueSection)
-				.getLayoutData();
-		gd.verticalAlignment = gd.verticalAlignment | GridData.GRAB_VERTICAL;
-		LayoutUtil.setHorizontalGrabbing(valueField.getTextControl(null,
-				valueSection));
-
-		gd = (GridData) valueField.getTextControl(null, valueSection)
-				.getLayoutData();
-		gd.verticalAlignment = gd.verticalAlignment | GridData.FILL_VERTICAL;
-
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	/**
-	 * 
-	 */
-	protected void okPressed() {
-
-		key = this.keyField.getText().trim();
-		value = this.valueField.getText().trim();
-		isNullValue = nullValueTypeButton.getSelection();
-		super.okPressed();
-	}
-
-	public boolean isNullValue() {
-		return isNullValue;
-	}
-
-	public void setNullValue(boolean isNullValue) {
-		this.isNullValue = isNullValue;
-	}
-
-	public String getKey() {
-		return key;
-	}
-
-	public void setKey(String key) {
-		this.key = key;
-	}
-
-	public String getValue() {
-		return 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 5d80eec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditPropertyDialog.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.swt.widgets.TabItem;
-
-/**
- * The dialog is for adding and editing property.
- * 
- * @author sfshi
- * 
- */
-public class AddEditPropertyDialog extends Dialog {
-
-	private static final int MIN_DIALOG_WIDTH = 300;
-
-	private StringDialogField propertyNameField;
-
-	private ClassButtonDialogField propertyClassField;
-
-	private StringDialogField defaultValueField;
-
-	private StringDialogField suggestedValueField;
-
-	private IProject project;
-
-	private boolean isNew;
-
-	private String propertyName;
-
-	private String propertyClass;
-
-	private String defaultValue;
-
-	private String suggestedValue;
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param isNew
-	 */
-	public AddEditPropertyDialog(Shell parentShell, boolean isNew) {
-		super(parentShell);
-		this.isNew = isNew;
-	}
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param propertyName
-	 * @param propertyClass
-	 * @param defaultValue
-	 * @param suggestedValue
-	 */
-	public AddEditPropertyDialog(Shell parentShell, String propertyName,
-			String propertyClass, String defaultValue, String suggestedValue) {
-		super(parentShell);
-		this.propertyName = propertyName;
-		this.propertyClass = propertyClass;
-		this.defaultValue = defaultValue;
-		this.suggestedValue = suggestedValue;
-		this.isNew = false;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		if (isNew)
-			newShell
-					.setText(EditorMessages.PropertySection_Dialog_Title_Add);
-		else
-
-			newShell
-					.setText(EditorMessages.PropertySection_Dialog_Title_Edit);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite container = new Composite(parent, SWT.FILL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = layout.marginHeight = 5;
-		container.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gd);
-
-		TabFolder tabFolder = new TabFolder(container, SWT.FILL);
-		tabFolder.setLayoutData(gd);
-		TabItem generalTabItem = new TabItem(tabFolder, SWT.NONE);
-		generalTabItem
-				.setText(EditorMessages.PropertySection_Dialog_Tab_General);
-		Control control = createGeneralTabControl(generalTabItem.getParent());
-		generalTabItem.setControl(control);
-		return container;
-	}
-
-	/**
-	 * @param parent
-	 * @return
-	 */
-	private Control createGeneralTabControl(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 5;
-		composite.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(gd);
-		composite.setFont(parent.getFont());
-
-		propertyNameField = new StringDialogField();
-		// propertyNameField.setRequired(true);
-		propertyNameField
-				.setLabelText(EditorMessages.PropertySection_Dialog_PropertyName);
-
-		propertyClassField = new ClassButtonDialogField(getProject());
-		// propertyClassField.setRequired(true);
-		propertyClassField
-				.setLabelText(EditorMessages.PropertySection_Dialog_PropertyClass);//$NON-NLS-1$
-
-		propertyClassField.setAutoOpenResource(false);
-
-		defaultValueField = new StringDialogField();
-		defaultValueField
-				.setLabelText(EditorMessages.PropertySection_Dialog_DefaultValue);
-
-		suggestedValueField = new StringDialogField();
-		suggestedValueField
-				.setLabelText(EditorMessages.PropertySection_Dialog_SuggestedValue);
-
-		GridData data = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(data);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		composite.setLayout(gl);
-
-		propertyNameField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		propertyClassField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		defaultValueField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		suggestedValueField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		LayoutUtil.setHorizontalGrabbing(propertyClassField.getTextControl(
-				null, composite));
-
-		// set the initial value for these fields.
-		propertyNameField.setText(propertyName);
-		propertyClassField.setText(propertyClass);
-		defaultValueField.setText(defaultValue);
-		suggestedValueField.setText(suggestedValue);
-
-		return composite;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	protected IProject getProject() {
-		return project;
-	}
-
-	protected void okPressed() {
-		propertyName = propertyNameField.getText();
-		propertyClass = propertyClassField.getText();
-		defaultValue = defaultValueField.getText();
-		suggestedValue = suggestedValueField.getText();
-
-		super.okPressed();
-	}
-
-	public String getDefaultValue() {
-		return defaultValue;
-	}
-
-	public void setDefaultValue(String defaultValue) {
-		this.defaultValue = defaultValue;
-	}
-
-	public String getPropertyClass() {
-		return propertyClass;
-	}
-
-	public void setPropertyClass(String propertyClass) {
-		this.propertyClass = propertyClass;
-	}
-
-	public String getPropertyName() {
-		return propertyName;
-	}
-
-	public void setPropertyName(String propertyName) {
-		this.propertyName = propertyName;
-	}
-
-	public String getSuggestedValue() {
-		return suggestedValue;
-	}
-
-	public void setSuggestedValue(String suggestedValue) {
-		this.suggestedValue = suggestedValue;
-	}
-
-	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 1c0d3b6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditRendererDialog.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.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.swt.widgets.TabItem;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class AddEditRendererDialog extends Dialog {
-
-	private static final int MIN_DIALOG_WIDTH = 300;
-
-	private StringDialogField rendererNameField;
-
-	private ClassButtonDialogField rendererClassField;
-
-	private StringButtonDialogField componentFamilyField;
-
-	private StringDialogField renderTypeField;
-
-	private IProject project;
-
-	private String rendererName;
-
-	private String rendererClass;
-
-	private String componentFamily;
-
-	private String rendererType;
-
-	private boolean isNew;
-
-	private IFacesConfigPage page;
-
-	/**
-	 * @param parentShell
-	 * @param page
-	 * @param isNew
-	 */
-	public AddEditRendererDialog(Shell parentShell, IFacesConfigPage page,
-			boolean isNew) {
-		super(parentShell);
-		this.page = page;
-		this.isNew = isNew;
-	}
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param rendererName 
-	 * @param rendererClass 
-	 * @param componentFamily 
-	 * @param renderType 
-	 */
-	public AddEditRendererDialog(Shell parentShell, String rendererName,
-			String rendererClass, String componentFamily, String renderType) {
-		super(parentShell);
-		this.rendererName = rendererName;
-		this.rendererClass = rendererClass;
-		this.componentFamily = componentFamily;
-		this.rendererType = renderType;
-		this.isNew = false;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		if (isNew)
-			newShell.setText(EditorMessages.RendererSection_Dialog_Title_Add);
-		else
-			newShell.setText(EditorMessages.RendererSection_Dialog_Title_Edit);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite container = new Composite(parent, SWT.FILL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = layout.marginHeight = 5;
-		container.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gd);
-
-		TabFolder tabFolder = new TabFolder(container, SWT.FILL);
-		tabFolder.setLayoutData(gd);
-		TabItem generalTabItem = new TabItem(tabFolder, SWT.NONE);
-		generalTabItem
-				.setText(EditorMessages.RendererSection_Dialog_Tab_General);
-		Control control = createGeneralTabControl(generalTabItem.getParent());
-		generalTabItem.setControl(control);
-		return container;
-	}
-
-	/**
-	 * @param parent
-	 * @return
-	 */
-	private Control createGeneralTabControl(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 5;
-		composite.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(gd);
-		composite.setFont(parent.getFont());
-
-		rendererNameField = new StringDialogField();
-		rendererNameField
-				.setLabelText(EditorMessages.RendererSection_Dialog_DisplayName);
-
-		rendererClassField = new ClassButtonDialogField(getProject());
-//		rendererClassField.setRequired(true);
-		rendererClassField
-				.setLabelText(EditorMessages.RendererSection_Dialog_RendererClass);//$NON-NLS-1$
-		rendererClassField.setProject(getProject());
-		rendererClassField.setSuperClassName(IFacesConfigConstants.RENDERER_SUPER_CLASS);
-		rendererClassField.setAutoOpenResource(false);
-
-		componentFamilyField = new StringButtonDialogField(
-				new IStringButtonAdapter() {
-					public void changeControlPressed(DialogField field) {
-						Shell shell = EditorPlugin.getActiveShell();
-						ComponentListDialog dialog = new ComponentListDialog(
-								shell,
-								page,
-								page.getInput(),
-								EditorMessages.RendererSection_Dialog_ComponentFamilyCaption,
-								EditorMessages.RendererSection_Dialog_ComponentFamilyLabel);
-						if (dialog.open() == Dialog.OK) {
-							componentFamilyField.setText(dialog.getValue());
-						}
-					}
-				});
-		componentFamilyField
-				.setLabelText(EditorMessages.RendererSection_Dialog_ComponentFamilyValue);
-//		componentFamilyField.setRequired(true);
-
-		renderTypeField = new StringDialogField();
-//		renderTypeField.setRequired(true);
-		renderTypeField
-				.setLabelText(EditorMessages.RendererSection_Dialog_TypeValue);
-
-		GridData data = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(data);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		composite.setLayout(gl);
-
-		rendererNameField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		componentFamilyField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		renderTypeField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		rendererClassField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		LayoutUtil.setHorizontalGrabbing(rendererClassField.getTextControl(
-				null, composite));
-
-		// set the initial value for these fields.
-		rendererNameField.setText(rendererName);
-		rendererClassField.setText(rendererClass);
-		componentFamilyField.setText(componentFamily);
-		renderTypeField.setText(rendererType);
-
-		return composite;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	/**
-	 * @return the associated project
-	 */
-	public IProject getProject() {
-		return project;
-	}
-
-	/**
-	 * 
-	 */
-	protected void okPressed() {
-		rendererName = rendererNameField.getText();
-		rendererClass = rendererClassField.getText();
-		componentFamily = componentFamilyField.getText();
-		rendererType = renderTypeField.getText();
-
-		super.okPressed();
-	}
-
-	public String getRendererClass() {
-		return rendererClass;
-	}
-
-	public void setRendererClass(String rendererClass) {
-		this.rendererClass = rendererClass;
-	}
-
-	public String getRendererName() {
-		return rendererName;
-	}
-
-	public void setRendererName(String rendererName) {
-		this.rendererName = rendererName;
-	}
-
-	public String getComponentFamily() {
-		return componentFamily;
-	}
-
-	public void setComponentFamily(String componentFamily) {
-		this.componentFamily = componentFamily;
-	}
-
-	public String getRendererType() {
-		return rendererType;
-	}
-
-	public void setRendererType(String rendererType) {
-		this.rendererType = rendererType;
-	}
-
-	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 75dd0bc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/CommonListDialog.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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;
-
-	protected CommonListDialog(Shell parentShell, IFacesConfigPage page,
-			Object input, String caption, String label) {
-		super(parentShell);
-		this.page = page;
-		this.input = input;
-		this.label = label;
-		this.caption = caption;
-		parentShell.setText(caption);
-	}
-	
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText(caption);
-	}
-
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite composite = SWTUtils.createComposite(parent, 1);
-
-		SWTUtils.createLabel(composite, label, 1); //$NON-NLS-1$
-
-		inputText = SWTUtils.createTextBox(composite, 1);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.widthHint = TEXT_MINI_WIDTH;
-		inputText.setLayoutData(gd);
-
-		structuredViewer = createViewer(composite);
-		structuredViewer.addSelectionChangedListener(this);
-
-		return composite;
-	}
-
-	/**
-	 * Create the structured viewer, set up content & label provider for it.
-	 * Defaultly create a tableviewer.
-	 * 
-	 * @param parent
-	 * @return the structured viewer
-	 */
-	protected StructuredViewer createViewer(Composite parent) {
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.heightHint = 200;
-		gd.widthHint = 150;
-		parent.setLayoutData(gd);
-		GridLayout layout = new GridLayout();
-		parent.setLayout(layout);
-
-		TableViewer tableViewer = new TableViewer(parent, SWT.SINGLE
-				| SWT.H_SCROLL | SWT.V_SCROLL);
-		gd = new GridData(GridData.FILL_BOTH);
-		tableViewer.getControl().setLayoutData(gd);
-
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-		configViewer(tableViewer);
-		tableViewer.setInput(input);
-
-		return tableViewer;
-	}
-
-	/**
-	 * set the structuredViewer's input
-	 * 
-	 * @param input
-	 */
-	private void setViewerInput(Object input) {
-		structuredViewer.setInput(input);
-		this.input = input;
-	}
-
-	/**
-	 * get the input object of this section.
-	 */
-	public Object getInput() {
-		return input;
-	}
-
-	/**
-	 * set input object for this section.
-	 */
-	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);
-	}
-
-	public String getValue() {
-		return 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 19f1f4d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/ComponentListDialog.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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("");
-			}
-
-		}
-	}
-
-	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 d8c5618..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/DialogUtil.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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 class DialogUtil {
-
-	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;
-	}
-
-	public static String openRenderKitDialog(Shell shell,
-			FacesConfigType facesConfig) {
-		if (facesConfig != null) {
-			EList list = facesConfig.getRenderKit();
-			ArrayList ids = new ArrayList();
-			for (int i = 0, n = list.size(); i < n; i++) {
-				RenderKitIdType renderKitId = ((RenderKitType) list.get(i))
-						.getRenderKitId();
-				if (renderKitId != null) {
-					if (!"".equals(renderKitId.getTextContent())) {
-						ids.add(renderKitId.getTextContent());
-					}
-				}
-			}
-			String[] idArray = (String[]) ids.toArray(new String[ids.size()]);
-			Arrays.sort(idArray);
-			ListChoiceDialog dialog = new ListChoiceDialog(
-					shell,
-					idArray,
-					EditorMessages.DefaultRenderKitIDSection_Wizard_Page_LabelText);
-			if (dialog.open() == SelectionDialog.OK) {
-				String result = dialog.getResult();
-				if (!"".equals(result)) {
-					return result;
-				}
-			}
-		}
-		return null;
-	}
-
-	public static String openLocaleDialog(Shell shell, List existedLocaleList) {
-		LocaleDialog dialog = new LocaleDialog(shell, existedLocaleList);
-		if (dialog.open() == Window.OK) {
-			String result = dialog.getResult();
-			if (!"".equals(result)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	public static String openMessageBundleDialog(Shell shell, IProject project,
-			List existedBundleList) {
-		IJavaProject javaProject = null;
-
-		try {
-			if (project != null && project.hasNature(JavaCore.NATURE_ID)) {
-				javaProject = JavaCore.create(project);
-			} else {
-				return null;
-			}
-		} catch (CoreException e) {
-			// Ignore
-		}
-		MessageBundleSelectionDialog dialog = new MessageBundleSelectionDialog(
-				shell, javaProject, existedBundleList);
-
-		if (dialog.open() == SelectionDialog.OK) {
-			String newValue = (String) dialog.getResult()[0];
-			if (!"".equalsIgnoreCase(newValue)) {
-				return newValue;
-			}
-		}
-		return null;
-	}
-}
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 b89a83b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/EditListEntriesDialog.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldBase;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class EditListEntriesDialog extends Dialog {
-
-	private static final int MIN_DIALOG_WIDTH = 300;
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private ClassButtonDialogField valueClassField;
-
-	private IProject project;
-
-	private TableViewer tableViewer;
-
-	private Button removeButton;
-
-	private Button editButton;
-
-	private ListEntriesType listEntries;
-
-	private AbstractFacesConfigSection section;
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param listEntries
-	 *            the list-entries element that working on.
-	 * @param section 
-	 */
-	public EditListEntriesDialog(Shell parentShell,
-			ListEntriesType listEntries, AbstractFacesConfigSection section) {
-		super(parentShell);
-		this.listEntries = listEntries;
-		this.section = section;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText("Editing list-entries");
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite container = new Composite(parent, SWT.FILL);
-		GridData data = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(data);
-
-		GridLayout gl = new GridLayout();
-		gl.verticalSpacing = 0;
-		// gl.marginHeight = 0;
-		container.setLayout(gl);
-		createKeyValueSection(container);
-		createTableSection(container);
-
-		initFields();
-		return container;
-	}
-
-	private void initFields() {
-
-		if (listEntries.getValueClass() != null)
-			valueClassField.setText(listEntries.getValueClass()
-					.getTextContent());
-
-		tableViewer.setInput(listEntries);
-	}
-
-	private void createKeyValueSection(Composite parent) {
-		valueClassField = new ClassButtonDialogField(getProject());
-
-		valueClassField
-				.setLabelText(EditorMessages.InitializationSection_MapType_ValueClass);//$NON-NLS-1$
-		Composite typeSelectionSection = SWTUtils.createComposite(parent,
-				SWT.NONE);
-
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		typeSelectionSection.setLayoutData(gd);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		typeSelectionSection.setLayout(gl);
-
-		valueClassField.doFillIntoGrid(null, typeSelectionSection,
-				numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(valueClassField.getTextControl(null,
-				parent));
-	}
-
-	/**
-	 * 
-	 * @param parent
-	 */
-	private void createTableSection(Composite parent) {
-		Composite mapValueSection = SWTUtils.createComposite(parent, SWT.NONE);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		mapValueSection.setLayoutData(gd);
-
-		int numberOfColumns = 3;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		mapValueSection.setLayout(gl);
-
-		DialogField valuesTitle = new DialogFieldBase();
-		valuesTitle
-				.setLabelText(EditorMessages.InitializationSection_MapTable_Title);//$NON-NLS-1$    
-
-		valuesTitle.doFillIntoGrid(null, mapValueSection, numberOfColumns);
-
-		Table mapTable = new Table(mapValueSection, SWT.FULL_SELECTION
-				| SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-
-		mapTable.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				updateButtonsStatus();
-
-			}
-
-		});
-		mapTable.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected(null);
-			}
-		});
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		mapTable.setLayoutData(gd);
-		mapTable.setHeaderVisible(true);
-		mapTable.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		layout.addColumnData(new ColumnWeightData(1, true));
-		mapTable.setLayout(layout);
-
-		TableColumn keyCol = new TableColumn(mapTable, SWT.NONE);
-		keyCol
-				.setText(EditorMessages.InitializationSection_MapTable_Value);//$NON-NLS-1$
-		layout.addColumnData(new ColumnWeightData(1, true));
-		keyCol.setResizable(true);
-
-		tableViewer = new TableViewer(mapTable);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getValueType().isInstance(
-						element)
-						|| FacesConfigPackage.eINSTANCE.getNullValueType()
-								.isInstance(element);
-			}
-		});
-
-		Composite operationContainer = null;
-
-		operationContainer = SWTUtils
-				.createComposite(mapValueSection, SWT.NONE);
-
-		gd = new GridData(GridData.FILL_VERTICAL);
-		operationContainer.setLayoutData(gd);
-		gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = SWTUtils.createPushButton(operationContainer,
-				EditorMessages.UI_Button_Add_more); //$NON-NLS-1$
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-		addButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected(e);
-			}
-		});
-
-		editButton = SWTUtils.createPushButton(operationContainer,
-				EditorMessages.UI_Button_Edit_more);
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-		editButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected(e);
-			}
-
-		});
-		removeButton = SWTUtils.createPushButton(operationContainer,
-				EditorMessages.UI_Button_Remove); //$NON-NLS-1$
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-
-		});
-		editButton.setEnabled(false);
-		removeButton.setEnabled(false);
-	}
-
-	private AdapterFactory getAdapterFactory() {
-		return section.getAdapterFactory();
-	}
-
-	private void addButtonSelected(SelectionEvent e) {
-
-		EditValueDialog dialog = new EditValueDialog(EditorPlugin
-				.getActiveShell(), true, false, null);
-		if (dialog.open() == Dialog.OK) {
-			if (dialog.isNullValue()) {
-				NullValueType nullValue = FacesConfigFactory.eINSTANCE
-						.createNullValueType();
-				listEntries.getNullValue().add(nullValue);
-			} else {
-				ValueType value = FacesConfigFactory.eINSTANCE
-						.createValueType();
-				value.setTextContent((String) dialog.getResultData());
-				listEntries.getValue().add(value);
-			}
-		}
-
-	}
-
-	private void editButtonSelected(SelectionEvent e) {
-		Object select = ((IStructuredSelection) tableViewer.getSelection())
-				.getFirstElement();
-		boolean isNullValue;
-		String valueText = null;
-		if (select instanceof NullValueType)
-			isNullValue = true;
-		else {
-			isNullValue = false;
-			valueText = ((ValueType) select).getTextContent();
-		}
-
-		EditValueDialog dialog = new EditValueDialog(EditorPlugin
-				.getActiveShell(), true, isNullValue, valueText);
-		if (dialog.open() == Dialog.OK) {
-			if (isNullValue && !dialog.isNullValue()) {
-				listEntries.getNullValue().remove(select);
-				ValueType value = FacesConfigFactory.eINSTANCE
-						.createValueType();
-				value.setTextContent((String) dialog.getResultData());
-				listEntries.getValue().add(value);
-			} else if (!isNullValue && dialog.isNullValue()) {
-				listEntries.getValue().remove(select);
-				NullValueType nullValue = FacesConfigFactory.eINSTANCE
-						.createNullValueType();
-				listEntries.getNullValue().add(nullValue);
-			} else if (!isNullValue && !dialog.isNullValue()) {
-				((ValueType) select).setTextContent((String) dialog
-						.getResultData());
-			}
-		}
-	}
-
-	private void removeButtonSelected() {
-		Object select = ((IStructuredSelection) tableViewer.getSelection())
-				.getFirstElement();
-		if (select instanceof NullValueType)
-			listEntries.getNullValue().remove(select);
-		else
-			listEntries.getValue().remove(select);
-		tableViewer.refresh();
-		updateButtonsStatus();
-	}
-
-	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);
-	}
-
-	public IProject getProject() {
-		if (project == null) {
-			project = (IProject) section.getPage().getEditor().getAdapter(
-					IProject.class);
-		}
-		return project;
-	}
-
-	public void setProject(IProject project) {
-		this.project = project;
-	}
-
-	public ListEntriesType getListEntries() {
-		return 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 d03570a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/EditMapEntriesDialog.java
+++ /dev/null
@@ -1,433 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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.
-	 */
-	public EditMapEntriesDialog(Shell parentShell, MapEntriesType mapEntries,
-			AbstractFacesConfigSection section) {
-		super(parentShell);
-		this.mapEntries = mapEntries;
-		this.section = section;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText("Editing map-entries");
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite container = new Composite(parent, SWT.FILL);
-		GridData data = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(data);
-
-		GridLayout gl = new GridLayout();
-		gl.verticalSpacing = 0;
-		// gl.marginHeight = 0;
-		container.setLayout(gl);
-		createKeyValueSection(container);
-		createTableSection(container);
-
-		initFields();
-		return container;
-	}
-
-	private void initFields() {
-
-		if (mapEntries.getKeyClass() != null)
-			keyClassField.setText(mapEntries.getKeyClass().getTextContent());
-
-		if (mapEntries.getValueClass() != null)
-			valueClassField
-					.setText(mapEntries.getValueClass().getTextContent());
-
-		tableViewer.setInput(mapEntries);
-	}
-
-	private void createKeyValueSection(Composite parent) {
-		keyClassField = new ClassButtonDialogField(getProject());
-		keyClassField
-				.setLabelText(EditorMessages.InitializationSection_MapType_KeyClass);//$NON-NLS-1$
-
-		valueClassField = new ClassButtonDialogField(getProject());
-
-		valueClassField
-				.setLabelText(EditorMessages.InitializationSection_MapType_ValueClass);//$NON-NLS-1$
-
-		Composite typeSelectionSection = SWTUtils.createComposite(parent,
-				SWT.NONE);
-
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		typeSelectionSection.setLayoutData(gd);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		typeSelectionSection.setLayout(gl);
-
-		keyClassField.doFillIntoGrid(null, typeSelectionSection,
-				numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(keyClassField.getTextControl(null,
-				parent));
-
-		valueClassField.doFillIntoGrid(null, typeSelectionSection,
-				numberOfColumns);
-	}
-
-	/**
-	 * 
-	 * @param parent
-	 */
-	private void createTableSection(Composite parent) {
-		Composite mapValueSection = SWTUtils.createComposite(parent, SWT.NONE);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		mapValueSection.setLayoutData(gd);
-
-		int numberOfColumns = 3;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		mapValueSection.setLayout(gl);
-
-		DialogField valuesTitle = new DialogFieldBase();
-		valuesTitle
-				.setLabelText(EditorMessages.InitializationSection_MapTable_Title);//$NON-NLS-1$    
-
-		valuesTitle.doFillIntoGrid(null, mapValueSection, numberOfColumns);
-
-		Table mapTable = new Table(mapValueSection, SWT.FULL_SELECTION
-				| SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-
-		mapTable.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				updateButtonsStatus();
-
-			}
-
-		});
-		mapTable.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected(null);
-			}
-		});
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		mapTable.setLayoutData(gd);
-		mapTable.setHeaderVisible(true);
-		mapTable.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		mapTable.setLayout(layout);
-
-		TableColumn keyCol = new TableColumn(mapTable, SWT.NONE);
-		keyCol
-				.setText(EditorMessages.InitializationSection_MapTable_Key);//$NON-NLS-1$
-		layout.addColumnData(new ColumnWeightData(1, true));
-		keyCol.setResizable(true);
-
-		TableColumn valueCol = new TableColumn(mapTable, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-
-		valueCol
-				.setText(EditorMessages.InitializationSection_MapTable_Value);//$NON-NLS-1$
-		valueCol.setResizable(true);
-
-		tableViewer = new TableViewer(mapTable);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getMapEntryType()
-						.isInstance(element);
-			}
-		});
-
-		// map's operation buttons
-		Composite operationContainer = null;
-
-		operationContainer = SWTUtils
-				.createComposite(mapValueSection, SWT.NONE);
-
-		gd = new GridData(GridData.FILL_VERTICAL);
-		operationContainer.setLayoutData(gd);
-		gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = SWTUtils.createPushButton(operationContainer,
-				EditorMessages.UI_Button_Add_more); //$NON-NLS-1$
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-		addButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected(e);
-			}
-		});
-
-		editButton = SWTUtils.createPushButton(operationContainer,
-				EditorMessages.UI_Button_Edit_more);
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-		editButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected(e);
-			}
-
-		});
-		removeButton = SWTUtils.createPushButton(operationContainer,
-				EditorMessages.UI_Button_Remove); //$NON-NLS-1$
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-
-		});
-		editButton.setEnabled(false);
-		removeButton.setEnabled(false);
-	}
-	
-	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();
-	}
-
-	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);
-	}
-
-	public void setProject(IProject project) {
-		this.project = project;
-	}
-
-	public MapEntriesType getMapEntries() {
-		return 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 c6cdbb6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/EditValueDialog.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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 = false;
-
-	private boolean isNullValue;
-
-	public EditValueDialog(Shell parentShell, String value) {
-		super(parentShell);
-		this.value = value;
-		this.isNullButtonShown = false;
-	}
-
-	public EditValueDialog(Shell parentShell, boolean isNullButtonShown,
-			boolean isNullValue, String value) {
-		super(parentShell);
-		this.isNullValue = isNullValue;
-		this.value = value;
-		this.isNullButtonShown = isNullButtonShown;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#createDialogArea(Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		GridLayout gridLayout;
-		Composite container = (Composite) super.createDialogArea(parent);
-		gridLayout = new GridLayout();
-		gridLayout.numColumns = 1;
-		gridLayout.marginHeight = 10;
-		gridLayout.marginWidth = 10;
-		container.setLayout(gridLayout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gd);
-
-		if (this.isNullButtonShown) {
-			nullValueTypeButton = SWTUtils.createCheckBox(container,
-					IFacesConfigConstants.NULL_VALUE, 2);
-			nullValueTypeButton.addSelectionListener(new SelectionAdapter() {
-
-				public void widgetSelected(SelectionEvent e) {
-					valueText.setEnabled(!nullValueTypeButton.getSelection());
-					isNullValue = nullValueTypeButton.getSelection();
-				}
-
-			});
-		}
-
-		DialogField valueTitle = new DialogFieldBase();
-		// ManagedBeansPage.ManagedBeanInitializationSection.MapTable.Title =
-		// Values:
-		valueTitle
-				.setLabelText(EditorMessages.ManagedBeanPropertyEditDialog_Value);//$NON-NLS-1$
-		valueTitle.doFillIntoGrid(null, container, 1);
-
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.widthHint = VALUE_WIDTH;
-		gd.heightHint = VALUE_HEIGHT;
-		valueText = new Text(container, SWT.MULTI | SWT.BORDER);
-		valueText.setLayoutData(gd);
-
-		initFields();
-		return container;
-	}
-
-	private void initFields() {
-
-		if (isNullButtonShown && isNullValue) {
-			nullValueTypeButton.setSelection(true);
-			valueText.setEnabled(false);
-		} else if (value != null) {
-			valueText.setText(value);
-		}
-	}
-
-	/**
-	 * create a inital value group
-	 * 
-	 * @param container -
-	 *            parent composite control
-	 */
-	protected void createValueSection(Composite container) {
-		Composite valueSection = new Composite(container, SWT.NONE);
-		GridLayout gl = new GridLayout();
-		// gl.marginHeight = 20;
-		gl.numColumns = 2;
-		valueSection.setLayout(gl);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		valueSection.setLayoutData(gd);
-
-		Label lblValue = new Label(valueSection, SWT.LEFT);
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-		gd.widthHint = 100;
-		lblValue.setLayoutData(gd);
-
-		// ManagedBeanPropertyEditDialog.Value = Value:
-		lblValue
-				.setText(EditorMessages.ManagedBeanPropertyEditDialog_Value); //$NON-NLS-1$
-
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL
-				| GridData.FILL_HORIZONTAL);
-		gd.widthHint = 200;
-		valueText = new Text(valueSection, SWT.BORDER);
-		valueText.setLayoutData(gd);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#createButtonsForButtonBar(Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-				true);
-		createButton(parent, IDialogConstants.CANCEL_ID,
-				IDialogConstants.CANCEL_LABEL, false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#configureShell(Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText(EditorMessages.ValueEditDialog_Title); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#buttonPressed(int)
-	 */
-	protected void buttonPressed(int buttonId) {
-		if (buttonId == IDialogConstants.CANCEL_ID) {
-			setReturnCode(CANCEL);
-			close();
-			return;
-		} else if (buttonId == IDialogConstants.OK_ID) {
-			value = valueText.getText();
-			setReturnCode(OK);
-			close();
-			return;
-		}
-		super.buttonPressed(buttonId);
-	}
-
-	public Object getResultData() {
-		return value;
-	}
-
-	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 e91881b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/ListChoiceDialog.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.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;
-
-	public ListChoiceDialog(Shell parentShell, String[] items, String labelString) {
-		super(parentShell);
-		this.items = items;
-		if(this.items == null)
-		{
-			this.items = new String[0];
-		}
-		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);
-							}
-						}
-					}
-				});
-	}
-	
-	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 5764013..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/LocaleDialog.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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;
-	}
-
-	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 0f18361..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/MessageBundleViewerSorter.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.dialog;
-
-import java.text.Collator;
-
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.internal.core.JarPackageFragmentRoot;
-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
-				&& !(element instanceof JarPackageFragmentRoot)) {
-			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 5eec461..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/StatusDialog.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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;
-	}
-
-	protected abstract boolean isValid();
-
-	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);
-		}
-	}
-
-	public String getStatusMessage() {
-		return statusMessage;
-	}
-
-	public void setStatusMessage(String statusMessage) {
-		this.statusMessage = statusMessage;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/ComponentsPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/ComponentsPage.java
deleted file mode 100644
index 1b4a774..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/ComponentsPage.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererType;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.detail.ComponentDetailsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.detail.ConverterDetailsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.detail.RenderkitDetailsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.detail.ValidatorDetailsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ComponentMasterSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ConverterMasterSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.FacesConfigMasterSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.RenderkitMasterSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ValidatorMasterSection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IDetailsPage;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-
-/**
- * The "Components" page of faces config editor.
- * 
- * @author sfshi
- * 
- */
-public class ComponentsPage extends FacesConfigMasterDetailPage {
-
-	/**
-	 * The id of this page in the faces-config editor.
-	 */
-	public static final String PAGE_ID = "org.eclipse.jst.jsf.facesconfig.ui.page.ComponentsPage";
-
-	private IContentOutlinePage contentOutlinePage;
-
-	/**
-	 * Constructor of ComponentsPage;
-	 * 
-	 * @param editor
-	 *            the facesconfig editor;
-	 */
-	public ComponentsPage(FacesConfigEditor editor) {
-		super(editor, "ComponentsPage",
-				EditorMessages.FacesConfigEditor_Components_TabName);
-	}
-
-	/**
-	 * Create the master sections;
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage#createMasterSections(Composite,
-	 *      IManagedForm, FormToolkit, FacesConfigMasterDetailPage)
-	 */
-	protected FacesConfigMasterSection[] createMasterSections(
-			Composite composite, IManagedForm managedForm, FormToolkit toolkit,
-			FacesConfigMasterDetailPage page) {
-		FacesConfigMasterSection componentMaster = new ComponentMasterSection(
-				composite, managedForm, toolkit, page);
-		componentMaster.getSection().setExpanded(true);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		componentMaster.getSection().setLayoutData(gd);
-
-		FacesConfigMasterSection converterMaster = new ConverterMasterSection(
-				composite, managedForm, toolkit, page);
-		converterMaster.getSection().setExpanded(false);
-		GridData convertergd = new GridData(GridData.FILL_HORIZONTAL);
-		converterMaster.getSection().setLayoutData(convertergd);
-
-		FacesConfigMasterSection renderkitMaster = new RenderkitMasterSection(
-				composite, managedForm, toolkit, page);
-		renderkitMaster.getSection().setExpanded(false);
-		GridData renderkitgd = new GridData(GridData.FILL_HORIZONTAL);
-		renderkitMaster.getSection().setLayoutData(renderkitgd);
-
-		FacesConfigMasterSection validatorMaster = new ValidatorMasterSection(
-				composite, managedForm, toolkit, page);
-		validatorMaster.getSection().setExpanded(false);
-		GridData valicatorgd = new GridData(GridData.FILL_HORIZONTAL);
-		validatorMaster.getSection().setLayoutData(valicatorgd);
-
-		return new FacesConfigMasterSection[] { componentMaster,
-				converterMaster, renderkitMaster, validatorMaster };
-	}
-
-	/**
-	 * get the details page;
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage#getPageKey(Object
-	 *      object)
-	 * @param key
-	 *            the eClass object of a component.
-	 */
-	public IDetailsPage getPage(Object key) {
-		IDetailsPage detailsPage = null;
-		if (key instanceof EClass) {
-			EClass eClass = (EClass) key;
-			if (eClass.getClassifierID() == FacesConfigPackage.COMPONENT_TYPE) {
-				detailsPage = new ComponentDetailsPage(this);
-			} else if (eClass.getClassifierID() == FacesConfigPackage.RENDER_KIT_TYPE) {
-				detailsPage = new RenderkitDetailsPage(this);
-			} else if (eClass.getClassifierID() == FacesConfigPackage.CONVERTER_TYPE) {
-				detailsPage = new ConverterDetailsPage(this);
-			} else if (eClass.getClassifierID() == FacesConfigPackage.VALIDATOR_TYPE) {
-				detailsPage = new ValidatorDetailsPage(this);
-			}
-
-			if (detailsPage instanceof ISelectionProvider) {
-				((ISelectionProvider) detailsPage)
-						.addSelectionChangedListener(this);
-			}
-		}
-		return detailsPage;
-	}
-
-	public Object getAdapter(Class adapter) {
-
-		if (adapter == IContentOutlinePage.class) {
-			return getOutlinePage();
-		}
-
-		return super.getAdapter(adapter);
-	}
-
-	private IContentOutlinePage getOutlinePage() {
-
-		if (contentOutlinePage == null) {
-			// The content outline is just a tree.
-			//
-			class ComponentsContentOutlinePage extends ContentOutlinePage {
-				public void createControl(Composite parent) {
-					super.createControl(parent);
-					TreeViewer contentOutlineViewer = getTreeViewer();
-					contentOutlineViewer.addSelectionChangedListener(this);
-
-					AdapterFactory adapterFactory = (AdapterFactory) getEditor()
-							.getAdapter(AdapterFactory.class);
-					// Set up the tree viewer.
-					contentOutlineViewer
-							.setContentProvider(new AdapterFactoryContentProvider(
-									adapterFactory));
-					contentOutlineViewer
-							.setLabelProvider(new AdapterFactoryLabelProvider(
-									adapterFactory));
-					contentOutlineViewer.addFilter(new ViewerFilter() {
-
-						public boolean select(Viewer viewer,
-								Object parentElement, Object element) {
-							return FacesConfigPackage.eINSTANCE
-									.getComponentType().isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getConverterType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getRenderKitType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getValidatorType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getAttributeType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getPropertyType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getFacetType().isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getRendererType().isInstance(
-													element);
-						}
-					});
-
-					contentOutlineViewer.setSorter(new ViewerSorter());
-					contentOutlineViewer.setInput(getInput());
-				}
-
-			}
-
-			contentOutlinePage = new ComponentsContentOutlinePage();
-
-			// Listen to selection so that we can handle it is a special
-			// way.
-			//
-			contentOutlinePage
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-						// This ensures that we handle selections correctly.
-						public void selectionChanged(SelectionChangedEvent event) {
-							setSelection(event.getSelection());
-						}
-					});
-
-			addSelectionChangedListener((ContentOutlinePage) contentOutlinePage);
-		}
-
-		return contentOutlinePage;
-
-	}
-
-	/**
-	 * handle the selection changed event from outline page.
-	 * 
-	 * @param selection
-	 */
-	public void setSelection(ISelection selection) {
-
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection ss = (IStructuredSelection) selection;
-			IStructuredSelection currentSelection = (IStructuredSelection) this
-					.getSelection();
-			if ((!ss.isEmpty())
-					&& (!currentSelection.isEmpty())
-					&& (ss.getFirstElement() == currentSelection
-							.getFirstElement())) {
-				return;
-			}
-			EObject component = null;
-			if (ss.getFirstElement() instanceof AttributeType
-					|| ss.getFirstElement() instanceof PropertyType
-					|| ss.getFirstElement() instanceof FacetType
-					|| ss.getFirstElement() instanceof RendererType) {
-				component = ((EObject) ss.getFirstElement()).eContainer();
-			} else if (ss.getFirstElement() instanceof EObject) {
-				component = (EObject) ss.getFirstElement();
-			}
-
-			if (component != null) {
-				FacesConfigMasterSection section = null;
-				if (FacesConfigPackage.eINSTANCE.getComponentType().isInstance(
-						component)) {
-					section = getFacesConfigMasterSections()[0];
-				} else if (FacesConfigPackage.eINSTANCE.getConverterType()
-						.isInstance(component)) {
-					section = getFacesConfigMasterSections()[1];
-				} else if (FacesConfigPackage.eINSTANCE.getRenderKitType()
-						.isInstance(component)) {
-					section = getFacesConfigMasterSections()[2];
-				} else if (FacesConfigPackage.eINSTANCE.getValidatorType()
-						.isInstance(component)) {
-					section = getFacesConfigMasterSections()[3];
-				}
-
-				if (!section.getSection().isExpanded()) {
-					this.closeOtherSections(section);
-					GridData gd = new GridData(GridData.FILL_BOTH);
-					section.getSection().setLayoutData(gd);
-					section.getSection().setExpanded(true);
-				}
-				IStructuredSelection newselection = new StructuredSelection(
-						component);
-				section.getStructuredViewer().setSelection(newselection);
-			}
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/FacesConfigMasterDetailPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/FacesConfigMasterDetailPage.java
deleted file mode 100644
index 8a82240..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/FacesConfigMasterDetailPage.java
+++ /dev/null
@@ -1,383 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.page.detail.FacesConfigDetailsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.FacesConfigMasterSection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.forms.DetailsPart;
-import org.eclipse.ui.forms.IDetailsPage;
-import org.eclipse.ui.forms.IDetailsPageProvider;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-
-/**
- * In some cases the page is a master-detail style, the content of the right
- * side will change according user's selection on the left side. This is an
- * abstract implementation of IFacesConfigPage, with a FacesConfigMasterSection
- * array and a DetailsPart.
- * 
- * @author sfshi
- * 
- */
-public abstract class FacesConfigMasterDetailPage extends FormPage implements
-		IFacesConfigPage, IDetailsPageProvider, ISelectionChangedListener,
-		ISelectionProvider, IEditingDomainProvider {
-
-	private final static Image BANNER_IMAGE = EditorPlugin.getDefault()
-			.getImage("form_banner.gif");
-
-	private FacesConfigMasterSection[] facesConfigMasterSections;
-
-	private DetailsPart detailsPart;
-
-	private Object input;
-
-	private List selectionChangedListeners = new ArrayList();
-
-	private IPropertySheetPage propertySheetPage;
-	
-	private ISelection currentSelection = null;
-
-	/**
-	 * 
-	 * @param editor
-	 *            the editor part that this page belongs to;
-	 * @param id
-	 *            page id;
-	 * @param title
-	 *            page title;
-	 */
-	public FacesConfigMasterDetailPage(FacesConfigEditor editor, String id,
-			String title) {
-		super(editor, id, title);
-	}
-
-	public EditingDomain getEditingDomain() {
-		return ((FacesConfigEditor) getEditor()).getEditingDomain();
-	}
-
-	/**
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui.forms.IManagedForm)
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-
-		ScrolledForm form = managedForm.getForm();
-		form.setText(this.getTitle());//$NON-NLS-1$
-		form.setBackgroundImage(BANNER_IMAGE); //$NON-NLS-1$ 
-		fillBody(managedForm, managedForm.getToolkit());
-		managedForm.refresh();
-	}
-
-	/**
-	 * set input for this page when the it got activated at the first time; if
-	 * it's not the first time, then refresh the page.
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormPage#setActive(boolean)
-	 */
-	public void setActive(boolean active) {
-		super.setActive(active);
-		if (active) {
-			if (getInput() != ((FacesConfigEditor) getEditor())
-					.getFacesConfig()) {
-				setInput(((FacesConfigEditor) getEditor()).getFacesConfig());
-			} else {
-				this.refresh();
-			}
-		}
-	}
-
-	public boolean isEditor() {
-		return true;
-	}
-
-	/**
-	 * 
-	 * @param managedForm
-	 * @param toolkit
-	 */
-	private void fillBody(IManagedForm managedForm, FormToolkit toolkit) {
-		Composite body = managedForm.getForm().getBody();
-
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.horizontalSpacing = 0;
-		gridLayout.verticalSpacing = 0;
-		gridLayout.numColumns = 2;
-		gridLayout.marginHeight = 0;
-		gridLayout.marginWidth = 0;
-		body.setLayout(gridLayout);
-
-		SashForm sashForm = new SashForm(body, SWT.NULL);
-		managedForm.getToolkit().adapt(sashForm, false, false);
-		sashForm.setMenu(body.getMenu());
-		sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		Composite leftContainer = toolkit.createComposite(sashForm);
-		GridLayout gl = new GridLayout();
-		gl.marginHeight = 0;
-		leftContainer.setLayout(gl);
-
-		// create master sections here
-		facesConfigMasterSections = createMasterSections(leftContainer,
-				managedForm, toolkit, this);
-
-		if (facesConfigMasterSections != null) {
-			for (int i = 0, n = facesConfigMasterSections.length; i < n; i++) {
-				FacesConfigMasterSection aSection = facesConfigMasterSections[i];
-				aSection.initialize();
-				aSection.addSelectionChangedListener(this);
-
-			}
-		}
-
-		detailsPart = new DetailsPart(managedForm, sashForm, SWT.NULL);
-		managedForm.addPart(detailsPart);
-
-		detailsPart.setPageLimit(4);
-		detailsPart.setPageProvider(this);
-
-		detailsPart.initialize(managedForm);
-
-		sashForm.setWeights(new int[] { 40, 60 });
-
-		getSite().setSelectionProvider(this);
-	}
-
-	/**
-	 * Create the detail sections, and set layout data and initial expand state
-	 * for them.
-	 * 
-	 * @param composite
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page
-	 * @return the detail sections
-	 */
-	abstract protected FacesConfigMasterSection[] createMasterSections(
-			Composite composite, IManagedForm managedForm, FormToolkit toolkit,
-			FacesConfigMasterDetailPage page);
-
-	/**
-	 * set input object; also set into all the master sections.
-	 */
-	public void setInput(Object input) {
-		if (facesConfigMasterSections != null) {
-			for (int i = 0, n = facesConfigMasterSections.length; i < n; i++) {
-				facesConfigMasterSections[i].setInput(input);
-			}
-		}
-		this.input = input;
-	}
-
-	/**
-	 * get the input object.
-	 */
-	public Object getInput() {
-		return input;
-	}
-
-	/**
-	 * Defaultly use the EClass object of the selected object as page key. Sub
-	 * classes can override this method if there has other ways.
-	 * 
-	 * @param object
-	 */
-	public Object getPageKey(Object object) {
-		if (object instanceof EObject) {
-			EObject eObject = (EObject) object;
-			return eObject.eClass();
-		}
-		return null;
-	}
-
-	/**
-	 * Subclasses should create and return an IDetailsPage instance according
-	 * what the key is. Defaultly the EClass object of the selected object in
-	 * the structured viewer will be taken as the page key.
-	 * 
-	 * @see #getPageKey
-	 * 
-	 */
-	abstract public IDetailsPage getPage(Object key);
-
-	/**
-	 * transfer the selection changed event to detail part.
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-
-		currentSelection = event.getSelection();
-		if (event.getSource() instanceof FacesConfigMasterSection) {
-			FacesConfigMasterSection source = (FacesConfigMasterSection) event
-					.getSource();
-
-			detailsPart.selectionChanged(source, event.getSelection());
-
-			if (source.getSection().isExpanded()) {
-				for (int i = 0, n = selectionChangedListeners.size(); i < n; i++) {
-					((ISelectionChangedListener) selectionChangedListeners
-							.get(i)).selectionChanged(event);
-				}
-			}
-		} else if (event.getSource() instanceof FacesConfigDetailsPage) {
-			for (int i = 0, n = selectionChangedListeners.size(); i < n; i++) {
-				((ISelectionChangedListener) selectionChangedListeners.get(i))
-						.selectionChanged(event);
-			}
-		}
-	}
-
-	/**
-	 * set other sections' expand state to false, except this section;
-	 * 
-	 * @param section
-	 *            the section that be expanded.
-	 */
-	public void closeOtherSections(FacesConfigMasterSection section) {
-
-		for (int i = 0, n = facesConfigMasterSections.length; i < n; i++) {
-			FacesConfigMasterSection aSection = facesConfigMasterSections[i];
-			if (aSection != section && aSection.getSection().isExpanded()) {
-				aSection.getSection().setExpanded(false);
-				GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-				aSection.getSection().setLayoutData(gd);
-			}
-		}
-	}
-
-	/**
-	 * refresh this page, the expanded section and the detail page will got
-	 * refreshed.
-	 */
-	public void refresh() {
-
-		// only refresh the expanded section;
-		for (int i = 0, n = facesConfigMasterSections.length; i < n; i++) {
-			if (facesConfigMasterSections[i].getSection().isExpanded()) {
-				facesConfigMasterSections[i].refresh();
-			}
-		}
-
-		// refresh the detail page, it will call detail sections
-		// to got refreshed.
-		if (detailsPart.getCurrentPage() != null) {
-			detailsPart.getCurrentPage().refresh();
-		}
-	}
-
-	/**
-	 * get the section that is expanded.
-	 * 
-	 * @return the master section
-	 */
-	protected FacesConfigMasterSection getActiveSection() {
-		for (int i = 0, n = facesConfigMasterSections.length; i < n; i++) {
-
-			if (facesConfigMasterSections[i].getSection().isExpanded()) {
-				return facesConfigMasterSections[i];
-			}
-		}
-		return null;
-
-	}
-
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	public ISelection getSelection() {
-		if(currentSelection != null)
-			return currentSelection;
-		return StructuredSelection.EMPTY;
-
-	}
-
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	public void setSelection(ISelection selection) {
-	    // no selection setting
-	}
-
-	public Object getAdapter(Class adapter) {
-
-		if (adapter == IPropertySheetPage.class) {
-			return getPropertySheetPage();
-		}
-		return super.getAdapter(adapter);
-	}
-
-	private IPropertySheetPage getPropertySheetPage() {
-
-		AdapterFactoryEditingDomain editingDomain = (AdapterFactoryEditingDomain) getEditor()
-				.getAdapter(EditingDomain.class);
-		AdapterFactory adapterFactory = (AdapterFactory) getEditor()
-				.getAdapter(AdapterFactory.class);
-		if (propertySheetPage == null) {
-			propertySheetPage = new ExtendedPropertySheetPage(editingDomain) {
-				public void setSelectionToViewer(List selection) {
-					// FacesConfigEditor.this.setSelectionToViewer(selection);
-					// FacesConfigEditor.this.setFocus();
-				}
-
-				public void setActionBars(IActionBars actionBars) {
-					super.setActionBars(actionBars);
-					// getActionBarContributor().shareGlobalActions(this,
-					// actionBars);
-				}
-			};
-			((ExtendedPropertySheetPage) propertySheetPage)
-					.setPropertySourceProvider(new AdapterFactoryContentProvider(
-							adapterFactory));
-			// this.addSelectionChangedListener((ExtendedPropertySheetPage)
-			// propertySheetPage);
-		}
-
-		return propertySheetPage;
-
-	}
-
-	/**
-	 * @return the facesConfigMasterSections
-	 */
-	public FacesConfigMasterSection[] getFacesConfigMasterSections() {
-		return facesConfigMasterSections;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/IFacesConfigPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/IFacesConfigPage.java
deleted file mode 100644
index 42afa4f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/IFacesConfigPage.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import org.eclipse.ui.forms.editor.IFormPage;
-
-/**
- * Implemented by IFormPage's that want to support EditorInput-like
- * model set/get/refresh
- * 
- * @author sfshi
- * 
- */
-public interface IFacesConfigPage extends IFormPage {
-
-	/**
-	 * Set the input.  Implementer may choose to ignore
-	 * 
-	 * @param input
-	 */
-	void setInput(Object input);
-
-	/**
-	 * @return the input or null if none set
-	 */
-	Object getInput();
-
-	/**
-	 * signal to a form page that the data in its input has changed
-	 * and it should refresh its view.
-	 */
-	void refresh();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/IntroductionPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/IntroductionPage.java
deleted file mode 100644
index 3b12b6a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/IntroductionPage.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.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.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.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{
-	/**
-	 * @param facesConfigEditor
-	 */
-	public IntroductionPage(FacesConfigEditor facesConfigEditor) {
-		super(facesConfigEditor, IntroductionPage.class.getName(),
-				EditorMessages.editor_pageflow_page_intro_name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui.forms.IManagedForm)
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-		// get the form
-		ScrolledForm form = managedForm.getForm();
-		FormToolkit toolkit = getEditor().getToolkit();
-		form.setText(EditorMessages.editor_pageflow_page_intro_title);
-
-		form.setBackgroundImage(EditorPlugin.getDefault().getImage("form_banner.gif"));
-
-		// create a layout
-		TableWrapLayout layout = new TableWrapLayout();
-		layout.numColumns = 1;
-		layout.makeColumnsEqualWidth = true;
-		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);
-
-		TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
-		td.colspan = 1;
-		introPart.setLayoutData(td);
-
-		getSite().setSelectionProvider(this);
-	}
-
-	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
-		
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/ManagedBeanPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/ManagedBeanPage.java
deleted file mode 100644
index cc092c0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/ManagedBeanPage.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.detail.ManagedBeanDetailsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.FacesConfigMasterSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ManagedBeanMasterSection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IDetailsPage;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class ManagedBeanPage extends FacesConfigMasterDetailPage {
-
-    /**
-     * The id of this page in the faces-config editor.
-     */
-	public static final String PAGE_ID = "org.eclipse.jst.jsf.facesconfig.ui.page.ManagedBeanPage";
-
-	private IContentOutlinePage contentOutlinePage;
-
-	/**
-	 * @param editor
-	 */
-	public ManagedBeanPage(FacesConfigEditor editor) {
-		super(editor, "ManagedBeanPage",
-				EditorMessages.FacesConfigEditor_ManagedBeans_TabName);
-	}
-
-	protected FacesConfigMasterSection[] createMasterSections(
-			Composite composite, IManagedForm managedForm, FormToolkit toolkit,
-			FacesConfigMasterDetailPage page) {
-		FacesConfigMasterSection managedBeanMaster = new ManagedBeanMasterSection(
-				composite, managedForm, toolkit, page);
-		managedBeanMaster.getSection().setExpanded(true);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		managedBeanMaster.getSection().setLayoutData(gd);
-		return new FacesConfigMasterSection[] { managedBeanMaster };
-	}
-
-	public IDetailsPage getPage(Object key) {
-		IDetailsPage detailsPage = null;
-		if (key instanceof EClass) {
-			EClass eClass = (EClass) key;
-			if (eClass.getClassifierID() == FacesConfigPackage.MANAGED_BEAN_TYPE) {
-				detailsPage = new ManagedBeanDetailsPage(this);
-			}
-			
-			if (detailsPage instanceof ISelectionProvider) {
-				((ISelectionProvider) detailsPage)
-						.addSelectionChangedListener(this);
-			}
-		}
-		return detailsPage;
-	}
-
-	public Object getAdapter(Class adapter) {
-
-		if (adapter == IContentOutlinePage.class) {
-			return getOutlinePage();
-		}
-
-		return super.getAdapter(adapter);
-	}
-
-	private IContentOutlinePage getOutlinePage() {
-
-		if (contentOutlinePage == null) {
-			// The content outline is just a tree.
-			//
-			class ManagedBeanContentOutlinePage extends ContentOutlinePage {
-				public void createControl(Composite parent) {
-					super.createControl(parent);
-					TreeViewer contentOutlineViewer = getTreeViewer();
-					contentOutlineViewer.addSelectionChangedListener(this);
-
-					AdapterFactory adapterFactory = (AdapterFactory) getEditor()
-							.getAdapter(AdapterFactory.class);
-					// Set up the tree viewer.
-					contentOutlineViewer
-							.setContentProvider(new AdapterFactoryContentProvider(
-									adapterFactory));
-					contentOutlineViewer
-							.setLabelProvider(new AdapterFactoryLabelProvider(
-									adapterFactory));
-					contentOutlineViewer.addFilter(new ViewerFilter() {
-
-						public boolean select(Viewer viewer,
-								Object parentElement, Object element) {
-							return FacesConfigPackage.eINSTANCE
-									.getManagedBeanType().isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getManagedPropertyType()
-											.isInstance(element);
-						}
-					});
-
-					contentOutlineViewer.setSorter(new ViewerSorter());
-					contentOutlineViewer.setInput(getInput());
-				}
-
-			}
-
-			contentOutlinePage = new ManagedBeanContentOutlinePage();
-
-			// Listen to selection so that we can handle it is a special
-			// way.
-			//
-			contentOutlinePage
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-						// This ensures that we handle selections correctly.
-						public void selectionChanged(SelectionChangedEvent event) {
-							setSelection(event.getSelection());
-						}
-					});
-
-			// this.addSelectionChangedListener((ContentOutlinePage)
-			// contentOutlinePage);
-		}
-
-		return contentOutlinePage;
-
-	}
-
-	/**
-	 * handle the selection changed event from outline page.
-	 * 
-	 * @param selection
-	 */
-	public void setSelection(ISelection selection) {
-
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection ss = (IStructuredSelection) selection;
-			ManagedBeanType bean = null;
-			if (ss.getFirstElement() instanceof ManagedBeanType) {
-				bean = (ManagedBeanType) ss.getFirstElement();
-			} else if (ss.getFirstElement() instanceof ManagedPropertyType) {
-				bean = (ManagedBeanType) ((ManagedPropertyType) ss
-						.getFirstElement()).eContainer();
-			}
-
-			if (bean != null) {
-				if (!getManagedBeanMasterSection().getSection().isExpanded()) {
-					GridData gd = new GridData(GridData.FILL_BOTH);
-					getManagedBeanMasterSection().getSection()
-							.setLayoutData(gd);
-					getManagedBeanMasterSection().getSection()
-							.setExpanded(true);
-				}
-				IStructuredSelection newselection = new StructuredSelection(
-						bean);
-				getManagedBeanMasterSection().getStructuredViewer()
-						.setSelection(newselection);
-			}
-		}
-
-	}
-
-	private ManagedBeanMasterSection getManagedBeanMasterSection() {
-		return (ManagedBeanMasterSection) getFacesConfigMasterSections()[0];
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/OthersPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/OthersPage.java
deleted file mode 100644
index b0026c9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/OthersPage.java
+++ /dev/null
@@ -1,763 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ApplicationSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.FactorySection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.LifecycleSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.LocaleConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.OthersPageBaseSection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-
-/**
- * @author Zhi-peng Zhang, sfshi
- * @version
- */
-
-/**
- * This class is the "Others" page.
- */
-public class OthersPage extends FormPage implements IFacesConfigPage,
-		ISelectionProvider, ISelectionChangedListener, IEditingDomainProvider {
-
-    /**
-     * The id of this page in the faces-config editor.
-     */
-	public static final String PAGE_ID = "org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage";
-
-	private final static Image BANNER_IMAGE = EditorPlugin.getDefault()
-			.getImage("form_banner.gif");
-
-	private List leftSections;
-
-	private List rightSections;
-
-	private Object input;
-
-	private List selectionChangedListeners = new ArrayList();
-
-	private IPropertySheetPage propertySheetPage;
-
-	private IContentOutlinePage contentOutlinePage;
-
-	private ISelection currentSelection;
-
-	/**
-	 * Constructor of OthersPage;
-	 * 
-	 * @param editor
-	 *            the facesconfig editor;
-	 */
-	public OthersPage(FacesConfigEditor editor) {
-		super(editor, "OthersPage",
-				EditorMessages.FacesConfigEditor_Others_TabName);
-	}
-
-	protected void createFormContent(IManagedForm managedForm) {
-		super.createFormContent(managedForm);
-		ScrolledForm form = managedForm.getForm();
-		form.setText(EditorMessages.OthersPage_Title);
-		form.setBackgroundImage(BANNER_IMAGE);
-		fillBody(managedForm, managedForm.getToolkit());
-		managedForm.refresh();
-	}
-
-	private void initSection(OthersPageBaseSection section, String name,
-			String description, ArrayList list) {
-		section.getSection().setText(name);
-		section.getSection().setDescription(description);
-		section.initialize();
-		section.addSelectionChangedListener(this);
-		section.getSection().setExpanded(false);
-		section.getSection().setLayoutData(
-				new GridData(GridData.FILL_HORIZONTAL));
-		list.add(section);
-	}
-
-	private void fillBody(IManagedForm managedForm, FormToolkit toolkit) {
-		Composite body = managedForm.getForm().getBody();
-
-		body.setLayout(new GridLayout());
-
-		SashForm sashForm = new SashForm(body, SWT.NONE);
-		managedForm.getToolkit().adapt(sashForm, false, false);
-		sashForm.setMenu(body.getMenu());
-		sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		Composite leftContainer = toolkit.createComposite(sashForm);
-		leftContainer.setLayout(new GridLayout());
-
-		ArrayList sectionList = new ArrayList();
-
-		OthersPageBaseSection section = new ApplicationSection(
-				FacesConfigPackage.eINSTANCE.getActionListenerType(),
-				leftContainer, managedForm, this, toolkit);
-		initSection(section, EditorMessages.ActionListenerSection_Name,
-				EditorMessages.ActionListenerSection_Description,
-				sectionList);
-		section.getSection().setLayoutData(new GridData(GridData.FILL_BOTH));
-		section.getSection().setExpanded(true);
-
-		section = new ApplicationSection(FacesConfigPackage.eINSTANCE
-				.getDefaultRenderKitIdType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section,
-				EditorMessages.DefaultRenderKitIDSection_Name,
-				EditorMessages.DefaultRenderKitIDSection_Description,
-				sectionList);
-
-		section = new LocaleConfigSection(FacesConfigPackage.eINSTANCE
-				.getSupportedLocaleType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section, EditorMessages.LocaleConfigSection_Name,
-				EditorMessages.LocaleConfigSection_Description,
-				sectionList);
-
-		section = new ApplicationSection(FacesConfigPackage.eINSTANCE
-				.getMessageBundleType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section, EditorMessages.MessageBundleSection_Name,
-				EditorMessages.MessageBundleSection_Description,
-				sectionList);
-
-		section = new ApplicationSection(FacesConfigPackage.eINSTANCE
-				.getNavigationHandlerType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section,
-				EditorMessages.NavigationHandlerSection_Name,
-				EditorMessages.NavigationHandlerSection_Description,
-				sectionList);
-
-		section = new ApplicationSection(FacesConfigPackage.eINSTANCE
-				.getPropertyResolverType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section,
-				EditorMessages.PropertyResolverSection_Name,
-				EditorMessages.PropertyResolverSection_Description,
-				sectionList);
-
-		section = new ApplicationSection(FacesConfigPackage.eINSTANCE
-				.getStateManagerType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section, EditorMessages.StateManagerSection_Name,
-				EditorMessages.StateManagerSection_Description,
-				sectionList);
-
-		section = new ApplicationSection(FacesConfigPackage.eINSTANCE
-				.getVariableResolverType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section,
-				EditorMessages.VariableResolverSection_Name,
-				EditorMessages.VariableResolverSection_Description,
-				sectionList);
-
-		section = new ApplicationSection(FacesConfigPackage.eINSTANCE
-				.getViewHandlerType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section, EditorMessages.ViewHandlerSection_Name,
-				EditorMessages.ViewHandlerSection_Description,
-				sectionList);
-
-		leftSections = sectionList;
-
-		sectionList = new ArrayList();
-
-		Composite rightContainer = toolkit.createComposite(sashForm);
-		rightContainer.setLayout(new GridLayout());
-		rightContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		section = new FactorySection(FacesConfigPackage.eINSTANCE
-				.getApplicationFactoryType(), rightContainer, managedForm,
-				this, toolkit);
-		initSection(section,
-				EditorMessages.ApplicationFactorySection_Name,
-				EditorMessages.ApplicationFactorySection_Description,
-				sectionList);
-		section.getSection().setLayoutData(new GridData(GridData.FILL_BOTH));
-		section.getSection().setExpanded(true);
-
-		section = new FactorySection(FacesConfigPackage.eINSTANCE
-				.getFacesContextFactoryType(), rightContainer, managedForm,
-				this, toolkit);
-		initSection(section,
-				EditorMessages.FacesContextFactorySection_Name,
-				EditorMessages.FacesContextFactorySection_Description,
-				sectionList);
-
-		section = new FactorySection(FacesConfigPackage.eINSTANCE
-				.getLifecycleFactoryType(), rightContainer, managedForm, this,
-				toolkit);
-		initSection(section,
-				EditorMessages.LifecycleFactorySection_Name,
-				EditorMessages.LifecycleFactorySection_Description,
-				sectionList);
-
-		section = new FactorySection(FacesConfigPackage.eINSTANCE
-				.getRenderKitFactoryType(), rightContainer, managedForm, this,
-				toolkit);
-		initSection(section,
-				EditorMessages.RenderKitFactorySection_Name,
-				EditorMessages.RenderKitFactorySection_Description,
-				sectionList);
-
-		section = new LifecycleSection(FacesConfigPackage.eINSTANCE
-				.getPhaseListenerType(), rightContainer, managedForm, this,
-				toolkit);
-		initSection(section, EditorMessages.PhaseListenerSection_Name,
-				EditorMessages.PhaseListenerSection_Description,
-				sectionList);
-
-		rightSections = sectionList;
-
-		getSite().setSelectionProvider(this);
-	}
-
-	/**
-	 * set input for this page when the it got activated at the first time; if
-	 * it's not the first time, then refresh the page.
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormPage#setActive(boolean)
-	 */
-	public void setActive(boolean active) {
-		super.setActive(active);
-		if (active) {
-			if (getInput() != ((FacesConfigEditor) getEditor())
-					.getFacesConfig()) {
-				setInput(((FacesConfigEditor) getEditor()).getFacesConfig());
-			} else {
-				this.refresh();
-			}
-		}
-	}
-
-	/**
-	 * 
-	 */
-	public void setInput(Object input) {
-		if (input instanceof FacesConfigType) {
-			this.input = input;
-			FacesConfigType facesConfig = (FacesConfigType) input;
-			facesConfig.eAdapters().add(new FacesConfigOthersAdapter());
-			setInputForApplicationSections(facesConfig);
-			setInputForFactorySections(facesConfig);
-			setInputForLifecycleSections(facesConfig);
-		}
-	}
-
-	public boolean isEditor() {
-		return true;
-	}
-
-	/**
-	 * Reset the editor input for the application section
-	 */
-	public void resetApplicationInput() {
-		if (getInput() instanceof FacesConfigType) {
-			setInputForApplicationSections((FacesConfigType) getInput());
-		}
-	}
-
-	/**
-	 * Reset the editor input for the factory sections
-	 */
-	public void resetFactoryInput() {
-		if (getInput() instanceof FacesConfigType) {
-			setInputForFactorySections((FacesConfigType) getInput());
-		}
-	}
-
-	/**
-	 * Reset the editor input for the lifecycle section
-	 */
-	public void resetLifecycleInput() {
-		if (getInput() instanceof FacesConfigType) {
-			setInputForLifecycleSections((FacesConfigType) getInput());
-		}
-	}
-
-	/**
-	 * Sets the model for all Application sub-model elements to facesConfig
-	 * @param facesConfig
-	 */
-	protected void setInputForApplicationSections(FacesConfigType facesConfig) {
-		ApplicationType application;
-		if (facesConfig.getApplication().size() > 0) {
-			application = (ApplicationType) facesConfig.getApplication().get(0);
-		} else {
-			application = null;
-		}
-		for (Iterator it = leftSections.iterator(); it.hasNext();) {
-			ApplicationSection section = (ApplicationSection) it.next();
-			section.setInput(application);
-		}
-	}
-
-	/**
-	 * Sets the model for all Factory  sub-model elements to facesConfig
-	 * @param facesConfig
-	 */
-	protected void setInputForFactorySections(FacesConfigType facesConfig) {
-		FactoryType factory;
-		if (facesConfig.getFactory().size() > 0) {
-			factory = (FactoryType) facesConfig.getFactory().get(0);
-		} else {
-			factory = null;
-		}
-
-		for (Iterator it = rightSections.iterator(); it.hasNext();) {
-			Object section = it.next();
-			if (section instanceof FactorySection)
-				((FactorySection) section).setInput(factory);
-		}
-	}
-
-	/**
-	 * Sets the model for all Lifecycle sub-model elements to facesConfig
-	 * @param facesConfig
-	 */
-	protected void setInputForLifecycleSections(FacesConfigType facesConfig) {
-		LifecycleType lifecycle;
-		if (facesConfig.getLifecycle().size() > 0) {
-			lifecycle = (LifecycleType) facesConfig.getLifecycle().get(0);
-
-		} else {
-			lifecycle = null;
-		}
-		for (Iterator it = rightSections.iterator(); it.hasNext();) {
-			Object section = it.next();
-			if (section instanceof LifecycleSection)
-				((LifecycleSection) section).setInput(lifecycle);
-		}
-	}
-
-	public Object getInput() {
-		return input;
-	}
-
-	public void refresh() {
-
-		// only refresh the expanded section;
-		for (int i = 0, n = leftSections.size(); i < n; i++) {
-			OthersPageBaseSection section = (OthersPageBaseSection) leftSections
-					.get(i);
-			if (section.getSection().isExpanded()) {
-				section.refresh();
-			}
-		}
-
-		for (int i = 0, n = rightSections.size(); i < n; i++) {
-			OthersPageBaseSection section = (OthersPageBaseSection) leftSections
-					.get(i);
-			if (section.getSection().isExpanded()) {
-				section.refresh();
-			}
-		}
-
-	}
-
-	/**
-	 * set other sections' expand state to false, except this section;
-	 * 
-	 * @param section
-	 *            the section that be expanded.
-	 */
-	public void closeOtherSections(AbstractFacesConfigSection section) {
-		OthersPageBaseSection[] sections;
-		if (leftSections.contains(section)) {
-			sections = (OthersPageBaseSection[]) leftSections
-					.toArray(new OthersPageBaseSection[leftSections.size()]);
-		} else {
-			sections = (OthersPageBaseSection[]) rightSections
-					.toArray(new OthersPageBaseSection[rightSections.size()]);
-		}
-		for (int i = 0, n = sections.length; i < n; i++) {
-			AbstractFacesConfigSection aSection = sections[i];
-			if (aSection != section && aSection.getSection().isExpanded()) {
-				aSection.getSection().setExpanded(false);
-				GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-				aSection.getSection().setLayoutData(gd);
-			}
-		}
-	}
-
-	/**
-	 * An adapter on faces config.
-	 * 
-	 * @author sfshi
-	 * 
-	 */
-	class FacesConfigOthersAdapter extends AdapterImpl {
-		public void notifyChanged(Notification msg) {
-			if (msg.getEventType() == Notification.REMOVE
-					|| msg.getEventType() == Notification.ADD) {
-				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_Application()) {
-					resetApplicationInput();
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_Factory()) {
-					resetFactoryInput();
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_Lifecycle()) {
-					resetLifecycleInput();
-				}
-			}
-		}
-	}
-
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		// TODO Auto-generated method stub
-
-		selectionChangedListeners.add(listener);
-	}
-
-	public ISelection getSelection() {
-		if (currentSelection != null)
-			return currentSelection;
-
-		return StructuredSelection.EMPTY;
-	}
-
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		// TODO Auto-generated method stub
-
-		selectionChangedListeners.remove(listener);
-	}
-
-	public void selectionChanged(SelectionChangedEvent event) {
-		currentSelection = event.getSelection();
-		if (event.getSource() instanceof OthersPageBaseSection) {
-			OthersPageBaseSection source = (OthersPageBaseSection) event
-					.getSource();
-
-			if (source.getSection().isExpanded()) {
-				for (int i = 0, n = selectionChangedListeners.size(); i < n; i++) {
-					((ISelectionChangedListener) selectionChangedListeners
-							.get(i)).selectionChanged(event);
-				}
-			}
-		}
-	}
-
-	/**
-	 * get the section that is expanded.
-	 * 
-	 * @return the page section
-	 */
-	protected OthersPageBaseSection getActiveSection() {
-		for (int i = 0, n = leftSections.size(); i < n; i++) {
-
-			OthersPageBaseSection section = (OthersPageBaseSection) leftSections
-					.get(i);
-			if (section.getSection().isExpanded()) {
-				return section;
-			}
-		}
-
-		for (int i = 0, n = rightSections.size(); i < n; i++) {
-
-			OthersPageBaseSection section = (OthersPageBaseSection) leftSections
-					.get(i);
-			if (section.getSection().isExpanded()) {
-				return section;
-			}
-		}
-		return null;
-
-	}
-
-	public Object getAdapter(Class adapter) {
-
-		if (adapter == IPropertySheetPage.class) {
-			return getPropertySheetPage();
-		}
-
-		if (adapter == IContentOutlinePage.class) {
-			return getOutlinePage();
-		}
-
-		return super.getAdapter(adapter);
-	}
-
-	private IPropertySheetPage getPropertySheetPage() {
-
-		AdapterFactoryEditingDomain editingDomain = (AdapterFactoryEditingDomain) getEditor()
-				.getAdapter(EditingDomain.class);
-		AdapterFactory adapterFactory = (AdapterFactory) getEditor()
-				.getAdapter(AdapterFactory.class);
-		if (propertySheetPage == null) {
-			propertySheetPage = new ExtendedPropertySheetPage(editingDomain) {
-				public void setSelectionToViewer(List selection) {
-					// FacesConfigEditor.this.setSelectionToViewer(selection);
-					// FacesConfigEditor.this.setFocus();
-				}
-
-				public void setActionBars(IActionBars actionBars) {
-					super.setActionBars(actionBars);
-					// getActionBarContributor().shareGlobalActions(this,
-					// actionBars);
-				}
-			};
-			((ExtendedPropertySheetPage) propertySheetPage)
-					.setPropertySourceProvider(new AdapterFactoryContentProvider(
-							adapterFactory));
-			// this.addSelectionChangedListener((ExtendedPropertySheetPage)
-			// propertySheetPage);
-		}
-
-		return propertySheetPage;
-
-	}
-
-	private IContentOutlinePage getOutlinePage() {
-
-		if (contentOutlinePage == null) {
-			// The content outline is just a tree.
-			//
-			class OthersContentOutlinePage extends ContentOutlinePage {
-				public void createControl(Composite parent) {
-					super.createControl(parent);
-					TreeViewer contentOutlineViewer = getTreeViewer();
-					contentOutlineViewer.addSelectionChangedListener(this);
-
-					AdapterFactory adapterFactory = (AdapterFactory) getEditor()
-							.getAdapter(AdapterFactory.class);
-					// Set up the tree viewer.
-					contentOutlineViewer
-							.setContentProvider(new AdapterFactoryContentProvider(
-									adapterFactory));
-					contentOutlineViewer
-							.setLabelProvider(new AdapterFactoryLabelProvider(
-									adapterFactory));
-					contentOutlineViewer.addFilter(new ViewerFilter() {
-
-						public boolean select(Viewer viewer,
-								Object parentElement, Object element) {
-							return FacesConfigPackage.eINSTANCE
-									.getApplicationType().isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getFactoryType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getLifecycleType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getActionListenerType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getDefaultRenderKitIdType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getLocaleConfigType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getDefaultLocaleType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getSupportedLocaleType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getMessageBundleType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getNavigationHandlerType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getPropertyResolverType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getStateManagerType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getVariableResolverType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getViewHandlerType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getApplicationFactoryType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getFacesContextFactoryType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getLifecycleFactoryType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getRenderKitFactoryType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getPhaseListenerType().isInstance(
-													element)
-
-							;
-						}
-					});
-
-					contentOutlineViewer.setSorter(new ViewerSorter());
-					contentOutlineViewer.setInput(getInput());
-				}
-
-			}
-
-			contentOutlinePage = new OthersContentOutlinePage();
-
-			// Listen to selection so that we can handle it is a special
-			// way.
-			//
-			contentOutlinePage
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-						// This ensures that we handle selections correctly.
-						public void selectionChanged(SelectionChangedEvent event) {
-							setSelection(event.getSelection());
-						}
-					});
-
-		}
-
-		return contentOutlinePage;
-
-	}
-
-	/**
-	 * handle the selection changed event from outline page.
-	 * 
-	 * @param selection
-	 */
-	public void setSelection(ISelection selection) {
-
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection ss = (IStructuredSelection) selection;
-			if (ss.isEmpty())
-				return;
-
-			EObject object = (EObject) ss.getFirstElement();
-			OthersPageBaseSection section = null;
-
-			if (FacesConfigPackage.eINSTANCE.getActionListenerType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(0);
-			} else if (FacesConfigPackage.eINSTANCE.getDefaultRenderKitIdType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(1);
-			} else if (FacesConfigPackage.eINSTANCE.getLocaleConfigType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(2);
-			} else if (FacesConfigPackage.eINSTANCE.getDefaultLocaleType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(2);
-			} else if (FacesConfigPackage.eINSTANCE.getSupportedLocaleType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(2);
-			} else if (FacesConfigPackage.eINSTANCE.getMessageBundleType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(3);
-			} else if (FacesConfigPackage.eINSTANCE.getNavigationHandlerType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(4);
-			} else if (FacesConfigPackage.eINSTANCE.getPropertyResolverType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(5);
-			} else if (FacesConfigPackage.eINSTANCE.getStateManagerType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(6);
-			} else if (FacesConfigPackage.eINSTANCE.getVariableResolverType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(7);
-			} else if (FacesConfigPackage.eINSTANCE.getViewHandlerType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(8);
-			} else if (FacesConfigPackage.eINSTANCE.getApplicationFactoryType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) rightSections.get(0);
-			} else if (FacesConfigPackage.eINSTANCE
-					.getFacesContextFactoryType().isInstance(object)) {
-				section = (OthersPageBaseSection) rightSections.get(1);
-			} else if (FacesConfigPackage.eINSTANCE.getLifecycleFactoryType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) rightSections.get(2);
-			} else if (FacesConfigPackage.eINSTANCE.getRenderKitFactoryType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) rightSections.get(3);
-			} else if (FacesConfigPackage.eINSTANCE.getPhaseListenerType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) rightSections.get(4);
-			}
-			if (section != null) {
-				if (!section.getSection().isExpanded()) {
-					this.closeOtherSections(section);
-					GridData gd = new GridData(GridData.FILL_BOTH);
-					section.getSection().setLayoutData(gd);
-					section.getSection().setExpanded(true);
-				}
-				IStructuredSelection newselection = new StructuredSelection(
-						object);
-				section.getTableViewer().setSelection(newselection);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.domain.IEditingDomainProvider#getEditingDomain()
-	 */
-	public EditingDomain getEditingDomain() {
-		return ((FacesConfigEditor) getEditor()).getEditingDomain();
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/OverviewPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/OverviewPage.java
deleted file mode 100644
index adab231..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/OverviewPage.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.section.OverviewComponentsSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.OverviewGeneralSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.OverviewManagedBeanSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.OverviewNavigationSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.OverviewOthersSection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-/**
- * @author jchoi, Xiao-guang Zhang
- * @version
- */
-public class OverviewPage extends FormPage implements ISelectionProvider,
-		IFacesConfigPage {
-
-	private static final int LAYOUT_MARGIN_HEIGHT = 2;
-
-	private static final int LAYOUT_MARGIN_WIDTH = 2;
-
-	private Object input;
-
-	private OverviewGeneralSection generalSection;
-
-	private OverviewManagedBeanSection beanSection;
-
-	private OverviewComponentsSection componentsSection;
-
-	//
-	private OverviewNavigationSection navigationSection;
-
-	//
-	private OverviewOthersSection otherSection;
-
-	/**
-	 * 
-	 * @param editor
-	 */
-	public OverviewPage(FormEditor editor) {
-		super(editor, "OverviewPage", EditorMessages.OverviewPage_page_name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui.forms.IManagedForm)
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-
-		ScrolledForm form = managedForm.getForm();
-		form.setText(EditorMessages.OverviewPage_PageflowOverview_summary);
-		form.setBackgroundImage(EditorPlugin.getDefault().getImage(
-				"form_banner.gif")); //$NON-NLS-1$
-		Composite body = form.getBody();
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.marginWidth = LAYOUT_MARGIN_WIDTH;
-		gridLayout.marginHeight = LAYOUT_MARGIN_HEIGHT;
-		body.setLayout(gridLayout);
-		gridLayout = new GridLayout(2, true);
-		form.getBody().setLayout(gridLayout);
-		FormEditor editor = getEditor();
-		FormToolkit toolkit = editor.getToolkit();
-
-		// add overview general information
-		generalSection = new OverviewGeneralSection(managedForm.getForm()
-				.getBody(), managedForm, this, toolkit);
-		generalSection.initialize();
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		generalSection.getSection().setLayoutData(gd);
-
-		// Navigation section
-		navigationSection = new OverviewNavigationSection(managedForm.getForm()
-				.getBody(), managedForm, this, toolkit);
-		navigationSection.initialize();
-		gd = new GridData(GridData.FILL_BOTH);
-		navigationSection.getSection().setLayoutData(gd);
-		navigationSection.getSection().setExpanded(true);
-
-		// ManagedBeans section
-		beanSection = new OverviewManagedBeanSection(managedForm.getForm()
-				.getBody(), managedForm, this, toolkit);
-		beanSection.initialize();
-		gd = new GridData(GridData.FILL_BOTH);
-		beanSection.getSection().setLayoutData(gd);
-		beanSection.getSection().setExpanded(true);
-
-		/* components section */
-		componentsSection = new OverviewComponentsSection(managedForm.getForm()
-				.getBody(), managedForm, this, toolkit);
-		componentsSection.initialize();
-		gd = new GridData(GridData.FILL_BOTH);
-		componentsSection.getSection().setLayoutData(gd);
-		componentsSection.getSection().setExpanded(true);
-
-		/* other sections */
-		otherSection = new OverviewOthersSection(managedForm.getForm()
-				.getBody(), managedForm, this, toolkit);
-		otherSection.initialize();
-		gd = new GridData(GridData.FILL_BOTH);
-		otherSection.getSection().setLayoutData(gd);
-		otherSection.getSection().setExpanded(true);
-
-		this.getSite().setSelectionProvider(this);
-
-	}
-
-	/**
-	 * set input for this page when the it got activated at the first time; if
-	 * it's not the first time, then refresh the page.
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormPage#setActive(boolean)
-	 */
-	public void setActive(boolean active) {
-		super.setActive(active);
-		if (active) {
-			if (getInput() != ((FacesConfigEditor) getEditor())
-					.getFacesConfig()) {
-				setInput(((FacesConfigEditor) getEditor()).getFacesConfig());
-			} else {
-				this.refresh();
-			}
-		}
-	}
-
-	/**
-	 * 
-	 */
-	public void setInput(Object input) {
-		if (input instanceof FacesConfigType) {
-			this.input = input;
-			navigationSection.setInput(input);
-			beanSection.setInput(input);
-			componentsSection.setInput(input);
-			otherSection.setInput(input);
-		}
-	}
-
-	/**
-	 * Call refreshAll on all sections on this page
-	 */
-	public void refreshAll() {
-		generalSection.refreshAll();
-		navigationSection.refreshAll();
-		beanSection.refreshAll();
-		componentsSection.refreshAll();
-		otherSection.refreshAll();
-	}
-
-	public Object getInput() {
-		return input;
-	}
-
-	public void refresh() {
-		generalSection.refresh();
-		navigationSection.refresh();
-		beanSection.refresh();
-		componentsSection.refresh();
-		otherSection.refresh();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.editor.IFormPage#isEditor()
-	 */
-	public boolean isEditor() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-        // do not support change in selection
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return StructuredSelection.EMPTY;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-        // do not support change in selection
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-	    // do not support change in selection
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/WaitForLoadPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/WaitForLoadPage.java
deleted file mode 100644
index 1b20160..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/WaitForLoadPage.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-/**
- * A page the exists only be used before the editor's model is fully loaded
- * as a status placeholder while the user waits.
- * 
- * @author cbateman
- *
- */
-public class WaitForLoadPage extends FormPage 
-{
-
-    /**
-     * @param editor the parent
-     * @param id  the id of the editor within its parent
-     * @param title the title displayed to the user on the editor's tab
-     */
-    public WaitForLoadPage(FormEditor editor, String id, String title) {
-        super(editor, id, title);
-    }
-
-    @Override
-    protected void createFormContent(IManagedForm managedForm) {
-        // get the form
-        ScrolledForm form = managedForm.getForm();
-        //FormToolkit toolkit = getEditor().getToolkit();
-        form.setText(EditorMessages.FacesConfigEditor_WaitForLoadPage_Title);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ComponentDetailsPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ComponentDetailsPage.java
deleted file mode 100644
index 9a882d5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ComponentDetailsPage.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page.detail;
-
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.AttributeSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ComponentGeneralSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.FacetSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.PropertySection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class ComponentDetailsPage extends FacesConfigDetailsPage {
-
-	/**
-	 * 
-	 * @param page
-	 */
-	public ComponentDetailsPage(FacesConfigMasterDetailPage page) {
-		super(page);
-	}
-
-	/**
-	 * create the detail sections and set layout for them.
-	 */
-	protected IFacesConfigSection[] createDetailSections(Composite composite,
-			IManagedForm managedForm, FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		ComponentGeneralSection generalSection = new ComponentGeneralSection(
-				composite, managedForm, getPage(), toolkit);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		generalSection.getSection().setLayoutData(gd);
-
-		AttributeSection attributeSection = new AttributeSection(composite,
-				managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		attributeSection.getSection().setLayoutData(gd);
-
-		FacetSection facetSection = new FacetSection(composite, managedForm,
-				getPage(), toolkit);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		facetSection.getSection().setLayoutData(gd);
-
-		PropertySection propertySection = new PropertySection(composite,
-				managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_BOTH);
-		propertySection.getSection().setLayoutData(gd);
-		return new IFacesConfigSection[] { generalSection, attributeSection, facetSection,
-				propertySection };
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ConverterDetailsPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ConverterDetailsPage.java
deleted file mode 100644
index 0e720f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ConverterDetailsPage.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page.detail;
-
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.AttributeSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ConverterGeneralSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.PropertySection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- *
- */
-public class ConverterDetailsPage extends FacesConfigDetailsPage {
-
-	/**
-	 * 
-	 * @param page
-	 */
-	public ConverterDetailsPage(FacesConfigMasterDetailPage page) {
-		super(page);
-	}
-
-	/**
-	 * create the detail sections and set layout for them.
-	 */
-	protected IFacesConfigSection[] createDetailSections(Composite composite,
-			IManagedForm managedForm, FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		ConverterGeneralSection generalSection = new ConverterGeneralSection(
-				composite, managedForm, getPage(), toolkit);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		generalSection.getSection().setLayoutData(gd);
-
-		AttributeSection attributeSection = new AttributeSection(composite,
-				managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		attributeSection.getSection().setLayoutData(gd);
-
-
-		PropertySection propertySection = new PropertySection(composite,
-				managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_BOTH);
-		propertySection.getSection().setLayoutData(gd);
-		return new IFacesConfigSection[] { generalSection, attributeSection,
-				propertySection };
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/FacesConfigDetailsPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/FacesConfigDetailsPage.java
deleted file mode 100644
index eec368a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/FacesConfigDetailsPage.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page.detail;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.AbstractFormPart;
-import org.eclipse.ui.forms.IDetailsPage;
-import org.eclipse.ui.forms.IFormPart;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * The detail part of a page. It contains several IFacesConfigSection instances.
- * 
- * @author sfshi
- * 
- */
-public abstract class FacesConfigDetailsPage extends AbstractFormPart implements
-		IDetailsPage, ISelectionProvider, ISelectionChangedListener {
-
-	private FacesConfigMasterDetailPage page;
-
-	private IFacesConfigSection[] detailSections;
-
-	private List selectionChangedListeners = new ArrayList();
-
-	/**
-	 * @param page
-	 */
-	public FacesConfigDetailsPage(FacesConfigMasterDetailPage page) {
-		super();
-		this.page = page;
-	}
-
-	public void createContents(Composite parent) {
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		parent.setLayout(layout);
-
-		parent.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		FormToolkit toolkit = getManagedForm().getToolkit();
-		Composite detailsContainer = toolkit.createComposite(parent);
-		toolkit.paintBordersFor(detailsContainer);
-		detailsContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		GridLayout gl = new GridLayout();
-		gl.verticalSpacing = 0;
-		gl.marginHeight = 0;
-		detailsContainer.setLayout(gl);
-
-		detailSections = createDetailSections(detailsContainer,
-				getManagedForm(), toolkit, page);
-		if (detailSections != null) {
-			for (int i = 0, n = detailSections.length; i < n; i++) {
-				detailSections[i].initialize();
-				if (detailSections[i] instanceof ISelectionProvider) {
-					((ISelectionProvider) detailSections[i])
-							.addSelectionChangedListener(this);
-				}
-			}
-		}
-	}
-
-	/**
-	 * create the sub detail sections and set layout data for them.
-	 * 
-	 * @param composite
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page_ 
-	 * @return the detail sections
-	 */
-	abstract protected IFacesConfigSection[] createDetailSections(
-			Composite composite, IManagedForm managedForm, FormToolkit toolkit,
-			FacesConfigMasterDetailPage page_);
-
-	/**
-	 * 
-	 */
-	public void selectionChanged(IFormPart part, ISelection selection) {
-		Object selectedItem = ((StructuredSelection) selection)
-				.getFirstElement();
-		if (detailSections != null) {
-			for (int i = 0, n = detailSections.length; i < n; i++) {
-				IFacesConfigSection aSection = detailSections[i];
-				aSection.setInput(selectedItem);
-			}
-		}
-
-	}
-
-	/**
-	 * @return the master/detail page for this page
-	 */
-	public FacesConfigMasterDetailPage getPage() {
-		return page;
-	}
-
-	public void refresh() {
-		super.refresh();
-		if (detailSections != null) {
-			for (int i = 0, n = detailSections.length; i < n; i++) {
-				detailSections[i].refresh();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		for (Iterator listeners = selectionChangedListeners.iterator(); listeners
-				.hasNext();) {
-			ISelectionChangedListener listener = (ISelectionChangedListener) listeners
-					.next();
-			listener.selectionChanged(new SelectionChangedEvent(this, event
-					.getSelection()));
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return StructuredSelection.EMPTY;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-	    // no selection allowed
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ManagedBeanDetailsPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ManagedBeanDetailsPage.java
deleted file mode 100644
index 9ee1641..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ManagedBeanDetailsPage.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page.detail;
-
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.InitializationSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ManagedBeanGeneralSection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class ManagedBeanDetailsPage extends FacesConfigDetailsPage {
-
-	/**
-	 * 
-	 * @param page
-	 */
-	public ManagedBeanDetailsPage(FacesConfigMasterDetailPage page) {
-		super(page);
-	}
-
-	/**
-	 * create the detail sections and set layout for them.
-	 */
-	protected IFacesConfigSection[] createDetailSections(Composite composite,
-			IManagedForm managedForm, FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		ManagedBeanGeneralSection generalSection = new ManagedBeanGeneralSection(
-				composite, managedForm, getPage(), toolkit);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		generalSection.getSection().setLayoutData(gd);
-
-		InitializationSection initializationSection  = new InitializationSection(
-				composite, managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_BOTH | GridData.VERTICAL_ALIGN_FILL);
-		initializationSection.getSection().setLayoutData(gd);
-	
-		return new IFacesConfigSection[] { generalSection, initializationSection};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/RenderkitDetailsPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/RenderkitDetailsPage.java
deleted file mode 100644
index efb8dd7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/RenderkitDetailsPage.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page.detail;
-
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.RendererSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.RenderkitGeneralSection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class RenderkitDetailsPage extends FacesConfigDetailsPage {
-
-	/**
-	 * 
-	 * @param page
-	 */
-	public RenderkitDetailsPage(FacesConfigMasterDetailPage page) {
-		super(page);
-	}
-
-	/**
-	 * create the detail sections and set layout for them.
-	 */
-	protected IFacesConfigSection[] createDetailSections(Composite composite,
-			IManagedForm managedForm, FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		RenderkitGeneralSection generalSection = new RenderkitGeneralSection(
-				composite, managedForm, getPage(), toolkit);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		generalSection.getSection().setLayoutData(gd);
-		
-		RendererSection rendererSection = new RendererSection(composite,
-				managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_BOTH | GridData.VERTICAL_ALIGN_FILL);
-		rendererSection.getSection().setLayoutData(gd);
-
-		return new IFacesConfigSection[] { generalSection,rendererSection };
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ValidatorDetailsPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ValidatorDetailsPage.java
deleted file mode 100644
index a238578..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ValidatorDetailsPage.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page.detail;
-
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.AttributeSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.PropertySection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ValidatorGeneralSection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class ValidatorDetailsPage extends FacesConfigDetailsPage {
-
-	/**
-	 * 
-	 * @param page
-	 */
-	public ValidatorDetailsPage(FacesConfigMasterDetailPage page) {
-		super(page);
-	}
-
-	/**
-	 * create the detail sections and set layout for them.
-	 */
-	protected IFacesConfigSection[] createDetailSections(Composite composite,
-			IManagedForm managedForm, FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		ValidatorGeneralSection generalSection = new ValidatorGeneralSection(
-				composite, managedForm, getPage(), toolkit);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		generalSection.getSection().setLayoutData(gd);
-
-		AttributeSection attributeSection = new AttributeSection(composite,
-				managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		attributeSection.getSection().setLayoutData(gd);
-
-		PropertySection propertySection = new PropertySection(composite,
-				managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_BOTH);
-		propertySection.getSection().setLayoutData(gd);
-		return new IFacesConfigSection[] { generalSection, attributeSection,
-				propertySection };
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/DelegatingZoomManager.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/DelegatingZoomManager.java
deleted file mode 100644
index 1bef22f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/DelegatingZoomManager.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-// import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.draw2d.ScalableFigure;
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.editparts.ZoomListener;
-import org.eclipse.gef.editparts.ZoomManager;
-
-/**
- * A delegating ZoomManager.
- * 
- */
-public class DelegatingZoomManager extends ZoomManager implements ZoomListener {
-	/** Default string or double value of zoom level */
-	private static final String DEFAULT_ZOOM_LEVEL_STRING = "100%";
-
-	private static final double DEFAULT_ZOOM_LEVEL = 1;
-
-	/** the current ZoomManager all work is delegated to */
-	private ZoomManager currentZoomManager = null;
-
-	/** listeners of zoom */
-	private ListenerList zoomListeners = new ListenerList(
-			ListenerList.IDENTITY);
-
-	/**
-	 * Creates a new DelegatingZoomManager instance.
-	 */
-	public DelegatingZoomManager() {
-		super((ScalableFigure) null, (Viewport) null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomListener#zoomChanged(double)
-	 */
-	public void zoomChanged(double zoom) {
-		Object[] listeners = zoomListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			((ZoomListener) listeners[i]).zoomChanged(zoom);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#addZoomListener(ZoomListener)
-	 */
-	public void addZoomListener(ZoomListener listener) {
-		zoomListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#removeZoomListener(oZoomListener)
-	 */
-	public void removeZoomListener(ZoomListener listener) {
-		zoomListeners.remove(listener);
-	}
-
-	/**
-	 * Sets the ZoomManager all work should be delegated to.
-	 * 
-	 * @param zoomManager
-	 */
-	public void setCurrentZoomManager(ZoomManager zoomManager) {
-		if (null != currentZoomManager) {
-			currentZoomManager.removeZoomListener(this);
-		}
-
-		currentZoomManager = zoomManager;
-		if (null != currentZoomManager) {
-			currentZoomManager.addZoomListener(this);
-			zoomChanged(currentZoomManager.getZoom());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#canZoomIn()
-	 */
-	public boolean canZoomIn() {
-		if (null == currentZoomManager) {
-			return false;
-		}
-
-		return currentZoomManager.canZoomIn();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#canZoomOut()
-	 */
-	public boolean canZoomOut() {
-		if (null == currentZoomManager) {
-			return false;
-		}
-
-		return currentZoomManager.canZoomOut();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getMaxZoom()
-	 */
-	public double getMaxZoom() {
-		if (null == currentZoomManager) {
-			return DEFAULT_ZOOM_LEVEL;
-		}
-
-		return currentZoomManager.getMaxZoom();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getMinZoom()
-	 */
-	public double getMinZoom() {
-		if (null == currentZoomManager) {
-			return DEFAULT_ZOOM_LEVEL;
-		}
-
-		return currentZoomManager.getMinZoom();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getNextZoomLevel()
-	 */
-	public double getNextZoomLevel() {
-		if (null == currentZoomManager) {
-			return DEFAULT_ZOOM_LEVEL;
-		}
-
-		return currentZoomManager.getNextZoomLevel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getPreviousZoomLevel()
-	 */
-	public double getPreviousZoomLevel() {
-		if (null == currentZoomManager) {
-			return DEFAULT_ZOOM_LEVEL;
-		}
-
-		return currentZoomManager.getPreviousZoomLevel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getScalableFigure()
-	 */
-	public ScalableFigure getScalableFigure() {
-		if (null == currentZoomManager) {
-			return null;
-		}
-
-		return currentZoomManager.getScalableFigure();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getUIMultiplier()
-	 */
-	public double getUIMultiplier() {
-		if (null == currentZoomManager) {
-			return DEFAULT_ZOOM_LEVEL;
-		}
-
-		return currentZoomManager.getUIMultiplier();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getViewport()
-	 */
-	public Viewport getViewport() {
-		if (null == currentZoomManager) {
-			return null;
-		}
-
-		return currentZoomManager.getViewport();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getZoom()
-	 */
-	public double getZoom() {
-		if (null == currentZoomManager) {
-			return DEFAULT_ZOOM_LEVEL;
-		}
-
-		return currentZoomManager.getZoom();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getZoomAsText()
-	 */
-	public String getZoomAsText() {
-		if (null == currentZoomManager) {
-			return DEFAULT_ZOOM_LEVEL_STRING;
-		}
-
-		return currentZoomManager.getZoomAsText();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getZoomLevels()
-	 */
-	public double[] getZoomLevels() {
-		if (null == currentZoomManager) {
-			return new double[] { DEFAULT_ZOOM_LEVEL };
-		}
-
-		return currentZoomManager.getZoomLevels();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getZoomLevelsAsText()
-	 */
-	public String[] getZoomLevelsAsText() {
-		if (null == currentZoomManager) {
-			return new String[] { DEFAULT_ZOOM_LEVEL_STRING };
-		}
-
-		return currentZoomManager.getZoomLevelsAsText();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#setUIMultiplier(double)
-	 */
-	public void setUIMultiplier(double multiplier) {
-		if (null == currentZoomManager) {
-			return;
-		}
-
-		currentZoomManager.setUIMultiplier(multiplier);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#setViewLocation(Point)
-	 */
-	public void setViewLocation(Point p) {
-		if (null == currentZoomManager) {
-			return;
-		}
-
-		currentZoomManager.setViewLocation(p);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#setZoom(double)
-	 */
-	public void setZoom(double zoom) {
-		if (null == currentZoomManager) {
-			return;
-		}
-		currentZoomManager.setZoom(zoom);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#setZoomAnimationStyle(int)
-	 */
-	public void setZoomAnimationStyle(int style) {
-		if (null == currentZoomManager) {
-			return;
-		}
-		currentZoomManager.setZoomAnimationStyle(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#setZoomAsText(String)
-	 */
-	public void setZoomAsText(String zoomString) {
-		if (null == currentZoomManager) {
-			return;
-		}
-		currentZoomManager.setZoomAsText(zoomString);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#setZoomLevels(double[])
-	 */
-	public void setZoomLevels(double[] zoomLevels) {
-		if (null == currentZoomManager) {
-			return;
-		}
-		currentZoomManager.setZoomLevels(zoomLevels);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#zoomIn()
-	 */
-	public void zoomIn() {
-		if (null == currentZoomManager) {
-			return;
-		}
-		currentZoomManager.zoomIn();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#zoomOut()
-	 */
-	public void zoomOut() {
-		if (null == currentZoomManager) {
-			return;
-		}
-		currentZoomManager.zoomOut();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#zoomTo(Rectangle)
-	 */
-	public void zoomTo(Rectangle rect) {
-		if (null == currentZoomManager) {
-			return;
-		}
-		currentZoomManager.zoomTo(rect);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowActionBarContributor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowActionBarContributor.java
deleted file mode 100644
index 9f9a081..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowActionBarContributor.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;
-
-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;
-
-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
-	}
-
-	public void updateActionKeys() {
-		declareGlobalActionKeys();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see EditorActionBarContributor#contributeToToolBar(IToolBarManager)
-	 */
-	public void contributeToToolBar(IToolBarManager tbm) {
-		tbm.add(getAction(ActionFactory.UNDO.getId()));
-		tbm.add(getAction(ActionFactory.REDO.getId()));
-		tbm.add(new Separator());
-		tbm.add(getAction(GEFActionConstants.ALIGN_LEFT));
-		tbm.add(getAction(GEFActionConstants.ALIGN_CENTER));
-		tbm.add(getAction(GEFActionConstants.ALIGN_RIGHT));
-		tbm.add(new Separator());
-		tbm.add(getAction(GEFActionConstants.ALIGN_TOP));
-		tbm.add(getAction(GEFActionConstants.ALIGN_MIDDLE));
-		tbm.add(getAction(GEFActionConstants.ALIGN_BOTTOM));
-
-		tbm.add(new Separator());
-		String[] zoomStrings = new String[] { ZoomManager.FIT_ALL,
-				ZoomManager.FIT_HEIGHT, ZoomManager.FIT_WIDTH };
-		tbm.add(new ZoomComboContributionItem(getPage(), zoomStrings));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see EditorActionBarContributor#contributeToMenu(IMenuManager)
-	 */
-	public void contributeToMenu(IMenuManager menubar) {
-		super.contributeToMenu(menubar);
-		MenuManager viewMenu = new MenuManager("View");
-		viewMenu.add(getAction(GEFActionConstants.ZOOM_IN));
-		viewMenu.add(getAction(GEFActionConstants.ZOOM_OUT));
-		menubar.insertAfter(IWorkbenchActionConstants.M_EDIT, viewMenu);
-	}
-
-	public void setActiveEditor(IEditorPart editor) {
-		if (editor instanceof PageflowEditor) {
-			activeEditor = editor;
-			// updateActionKeys();
-			super.setActiveEditor(editor);
-		}
-	}
-
-	public void update() {
-		if (activeEditor != null) {
-			((PageflowEditor) activeEditor).updateActions();
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditor.java
deleted file mode 100644
index 1efb743..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditor.java
+++ /dev/null
@@ -1,1216 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.gef.ContextMenuProvider;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.KeyHandler;
-import org.eclipse.gef.KeyStroke;
-import org.eclipse.gef.RootEditPart;
-import org.eclipse.gef.commands.CommandStack;
-import org.eclipse.gef.commands.CommandStackEvent;
-import org.eclipse.gef.commands.CommandStackEventListener;
-import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
-import org.eclipse.gef.editparts.ScalableRootEditPart;
-import org.eclipse.gef.editparts.ZoomManager;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.gef.ui.actions.ActionRegistry;
-import org.eclipse.gef.ui.actions.DeleteAction;
-import org.eclipse.gef.ui.actions.GEFActionConstants;
-import org.eclipse.gef.ui.actions.RedoAction;
-import org.eclipse.gef.ui.actions.SelectionAction;
-import org.eclipse.gef.ui.actions.StackAction;
-import org.eclipse.gef.ui.actions.UndoAction;
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.gef.ui.actions.ZoomInAction;
-import org.eclipse.gef.ui.actions.ZoomOutAction;
-import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette;
-import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler;
-import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
-import org.eclipse.gef.ui.parts.SelectionSynchronizer;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferenceConverter;
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.util.TransferDropTargetListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.action.AlignmentAction;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.action.OpenEditorAction;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.action.ShowPropertyViewAction;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.PreExecuteCommandStack;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.ConfigurableRootEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.IConnectionPreference;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.IFigurePreference;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.ILayerPanePreference;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.INodePreference;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowEditPartsFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowNodeEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.FC2PFTransformer;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.EditPartMarkerUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowAnnotationUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowModelManager;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowResourceFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.ide.IGotoMarker;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.PropertySheetPage;
-
-/**
- * This the the main editor page for modifying a complete pageflow.
- */
-public class PageflowEditor extends GraphicalEditorWithFlyoutPalette implements
-		IAdaptable, IPropertyChangeListener, IGotoMarker {
-	/** log instance */
-	private static final Logger log = EditorPlugin
-			.getLogger(PageflowEditor.class);
-
-	/** pageflow context menu registration ID */
-	private static final String PAGEFLOW_CONTEXTMENU_REG_ID = ".pageflow.editor.contextmenu";
-
-	/** the edit domain */
-	private final DefaultEditDomain domain;
-
-	/** the palette root */
-	private PaletteRoot paletteRoot = null;
-
-	/** the parent multi-page editor */
-	private IEditorPart parentEditor = null;
-
-	/** the graphical viewer */
-	private GraphicalViewer viewer = null;
-
-	/** the undoable <code>IPropertySheetPage</code> */
-	private PropertySheetPage undoablePropertySheetPage = null;
-
-	/** the editor's action registry */
-	private ActionRegistry actionRegistry = null;
-
-	public static final String PAGE_ID = "org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowEditor";
-
-	/** the list of action ids that are to EditPart actions */
-	private List editPartActionIDs = new ArrayList();
-
-	/** the selection listener */
-	private ISelectionListener selectionListener = new ISelectionListener() {
-		public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-			updateActions();
-		}
-	};
-
-	/** the selection synchronizer for the edit part viewer */
-	private SelectionSynchronizer synchronizer = null;
-
-	/** the shared key handler */
-	private KeyHandler sharedKeyHandler = null;
-
-	/** pageflow model manager */
-	private PageflowModelManager pageflowManager;
-
-	/** the dirty status of this page */
-	private boolean isDirty = false;
-
-	/** the command stack of this page */
-	private CommandStack commandStack;
-
-	private FC2PFTransformer modelsTransform;
-
-	List stackActions = new ArrayList();
-
-	public FC2PFTransformer getModelsTransform() {
-		if (modelsTransform == null) {
-			modelsTransform = new FC2PFTransformer();
-		}
-		return modelsTransform;
-	}
-
-	public void updateActions() {
-		updateActions(stackActions);
-		updateActions(editPartActionIDs);
-	}
-
-	/**
-	 * This class listens for command stack changes of the page and decides if
-	 * the editor is dirty or not.
-	 * 
-	 */
-	private class PageCommandStackListener implements CommandStackEventListener {
-		public void stackChanged(CommandStackEvent event) {
-			if (((CommandStack) event.getSource()).isDirty()) {
-				// at least one command stack is dirty,
-				// so the multi page editor is dirty too
-				setDirty(true);
-			}
-			updateActions();
-		}
-	}
-
-	/**
-	 * This class listens to changes to the file system in the workspace, and
-	 * validate the current pageflow based on web files' status.
-	 */
-	private class ResourceTracker implements IResourceChangeListener,
-			IResourceDeltaVisitor {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
-		 */
-		public void resourceChanged(IResourceChangeEvent event) {
-			IResourceDelta delta = event.getDelta();
-			try {
-				if (delta != null) {
-					delta.accept(this);
-				}
-			} catch (CoreException exception) {
-				// Pageflow.PageflowEditor.Error.ResourceChange = Failed in the
-				// resource change.
-				log.error("Pageflow.PageflowEditor.Error.ResourceChange",
-						exception);
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
-		 */
-		public boolean visit(IResourceDelta delta) {
-			// if the delta is not a file instance, just return true
-			if (!(delta.getResource() instanceof IFile)) {
-				return true;
-			}
-
-			// web file is changed.
-			if (WebrootUtil.isValidWebFile(((IFile) delta.getResource())
-					.getFullPath())) {
-				webPageChanged(((IFile) delta.getResource()).getFullPath());
-				return false;
-			}
-			return false;
-		}
-	}
-
-	/** the resource tracker instance */
-	private ResourceTracker resourceTracker = null;
-
-	/**
-	 * Returns the resource tracker instance
-	 * 
-	 * @return - Returns the resource tracker instance
-	 */
-	private ResourceTracker getResourceTracker() {
-		if (null == resourceTracker) {
-			resourceTracker = new ResourceTracker();
-		}
-		return resourceTracker;
-	}
-
-	/**
-	 * Changes the dirty state.
-	 * 
-	 * @param dirty -
-	 *            dirty state
-	 */
-	protected void setDirty(boolean dirty) {
-		if (isDirty != dirty) {
-			isDirty = dirty;
-		}
-	}
-
-	/**
-	 * Updates the specified actions.
-	 * 
-	 * @param actionIds -
-	 *            the list of ids of actions to update
-	 */
-	protected void updateActions(List actionIds) {
-		for (Iterator ids = actionIds.iterator(); ids.hasNext();) {
-			IAction action = getActionRegistry().getAction(ids.next());
-			if (null != action && action instanceof UpdateAction) {
-				((UpdateAction) action).update();
-			}
-		}
-	}
-
-	/**
-	 * Creates a new PageflowPage instance.
-	 * <p>
-	 * By design this page uses its own <code>EditDomain</code>. The main
-	 * goal of this approach is that this page has its own undo/redo command
-	 * stack.
-	 * 
-	 * @param parent -
-	 *            the parent multi page editor
-	 */
-	public PageflowEditor(IEditorPart parent) {
-		domain = new DefaultEditDomain(parent);
-		domain.setCommandStack(getCommandStack());
-		this.setEditDomain(domain);
-		parentEditor = parent;
-	}
-
-	/**
-	 * Adds an <code>CommandStack</code> action to this editor.
-	 * <p>
-	 * <code>CommandStack</code> actions are actions that depend and work on
-	 * the <code>CommandStack</code>.
-	 * 
-	 * @param action -
-	 *            the <code>CommandStack</code> action
-	 */
-	protected void addStackAction(StackAction action) {
-		getActionRegistry().registerAction(action);
-		stackActions.add(action.getId());
-	}
-
-	/**
-	 * Creates different kinds of actions and registers them to the
-	 * ActionRegistry.
-	 */
-	protected void createActions() {
-		// register delete action
-		addEditPartAction(new DeleteAction((IWorkbenchPart) this));
-		// register undo/redo action
-		addStackAction(new UndoAction(this));
-		addStackAction(new RedoAction(this));
-
-		// Allows opening of JSP files from the pageflow
-		addEditPartAction(new OpenEditorAction(this));
-
-		// Allows showing property view for the pageflow
-		SelectionAction action = new ShowPropertyViewAction(this);
-		action
-				.setImageDescriptor(getImageDescriptorForView("org.eclipse.ui.views.PropertySheet"));
-		addEditPartAction(action);
-		// Allows showing property view for the pageflow
-		// addEditPartAction(new ShowPaletteViewAction((IWorkbenchPart) this));
-
-		// register alignment actions
-		addEditPartAction(new AlignmentAction((IWorkbenchPart) this,
-				PositionConstants.LEFT));
-		addEditPartAction(new AlignmentAction((IWorkbenchPart) this,
-				PositionConstants.RIGHT));
-		addEditPartAction(new AlignmentAction((IWorkbenchPart) this,
-				PositionConstants.TOP));
-		addEditPartAction(new AlignmentAction((IWorkbenchPart) this,
-				PositionConstants.BOTTOM));
-		addEditPartAction(new AlignmentAction((IWorkbenchPart) this,
-				PositionConstants.CENTER));
-		addEditPartAction(new AlignmentAction((IWorkbenchPart) this,
-				PositionConstants.MIDDLE));
-
-		// register zoom in/out action
-		IAction zoomIn = new ZoomInAction(getZoomManager(getGraphicalViewer()));
-		IAction zoomOut = new ZoomOutAction(
-				getZoomManager(getGraphicalViewer()));
-		addAction(zoomIn);
-		addAction(zoomOut);
-
-		getSite().getKeyBindingService().registerAction(zoomIn);
-		getSite().getKeyBindingService().registerAction(zoomOut);
-	}
-
-	/**
-	 * Returns the zoom manager of the specified viewer.
-	 * 
-	 * @param viewer_ -
-	 *            the viewer to get the zoom manager from
-	 * @return - the zoom manager
-	 */
-	private ZoomManager getZoomManager(GraphicalViewer viewer_) {
-		// get zoom manager from root edit part
-		RootEditPart rootEditPart = viewer_.getRootEditPart();
-		ZoomManager zoomManager = null;
-		if (rootEditPart instanceof ScalableFreeformRootEditPart) {
-			zoomManager = ((ScalableFreeformRootEditPart) rootEditPart)
-					.getZoomManager();
-		} else if (rootEditPart instanceof ScalableRootEditPart) {
-			zoomManager = ((ScalableRootEditPart) rootEditPart)
-					.getZoomManager();
-		}
-		return zoomManager;
-	}
-
-	/**
-	 * Adds an action to this editor's <code>ActionRegistry</code>.
-	 * 
-	 * @param action -
-	 *            the action to add.
-	 */
-	protected void addAction(IAction action) {
-		getActionRegistry().registerAction(action);
-	}
-
-	/**
-	 * Adds an <code>EditPart</code> action to this editor.
-	 * <p>
-	 * <code>EditPart</code> actions are actions that depend and work on the
-	 * selected <code>EditPart</code>s.
-	 * 
-	 * @param action -
-	 *            the <code>EditPart</code> action
-	 */
-	protected void addEditPartAction(SelectionAction action) {
-		getActionRegistry().registerAction(action);
-		editPartActionIDs.add(action.getId());
-	}
-
-	/**
-	 * Returns the action registry of this editor.
-	 * 
-	 * @return - the action registry
-	 */
-	public ActionRegistry getActionRegistry() {
-		if (null == actionRegistry) {
-			actionRegistry = new ActionRegistry();
-		}
-
-		return actionRegistry;
-	}
-
-	/**
-	 * Creates the GraphicalViewer on the specified <code>Composite</code>.
-	 * 
-	 * @param parent -
-	 *            the parent composite
-	 */
-	public void createGraphicalViewer(Composite parent) {
-		viewer = new ScrollingGraphicalViewer();
-		viewer.createControl(parent);
-
-		// configure the viewer
-		viewer.getControl().setBackground(parent.getBackground());
-
-		viewer.setRootEditPart(new ConfigurableRootEditPart());
-		// _viewer.setRootEditPart(new ScalableFreeformRootEditPart());
-		viewer.setKeyHandler(new GraphicalViewerKeyHandler(viewer));
-
-		// hook the viewer into the editor
-		registerEditPartViewer(viewer);
-
-		// configure the viewer with context menu and template drag and drop
-		configureEditPartViewer(viewer);
-
-		// initialize the viewer with input
-		viewer.setEditPartFactory(new PageflowEditPartsFactory());
-		// viewer.setContents(getPageflow());
-
-		// support the resource drag&drop
-		viewer
-				.addDropTargetListener((TransferDropTargetListener) new ResourceTransferDropTargetListener(
-						viewer, getParentEditor()) {
-					protected CreationFactory getFactory(Object obj) {
-						return getResourceFactory((IResource) obj);
-					}
-				});
-
-		// apply Editor's preferences
-		// propertyChange(null);
-		// add listener to Editor's preferences changing
-		EditorPlugin.getDefault().getPreferenceStore()
-				.addPropertyChangeListener(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see FlowEditor#getResourceFactory(IResource, ICodeGenEditor)
-	 */
-	protected CreationFactory getResourceFactory(IResource resource) {
-		return new PageflowResourceFactory(resource);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public final void doSave(IProgressMonitor monitor) {
-		// our policy: delegate saving to the parent
-		getParentEditor().doSave(monitor);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISaveablePart#doSaveAs()
-	 */
-	public final void doSaveAs() {
-		// our policy: delegate saving to the parent
-		getParentEditor().doSaveAs();
-	}
-
-	/**
-	 * Saves the pageflow under the specified path.
-	 * @param file 
-	 * 
-	 * @param progressMonitor
-	 * @throws CoreException 
-	 */
-	public void doSave(IFile file, IProgressMonitor progressMonitor)
-			throws CoreException {
-		if (((FileEditorInput) getEditorInput()).getFile() != file) {
-			// TODO: save to other page.
-		}
-		if (null == progressMonitor) {
-			progressMonitor = new NullProgressMonitor();
-		}
-		// Pageflow.Label.Saving = Saving
-		progressMonitor.beginTask(PageflowMessages.Pageflow_Label_Saving + " "
-				+ file.getFullPath(), 2);
-
-		if (null == getPageflowManager()) {
-			// Pageflow.PageflowEditor.Alert.nullModelManager = No model manager
-			// found for saving the file.
-			EditorPlugin.getAlerts().throwCoreException(
-					"Pageflow.PageflowEditor.Alert.nullModelManager");
-		}
-
-		// save pageflow to file
-		try {
-			getPageflowManager().save(getPageflowFilePath(file));
-
-			progressMonitor.worked(1);
-			file.refreshLocal(IResource.DEPTH_ZERO, new SubProgressMonitor(
-					progressMonitor, 1));
-			progressMonitor.done();
-			setDirty(false);
-		} catch (FileNotFoundException e) {
-			// Pageflow.PageflowEditor.Alert.errorSaveFileInfo = The current
-			// pageflow model could not be saved.
-			EditorPlugin.getAlerts().throwCoreException(e);
-		} catch (IOException e) {
-			// Pageflow.PageflowEditor.Alert.errorSaveFileInfo = The current
-			// pageflow model could not be saved.
-			EditorPlugin.getAlerts().throwCoreException(e);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IEditorPart#init(org.eclipse.ui.IEditorSite,
-	 *      org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		setSite(site);
-		setInput(input);
-		IFile fileFacesConfig = null;
-		try {
-			fileFacesConfig = ((FileEditorInput) input).getFile();
-
-			// load and validate pageflow
-			if (null == createPageflow(getPageflowFilePath(fileFacesConfig))) {
-				// Pageflow.PageflowEditor.Error.invalidPageflowFile = The
-				// specified input is not a valid pageflow.
-				log.error("Pageflow.PageflowEditor.Error.invalidPageflowFile");
-				throw new PartInitException(
-						EditorPlugin
-								.getResourceString("Pageflow.PageflowEditor.Error.invalidPageflowFile"));
-			}
-
-		} catch (CoreException e) {
-			// Pageflow.PageflowEditor.Error.invalidPageflowFile = The specified
-			// input is not a valid pageflow.
-			log.error("Pageflow.PageflowEditor.Error.invalidPageflowFile", e);
-			throw new PartInitException(e.getStatus());
-		} catch (IOException e) {
-			// Pageflow.PageflowEditor.Alert.errorSaveFileInfo = The current
-			// pageflow model could not be saved.
-			log.error("Pageflow.PageflowEditor.Alert.errorSaveFileInfo", e);
-		}
-
-		// add selection change listener
-		getSite().getWorkbenchWindow().getSelectionService()
-				.addSelectionListener(getSelectionListener());
-
-		// Add resource change listener
-		fileFacesConfig.getWorkspace().addResourceChangeListener(
-				getResourceTracker());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchPart#dispose()
-	 */
-	public void dispose() {
-		// remove selection change listener
-		getModelsTransform().dispose();
-		getSite().getWorkbenchWindow().getSelectionService()
-				.removeSelectionListener(getSelectionListener());
-
-		// remove listener to Editor's preferences changing
-		EditorPlugin.getDefault().getPreferenceStore()
-				.removePropertyChangeListener(this);
-
-		if (getEditorInput() != null) {
-			IFile file = (IFile) getEditorInput().getAdapter(IResource.class);
-			if (file != null) {
-				file.getWorkspace().removeResourceChangeListener(
-						getResourceTracker());
-			}
-		}
-		super.dispose();
-	}
-
-	/**
-	 * get the pageflow file path based on faces-config.xml file path
-	 * 
-	 * @return
-	 */
-	private IPath getPageflowFilePath(IFile file) {
-		IPath pageflowFilePath;
-		pageflowFilePath = PageflowModelManager.makePageflowPath(file
-				.getFullPath());
-		return pageflowFilePath;
-	}
-
-	/**
-	 * Returns the pageflow object from the specified file.
-	 * 
-	 * @param file -
-	 *            the file resource
-	 * @return -the pageflow object from the specified file
-	 * @throws IOException
-	 */
-	private Pageflow createPageflow(IPath pathPageflow) throws CoreException,
-			IOException {
-		Pageflow pageflow = null;
-
-		try {
-			getPageflowManager().load(pathPageflow);
-		} catch (Exception e) {
-			// Pageflow.PageflowEditor.Error.invalidPageflowFile = The specified
-			// input is not a valid pageflow.
-			// _log.error("Pageflow.PageflowEditor.Error.invalidPageflowFile",
-			// e);
-			getPageflowManager().createPageflow(pathPageflow);
-		}
-		IFile fileFacesConfig = ((FileEditorInput) getEditorInput()).getFile();
-		// it should update related config file
-		if (!fileFacesConfig.getFullPath().toString().trim().equalsIgnoreCase(
-				getPageflowManager().getModel().getConfigfile())) {
-			getPageflowManager().getModel().setConfigfile(
-					fileFacesConfig.getFullPath().toString());
-			getPageflowManager().save(pathPageflow);
-		}
-		pageflow = getPageflowManager().getModel();
-		if (null == pageflow) {
-			// Pageflow.PageflowEditor.Error.invalidPageflowModel = The model in
-			// the pageflow file is not a valid pageflow model.
-			log.error("Pageflow.PageflowEditor.Error.invalidPageflowModel");
-			EditorPlugin.getAlerts().throwCoreException(
-					"Pageflow.PageflowEditor.Error.invalidPageflowModel");
-		}
-		return pageflow;
-	}
-
-	/** get the pageflow manager for this page */
-	public PageflowModelManager getPageflowManager() {
-		if (pageflowManager == null) {
-			pageflowManager = new PageflowModelManager();
-		}
-		return pageflowManager;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISaveablePart#isDirty()
-	 */
-	public final boolean isDirty() {
-		return isDirty;
-	}
-
-	/**
-	 * Returns the <code>CommandStack</code> of this editor page.
-	 * 
-	 * @return - the <code>CommandStack</code> of this editor page
-	 */
-	public final CommandStack getCommandStack() {
-		if (commandStack == null) {
-			commandStack = new PreExecuteCommandStack();
-			commandStack
-					.addCommandStackEventListener(new PageCommandStackListener());
-		}
-		return commandStack;
-	}
-
-	/**
-	 * Returns the default <code>PaletteRoot</code> for this editor and all
-	 * its pages.
-	 * 
-	 * @return - the default <code>PaletteRoot</code>
-	 */
-	protected PaletteRoot getPaletteRoot() {
-		if (null == paletteRoot) {
-			// create root
-			paletteRoot = new PageflowPaletteRoot();
-		}
-		return paletteRoot;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISaveablePart#isSaveAsAllowed()
-	 */
-	public final boolean isSaveAsAllowed() {
-		// our policy: delegate saving to the parent
-		return getParentEditor().isSaveAsAllowed();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IWorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		getGraphicalViewer().getControl().setFocus();
-	}
-
-	/**
-	 * Returns the multi page pageflow editor this editor page is contained in.
-	 * 
-	 * @return - the parent multi page editor
-	 */
-	protected final IEditorPart getParentEditor() {
-		return parentEditor;
-	}
-
-	/**
-	 * Returns the edit domain this editor page uses.
-	 * 
-	 * @return - the edit domain this editor page uses
-	 */
-	public final DefaultEditDomain getEditDomain() {
-		return domain;
-	}
-
-	/**
-	 * Hooks a <code>EditPartViewer</code> to the rest of the Editor.
-	 * <p>
-	 * By default, the viewer is added to the SelectionSynchronizer, which can
-	 * be used to keep 2 or more EditPartViewers in sync. The viewer is also
-	 * registered as the ISelectionProvider for the Editor's PartSite.
-	 * 
-	 * @param viewer_ -
-	 *            the viewer to hook into the editor
-	 */
-	protected void registerEditPartViewer(EditPartViewer viewer_) {
-		// register viewer to edit domain
-		getEditDomain().addViewer(viewer_);
-
-		// the multi page pageflow editor keeps track of synchronizing
-		getSelectionSynchronizer().addViewer(viewer_);
-
-		// add viewer as selection provider
-		getSite().setSelectionProvider(viewer_);
-	}
-
-	/**
-	 * Configures the specified <code>EditPartViewer</code> including context
-	 * menu, key handler, etc.
-	 * 
-	 * @param viewer_ -
-	 *            the pageflow graphical viewer.
-	 */
-	protected void configureEditPartViewer(EditPartViewer viewer_) {
-		// configure the shared key handler
-		if (null != viewer_.getKeyHandler()) {
-			viewer_.getKeyHandler().setParent(getSharedKeyHandler());
-		}
-		// create the ActionRegistry
-		createActions();
-
-		// append the parent editor's action registry.
-		ActionRegistry actionRegistry_ = (ActionRegistry) getParentEditor()
-				.getAdapter(ActionRegistry.class);
-		if (actionRegistry_ != null) {
-			for (Iterator iter = actionRegistry_.getActions(); iter.hasNext();) {
-				getActionRegistry().registerAction((IAction) iter.next());
-			}
-		}
-		// configure and register the context menu
-		ContextMenuProvider provider = new PageflowEditorContextMenuProvider(
-				viewer_, getActionRegistry());
-		viewer_.setContextMenu(provider);
-		getSite().registerContextMenu(
-				EditorPlugin.getPluginId() + PAGEFLOW_CONTEXTMENU_REG_ID,
-				provider, getSite().getSelectionProvider()); //$NON-NLS-1$
-
-		// enable viewer as drop target for template transfers
-		viewer_
-				.addDropTargetListener((TransferDropTargetListener) new PageflowTemplateTransferDropTargetListener(
-						viewer_));
-
-	}
-
-	/**
-	 * Returns the pageflow that is edited.
-	 * 
-	 * @return - the pageflow that is edited
-	 */
-	public Pageflow getPageflow() {
-		return getPageflowManager().getModel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditorPage#getGraphicalViewerForZoomSupport()
-	 */
-	public GraphicalViewer getGraphicalViewer() {
-		return viewer;
-	}
-
-	public void setGraphicalViewerContents(Object contents) {
-		viewer.setContents(contents);
-		propertyChange(null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IAdaptable#getAdapter(Class)
-	 */
-	public Object getAdapter(Class type) {
-		if (type == IContentOutlinePage.class) {
-			return getOutlinePage();
-		} else if (type == CommandStack.class) {
-			return getCommandStack();
-		} else if (type == ActionRegistry.class) {
-			return getActionRegistry();
-		} else if (type == IPropertySheetPage.class) {
-			return getPropertySheetPage();
-		} else if (type == ZoomManager.class) {
-			return getZoomManager(getGraphicalViewer());
-		}
-		return super.getAdapter(type);
-	}
-
-	/**
-	 * Returns the outline page for the outline view with lazy creation
-	 * 
-	 * @return - the outline page
-	 */
-	protected PageflowEditorOutlinePage getOutlinePage() {
-		PageflowEditorOutlinePage outlinePage = new PageflowEditorOutlinePage(
-				this);
-		outlinePage.initialize(this);
-		return outlinePage;
-	}
-
-	/**
-	 * Returns the undoable <code>PropertySheetPage</code> for this editor.
-	 * 
-	 * @return - the undoable <code>PropertySheetPage</code>
-	 */
-	protected IPropertySheetPage getPropertySheetPage() {
-		if (null == undoablePropertySheetPage) {
-			undoablePropertySheetPage = new PropertySheetPage();
-
-			/** set the property source for property sheet page */
-			undoablePropertySheetPage
-					.setRootEntry(new org.eclipse.gef.ui.properties.UndoablePropertySheetEntry(
-							(CommandStack) getAdapter(CommandStack.class)));
-
-		}
-
-		return undoablePropertySheetPage;
-	}
-
-	/**
-	 * Returns the selection syncronizer object. The synchronizer can be used to
-	 * sync the selection of 2 or more EditPartViewers.
-	 * 
-	 * @return - the syncrhonizer
-	 */
-	protected SelectionSynchronizer getSelectionSynchronizer() {
-		if (null == synchronizer) {
-			synchronizer = new SelectionSynchronizer();
-		}
-		return synchronizer;
-	}
-
-	/**
-	 * Returns the shared KeyHandler that should be used for all viewers.
-	 * 
-	 * @return - the shared KeyHandler
-	 */
-	protected KeyHandler getSharedKeyHandler() {
-		if (null == sharedKeyHandler) {
-			sharedKeyHandler = new KeyHandler();
-
-			// configure common keys for all viewers
-			sharedKeyHandler
-					.put(KeyStroke.getPressed(SWT.DEL, 127, 0),
-							getActionRegistry().getAction(
-									ActionFactory.DELETE.getId()));
-			sharedKeyHandler.put(KeyStroke.getPressed(SWT.F2, 0),
-					getActionRegistry().getAction(
-							GEFActionConstants.DIRECT_EDIT));
-		}
-		return sharedKeyHandler;
-	}
-
-	/**
-	 * Returns the selection listener.
-	 * 
-	 * @return - the <code>ISelectionListener</code>
-	 */
-	protected ISelectionListener getSelectionListener() {
-		return selectionListener;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-		String property = (event == null) ? null : event.getProperty();
-
-		propagateProperty(property, viewer.getRootEditPart());
-	}
-
-	/**
-	 * propagate property change to children edit part
-	 * 
-	 * @param property -
-	 *            property's string name
-	 * @param part -
-	 *            parent edit part.
-	 */
-	private void propagateProperty(String property, EditPart part) {
-		processPropertyChange(property, part);
-
-		if (part instanceof GraphicalEditPart) {
-			// get the connections edit part
-			Iterator iterConns = ((GraphicalEditPart) part)
-					.getSourceConnections().iterator();
-			while (iterConns.hasNext()) {
-				EditPart child = (EditPart) iterConns.next();
-				propagateProperty(property, child);
-			}
-		}
-		Iterator iter = part.getChildren().iterator();
-		while (iter.hasNext()) {
-			EditPart child = (EditPart) iter.next();
-			propagateProperty(property, child);
-		}
-	}
-
-	/**
-	 * process the property change FIXME: The property change should be category
-	 * to improve the performance.
-	 * 
-	 * @param property -
-	 *            property's string name
-	 * @param part
-	 */
-	private void processPropertyChange(String property, EditPart part) {
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-
-		if (property != null
-				&& property.equals(GEMPreferences.USE_SYSTEM_COLORS)) {
-			// reload all properties - it's easiest
-			property = null;
-		}
-
-		if (property == null || GEMPreferences.SNAP_TO_GRID.equals(property)) {
-			boolean bSnapToGrid = store.getBoolean(GEMPreferences.SNAP_TO_GRID);
-			if (part instanceof ILayerPanePreference) {
-				((ILayerPanePreference) part).setGridVisible(bSnapToGrid);
-			}
-		}
-
-		if (property == null || GEMPreferences.GRID_WIDTH.equals(property)
-				|| GEMPreferences.GRID_HEIGHT.equals(property)) {
-			Dimension gridSpacing = new Dimension(store
-					.getInt(GEMPreferences.GRID_WIDTH), store
-					.getInt(GEMPreferences.GRID_HEIGHT));
-			if (part instanceof ILayerPanePreference) {
-				((ILayerPanePreference) part).setGridSpacing(gridSpacing);
-			}
-		}
-
-		if (property == null || GEMPreferences.GRID_COLOR.equals(property)) {
-			Color gridFgColor = GEMPreferences.getColor(store,
-					GEMPreferences.GRID_COLOR);
-			if (part instanceof ILayerPanePreference) {
-				((ILayerPanePreference) part)
-						.setGridForegroundColor(gridFgColor);
-			}
-		}
-
-		if (property == null || GEMPreferences.CANVAS_COLOR.equals(property)) {
-			Color containerBgColor = GEMPreferences.getColor(store,
-					GEMPreferences.CANVAS_COLOR);
-			if (part instanceof IFigurePreference) {
-				((IFigurePreference) part).setBackgroundColor(containerBgColor);
-			}
-		}
-
-		if (property == null || GEMPreferences.LINE_WIDTH.equals(property)) {
-			int linkLineWidth = store.getInt(GEMPreferences.LINE_WIDTH);
-
-			if (part instanceof IConnectionPreference) {
-				((IConnectionPreference) part).setLineWidth(linkLineWidth);
-			}
-		}
-
-		if (property == null || GEMPreferences.LINE_COLOR.equals(property)) {
-			Color linkLineColor = GEMPreferences.getColor(store,
-					GEMPreferences.LINE_COLOR);
-			if (part instanceof IConnectionPreference) {
-				((IConnectionPreference) part)
-						.setForegroundColor(linkLineColor);
-			}
-		}
-
-		if (property == null
-				|| GEMPreferences.SHOW_LINE_LABELS.equals(property)) {
-			boolean bLinkLabelVisible = store
-					.getBoolean(GEMPreferences.SHOW_LINE_LABELS);
-			if (part instanceof IConnectionPreference) {
-				((IConnectionPreference) part)
-						.setLabelVisible(bLinkLabelVisible);
-			}
-		}
-
-		if (property == null || GEMPreferences.LINE_LABEL_FONT.equals(property)
-				|| GEMPreferences.LINE_LABEL_FONT_COLOR.equals(property)) {
-			Font linkLabelFont = getLinkLabelFont();
-			Color linkLabelFgColor = GEMPreferences.getColor(store,
-					GEMPreferences.LINE_LABEL_FONT_COLOR);
-			if (part instanceof IConnectionPreference) {
-				((IConnectionPreference) part).setFont(linkLabelFont);
-				((IConnectionPreference) part)
-						.setLabelForegroundColor(linkLabelFgColor);
-			}
-		}
-
-		if (property == null
-				|| GEMPreferences.LINE_LABEL_COLOR.equals(property)) {
-			Color linkLabelBgColor = GEMPreferences.getColor(store,
-					GEMPreferences.LINE_LABEL_COLOR);
-			if (part instanceof IConnectionPreference) {
-				((IConnectionPreference) part)
-						.setLabelBackgroundColor(linkLabelBgColor);
-			}
-		}
-
-		if (property == null || GEMPreferences.LINE_ROUTING.equals(property)) {
-			String connectionStyle = store
-					.getString(GEMPreferences.LINE_ROUTING);
-			int style;
-			if (GEMPreferences.LINE_ROUTING_MANHATTAN.equals(connectionStyle)) {
-				style = ILayerPanePreference.LINE_ROUTING_MANHATTAN;
-			} else {
-				style = ILayerPanePreference.LINE_ROUTING_MANUAL;
-			}
-
-			if (part instanceof ILayerPanePreference) {
-				((ILayerPanePreference) part).setConnectionRouterStyle(style);
-			} else if (part instanceof IConnectionPreference) {
-				((IConnectionPreference) part).setConnectionRouterStyle(style);
-			}
-		}
-
-		if (property == null
-				|| GEMPreferences.FIGURE_LABEL_FONT.equals(property)
-				|| GEMPreferences.FIGURE_LABEL_FONT_COLOR.equals(property)) {
-			Font nodeLabelFont = getNodeLabelFont();
-			Color nodeLabelFgColor = GEMPreferences.getColor(store,
-					GEMPreferences.FIGURE_LABEL_FONT_COLOR);
-
-			if (part instanceof INodePreference) {
-				((INodePreference) part).setFont(nodeLabelFont);
-				((INodePreference) part).setForegroundColor(nodeLabelFgColor);
-			}
-		}
-
-		if (property == null || GEMPreferences.LABEL_PLACEMENT.equals(property)) {
-			int placement = PositionConstants.SOUTH;
-			String nodeLabelPlacement = store
-					.getString(GEMPreferences.LABEL_PLACEMENT);
-			if (GEMPreferences.LABEL_PLACEMENT_TOP.equals(nodeLabelPlacement))
-				placement = PositionConstants.NORTH;
-			else if (GEMPreferences.LABEL_PLACEMENT_BOTTOM
-					.equals(nodeLabelPlacement))
-				placement = PositionConstants.SOUTH;
-			else if (GEMPreferences.LABEL_PLACEMENT_LEFT
-					.equals(nodeLabelPlacement))
-				placement = PositionConstants.WEST;
-			else if (GEMPreferences.LABEL_PLACEMENT_RIGHT
-					.equals(nodeLabelPlacement))
-				placement = PositionConstants.EAST;
-			if (part instanceof INodePreference)
-				((INodePreference) part).setTextPlacement(placement);
-		}
-	}
-
-	private Font getLinkLabelFont() {
-		FontRegistry registry = JFaceResources.getFontRegistry();
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		FontData fontData = PreferenceConverter.getFontData(store,
-				GEMPreferences.LINE_LABEL_FONT);
-		if (!registry.get(fontData.toString()).equals(registry.defaultFont()))
-			return registry.get(fontData.toString());
-		
-		registry.put(fontData.toString(), new FontData[] {fontData});
-		return registry.get(fontData.toString());
-	}
-
-	private Font getNodeLabelFont() {
-		FontRegistry registry = JFaceResources.getFontRegistry();
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		FontData fontData = PreferenceConverter.getFontData(store,
-				GEMPreferences.FIGURE_LABEL_FONT);
-		if (!registry.get(fontData.toString()).equals(registry.defaultFont()))
-			return registry.get(fontData.toString());
-		
-		registry.put(fontData.toString(), new FontData[] {fontData});
-		return registry.get(fontData.toString());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.IGotoMarker#gotoMarker(org.eclipse.core.resources.IMarker)
-	 */
-	public void gotoMarker(IMarker marker) {
-		// The LOCATION attribute in the marker should be the ID string
-		Object id = null;
-		try {
-			id = marker.getAttribute(IMarker.LOCATION);
-		} catch (CoreException e) {
-			// Pageflow.PageflowEditor.Error.invalidMarkerAttribute = Unable to
-			// get marker's attribute
-			log
-					.error(
-							"Pageflow.PageflowEditor.Error.invalidMarkerAttribute",
-							e);
-		}
-		if (id instanceof String) {
-			GraphicalEditPart part = EditPartMarkerUtil.findEditPart(
-					(GraphicalEditPart) getGraphicalViewer().getRootEditPart(),
-					(String) id);
-			if (part != null) {
-				getGraphicalViewer().reveal(part);
-				getGraphicalViewer().select(part);
-				return;
-			}
-		}
-
-	}
-
-	/**
-	 * the related web page is changed in outside editor, the pageflow should be
-	 * revalidated to update the validation icons
-	 * 
-	 * @param fullPath
-	 */
-	public void webPageChanged(IPath fullPath) {
-		PageflowPage page = getPageflowManager().foundPage(
-				WebrootUtil.getWebPath(fullPath));
-
-		if (page != null && getGraphicalViewer() != null
-				&& getGraphicalViewer().getRootEditPart() != null) {
-			GraphicalEditPart pagePart = EditPartMarkerUtil.findEditPart(
-					(GraphicalEditPart) getGraphicalViewer().getRootEditPart(),
-					page.getId());
-			PageflowAnnotationUtil
-					.validatePage((PageflowNodeEditPart) pagePart);
-		}
-	}
-
-	/**
-	 * Get the image desriptor from the view's id.
-	 * 
-	 * @param viewid
-	 * @return
-	 */
-	private ImageDescriptor getImageDescriptorForView(String viewid) {
-		IConfigurationElement[] elements = Platform.getExtensionRegistry()
-				.getConfigurationElementsFor("org.eclipse.ui.views");
-		for (int i = 0; i < elements.length; i++) {
-			String name = elements[i].getName();
-			String id = elements[i].getAttribute("id");
-			if ("view".equals(name) && viewid.equals(id)) {
-				String iconPath = elements[i].getAttribute("icon");
-				if (iconPath != null) {
-					return AbstractUIPlugin.imageDescriptorFromPlugin(
-							elements[i].getDeclaringExtension().getContributor().getName(),
-							iconPath);
-				}
-			}
-		}
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditorContextMenuProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditorContextMenuProvider.java
deleted file mode 100644
index 3e23919..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditorContextMenuProvider.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-import org.eclipse.gef.ContextMenuProvider;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.ui.actions.ActionRegistry;
-import org.eclipse.gef.ui.actions.GEFActionConstants;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.action.ShowPropertyViewAction;
-import org.eclipse.ui.actions.ActionFactory;
-
-/**
- * This is the context menu provider for pageflow editor.
- * 
- */
-public class PageflowEditorContextMenuProvider extends ContextMenuProvider {
-	/** the action registry */
-	private final ActionRegistry actionRegistry;
-
-	/**
-	 * Creates a new PageflowEditorContextMenuProvider instance.
-	 * 
-	 * @param viewer -
-	 *            the editor viewer
-	 * @param actionRegistry -
-	 *            action registry of the editor
-	 */
-	public PageflowEditorContextMenuProvider(EditPartViewer viewer,
-			ActionRegistry actionRegistry) {
-		super(viewer);
-
-		this.actionRegistry = actionRegistry;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ContextMenuProvider#buildContextMenu(IMenuManager)
-	 */
-	public void buildContextMenu(IMenuManager menuManager) {
-		// add GEF menu groups, such as undo, edit, save, etc.
-		GEFActionConstants.addStandardActionGroups(menuManager);
-
-		// add typical undo/redo commands
-		appendActionToUndoGroup(menuManager, ActionFactory.UNDO.getId());
-		appendActionToUndoGroup(menuManager, ActionFactory.REDO.getId());
-		// add edit commands, including copy, paste, delete
-		appendActionToEditGroup(menuManager, ActionFactory.COPY.getId());
-		appendActionToEditGroup(menuManager, ActionFactory.PASTE.getId());
-		appendActionToEditGroup(menuManager, ActionFactory.DELETE.getId());
-		// Add Open Editor Action
-		appendActionToEditGroup(menuManager, FacesConfigEditor.EDITOR_ID);
-
-		// append the save submenu
-		appendActionToSaveGroup(menuManager, ActionFactory.SAVE.getId());
-
-		// append the alignment submenu, including top, bottom, middle, left,
-		// right and center.
-		appendAlignmentSubmenu(menuManager);
-
-		appendShowViewSubmenu(menuManager);
-
-	}
-
-	/**
-	 * Appends the alignment subment.
-	 * 
-	 * @param menuManager
-	 *            manager of workbench
-	 */
-	private void appendShowViewSubmenu(IMenuManager menuManager) {
-		// Show View Actions
-		MenuManager submenu = new MenuManager(
-				PageflowMessages.Pageflow_Contextmenu_ShowView_Label);
-
-		IAction action = getActionRegistry().getAction(
-				ShowPropertyViewAction.SHOW_PROPERTY_VIEW);
-		if (null != action && action.isEnabled()) {
-			submenu.add(action);
-		}
-
-		// action = getActionRegistry().getAction(
-		// ShowPaletteViewAction.SHOW_PALETTE_VIEW);
-		// if (null != action && action.isEnabled()) {
-		// submenu.add(action);
-		// }
-
-		if (!submenu.isEmpty()) {
-			menuManager.appendToGroup(GEFActionConstants.GROUP_REST, submenu);
-		}
-	}
-
-	/**
-	 * Appends the alignment subment.
-	 * 
-	 * @param menuManager
-	 *            manager of workbench
-	 */
-	private void appendAlignmentSubmenu(IMenuManager menuManager) {
-		// Alignment Actions
-		MenuManager submenu = new MenuManager(
-				PageflowMessages.Pageflow_Contextmenu_Align_Label);
-
-		IAction action = getActionRegistry().getAction(
-				GEFActionConstants.ALIGN_LEFT);
-		if (null != action && action.isEnabled()) {
-			submenu.add(action);
-		}
-
-		action = getActionRegistry().getAction(GEFActionConstants.ALIGN_CENTER);
-		if (null != action && action.isEnabled()) {
-			submenu.add(action);
-		}
-
-		action = getActionRegistry().getAction(GEFActionConstants.ALIGN_RIGHT);
-		if (null != action && action.isEnabled()) {
-			submenu.add(action);
-		}
-
-		action = getActionRegistry().getAction(GEFActionConstants.ALIGN_TOP);
-		if (null != action && action.isEnabled()) {
-			submenu.add(action);
-		}
-
-		action = getActionRegistry().getAction(GEFActionConstants.ALIGN_MIDDLE);
-		if (null != action && action.isEnabled()) {
-			submenu.add(action);
-		}
-
-		action = getActionRegistry().getAction(GEFActionConstants.ALIGN_BOTTOM);
-		if (null != action && action.isEnabled()) {
-			submenu.add(action);
-		}
-
-		if (!submenu.isEmpty()) {
-			menuManager.appendToGroup(GEFActionConstants.GROUP_EDIT, submenu);
-		}
-	}
-
-	/**
-	 * Returns the action registry.
-	 * 
-	 * @return - the action registry
-	 */
-	protected ActionRegistry getActionRegistry() {
-		return actionRegistry;
-	}
-
-	/**
-	 * Appends the specified action to the specified menu group
-	 * 
-	 * @param menu -
-	 *            menu manager
-	 * @param actionId -
-	 *            action's ID
-	 * @param menuGroup -
-	 *            menu group name
-	 */
-	 // TODO: dead code
-//	private void appendActionToMenu(IMenuManager menu, String actionId,
-//			String menuGroup) {
-//		IAction action = getActionRegistry().getAction(actionId);
-//		if (null != action && action.isEnabled()) {
-//			menu.appendToGroup(menuGroup, action);
-//		}
-//	}
-
-	/**
-	 * Appends the specified action to the 'Undo' menu group
-	 * 
-	 * @param menu -
-	 *            menu manager
-	 * @param actionId -
-	 *            action's ID
-	 */
-	private void appendActionToUndoGroup(IMenuManager menu, String actionId) {
-		IAction action = getActionRegistry().getAction(actionId);
-		if (null != action && action.isEnabled()) {
-			menu.appendToGroup(GEFActionConstants.GROUP_UNDO, action);
-		}
-	}
-
-	/**
-	 * Appends the specified action to the 'edit' menu group
-	 * 
-	 * @param menu -
-	 *            menu manager
-	 * @param actionId -
-	 *            action's ID
-	 */
-	private void appendActionToEditGroup(IMenuManager menu, String actionId) {
-		IAction action = getActionRegistry().getAction(actionId);
-		if (null != action && action.isEnabled()) {
-			menu.appendToGroup(GEFActionConstants.GROUP_EDIT, action);
-		}
-	}
-
-	/**
-	 * Appends the specified action to the 'add' menu group
-	 * 
-	 * @param menu -
-	 *            menu manager
-	 * @param actionId -
-	 *            action's ID
-	 */
-	 // TODO: dead code
-//	private void appendActionToAddGroup(IMenuManager menu, String actionId) {
-//		IAction action = getActionRegistry().getAction(actionId);
-//		if (null != action && action.isEnabled()) {
-//			menu.appendToGroup(GEFActionConstants.GROUP_ADD, action);
-//		}
-//	}
-
-	/**
-	 * Appends the specified action to the 'save' menu group
-	 * 
-	 * @param menu -
-	 *            menu manager
-	 * @param actionId -
-	 *            action's ID
-	 */
-	private void appendActionToSaveGroup(IMenuManager menu, String actionId) {
-		IAction action = getActionRegistry().getAction(actionId);
-		if (null != action && action.isEnabled()) {
-			menu.appendToGroup(GEFActionConstants.GROUP_SAVE, action);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditorOutlinePage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditorOutlinePage.java
deleted file mode 100644
index 2f036ad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditorOutlinePage.java
+++ /dev/null
@@ -1,545 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LightweightSystem;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.draw2d.parts.ScrollableThumbnail;
-import org.eclipse.gef.ContextMenuProvider;
-import org.eclipse.gef.EditDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartListener;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.RootEditPart;
-import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
-import org.eclipse.gef.editparts.ScalableRootEditPart;
-import org.eclipse.gef.ui.parts.TreeViewer;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowTreePartFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.part.Page;
-import org.eclipse.ui.part.PageBook;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-
-/**
- * This is an implementation of an outline page showing an overview figure and
- * an tree outline of the main graphical viewer provided by the current active
- * page of an multi page editor.
- * 
- */
-public class PageflowEditorOutlinePage extends Page implements
-		IContentOutlinePage {
-	/** the pageflow editor */
-	private final PageflowEditor editor;
-
-	/** the outlineContent for the tree viewer */
-	private PageflowElement outlineContent = null;
-
-	/** the control of the overview */
-	private Canvas overview = null;
-
-	/** the root edit part (outlineContent for the thumbnail) */
-	private RootEditPart overviewContent = null;
-
-	/** the thumbnail */
-	private ScrollableThumbnail thumbnail = null;
-
-	/** the tree viewer */
-	private TreeViewer treeViewer = null;
-
-	/** the control of the tree view */
-	private Control outline = null;
-
-	/** the pagebook */
-	private PageBook pageBook = null;
-
-	/** action for showing the tree page */
-	private IAction showOutlineAction = null;
-
-	/** action for showing the overview page */
-	private IAction showOverviewAction = null;
-
-	/** the LightweightSystem */
-	private LightweightSystem lws = null;
-
-	/** the edit domain */
-	private EditDomain editDomain = null;
-
-	/**
-	 * Creates a new PageflowEditorOutlinePage instance.
-	 * 
-	 * @param editor -
-	 *            Pageflow Editor
-	 */
-	public PageflowEditorOutlinePage(EditorPart editor) {
-		super();
-		this.editor = (PageflowEditor) editor;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISelectionProvider#addSelectionChangedListener(ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		getTreeViewer().addSelectionChangedListener(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		// pagebook
-		pageBook = new PageBook(parent, SWT.NONE);
-
-		// tree viewer control
-		outline = getTreeViewer().createControl(pageBook);
-		configureEditPartViewer(getTreeViewer());
-
-		// overview canvas
-		overview = new Canvas(pageBook, SWT.NONE);
-		lws = new LightweightSystem(overview);
-
-		// create actions
-		IToolBarManager tbm = getSite().getActionBars().getToolBarManager();
-		showOutlineAction = new Action() {
-			public void run() {
-				showPage(outline);
-			}
-		};
-		showOutlineAction.setImageDescriptor(EditorPlugin.getDefault()
-				.getImageDescriptor("facesconfig/Pageflow_Outline.gif")); //$NON-NLS-1$
-		tbm.add(showOutlineAction);
-		showOverviewAction = new Action() {
-			public void run() {
-				showPage(overview);
-			}
-		};
-		showOverviewAction.setImageDescriptor(EditorPlugin.getDefault()
-				.getImageDescriptor("facesconfig/Pageflow_Outline_Overview.gif")); //$NON-NLS-1$
-		tbm.add(showOverviewAction);
-
-		// initialize outline page
-		initializeOutlineViewer();
-
-		// initialize overview
-		initializeOverview();
-
-		// initialize pagebook
-		showPage(outline);
-	}
-
-	/**
-	 * Configures the outline viewer
-	 */
-	private void initializeOutlineViewer() {
-		if (null != getEditDomain()) {
-			getEditDomain().addViewer(getTreeViewer());
-		}
-		// getTreeViewer().setEditPartFactory(new PageflowTreePartFactory());
-
-		// synchronize selections
-		editor.getSelectionSynchronizer().addViewer(getTreeViewer());
-
-		// add content
-		getTreeViewer().setContents(getOutlineContent());
-	}
-
-	/**
-	 * Shows the spcified page.
-	 * 
-	 * @param id -
-	 *            control id of pagebook in outline page. it is can be _outline
-	 *            or _overview
-	 */
-	protected void showPage(Control id) {
-		if (id == outline) {
-			showOutlineAction.setChecked(true);
-			showOverviewAction.setChecked(false);
-			pageBook.showPage(outline);
-			if (thumbnail != null) {
-				thumbnail.setVisible(false);
-			}
-		} else if (id == overview) {
-			showOutlineAction.setChecked(false);
-			showOverviewAction.setChecked(true);
-			pageBook.showPage(overview);
-			if (thumbnail != null) {
-				thumbnail.setVisible(true);
-			}
-		}
-	}
-
-	/**
-	 * Returns the current edit domain.
-	 * 
-	 * @return - the edit domain
-	 */
-	public EditDomain getEditDomain() {
-		return editDomain;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPage#dispose()
-	 */
-	public void dispose() {
-		editor.getSelectionSynchronizer().removeViewer(getTreeViewer());
-
-		if (null != thumbnail) {
-			thumbnail.deactivate();
-		}
-
-		super.dispose();
-	}
-
-	/**
-	 * initialize Overview.
-	 * 
-	 */
-	private void initializeOverview() {
-		// check if control was created
-		if (null == lws) {
-			return;
-		}
-
-		// deactivate old thumbnail
-		if (null != thumbnail) {
-			thumbnail.deactivate();
-		}
-
-		// create empty thumbnail
-		thumbnail = new ScrollableThumbnail();
-		thumbnail.setBorder(new MarginBorder(3));
-		lws.setContents(thumbnail);
-
-		// initialize thumbnail
-		if (null != getOverviewContent()) {
-			Viewport viewport = null;
-			IFigure source = null;
-			if (getOverviewContent() instanceof ScalableFreeformRootEditPart) {
-				viewport = (Viewport) ((ScalableFreeformRootEditPart) getOverviewContent())
-						.getFigure();
-				source = ((ScalableFreeformRootEditPart) getOverviewContent())
-						.getLayer(LayerConstants.PRINTABLE_LAYERS);
-			}
-			if (getOverviewContent() instanceof ScalableRootEditPart) {
-				viewport = (Viewport) ((ScalableRootEditPart) getOverviewContent())
-						.getFigure();
-				source = ((ScalableRootEditPart) getOverviewContent())
-						.getLayer(LayerConstants.PRINTABLE_LAYERS);
-			}
-
-			if (null != viewport && null != source) {
-				thumbnail.setViewport(viewport);
-				thumbnail.setSource(source);
-			}
-		}
-	}
-
-	/**
-	 * Returns the outlineContent.
-	 * 
-	 * @return - the outlineContent
-	 */
-	public PageflowElement getOutlineContent() {
-		return outlineContent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPage#getControl()
-	 */
-	public Control getControl() {
-		return pageBook;
-	}
-
-	/**
-	 * Returns the root edit part
-	 * 
-	 * @return - the root edit part
-	 */
-	public RootEditPart getOverviewContent() {
-		return overviewContent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return getTreeViewer().getSelection();
-	}
-
-	/**
-	 * Returns the tree viewer.
-	 * 
-	 * @return - the tree viewer
-	 */
-	public TreeViewer getTreeViewer() {
-		if (null == treeViewer) {
-			treeViewer = new TreeViewer();
-			treeViewer.setEditPartFactory(new PageflowTreePartFactory());
-		}
-
-		return treeViewer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISelectionProvider#removeSelectionChangedListener(ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		getTreeViewer().removeSelectionChangedListener(listener);
-	}
-
-	/**
-	 * Sets the outlineContent.
-	 * 
-	 * @param element -
-	 *            Pageflow Element
-	 */
-	public void setOutlineContent(PageflowElement element) {
-		if (outlineContent != element) {
-			outlineContent = element;
-
-			// refresh viewer
-			if (null != getTreeViewer().getControl()) {
-				getTreeViewer().setContents(element);
-
-				// bugfix: something is overwriting visibility
-				if (null != pageBook) {
-					if (showOverviewAction.isChecked()) {
-						showPage(outline);
-						showPage(overview);
-					} else {
-						showPage(outline);
-					}
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPage#setFocus()
-	 */
-	public void setFocus() {
-		if (getControl() != null) {
-			getControl().setFocus();
-		}
-	}
-
-	/**
-	 * Sets the root edit part.
-	 * 
-	 * @param part -
-	 *            root edit part for pageflow model
-	 */
-	public void setOverviewContent(RootEditPart part) {
-		if (overviewContent != part) {
-			overviewContent = part;
-			// reinitialize thumbnail
-			// if (null != thumbnail && thumbnail.isVisible())
-			initializeOverview();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISelectionProvider#setSelection(ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-		getTreeViewer().setSelection(selection);
-	}
-
-	/**
-	 * Initializes this outline page from a given editor page.
-	 * 
-	 * @param newPage -
-	 *            Pageflow EditorPage
-	 */
-	public void initialize(PageflowEditor newPage) {
-		if (null != newPage.getGraphicalViewer()) {
-			setOverviewContent(newPage.getGraphicalViewer().getRootEditPart());
-			EditPart currentContent = newPage.getGraphicalViewer()
-					.getContents();
-			setOutlineContent(null != currentContent ? (PageflowElement) currentContent
-					.getModel()
-					: null);
-			setEditDomain(newPage.getEditDomain());
-			getViewerContentListener().setViewer(newPage.getGraphicalViewer());
-		} else {
-			setOverviewContent(null);
-			setOutlineContent(null);
-			setEditDomain(null);
-		}
-	}
-
-	/**
-	 * Sets the edit domain.
-	 * 
-	 * @param domain -
-	 *            editor's edit domain
-	 */
-	public void setEditDomain(EditDomain domain) {
-		if (editDomain != domain) {
-			// refresh viewer
-			if (null != getTreeViewer()) {
-				if (null != editDomain) {
-					editDomain.removeViewer(getTreeViewer());
-				}
-				if (null != domain) {
-					domain.addViewer(getTreeViewer());
-				}
-			}
-			editDomain = domain;
-		}
-	}
-
-	/**
-	 * the current viewer content listener
-	 */
-	private final ViewerContentListener viewerContentListener = new ViewerContentListener();
-
-	/**
-	 * This class listens for changes of the content of an EditPartViewer. If
-	 * the content changed, it will update the outline viewer.
-	 * <p>
-	 * Important: this class has to be disposed with
-	 * <code>setViewer(null)</code>.
-	 * 
-	 * @author Gunnar Wagenknecht
-	 */
-	private class ViewerContentListener implements EditPartListener {
-		/* the viewer */
-		private EditPartViewer _viewer;
-
-		/**
-		 * Sets a new viewer. <code>null</code> is allowed to dispose.
-		 * 
-		 * @param viewer
-		 */
-		public void setViewer(EditPartViewer viewer) {
-			if (null != this._viewer)
-				this._viewer.getRootEditPart().removeEditPartListener(this);
-
-			this._viewer = viewer;
-
-			if (null != this._viewer)
-				this._viewer.getRootEditPart().addEditPartListener(this);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.EditPartListener#childAdded(org.eclipse.gef.EditPart,
-		 *      int)
-		 */
-		public void childAdded(EditPart child, int index) {
-			// this is out event, update the viewers
-			if (child.getModel() instanceof PageflowElement)
-				setOutlineContent((PageflowElement) child.getModel());
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.EditPartListener#partActivated(org.eclipse.gef.EditPart)
-		 */
-		public void partActivated(EditPart editpart) {
-            // do nothing
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.EditPartListener#partDeactivated(org.eclipse.gef.EditPart)
-		 */
-		public void partDeactivated(EditPart editpart) {
-            // do nothing
-        }
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.EditPartListener#removingChild(org.eclipse.gef.EditPart,
-		 *      int)
-		 */
-		public void removingChild(EditPart child, int index) {
-            // do nothing
-        }
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.EditPartListener#selectedStateChanged(org.eclipse.gef.EditPart)
-		 */
-		public void selectedStateChanged(EditPart editpart) {
-            // do nothing
-		}
-	}
-
-	/**
-	 * Returns the viewer content listener.
-	 * 
-	 * @return the viewer content listener
-	 */
-	private ViewerContentListener getViewerContentListener() {
-		return viewerContentListener;
-	}
-
-	/**
-	 * Configures the specified <code>EditPartViewer</code>.
-	 * 
-	 * @param viewer
-	 */
-	protected void configureEditPartViewer(EditPartViewer viewer) {
-		// configure the shared key handler
-		if (viewer.getKeyHandler() != null) {
-			viewer.getKeyHandler().setParent(editor.getSharedKeyHandler());
-		}
-
-		// configure the context menu
-		ContextMenuProvider provider = new PageflowEditorContextMenuProvider(
-				viewer, editor.getActionRegistry());
-		viewer.setContextMenu(provider);
-		getSite().registerContextMenu(
-				EditorPlugin.getPluginId()
-						+ ".pageflow.editor.outlineview.contextmenu", provider,
-				getSite().getSelectionProvider()); //$NON-NLS-1$
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.java
deleted file mode 100644
index 64b31a6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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;
-
-public final class PageflowMessages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages";
-
-	private PageflowMessages() {
-		// Do not instantiate
-	}
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, PageflowMessages.class);
-	}
-
-	public static String Pageflow_Label_True;
-
-	public static String Pageflow_Label_False;
-
-	public static String Pageflow_Label_Saving;
-
-	public static String Pageflow_Dialog_Label_CreateFileTitle;
-
-	public static String Pageflow_Dialog_Label_FileNotExistedPart1;
-
-	public static String Pageflow_Dialog_Label_FileNotExistedPart2;
-
-	public static String Pageflow_Action_OpenEditor_Label;
-
-	public static String Pageflow_Action_OpenEditor_ToolTip;
-
-	public static String Pageflow_Action_ShowPropertyView_Label;
-
-	public static String Pageflow_Action_ShowPropertyView_ToolTip;
-
-	public static String Pageflow_Action_ShowPaletteView_Label;
-
-	public static String Pageflow_Action_ShowPaletteView_ToolTip;
-
-	public static String Pageflow_Action_SyncWithFacesConfig_Label;
-
-	public static String Pageflow_Action_SyncWithFacesConfig_ToolTip;
-
-	public static String Pageflow_Action_UpdateFacesConfig_Label;
-
-	public static String Pageflow_Action_UpdateFacesConfig_ToolTip;
-
-	public static String Pageflow_PaletteTool_Group_Controls;
-
-	public static String Pageflow_PaletteTool_Select_Label;
-
-	public static String Pageflow_PaletteTool_Select_Description;
-
-	public static String Pageflow_PaletteTool_Marquee_Label;
-
-	public static String Pageflow_PaletteTool_Marquee_Description;
-
-	public static String Pageflow_PaletteTool_Link_Label;
-
-	public static String Pageflow_PaletteTool_Link_Description;
-
-	public static String Pageflow_PaletteTool_Group_Nodes;
-
-	public static String Pageflow_PaletteTool_Begin_Label;
-
-	public static String Pageflow_PaletteTool_Begin_Description;
-
-	public static String Pageflow_PaletteTool_End_Label;
-
-	public static String Pageflow_PaletteTool_End_Description;
-
-	public static String Pageflow_PaletteTool_Action_Label;
-
-	public static String Pageflow_PaletteTool_Action_Description;
-
-	public static String Pageflow_PaletteTool_Page_Label;
-
-	public static String Pageflow_PaletteTool_Page_Description;
-
-	public static String Pageflow_Contextmenu_Align_Label;
-
-	public static String Pageflow_Contextmenu_ShowView_Label;
-
-	public static String Pageflow_Commands_AddNodeCommand_Label;
-
-	public static String Pageflow_Commands_CreateNodeCommand_Label;
-
-	public static String Pageflow_Commands_DeleteNodeCommand_Label;
-
-	public static String Pageflow_Commands_ConnectionCommand_Label;
-
-	public static String Pageflow_Commands_CreateBendpointCommand_Label;
-
-	public static String Pageflow_Commands_MoveBendpointCommand_Label;
-
-	public static String Pageflow_Commands_DeleteBendpointCommand_Label;
-
-	public static String Pageflow_Commands_OpenEditorCommand_Label;
-
-	public static String Pageflow_Commands_OrphanChildCommand_Label;
-
-	public static String Pageflow_Commands_UpdatePageflowCommand_Label;
-
-	public static String Pageflow_Commands_CreateNodeCommand_SelectJSPDialog_Title;
-
-	public static String Pageflow_Commands_CreateNodeCommand_SelectJSPDialog_Description;
-
-	public static String Pageflow_Model_Attributes_comment;
-
-	public static String Pageflow_Model_Attributes_name;
-
-	public static String Pageflow_Model_Attributes_largeicon;
-
-	public static String Pageflow_Model_Attributes_smallicon;
-
-	public static String Pageflow_Model_Attributes_action;
-
-	public static String Pageflow_Model_Attributes_path;
-
-	public static String Pageflow_Model_Attributes_begin;
-
-	public static String Pageflow_Model_Attributes_end;
-
-	public static String Pageflow_Model_Attributes_configfile;
-
-	public static String Pageflow_Model_Attributes_source;
-
-	public static String Pageflow_Model_Attributes_target;
-
-	public static String Pageflow_Model_Attributes_outcome;
-
-	public static String Pageflow_Model_Attributes_redirect;
-
-	public static String Pageflow_Model_Attributes_fromaction;
-
-	public static String Pageflow_Model_Attributes_referenceLink;
-
-	public static String Pageflow_Model_Items_Pageflow;
-
-	public static String Pageflow_Model_Items_PFPage;
-
-	public static String Pageflow_Model_Items_PFLink;
-
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_Choice;
-
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_Title;
-
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_JSPName;
-
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Title;
-
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Component;
-
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Action;
-
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_Outcome;
-
-	public static String Pageflow_Validation_UndefinedOutcome;
-
-	public static String Pageflow_Validation_NotExistedSourcePage;
-
-	public static String Pageflow_Validation_MissingSourcePage;
-
-	public static String Pageflow_Validation_InvalidWebPage;
-
-	public static String Pageflow_Validation_NotExitedWebPage;
-
-	public static String Pageflow_Validation_MissingWebPage;
-
-	public static String Pageflow_Validation_MissingManagedBean;
-
-	public static String Pageflow_Validation_MissingAction;
-
-	public static String ExistingPagePathDialogCellEdito_LabelText;
-
-	public static String PageflowLinkEditPart_FromAction;
-
-	public static String PageflowLinkEditPart_FromOutcome;
-}
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 ece4689..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.properties
+++ /dev/null
@@ -1,146 +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
-###############################################################################
-####################################################
-# Generic Strings for UI
-####################################################
-Pageflow_Label_True=true
-Pageflow_Label_False=false
-
-Pageflow_Label_Saving=Saving  
-
-Pageflow_Dialog_Label_CreateFileTitle=Create File
-Pageflow_Dialog_Label_FileNotExistedPart1=The file 
-Pageflow_Dialog_Label_FileNotExistedPart2=doesn't exist. Click OK to create it.
-
-####################################################
-# Generic Strings for Action and PaletteTool
-####################################################
-Pageflow_Action_OpenEditor_Label=Open
-Pageflow_Action_OpenEditor_ToolTip=Open Page or Action component
-
-Pageflow_Action_ShowPropertyView_Label=Properties
-Pageflow_Action_ShowPropertyView_ToolTip=Show Properties View
-
-Pageflow_Action_ShowPaletteView_Label=Palette
-Pageflow_Action_ShowPaletteView_ToolTip=Show Palette View
-
-Pageflow_Action_SyncWithFacesConfig_Label=Synchronize with Faces-config
-Pageflow_Action_SyncWithFacesConfig_ToolTip=Synchronizing PageFlow Model with Faces-config
-
-Pageflow_Action_UpdateFacesConfig_Label=Update Faces-config
-Pageflow_Action_UpdateFacesConfig_ToolTip=Update Faces-config File from The Current PageFlow
-
-Pageflow_PaletteTool_Group_Controls=Controls
-
-Pageflow_PaletteTool_Select_Label=Select
-Pageflow_PaletteTool_Select_Description=Select One or More Items
-
-Pageflow_PaletteTool_Marquee_Label=Marquee
-Pageflow_PaletteTool_Marquee_Description=Marquee One or More Items
-
-Pageflow_PaletteTool_Link_Label=Link
-Pageflow_PaletteTool_Link_Description=Creates a Link
-
-Pageflow_PaletteTool_Group_Nodes=Nodes
-
-Pageflow_PaletteTool_Begin_Label=Begin
-Pageflow_PaletteTool_Begin_Description=Creates a PageFlow Begin
-
-Pageflow_PaletteTool_End_Label=End
-Pageflow_PaletteTool_End_Description=Creates a PageFlow End
-
-Pageflow_PaletteTool_Action_Label=Action
-Pageflow_PaletteTool_Action_Description=Creates a PageFlow Action
-
-Pageflow_PaletteTool_Page_Label=Page
-Pageflow_PaletteTool_Page_Description=Creates a PageFlow Page
-
-Pageflow_Contextmenu_Align_Label=Align
-
-Pageflow_Contextmenu_ShowView_Label=Show View
-
-
-
-####################################################
-# Generic Strings for Commands
-####################################################
-Pageflow_Commands_AddNodeCommand_Label=Add
-Pageflow_Commands_CreateNodeCommand_Label=Create
-Pageflow_Commands_DeleteNodeCommand_Label=Delete
-
-Pageflow_Commands_ConnectionCommand_Label=Connection
-Pageflow_Commands_CreateBendpointCommand_Label=Create Bendpoint
-Pageflow_Commands_MoveBendpointCommand_Label=Move Bendpoint
-Pageflow_Commands_DeleteBendpointCommand_Label=Delete Bendpoint
-
-Pageflow_Commands_OpenEditorCommand_Label=Open
-Pageflow_Commands_OrphanChildCommand_Label=Orphan Child
-Pageflow_Commands_UpdatePageflowCommand_Label=Update Pageflow
-
-Pageflow_Commands_CreateNodeCommand_SelectJSPDialog_Title=Select JSP File
-Pageflow_Commands_CreateNodeCommand_SelectJSPDialog_Description=Please select a jsp file.
-
-####################################################
-# Generic Strings for property attribute name 
-####################################################
-Pageflow_Model_Attributes_comment=description
-Pageflow_Model_Attributes_name=display-name
-Pageflow_Model_Attributes_largeicon=large-icon
-Pageflow_Model_Attributes_smallicon=small-icon
-
-Pageflow_Model_Attributes_action=from-action
-Pageflow_Model_Attributes_path=path
-Pageflow_Model_Attributes_begin=begin
-Pageflow_Model_Attributes_end=end
-Pageflow_Model_Attributes_configfile=config file
-
-Pageflow_Model_Attributes_source = from-view-id
-Pageflow_Model_Attributes_target = to-view-id
-
-Pageflow_Model_Attributes_outcome=from-outcome
-Pageflow_Model_Attributes_redirect=redirect
-
-Pageflow_Model_Attributes_fromaction=from-action
-Pageflow_Model_Attributes_referenceLink=reference
-
-Pageflow_Model_Items_Pageflow=File
-Pageflow_Model_Items_PFPage=Page
-Pageflow_Model_Items_PFLink=Link
-
-
-Pageflow_Property_Action_OutcomeSelectionDialog_Choice=Enter the outcome or select one from action list below:
-
-Pageflow_Property_Action_OutcomeSelectionDialog_Title=Outcome Selection
-Pageflow_Property_Action_OutcomeSelectionDialog_JSPName=JSP File Name:
-Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Title=Actions
-Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Component=Component ID
-Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Action=Action
-
-Pageflow_Property_Action_OutcomeSelectionDialog_Outcome=Outcome:
-
-####################################################
-#Pageflow validation
-####################################################
-Pageflow_Validation_UndefinedOutcome=The outcome \''{0}\'' is not defined in previous page \''{1}\''.
-Pageflow_Validation_NotExistedSourcePage=The source page \''{0}\'' is not existed.
-Pageflow_Validation_MissingSourcePage=The source page should be specified.
-
-Pageflow_Validation_InvalidWebPage=The file \''{0}\'' is not valid web file.
-Pageflow_Validation_NotExitedWebPage=The web page  \''{0}\''  is not existed.
-Pageflow_Validation_MissingWebPage=The web page's path should be specified.
-
-Pageflow_Validation_MissingManagedBean=The managed bean \''{0}\'' is not defined.
-Pageflow_Validation_MissingAction=The action should be specified.
-
-ExistingPagePathDialogCellEdito_LabelText = Please enter or select a web page path:
-
-PageflowLinkEditPart_FromAction=fromAction:
-PageflowLinkEditPart_FromOutcome=fromOutcome:
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowPaletteRoot.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowPaletteRoot.java
deleted file mode 100644
index 679ca2c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowPaletteRoot.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
-import org.eclipse.gef.palette.ConnectionCreationToolEntry;
-import org.eclipse.gef.palette.MarqueeToolEntry;
-import org.eclipse.gef.palette.PaletteDrawer;
-import org.eclipse.gef.palette.PaletteGroup;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.palette.PaletteSeparator;
-import org.eclipse.gef.palette.SelectionToolEntry;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.ModelCreationFactory;
-
-/**
- * This is the root of the palette used by pageflow editors.
- */
-public class PageflowPaletteRoot extends PaletteRoot {
-
-	/**
-	 * Creates a new PageflowPaletteRoot instance.
-	 */
-	public PageflowPaletteRoot() {
-		// create root
-		super();
-
-		// a group of default control tools
-		// Pageflow.PaletteTool.Group.Controls = Controls
-		PaletteGroup controls = new PaletteGroup(
-				PageflowMessages.Pageflow_PaletteTool_Group_Controls); //$NON-NLS-1$
-		add(controls);
-
-		// the selection tool
-		// Pageflow.PaletteTool.Select.Label = Select
-		// Pageflow.PaletteTool.Select.Description = Select one or more items
-		ToolEntry tool = new SelectionToolEntry(
-				PageflowMessages.Pageflow_PaletteTool_Select_Label,
-				PageflowMessages.Pageflow_PaletteTool_Select_Description); //$NON-NLS-1$
-
-		controls.add(tool);
-
-		// use selection tool as default entry
-		setDefaultEntry(tool);
-
-		// the marquee selection tool
-		// Pageflow.PaletteTool.Marquee.Label = Marquee
-		// Pageflow.PaletteTool.Marquee.Description = Marquee one or more items
-		controls.add(new MarqueeToolEntry(
-				PageflowMessages.Pageflow_PaletteTool_Marquee_Label, //$NON-NLS-1$
-				PageflowMessages.Pageflow_PaletteTool_Marquee_Description));
-
-		controls.add(new PaletteSeparator());
-
-		// conection creation
-		// Pageflow.PaletteTool.Link.Label = Link
-		// Pageflow.PaletteTool.Link.Description = Creates an link
-		ConnectionCreationToolEntry linkEntry = new ConnectionCreationToolEntry(
-				PageflowMessages.Pageflow_PaletteTool_Link_Label,
-				PageflowMessages.Pageflow_PaletteTool_Link_Description,
-				new ModelCreationFactory(PageflowLink.class), EditorPlugin
-						.getDefault().getImageDescriptor(
-								"facesconfig/Pageflow_Link.gif"), //$NON-NLS-1$
-				EditorPlugin.getDefault().getImageDescriptor(
-						"facesconfig/Pageflow_Link24.gif")); //$NON-NLS-1$
-		linkEntry.setUserModificationPermission(PERMISSION_FULL_MODIFICATION);
-		controls.add(linkEntry);
-
-		controls.add(new PaletteSeparator());
-
-		// Pageflow.PaletteTool.Group.Nodes = Nodes
-		PaletteDrawer nodes = new PaletteDrawer(
-				PageflowMessages.Pageflow_PaletteTool_Group_Nodes); //$NON-NLS-1$
-		add(nodes);
-
-		// use CombinedTemplateCreationEntry which can be also dragged
-		CombinedTemplateCreationEntry entry;
-
-		// Pageflow.PaletteTool.Page.Label = Page
-		// Pageflow.PaletteTool.Page.Description = Creates a pageflow page
-		entry = new CombinedTemplateCreationEntry(
-				PageflowMessages.Pageflow_PaletteTool_Page_Label,
-				PageflowMessages.Pageflow_PaletteTool_Page_Description,
-				PageflowPage.class,
-				new ModelCreationFactory(PageflowPage.class), EditorPlugin
-						.getDefault().getImageDescriptor(
-								"facesconfig/Pageflow_Page16.gif"), //$NON-NLS-1$
-				EditorPlugin.getDefault().getImageDescriptor(
-						"facesconfig/Pageflow_Page24.gif")); //$NON-NLS-1$
-		nodes.add(entry);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowTemplateTransferDropTargetListener.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowTemplateTransferDropTargetListener.java
deleted file mode 100644
index 4c4a8a4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowTemplateTransferDropTargetListener.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.dnd.TemplateTransferDropTargetListener;
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.ModelCreationFactory;
-
-/**
- * This is the drop listener for template transfers from the palette. Only need
- * to implement the <code>getFactory</code> method.
- */
-public class PageflowTemplateTransferDropTargetListener extends
-		TemplateTransferDropTargetListener {
-	/**
-	 * Creates a new PageflowTemplateTransferDropTargetListener instance.
-	 * 
-	 * @param viewer -
-	 *            target pageflow editor view.
-	 */
-	public PageflowTemplateTransferDropTargetListener(EditPartViewer viewer) {
-		super(viewer);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see TemplateTransferDropTargetListener#getFactory(Object)
-	 */
-	protected CreationFactory getFactory(Object template) {
-		if (template instanceof Class) {
-			return new ModelCreationFactory((Class) template);
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/ResourceTransferDropTargetListener.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/ResourceTransferDropTargetListener.java
deleted file mode 100644
index f9ca215..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/ResourceTransferDropTargetListener.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.dnd.AbstractTransferDropTargetListener;
-import org.eclipse.gef.requests.CreateRequest;
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.part.ResourceTransfer;
-import org.eclipse.ui.views.navigator.LocalSelectionTransfer;
-
-/**
- * This is the listener for resource drag and drop operations
- * 
- */
-public abstract class ResourceTransferDropTargetListener extends
-		AbstractTransferDropTargetListener {
-	/** the pageflow editor */
-	private IEditorPart editor = null;
-
-	/**
-	 * Creates a new ResourceTransferDropTargetListener instance.
-	 * 
-	 * @param viewer -
-	 *            target pageflow editor view.
-	 */
-	public ResourceTransferDropTargetListener(EditPartViewer viewer,
-			IEditorPart editor) {
-		super(viewer, ResourceTransfer.getInstance());
-
-		this.editor = editor;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTransferDropTargetListener#createTargetRequest()
-	 */
-	protected Request createTargetRequest() {
-		CreateRequest request = new CreateRequest();
-		if (getCurrentEvent().data == null) {
-			request.setFactory(getFactory(null));
-		} else {
-			IResource[] resources = (IResource[]) getCurrentEvent().data;
-			request.setFactory(getFactory(resources[0]));
-		}
-		return request;
-	}
-
-	/**
-	 * get the request for creating a new resource object
-	 * 
-	 * @return - creation request
-	 */
-	protected final CreateRequest getCreateRequest() {
-		return (CreateRequest) getTargetRequest();
-	}
-
-	/**
-	 * get creation factory for resource object, which should be implemented.
-	 * 
-	 * @param obj -
-	 *            resource object
-	 * @return - creation factory for resource object
-	 */
-	abstract protected CreationFactory getFactory(Object obj);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTransferDropTargetListener#handleDragOperationChanged()
-	 */
-	protected void handleDragOperationChanged() {
-		getCurrentEvent().detail = DND.DROP_COPY;
-		super.handleDragOperationChanged();
-	}
-
-	/**
-	 * get the current transfered local selection object.
-	 * 
-	 * @return
-	 */
-	private Object getCurrentLocalObject() {
-		ISelection sel = LocalSelectionTransfer.getInstance().getSelection();
-		if (sel instanceof IStructuredSelection) {
-			return ((IStructuredSelection) sel).getFirstElement();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTransferDropTargetListener#handleDragOver()
-	 */
-	protected void handleDragOver() {
-		if (!isValidJSFFile(getCurrentLocalObject())) {
-			getCurrentEvent().detail = DND.ERROR_INVALID_DATA;
-		} else {
-			getCurrentEvent().detail = DND.DROP_COPY;
-		}
-		getCurrentEvent().feedback = DND.FEEDBACK_SCROLL | DND.FEEDBACK_EXPAND;
-		super.handleDragOver();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTransferDropTargetListener#handleDrop()
-	 */
-	protected void handleDrop() {
-		getCurrentEvent().detail = DND.DROP_COPY;
-		super.handleDrop();
-		// because the handle drop can change this event to DND.DROP_NONE
-		if (getCurrentEvent().detail == DND.DROP_COPY) {
-			selectAddedObject();
-		}
-	}
-
-	/**
-	 * select the new drag and drop object in the pageflow view.
-	 */
-	private void selectAddedObject() {
-		Object model = getCreateRequest().getNewObject();
-		if (null == model) {
-			return;
-		}
-		EditPartViewer viewer = getViewer();
-		Object editpart = viewer.getEditPartRegistry().get(model);
-		if (editpart instanceof EditPart) {
-			viewer.flush();
-			viewer.select((EditPart) editpart);
-			// Activate the editor window
-			PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-					.getActivePage().activate(editor);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTransferDropTargetListener#updateTargetRequest()
-	 */
-	protected void updateTargetRequest() {
-		CreateRequest request = getCreateRequest();
-		request.setLocation(getDropLocation());
-	}
-
-	/**
-	 * Allow drop if any of these types in the drop data, which can be jsp file
-	 * or a sub folder of the webroot folder.
-	 * 
-	 */
-	private boolean isValidJSFFile(Object resource) {
-		if (resource == null || !(resource instanceof IResource)) {
-			return false;
-		}
-
-		if (((IResource) resource).getProject() == ((FileEditorInput) editor
-				.getEditorInput()).getFile().getProject()) {
-			if (WebrootUtil.getWebPath(((IResource) resource).getFullPath())
-					.length() > 0) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTransferDropTargetListener#isEnabled()
-	 */
-	public boolean isEnabled(DropTargetEvent dropTargetEvent) {
-		if (super.isEnabled(dropTargetEvent)) {
-			if (dropTargetEvent.data != null) {
-				IResource[] resources = (IResource[]) dropTargetEvent.data;
-				// The resource should be under the same project of the current
-				// faces-config file
-				if (isValidJSFFile(resources[0])) {
-					return true;
-				}
-				return false;
-			}
-			// If no data, can't verify, so allow the drop
-			return true;
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/AlignmentAction.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/AlignmentAction.java
deleted file mode 100644
index e108d8e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/AlignmentAction.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.action;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.PrecisionRectangle;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gef.requests.AlignmentRequest;
-import org.eclipse.gef.tools.ToolUtilities;
-import org.eclipse.gef.ui.actions.GEFActionConstants;
-import org.eclipse.gef.ui.actions.SelectionAction;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * An improved alignment action to align the selected parts in different action.
- * 
- * @author xgzhang
- * @version original version is from GEF
- */
-public final class AlignmentAction extends SelectionAction {
-
-	/**
-	 * Indicates that the bottom edges should be aligned.
-	 */
-	public static final String ID_ALIGN_BOTTOM = GEFActionConstants.ALIGN_BOTTOM;
-
-	/**
-	 * Indicates that the horizontal centers should be aligned.
-	 */
-	public static final String ID_ALIGN_CENTER = GEFActionConstants.ALIGN_CENTER;
-
-	/**
-	 * Indicates that the left edges should be aligned.
-	 */
-	public static final String ID_ALIGN_LEFT = GEFActionConstants.ALIGN_LEFT;
-
-	/**
-	 * Indicates that the vertical midpoints should be aligned.
-	 */
-	public static final String ID_ALIGN_MIDDLE = GEFActionConstants.ALIGN_MIDDLE;
-
-	/**
-	 * Indicates that the right edges should be aligned.
-	 */
-	public static final String ID_ALIGN_RIGHT = GEFActionConstants.ALIGN_RIGHT;
-
-	/**
-	 * Indicates that the top edges should be aligned.
-	 */
-	public static final String ID_ALIGN_TOP = GEFActionConstants.ALIGN_TOP;
-
-	private int alignment;
-
-	private List operationSet;
-
-	/**
-	 * @deprecated use AlignmentAction(IWorkbenchPart, int align)
-	 * @param editor
-	 *            the editor
-	 * @param align
-	 *            the alignment ID
-	 */
-	public AlignmentAction(IEditorPart editor, int align) {
-		this((IWorkbenchPart) editor, align);
-	}
-
-	/**
-	 * Constructs an AlignmentAction with the given part and alignment ID. The
-	 * alignment ID must by one of:
-	 * <UL>
-	 * <LI>GEFActionConstants.ALIGN_LEFT
-	 * <LI>GEFActionConstants.ALIGN_RIGHT
-	 * <LI>GEFActionConstants.ALIGN_CENTER
-	 * <LI>GEFActionConstants.ALIGN_TOP
-	 * <LI>GEFActionConstants.ALIGN_BOTTOM
-	 * <LI>GEFActionConstants.ALIGN_MIDDLE
-	 * </UL>
-	 * 
-	 * @param part
-	 *            the workbench part used to obtain context
-	 * @param align
-	 *            the aligment ID.
-	 */
-	public AlignmentAction(IWorkbenchPart part, int align) {
-		super(part);
-		alignment = align;
-		initUI();
-	}
-
-	/**
-	 * Returns the alignment rectangle to which all selected parts should be
-	 * aligned.
-	 * 
-	 * @param request
-	 *            the alignment Request
-	 * @return the alignment rectangle
-	 */
-	protected Rectangle calculateAlignmentRectangle(Request request) {
-		List editparts = getOperationSet(request);
-		if (editparts == null || editparts.isEmpty()) {
-			return null;
-		}
-		GraphicalEditPart part = null;
-		if (alignment == PositionConstants.MIDDLE
-				|| alignment == PositionConstants.CENTER) {
-			part = (GraphicalEditPart) editparts.get(editparts.size() - 1);
-		} else {
-			part = getFitnessPart(editparts);
-		}
-		Rectangle rect = new PrecisionRectangle(part.getFigure().getBounds());
-		part.getFigure().translateToAbsolute(rect);
-		return rect;
-	}
-
-	/**
-	 * get the Fitness part in the four kinds of alignment directions
-	 * 
-	 * @param editparts
-	 */
-	private GraphicalEditPart getFitnessPart(List editparts) {
-		if (alignment == PositionConstants.MIDDLE
-				|| alignment == PositionConstants.CENTER) {
-			return null;
-		}
-
-		int positionComparor = Integer.MAX_VALUE;
-
-		if (alignment == PositionConstants.LEFT
-				|| alignment == PositionConstants.TOP) {
-			positionComparor = Integer.MAX_VALUE;
-		} else if (alignment == PositionConstants.RIGHT
-				|| alignment == PositionConstants.BOTTOM) {
-			positionComparor = Integer.MIN_VALUE;
-		}
-
-		GraphicalEditPart fitnessPart = null;
-
-		for (Iterator iter = editparts.iterator(); iter.hasNext();) {
-			GraphicalEditPart part = (GraphicalEditPart) iter.next();
-			Rectangle rectPart = part.getFigure().getBounds();
-			switch (alignment) {
-			case PositionConstants.LEFT:
-				if (rectPart.getLeft().x < positionComparor) {
-					fitnessPart = part;
-					positionComparor = rectPart.getLeft().x;
-				}
-				break;
-
-			case PositionConstants.RIGHT:
-				if (rectPart.getRight().x > positionComparor) {
-					fitnessPart = part;
-					positionComparor = rectPart.getRight().x;
-				}
-				break;
-			case PositionConstants.TOP:
-				if (rectPart.getTop().y < positionComparor) {
-					fitnessPart = part;
-					positionComparor = rectPart.getTop().y;
-				}
-				break;
-			case PositionConstants.BOTTOM:
-				if (rectPart.getBottom().y > positionComparor) {
-					fitnessPart = part;
-					positionComparor = rectPart.getBottom().y;
-				}
-				break;
-			}
-		}
-
-		return fitnessPart;
-	}
-
-	/**
-	 * @see org.eclipse.gef.ui.actions.WorkbenchPartAction#calculateEnabled()
-	 */
-	protected boolean calculateEnabled() {
-		operationSet = null;
-		Command cmd = createAlignmentCommand();
-		if (cmd == null) {
-			return false;
-		}
-		return cmd.canExecute();
-	}
-
-	private Command createAlignmentCommand() {
-		AlignmentRequest request = new AlignmentRequest(
-				RequestConstants.REQ_ALIGN);
-		request.setAlignmentRectangle(calculateAlignmentRectangle(request));
-		request.setAlignment(alignment);
-		List editparts = getOperationSet(request);
-		if (editparts.size() < 2) {
-			return null;
-		}
-
-		CompoundCommand command = new CompoundCommand();
-		command.setDebugLabel(getText());
-		for (int i = 0; i < editparts.size(); i++) {
-			EditPart editpart = (EditPart) editparts.get(i);
-			command.add(editpart.getCommand(request));
-		}
-		return command;
-	}
-
-	/**
-	 * @see org.eclipse.gef.Disposable#dispose()
-	 */
-	public void dispose() {
-		operationSet = Collections.EMPTY_LIST;
-		super.dispose();
-	}
-
-	/**
-	 * Returns the list of editparts which will participate in alignment.
-	 * 
-	 * @param request
-	 *            the alignment request
-	 * @return the list of parts which will be aligned
-	 */
-	protected List getOperationSet(Request request) {
-		if (operationSet != null) {
-			return operationSet;
-		}
-		List editparts = new ArrayList(getSelectedObjects());
-		if (editparts.isEmpty()
-				|| !(editparts.get(0) instanceof GraphicalEditPart)) {
-			return Collections.EMPTY_LIST;
-		}
-		Object primary = editparts.get(editparts.size() - 1);
-		editparts = ToolUtilities.getSelectionWithoutDependants(editparts);
-		ToolUtilities.filterEditPartsUnderstanding(editparts, request);
-		if (editparts.size() < 2 || !editparts.contains(primary)) {
-			return Collections.EMPTY_LIST;
-		}
-		EditPart parent = ((EditPart) editparts.get(0)).getParent();
-		for (int i = 1; i < editparts.size(); i++) {
-			EditPart part = (EditPart) editparts.get(i);
-			if (part.getParent() != parent) {
-				return Collections.EMPTY_LIST;
-			}
-		}
-		return editparts;
-	}
-
-	/**
-	 * Initializes the actions UI presentation.
-	 */
-	protected void initUI() {
-		switch (alignment) {
-		case PositionConstants.LEFT:
-			setId(GEFActionConstants.ALIGN_LEFT);
-			setText(EditorMessages.AlignmentAction_AlignLeftAction_Label);
-			setToolTipText(EditorMessages.AlignmentAction_AlignLeftAction_Tooltip);
-			setImageDescriptor(InternalImages.DESC_HORZ_ALIGN_LEFT);
-			setDisabledImageDescriptor(InternalImages.DESC_HORZ_ALIGN_LEFT_DIS);
-			break;
-
-		case PositionConstants.RIGHT:
-			setId(GEFActionConstants.ALIGN_RIGHT);
-			setText(EditorMessages.AlignmentAction_AlignRightAction_Label);
-			setToolTipText(EditorMessages.AlignmentAction_AlignRightAction_Tooltip);
-			setImageDescriptor(InternalImages.DESC_HORZ_ALIGN_RIGHT);
-			setDisabledImageDescriptor(InternalImages.DESC_HORZ_ALIGN_RIGHT_DIS);
-			break;
-
-		case PositionConstants.TOP:
-			setId(GEFActionConstants.ALIGN_TOP);
-			setText(EditorMessages.AlignmentAction_AlignTopAction_Label);
-			setToolTipText(EditorMessages.AlignmentAction_AlignTopAction_Tooltip);
-			setImageDescriptor(InternalImages.DESC_VERT_ALIGN_TOP);
-			setDisabledImageDescriptor(InternalImages.DESC_VERT_ALIGN_TOP_DIS);
-			break;
-
-		case PositionConstants.BOTTOM:
-			setId(GEFActionConstants.ALIGN_BOTTOM);
-			setText(EditorMessages.AlignmentAction_AlignBottomAction_Label);
-			setToolTipText(EditorMessages.AlignmentAction_AlignBottomAction_Tooltip);
-			setImageDescriptor(InternalImages.DESC_VERT_ALIGN_BOTTOM);
-			setDisabledImageDescriptor(InternalImages.DESC_VERT_ALIGN_BOTTOM_DIS);
-			break;
-
-		case PositionConstants.CENTER:
-			setId(GEFActionConstants.ALIGN_CENTER);
-			setText(EditorMessages.AlignmentAction_AlignCenterAction_Label);
-			setToolTipText(EditorMessages.AlignmentAction_AlignCenterAction_Tooltip);
-			setImageDescriptor(InternalImages.DESC_HORZ_ALIGN_CENTER);
-			setDisabledImageDescriptor(InternalImages.DESC_HORZ_ALIGN_CENTER_DIS);
-			break;
-
-		case PositionConstants.MIDDLE:
-			setId(GEFActionConstants.ALIGN_MIDDLE);
-			setText(EditorMessages.AlignmentAction_AlignMiddleAction_Label);
-			setToolTipText(EditorMessages.AlignmentAction_AlignMiddleAction_Tooltip);
-			setImageDescriptor(InternalImages.DESC_VERT_ALIGN_MIDDLE);
-			setDisabledImageDescriptor(InternalImages.DESC_VERT_ALIGN_MIDDLE_DIS);
-			break;
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		operationSet = null;
-		execute(createAlignmentCommand());
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/InternalImages.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/InternalImages.java
deleted file mode 100644
index 8daa9ba..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/InternalImages.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.action;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * Supplies image descriptors, intended for internal use only.
- * 
- * @author Ian Trimble - Oracle
- */
-public class InternalImages {
-
-	/**
-	 * ImageDescriptor instance for center alignment image.
-	 */
-	public static final ImageDescriptor DESC_HORZ_ALIGN_CENTER;
-
-	/**
-	 * ImageDescriptor instance for left alignment image.
-	 */
-	public static final ImageDescriptor DESC_HORZ_ALIGN_LEFT;
-
-	/**
-	 * ImageDescriptor instance for right alignment image.
-	 */
-	public static final ImageDescriptor DESC_HORZ_ALIGN_RIGHT;
-
-	/**
-	 * ImageDescriptor instance for middle alignment image.
-	 */
-	public static final ImageDescriptor DESC_VERT_ALIGN_MIDDLE;
-
-	/**
-	 * ImageDescriptor instance for top alignment image.
-	 */
-	public static final ImageDescriptor DESC_VERT_ALIGN_TOP;
-
-	/**
-	 * ImageDescriptor instance for bottom alignment image.
-	 */
-	public static final ImageDescriptor DESC_VERT_ALIGN_BOTTOM;
-
-	/**
-	 * ImageDescriptor instance for center alignment image (disabled).
-	 */
-	public static final ImageDescriptor DESC_HORZ_ALIGN_CENTER_DIS;
-
-	/**
-	 * ImageDescriptor instance for left alignment image (disabled).
-	 */
-	public static final ImageDescriptor DESC_HORZ_ALIGN_LEFT_DIS;
-
-	/**
-	 * ImageDescriptor instance for right alignment image (disabled).
-	 */
-	public static final ImageDescriptor DESC_HORZ_ALIGN_RIGHT_DIS;
-
-	/**
-	 * ImageDescriptor instance for middle alignment image (disabled).
-	 */
-	public static final ImageDescriptor DESC_VERT_ALIGN_MIDDLE_DIS;
-
-	/**
-	 * ImageDescriptor instance for top alignment image (disabled).
-	 */
-	public static final ImageDescriptor DESC_VERT_ALIGN_TOP_DIS;
-
-	/**
-	 * ImageDescriptor instance for bottom alignment image (disabled).
-	 */
-	public static final ImageDescriptor DESC_VERT_ALIGN_BOTTOM_DIS;
-
-	static {
-		DESC_VERT_ALIGN_BOTTOM = createDescriptor("icons/alignbottom.gif"); //$NON-NLS-1$
-		DESC_HORZ_ALIGN_CENTER = createDescriptor("icons/aligncenter.gif"); //$NON-NLS-1$
-		DESC_HORZ_ALIGN_LEFT = createDescriptor("icons/alignleft.gif"); //$NON-NLS-1$
-		DESC_VERT_ALIGN_MIDDLE = createDescriptor("icons/alignmid.gif"); //$NON-NLS-1$
-		DESC_HORZ_ALIGN_RIGHT = createDescriptor("icons/alignright.gif"); //$NON-NLS-1$
-		DESC_VERT_ALIGN_TOP = createDescriptor("icons/aligntop.gif"); //$NON-NLS-1$
-		DESC_VERT_ALIGN_BOTTOM_DIS = createDescriptor("icons/alignbottom_d.gif"); //$NON-NLS-1$
-		DESC_HORZ_ALIGN_CENTER_DIS = createDescriptor("icons/aligncenter_d.gif"); //$NON-NLS-1$
-		DESC_HORZ_ALIGN_LEFT_DIS = createDescriptor("icons/alignleft_d.gif"); //$NON-NLS-1$
-		DESC_VERT_ALIGN_MIDDLE_DIS = createDescriptor("icons/alignmid_d.gif"); //$NON-NLS-1$
-		DESC_HORZ_ALIGN_RIGHT_DIS = createDescriptor("icons/alignright_d.gif"); //$NON-NLS-1$
-		DESC_VERT_ALIGN_TOP_DIS = createDescriptor("icons/aligntop_d.gif"); //$NON-NLS-1$
-	}
-
-	private static ImageDescriptor createDescriptor(String filename) {
-		return ImageDescriptor.createFromFile(InternalImages.class, filename);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/OpenEditorAction.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/OpenEditorAction.java
deleted file mode 100644
index 7c27eab..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/OpenEditorAction.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.action;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gef.ui.actions.SelectionAction;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * 
- * This is the Action for opening a JSP page in the default JSP Editor from a
- * Pageflow Diagram
- * 
- */
-public class OpenEditorAction extends SelectionAction {
-	/** The name of the request */
-	public static final String OPEN_EDITOR_REQUEST = PageflowMessages.Pageflow_Commands_OpenEditorCommand_Label;
-
-	/** The request */
-	Request request;
-
-	/**
-	 * The constructor
-	 * 
-	 * @param part -
-	 *            the IWorkbenchPart
-	 */
-	public OpenEditorAction(IWorkbenchPart part) {
-		super(part);
-		request = new Request(OPEN_EDITOR_REQUEST);
-		// Pageflow.Action.OpenEditor.Label = Edit Page
-		setText(PageflowMessages.Pageflow_Action_OpenEditor_Label);
-		setId(FacesConfigEditor.EDITOR_ID);
-		// Pageflow.Action.OpenEditor.ToolTip = Edit this page
-		setToolTipText(PageflowMessages.Pageflow_Action_OpenEditor_ToolTip);
-	}
-
-	/**
-	 * Determines if the action can be enabled
-	 * 
-	 * @return boolean - the enabled state
-	 */
-	protected boolean calculateEnabled() {
-		return canPerformAction();
-	}
-
-	/**
-	 * Determines if the action can be performed
-	 * 
-	 * @return boolean - the perform state
-	 */
-	private boolean canPerformAction() {
-		if (getSelectedObjects().isEmpty()) {
-			return false;
-		}
-		List parts = getSelectedObjects();
-		for (int i = 0; i < parts.size(); i++) {
-			Object o = parts.get(i);
-			if (!(o instanceof EditPart)) {
-				return false;
-			}
-			EditPart part = (EditPart) o;
-			if (!(part.getModel() instanceof PageflowPage)) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Returns the command for the action
-	 * 
-	 * @return Command - the action command
-	 */
-	private Command getCommand() {
-		List editparts = getSelectedObjects();
-		CompoundCommand cc = new CompoundCommand();
-		cc.setDebugLabel(OPEN_EDITOR_REQUEST);
-		for (int i = 0; i < editparts.size(); i++) {
-			EditPart part = (EditPart) editparts.get(i);
-			cc.add(part.getCommand(request));
-		}
-		return cc;
-	}
-
-	/**
-	 * Runs the command
-	 */
-	public void run() {
-		execute(getCommand());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.actions.WorkbenchPartAction#execute(org.eclipse.gef.commands.Command)
-	 */
-	protected void execute(Command command) {
-		if (command == null || !command.canExecute()) {
-			return;
-		}
-		command.execute();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/ShowPropertyViewAction.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/ShowPropertyViewAction.java
deleted file mode 100644
index 320660c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/ShowPropertyViewAction.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.action;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.ui.actions.SelectionAction;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * 
- * This is the Action for opening a JSP page in the default JSP Editor from a
- * Pageflow Diagram
- * 
- * @author Xiao-guang Zhang
- */
-public class ShowPropertyViewAction extends SelectionAction {
-	/** log instance */
-	private static final Logger log = EditorPlugin
-			.getLogger(ShowPropertyViewAction.class);
-
-	/** The ID of the action */
-	public static final String SHOW_PROPERTY_VIEW = "org.eclipse.jst.jsf.facesconfig.ui.pageflow.action.ShowPropertyViewAction"; //$NON-NLS-1$ 
-
-	/**
-	 * The constructor
-	 * 
-	 * @param part -
-	 *            the IWorkbenchPart
-	 */
-	public ShowPropertyViewAction(IWorkbenchPart part) {
-		super(part);
-		// Pageflow.Action.ShowPropertyView.Label = Properties
-		setText(PageflowMessages.Pageflow_Action_ShowPropertyView_Label); //$NON-NLS-1$
-		setId(SHOW_PROPERTY_VIEW);
-		// Pageflow.Action.ShowPropertyView.ToolTip = Show properties
-		setToolTipText(PageflowMessages.Pageflow_Action_ShowPropertyView_ToolTip); //$NON-NLS-1$
-	}
-
-	/**
-	 * Determines if the action can be enabled
-	 * 
-	 * @return boolean - the enabled state
-	 */
-	protected boolean calculateEnabled() {
-		return canPerformAction();
-	}
-
-	/**
-	 * Determines if the action can be performed
-	 * 
-	 * @return boolean - the perform state
-	 */
-	private boolean canPerformAction() {
-		if (getSelectedObjects().isEmpty()) {
-			return false;
-		}
-		List parts = getSelectedObjects();
-		for (int i = 0; i < parts.size(); i++) {
-			Object o = parts.get(i);
-			if (!(o instanceof EditPart)) {
-				return false;
-			}
-			EditPart part = (EditPart) o;
-			if (!((part.getModel() instanceof PageflowElement))) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Runs the command
-	 */
-	public void run() {
-		List editparts = getSelectedObjects();
-		if (editparts.size() > 0) {
-			EditPart part = (EditPart) editparts.get(0);
-			// execute(getCommand());
-			if (part.getModel() instanceof PageflowElement) {
-				// ensure the visibility of the palette view and property veiw.
-				IWorkbenchWindow dw = PlatformUI.getWorkbench()
-						.getActiveWorkbenchWindow();
-				IWorkbenchPage page = dw.getActivePage();
-				if (page != null) {
-					try {
-						page.showView("org.eclipse.ui.views.PropertySheet");
-					} catch (PartInitException e) {
-						// Pageflow.PageflowEditor.Error.canNotShowPropertyView
-						// = Failed to show property sheet view.
-						log
-								.error(
-										"Pageflow.PageflowEditor.Error.canNotShowPropertyView",
-										e);
-					}
-
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignbottom.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignbottom.gif
deleted file mode 100644
index 9eea558..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignbottom.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignbottom_d.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignbottom_d.gif
deleted file mode 100644
index 1c62797..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignbottom_d.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligncenter.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligncenter.gif
deleted file mode 100644
index 4e8c94a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligncenter.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligncenter_d.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligncenter_d.gif
deleted file mode 100644
index ceeafb7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligncenter_d.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignleft.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignleft.gif
deleted file mode 100644
index 55cecc2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignleft.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignleft_d.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignleft_d.gif
deleted file mode 100644
index 60fcc8f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignleft_d.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignmid.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignmid.gif
deleted file mode 100644
index 5f13c93..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignmid.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignmid_d.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignmid_d.gif
deleted file mode 100644
index 2f7534e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignmid_d.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignright.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignright.gif
deleted file mode 100644
index f6ead15..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignright.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignright_d.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignright_d.gif
deleted file mode 100644
index 0495ed5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignright_d.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligntop.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligntop.gif
deleted file mode 100644
index 2f9ceeb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligntop.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligntop_d.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligntop_d.gif
deleted file mode 100644
index 9f1b49b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligntop_d.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/AbstractBatchEditCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/AbstractBatchEditCommand.java
deleted file mode 100644
index 4cd06f0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/AbstractBatchEditCommand.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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
- */
-
-public abstract class AbstractBatchEditCommand extends Command {
-	Pageflow pageflow;
-
-	public AbstractBatchEditCommand(Pageflow pageflow) {
-		super();
-		this.pageflow = pageflow;
-	}
-
-	public AbstractBatchEditCommand(Pageflow pageflow, String label) {
-		super(label);
-		this.pageflow = 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();
-
-	public void doRedo() {
-		execute();
-	}
-
-	abstract void doUndo();
-
-	final void preExecute() {
-		getPageflow().eNotify(
-				new ENotificationImpl((InternalEObject) getPageflow(),
-						FC2PFTransformer.MY_NOTIFICATION_TYPE,
-						PageflowPackage.PAGEFLOW, null, null));
-	}
-
-	final protected void postExecute() {
-		getPageflow().eNotify(
-				new ENotificationImpl((InternalEObject) getPageflow(),
-						FC2PFTransformer.MY_NOTIFICATION_TYPE1,
-						PageflowPackage.PAGEFLOW, null, null));
-		notifyPageflow(getPageflow());
-	}
-
-	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 2fcc0d5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/AddNodeCommand.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.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;
-
-	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.
-	 * 
-	 */
-	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 cf03f6c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/BendpointCommand.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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.
- * 
- */
-public 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;
-
-	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 27b1c18..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/ConnectionCommand.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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;
-
-	public ConnectionCommand() {
-		super(PageflowMessages.Pageflow_Commands_ConnectionCommand_Label);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#canExecute()
-	 */
-	public boolean canExecute() {
-		return TransformUtil.isValidPageflowElement(link);
-	}
-
-	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 61a6c16..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/ConnectionCommandFactory.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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 {
-	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 0de57b9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/CreateBendpointCommand.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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 {
-	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 723e1fc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/CreateNodeCommand.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonResourceDialog;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchWindow;
-
-/**
- * This is the creation command for pageflow editpart
- * 
- * @author Xiao-guang Zhang
- */
-public class CreateNodeCommand extends Command implements IPreExecuteCommand {
-	private static final String UNNAMED_NODE = "unnamed";
-
-	/** new pageflow node */
-	private PageflowNode child;
-
-	/** size of pageflow node figure */
-	private Rectangle rect;
-
-	/** parent pageflow */
-	private Pageflow parent;
-
-	/** index of pageflow nodes */
-	// private int _index = -1;
-	public CreateNodeCommand() {
-		// Pageflow.Commands.CreateNodeCommand.Label = Create new node
-		super(PageflowMessages.Pageflow_Commands_CreateNodeCommand_Label);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		return child != null && parent != null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#execute()
-	 */
-	public void execute() {
-		if (rect != null) {
-			child.setX(rect.x);
-			child.setY(rect.y);
-			if (!rect.isEmpty()) {
-				child.setHeight(rect.getSize().height);
-				child.setWidth(rect.getSize().width);
-			}
-		}
-
-		if (child.getName() == UNNAMED_NODE) {
-			child.setName(parent.getDefaultNodeName(child.getClass()));
-		}
-
-		parent.getNodes().add(child);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#redo()
-	 */
-	public void redo() {
-		if (rect != null) {
-			child.setX(rect.x);
-			child.setY(rect.y);
-			if (!rect.isEmpty()) {
-				child.setHeight(rect.getSize().height);
-				child.setWidth(rect.getSize().width);
-			}
-		}
-
-		parent.getNodes().add(child);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#undo()
-	 */
-	public void undo() {
-		parent.getNodes().remove(child);
-	}
-
-	/**
-	 * select a jsp page in current project.
-	 * 
-	 * @return
-	 */
-	private boolean selectJSPPage() {
-
-		Shell shell = null;
-		IWorkbenchWindow workbenchWindow = EditorPlugin
-				.getActiveWorkbenchWindow();
-		if (workbenchWindow.getShell() != null) {
-			shell = workbenchWindow.getShell();
-		} else {
-			shell = new Shell();
-		}
-		IProject project = WebrootUtil.getProject(getParent());
-
-		CommonResourceDialog dialog = new CommonResourceDialog(shell, project,
-				SWT.NONE);
-
-		dialog
-				.setTitle(PageflowMessages.Pageflow_Commands_CreateNodeCommand_SelectJSPDialog_Title);
-		dialog.setSuffixs(WebrootUtil.getJSPFileExtensions());
-		dialog
-				.setResourceDescription(PageflowMessages.Pageflow_Commands_CreateNodeCommand_SelectJSPDialog_Description);
-
-		if (dialog.open() == Window.OK) {
-			Object[] result = dialog.getResult();
-			if (result != null) {
-				IFile jspFile = (IFile) result[0];
-				if (jspFile != null) {
-					// get the project path for the new created file, i.e.,
-					// /project/webroot/*.jsp
-					String jsfSelection = WebrootUtil.getWebPath(jspFile
-							.getFullPath());
-					if (jsfSelection != null && jsfSelection.length() > 0) {
-						if (PageflowValidation.getInstance().isExistedPage(
-								this.parent, jsfSelection)) {
-							// Pageflow.PageflowEditor.Alert.DNDResourceTitle =
-							// Pageflow Creation Error
-							// Pageflow.PageflowEditor.Alert.ExistingPage = The
-							// web page {0} is already existed in current
-							// PageFlow.
-							EditorPlugin
-									.getAlerts()
-									.error(
-											"Pageflow.PageflowEditor.Alert.DNDResourceTitle",
-											"Pageflow.PageflowEditor.Alert.ExistingPage",
-											jsfSelection);
-							return false;
-						}
-
-						((PageflowPage) (child)).setPath(jsfSelection);
-						((PageflowPage) (child)).setName(WebrootUtil
-								.getPageNameFromWebPath(jsfSelection));
-					}
-
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * call the JSF wizard to create a new jsf page.
-	 * 
-	 * 
-	 */
-	public Pageflow getParent() {
-		return parent;
-	}
-
-	/**
-	 * set the child node
-	 * 
-	 * @param subpart -
-	 *            new child pageflow node
-	 */
-	public void setChild(PageflowNode subpart) {
-		child = subpart;
-	}
-
-	/**
-	 * set the location of the new pageflow node
-	 * 
-	 * @param r -
-	 *            location of the new pageflow node
-	 */
-	public void setLocation(Rectangle r) {
-		rect = r;
-	}
-
-	/**
-	 * set the parent pageflow
-	 * 
-	 * @param newParent -
-	 *            the new parent pageflow
-	 */
-	public void setParent(Pageflow newParent) {
-		parent = newParent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.commands.IPreExecuteCommand#preExecute()
-	 */
-	public boolean preExecute() {
-		// note that the model adds the ports to the node in this call
-		// pop up the new the wizard to create the new jsf file
-		if (child instanceof PageflowPage) {
-			// if the new page's file path is not empty, i.e., drag a file from
-			// resource navigator view
-			if (null != ((PageflowPage) child).getPath()) {
-				if (PageflowValidation.getInstance().isExistedPage(parent,
-						(PageflowPage) child)) {
-					// Pageflow.PageflowEditor.Alert.DNDResourceTitle = Pageflow
-					// Creation Error
-					// Pageflow.PageflowEditor.Alert.ExistingPage = The web page
-					// {0} is already existed in current PageFlow.
-					EditorPlugin.getAlerts().error(
-							"Pageflow.PageflowEditor.Alert.DNDResourceTitle",
-							"Pageflow.PageflowEditor.Alert.ExistingPage",
-							((PageflowPage) child).getPath());
-					return false;
-				}
-			} else
-			// create a new jsf page from scratch
-			{
-				// return createNewJSFPage();
-				return selectJSPPage();
-			}
-		}
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DelegatingCommandStack.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DelegatingCommandStack.java
deleted file mode 100644
index 56b21a4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DelegatingCommandStack.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import java.util.EventObject;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CommandStack;
-import org.eclipse.gef.commands.CommandStackListener;
-import org.eclipse.gef.commands.UnexecutableCommand;
-
-/**
- * This is a delegating command stack, which delegates everything to another
- * CommandStack except event listners.
- * <p>
- * Event listeners registered to a <code>DelegatingCommandStack</code> will be
- * informed whenever the underlying <code>CommandStack</code> changes. They
- * will not be registered to the underlying <code>CommandStack</code> directly
- * but they will be informed about change events of them.
- * 
- */
-public class DelegatingCommandStack extends CommandStack implements
-		CommandStackListener {
-	/** the empty object array */
-	private static final Object[] EMPTY_OBJECT_ARRAY = new Object[] {};
-
-	/** the current command stack */
-	private CommandStack currentCommandStack = null;
-
-	/**
-	 * Returns the current <code>CommandStack</code>.
-	 * 
-	 * @return - the current <code>CommandStack</code>
-	 */
-	public CommandStack getCurrentCommandStack() {
-		return currentCommandStack;
-	}
-
-	/**
-	 * Sets the current <code>CommandStack</code>.
-	 * 
-	 * @param stack -
-	 *            the <code>CommandStack</code> to set
-	 */
-	public void setCurrentCommandStack(CommandStack stack) {
-		if (currentCommandStack == stack) {
-			return;
-		}
-
-		// remove from old command stack
-		if (null != currentCommandStack) {
-			currentCommandStack.removeCommandStackListener(this);
-		}
-
-		// set new command stack
-		currentCommandStack = stack;
-
-		if (currentCommandStack != null) {
-			// watch new command stack
-			currentCommandStack.addCommandStackListener(this);
-
-			// the command stack changed
-			notifyListeners();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#canRedo()
-	 */
-	public boolean canRedo() {
-		if (null == currentCommandStack) {
-			return false;
-		}
-
-		return currentCommandStack.canRedo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#canUndo()
-	 */
-	public boolean canUndo() {
-		if (null == currentCommandStack) {
-			return false;
-		}
-
-		return currentCommandStack.canUndo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#dispose()
-	 */
-	public void dispose() {
-		if (null != currentCommandStack) {
-			currentCommandStack.dispose();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#execute(org.eclipse.gef.commands.Command)
-	 */
-	public void execute(Command command) {
-		if (null != currentCommandStack) {
-			currentCommandStack.execute(command);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#flush()
-	 */
-	public void flush() {
-		if (null != currentCommandStack) {
-			currentCommandStack.flush();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#getCommands()
-	 */
-	public Object[] getCommands() {
-		if (null == currentCommandStack) {
-			return EMPTY_OBJECT_ARRAY;
-		}
-
-		return currentCommandStack.getCommands();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#getRedoCommand()
-	 */
-	public Command getRedoCommand() {
-		if (null == currentCommandStack) {
-			return UnexecutableCommand.INSTANCE;
-		}
-
-		return currentCommandStack.getRedoCommand();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#getUndoCommand()
-	 */
-	public Command getUndoCommand() {
-		if (null == currentCommandStack) {
-			return UnexecutableCommand.INSTANCE;
-		}
-
-		return currentCommandStack.getUndoCommand();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#getUndoLimit()
-	 */
-	public int getUndoLimit() {
-		if (null == currentCommandStack) {
-			return -1;
-		}
-
-		return currentCommandStack.getUndoLimit();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#isDirty()
-	 */
-	public boolean isDirty() {
-		if (null == currentCommandStack) {
-			return false;
-		}
-
-		return currentCommandStack.isDirty();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#markSaveLocation()
-	 */
-	public void markSaveLocation() {
-		if (null != currentCommandStack) {
-			currentCommandStack.markSaveLocation();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#redo()
-	 */
-	public void redo() {
-		if (null != currentCommandStack) {
-			currentCommandStack.redo();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#setUndoLimit(int)
-	 */
-	public void setUndoLimit(int undoLimit) {
-		if (null != currentCommandStack) {
-			currentCommandStack.setUndoLimit(undoLimit);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#undo()
-	 */
-	public void undo() {
-		if (null != currentCommandStack) {
-			currentCommandStack.undo();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Object#toString()
-	 */
-	public String toString() {
-		return "DelegatingCommandStack(" + currentCommandStack + ")";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStackListener#commandStackChanged(java.util.EventObject)
-	 */
-	public void commandStackChanged(EventObject event) {
-		notifyListeners();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DeleteBendpointCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DeleteBendpointCommand.java
deleted file mode 100644
index 556389e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DeleteBendpointCommand.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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;
-
-	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 c632e25..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DeleteNodeCommand.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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();
-
-	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 7e23cf2..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
- */
-public class EMFCommandGEFAdapter extends Command {
-	private org.eclipse.emf.common.command.Command 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();
-	}
-
-	/**
-	 * 
-	 */
-	public 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 a22e62a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/EMFCommandStackGEFAdapter.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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.CommandStackListener;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CommandStack;
-
-/**
- * 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;
-
-	/**
-	 * 
-	 */
-	public EMFCommandStackGEFAdapter(
-			org.eclipse.emf.common.command.BasicCommandStack emfCommandStack) {
-		super();
-		this.emfCommandStack = emfCommandStack;
-		this.emfCommandStack.addCommandStackListener(this);
-	}
-
-	/*
-	 * (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 f20f2ae..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
- * 
- * 
- */
-public 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 a2468c9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/MoveBendpointCommand.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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;
-
-	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 e094062..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/OpenEditorCommand.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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.pageflow.model.impl.PageflowNodeImpl;
-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 selected object */
-	private PageflowNodeImpl child = null;
-
-	/** 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;
-	}
-
-	/**
-	 * Sets the selected object
-	 * 
-	 * @param child -
-	 *            the PFPageImpl
-	 */
-	public void setChild(PageflowNodeImpl child) {
-		this.child = child;
-	}
-
-	public PageflowNodeImpl getChild() {
-		return child;
-	}
-
-	/**
-	 * open existed JSF file or call the wizard to create a new one.
-	 * 
-	 */
-	private void executeOpenPFPage() {
-		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-		String pagePath = ((PageflowPage) (part.getModel())).getPath();
-
-		// Check the fileName is empty or not
-		if (pagePath != null && pagePath.length() > 0) {
-			String resourceName = WebrootUtil.getProjectPath((EObject) part
-					.getModel(), pagePath);
-			Path resourcePath = new Path(resourceName);
-			if (resourcePath.getFileExtension() != null) {
-				final IFile file = (IFile) workspaceRoot
-						.findMember(resourcePath);
-				openExistingJSFFile(file);
-			} else {
-				// Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle =
-				// Open JSF File Error
-				// Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFFolderInfo =
-				// Cannot open the page in the page editor.
-				EditorPlugin
-						.getAlerts()
-						.error(
-								"Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle",
-								"Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFFolderInfo");
-			}
-		} else
-		// if the fileName is empty, a new jsf file should be created!
-		{
-			// Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle = Open JSF
-			// File Error
-			// Pageflow.PageflowEditor.Alert.confirmCreateNewJSFFile = No jsp
-			// file is related with this page.
-			EditorPlugin.getAlerts().error(
-					"Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle",
-					"Pageflow.PageflowEditor.Alert.confirmCreateNewJSFFile");// )
-		}
-	}
-
-	/**
-	 * open existing jsf file in a new editor.
-	 * 
-	 * @param file
-	 */
-	private void openExistingJSFFile(final IFile file) {
-		// if the file is existed, open it.
-		if (null != file && file.exists()) {
-			Display display = PlatformUI.getWorkbench()
-					.getActiveWorkbenchWindow().getShell().getDisplay();
-			display.asyncExec(new Runnable() {
-				public void run() {
-					IDE.setDefaultEditor(file, null);
-					try {
-						IWorkbenchPage page = PlatformUI.getWorkbench()
-								.getActiveWorkbenchWindow().getActivePage();
-						IEditorDescriptor desc = IDE.getEditorDescriptor(file);
-						page.openEditor(new FileEditorInput(file),
-								desc.getId(), true, IWorkbenchPage.MATCH_INPUT
-										| IWorkbenchPage.MATCH_ID);
-					} catch (PartInitException e) {
-						// Pageflow.PageflowEditor.Error.CanNotOpenEditor4JSF =
-						// The jsf file can not be opened in the editor.
-						log
-								.error(
-										"Pageflow.PageflowEditor.Error.canNotOpenEditor4JSF",
-										e);
-						// Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle
-						// = Open JSF File Error
-						EditorPlugin
-								.getAlerts()
-								.error(
-										"Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle",
-										"Pageflow.PageflowEditor.Error.CanNotOpenEditor4JSF");
-					}
-				}
-			});
-		} else
-		// otherwise, pop-up a error message box
-		{
-			String pagePath = ((PageflowPage) (part.getModel())).getPath();
-			// Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle = Open JSF
-			// File Error
-			// Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFInfo = The JSF
-			// file is not existed.
-			EditorPlugin.getAlerts().error(
-					"Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle",
-					"Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFInfo",
-					pagePath);
-		}
-	}
-
-	/**
-	 * Executes the OpenEditorCommand and opens the editor
-	 */
-	public void execute() {
-		if (part.getModel() instanceof PageflowPage) {
-			executeOpenPFPage();
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/OrphanChildCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/OrphanChildCommand.java
deleted file mode 100644
index 921552d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/OrphanChildCommand.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.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;
-
-	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 510357c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/ReconnectConnectionCommand.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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 {
-
-	public ReconnectConnectionCommand() {
-		// TODO Auto-generated constructor stub
-	}
-
-	public boolean canExecute() {
-		// if user didn't set PFLink object beforehand, this command can't be
-		// executed.
-		if (link == null || link.eContainer() == null) {
-			return false;
-		}
-
-		// Reconnect both source and target
-		if (oldSource != null && source != null && oldTarget != null
-				&& target != null) {
-			if (!PageflowValidation.getInstance().isValidLinkForCreation(
-					source, target)) {
-				return false;
-			}
-		}
-
-		// Reconnect source
-		if (oldSource != null && source != null) {
-			if (!PageflowValidation.getInstance().isValidLinkForCreation(
-					source, oldTarget)) {
-				return false;
-			}
-		}
-		// Reconnect target
-		if (oldTarget != null && target != null) {
-			if (!PageflowValidation.getInstance().isValidLinkForCreation(
-					oldSource, target)) {
-				return false;
-			}
-		}
-
-		return true;
-
-	}
-
-	public void doExecute() {
-		String outcome = null, action = null, largeIcon = null, smallIcon = null;
-		boolean isRedirect = false;
-		outcome = link.getOutcome();
-		action = link.getFromaction();
-		isRedirect = link.isRedirect();
-		largeIcon = link.getLargeicon();
-		smallIcon = link.getSmallicon();
-		// It is a reconnect source command
-		if (oldSource != null && source != null) {
-			link.setSource(source);
-		}
-		// It is a reconnect target command
-		if (oldTarget != null && target != null) {
-			link.setTarget(target);
-		}
-		link.setOutcome(outcome);
-		link.setFromaction(action);
-		link.setLargeicon(largeIcon);
-		link.setSmallicon(smallIcon);
-		link.setRedirect(isRedirect);
-	}
-
-	public void undo() {
-		if (canExecute()) {
-			// It was a reconnect source command
-			if (oldSource != null && source != null) {
-				// The link source must be replaced by the oldSource
-				if (link.getSource() != null) {
-					link.getSource().getOutlinks().remove(link);
-				}
-				source.getOutlinks().remove(link);
-				link.setSource(oldSource);
-			}
-			// It was a reconnect target command
-			if (oldTarget != null && target != null) {
-				// The link target must be replaced by the oldTarget
-				if (link.getTarget() != null) {
-					link.getTarget().getInlinks().remove(link);
-				}
-				target.getInlinks().remove(link);
-				link.setTarget(oldTarget);
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/RenameNodeCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/RenameNodeCommand.java
deleted file mode 100644
index e3e5269..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/RenameNodeCommand.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-
-/**
- * Command to rename Node.
- * 
- * @author xgzhang
- */
-public class RenameNodeCommand extends Command {
-
-	/** new pageflow node */
-	private PageflowNode node;
-
-	/** new node name */
-	private String name;
-
-	/** old node name */
-	private String oldName;
-
-	/**
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		node.setName(name);
-	}
-
-	/**
-	 * Sets the new Activity name
-	 * 
-	 * @param string
-	 *            the new name
-	 */
-	public void setName(String string) {
-		name = string;
-	}
-
-	/**
-	 * Sets the old Activity name
-	 * 
-	 * @param string
-	 *            the old name
-	 */
-	public void setOldName(String string) {
-		oldName = string;
-	}
-
-	/**
-	 * Sets the source Activity
-	 * @param node 
-	 *            the source Activity
-	 */
-	public void setSource(PageflowNode node) {
-		this.node = node;
-	}
-
-	/**
-	 * @see org.eclipse.gef.commands.Command#undo()
-	 */
-	public void undo() {
-		node.setName(oldName);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/SetConstraintCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/SetConstraintCommand.java
deleted file mode 100644
index 1d90a74..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/SetConstraintCommand.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-
-/**
- * This is the SetConstraint command for XY layout edit policy
- * 
- */
-public class SetConstraintCommand extends Command {
-	/** location command label */
-	private static final String COMMAND_LABEL_LOCATION = "change location command";
-
-	/** resize command label */
-	private static final String COMMAND_LABEL_RESIZE = "resize command";
-
-	/** new position */
-	private Point newPos;
-
-	/** new size */
-	private Dimension newSize;
-
-	/** olde position */
-	private Point oldPos;
-
-	/** old size */
-	private Dimension oldSize;
-
-	/** pageflow element */
-	private PageflowElement part;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#execute()
-	 */
-	public void execute() {
-		oldSize = new Dimension(part.getWidth(), part.getHeight());
-		oldPos = new Point(part.getX(), part.getY());
-		part.setX(newPos.x);
-		part.setY(newPos.y);
-		part.setHeight(newSize.height);
-		part.setWidth(newSize.width);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#redo()
-	 */
-	public void redo() {
-		part.setX(newPos.x);
-		part.setY(newPos.y);
-		part.setHeight(newSize.height);
-		part.setWidth(newSize.width);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#undo()
-	 */
-	public void undo() {
-		part.setX(oldPos.x);
-		part.setY(oldPos.y);
-		part.setHeight(oldSize.height);
-		part.setWidth(oldSize.width);
-	}
-
-	/**
-	 * return the label of the constaints
-	 */
-	public String getLabel() {
-		if (oldSize.equals(newSize)) {
-			return COMMAND_LABEL_LOCATION;
-		}
-		return COMMAND_LABEL_RESIZE;
-	}
-
-	/**
-	 * set the new location using rectangle
-	 * 
-	 * @param r -
-	 *            new location
-	 */
-	public void setLocation(Rectangle r) {
-		setLocation(r.getLocation());
-		setSize(r.getSize());
-	}
-
-	/**
-	 * set the new location using point
-	 * 
-	 * @param p -
-	 *            new location point
-	 */
-	public void setLocation(Point p) {
-		newPos = p;
-	}
-
-	/**
-	 * set the pageflow element
-	 * 
-	 * @param part -
-	 *            pageflow element
-	 */
-	public void setPart(PageflowElement part) {
-		this.part = part;
-	}
-
-	/**
-	 * set the new size
-	 * 
-	 * @param p -
-	 *            new size
-	 */
-	public void setSize(Dimension p) {
-		newSize = p;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/ConfigurableRootEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/ConfigurableRootEditPart.java
deleted file mode 100644
index 083c65e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/ConfigurableRootEditPart.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.SimpleLoweredBorder;
-import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * This RootEditPart can set its own's background, fourground color, and font.
- * All this properties can be changed.
- * 
- * @author Xiao-guang Zhang
- * 
- */
-public class ConfigurableRootEditPart extends ScalableFreeformRootEditPart
-		implements IFigurePreference {
-	/**
-	 * 
-	 */
-	public ConfigurableRootEditPart() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		IFigure fig = super.createFigure();
-		fig.setOpaque(true);
-		fig.setBorder(new SimpleLoweredBorder());
-		return fig;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setForegroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setForegroundColor(Color c) {
-		getFigure().setForegroundColor(c);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setBackgroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setBackgroundColor(Color c) {
-		getFigure().setBackgroundColor(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setFont(org.eclipse.swt.graphics.Font)
-	 */
-	public void setFont(Font f) {
-		getFigure().setFont(f);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/DirectEditCellEditorLocator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/DirectEditCellEditorLocator.java
deleted file mode 100644
index 05f234a..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
- */
-public 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 2c489f8..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.
-	 * 
-	 */
-	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 7bc5d52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/ILayerPanePreference.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.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 {
-	public static int LINE_ROUTING_MANUAL = 0;
-
-	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 fa94226..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PFValidator.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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 {
-	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 18337a4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowContainerEditPart.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PageflowContainerEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PageflowXYLayoutEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.PFBatchAdapter;
-
-/**
- * abstract class for pageflow container.
- */
-abstract public class PageflowContainerEditPart extends PageflowElementEditPart {
-
-	/**
-	 * @param element -
-	 *            pageflow model.
-	 */
-	public PageflowContainerEditPart(PageflowElement element) {
-		super(element);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		installEditPolicy(EditPolicy.CONTAINER_ROLE,
-				new PageflowContainerEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE,
-				new PageflowXYLayoutEditPolicy());
-	}
-
-	public Adapter createEMFAdapter() {
-		return new PFBatchAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see PageflowElementEditPart#notifyChanged(Notification)
-			 */
-			public void doNotifyChanged(Notification notification) {
-				int type = notification.getEventType();
-
-				switch (type) {
-				case Notification.ADD:
-				case Notification.ADD_MANY:
-				case Notification.REMOVE:
-				case Notification.REMOVE_MANY:
-					refreshChildren();
-					break;
-				case Notification.SET:
-					refreshVisuals();
-					break;
-				}
-				super.notifyChanged(notification);
-			}
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowDirectEditManager.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowDirectEditManager.java
deleted file mode 100644
index 7698666..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowDirectEditManager.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.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
- */
-public class PageflowDirectEditManager extends DirectEditManager {
-	/** text font */
-	protected Font scaledFont;
-
-	/** verify listener for the text control */
-	protected VerifyListener verifyListener;
-
-	/** the direct editor's parent label. */
-	protected Label label;
-
-	/**
-	 * Creates a new PageflowDirectEditManager with the given attributes.
-	 * 
-	 * @param source
-	 *            the source EditPart
-	 * @param editorType
-	 *            type of editor
-	 * @param locator
-	 *            the CellEditorLocator
-	 */
-	public PageflowDirectEditManager(GraphicalEditPart source,
-			Class editorType, CellEditorLocator locator, Label label) {
-		super(source, editorType, locator);
-		this.label = label;
-	}
-
-	/*
-	 * (non-javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DirectEditManager#bringDown()
-	 */
-	protected void bringDown() {
-		// This method might be re-entered when super.bringDown() is called.
-		Font disposeFont = scaledFont;
-		scaledFont = null;
-		super.bringDown();
-		if (disposeFont != null && !disposeFont.isDisposed()) {
-			disposeFont.dispose();
-		}
-	}
-
-	/*
-	 * (non-javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DirectEditManager#initCellEditor()
-	 */
-	protected void initCellEditor() {
-		Text text = (Text) getCellEditor().getControl();
-		verifyListener = new VerifyListener() {
-			public void verifyText(VerifyEvent event) {
-				Text text_ = (Text) getCellEditor().getControl();
-				String oldText = text_.getText();
-				// get the left string of the new input character
-				String leftText = oldText.substring(0, event.start);
-				// get the right string of the new input charactor
-				String rightText = oldText.substring(event.end, oldText
-						.length());
-
-				GC gc = new GC(text_);
-				Point size = gc.textExtent(leftText + event.text + rightText);
-				gc.dispose();
-				if (size.x != 0) {
-					size = text_.computeSize(size.x, SWT.DEFAULT);
-				}
-				getCellEditor().getControl().setSize(size.x, size.y);
-			}
-		};
-		text.addVerifyListener(verifyListener);
-
-		// set the initial text, font, to the direct editor
-		String initialLabelText = label.getText();
-		getCellEditor().setValue(initialLabelText);
-		IFigure figure = getEditPart().getFigure();
-		final Font figureFont = figure.getFont();
-        // take a copy of the font data for the label we are cell editing
-		FontData data = figureFont.getFontData()[0];
-		Dimension fontSize = new Dimension(0, data.getHeight());
-		label.translateToAbsolute(fontSize);
-		data.setHeight(fontSize.height);
-
-		if (scaledFont != null && !scaledFont.isDisposed())
-        {
-			scaledFont.dispose();
-        }
-		scaledFont = new Font(figureFont.getDevice(), data);
-
-		text.setFont(scaledFont);
-		text.selectAll();
-	}
-
-	/*
-	 * (non-javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DirectEditManager#unhookListeners()
-	 */
-	protected void unhookListeners() {
-		super.unhookListeners();
-		Text text = (Text) getCellEditor().getControl();
-		text.removeVerifyListener(verifyListener);
-		verifyListener = null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowEditPart.java
deleted file mode 100644
index 0ff56f2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowEditPart.java
+++ /dev/null
@@ -1,387 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eclipse.draw2d.BendpointConnectionRouter;
-import org.eclipse.draw2d.ConnectionLayer;
-import org.eclipse.draw2d.FanRouter;
-import org.eclipse.draw2d.FreeformLayer;
-import org.eclipse.draw2d.FreeformLayout;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.ManhattanConnectionRouter;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gef.CompoundSnapToHelper;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.SnapToGeometry;
-import org.eclipse.gef.SnapToGrid;
-import org.eclipse.gef.SnapToGuides;
-import org.eclipse.gef.SnapToHelper;
-import org.eclipse.gef.editparts.AbstractEditPart;
-import org.eclipse.gef.editparts.GridLayer;
-import org.eclipse.gef.editpolicies.RootComponentEditPolicy;
-import org.eclipse.gef.editpolicies.SnapFeedbackPolicy;
-import org.eclipse.gef.rulers.RulerProvider;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.FC2PFTransformer;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.PFBatchAdapter;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowAnnotationUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * The container editr part for the whole pageflow, which uses the
- * WindowFigure(GEM) as the container figure.
- * 
- */
-public class PageflowEditPart extends PageflowContainerEditPart implements
-		LayerConstants, ILayerPanePreference {
-	/** The seperation for the two possible coincided connections */
-	private static final int CONNECTION_SEPERATION = 20;
-
-	private int connectionStyle = -1;
-
-	/**
-	 * Creates a new PageflowEditPart instance.
-	 * 
-	 * @param pageflow -
-	 *            pageflow model
-	 */
-	protected PageflowEditPart(Pageflow pageflow) {
-		super(pageflow);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		FreeformLayer layer = new FreeformLayer();
-		// layer.setOpaque(true);
-		layer.setLayoutManager(new FreeformLayout());
-		return layer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		super.createEditPolicies();
-
-		installEditPolicy(EditPolicy.NODE_ROLE, null);
-		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, null);
-		// installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, null);
-		installEditPolicy(EditPolicy.COMPONENT_ROLE,
-				new RootComponentEditPolicy());
-		installEditPolicy("Snap Feedback", new SnapFeedbackPolicy()); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class key) {
-		if (key == SnapToHelper.class) {
-			IPreferenceStore store = EditorPlugin.getDefault()
-					.getPreferenceStore();
-
-			List snapStrategies = new ArrayList();
-			Boolean bRulerVisible = (Boolean) getViewer().getProperty(
-					RulerProvider.PROPERTY_RULER_VISIBILITY);
-			if (bRulerVisible != null && bRulerVisible.booleanValue()) {
-				snapStrategies.add(new SnapToGuides(this));
-			}
-
-			boolean bSnapToGeometry = store
-					.getBoolean(GEMPreferences.SNAP_TO_GEOMETRY);
-			if (bSnapToGeometry) {
-				snapStrategies.add(new SnapToGeometry(this));
-			}
-			boolean bSnapToGrid = store.getBoolean(GEMPreferences.SNAP_TO_GRID);
-			if (bSnapToGrid) {
-				snapStrategies.add(new SnapToGrid(this));
-			}
-
-			if (snapStrategies.size() == 0) {
-				return null;
-			}
-			if (snapStrategies.size() == 1) {
-				return snapStrategies.get(0);
-			}
-
-			SnapToHelper ss[] = new SnapToHelper[snapStrategies.size()];
-			for (int i = 0; i < snapStrategies.size(); i++) {
-				ss[i] = (SnapToHelper) snapStrategies.get(i);
-			}
-			return new CompoundSnapToHelper(ss);
-		}
-		return super.getAdapter(key);
-	}
-
-	/**
-	 * Returns the Pageflow.
-	 * 
-	 * @return the pageflow
-	 */
-	public Pageflow getPageflow() {
-		return (Pageflow) getPageflowElement();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#getModelChildren()
-	 */
-	protected List getModelChildren() {
-		List allChildren = new LinkedList();
-		Iterator it;
-
-		it = getPageflow().getNodes().iterator();
-		while (it.hasNext()) {
-			allChildren.add(it.next());
-		}
-
-		return allChildren;
-	}
-
-	public Adapter createEMFAdapter() {
-		return new PFBatchAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see Adapter#notifyChanged(Notification)
-			 */
-			public void doNotifyChanged(Notification notification) {
-				int type = notification.getEventType();
-
-				// int featureId = notification.getFeatureID(
-				// PageflowPackage.class );
-				switch (type) {
-				case Notification.ADD:
-				case Notification.ADD_MANY:
-				case Notification.REMOVE:
-				case Notification.REMOVE_MANY:
-					refreshChildren();
-					break;
-
-				case Notification.SET:
-					refreshChildren();
-					refreshVisuals();
-					break;
-				case FC2PFTransformer.MY_NOTIFICATION_TYPE1:
-					restore((Pageflow) getModel());
-					refreshChildren();
-					refreshVisuals();
-					break;
-				// restore all children
-				case FC2PFTransformer.MY_NOTIFICATION_TYPE:
-					// stop all children
-					postPone((Pageflow) getModel());
-					break;
-				}
-			}
-
-			protected void restore(Pageflow pageflow) {
-				TreeIterator nodes;
-				// restore
-				nodes = pageflow.eAllContents();
-				while (nodes.hasNext()) {
-					setPostpone((EObject) nodes.next(), false);
-				}
-				setPostpone(pageflow, false);
-			}
-
-			void setPostpone(EObject node, boolean enable) {
-				List adapters = node.eAdapters();
-				for (int i = 0; i < adapters.size(); i++) {
-					if (adapters.get(i) instanceof PFBatchAdapter) {
-						((PFBatchAdapter) adapters.get(i))
-								.setNeedPostpone(enable);
-					}
-				}
-			}
-
-			protected void postPone(Pageflow pageflow) {
-				TreeIterator nodes;
-				// postpone
-				nodes = pageflow.eAllContents();
-				while (nodes.hasNext()) {
-					setPostpone((EObject) nodes.next(), true);
-				}
-				setPostpone(pageflow, true);
-			}
-
-		};
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals()
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		for (int i = 0; i < this.getChildren().size(); i++) {
-			((AbstractEditPart) getChildren().get(i)).refresh();
-		}
-		ConnectionLayer cLayer = (ConnectionLayer) getLayer(CONNECTION_LAYER);
-
-		if (cLayer.getConnectionRouter() == null) {
-			setConnectionRouterStyle(getConnectionRouterStyle());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#refreshChildren()
-	 */
-	protected void refreshChildren() {
-		super.refreshChildren();
-		PageflowAnnotationUtil.validatePageflow(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setFont(org.eclipse.swt.graphics.Font)
-	 */
-	public void setFont(Font f) {
-		getFigure().setFont(f);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.ILayerPanePreference#setConnectionRouterStyle(int)
-	 */
-	public void setConnectionRouterStyle(int style) {
-		connectionStyle = style;
-		ConnectionLayer cLayer = (ConnectionLayer) getLayer(CONNECTION_LAYER);
-		if (style == ILayerPanePreference.LINE_ROUTING_MANHATTAN) {
-			FanRouter router = new FanRouter();
-			router.setSeparation(CONNECTION_SEPERATION);
-			router.setNextRouter(new ManhattanConnectionRouter());
-			cLayer.setConnectionRouter(router);
-		} else if (style == ILayerPanePreference.LINE_ROUTING_MANUAL) {
-			FanRouter router = new FanRouter();
-			router.setSeparation(CONNECTION_SEPERATION);
-			router.setNextRouter(new BendpointConnectionRouter());
-			cLayer.setConnectionRouter(router);
-		}
-	}
-
-	/**
-	 * get the foreground color from preference
-	 * @return the router style value
-	 * 
-	 */
-	public int getConnectionRouterStyle() {
-		if (this.connectionStyle == -1) {
-			IPreferenceStore store = EditorPlugin.getDefault()
-					.getPreferenceStore();
-			String connectionStyle_ = store
-					.getString(GEMPreferences.LINE_ROUTING);
-
-			if (GEMPreferences.LINE_ROUTING_MANHATTAN.equals(connectionStyle_)) {
-				this.connectionStyle = ILayerPanePreference.LINE_ROUTING_MANHATTAN;
-			} else {
-				this.connectionStyle = ILayerPanePreference.LINE_ROUTING_MANUAL;
-			}
-		}
-		return this.connectionStyle;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setForegroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setForegroundColor(Color c) {
-		getFigure().setForegroundColor(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setBackgroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setBackgroundColor(Color c) {
-		// getLayer(PRIMARY_LAYER).setOpaque(true);
-		getLayer(PRIMARY_LAYER).setBackgroundColor(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setGridVisible(boolean)
-	 */
-	public void setGridVisible(boolean bVisible) {
-		GridLayer gl = (GridLayer) getLayer(GRID_LAYER);
-		gl.setVisible(bVisible);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setGridSpacing(org.eclipse.draw2d.geometry.Dimension)
-	 */
-	public void setGridSpacing(Dimension d) {
-		GridLayer gl = (GridLayer) getLayer(GRID_LAYER);
-		gl.setSpacing(d);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.ILayerPanePreference#setGridForegroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setGridForegroundColor(Color c) {
-		GridLayer gl = (GridLayer) getLayer(GRID_LAYER);
-		gl.setForegroundColor(c);
-	}
-
-    protected void performDirectEdit() {
-        // do nothing
-    }
-
-    protected void performOpen() {
-        // do nothing
-    }
-
-    public void addAnnotation(Annotation annotation) {
-        // do nothing
-        
-    }
-
-    public void removeAnnotation() {
-        // do nothing
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowEditPartsFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowEditPartsFactory.java
deleted file mode 100644
index fe57235..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowEditPartsFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-
-/**
- * 
- * Edit part factory to create different pageflow elements.
- * 
- * 
- */
-public class PageflowEditPartsFactory implements EditPartFactory {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see EditPartFactory#createEditPart(EditPart, Object)
-	 */
-	public EditPart createEditPart(EditPart context, Object obj) {
-		if (obj instanceof Pageflow) {
-			return new PageflowEditPart((Pageflow) obj);
-		} else if (obj instanceof PageflowNode) {
-			return new PageflowNodeEditPart((PageflowNode) obj);
-		} else if (obj instanceof PageflowLink) {
-			return new PageflowLinkEditPart((PageflowLink) obj);
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowElementEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowElementEditPart.java
deleted file mode 100644
index a3e32ff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowElementEditPart.java
+++ /dev/null
@@ -1,340 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure.PageflowNodeFigure;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PageflowElementPropertySource;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.PFBatchAdapter;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.views.properties.IPropertySource;
-
-/**
- * 
- * 
- * <code>PageflowElementEditPart</code> is the base class for all the
- * EditParts in the application, whose model is a subclass of PageflowElement.
- * This class maintains the figure's size and location inresponse to changes in
- * the model, and registers as a listener on its model using the
- * <code>org.eclipse.emf.common.notify.Adapter</code> interface
- */
-public abstract class PageflowElementEditPart extends AbstractGraphicalEditPart
-		implements IAnnotationEditPart {
-	/** image description for different edit part */
-	public static final ImageDescriptor IMG_ACTION = EditorPlugin.getDefault()
-			.getImageDescriptor("facesconfig/Pageflow_Action16.gif"); //$NON-NLS-1$
-
-	protected Adapter 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;
-					}
-				}
-			}
-		};
-	}
-
-	public static final ImageDescriptor IMG_PAGE = EditorPlugin.getDefault()
-			.getImageDescriptor("facesconfig/Pageflow_Page.gif"); //$NON-NLS-1$
-
-	public 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;
-
-	protected PageflowElementEditPart(PageflowElement element) {
-		setModel(element);
-	}
-
-	/**
-	 * Returns the image for the pageflow element.
-	 * 
-	 * @param element -
-	 *            pageflow element
-	 * @return - the image for the pageflow element.
-	 */
-	public Image getImage(PageflowElement element) {
-		if (image == null) {
-			ImageDescriptor imageDescriptor = null;
-
-			if (element instanceof PageflowPage) {
-				imageDescriptor = IMG_PAGE;
-			} else {
-				imageDescriptor = IMG_NODE;
-			}
-
-			image = EditorPlugin.getDefault().getImageRegistry().get(
-					imageDescriptor.toString());
-			if (null == image) {
-				EditorPlugin.getDefault().getImageRegistry().put(
-						imageDescriptor.toString(), imageDescriptor);
-				image = EditorPlugin.getDefault().getImageRegistry().get(
-						imageDescriptor.toString());
-			}
-		}
-
-		return image;
-	}
-
-	/**
-	 * get the type name of the pageflow element
-	 * 
-	 * @param element -
-	 *            pageflow element
-	 * @return - the type name of the pageflow element
-	 */
-	public static String getTypeName(PageflowElement element) {
-		if (element instanceof Pageflow) {
-			return "Pageflow"; //$NON-NLS-1$
-		} else if (element instanceof PageflowPage) {
-			return "Page"; //$NON-NLS-1$
-		}
-
-		return "[unknown]"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#activate()
-	 */
-	public void activate() {
-		if (isActive()) {
-			return;
-		}
-
-		// start listening for changes in the model
-		hookIntoPageflowElement(getPageflowElement());
-
-		super.activate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#deactivate()
-	 */
-	public void deactivate() {
-		if (!isActive()) {
-			return;
-		}
-
-		// stop listening for changes in the model
-		unhookFromPageflowElement(getPageflowElement());
-
-		super.deactivate();
-	}
-
-	/**
-	 * Returns the model as pageflow element.
-	 * 
-	 * @return - pageflow element
-	 */
-	public PageflowElement getPageflowElement() {
-		return (PageflowElement) getModel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#refreshVisuals()
-	 */
-	protected void refreshVisuals() {
-		if (getParent() != null) {
-			Point loc = new Point(getPageflowElement().getX(),
-					getPageflowElement().getY());
-			Dimension size = new Dimension(getPageflowElement().getWidth(),
-					getPageflowElement().getHeight());
-			Rectangle r = new Rectangle(loc, size);
-
-			((GraphicalEditPart) getParent()).setLayoutConstraint(this,
-					getFigure(), r);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IAdaptable#getAdapter(Class)
-	 */
-	public Object getAdapter(Class key) {
-		/*
-		 * override the default behavior defined in AbstractEditPart which would
-		 * expect the model to be a property sourced. instead the editpart can
-		 * provide a property source
-		 */
-		if (key == IPropertySource.class) {
-			return getPropertySource();
-		}
-		if (key == Adapter.class) {
-			if (adapter == null) {
-				adapter = createEMFAdapter();
-			}
-			return adapter;
-		}
-		return super.getAdapter(key);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see PageflowElementEditPart#getPropertySource()
-	 */
-	protected 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 ca0c328..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowElementTreeEditPart.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.gef.editparts.AbstractTreeEditPart;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PageflowElementPropertySource;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.views.properties.IPropertySource;
-
-/**
- * This is the abstract base <code>TreeEditPart</code> for pageflow elements.
- */
-public class PageflowElementTreeEditPart extends AbstractTreeEditPart implements
-		Adapter {
-	/** Image descriptor of tree item for the different edit parts */
-	public static final ImageDescriptor IMG_PAGE = EditorPlugin.getDefault()
-			.getImageDescriptor("facesconfig/Pageflow_Page16.gif"); //$NON-NLS-1$
-
-	public 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()
-	 */
-	protected IPropertySource getPropertySource() {
-		if (propertySource == null) {
-			propertySource = new PageflowElementPropertySource(
-					getPageflowElement());
-		}
-		return propertySource;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Adapter#getTarget()
-	 */
-	public Notifier getTarget() {
-		return target;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTreeEditPart#getText()
-	 */
-	protected String getText() {
-		return (null != getPageflowElement().getName() ? getPageflowElement()
-				.getName() : "[unnamed]"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the model as <code>PageflowElement</code>.
-	 * 
-	 * @return - the model as <code>PageflowElement</code>
-	 */
-	public PageflowElement getPageflowElement() {
-		return (PageflowElement) getModel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Adapter#isAdapterForType(Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return type.equals(getModel().getClass());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Adapter#notifyChanged(Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		int type = notification.getEventType();
-
-		switch (type) {
-		case Notification.ADD:
-		case Notification.ADD_MANY:
-		case Notification.REMOVE:
-		case Notification.REMOVE_MANY:
-			refreshChildren();
-			break;
-
-		case Notification.SET:
-			refreshVisuals();
-			break;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Adapter#setTarget(Notifier)
-	 */
-	public void setTarget(Notifier newTarget) {
-		target = newTarget;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#activate()
-	 */
-	public void activate() {
-		if (isActive())
-			return;
-
-		// start listening for changes in the model
-		hookIntoPageflowElement(getPageflowElement());
-
-		super.activate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#deactivate()
-	 */
-	public void deactivate() {
-		if (!isActive())
-			return;
-
-		// stop listening for changes in the model
-		unhookFromPageflowElement(getPageflowElement());
-
-		super.deactivate();
-	}
-
-	/**
-	 * Registers this edit part as a listener for change notifications to the
-	 * specified pageflow element.
-	 * 
-	 * @param element -
-	 *            the pagelfow element that should be observed for change
-	 *            notifications
-	 */
-	protected void hookIntoPageflowElement(PageflowElement element) {
-		if (null != element) {
-			element.eAdapters().add(this);
-		}
-	}
-
-	/**
-	 * Removes this edit part from the specified pageflow element. Thus, it will
-	 * no longe receive change notifications.
-	 * 
-	 * @param element
-	 *            -the pagelfow element that should not be observed
-	 */
-	protected void unhookFromPageflowElement(PageflowElement element) {
-		if (null != element) {
-			element.eAdapters().remove(this);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowLinkEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowLinkEditPart.java
deleted file mode 100644
index 15eb0fb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowLinkEditPart.java
+++ /dev/null
@@ -1,476 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.RelativeBendpoint;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.editparts.AbstractConnectionEditPart;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PFLinkBendpointEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PFLinkEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PFLinkEndpointEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure.PFLinkFigure;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PageflowLinkPropertySource;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.PFBatchAdapter;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowAnnotationUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.views.properties.IPropertySource;
-
-/**
- * <code>PFLinkEditPart</code> is the EditPart for PFLink model elements. The
- * figure for this EditPart is simply a PolylineConnection. Because both
- * AbstractConnectionEditPart and the Adapter interface have a getTarget method,
- * we use an inner class to implement the Adapter interface in order to work
- * around the name collision.
- * 
- * 
- */
-public class PageflowLinkEditPart extends AbstractConnectionEditPart implements
-		IConnectionPreference, IAnnotationEditPart, PFValidator {
-	/** adapter for notification */
-	private PFLinkAdapter adapter = new PFLinkAdapter();
-
-	/** property source of the pflink */
-	private IPropertySource propertySource = null;
-
-	/** image description for different edit part */
-	public static final ImageDescriptor IMG_WARNING = EditorPlugin.getDefault()
-			.getImageDescriptor("facesconfig/Pageflow_Quickfix_Error.gif");
-
-	private int connectionStyle = -1;
-
-	private PFLinkBendpointEditPolicy bendpointEditPolicy;
-
-	/**
-	 * @param element
-	 */
-	public PageflowLinkEditPart(PageflowLink element) {
-		super();
-		// element.getPageflow()
-		setModel(element);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		IFigure figure_ = new PFLinkFigure();
-		return figure_;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE,
-				new PFLinkEndpointEditPolicy());
-
-		if (getConnectionRouterStyle() == ILayerPanePreference.LINE_ROUTING_MANUAL) {
-			installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE,
-					getBendpointEditPolicy());
-		}
-		//PFLinkEditPolicy policy = new PFLinkEditPolicy();
-		// policy.setSseModel(model);
-		installEditPolicy(EditPolicy.CONNECTION_ROLE, new PFLinkEditPolicy());
-
-	}
-
-	private PFLinkBendpointEditPolicy getBendpointEditPolicy() {
-		if (bendpointEditPolicy == null) {
-			bendpointEditPolicy = new PFLinkBendpointEditPolicy();
-		}
-		return bendpointEditPolicy;
-	}
-
-	public PageflowLink getPFLink() {
-		return (PageflowLink) getModel();
-	}
-
-	private class PFLinkAdapter extends PFBatchAdapter {
-		private Notifier _newTarget = null;
-
-		// private IPropertySource _propertySource = null;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.Adapter#getTarget()
-		 */
-		public Notifier getTarget() {
-			return _newTarget;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.Adapter#isAdapterForType(java.lang.Object)
-		 */
-		public boolean isAdapterForType(Object type) {
-			return getModel().getClass() == type;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-		 */
-		public void doNotifyChanged(Notification notification) {
-			int type = notification.getEventType();
-			int featureId = notification.getFeatureID(PageflowPackage.class);
-			// FC2PFTransformer.getInstance().NotifyChanged(notification,
-			// getPFLink());
-			switch (type) {
-			case Notification.ADD:
-			case Notification.ADD_MANY:
-			case Notification.REMOVE:
-			case Notification.SET:
-				if (featureId == PageflowPackage.PF_LINK__OUTCOME
-						|| featureId == PageflowPackage.PF_LINK__SOURCE
-						|| featureId == PageflowPackage.PF_LINK__TARGET) {
-					PageflowAnnotationUtil
-							.validateLink(PageflowLinkEditPart.this);
-				}
-
-				refreshVisuals();
-				break;
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.Adapter#setTarget(org.eclipse.emf.common.notify.Notifier)
-		 */
-		public void setTarget(Notifier newTarget) {
-			this._newTarget = newTarget;
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see EditPart#activate()
-	 */
-	public void activate() {
-		getPFLink().eAdapters().add(adapter);
-		//PageflowLink element = (PageflowLink) getModel();
-		super.activate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see EditPart#deactivate()
-	 */
-	public void deactivate() {
-		// getPFLink().eAdapters().remove(adapter);
-		// PageflowLink element = (PageflowLink) getModel();
-		// NavigationCaseType navCase = ((NavigationCaseType) element
-		// .getFCElements().getData().get(0));
-		// navCase.eAdapters().remove(fcAdapter);
-		// TreeIterator iterator = navCase.eAllContents();
-		// while (iterator.hasNext()) {
-		// ((EObject) iterator.next()).eAdapters().remove(fcAdapter);
-		// }
-
-		super.deactivate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class key) {
-		/*
-		 * override the default behavior defined in AbstractEditPart which would
-		 * expect the model to be a property sourced. instead the editpart can
-		 * provide a property source
-		 */
-		if (key == IPropertySource.class) {
-			return getPropertySource();
-		}
-		return super.getAdapter(key);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see PageflowElementEditPart#getPropertySource()
-	 */
-	protected IPropertySource getPropertySource() {
-		if (propertySource == null) {
-			propertySource = new PageflowLinkPropertySource(getPFLink());
-		}
-		return propertySource;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#refreshVisuals()
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		resetLabel();
-		if (getConnectionRouterStyle() == ILayerPanePreference.LINE_ROUTING_MANUAL) {
-			refreshBendpoints();
-		}
-	}
-
-	/**
-	 * set the bendpoint constraints of the pflink connection
-	 * 
-	 */
-	protected void refreshBendpoints() {
-		// bendpoints stored in pflink
-		List modelConstraint = getPFLink().getBendPoints();
-		// bendpoint constraint list
-		List figureConstraint = new ArrayList();
-		for (int i = 0; i < modelConstraint.size(); i++) {
-			PageflowLinkBendpoint wbp = (PageflowLinkBendpoint) modelConstraint
-					.get(i);
-			RelativeBendpoint rbp = new RelativeBendpoint(getConnectionFigure());
-			rbp.setRelativeDimensions(wbp.getFirstRelativeDimension(), wbp
-					.getSecondRelativeDimension());
-			rbp.setWeight((i + 1) / ((float) modelConstraint.size() + 1));
-			figureConstraint.add(rbp);
-		}
-		// set the router constaints.
-		getConnectionFigure().setRoutingConstraint(figureConstraint);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setLineWidth(int)
-	 */
-	public void setLineWidth(int w) {
-		((PFLinkFigure) getFigure()).setLineWidth(w);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setLabelVisible(boolean)
-	 */
-	public void setLabelVisible(boolean b) {
-		((PFLinkFigure) getFigure()).setLabelVisible(b);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setForegroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setForegroundColor(Color c) {
-		((PFLinkFigure) getFigure()).setForegroundColor(c);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setBackgroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setBackgroundColor(Color c) {
-		((PFLinkFigure) getFigure()).setBackgroundColor(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setFont(org.eclipse.swt.graphics.Font)
-	 */
-	public void setFont(Font f) {
-		((PFLinkFigure) getFigure()).setFont(f);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setLabelForeground(org.eclipse.swt.graphics.Color)
-	 */
-	public void setLabelForegroundColor(Color c) {
-		((PFLinkFigure) getFigure()).setLabelForegroundColor(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setLabelBackground(org.eclipse.swt.graphics.Color)
-	 */
-	public void setLabelBackgroundColor(Color c) {
-		((PFLinkFigure) getFigure()).setLabelBackgroundColor(c);
-	}
-
-	private boolean needDrawingLabel() {
-		return (((PageflowLink) getModel()).getOutcome() != null && ((PageflowLink) getModel())
-				.getOutcome().trim().length() > 0);
-	}
-
-	private boolean needDrawingAction() {
-		return (((PageflowLink) getModel()).getFromaction() != null && ((PageflowLink) getModel())
-				.getFromaction().trim().length() > 0);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IEditPartDecorator#decorateEditPart()
-	 */
-	public void addAnnotation(final Annotation annotation) {
-		getViewer().getControl().getDisplay().asyncExec(new Runnable() {
-			public void run() {
-				((PFLinkFigure) getFigure()).setImage(getImage(IMG_WARNING));
-				((PFLinkFigure) getFigure()).setToolTipText(annotation
-						.getText());
-			}
-		});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IEditPartDecorator#undecorateEditPart()
-	 */
-	public void removeAnnotation() {
-		getViewer().getControl().getDisplay().asyncExec(new Runnable() {
-			public void run() {
-				((PFLinkFigure) getFigure()).clearIcon();
-				resetLabel();
-			}
-		});
-	}
-
-	public void resetLabel() {
-		StringBuffer tip = new StringBuffer();
-		if (needDrawingAction()) {
-			((PFLinkFigure) getFigure()).setActionImage();
-			tip.append(PageflowMessages.PageflowLinkEditPart_FromAction).append(
-					((PageflowLink) getModel()).getFromaction());
-		} else if (((PFLinkFigure) getFigure()).getImage() != getImage(IMG_WARNING)) {
-			((PFLinkFigure) getFigure()).clearIcon();
-		}
-		if (needDrawingLabel()) {
-			((PFLinkFigure) getFigure()).setLabel(((PageflowLink) getModel())
-					.getOutcome());
-			if (tip.length() > 0)
-				tip.append("\n");
-			tip.append(PageflowMessages.PageflowLinkEditPart_FromOutcome).append(
-					((PageflowLink) getModel()).getOutcome());
-		} else {
-			((PFLinkFigure) getFigure()).clearOutcome();
-		}
-		((PFLinkFigure) getFigure()).setToolTipText(tip.toString());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.marker.IEditPartMarker#getMarkerResource()
-	 * 
-	 */
-	public IResource getMarkerResource() {
-		// IResource resource = null;
-		// if (getModel() instanceof PFLink)
-		// {
-		// resource =
-		// FacesConfigUtil.getFacesConfigResource(((PFLink)getModel()).getPageflow());
-		// }
-		// FIXME: it should be changed to link to faces-config file.
-		IResource resource = WebrootUtil.getResource((EObject) getModel());
-		return resource;
-	}
-
-	public 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
-	 * 
-	 */
-	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;
-	}
-
-	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 8208cd2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowNodeEditPart.java
+++ /dev/null
@@ -1,479 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.ConnectionAnchor;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.gef.ConnectionEditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.NodeEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.jdt.ui.JavaElementImageDescriptor;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.OpenEditorCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PageflowElementEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PageflowNodeDirectEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PageflowNodeEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure.ILabelDecorator;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure.PageflowNodeFigure;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.PFBatchAdapter;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowAnnotationUtil;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * The base class for the applications EditParts that represent
- * PageflowNode-derived objects in the model. This class implements the
- * NodeEditPart interface which supports:
- * <ul>
- * <li>feedback for Connections when they are being
- * <li>
- * <li>initially connected and when they are disonnected/reconnected</li>
- * </ul>
- * 
- * 
- */
-public class PageflowNodeEditPart extends PageflowElementEditPart implements
-		NodeEditPart, INodePreference, PFValidator {
-
-	/** property source of pageflow node */
-	// private IPropertySource propertySource = null;
-	protected DirectEditManager editManager;
-
-	private class ImageDecorator implements ILabelDecorator {
-		private Image decrateImage = null;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see com.sybase.stf.jmt.editors.pageflow.figures.ILabelDecorator#decorateImage(org.eclipse.swt.graphics.Image,
-		 *      java.lang.Object)
-		 */
-		public Image decorateImage(Image image, Object element) {
-			dispose();
-			int adornmentFlags = computeAdornmentFlags(element);
-			if (adornmentFlags != 0) {
-				ImageDescriptor baseImage = ImageDescriptor.createFromImage(image);
-				org.eclipse.swt.graphics.Rectangle bounds = image.getBounds();
-				decrateImage = (new JavaElementImageDescriptor(baseImage,
-						adornmentFlags, new org.eclipse.swt.graphics.Point(
-								bounds.width, bounds.height))).createImage();
-				return decrateImage;
-			}
-			return image;
-		}
-
-		/**
-		 * Computes adornment flags for specified object.
-		 * 
-		 * Note: This method is for internal use only. Clients should not call
-		 * this method.
-		 * 
-		 * @param obj Object to complute flags for.
-		 * @return Adornment flags.
-		 */
-		protected int computeAdornmentFlags(Object obj) {
-			return JavaElementImageDescriptor.WARNING;
-		}
-
-		/**
-		 * Disposes this instance.
-		 */
-		public void dispose() {
-			if (decrateImage != null) {
-				decrateImage.dispose();
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see com.sybase.stf.jmt.editors.pageflow.figures.ILabelDecorator#decorateText(java.lang.String,
-		 *      java.lang.Object)
-		 */
-		public String decorateText(String text, Object element) {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-	}
-
-	/**
-	 * Disposes this instance.
-	 */
-	public void dispose() {
-		if (imageDecorator != null) {
-			imageDecorator.dispose();
-		}
-	}
-
-	private ImageDecorator imageDecorator = null;
-
-	/**
-	 * Creates a new PageflowNodeEditPart instance.
-	 * 
-	 * @param element -
-	 *            pageflow node
-	 */
-	public PageflowNodeEditPart(PageflowNode element) {
-		super(element);
-	}
-
-	/**
-	 * get the pageflow node
-	 * 
-	 * @return - pageflow node
-	 */
-	public PageflowNode getPageflowNode() {
-		return (PageflowNode) getModel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#getModelSourceConnections()
-	 */
-	protected List getModelSourceConnections() {
-		return getPageflowNode().getOutlinks();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#getModelTargetConnections()
-	 */
-	protected List getModelTargetConnections() {
-		return getPageflowNode().getInlinks();
-	}
-
-	/**
-	 * Returns the Figure of this, as a node type figure.
-	 * 
-	 * @return - Figure as a NodeFigure.
-	 */
-	protected PageflowNodeFigure getPageflowNodeFigure() {
-		return (PageflowNodeFigure) getFigure();
-	}
-
-	public Adapter createEMFAdapter() {
-		return new PFBatchAdapter() {
-			/**
-			 * when ports are added to a PageflowNode, add this EditPart as a
-			 * listener on the port so that it gets notified of PFLinks being
-			 * added or removed. When links are added or removed from a port
-			 * owned by the PageflowNode of this EditPart, refresh the
-			 * connections.
-			 */
-			public void doNotifyChanged(Notification notification) {
-				int type = notification.getEventType();
-				// FC2PFTransformer.getInstance().NotifyChanged(notification,
-				// (PageflowElement) getModel());
-				switch (type) {
-				case Notification.ADD:
-				case Notification.ADD_MANY:
-				case Notification.REMOVE:
-				case Notification.REMOVE_MANY:
-					if (notification.getNewValue() instanceof PageflowLink) {
-						refreshTargetConnections();
-						refreshSourceConnections();
-						validate();
-					}
-					break;
-
-				case Notification.SET:
-					int featureId = notification
-							.getFeatureID(PageflowPackage.class);
-					if (needValidation(featureId)) {
-						validate();
-					}
-					refreshVisuals();
-					break;
-				}
-			}
-		};
-	}
-
-	private boolean needValidation(int featureId) {
-		if (getModel() instanceof PageflowPage) {
-			if (featureId == PageflowPackage.PF_PAGE__PATH) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	public void validate() {
-		if (getModel() instanceof PageflowPage) {
-			PageflowAnnotationUtil.validatePage(this);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		// install the edit policy to handle connection creation
-		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
-				new PageflowNodeEditPolicy());
-
-		installEditPolicy(EditPolicy.COMPONENT_ROLE,
-				new PageflowElementEditPolicy());
-
-		// install the direct policy
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-				new PageflowNodeDirectEditPolicy());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see NodeEditPart#getSourceConnectionAnchor(ConnectionEditPart)
-	 */
-	public ConnectionAnchor getSourceConnectionAnchor(
-			ConnectionEditPart connection) {
-		PageflowLink link = (PageflowLink) connection.getModel();
-		return getPageflowNodeFigure().getSourceConnectionAnchorAt(
-				new Point(link.getSource().getX(), link.getSource().getY()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see NodeEditPart#getSourceConnectionAnchor(Request)
-	 */
-	public ConnectionAnchor getSourceConnectionAnchor(Request request) {
-		Point pt = new Point(((DropRequest) request).getLocation());
-		return getPageflowNodeFigure().getSourceConnectionAnchorAt(pt);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see NodeEditPart#getTargetConnectionAnchor(ConnectionEditPart)
-	 */
-	public ConnectionAnchor getTargetConnectionAnchor(
-			ConnectionEditPart connection) {
-		PageflowLink link = (PageflowLink) connection.getModel();
-		return getPageflowNodeFigure().getTargetConnectionAnchorAt(
-				new Point(link.getTarget().getX(), link.getTarget().getY()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see NodeEditPart#getTargetConnectionAnchor(Request)
-	 */
-	public ConnectionAnchor getTargetConnectionAnchor(Request request) {
-		Point pt = new Point(((DropRequest) request).getLocation());
-		return getPageflowNodeFigure().getTargetConnectionAnchorAt(pt);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#refreshVisuals()
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-
-		getPageflowNodeFigure().setText(getPageflowNode().getName());
-	}
-
-	/**
-	 * make this a listener on its ports
-	 */
-	public void activate() {
-		super.activate();
-
-		Iterator it;
-
-		it = getPageflowNode().getInlinks().iterator();
-		while (it.hasNext()) {
-			PageflowLink link = (PageflowLink) it.next();
-
-			hookIntoPageflowElement(link);
-		}
-
-		it = getPageflowNode().getOutlinks().iterator();
-		while (it.hasNext()) {
-			PageflowLink link = (PageflowLink) it.next();
-
-			hookIntoPageflowElement(link);
-		}
-	}
-
-	/**
-	 * remove this as a listener on its ports
-	 */
-	public void deactivate() {
-		super.deactivate();
-		dispose();
-		Iterator it;
-
-		it = getPageflowNode().getInlinks().iterator();
-		while (it.hasNext()) {
-			PageflowLink link = (PageflowLink) it.next();
-
-			unhookFromPageflowElement(link);
-		}
-
-		it = getPageflowNode().getOutlinks().iterator();
-		while (it.hasNext()) {
-			PageflowLink link = (PageflowLink) it.next();
-
-			unhookFromPageflowElement(link);
-		}
-	}
-
-	/**
-	 * perfrom direct edit request
-	 * 
-	 */
-	protected void performDirectEdit() {
-		if (editManager == null) {
-			Label l = ((PageflowNodeFigure) getFigure()).getLabel();
-			editManager = new PageflowDirectEditManager(this,
-					TextCellEditor.class, new DirectEditCellEditorLocator(l), l);
-		}
-		editManager.show();
-	}
-
-	/**
-	 * perform double click request
-	 * 
-	 */
-	protected void performOpen() {
-		// only Page and Action support the double-click commands
-		if (getModel() instanceof PageflowPage) {
-			// CommandStack stack =
-			// getViewer().getEditDomain().getCommandStack();
-			Command command = new OpenEditorCommand(this);
-			if (command != null && command.canExecute()) {
-				// stack.execute(command);
-				command.execute();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setForegroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setForegroundColor(Color c) {
-		getPageflowNodeFigure().setForegroundColor(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setBackgroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setBackgroundColor(Color c) {
-		getPageflowNodeFigure().setBackgroundColor(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setFont(org.eclipse.swt.graphics.Font)
-	 */
-	public void setFont(Font f) {
-		getPageflowNodeFigure().setFont(f);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.INodePreference#setTextPlacement(int)
-	 */
-	public void setTextPlacement(int where) {
-		getPageflowNodeFigure().setTextPlacement(where);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IEditPartDecorator#decorateEditPart()
-	 */
-	public void addAnnotation(final Annotation annotation) {
-		getViewer().getControl().getDisplay().asyncExec(new Runnable() {
-			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 8b94515..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.
- * 
- * 
- */
-public 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 96deb05..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowTreePartFactory.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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;
-
-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 718b7ac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PFLinkBendpointEditPolicy.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.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;
-
-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 5f098ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PFLinkEditPolicy.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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;
-
-public class PFLinkEditPolicy extends ConnectionEditPolicy {
-
-	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 06a9e39..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PFLinkEndpointEditPolicy.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 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;
-
-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);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ConnectionEndpointEditPolicy#getConnectionFigure
-	 */
-	protected 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 f6d9c7c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowContainerEditPolicy.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.editpolicy;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gef.editpolicies.ContainerEditPolicy;
-import org.eclipse.gef.requests.CreateRequest;
-import org.eclipse.gef.requests.GroupRequest;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.OrphanChildCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-
-public class PageflowContainerEditPolicy extends ContainerEditPolicy {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ContainerEditPolicy#getCreateCommand()
-	 */
-	protected Command getCreateCommand(CreateRequest request) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ContainerEditPolicy#getOrphanChildrenCommand()
-	 */
-	public Command getOrphanChildrenCommand(GroupRequest request) {
-		List parts = request.getEditParts();
-		CompoundCommand result = new CompoundCommand("orphanchildcommand");
-		for (int i = 0; i < parts.size(); i++) {
-			OrphanChildCommand orphan = new OrphanChildCommand();
-			orphan
-					.setChild((PageflowNode) ((EditPart) parts.get(i))
-							.getModel());
-			orphan.setParent((Pageflow) getHost().getModel());
-			orphan.setLabel("label here");
-			result.add(orphan);
-		}
-		return result.unwrap();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowElementEditPolicy.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowElementEditPolicy.java
deleted file mode 100644
index 8175c7c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowElementEditPolicy.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.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;
-
-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 d7024f3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowNodeEditPolicy.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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.pageflow.model.impl.PageflowNodeImpl;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-
-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())) {
-			OpenEditorCommand command = new OpenEditorCommand(getHost());
-
-			command.setChild((PageflowNodeImpl) getHost().getModel());
-
-			return command;
-		}
-
-		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 53d0d8c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowXYLayoutEditPolicy.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy;
-
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.ResizableEditPolicy;
-import org.eclipse.gef.editpolicies.XYLayoutEditPolicy;
-import org.eclipse.gef.requests.CreateRequest;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.AddNodeCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.CreateNodeCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.SetConstraintCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowNodeEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-
-public class PageflowXYLayoutEditPolicy extends XYLayoutEditPolicy {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see XYLayoutEditPolicy#createAddCommand()
-	 */
-	protected Command createAddCommand(EditPart childEditPart, Object constraint) {
-		PageflowNode part = (PageflowNode) childEditPart.getModel();
-		Rectangle rect = (Rectangle) constraint;
-
-		AddNodeCommand add = new AddNodeCommand();
-		add.setParent((Pageflow) getHost().getModel());
-		add.setChild(part);
-		add.setLabel("add");
-		add.setDebugLabel("PageFlowXYEP add subpart"); //$NON-NLS-1$
-
-		SetConstraintCommand setConstraint = new SetConstraintCommand();
-
-		setConstraint.setLocation(rect);
-		setConstraint.setPart(part);
-		setConstraint.setLabel("add");
-		setConstraint.setDebugLabel("PageFlowXYEP setConstraint"); //$NON-NLS-1$
-		return add.chain(setConstraint);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see XYLayoutEditPolicy#createChangeConstraintCommand()
-	 */
-	protected Command createChangeConstraintCommand(EditPart child,
-			Object constraint) {
-		SetConstraintCommand locationCommand = new SetConstraintCommand();
-		locationCommand.setPart((PageflowNode) child.getModel());
-		locationCommand.setLocation((Rectangle) constraint);
-		return locationCommand;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see XYLayoutEditPolicy#createChildEditPolicy()
-	 */
-	protected EditPolicy createChildEditPolicy(EditPart child) {
-		if (child instanceof PageflowNodeEditPart) {
-			return new PageflowNodeSelectionEditPolicy();
-		}
-
-		return new ResizableEditPolicy();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see XYLayoutEditPolicy#getCreateCommand()
-	 */
-	protected Command getCreateCommand(CreateRequest request) {
-		CreateNodeCommand create = new CreateNodeCommand();
-		create.setParent((Pageflow) getHost().getModel());
-		create.setChild((PageflowNode) request.getNewObject());
-		Rectangle constraint = (Rectangle) getConstraintFor(request);
-		create.setLocation(constraint);
-		create.setLabel("Add");
-		return create;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see XYLayoutEditPolicy#getDeleteDependantCommand()
-	 */
-	protected Command getDeleteDependantCommand(Request request) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see XYLayoutEditPolicy#getOrphanChildrenCommand()
-	 */
-	protected Command getOrphanChildrenCommand(Request request) {
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/ConnectionLabel.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/ConnectionLabel.java
deleted file mode 100644
index 702e58e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/ConnectionLabel.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure;
-
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.LineBorder;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * This label is used in connection figure, which has a border.
- * 
- * @author Xiao-guang Zhang
- * 
- */
-public class ConnectionLabel extends Label {
-	/**
-	 * 
-	 */
-	public ConnectionLabel() {
-		this(null, null);
-	}
-
-	/**
-	 * @param s
-	 */
-	public ConnectionLabel(String s) {
-		this(s, null);
-	}
-
-	/**
-	 * @param i
-	 */
-	public ConnectionLabel(Image i) {
-		this(null, i);
-	}
-
-	/**
-	 * @param s
-	 * @param i
-	 */
-	public ConnectionLabel(String s, Image i) {
-		super(s, i);
-
-		// setBorder(new LineBorder());
-		setOpaque(true);
-	}
-
-	/**
-	 * set the label's border's width
-	 * 
-	 * @param w
-	 */
-	public void setBorderWidth(int w) {
-		if (getBorder() != null) {
-			((LineBorder) getBorder()).setWidth(w);
-		}
-	}
-
-	/**
-	 * set the label's border's color
-	 * 
-	 * @param c
-	 */
-	public void setBorderColor(Color c) {
-		if (getBorder() != null) {
-			((LineBorder) getBorder()).setColor(c);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/ILabelDecorator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/ILabelDecorator.java
deleted file mode 100644
index d1d0137..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/ILabelDecorator.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure;
-
-import org.eclipse.swt.graphics.Image;
-
-/**
- * A label decorator decorates the label text and image for some element. The
- * original label text and image are obtained by some other means,
- * 
- * 
- * @author Xiao-guang Zhang
- */
-public interface ILabelDecorator {
-	/**
-	 * Returns an image that is based on the given image, but decorated with
-	 * additional information relating to the state of the provided element.
-	 * 
-	 * @param image
-	 *            the input image to decorate, or <code>null</code> if the
-	 *            element has no image
-	 * @param element
-	 *            the element whose image is being decorated
-	 * @return the decorated image, or <code>null</code> if no decoration is
-	 *         to be applied
-	 * 
-	 * @see org.eclipse.jface.resource.CompositeImageDescriptor
-	 */
-	public Image decorateImage(Image image, Object element);
-
-	/**
-	 * Returns a text label that is based on the given text label, but decorated
-	 * with additional information relating to the state of the provided
-	 * element.
-	 * 
-	 * 
-	 * @param text
-	 *            the input text label to decorate
-	 * @param element
-	 *            the element whose image is being decorated
-	 * @return the decorated text label, or <code>null</code> if no decoration
-	 *         is to be applied
-	 */
-	public String decorateText(String text, Object element);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/NodeLabel.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/NodeLabel.java
deleted file mode 100644
index fa5764d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/NodeLabel.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure;
-
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * This derived label has simple tooltip support
- * 
- * @author Xiao-guang Zhang
- * 
- */
-public class NodeLabel extends Label {
-	/**
-	 * 
-	 */
-	public NodeLabel() {
-		super();
-	}
-
-	/**
-	 * @param s
-	 */
-	public NodeLabel(String s) {
-		super(s);
-	}
-
-	/**
-	 * @param i
-	 */
-	public NodeLabel(Image i) {
-		super(i);
-	}
-
-	/**
-	 * @param s
-	 * @param i
-	 */
-	public NodeLabel(String s, Image i) {
-		super(s, i);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Label#setTextPlacement(int)
-	 */
-	public void setTextPlacement(int where) {
-		super.setTextPlacement(where);
-		layout();
-		invalidate();
-	}
-
-	/**
-	 * set tooltip text
-	 * 
-	 * @param text
-	 */
-	public void setToolTipText(String text) {
-		Label toolTipLabel = null;
-
-		if (text != null && text.length() > 0) {
-			toolTipLabel = new Label(text);
-			toolTipLabel.setBorder(new MarginBorder(3));
-		}
-
-		super.setToolTip(toolTipLabel);
-	}
-
-	/**
-	 * get tooltip's text
-	 * 
-	 * @return the tool tip text string
-	 */
-	public String getToolTipText() {
-		if (getToolTip() != null)
-			return ((Label) getToolTip()).getText();
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/PFLinkFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/PFLinkFigure.java
deleted file mode 100644
index 041fce3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/PFLinkFigure.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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);
-		}
-	}
-
-	public void clearIcon() {
-		setImage(null);
-	}
-
-	public void clearOutcome() {
-		setLabel("");
-	}
-
-	/**
-	 * set the connection's label string
-	 * 
-	 * @param image
-	 */
-	public void setImage(Image image) {
-		if (textLabel == null) {
-			textLabel = new ConnectionLabel();
-			textLabel.setFont(getLabelFont());
-			textLabel.setBackgroundColor(getLabelBackgroundColor());
-			textLabel.setForegroundColor(getLabelForegroundColor());
-			setLineWidth(getLineWidth());
-			setLabelVisible(getLabelVisible());
-			setForegroundColor(getForegroundColor());
-			add(textLabel, new MidpointLocator(this, 0));
-		}
-		textLabel.setIcon(image);
-	}
-
-	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);
-	}
-
-	public Image getImage() {
-		if (textLabel != null)
-        {
-			return textLabel.getIcon();
-        }
-        return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setToolTipText()
-	 */
-	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);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getToolTipText()
-	 */
-	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 be73575..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/PageflowNodeFigure.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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;
-
-	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);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setToolTipText()
-	 */
-	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);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getToolTipText()
-	 */
-	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 9f56b7c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/Pageflow.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.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);
-
-	/**
-	 * 
-	 * @generated NOT
-	 */
-	public void connect(PageflowNode source, PageflowNode target, PageflowLink link);
-
-	/**
-	 * 
-	 * @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 d0fe7c6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowElement.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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.
-	 * 
-	 * @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);
-
-	/**
-	 * @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 5d5f57a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowLink.java
+++ /dev/null
@@ -1,308 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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();
-
-	void setTargetPath(String 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 <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void insertBendpoint(int index, PageflowLinkBendpoint point);
-
-	/**
-	 * <!-- begin-user-doc --> remove the current bendpoint <!-- end-user-doc
-	 * -->
-	 * 
-	 * @generated NOT
-	 */
-	public void removeBendpoint(int index);
-
-	/**
-	 * <!-- begin-user-doc --> Set the current bendpoint <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setBendpoint(int index, PageflowLinkBendpoint point);
-
-	/**
-	 * <!-- begin-user-doc --> Set a group of bendpoints to reconstruct the link
-	 * <!-- 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 a0bb298..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowLinkBendpoint.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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 --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public Dimension getFirstRelativeDimension();
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public Dimension getSecondRelativeDimension();
-
-	/**
-	 * <!-- begin-user-doc --> <!-- 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 fe50af4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowNode.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.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();
-
-	/**
-	 * @generated NOT
-	 */
-	PageflowLink findLinkTo(PageflowNode target);
-
-}
-// PageflowNode
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowPackage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowPackage.java
deleted file mode 100644
index ce9358b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowPackage.java
+++ /dev/null
@@ -1,1161 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc --> The <b>Package</b> for the model. It contains
- * accessors for the meta objects to represent
- * <ul>
- * <li>each class,</li>
- * <li>each feature of each class,</li>
- * <li>each enum,</li>
- * <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * 
- * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory
- * @generated
- */
-public interface PageflowPackage extends EPackage {
-	/**
-	 * The package name. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	String eNAME = "pageflow";
-
-	/**
-	 * The package namespace URI. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	String eNS_URI = "http://www.sybase.com/suade/pageflow";
-
-	/**
-	 * The package namespace name. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	String eNS_PREFIX = "pageflow";
-
-	/**
-	 * The singleton instance of the package. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	PageflowPackage eINSTANCE = org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl
-			.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowElementImpl <em>Element</em>}'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowElementImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl#getPageflowElement()
-	 * @generated
-	 */
-	int PAGEFLOW_ELEMENT = 3;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__NAME = 0;
-
-	/**
-	 * The feature id for the '<em><b>Comment</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__COMMENT = 1;
-
-	/**
-	 * The feature id for the '<em><b>X</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__X = 2;
-
-	/**
-	 * The feature id for the '<em><b>Y</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__Y = 3;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__WIDTH = 4;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__HEIGHT = 5;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__ID = 6;
-
-	/**
-	 * The feature id for the '<em><b>Reference Link</b></em>' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__REFERENCE_LINK = 7;
-
-	/**
-	 * The number of structural features of the the '<em>Element</em>'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT_FEATURE_COUNT = 8;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowImpl <em>Pageflow</em>}'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl#getPageflow()
-	 * @generated
-	 */
-	int PAGEFLOW = 0;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__NAME = PAGEFLOW_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Comment</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__COMMENT = PAGEFLOW_ELEMENT__COMMENT;
-
-	/**
-	 * The feature id for the '<em><b>X</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__X = PAGEFLOW_ELEMENT__X;
-
-	/**
-	 * The feature id for the '<em><b>Y</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__Y = PAGEFLOW_ELEMENT__Y;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__WIDTH = PAGEFLOW_ELEMENT__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__HEIGHT = PAGEFLOW_ELEMENT__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__ID = PAGEFLOW_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Reference Link</b></em>' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__REFERENCE_LINK = PAGEFLOW_ELEMENT__REFERENCE_LINK;
-
-	/**
-	 * The feature id for the '<em><b>Nodes</b></em>' containment reference
-	 * list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__NODES = PAGEFLOW_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Links</b></em>' containment reference
-	 * list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__LINKS = PAGEFLOW_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Configfile</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__CONFIGFILE = PAGEFLOW_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the the '<em>Pageflow</em>'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_FEATURE_COUNT = PAGEFLOW_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowNodeImpl <em>Node</em>}'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowNodeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl#getPageflowNode()
-	 * @generated
-	 */
-	int PAGEFLOW_NODE = 1;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__NAME = PAGEFLOW_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Comment</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__COMMENT = PAGEFLOW_ELEMENT__COMMENT;
-
-	/**
-	 * The feature id for the '<em><b>X</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__X = PAGEFLOW_ELEMENT__X;
-
-	/**
-	 * The feature id for the '<em><b>Y</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__Y = PAGEFLOW_ELEMENT__Y;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__WIDTH = PAGEFLOW_ELEMENT__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__HEIGHT = PAGEFLOW_ELEMENT__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__ID = PAGEFLOW_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Reference Link</b></em>' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__REFERENCE_LINK = PAGEFLOW_ELEMENT__REFERENCE_LINK;
-
-	/**
-	 * The feature id for the '<em><b>Pageflow</b></em>' container
-	 * reference. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__PAGEFLOW = PAGEFLOW_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Outlinks</b></em>' reference list.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__OUTLINKS = PAGEFLOW_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Inlinks</b></em>' reference list.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__INLINKS = PAGEFLOW_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the the '<em>Node</em>' class.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE_FEATURE_COUNT = PAGEFLOW_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl <em>PF Link</em>}'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl#getPFLink()
-	 * @generated
-	 */
-	int PF_LINK = 2;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__NAME = PAGEFLOW_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Comment</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__COMMENT = PAGEFLOW_ELEMENT__COMMENT;
-
-	/**
-	 * The feature id for the '<em><b>X</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__X = PAGEFLOW_ELEMENT__X;
-
-	/**
-	 * The feature id for the '<em><b>Y</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__Y = PAGEFLOW_ELEMENT__Y;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__WIDTH = PAGEFLOW_ELEMENT__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__HEIGHT = PAGEFLOW_ELEMENT__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__ID = PAGEFLOW_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Reference Link</b></em>' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__REFERENCE_LINK = PAGEFLOW_ELEMENT__REFERENCE_LINK;
-
-	/**
-	 * The feature id for the '<em><b>Pageflow</b></em>' container
-	 * reference. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__PAGEFLOW = PAGEFLOW_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Target</b></em>' reference. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__TARGET = PAGEFLOW_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Source</b></em>' reference. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__SOURCE = PAGEFLOW_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Outcome</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__OUTCOME = PAGEFLOW_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Redirect</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__REDIRECT = PAGEFLOW_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Bend Points</b></em>' containment
-	 * reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__BEND_POINTS = PAGEFLOW_ELEMENT_FEATURE_COUNT + 5;
-
-	/**
-	 * The feature id for the '<em><b>Smallicon</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__SMALLICON = PAGEFLOW_ELEMENT_FEATURE_COUNT + 6;
-
-	/**
-	 * The feature id for the '<em><b>Largeicon</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__LARGEICON = PAGEFLOW_ELEMENT_FEATURE_COUNT + 7;
-
-	/**
-	 * The feature id for the '<em><b>Fromaction</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__FROMACTION = PAGEFLOW_ELEMENT_FEATURE_COUNT + 8;
-
-	/**
-	 * The number of structural features of the the '<em>PF Link</em>'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_FEATURE_COUNT = PAGEFLOW_ELEMENT_FEATURE_COUNT + 9;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPageImpl <em>PF Page</em>}'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPageImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl#getPFPage()
-	 * @generated
-	 */
-	int PF_PAGE = 5;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__NAME = PAGEFLOW_NODE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Comment</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__COMMENT = PAGEFLOW_NODE__COMMENT;
-
-	/**
-	 * The feature id for the '<em><b>X</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__X = PAGEFLOW_NODE__X;
-
-	/**
-	 * The feature id for the '<em><b>Y</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__Y = PAGEFLOW_NODE__Y;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__WIDTH = PAGEFLOW_NODE__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__HEIGHT = PAGEFLOW_NODE__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__ID = PAGEFLOW_NODE__ID;
-
-	/**
-	 * The feature id for the '<em><b>Pageflow</b></em>' container
-	 * reference. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__PAGEFLOW = PAGEFLOW_NODE__PAGEFLOW;
-
-	/**
-	 * The feature id for the '<em><b>Outlinks</b></em>' reference list.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__OUTLINKS = PAGEFLOW_NODE__OUTLINKS;
-
-	/**
-	 * The feature id for the '<em><b>Inlinks</b></em>' reference list.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__INLINKS = PAGEFLOW_NODE__INLINKS;
-
-	/**
-	 * The feature id for the '<em><b>Path</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__PATH = PAGEFLOW_NODE_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Smallicon</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__SMALLICON = PAGEFLOW_NODE_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Largeicon</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__LARGEICON = PAGEFLOW_NODE_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the the '<em>PF Page</em>'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE_FEATURE_COUNT = PAGEFLOW_NODE_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl <em>PF Link Bendpoint</em>}'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl#getPFLinkBendpoint()
-	 * @generated
-	 */
-	int PF_LINK_BENDPOINT = 8;
-
-	/**
-	 * The feature id for the '<em><b>D1 Width</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_BENDPOINT__D1_WIDTH = 0;
-
-	/**
-	 * The feature id for the '<em><b>D1 Height</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_BENDPOINT__D1_HEIGHT = 1;
-
-	/**
-	 * The feature id for the '<em><b>D2 Width</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_BENDPOINT__D2_WIDTH = 2;
-
-	/**
-	 * The feature id for the '<em><b>D2 Height</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_BENDPOINT__D2_HEIGHT = 3;
-
-	/**
-	 * The feature id for the '<em><b>Weight</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_BENDPOINT__WEIGHT = 4;
-
-	/**
-	 * The feature id for the '<em><b>Link</b></em>' container reference.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_BENDPOINT__LINK = 5;
-
-	/**
-	 * The number of structural features of the the '<em>PF Link Bendpoint</em>'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_BENDPOINT_FEATURE_COUNT = 6;
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow <em>Pageflow</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>Pageflow</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow
-	 * @generated
-	 */
-	EClass getPageflow();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getNodes <em>Nodes</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the containment reference list '<em>Nodes</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getNodes()
-	 * @see #getPageflow()
-	 * @generated
-	 */
-	EReference getPageflow_Nodes();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getLinks <em>Links</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the containment reference list '<em>Links</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getLinks()
-	 * @see #getPageflow()
-	 * @generated
-	 */
-	EReference getPageflow_Links();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getConfigfile <em>Configfile</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Configfile</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getConfigfile()
-	 * @see #getPageflow()
-	 * @generated
-	 */
-	EAttribute getPageflow_Configfile();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode <em>Node</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>Node</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode
-	 * @generated
-	 */
-	EClass getPageflowNode();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getPageflow <em>Pageflow</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the container reference '<em>Pageflow</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getPageflow()
-	 * @see #getPageflowNode()
-	 * @generated
-	 */
-	EReference getPageflowNode_Pageflow();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getOutlinks <em>Outlinks</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the reference list '<em>Outlinks</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getOutlinks()
-	 * @see #getPageflowNode()
-	 * @generated
-	 */
-	EReference getPageflowNode_Outlinks();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getInlinks <em>Inlinks</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the reference list '<em>Inlinks</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getInlinks()
-	 * @see #getPageflowNode()
-	 * @generated
-	 */
-	EReference getPageflowNode_Inlinks();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink <em>PF Link</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>PF Link</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink
-	 * @generated
-	 */
-	EClass getPFLink();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getPageflow <em>Pageflow</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the container reference '<em>Pageflow</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getPageflow()
-	 * @see #getPFLink()
-	 * @generated
-	 */
-	EReference getPFLink_Pageflow();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getTarget <em>Target</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the reference '<em>Target</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getTarget()
-	 * @see #getPFLink()
-	 * @generated
-	 */
-	EReference getPFLink_Target();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getSource <em>Source</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the reference '<em>Source</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getSource()
-	 * @see #getPFLink()
-	 * @generated
-	 */
-	EReference getPFLink_Source();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getOutcome <em>Outcome</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Outcome</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getOutcome()
-	 * @see #getPFLink()
-	 * @generated
-	 */
-	EAttribute getPFLink_Outcome();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getOutcome <em>Outcome</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Outcome</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getOutcome()
-	 * @see #getPFLink()
-	 * @generated
-	 */
-	EAttribute getPFLink_Fromaction();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#isRedirect <em>Redirect</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Redirect</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#isRedirect()
-	 * @see #getPFLink()
-	 * @generated
-	 */
-	EAttribute getPFLink_Redirect();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getBendPoints <em>Bend Points</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the containment reference list '<em>Bend Points</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getBendPoints()
-	 * @see #getPFLink()
-	 * @generated
-	 */
-	EReference getPFLink_BendPoints();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement <em>Element</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>Element</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement
-	 * @generated
-	 */
-	EClass getPageflowElement();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getName()
-	 * @see #getPageflowElement()
-	 * @generated
-	 */
-	EAttribute getPageflowElement_Name();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getComment <em>Comment</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Comment</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getComment()
-	 * @see #getPageflowElement()
-	 * @generated
-	 */
-	EAttribute getPageflowElement_Comment();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getX <em>X</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>X</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getX()
-	 * @see #getPageflowElement()
-	 * @generated
-	 */
-	EAttribute getPageflowElement_X();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getY <em>Y</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Y</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getY()
-	 * @see #getPageflowElement()
-	 * @generated
-	 */
-	EAttribute getPageflowElement_Y();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getWidth <em>Width</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Width</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getWidth()
-	 * @see #getPageflowElement()
-	 * @generated
-	 */
-	EAttribute getPageflowElement_Width();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getHeight <em>Height</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Height</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getHeight()
-	 * @see #getPageflowElement()
-	 * @generated
-	 */
-	EAttribute getPageflowElement_Height();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getId()
-	 * @see #getPageflowElement()
-	 * @generated
-	 */
-	EAttribute getPageflowElement_Id();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage <em>PF Page</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>PF Page</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage
-	 * @generated
-	 */
-	EClass getPFPage();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getPath <em>Path</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Path</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getPath()
-	 * @see #getPFPage()
-	 * @generated
-	 */
-	EAttribute getPFPage_Path();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getSmallicon <em>Smallicon</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Smallicon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getSmallicon()
-	 * @see #getPFPage()
-	 * @generated
-	 */
-	EAttribute getPFPage_Smallicon();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getLargeicon <em>Largeicon</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Largeicon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getLargeicon()
-	 * @see #getPFPage()
-	 * @generated
-	 */
-	EAttribute getPFPage_Largeicon();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint <em>PF Link Bendpoint</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>PF Link Bendpoint</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint
-	 * @generated
-	 */
-	EClass getPFLinkBendpoint();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD1Width <em>D1 Width</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>D1 Width</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD1Width()
-	 * @see #getPFLinkBendpoint()
-	 * @generated
-	 */
-	EAttribute getPFLinkBendpoint_D1Width();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD1Height <em>D1 Height</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>D1 Height</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD1Height()
-	 * @see #getPFLinkBendpoint()
-	 * @generated
-	 */
-	EAttribute getPFLinkBendpoint_D1Height();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD2Width <em>D2 Width</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>D2 Width</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD2Width()
-	 * @see #getPFLinkBendpoint()
-	 * @generated
-	 */
-	EAttribute getPFLinkBendpoint_D2Width();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD2Height <em>D2 Height</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>D2 Height</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD2Height()
-	 * @see #getPFLinkBendpoint()
-	 * @generated
-	 */
-	EAttribute getPFLinkBendpoint_D2Height();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getWeight <em>Weight</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Weight</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getWeight()
-	 * @see #getPFLinkBendpoint()
-	 * @generated
-	 */
-	EAttribute getPFLinkBendpoint_Weight();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getLink <em>Link</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the container reference '<em>Link</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getLink()
-	 * @see #getPFLinkBendpoint()
-	 * @generated
-	 */
-	EReference getPFLinkBendpoint_Link();
-
-	/**
-	 * Returns the factory that creates the instances of the model. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	PageflowFactory getPageflowFactory();
-
-}
-// PageflowPackage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowPage.java
deleted file mode 100644
index b6cecb5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowPage.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model;
-
-/**
- * <!-- begin-user-doc --> A representation of the model object '<em><b>PF Page</b></em>'.
- * <!-- end-user-doc -->
- * 
- * <p>
- * The following features are supported:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getPath <em>Path</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getSmallicon <em>Smallicon</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getLargeicon <em>Largeicon</em>}</li>
- * </ul>
- * </p>
- * 
- * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFPage()
- * @model
- * @generated
- */
-public interface PageflowPage extends PageflowNode {
-	/**
-	 * Returns the value of the '<em><b>Path</b></em>' attribute. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Path</em>' attribute isn't clear, there
-	 * really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Path</em>' attribute.
-	 * @see #setPath(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFPage_Path()
-	 * @model
-	 * @generated
-	 */
-	String getPath();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getPath <em>Path</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Path</em>' attribute.
-	 * @see #getPath()
-	 * @generated
-	 */
-	void setPath(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Smallicon</b></em>' attribute. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Smallicon</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Smallicon</em>' attribute.
-	 * @see #setSmallicon(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFPage_Smallicon()
-	 * @model
-	 * @generated
-	 */
-	String getSmallicon();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getSmallicon <em>Smallicon</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Smallicon</em>' attribute.
-	 * @see #getSmallicon()
-	 * @generated
-	 */
-	void setSmallicon(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Largeicon</b></em>' attribute. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Largeicon</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Largeicon</em>' attribute.
-	 * @see #setLargeicon(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFPage_Largeicon()
-	 * @model
-	 * @generated
-	 */
-	String getLargeicon();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getLargeicon <em>Largeicon</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Largeicon</em>' attribute.
-	 * @see #getLargeicon()
-	 * @generated
-	 */
-	void setLargeicon(String value);
-
-}
-// PFPage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/LinkReferenceElement.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/LinkReferenceElement.java
deleted file mode 100644
index efff345..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,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.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);
-	}
-
-	public LinkReferenceElement(PageflowElement pageflowElement) {
-		super(pageflowElement);
-		// TODO Auto-generated constructor stub
-	}
-
-	public LinkReferenceElement(PageflowElement pageflowElement,
-			EObject facesConfigObject) {
-		super(pageflowElement, facesConfigObject);
-		// TODO Auto-generated constructor stub
-	}
-
-	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 e78cf09..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,392 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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 {
-
-	public PageReferenceElement(PageflowElement pageflowElement) {
-		super(pageflowElement);
-		// TODO Auto-generated constructor stub
-	}
-
-	public PageReferenceElement(PageflowElement pageflowElement,
-			EObject facesConfigObject) {
-		super(pageflowElement, facesConfigObject);
-		// TODO Auto-generated constructor stub
-	}
-
-	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;
-	}
-
-	public NavigationRuleType resolveRuleFromFCElement(Object object) {
-		if (object instanceof FromViewIdType) {
-			return (NavigationRuleType) ((FromViewIdType) object).eContainer();
-		}
-		return null;
-	}
-
-	public NavigationRuleType resolveRuleFromPFElement(Object object) {
-		if (object instanceof PageflowLink) {
-			NavigationCaseType caseType = (NavigationCaseType) ((PageflowLink) object)
-					.getFCElements().getData().get(0);
-			return (NavigationRuleType) caseType.eContainer();
-		}
-		return null;
-	}
-
-	public void set(EStructuralFeature eFeature, Object newVal) {
-		switch (eFeature.getFeatureID()) {
-		case PageflowPackage.PF_PAGE__COMMENT: {
-			DescriptionType description = null;
-			String newValue = (String) newVal;
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					NavigationRuleType rule = null;
-					if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) {
-						rule.getDescription().clear();
-						description = FacesConfigFactory.eINSTANCE
-								.createDescriptionType();
-						description.setTextContent(newValue);
-						rule.getDescription().add(description);
-					}
-				}
-			}
-			break;
-		}
-		case PageflowPackage.PF_PAGE__LARGEICON: {
-			LargeIconType oldLargeIcon = null;
-			LargeIconType newLargeIconType = null;
-			IconType icon = null;
-			String newValue = (String) newVal;
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					NavigationRuleType rule = null;
-					if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) {
-						List icons = rule.getIcon();
-						if (newValue == null || newValue.length() == 0) {
-							if (icons.size() > 0) {
-								if (((IconType) icons.get(0)).getLargeIcon() != null) {
-									((IconType) icons.get(0))
-											.setLargeIcon(null);
-								}
-							}
-						} else {
-							if (icons.size() == 0) {
-								icon = FacesConfigFactory.eINSTANCE
-										.createIconType();
-								newLargeIconType = FacesConfigFactory.eINSTANCE
-										.createLargeIconType();
-								newLargeIconType.setTextContent(newValue);
-								icon.setLargeIcon(newLargeIconType);
-								icons.add(icon);
-							} else if (((IconType) icons.get(0)).getLargeIcon() == null) {
-								newLargeIconType = FacesConfigFactory.eINSTANCE
-										.createLargeIconType();
-								newLargeIconType.setTextContent(newValue);
-								icon = ((IconType) icons.get(0));
-								icon.setLargeIcon(newLargeIconType);
-							} else {
-								oldLargeIcon = ((IconType) icons.get(0))
-										.getLargeIcon();
-								oldLargeIcon.setTextContent(newValue);
-							}
-						}
-					}
-				}
-			}
-			break;
-		}
-		case PageflowPackage.PF_PAGE__NAME:
-			DisplayNameType newDisplayNameType = null;
-			String newName = (String) newVal;
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					NavigationRuleType rule = null;
-					if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) {
-						rule.getDisplayName().clear();
-						if (newName != null && newName.length() > 0) {
-							newDisplayNameType = FacesConfigFactory.eINSTANCE
-									.createDisplayNameType();
-							newDisplayNameType.setTextContent(newName);
-							rule.getDisplayName().add(newDisplayNameType);
-						}
-					}
-				}
-			}
-			break;
-		case PageflowPackage.PF_PAGE__PATH: {
-			Object oldPath = null;
-			Object newPath = null;
-			String newValue = (String) newVal;
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					if (getData().get(i) instanceof FromViewIdType) {
-						oldPath = getData().get(i);
-						((FromViewIdType) oldPath).setTextContent(newValue);
-					} else if (getData().get(i) instanceof ToViewIdType) {
-						oldPath = getData().get(i);
-						((ToViewIdType) oldPath).setTextContent(newValue);
-					}
-				}
-			}
-			// Create new fromViewID or toViewID node as needed.
-			else if (newValue != null && !"*".equals(newValue)) {
-				if (((PageflowPage) pageflowElement).getOutlinks().size() > 0) {
-					List links = ((PageflowPage) pageflowElement).getOutlinks();
-					for (int i = 0, n = links.size(); i < n; i++) {
-						PageflowLink link = (PageflowLink) links.get(i);
-						NavigationRuleType rule = resolveRuleFromPFElement(link);
-						newPath = FC2PFTransformer.createRLFromViewID(newValue);
-						rule.setFromViewId((FromViewIdType) newPath);
-						add((EObject) newPath);
-					}
-					links = ((PageflowPage) pageflowElement).getInlinks();
-					for (int i = 0, n = links.size(); i < n; i++) {
-						PageflowLink link = (PageflowLink) links.get(i);
-						NavigationCaseType caseType = (NavigationCaseType) link
-								.getFCElements().getData().get(0);
-						newPath = FC2PFTransformer.createFCToViewID(newValue);
-						caseType.setToViewId((ToViewIdType) newPath);
-						add((EObject) newPath);
-					}
-				}
-			}
-			break;
-		}
-		case PageflowPackage.PF_PAGE__SMALLICON: {
-			SmallIconType oldSmallicon = null;
-			SmallIconType newSmallIconType = null;
-			IconType icon = null;
-			String newValue = (String) newVal;
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					NavigationRuleType rule = null;
-					if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) {
-						List icons = rule.getIcon();
-						if (newValue == null || newValue.length() == 0) {
-							if (icons.size() > 0) {
-								if (((IconType) icons.get(0)).getSmallIcon() != null) {
-									((IconType) icons.get(0))
-											.setSmallIcon(null);
-								}
-							}
-						} else {
-							if (icons.size() == 0) {
-								icon = FacesConfigFactory.eINSTANCE
-										.createIconType();
-								newSmallIconType = FacesConfigFactory.eINSTANCE
-										.createSmallIconType();
-								newSmallIconType.setTextContent(newValue);
-								icon.setSmallIcon(newSmallIconType);
-								icons.add(icon);
-							} else if (((IconType) icons.get(0)).getSmallIcon() == null) {
-								newSmallIconType = FacesConfigFactory.eINSTANCE
-										.createSmallIconType();
-								newSmallIconType.setTextContent(newValue);
-								icon = ((IconType) icons.get(0));
-								icon.setSmallIcon(newSmallIconType);
-							} else {
-								oldSmallicon = ((IconType) icons.get(0))
-										.getSmallIcon();
-								oldSmallicon.setTextContent(newValue);
-							}
-						}
-					}
-				}
-			}
-			break;
-		}
-		}
-	}
-
-	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 eb7c4b8..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,607 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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 {
-	protected static final String idPrefix = "pf";
-
-	protected String id;
-
-	protected static int counter = 0;
-
-	protected ReferenceElement refElement;
-
-	/**
-	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NAME_EDEFAULT = "unnamed";
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String name = NAME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getComment() <em>Comment</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getComment()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String COMMENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getComment() <em>Comment</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getComment()
-	 * @generated
-	 * @ordered
-	 */
-	protected String comment = COMMENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getX() <em>X</em>}' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getX()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int X_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getX() <em>X</em>}' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getX()
-	 * @generated
-	 * @ordered
-	 */
-	protected int x = X_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getY() <em>Y</em>}' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getY()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int Y_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getY() <em>Y</em>}' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getY()
-	 * @generated
-	 * @ordered
-	 */
-	protected int y = Y_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getWidth() <em>Width</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getWidth()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int WIDTH_EDEFAULT = -1;
-
-	/**
-	 * The cached value of the '{@link #getWidth() <em>Width</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getWidth()
-	 * @generated
-	 * @ordered
-	 */
-	protected int width = WIDTH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getHeight() <em>Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getHeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int HEIGHT_EDEFAULT = -1;
-
-	/**
-	 * The default value of the '{@link #getReferenceLink() <em>Reference Link</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getReferenceLink()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String REFERENCE_LINK_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getReferenceLink() <em>Reference Link</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getReferenceLink()
-	 * @generated
-	 * @ordered
-	 */
-	protected String referenceLink = REFERENCE_LINK_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getHeight() <em>Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getHeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected int height = HEIGHT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected PageflowElementImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PageflowPackage.eINSTANCE.getPageflowElement();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String getName() {
-		return name == null || name.length() == 0 ? NAME_EDEFAULT : name;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setName(String newName) {
-		String oldName = name;
-		name = newName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__NAME, oldName, name));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String getComment() {
-		return comment;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setComment(String newComment) {
-		String oldComment = comment;
-		comment = newComment;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__COMMENT, oldComment,
-					comment));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getX() {
-		return x;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setX(int newX) {
-		int oldX = x;
-		x = newX;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__X, oldX, x));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getY() {
-		return y;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setY(int newY) {
-		int oldY = y;
-		y = newY;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__Y, oldY, y));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getWidth() {
-		return width;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setWidth(int newWidth) {
-		int oldWidth = width;
-		width = newWidth;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__WIDTH, oldWidth, width));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getHeight() {
-		return height;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setHeight(int newHeight) {
-		int oldHeight = height;
-		height = newHeight;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__HEIGHT, oldHeight, height));
-	}
-
-	/**
-	 * Generate (and cache) an id as needed
-	 * 
-	 * @generated NOT
-	 */
-	public String getId() {
-		if (id == null) {
-			id = generateId();
-		}
-		return id;
-	}
-
-	/**
-	 * Generate a random id based on the current time
-	 * 
-	 * @return the generated id
-	 * 
-	 * @generated NOT
-	 */
-	public synchronized String generateId() {
-		long current = System.currentTimeMillis();
-		return idPrefix + current + counter++;
-	}
-
-	/**
-	 * Set or generate an Id This method should not be called except when
-	 * populating from the serialization
-	 * 
-	 * @generated NOT
-	 */
-	public void setId(String newId) {
-		if (newId == null && id == null) {
-			id = generateId();
-		} else {
-			id = newId;
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String getReferenceLink() {
-		return referenceLink;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setReferenceLink(String newReferenceLink) {
-		String oldReferenceLink = referenceLink;
-		referenceLink = newReferenceLink;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__REFERENCE_LINK,
-					oldReferenceLink, referenceLink));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_ELEMENT__NAME:
-			return getName();
-		case PageflowPackage.PAGEFLOW_ELEMENT__COMMENT:
-			return getComment();
-		case PageflowPackage.PAGEFLOW_ELEMENT__X:
-			return new Integer(getX());
-		case PageflowPackage.PAGEFLOW_ELEMENT__Y:
-			return new Integer(getY());
-		case PageflowPackage.PAGEFLOW_ELEMENT__WIDTH:
-			return new Integer(getWidth());
-		case PageflowPackage.PAGEFLOW_ELEMENT__HEIGHT:
-			return new Integer(getHeight());
-		case PageflowPackage.PAGEFLOW_ELEMENT__ID:
-			return getId();
-		case PageflowPackage.PAGEFLOW_ELEMENT__REFERENCE_LINK:
-			return getReferenceLink();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_ELEMENT__NAME:
-			setName((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__COMMENT:
-			setComment((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__X:
-			setX(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__Y:
-			setY(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__WIDTH:
-			setWidth(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__HEIGHT:
-			setHeight(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__ID:
-			setId((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__REFERENCE_LINK:
-			setReferenceLink((String) newValue);
-			return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_ELEMENT__NAME:
-			setName(NAME_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__COMMENT:
-			setComment(COMMENT_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__X:
-			setX(X_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__Y:
-			setY(Y_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__WIDTH:
-			setWidth(WIDTH_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__HEIGHT:
-			setHeight(HEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__ID:
-			setId(ID_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__REFERENCE_LINK:
-			setReferenceLink(REFERENCE_LINK_EDEFAULT);
-			return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_ELEMENT__NAME:
-			return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT
-					.equals(name);
-		case PageflowPackage.PAGEFLOW_ELEMENT__COMMENT:
-			return COMMENT_EDEFAULT == null ? comment != null
-					: !COMMENT_EDEFAULT.equals(comment);
-		case PageflowPackage.PAGEFLOW_ELEMENT__X:
-			return x != X_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_ELEMENT__Y:
-			return y != Y_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_ELEMENT__WIDTH:
-			return width != WIDTH_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_ELEMENT__HEIGHT:
-			return height != HEIGHT_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_ELEMENT__ID:
-			return ID_EDEFAULT == null ? getId() != null : !ID_EDEFAULT
-					.equals(getId());
-		case PageflowPackage.PAGEFLOW_ELEMENT__REFERENCE_LINK:
-			return REFERENCE_LINK_EDEFAULT == null ? referenceLink != null
-					: !REFERENCE_LINK_EDEFAULT.equals(referenceLink);
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (name: ");
-		result.append(name);
-		result.append(", comment: ");
-		result.append(comment);
-		result.append(", x: ");
-		result.append(x);
-		result.append(", y: ");
-		result.append(y);
-		result.append(", width: ");
-		result.append(width);
-		result.append(", height: ");
-		result.append(height);
-		result.append(", referenceLink: ");
-		result.append(referenceLink);
-		result.append(')');
-		return result.toString();
-	}
-
-	/**
-	 * The synchronizer will use this to notify adapters for the faces-config's
-	 * modification.
-	 * 
-	 * @generated NOT
-	 */
-	public void notifyModelChanged(Notification notification) {
-		if (eNotificationRequired())
-			eNotify(notification);
-	}
-
-	/**
-	 * @generated NOT
-	 */
-
-	public ReferenceElement getFCElements() {
-		return null;
-	}
-
-	/**
-	 * @generated NOT
-	 */
-	public void update() {
-		getFCElements().update();
-		if (!TransformUtil.isValidPageflowElement(this)) {
-			eAdapters().clear();
-		}
-	}
-
-	/**
-	 * @generated NOT
-	 */
-	public void dispose() {
-		getFCElements().dispose();
-		eAdapters.clear();
-	}
-
-}
-// PageflowElementImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowFactoryImpl.java
deleted file mode 100644
index 5dcc2ee..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,123 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model <b>Factory</b>. <!--
- * end-user-doc -->
- * 
- * @generated
- */
-public class PageflowFactoryImpl extends EFactoryImpl implements
-		PageflowFactory {
-	/**
-	 * Creates and instance of the factory. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-		case PageflowPackage.PAGEFLOW:
-			return createPageflow();
-		case PageflowPackage.PF_LINK:
-			return createPFLink();
-		case PageflowPackage.PF_PAGE:
-			return createPFPage();
-		case PageflowPackage.PF_LINK_BENDPOINT:
-			return createPFLinkBendpoint();
-		default:
-			throw new IllegalArgumentException("The class '" + eClass.getName()
-					+ "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Pageflow createPageflow() {
-		PageflowImpl pageflow = new PageflowImpl();
-		return pageflow;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowLink createPFLink() {
-		PageflowLinkImpl pfLink = new PageflowLinkImpl();
-		return pfLink;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowPage createPFPage() {
-		PageflowPageImpl pfPage = new PageflowPageImpl();
-		return pfPage;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowLinkBendpoint createPFLinkBendpoint() {
-		PageflowLinkBendpointImpl pfLinkBendpoint = new PageflowLinkBendpointImpl();
-		return pfLinkBendpoint;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowPackage getPageflowPackage() {
-		return (PageflowPackage) getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @deprecated
-	 * @generated
-	 */
-	public static PageflowPackage getPackage() {
-		return PageflowPackage.eINSTANCE;
-	}
-
-}
-// PageflowFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowImpl.java
deleted file mode 100644
index 381e1d2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowImpl.java
+++ /dev/null
@@ -1,472 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Pageflow</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowImpl#getNodes <em>Nodes</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowImpl#getLinks <em>Links</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowImpl#getConfigfile <em>Configfile</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public class PageflowImpl extends PageflowElementImpl implements Pageflow {
-
-	/**
-	 * The cached value of the '{@link #getNodes() <em>Nodes</em>}'
-	 * containment reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getNodes()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList nodes = null;
-
-	/**
-	 * The cached value of the '{@link #getLinks() <em>Links</em>}'
-	 * containment reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getLinks()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList links = null;
-
-	/**
-	 * The default value of the '{@link #getConfigfile() <em>Configfile</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getConfigfile()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String CONFIGFILE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getConfigfile() <em>Configfile</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getConfigfile()
-	 * @generated
-	 * @ordered
-	 */
-	protected String configfile = CONFIGFILE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected PageflowImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PageflowPackage.eINSTANCE.getPageflow();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList getNodes() {
-		if (nodes == null) {
-			nodes = new EObjectContainmentWithInverseEList(PageflowNode.class,
-					this, PageflowPackage.PAGEFLOW__NODES,
-					PageflowPackage.PAGEFLOW_NODE__PAGEFLOW);
-		}
-		return nodes;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList getLinks() {
-		if (links == null) {
-			links = new EObjectContainmentWithInverseEList(PageflowLink.class,
-					this, PageflowPackage.PAGEFLOW__LINKS,
-					PageflowPackage.PF_LINK__PAGEFLOW);
-		}
-		return links;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String getConfigfile() {
-		return configfile;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setConfigfile(String newConfigfile) {
-		String oldConfigfile = configfile;
-		configfile = newConfigfile;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW__CONFIGFILE, oldConfigfile,
-					configfile));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PAGEFLOW__NODES:
-				return ((InternalEList) getNodes()).basicAdd(otherEnd, msgs);
-			case PageflowPackage.PAGEFLOW__LINKS:
-				return ((InternalEList) getLinks()).basicAdd(otherEnd, msgs);
-			default:
-				return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		if (eContainer != null)
-			msgs = eBasicRemoveFromContainer(msgs);
-		return eBasicSetContainer(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PAGEFLOW__NODES:
-				return ((InternalEList) getNodes()).basicRemove(otherEnd, msgs);
-			case PageflowPackage.PAGEFLOW__LINKS:
-				return ((InternalEList) getLinks()).basicRemove(otherEnd, msgs);
-			default:
-				return eDynamicInverseRemove(otherEnd, featureID, baseClass,
-						msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW__NAME:
-			return getName();
-		case PageflowPackage.PAGEFLOW__COMMENT:
-			return getComment();
-		case PageflowPackage.PAGEFLOW__X:
-			return new Integer(getX());
-		case PageflowPackage.PAGEFLOW__Y:
-			return new Integer(getY());
-		case PageflowPackage.PAGEFLOW__WIDTH:
-			return new Integer(getWidth());
-		case PageflowPackage.PAGEFLOW__HEIGHT:
-			return new Integer(getHeight());
-		case PageflowPackage.PAGEFLOW__ID:
-			return getId();
-		case PageflowPackage.PAGEFLOW__NODES:
-			return getNodes();
-		case PageflowPackage.PAGEFLOW__LINKS:
-			return getLinks();
-		case PageflowPackage.PAGEFLOW__CONFIGFILE:
-			return getConfigfile();
-		}
-		return super.eGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW__NAME:
-			setName((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW__COMMENT:
-			setComment((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW__X:
-			setX(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW__Y:
-			setY(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW__WIDTH:
-			setWidth(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW__HEIGHT:
-			setHeight(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW__ID:
-			setId((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW__NODES:
-			getNodes().clear();
-			getNodes().addAll((Collection) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW__LINKS:
-			getLinks().clear();
-			getLinks().addAll((Collection) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW__CONFIGFILE:
-			setConfigfile((String) newValue);
-			return;
-		}
-		super.eSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW__NAME:
-			setName(NAME_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW__COMMENT:
-			setComment(COMMENT_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW__X:
-			setX(X_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW__Y:
-			setY(Y_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW__WIDTH:
-			setWidth(WIDTH_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW__HEIGHT:
-			setHeight(HEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW__ID:
-			setId(ID_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW__NODES:
-			getNodes().clear();
-			return;
-		case PageflowPackage.PAGEFLOW__LINKS:
-			getLinks().clear();
-			return;
-		case PageflowPackage.PAGEFLOW__CONFIGFILE:
-			setConfigfile(CONFIGFILE_EDEFAULT);
-			return;
-		}
-		super.eUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW__NAME:
-			return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT
-					.equals(name);
-		case PageflowPackage.PAGEFLOW__COMMENT:
-			return COMMENT_EDEFAULT == null ? comment != null
-					: !COMMENT_EDEFAULT.equals(comment);
-		case PageflowPackage.PAGEFLOW__X:
-			return x != X_EDEFAULT;
-		case PageflowPackage.PAGEFLOW__Y:
-			return y != Y_EDEFAULT;
-		case PageflowPackage.PAGEFLOW__WIDTH:
-			return width != WIDTH_EDEFAULT;
-		case PageflowPackage.PAGEFLOW__HEIGHT:
-			return height != HEIGHT_EDEFAULT;
-		case PageflowPackage.PAGEFLOW__ID:
-			return ID_EDEFAULT == null ? getId() != null : !ID_EDEFAULT
-					.equals(getId());
-		case PageflowPackage.PAGEFLOW__NODES:
-			return nodes != null && !nodes.isEmpty();
-		case PageflowPackage.PAGEFLOW__LINKS:
-			return links != null && !links.isEmpty();
-		case PageflowPackage.PAGEFLOW__CONFIGFILE:
-			return CONFIGFILE_EDEFAULT == null ? configfile != null
-					: !CONFIGFILE_EDEFAULT.equals(configfile);
-		}
-		return super.eIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (configfile: ");
-		result.append(configfile);
-		result.append(')');
-		return result.toString();
-	}
-
-	/**
-	 * set the valid link's source and target node.
-	 * 
-	 * @generated NOT
-	 */
-	public void connect(PageflowNode source, PageflowNode target,
-			PageflowLink link) {
-		if (link != null) {
-			if (PageflowValidation.getInstance().isValidLinkForCreation(source,
-					target)) {
-				this.getLinks().add(link);
-				link.setSource(source);
-				link.setTarget(target);
-			}
-		}
-	}
-
-	/** node prefixs map */
-	private HashMap mapNodePrefix = null;
-
-	/**
-	 * get the prefix's map, and if the map is not existed, create it.
-	 * 
-	 * @return - map for prefix
-	 * 
-	 * @generated NOT
-	 */
-	private HashMap getNodePrefixMap() {
-		if (mapNodePrefix == null) {
-			mapNodePrefix = new HashMap();
-			mapNodePrefix.put(PageflowPageImpl.class, new String("Page"));
-		}
-		return mapNodePrefix;
-	}
-
-	/**
-	 * get the default node name according current nodetype
-	 * 
-	 * @param nodeType -
-	 *            node type, such as PFBeginImpl, PFPageImpl, etc.
-	 * @return - the default node name.
-	 * 
-	 * @generated NOT
-	 */
-	public String getDefaultNodeName(Class nodeType) {
-		HashMap mapNodePrefix_ = getNodePrefixMap();
-
-		String strNodePrefix = (String) mapNodePrefix_.get(nodeType);
-
-		String strNodeName = null;
-		boolean bFound = true;
-		int numNode = 1;
-		while (bFound) {
-			strNodeName = strNodePrefix + numNode;
-			boolean bExisted = false;
-			for (Iterator iter = getNodes().iterator(); iter.hasNext();) {
-				PageflowNode node = (PageflowNode) iter.next();
-				if (strNodeName.equalsIgnoreCase(node.getName())) {
-					bExisted = true;
-					break;
-				}
-			}
-			if (!bExisted) {
-				bFound = false;
-			}
-			numNode++;
-		}
-
-		return strNodeName;
-
-	}
-
-	/**
-	 * When faces-config has been changed, the pageflow model will be notified
-	 * to enable refresher do some update in pageflow.
-	 * 
-	 * @generated NOT
-	 */
-	public void notifyModelChanged(Notification notification) {
-		TreeIterator children = eAllContents();
-		while (children.hasNext()) {
-			Object next = children.next();
-			if (next instanceof PageflowElement) {
-				((PageflowElement) next).update();
-			}
-		}
-		super.notifyModelChanged(notification);
-	}
-
-	/**
-	 * @generated NOT
-	 */
-	public void dispose() {
-		TreeIterator children = eAllContents();
-		while (children.hasNext()) {
-			Object next = children.next();
-			if (next instanceof PageflowElement) {
-				((PageflowElement) next).dispose();
-			}
-		}
-		eAdapters.clear();
-	}
-}
-// PageflowImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowLinkBendpointImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowLinkBendpointImpl.java
deleted file mode 100644
index 755c514..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowLinkBendpointImpl.java
+++ /dev/null
@@ -1,550 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>PF Link Bendpoint</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl#getD1Width <em>D1 Width</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl#getD1Height <em>D1 Height</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl#getD2Width <em>D2 Width</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl#getD2Height <em>D2 Height</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl#getWeight <em>Weight</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl#getLink <em>Link</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public class PageflowLinkBendpointImpl extends EObjectImpl implements PageflowLinkBendpoint {
-	/**
-	 * The default value of the '{@link #getD1Width() <em>D1 Width</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD1Width()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int D1_WIDTH_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getD1Width() <em>D1 Width</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD1Width()
-	 * @generated
-	 * @ordered
-	 */
-	protected int d1Width = D1_WIDTH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getD1Height() <em>D1 Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD1Height()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int D1_HEIGHT_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getD1Height() <em>D1 Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD1Height()
-	 * @generated
-	 * @ordered
-	 */
-	protected int d1Height = D1_HEIGHT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getD2Width() <em>D2 Width</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD2Width()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int D2_WIDTH_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getD2Width() <em>D2 Width</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD2Width()
-	 * @generated
-	 * @ordered
-	 */
-	protected int d2Width = D2_WIDTH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getD2Height() <em>D2 Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD2Height()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int D2_HEIGHT_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getD2Height() <em>D2 Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD2Height()
-	 * @generated
-	 * @ordered
-	 */
-	protected int d2Height = D2_HEIGHT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getWeight() <em>Weight</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getWeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float WEIGHT_EDEFAULT = 0.5F;
-
-	/**
-	 * The cached value of the '{@link #getWeight() <em>Weight</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getWeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected float weight = WEIGHT_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	private Dimension dimStart, dimEnd;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected PageflowLinkBendpointImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PageflowPackage.eINSTANCE.getPFLinkBendpoint();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getD1Width() {
-		return d1Width;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setD1Width(int newD1Width) {
-		int oldD1Width = d1Width;
-		d1Width = newD1Width;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK_BENDPOINT__D1_WIDTH, oldD1Width,
-					d1Width));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getD1Height() {
-		return d1Height;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setD1Height(int newD1Height) {
-		int oldD1Height = d1Height;
-		d1Height = newD1Height;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK_BENDPOINT__D1_HEIGHT, oldD1Height,
-					d1Height));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getD2Width() {
-		return d2Width;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setD2Width(int newD2Width) {
-		int oldD2Width = d2Width;
-		d2Width = newD2Width;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK_BENDPOINT__D2_WIDTH, oldD2Width,
-					d2Width));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getD2Height() {
-		return d2Height;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setD2Height(int newD2Height) {
-		int oldD2Height = d2Height;
-		d2Height = newD2Height;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK_BENDPOINT__D2_HEIGHT, oldD2Height,
-					d2Height));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public float getWeight() {
-		return weight;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setWeight(float newWeight) {
-		float oldWeight = weight;
-		weight = newWeight;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK_BENDPOINT__WEIGHT, oldWeight,
-					weight));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowLink getLink() {
-		if (eContainerFeatureID != PageflowPackage.PF_LINK_BENDPOINT__LINK)
-			return null;
-		return (PageflowLink) eContainer;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setLink(PageflowLink newLink) {
-		if (newLink != eContainer
-				|| (eContainerFeatureID != PageflowPackage.PF_LINK_BENDPOINT__LINK && newLink != null)) {
-			if (EcoreUtil.isAncestor(this, newLink))
-				throw new IllegalArgumentException(
-						"Recursive containment not allowed for " + toString());
-			NotificationChain msgs = null;
-			if (eContainer != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newLink != null)
-				msgs = ((InternalEObject) newLink).eInverseAdd(this,
-						PageflowPackage.PF_LINK__BEND_POINTS, PageflowLink.class,
-						msgs);
-			msgs = eBasicSetContainer((InternalEObject) newLink,
-					PageflowPackage.PF_LINK_BENDPOINT__LINK, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK_BENDPOINT__LINK, newLink, newLink));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PF_LINK_BENDPOINT__LINK:
-				if (eContainer != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return eBasicSetContainer(otherEnd,
-						PageflowPackage.PF_LINK_BENDPOINT__LINK, msgs);
-			default:
-				return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		if (eContainer != null)
-			msgs = eBasicRemoveFromContainer(msgs);
-		return eBasicSetContainer(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PF_LINK_BENDPOINT__LINK:
-				return eBasicSetContainer(null,
-						PageflowPackage.PF_LINK_BENDPOINT__LINK, msgs);
-			default:
-				return eDynamicInverseRemove(otherEnd, featureID, baseClass,
-						msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainer(NotificationChain msgs) {
-		if (eContainerFeatureID >= 0) {
-			switch (eContainerFeatureID) {
-			case PageflowPackage.PF_LINK_BENDPOINT__LINK:
-				return eContainer.eInverseRemove(this,
-						PageflowPackage.PF_LINK__BEND_POINTS, PageflowLink.class,
-						msgs);
-			default:
-				return eDynamicBasicRemoveFromContainer(msgs);
-			}
-		}
-		return eContainer.eInverseRemove(this,
-				EOPPOSITE_FEATURE_BASE - eContainerFeatureID, null, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_WIDTH:
-			return new Integer(getD1Width());
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_HEIGHT:
-			return new Integer(getD1Height());
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_WIDTH:
-			return new Integer(getD2Width());
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_HEIGHT:
-			return new Integer(getD2Height());
-		case PageflowPackage.PF_LINK_BENDPOINT__WEIGHT:
-			return new Float(getWeight());
-		case PageflowPackage.PF_LINK_BENDPOINT__LINK:
-			return getLink();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_WIDTH:
-			setD1Width(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_HEIGHT:
-			setD1Height(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_WIDTH:
-			setD2Width(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_HEIGHT:
-			setD2Height(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__WEIGHT:
-			setWeight(((Float) newValue).floatValue());
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__LINK:
-			setLink((PageflowLink) newValue);
-			return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_WIDTH:
-			setD1Width(D1_WIDTH_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_HEIGHT:
-			setD1Height(D1_HEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_WIDTH:
-			setD2Width(D2_WIDTH_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_HEIGHT:
-			setD2Height(D2_HEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__WEIGHT:
-			setWeight(WEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__LINK:
-			setLink((PageflowLink) null);
-			return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_WIDTH:
-			return d1Width != D1_WIDTH_EDEFAULT;
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_HEIGHT:
-			return d1Height != D1_HEIGHT_EDEFAULT;
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_WIDTH:
-			return d2Width != D2_WIDTH_EDEFAULT;
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_HEIGHT:
-			return d2Height != D2_HEIGHT_EDEFAULT;
-		case PageflowPackage.PF_LINK_BENDPOINT__WEIGHT:
-			return weight != WEIGHT_EDEFAULT;
-		case PageflowPackage.PF_LINK_BENDPOINT__LINK:
-			return getLink() != null;
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (d1Width: ");
-		result.append(d1Width);
-		result.append(", d1Height: ");
-		result.append(d1Height);
-		result.append(", d2Width: ");
-		result.append(d2Width);
-		result.append(", d2Height: ");
-		result.append(d2Height);
-		result.append(", weight: ");
-		result.append(weight);
-		result.append(')');
-		return result.toString();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public Dimension getFirstRelativeDimension() {
-		dimStart = new Dimension(getD1Width(), getD1Height());
-		return dimStart;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public Dimension getSecondRelativeDimension() {
-		dimEnd = new Dimension(getD2Width(), getD2Height());
-		return dimEnd;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setRelativeDimensions(Dimension dim1, Dimension dim2) {
-		dimStart = dim1;
-		dimEnd = dim2;
-		setD1Width(dimStart.width);
-		setD1Height(dimStart.height);
-
-		setD2Width(dimEnd.width);
-		setD2Height(dimEnd.height);
-	}
-
-}
-// PFLinkBendpointImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowLinkImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowLinkImpl.java
deleted file mode 100644
index d75cced..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,878 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import java.util.Collection;
-import java.util.Vector;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>PF Link</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#getPageflow <em>Pageflow</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#getTarget <em>Target</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#getSource <em>Source</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#getOutcome <em>Outcome</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#isRedirect <em>Redirect</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#getBendPoints <em>Bend Points</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#getSmallicon <em>Smallicon</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#getLargeicon <em>Largeicon</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- * 
- */
-public class PageflowLinkImpl extends PageflowElementImpl implements
-		PageflowLink {
-	/**
-	 * The cached value of the '{@link #getTarget() <em>Target</em>}'
-	 * reference. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getTarget()
-	 * @generated
-	 * @ordered
-	 */
-	protected PageflowNode target = null;
-
-	/**
-	 * The cached value of the '{@link #getSource() <em>Source</em>}'
-	 * reference. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getSource()
-	 * @generated
-	 * @ordered
-	 */
-	protected PageflowNode source = null;
-
-	/**
-	 * The default value of the '{@link #getOutcome() <em>Outcome</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getOutcome()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String OUTCOME_EDEFAULT = null;
-
-	/**
-	 * The default value of the '{@link #isRedirect() <em>Redirect</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #isRedirect()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean REDIRECT_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #getBendPoints() <em>Bend Points</em>}'
-	 * containment reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getBendPoints()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList bendPoints = null;
-
-	/**
-	 * The default value of the '{@link #getSmallicon() <em>Smallicon</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getSmallicon()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SMALLICON_EDEFAULT = null;
-
-	/**
-	 * The default value of the '{@link #getLargeicon() <em>Largeicon</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getLargeicon()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String LARGEICON_EDEFAULT = null;
-
-	/**
-	 * The default value of the '{@link #getFromaction() <em>Fromaction</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getFromaction()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String FROMACTION_EDEFAULT = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected PageflowLinkImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PageflowPackage.eINSTANCE.getPFLink();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Pageflow getPageflow() {
-		if (eContainerFeatureID != PageflowPackage.PF_LINK__PAGEFLOW)
-			return null;
-		return (Pageflow) eContainer;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setPageflow(Pageflow newPageflow) {
-		if (newPageflow != eContainer
-				|| (eContainerFeatureID != PageflowPackage.PF_LINK__PAGEFLOW && newPageflow != null)) {
-			if (EcoreUtil.isAncestor(this, newPageflow))
-				throw new IllegalArgumentException(
-						"Recursive containment not allowed for " + toString());
-			NotificationChain msgs = null;
-			if (eContainer != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newPageflow != null)
-				msgs = ((InternalEObject) newPageflow).eInverseAdd(this,
-						PageflowPackage.PAGEFLOW__LINKS, Pageflow.class, msgs);
-			msgs = eBasicSetContainer((InternalEObject) newPageflow,
-					PageflowPackage.PF_LINK__PAGEFLOW, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__PAGEFLOW, newPageflow, newPageflow));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowNode getTarget() {
-		if (target != null && target.eIsProxy()) {
-			PageflowNode oldTarget = target;
-			target = (PageflowNode) eResolveProxy((InternalEObject) target);
-			if (target != oldTarget) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							PageflowPackage.PF_LINK__TARGET, oldTarget, target));
-			}
-		}
-		return target;
-	}
-
-	public void setSourcePath(String path) {
-		if (getSource() != null
-				&& path.equals(((PageflowPage) getSource()).getPath())) {
-			return;
-		}
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__SOURCE, getSource(), path));
-	}
-
-	public void setTargetPath(String path) {
-		if (getTarget() != null
-				&& path.equals(((PageflowPage) getTarget()).getPath())) {
-			return;
-		}
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__TARGET, getTarget(), path));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowNode basicGetTarget() {
-		return target;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- 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 --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowNode basicGetSource() {
-		return source;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain basicSetSource(PageflowNode newSource,
-			NotificationChain msgs) {
-		// Assert.isTrue(newSource != null);
-		PageflowNode oldSource = source;
-		source = newSource;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, PageflowPackage.PF_LINK__SOURCE,
-					oldSource, newSource);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setSource(PageflowNode newSource) {
-		// Assert.isTrue(newSource != null);
-		if (newSource != source) {
-			NotificationChain msgs = null;
-			if (source != null)
-				msgs = ((InternalEObject) source).eInverseRemove(this,
-						PageflowPackage.PAGEFLOW_NODE__OUTLINKS,
-						PageflowNode.class, msgs);
-			if (newSource != null)
-				msgs = ((InternalEObject) newSource).eInverseAdd(this,
-						PageflowPackage.PAGEFLOW_NODE__OUTLINKS,
-						PageflowNode.class, msgs);
-			msgs = basicSetSource(newSource, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__SOURCE, newSource, newSource));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList getBendPoints() {
-		if (bendPoints == null) {
-			bendPoints = new EObjectContainmentWithInverseEList(
-					PageflowLinkBendpoint.class, this,
-					PageflowPackage.PF_LINK__BEND_POINTS,
-					PageflowPackage.PF_LINK_BENDPOINT__LINK);
-		}
-		return bendPoints;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PF_LINK__PAGEFLOW:
-				if (eContainer != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return eBasicSetContainer(otherEnd,
-						PageflowPackage.PF_LINK__PAGEFLOW, msgs);
-			case PageflowPackage.PF_LINK__TARGET:
-				if (target != null)
-					msgs = ((InternalEObject) target).eInverseRemove(this,
-							PageflowPackage.PAGEFLOW_NODE__INLINKS,
-							PageflowNode.class, msgs);
-				return basicSetTarget((PageflowNode) otherEnd, msgs);
-			case PageflowPackage.PF_LINK__SOURCE:
-				if (source != null)
-					msgs = ((InternalEObject) source).eInverseRemove(this,
-							PageflowPackage.PAGEFLOW_NODE__OUTLINKS,
-							PageflowNode.class, msgs);
-				return basicSetSource((PageflowNode) otherEnd, msgs);
-			case PageflowPackage.PF_LINK__BEND_POINTS:
-				return ((InternalEList) getBendPoints()).basicAdd(otherEnd,
-						msgs);
-			default:
-				return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		if (eContainer != null)
-			msgs = eBasicRemoveFromContainer(msgs);
-		return eBasicSetContainer(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PF_LINK__PAGEFLOW:
-				return eBasicSetContainer(null,
-						PageflowPackage.PF_LINK__PAGEFLOW, msgs);
-			case PageflowPackage.PF_LINK__TARGET:
-				return basicSetTarget(null, msgs);
-			case PageflowPackage.PF_LINK__SOURCE:
-				return basicSetSource(null, msgs);
-			case PageflowPackage.PF_LINK__BEND_POINTS:
-				return ((InternalEList) getBendPoints()).basicRemove(otherEnd,
-						msgs);
-			default:
-				return eDynamicInverseRemove(otherEnd, featureID, baseClass,
-						msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainer(NotificationChain msgs) {
-		if (eContainerFeatureID >= 0) {
-			switch (eContainerFeatureID) {
-			case PageflowPackage.PF_LINK__PAGEFLOW:
-				return eContainer.eInverseRemove(this,
-						PageflowPackage.PAGEFLOW__LINKS, Pageflow.class, msgs);
-			default:
-				return eDynamicBasicRemoveFromContainer(msgs);
-			}
-		}
-		return eContainer.eInverseRemove(this,
-				EOPPOSITE_FEATURE_BASE - eContainerFeatureID, null, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK__NAME:
-			return getName();
-		case PageflowPackage.PF_LINK__COMMENT:
-			return getComment();
-		case PageflowPackage.PF_LINK__X:
-			return new Integer(getX());
-		case PageflowPackage.PF_LINK__Y:
-			return new Integer(getY());
-		case PageflowPackage.PF_LINK__WIDTH:
-			return new Integer(getWidth());
-		case PageflowPackage.PF_LINK__HEIGHT:
-			return new Integer(getHeight());
-		case PageflowPackage.PF_LINK__ID:
-			return getId();
-		case PageflowPackage.PF_LINK__PAGEFLOW:
-			return getPageflow();
-		case PageflowPackage.PF_LINK__TARGET:
-			if (resolve)
-				return getTarget();
-			return basicGetTarget();
-		case PageflowPackage.PF_LINK__SOURCE:
-			if (resolve)
-				return getSource();
-			return basicGetSource();
-		case PageflowPackage.PF_LINK__OUTCOME:
-			return getOutcome();
-		case PageflowPackage.PF_LINK__REDIRECT:
-			return isRedirect() ? Boolean.TRUE : Boolean.FALSE;
-		case PageflowPackage.PF_LINK__BEND_POINTS:
-			return getBendPoints();
-		case PageflowPackage.PF_LINK__SMALLICON:
-			return getSmallicon();
-		case PageflowPackage.PF_LINK__LARGEICON:
-			return getLargeicon();
-		case PageflowPackage.PF_LINK__FROMACTION:
-			return getFromaction();
-		}
-		return super.eGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK__NAME:
-			setName((String) newValue);
-			return;
-		case PageflowPackage.PF_LINK__COMMENT:
-			setComment((String) newValue);
-			return;
-		case PageflowPackage.PF_LINK__X:
-			setX(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK__Y:
-			setY(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK__WIDTH:
-			setWidth(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK__HEIGHT:
-			setHeight(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK__ID:
-			setId((String) newValue);
-			return;
-		case PageflowPackage.PF_LINK__PAGEFLOW:
-			setPageflow((Pageflow) newValue);
-			return;
-		case PageflowPackage.PF_LINK__TARGET:
-			setTarget((PageflowNode) newValue);
-			return;
-		case PageflowPackage.PF_LINK__SOURCE:
-			setSource((PageflowNode) newValue);
-			return;
-		case PageflowPackage.PF_LINK__OUTCOME:
-			setOutcome((String) newValue);
-			return;
-		case PageflowPackage.PF_LINK__REDIRECT:
-			setRedirect(((Boolean) newValue).booleanValue());
-			return;
-		case PageflowPackage.PF_LINK__BEND_POINTS:
-			getBendPoints().clear();
-			getBendPoints().addAll((Collection) newValue);
-			return;
-		case PageflowPackage.PF_LINK__SMALLICON:
-			setSmallicon((String) newValue);
-			return;
-		case PageflowPackage.PF_LINK__LARGEICON:
-			setLargeicon((String) newValue);
-			return;
-		case PageflowPackage.PF_LINK__FROMACTION:
-			setFromaction((String) newValue);
-			return;
-		}
-		super.eSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK__NAME:
-			setName(NAME_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__COMMENT:
-			setComment(COMMENT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__X:
-			setX(X_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__Y:
-			setY(Y_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__WIDTH:
-			setWidth(WIDTH_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__HEIGHT:
-			setHeight(HEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__ID:
-			setId(ID_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__PAGEFLOW:
-			setPageflow((Pageflow) null);
-			return;
-		case PageflowPackage.PF_LINK__TARGET:
-			setTarget((PageflowNode) null);
-			return;
-		case PageflowPackage.PF_LINK__SOURCE:
-			setSource((PageflowNode) null);
-			return;
-		case PageflowPackage.PF_LINK__OUTCOME:
-			setOutcome(OUTCOME_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__REDIRECT:
-			setRedirect(REDIRECT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__BEND_POINTS:
-			getBendPoints().clear();
-			return;
-		case PageflowPackage.PF_LINK__SMALLICON:
-			setSmallicon(SMALLICON_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__LARGEICON:
-			setLargeicon(LARGEICON_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__FROMACTION:
-			setFromaction(FROMACTION_EDEFAULT);
-			return;
-		}
-		super.eUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK__NAME:
-			return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT
-					.equals(name);
-		case PageflowPackage.PF_LINK__COMMENT:
-			return COMMENT_EDEFAULT == null ? comment != null
-					: !COMMENT_EDEFAULT.equals(comment);
-		case PageflowPackage.PF_LINK__X:
-			return x != X_EDEFAULT;
-		case PageflowPackage.PF_LINK__Y:
-			return y != Y_EDEFAULT;
-		case PageflowPackage.PF_LINK__WIDTH:
-			return width != WIDTH_EDEFAULT;
-		case PageflowPackage.PF_LINK__HEIGHT:
-			return height != HEIGHT_EDEFAULT;
-		case PageflowPackage.PF_LINK__ID:
-			return ID_EDEFAULT == null ? getId() != null : !ID_EDEFAULT
-					.equals(getId());
-		case PageflowPackage.PF_LINK__PAGEFLOW:
-			return getPageflow() != null;
-		case PageflowPackage.PF_LINK__TARGET:
-			return target != null;
-		case PageflowPackage.PF_LINK__SOURCE:
-			return source != null;
-		case PageflowPackage.PF_LINK__OUTCOME:
-			return OUTCOME_EDEFAULT == null ? getOutcome() != null
-					: !OUTCOME_EDEFAULT.equals(getOutcome());
-		case PageflowPackage.PF_LINK__REDIRECT:
-			return isRedirect() != REDIRECT_EDEFAULT;
-		case PageflowPackage.PF_LINK__BEND_POINTS:
-			return bendPoints != null && !bendPoints.isEmpty();
-		case PageflowPackage.PF_LINK__SMALLICON:
-			return SMALLICON_EDEFAULT == null ? getSmallicon() != null
-					: !SMALLICON_EDEFAULT.equals(getSmallicon());
-		case PageflowPackage.PF_LINK__LARGEICON:
-			return LARGEICON_EDEFAULT == null ? getLargeicon() != null
-					: !LARGEICON_EDEFAULT.equals(getLargeicon());
-		case PageflowPackage.PF_LINK__FROMACTION:
-			return FROMACTION_EDEFAULT == null ? getFromaction() != null
-					: !FROMACTION_EDEFAULT.equals(getFromaction());
-		}
-		return super.eIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (smallicon: ");
-		result.append(getSmallicon());
-		result.append(", largeicon: ");
-		result.append(getLargeicon());
-		result.append(", fromaction: ");
-		result.append(getFromaction());
-		result.append(", outcome: ");
-		result.append(getOutcome());
-		result.append(", redirect: ");
-		result.append(isRedirect());
-		result.append(')');
-		return result.toString();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> insert a new bendpoint to the link <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void insertBendpoint(int index, PageflowLinkBendpoint point) {
-		getBendPoints().add(index, point);
-
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.ADD,
-					PageflowPackage.PF_LINK__BEND_POINTS, null, point));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> remove the current bendpoint <!-- end-user-doc
-	 * -->
-	 * 
-	 * @generated NOT
-	 */
-	public void removeBendpoint(int index) {
-		getBendPoints().remove(index);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> Set the current bendpoint <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setBendpoint(int index, PageflowLinkBendpoint point) {
-		getBendPoints().set(index, point);
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__BEND_POINTS, null, point));
-
-	}
-
-	/**
-	 * <!-- begin-user-doc --> Set a group of bendpoints to reconstruct the link
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setBendpoints(Vector points) {
-		bendPoints = (EList) points;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.ADD_MANY,
-					PageflowPackage.PF_LINK__BEND_POINTS, null, points));
-
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public boolean isRedirect() {
-		Boolean result = (Boolean) getFCElements().get(
-				PageflowPackage.PF_LINK__REDIRECT);
-		return result.booleanValue();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setRedirect(boolean newRedirect) {
-		Boolean oldRedirect = new Boolean(isRedirect());
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__REDIRECT, oldRedirect,
-					new Boolean(newRedirect)));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getOutcome() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_LINK__OUTCOME);
-
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setOutcome(String newValue) {
-		String oldOutcome = getOutcome();
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__OUTCOME, oldOutcome, newValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getSmallicon() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_LINK__SMALLICON);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setSmallicon(String newValue) {
-		String oldSmallicon = getSmallicon();
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__SMALLICON, oldSmallicon, newValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getLargeicon() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_LINK__LARGEICON);
-
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setLargeicon(String newValue) {
-		String oldLargeIcon = getLargeicon();
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__LARGEICON, oldLargeIcon, newValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getFromaction() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_LINK__FROMACTION);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setFromaction(String newFromaction) {
-		String oldFromActionType = getFromaction();
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__FROMACTION, oldFromActionType,
-					newFromaction));
-	}
-
-	/**
-	 * @generated NOT
-	 */
-	public ReferenceElement getFCElements() {
-
-		if (refElement == null) {
-			refElement = new LinkReferenceElement(this);
-		}
-		return refElement;
-	}
-
-}
-// PFLinkImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowNodeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowNodeImpl.java
deleted file mode 100644
index 0e86e87..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowNodeImpl.java
+++ /dev/null
@@ -1,388 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Node</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowNodeImpl#getPageflow <em>Pageflow</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowNodeImpl#getOutlinks <em>Outlinks</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowNodeImpl#getInlinks <em>Inlinks</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public abstract class PageflowNodeImpl extends PageflowElementImpl implements
-		PageflowNode {
-	/**
-	 * The cached value of the '{@link #getOutlinks() <em>Outlinks</em>}'
-	 * reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getOutlinks()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList outlinks = null;
-
-	/**
-	 * The cached value of the '{@link #getInlinks() <em>Inlinks</em>}'
-	 * reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getInlinks()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList inlinks = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected PageflowNodeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PageflowPackage.eINSTANCE.getPageflowNode();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Pageflow getPageflow() {
-		if (eContainerFeatureID != PageflowPackage.PAGEFLOW_NODE__PAGEFLOW)
-			return null;
-		return (Pageflow) eContainer;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setPageflow(Pageflow newPageflow) {
-		if (newPageflow != eContainer
-				|| (eContainerFeatureID != PageflowPackage.PAGEFLOW_NODE__PAGEFLOW && newPageflow != null)) {
-			if (EcoreUtil.isAncestor(this, newPageflow))
-				throw new IllegalArgumentException(
-						"Recursive containment not allowed for " + toString());
-			NotificationChain msgs = null;
-			if (eContainer != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newPageflow != null)
-				msgs = ((InternalEObject) newPageflow).eInverseAdd(this,
-						PageflowPackage.PAGEFLOW__NODES, Pageflow.class, msgs);
-			msgs = eBasicSetContainer((InternalEObject) newPageflow,
-					PageflowPackage.PAGEFLOW_NODE__PAGEFLOW, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_NODE__PAGEFLOW, newPageflow,
-					newPageflow));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList getOutlinks() {
-		if (outlinks == null) {
-			outlinks = new EObjectWithInverseResolvingEList(PageflowLink.class, this,
-					PageflowPackage.PAGEFLOW_NODE__OUTLINKS,
-					PageflowPackage.PF_LINK__SOURCE);
-		}
-		return outlinks;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList getInlinks() {
-		if (inlinks == null) {
-			inlinks = new EObjectWithInverseResolvingEList(PageflowLink.class, this,
-					PageflowPackage.PAGEFLOW_NODE__INLINKS,
-					PageflowPackage.PF_LINK__TARGET);
-		}
-		return inlinks;
-	}
-
-	/**
-	 * @generated NOT
-	 */
-	public PageflowLink findLinkTo(PageflowNode target) {
-		//
-		java.util.Iterator i = this.getOutlinks().iterator();
-		while (i.hasNext()) {
-			PageflowLink link = (PageflowLink) i.next();
-			if (link.getTarget() == target)
-				return link;
-		}
-		return null;
-
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PAGEFLOW_NODE__PAGEFLOW:
-				if (eContainer != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return eBasicSetContainer(otherEnd,
-						PageflowPackage.PAGEFLOW_NODE__PAGEFLOW, msgs);
-			case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-				return ((InternalEList) getOutlinks()).basicAdd(otherEnd, msgs);
-			case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-				return ((InternalEList) getInlinks()).basicAdd(otherEnd, msgs);
-			default:
-				return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		if (eContainer != null)
-			msgs = eBasicRemoveFromContainer(msgs);
-		return eBasicSetContainer(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PAGEFLOW_NODE__PAGEFLOW:
-				return eBasicSetContainer(null,
-						PageflowPackage.PAGEFLOW_NODE__PAGEFLOW, msgs);
-			case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-				return ((InternalEList) getOutlinks()).basicRemove(otherEnd,
-						msgs);
-			case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-				return ((InternalEList) getInlinks()).basicRemove(otherEnd,
-						msgs);
-			default:
-				return eDynamicInverseRemove(otherEnd, featureID, baseClass,
-						msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainer(NotificationChain msgs) {
-		if (eContainerFeatureID >= 0) {
-			switch (eContainerFeatureID) {
-			case PageflowPackage.PAGEFLOW_NODE__PAGEFLOW:
-				return eContainer.eInverseRemove(this,
-						PageflowPackage.PAGEFLOW__NODES, Pageflow.class, msgs);
-			default:
-				return eDynamicBasicRemoveFromContainer(msgs);
-			}
-		}
-		return eContainer.eInverseRemove(this,
-				EOPPOSITE_FEATURE_BASE - eContainerFeatureID, null, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_NODE__NAME:
-			return getName();
-		case PageflowPackage.PAGEFLOW_NODE__COMMENT:
-			return getComment();
-		case PageflowPackage.PAGEFLOW_NODE__X:
-			return new Integer(getX());
-		case PageflowPackage.PAGEFLOW_NODE__Y:
-			return new Integer(getY());
-		case PageflowPackage.PAGEFLOW_NODE__WIDTH:
-			return new Integer(getWidth());
-		case PageflowPackage.PAGEFLOW_NODE__HEIGHT:
-			return new Integer(getHeight());
-		case PageflowPackage.PAGEFLOW_NODE__ID:
-			return getId();
-		case PageflowPackage.PAGEFLOW_NODE__PAGEFLOW:
-			return getPageflow();
-		case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-			return getOutlinks();
-		case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-			return getInlinks();
-		}
-		return super.eGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_NODE__NAME:
-			setName((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__COMMENT:
-			setComment((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__X:
-			setX(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__Y:
-			setY(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__WIDTH:
-			setWidth(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__HEIGHT:
-			setHeight(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__ID:
-			setId((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__PAGEFLOW:
-			setPageflow((Pageflow) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-			getOutlinks().clear();
-			getOutlinks().addAll((Collection) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-			getInlinks().clear();
-			getInlinks().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_NODE__NAME:
-			setName(NAME_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__COMMENT:
-			setComment(COMMENT_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__X:
-			setX(X_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__Y:
-			setY(Y_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__WIDTH:
-			setWidth(WIDTH_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__HEIGHT:
-			setHeight(HEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__ID:
-			setId(ID_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__PAGEFLOW:
-			setPageflow((Pageflow) null);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-			getOutlinks().clear();
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-			getInlinks().clear();
-			return;
-		}
-		super.eUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_NODE__NAME:
-			return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT
-					.equals(name);
-		case PageflowPackage.PAGEFLOW_NODE__COMMENT:
-			return COMMENT_EDEFAULT == null ? comment != null
-					: !COMMENT_EDEFAULT.equals(comment);
-		case PageflowPackage.PAGEFLOW_NODE__X:
-			return x != X_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_NODE__Y:
-			return y != Y_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_NODE__WIDTH:
-			return width != WIDTH_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_NODE__HEIGHT:
-			return height != HEIGHT_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_NODE__ID:
-			return ID_EDEFAULT == null ? getId() != null : !ID_EDEFAULT
-					.equals(getId());
-		case PageflowPackage.PAGEFLOW_NODE__PAGEFLOW:
-			return getPageflow() != null;
-		case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-			return outlinks != null && !outlinks.isEmpty();
-		case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-			return inlinks != null && !inlinks.isEmpty();
-		}
-		return super.eIsSet(eFeature);
-	}
-
-}
-// PageflowNodeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowPackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowPackageImpl.java
deleted file mode 100644
index 90b0866..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,773 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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 --> <!-- 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 --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLink_Smallicon() {
-		return (EAttribute) pfLinkEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- 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 --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_ReferenceLink() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				7);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getPageflowElement() {
-		return pageflowElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_Name() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_Comment() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				1);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_X() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				2);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_Y() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				3);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_Width() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				4);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_Height() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				5);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_Id() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				6);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getPFPage() {
-		return pfPageEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFPage_Path() {
-		return (EAttribute) pfPageEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFPage_Smallicon() {
-		return (EAttribute) pfPageEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFPage_Largeicon() {
-		return (EAttribute) pfPageEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getPFLinkBendpoint() {
-		return pfLinkBendpointEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLinkBendpoint_D1Width() {
-		return (EAttribute) pfLinkBendpointEClass.getEStructuralFeatures().get(
-				0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLinkBendpoint_D1Height() {
-		return (EAttribute) pfLinkBendpointEClass.getEStructuralFeatures().get(
-				1);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLinkBendpoint_D2Width() {
-		return (EAttribute) pfLinkBendpointEClass.getEStructuralFeatures().get(
-				2);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLinkBendpoint_D2Height() {
-		return (EAttribute) pfLinkBendpointEClass.getEStructuralFeatures().get(
-				3);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLinkBendpoint_Weight() {
-		return (EAttribute) pfLinkBendpointEClass.getEStructuralFeatures().get(
-				4);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getPFLinkBendpoint_Link() {
-		return (EReference) pfLinkBendpointEClass.getEStructuralFeatures().get(
-				5);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowFactory getPageflowFactory() {
-		return (PageflowFactory) getEFactoryInstance();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private boolean isCreated = false;
-
-	/**
-	 * Creates the meta-model objects for the package. This method is guarded to
-	 * have no affect on any invocation but its first. <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void createPackageContents() {
-		if (isCreated)
-			return;
-		isCreated = true;
-
-		// Create classes and their features
-		pageflowEClass = createEClass(PAGEFLOW);
-		createEReference(pageflowEClass, PAGEFLOW__NODES);
-		createEReference(pageflowEClass, PAGEFLOW__LINKS);
-		createEAttribute(pageflowEClass, PAGEFLOW__CONFIGFILE);
-
-		pageflowNodeEClass = createEClass(PAGEFLOW_NODE);
-		createEReference(pageflowNodeEClass, PAGEFLOW_NODE__PAGEFLOW);
-		createEReference(pageflowNodeEClass, PAGEFLOW_NODE__OUTLINKS);
-		createEReference(pageflowNodeEClass, PAGEFLOW_NODE__INLINKS);
-
-		pfLinkEClass = createEClass(PF_LINK);
-		createEReference(pfLinkEClass, PF_LINK__PAGEFLOW);
-		createEReference(pfLinkEClass, PF_LINK__TARGET);
-		createEReference(pfLinkEClass, PF_LINK__SOURCE);
-		createEAttribute(pfLinkEClass, PF_LINK__OUTCOME);
-		createEAttribute(pfLinkEClass, PF_LINK__REDIRECT);
-		createEReference(pfLinkEClass, PF_LINK__BEND_POINTS);
-		createEAttribute(pfLinkEClass, PF_LINK__SMALLICON);
-		createEAttribute(pfLinkEClass, PF_LINK__LARGEICON);
-		createEAttribute(pfLinkEClass, PF_LINK__FROMACTION);
-
-		pageflowElementEClass = createEClass(PAGEFLOW_ELEMENT);
-		createEAttribute(pageflowElementEClass, PAGEFLOW_ELEMENT__NAME);
-		createEAttribute(pageflowElementEClass, PAGEFLOW_ELEMENT__COMMENT);
-		createEAttribute(pageflowElementEClass, PAGEFLOW_ELEMENT__X);
-		createEAttribute(pageflowElementEClass, PAGEFLOW_ELEMENT__Y);
-		createEAttribute(pageflowElementEClass, PAGEFLOW_ELEMENT__WIDTH);
-		createEAttribute(pageflowElementEClass, PAGEFLOW_ELEMENT__HEIGHT);
-		createEAttribute(pageflowElementEClass, PAGEFLOW_ELEMENT__ID);
-		createEAttribute(pageflowElementEClass,
-				PAGEFLOW_ELEMENT__REFERENCE_LINK);
-
-		pfPageEClass = createEClass(PF_PAGE);
-		createEAttribute(pfPageEClass, PF_PAGE__PATH);
-		createEAttribute(pfPageEClass, PF_PAGE__SMALLICON);
-		createEAttribute(pfPageEClass, PF_PAGE__LARGEICON);
-
-		pfLinkBendpointEClass = createEClass(PF_LINK_BENDPOINT);
-		createEAttribute(pfLinkBendpointEClass, PF_LINK_BENDPOINT__D1_WIDTH);
-		createEAttribute(pfLinkBendpointEClass, PF_LINK_BENDPOINT__D1_HEIGHT);
-		createEAttribute(pfLinkBendpointEClass, PF_LINK_BENDPOINT__D2_WIDTH);
-		createEAttribute(pfLinkBendpointEClass, PF_LINK_BENDPOINT__D2_HEIGHT);
-		createEAttribute(pfLinkBendpointEClass, PF_LINK_BENDPOINT__WEIGHT);
-		createEReference(pfLinkBendpointEClass, PF_LINK_BENDPOINT__LINK);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private boolean isInitialized = false;
-
-	/**
-	 * Complete the initialization of the package and its meta-model. This
-	 * method is guarded to have no affect on any invocation but its first. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void initializePackageContents() {
-		if (isInitialized)
-			return;
-		isInitialized = true;
-
-		// Initialize package
-		setName(eNAME);
-		setNsPrefix(eNS_PREFIX);
-		setNsURI(eNS_URI);
-
-		// Add supertypes to classes
-		pageflowEClass.getESuperTypes().add(this.getPageflowElement());
-		pageflowNodeEClass.getESuperTypes().add(this.getPageflowElement());
-		pfLinkEClass.getESuperTypes().add(this.getPageflowElement());
-		pfPageEClass.getESuperTypes().add(this.getPageflowNode());
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(pageflowEClass, Pageflow.class, "Pageflow", !IS_ABSTRACT,
-				!IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getPageflow_Nodes(), this.getPageflowNode(), this
-				.getPageflowNode_Pageflow(), "nodes", null, 0, -1,
-				Pageflow.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEReference(getPageflow_Links(), this.getPFLink(), this
-				.getPFLink_Pageflow(), "links", null, 0, -1, Pageflow.class,
-				!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE,
-				!IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED,
-				IS_ORDERED);
-		initEAttribute(getPageflow_Configfile(), ecorePackage.getEString(),
-				"configfile", null, 0, 1, Pageflow.class, !IS_TRANSIENT,
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-
-		initEClass(pageflowNodeEClass, PageflowNode.class, "PageflowNode",
-				IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getPageflowNode_Pageflow(), this.getPageflow(), this
-				.getPageflow_Nodes(), "pageflow", null, 1, 1,
-				PageflowNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				!IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEReference(getPageflowNode_Outlinks(), this.getPFLink(), this
-				.getPFLink_Source(), "outlinks", null, 0, -1,
-				PageflowNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				!IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEReference(getPageflowNode_Inlinks(), this.getPFLink(), this
-				.getPFLink_Target(), "inlinks", null, 0, -1,
-				PageflowNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				!IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-
-		initEClass(pfLinkEClass, PageflowLink.class, "PFLink", !IS_ABSTRACT,
-				!IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getPFLink_Pageflow(), this.getPageflow(), this
-				.getPageflow_Links(), "pageflow", null, 1, 1,
-				PageflowLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				!IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEReference(getPFLink_Target(), this.getPageflowNode(), this
-				.getPageflowNode_Inlinks(), "target", null, 1, 1,
-				PageflowLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				!IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEReference(getPFLink_Source(), this.getPageflowNode(), this
-				.getPageflowNode_Outlinks(), "source", null, 1, 1,
-				PageflowLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				!IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLink_Outcome(), ecorePackage.getEString(),
-				"outcome", null, 0, 1, PageflowLink.class, !IS_TRANSIENT,
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLink_Redirect(), ecorePackage.getEBoolean(),
-				"redirect", null, 0, 1, PageflowLink.class, !IS_TRANSIENT,
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEReference(getPFLink_BendPoints(), this.getPFLinkBendpoint(), this
-				.getPFLinkBendpoint_Link(), "bendPoints", null, 0, -1,
-				PageflowLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLink_Smallicon(), ecorePackage.getEString(),
-				"smallicon", null, 0, 1, PageflowLink.class, !IS_TRANSIENT,
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLink_Largeicon(), ecorePackage.getEString(),
-				"largeicon", null, 0, 1, PageflowLink.class, !IS_TRANSIENT,
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLink_Fromaction(), ecorePackage.getEString(),
-				"fromaction", null, 0, 1, PageflowLink.class, !IS_TRANSIENT,
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-
-		initEClass(pageflowElementEClass, PageflowElement.class,
-				"PageflowElement", IS_ABSTRACT, !IS_INTERFACE,
-				IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPageflowElement_Name(), ecorePackage.getEString(),
-				"name", "unnamed", 0, 1, PageflowElement.class, !IS_TRANSIENT,
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPageflowElement_Comment(), ecorePackage.getEString(),
-				"comment", null, 0, 1, PageflowElement.class, !IS_TRANSIENT,
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPageflowElement_X(), ecorePackage.getEInt(), "x",
-				"0", 0, 1, PageflowElement.class, !IS_TRANSIENT, !IS_VOLATILE,
-				IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED,
-				IS_ORDERED);
-		initEAttribute(getPageflowElement_Y(), ecorePackage.getEInt(), "y",
-				"0", 0, 1, PageflowElement.class, !IS_TRANSIENT, !IS_VOLATILE,
-				IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED,
-				IS_ORDERED);
-		initEAttribute(getPageflowElement_Width(), ecorePackage.getEInt(),
-				"width", "-1", 0, 1, PageflowElement.class, !IS_TRANSIENT,
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPageflowElement_Height(), ecorePackage.getEInt(),
-				"height", "-1", 0, 1, PageflowElement.class, !IS_TRANSIENT,
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPageflowElement_Id(), ecorePackage.getEString(),
-				"id", null, 1, 1, PageflowElement.class, !IS_TRANSIENT,
-				IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPageflowElement_ReferenceLink(), ecorePackage
-				.getEString(), "referenceLink", "", 0, 1,
-				PageflowElement.class, !IS_TRANSIENT, !IS_VOLATILE,
-				IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED,
-				IS_ORDERED);
-
-		initEClass(pfPageEClass, PageflowPage.class, "PFPage", !IS_ABSTRACT,
-				!IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPFPage_Path(), ecorePackage.getEString(), "path",
-				null, 0, 1, PageflowPage.class, !IS_TRANSIENT, !IS_VOLATILE,
-				IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED,
-				IS_ORDERED);
-		initEAttribute(getPFPage_Smallicon(), ecorePackage.getEString(),
-				"smallicon", null, 0, 1, PageflowPage.class, !IS_TRANSIENT,
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFPage_Largeicon(), ecorePackage.getEString(),
-				"largeicon", null, 0, 1, PageflowPage.class, !IS_TRANSIENT,
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-
-		initEClass(pfLinkBendpointEClass, PageflowLinkBendpoint.class,
-				"PFLinkBendpoint", !IS_ABSTRACT, !IS_INTERFACE,
-				IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPFLinkBendpoint_D1Width(), ecorePackage.getEInt(),
-				"d1Width", null, 0, 1, PageflowLinkBendpoint.class,
-				!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE,
-				!IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLinkBendpoint_D1Height(), ecorePackage.getEInt(),
-				"d1Height", null, 0, 1, PageflowLinkBendpoint.class,
-				!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE,
-				!IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLinkBendpoint_D2Width(), ecorePackage.getEInt(),
-				"d2Width", null, 0, 1, PageflowLinkBendpoint.class,
-				!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE,
-				!IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLinkBendpoint_D2Height(), ecorePackage.getEInt(),
-				"d2Height", null, 0, 1, PageflowLinkBendpoint.class,
-				!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE,
-				!IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLinkBendpoint_Weight(), ecorePackage.getEFloat(),
-				"weight", "0.5", 0, 1, PageflowLinkBendpoint.class,
-				!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE,
-				!IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getPFLinkBendpoint_Link(), this.getPFLink(), this
-				.getPFLink_BendPoints(), "link", null, 1, 1,
-				PageflowLinkBendpoint.class, !IS_TRANSIENT, !IS_VOLATILE,
-				IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES,
-				!IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		// Create resource
-		createResource(eNS_URI);
-	}
-
-}
-// PageflowPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowPageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowPageImpl.java
deleted file mode 100644
index 11d99e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowPageImpl.java
+++ /dev/null
@@ -1,531 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>PF Page</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPageImpl#getPath <em>Path</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPageImpl#getSmallicon <em>Smallicon</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPageImpl#getLargeicon <em>Largeicon</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public class PageflowPageImpl extends PageflowNodeImpl implements PageflowPage {
-	private String path;
-
-	private String smallIcon;
-
-	private String largeIcon;
-
-	/**
-	 * The default value of the '{@link #getPath() <em>Path</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getPath()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PATH_EDEFAULT = null;
-
-	/**
-	 * The default value of the '{@link #getSmallicon() <em>Smallicon</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getSmallicon()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SMALLICON_EDEFAULT = null;
-
-	/**
-	 * The default value of the '{@link #getLargeicon() <em>Largeicon</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getLargeicon()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String LARGEICON_EDEFAULT = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected PageflowPageImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PageflowPackage.eINSTANCE.getPFPage();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String getPath() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_PAGE__PATH);
-		// Try to return reasonable result.
-		return result == null && getFCElements().isEmpty() ? path
-				: (result != null ? result : PATH_EDEFAULT);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setPath(String newValue) {
-		String oldPath = getPath();
-		path = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_PAGE__PATH, oldPath, newValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-
-	public void setComment(String newValue) {
-		super.setComment(newValue);
-		String oldComment = getComment();
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__COMMENT, oldComment,
-					newValue));
-
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-
-	public String getComment() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_PAGE__COMMENT);
-		return result == null
-				&& (getFCElements().isEmpty() || ((PageReferenceElement) getFCElements())
-						.isEndOnly()) ? super.getComment()
-				: (result != null ? result
-						: PageflowElementImpl.COMMENT_EDEFAULT);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-
-	public String getName() {
-		String result;
-		// To see if it is in navigation rule.
-		result = (String) getFCElements().get(PageflowPackage.PF_PAGE__NAME);
-		if (result == null) {
-			if (super.getName() == null || super.getName().trim().length() == 0) {
-				result = getPath();
-			} else {
-				result = super.getName();
-			}
-		}
-		return result == null
-				&& (getFCElements().isEmpty() || ((PageReferenceElement) getFCElements())
-						.isEndOnly()) ? PageflowElementImpl.NAME_EDEFAULT
-				: (result == null ? null : result);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-
-	public void setName(String newName) {
-		super.setName(newName);
-		String oldName = getName();
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_PAGE__NAME, oldName, newName));
-
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getSmallicon() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_PAGE__SMALLICON);
-
-		return result == null
-				&& (getFCElements().isEmpty() || ((PageReferenceElement) getFCElements())
-						.isEndOnly()) ? smallIcon : (result != null ? result
-				: SMALLICON_EDEFAULT);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setSmallicon(String newValue) {
-		String oldSmallicon = getSmallicon();
-		smallIcon = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_PAGE__SMALLICON, oldSmallicon, newValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getLargeicon() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_PAGE__LARGEICON);
-
-		return result == null
-				&& (getFCElements().isEmpty() || ((PageReferenceElement) getFCElements())
-						.isEndOnly()) ? largeIcon : (result != null ? result
-				: LARGEICON_EDEFAULT);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setLargeicon(String newValue) {
-		String oldLargeIcon = getLargeicon();
-		largeIcon = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_PAGE__LARGEICON, oldLargeIcon, newValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PF_PAGE__PAGEFLOW:
-				if (eContainer != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return eBasicSetContainer(otherEnd,
-						PageflowPackage.PF_PAGE__PAGEFLOW, msgs);
-			case PageflowPackage.PF_PAGE__OUTLINKS:
-				return ((InternalEList) getOutlinks()).basicAdd(otherEnd, msgs);
-			case PageflowPackage.PF_PAGE__INLINKS:
-				return ((InternalEList) getInlinks()).basicAdd(otherEnd, msgs);
-			default:
-				return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		if (eContainer != null)
-			msgs = eBasicRemoveFromContainer(msgs);
-		return eBasicSetContainer(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PF_PAGE__PAGEFLOW:
-				return eBasicSetContainer(null,
-						PageflowPackage.PF_PAGE__PAGEFLOW, msgs);
-			case PageflowPackage.PF_PAGE__OUTLINKS:
-				return ((InternalEList) getOutlinks()).basicRemove(otherEnd,
-						msgs);
-			case PageflowPackage.PF_PAGE__INLINKS:
-				return ((InternalEList) getInlinks()).basicRemove(otherEnd,
-						msgs);
-			default:
-				return eDynamicInverseRemove(otherEnd, featureID, baseClass,
-						msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainer(NotificationChain msgs) {
-		if (eContainerFeatureID >= 0) {
-			switch (eContainerFeatureID) {
-			case PageflowPackage.PF_PAGE__PAGEFLOW:
-				return eContainer.eInverseRemove(this,
-						PageflowPackage.PAGEFLOW__NODES, Pageflow.class, msgs);
-			default:
-				return eDynamicBasicRemoveFromContainer(msgs);
-			}
-		}
-		return eContainer.eInverseRemove(this,
-				EOPPOSITE_FEATURE_BASE - eContainerFeatureID, null, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_PAGE__NAME:
-			return getName();
-		case PageflowPackage.PF_PAGE__COMMENT:
-			return getComment();
-		case PageflowPackage.PF_PAGE__X:
-			return new Integer(getX());
-		case PageflowPackage.PF_PAGE__Y:
-			return new Integer(getY());
-		case PageflowPackage.PF_PAGE__WIDTH:
-			return new Integer(getWidth());
-		case PageflowPackage.PF_PAGE__HEIGHT:
-			return new Integer(getHeight());
-		case PageflowPackage.PF_PAGE__ID:
-			return getId();
-		case PageflowPackage.PF_PAGE__PAGEFLOW:
-			return getPageflow();
-		case PageflowPackage.PF_PAGE__OUTLINKS:
-			return getOutlinks();
-		case PageflowPackage.PF_PAGE__INLINKS:
-			return getInlinks();
-		case PageflowPackage.PF_PAGE__PATH:
-			return getPath();
-		case PageflowPackage.PF_PAGE__SMALLICON:
-			return getSmallicon();
-		case PageflowPackage.PF_PAGE__LARGEICON:
-			return getLargeicon();
-		}
-		return super.eGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_PAGE__NAME:
-			setName((String) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__COMMENT:
-			setComment((String) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__X:
-			setX(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_PAGE__Y:
-			setY(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_PAGE__WIDTH:
-			setWidth(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_PAGE__HEIGHT:
-			setHeight(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_PAGE__ID:
-			setId((String) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__PAGEFLOW:
-			setPageflow((Pageflow) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__OUTLINKS:
-			getOutlinks().clear();
-			getOutlinks().addAll((Collection) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__INLINKS:
-			getInlinks().clear();
-			getInlinks().addAll((Collection) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__PATH:
-			setPath((String) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__SMALLICON:
-			setSmallicon((String) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__LARGEICON:
-			setLargeicon((String) newValue);
-			return;
-		}
-		super.eSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_PAGE__NAME:
-			setName(NAME_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__COMMENT:
-			setComment(COMMENT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__X:
-			setX(X_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__Y:
-			setY(Y_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__WIDTH:
-			setWidth(WIDTH_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__HEIGHT:
-			setHeight(HEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__ID:
-			setId(ID_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__PAGEFLOW:
-			setPageflow((Pageflow) null);
-			return;
-		case PageflowPackage.PF_PAGE__OUTLINKS:
-			getOutlinks().clear();
-			return;
-		case PageflowPackage.PF_PAGE__INLINKS:
-			getInlinks().clear();
-			return;
-		case PageflowPackage.PF_PAGE__PATH:
-			setPath(PATH_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__SMALLICON:
-			setSmallicon(SMALLICON_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__LARGEICON:
-			setLargeicon(LARGEICON_EDEFAULT);
-			return;
-		}
-		super.eUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_PAGE__NAME:
-			return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT
-					.equals(name);
-		case PageflowPackage.PF_PAGE__COMMENT:
-			return COMMENT_EDEFAULT == null ? comment != null
-					: !COMMENT_EDEFAULT.equals(comment);
-		case PageflowPackage.PF_PAGE__X:
-			return x != X_EDEFAULT;
-		case PageflowPackage.PF_PAGE__Y:
-			return y != Y_EDEFAULT;
-		case PageflowPackage.PF_PAGE__WIDTH:
-			return width != WIDTH_EDEFAULT;
-		case PageflowPackage.PF_PAGE__HEIGHT:
-			return height != HEIGHT_EDEFAULT;
-		case PageflowPackage.PF_PAGE__ID:
-			return ID_EDEFAULT == null ? getId() != null : !ID_EDEFAULT
-					.equals(getId());
-		case PageflowPackage.PF_PAGE__PAGEFLOW:
-			return getPageflow() != null;
-		case PageflowPackage.PF_PAGE__OUTLINKS:
-			return outlinks != null && !outlinks.isEmpty();
-		case PageflowPackage.PF_PAGE__INLINKS:
-			return inlinks != null && !inlinks.isEmpty();
-		case PageflowPackage.PF_PAGE__PATH:
-			return PATH_EDEFAULT == null ? getPath() != null : !PATH_EDEFAULT
-					.equals(getPath());
-		case PageflowPackage.PF_PAGE__SMALLICON:
-			return SMALLICON_EDEFAULT == null ? getSmallicon() != null
-					: !SMALLICON_EDEFAULT.equals(getSmallicon());
-		case PageflowPackage.PF_PAGE__LARGEICON:
-			return LARGEICON_EDEFAULT == null ? getLargeicon() != null
-					: !LARGEICON_EDEFAULT.equals(getLargeicon());
-		}
-		return super.eIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (path: ");
-		result.append(getPath());
-		result.append(", smallicon: ");
-		result.append(getSmallicon());
-		result.append(", largeicon: ");
-		result.append(getLargeicon());
-		result.append(')');
-		return result.toString();
-	}
-
-	public ReferenceElement getFCElements() {
-
-		if (refElement == null) {
-			refElement = new PageReferenceElement(this);
-		}
-		return refElement;
-	}
-
-}
-// PFPageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/ReferenceElement.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/ReferenceElement.java
deleted file mode 100644
index 72e08e6..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,157 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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();
-
-	protected PageflowElement pageflowElement;
-
-	public ReferenceElement(PageflowElement pageflowElement) {
-		this.pageflowElement = pageflowElement;
-	}
-
-	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);
-		}
-	}
-
-	public boolean contains(EObject object) {
-		return data.contains(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 "";
-	}
-
-	public boolean remove(EObject object) {
-		boolean result = data.remove(object);
-		return result;
-	}
-
-	/**
-	 * Resolve each referenced data's path and combine the result into one
-	 * string, the path will be seperated with '|'.
-	 * 
-	 * @return the resolved string 
-	 */
-	public String resolveReferenceString() {
-		String result = "";
-		for (int i = 0, n = data.size(); i < n; i++) {
-			result += resolvePath((EObject) data.get(i)) + "|";
-		}
-		if (result.length() > 0) {
-			result = result.substring(0, result.length());
-		}
-		return result;
-	}
-
-	/**
-	 * The EMF paths of all referenced elements.
-	 * 
-	 * @return the list of resolved paths for the data elements
-	 */
-	public List getPaths() {
-		List paths = new ArrayList();
-		for (int i = 0, n = data.size(); i < n; i++) {
-			paths.add(resolvePath((EObject) data.get(i)));
-		}
-		return paths;
-	}
-
-	/**
-	 * The facesconfig elements that are referenced.
-	 * 
-	 * @return the list of elements
-	 */
-	public List getData() {
-		return data;
-	}
-
-	public void clear() {
-		if (!data.isEmpty()) {
-			data.clear();
-		}
-	}
-
-	public boolean isEmpty() {
-		return data.isEmpty();
-	}
-
-	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 4b8ec9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionDialogCellEditor.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.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 {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see DialogCellEditor#DialogCellEditor()
-	 */
-	public ActionDialogCellEditor() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see DialogCellEditor#DialogCellEditor(Composite parent)
-	 */
-	public ActionDialogCellEditor(Composite parent) {
-		super(parent);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see DialogCellEditor#DialogCellEditor(Composite parent, int 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 e24b2ad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionOutcomeDialogCellEditor.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.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;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see DialogCellEditor#DialogCellEditor()
-	 */
-	public ActionOutcomeDialogCellEditor(PageflowElement element) {
-		super();
-		this.element = element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see DialogCellEditor#DialogCellEditor(Composite parent)
-	 */
-	public ActionOutcomeDialogCellEditor(Composite parent,
-			PageflowElement element) {
-		super(parent);
-		this.element = element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see DialogCellEditor#DialogCellEditor(Composite parent, int style)
-	 */
-	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 3a63097..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionOutcomeSelectionDialog.java
+++ /dev/null
@@ -1,367 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.util.List;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.ColumnPixelData;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.Separator;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.JSPUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-/**
- * This dialog is used to edit outcome property of link component of Pageflow
- * Designer.
- * 
- * @author Xiao-guang Zhang
- */
-public class ActionOutcomeSelectionDialog extends Dialog {
-
-	/** property's name text control */
-	private Text actionText;
-
-	/** linked source jsp file name */
-	private String jspName;
-
-	/** the current outcome */
-	private String outcome;
-
-	/** action table control */
-	private Table actionTable;
-
-	/** Column width of component name and action */
-	private static final int COMPONENT_COL_WIDTH = 160;
-
-	private static final int ACTION_COL_WIDTH = 160;
-
-	/** Dialog default height and width */
-	private static final int DIALOG_DEFAULT_WIDTH = 400;
-
-	private static final int DIALOG_DEFAULT_HEIGHT = 300;
-
-	public static String JSF_EL_LEFT_BRACE = "#{";
-
-	public static String JSF_EL_RIGHT_BRACE = "}";
-
-	/** the listener for the text modification */
-	private ModifyListener modifyListener;
-
-	public ActionOutcomeSelectionDialog(Shell parentShell, String outcome,
-			String jspName) {
-		super(parentShell);
-		this.outcome = outcome;
-		this.jspName = jspName;
-
-		modifyListener = new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				verifyComplete();
-			}
-		};
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#createDialogArea(Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		GridLayout gridLayout;
-
-		Composite container = (Composite) super.createDialogArea(parent);
-		gridLayout = new GridLayout();
-		gridLayout.numColumns = 1;
-		gridLayout.marginWidth = 10;
-		gridLayout.marginHeight = 10;
-		container.setLayout(gridLayout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		// gd.widthHint = 300;
-		gd.heightHint = DIALOG_DEFAULT_HEIGHT;
-		gd.widthHint = DIALOG_DEFAULT_WIDTH;
-		container.setLayoutData(gd);
-
-		Label choiceLabel = new Label(container, SWT.LEFT);
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-		// gd.widthHint = 100;
-		choiceLabel.setLayoutData(gd);
-		// Pageflow.Property.Action.OutcomeSelectionDialog.Choice = Enter the
-		// outcome or select one from action list below:
-		choiceLabel
-				.setText(PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_Choice);
-
-		createOutcomeSection(container);
-
-		createActionListSection(container);
-
-		return container;
-	}
-
-	/**
-	 * create a Outcome input section
-	 * 
-	 * @param container
-	 */
-	protected void createOutcomeSection(Composite container) {
-		Composite outcomeSection = new Composite(container, SWT.NONE);
-		GridLayout gl = new GridLayout();
-		gl.numColumns = 1;
-		gl.marginWidth = 0;
-		outcomeSection.setLayout(gl);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		outcomeSection.setLayoutData(gd);
-
-		actionText = new Text(outcomeSection, SWT.BORDER);
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL
-				| GridData.FILL_HORIZONTAL);
-		actionText.setLayoutData(gd);
-
-		actionText.addModifyListener(modifyListener);
-
-		if (outcome != null && outcome.length() > 0) {
-			actionText.setText(outcome);
-		}
-	}
-
-	/**
-	 * create action list table section
-	 * 
-	 * @param container
-	 */
-	protected void createActionListSection(Composite container) {
-		final Group actionSection = new Group(container, SWT.NONE);
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 1;
-		actionSection.setLayout(gridLayout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		actionSection.setLayoutData(gd);
-
-		String actionListTitle = PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Title;//$NON-NLS-1$
-
-		if (jspName != null && jspName.length() > 0) {
-			actionListTitle += " in " + jspName;
-		}
-		// Pageflow.Property.Action.OutcomeSelectionDialog.ActionListTable.Title
-		// = Actions
-		actionSection.setText(actionListTitle);
-
-		actionTable = new Table(actionSection, SWT.BORDER | SWT.FULL_SELECTION);
-		actionTable.setLayoutData(new GridData(GridData.FILL_BOTH));
-		actionTable.setHeaderVisible(true);
-		actionTable.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		actionTable.setLayout(layout);
-
-		layout.addColumnData(new ColumnPixelData(COMPONENT_COL_WIDTH));
-		layout.addColumnData(new ColumnPixelData(ACTION_COL_WIDTH));
-		TableColumn componentCol = new TableColumn(actionTable, SWT.NONE);
-		// Pageflow.Property.Action.OutcomeSelectionDialog.ActionListTable.Component
-		// = Component ID
-		componentCol
-				.setText(PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Component); //$NON-NLS-1$
-		TableColumn actionCol = new TableColumn(actionTable, SWT.NONE);
-
-		// Pageflow.Property.Action.OutcomeSelectionDialog.ActionListTable.Action
-		// = Action
-		actionCol
-				.setText(PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Action);//$NON-NLS-1$
-
-		actionTable.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				TableItem selItem = (TableItem) e.item;
-				String action = selItem.getText(1);
-				if (action != null && action.length() > 0)
-					actionText.setText(action);
-			}
-		});
-
-		addActionsInJSP();
-
-	}
-
-	/**
-	 * Creates a separator line. Expects a <code>GridLayout</code> with at
-	 * least 1 column.
-	 * 
-	 * @param composite
-	 *            the parent composite
-	 * @param nColumns
-	 *            number of columns to span
-	 */
-	protected void createSeparator(Composite composite, int nColumns) {
-		(new Separator(SWT.SEPARATOR | SWT.HORIZONTAL)).doFillIntoGrid(null,
-				composite, nColumns, convertHeightInCharsToPixels(1));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#createButtonsForButtonBar(Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-				true);
-		createButton(parent, IDialogConstants.CANCEL_ID,
-				IDialogConstants.CANCEL_LABEL, false);
-
-		verifyComplete();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#configureShell(Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-
-		// Pageflow.Property.Action.OutcomeSelectionDialog.Title = Outcome
-		// Selection
-		newShell
-				.setText(PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_Title); //$NON-NLS-1$
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#buttonPressed(int)
-	 */
-	protected void buttonPressed(int buttonId) {
-		if (buttonId == IDialogConstants.CANCEL_ID) {
-			setReturnCode(CANCEL);
-			close();
-			return;
-		} else if (buttonId == IDialogConstants.OK_ID) {
-			setReturnCode(OK);
-
-			outcome = actionText.getText();
-
-			close();
-			return;
-		}
-		super.buttonPressed(buttonId);
-	}
-
-	/**
-	 * 
-	 * check the dialog inputs are complete or not, and set the OK button enable
-	 * or not.
-	 */
-	private void verifyComplete() {
-		if (getButton(IDialogConstants.OK_ID) != null) {
-			getButton(IDialogConstants.OK_ID).setEnabled(isDialogComplete());
-		}
-	}
-
-	/**
-	 * check the dialog inputs are complete or not.
-	 * 
-	 * @return
-	 */
-	private boolean isDialogComplete() {
-		return isValidName();
-	}
-
-	/**
-	 * the input name is valid or not
-	 * 
-	 * @return
-	 */
-	private boolean isValidName() {
-		return actionText.getText().length() > 0;
-	}
-
-	/**
-	 * get the selected action in the action table
-	 * 
-	 * @return - selected action
-	 */
-	public String getSelectedAction() {
-		return outcome;
-	}
-
-	/**
-	 * add actions in the source jsp file to the action list table control
-	 * 
-	 */
-	private void addActionsInJSP() {
-		List actionNodes = JSPUtil.getActionListInJSPFile(jspName);
-
-		if (actionNodes != null) {
-			for (int i = 0, n = actionNodes.size(); i < n; i++) {
-				Element node = (Element) actionNodes.get(i);
-				StringBuffer componentName = new StringBuffer();
-
-				Attr idAttr = node.getAttributeNode("id");
-				if (idAttr != null)
-					componentName.append(idAttr.getNodeValue());
-
-				componentName.append("(").append(node.getTagName()).append(")"); //$NON-NLS-1$
-
-				Attr actionAttr = node.getAttributeNode("action");
-				if (actionAttr != null) {
-					String action = actionAttr.getValue();
-					if (isValidEL(action))
-						addActionTableItem(componentName.toString(), action);
-				}
-			}
-		}
-	}
-
-	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 2173666..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, 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
- *******************************************************************************/
-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 18f6c77..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/EditableDialogCellEditor.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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);
-	}
-
-	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 f0d6442..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/EditorSectionDescriptor.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.pageflow.properties;
-
-import java.util.List;
-
-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.wst.common.ui.properties.internal.provisional.ISection;
-import org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor;
-import org.eclipse.wst.common.ui.properties.internal.provisional.ITypeMapper;
-
-
-
-/**
- * @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#getFilter()
-	 */
-	public ITypeMapper getFilter() {
-		return null;
-	}
-
-	/*
-	 * (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() {
-		// TODO Auto-generated method stub
-		return ENABLES_FOR_ANY;
-	}
-}
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 2a5e27d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ExistingPagePathDialogCellEditor.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.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();
-		// TODO Auto-generated constructor stub
-	}
-
-	public ExistingPagePathDialogCellEditor(Composite parent, int style) {
-		super(parent, style);
-		// TODO Auto-generated constructor stub
-	}
-
-	public ExistingPagePathDialogCellEditor(Composite parent, Pageflow pageflow) {
-		super(parent);
-		this.pageflow = pageflow;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see DialogCellEditor#openDialogBox(Control)
-	 */
-	protected Object openDialogBox(Control cellEditorWindow) {
-		String jsfSelection = "";
-		if (getDefaultText() != null && getDefaultText().getText().length() > 0) {
-			jsfSelection = getDefaultText().getText();
-		}
-		ListChoiceDialog dialog = new ListChoiceDialog(cellEditorWindow
-				.getShell(), getPagePaths(),
-				PageflowMessages.ExistingPagePathDialogCellEdito_LabelText);
-
-		if (dialog.open() == Window.OK) {
-			jsfSelection = dialog.getResult();
-		}
-		return jsfSelection;
-	}
-
-	/**
-	 * Collect page paths in current pageflow.
-	 * 
-	 * @return
-	 */
-	private String[] getPagePaths() {
-		List result = new ArrayList();
-		List list = pageflow.getNodes();
-		for (int i = 0; i < list.size(); i++) {
-			String path = ((PageflowPage) list.get(i)).getPath();
-			if (path != null && path.trim().length() > 0) {
-				result.add(path);
-			}
-		}
-		String[] r = (String[]) result.toArray(new String[result.size()]);
-		Arrays.sort(r);
-		return r;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/GeneralViewSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/GeneralViewSection.java
deleted file mode 100644
index 7ebd1e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/GeneralViewSection.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.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.wst.common.ui.properties.internal.provisional.ISection;
-import org.eclipse.wst.common.ui.properties.internal.provisional.ITabbedPropertyConstants;
-import org.eclipse.wst.common.ui.properties.internal.provisional.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.
-	 */
-	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 51e4253..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/GeneralViewSectionDescriptor.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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.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.wst.common.ui.properties.internal.provisional.ISection;
-import org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor;
-import org.eclipse.wst.common.ui.properties.internal.provisional.ITypeMapper;
-
-/**
- * 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#getFilter()
-	 */
-	public ITypeMapper getFilter() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISectionDescriptor#getInputTypes()
-	 */
-	public List getInputTypes() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISectionDescriptor#getSectionClass()
-	 */
-	public ISection getSectionClass() {
-		return new GeneralViewSection();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.xtools.common.ui.properties.ISectionDescriptor#getTargetTab()
-	 */
-	public String getTargetTab() {
-		return ITabbedPropertiesConstants.GENERAL_TAB_ID;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISectionDescriptor#appliesTo(IWorkbenchPart, ISelection)
-	 */
-	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {
-		Object object = null;
-		// FIXME: Should move the appliesTo to differnt page of
-		// MultiPageEditorPart.
-		if (selection instanceof StructuredSelection) {
-			StructuredSelection structuredSelection = (StructuredSelection) selection;
-			object = structuredSelection.getFirstElement();
-			// The general tab will be shown for only pageflow element and
-			// pageflow link editparts
-			if (object instanceof PageflowElementEditPart
-					|| object instanceof PageflowElementTreeEditPart) {
-				return true;
-			} else if (object instanceof PageflowLinkEditPart) {
-				PageflowLink pfLink = (PageflowLink) ((PageflowLinkEditPart) object)
-						.getModel();
-				if (PageflowValidation.getInstance().isValidLinkForProperty(
-						pfLink)) {
-					return true;
-				}
-			} else {
-				return true;
-			}
-		} else if (selection instanceof ITextSelection) {
-			return true;
-		}
-
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISectionDescriptor#getAfterSection()
-	 */
-	public String getAfterSection() {
-		return "";
-	}
-
-	public int getEnablesFor() {
-		return ENABLES_FOR_ANY;
-	}
-}
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 a365f86..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ITabbedPropertiesConstants.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.properties;
-
-/**
- * @author jchoi
- * @version
- */
-public interface ITabbedPropertiesConstants {
-	public static int BROWSE_HEIGHT = 18;
-
-	public static int BROWSE_WIDTH = 20;
-
-	public static final String GENERAL_TAB_ID = "org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.general";
-
-	public static final String ATTRIBUTE_TAB_ID = "org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.attribute";
-
-	public static final String OPTIONAL_SECTION = "attribute.optional"; // 5
-
-	public static final String COMMON_SECTION = "attribute.optional"; // 5
-
-	public static final String LINK_SECTION = "attribute.link"; // 4
-
-	public static final String PAGE_SECTION = "attribute.page"; // 3
-
-	public static final String ACTION_SECTION = "attribute.action"; // 1
-
-	public static final String EDITOR_SECTION = "attribute.editor"; // 1
-
-	public static final String TOP_SECTION = "top"; // 0
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/LinkSectionDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/LinkSectionDescriptor.java
deleted file mode 100644
index 14aa8b0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/LinkSectionDescriptor.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.pageflow.properties;
-
-import java.util.List;
-
-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.wst.common.ui.properties.internal.provisional.ISection;
-import org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor;
-import org.eclipse.wst.common.ui.properties.internal.provisional.ITypeMapper;
-
-/**
- * @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#getFilter()
-	 */
-	public ITypeMapper getFilter() {
-		return null;
-	}
-
-	/*
-	 * (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() {
-		// TODO Auto-generated method stub
-		return ENABLES_FOR_ANY;
-	}
-
-}
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 d3a0b13..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PagePathDialogCellEditor.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see DialogCellEditor#DialogCellEditor()
-	 */
-	public PagePathDialogCellEditor() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see DialogCellEditor#DialogCellEditor(Composite parent)
-	 */
-	public PagePathDialogCellEditor(Composite parent, PageflowPage element) {
-		super(parent);
-		this.element = element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see DialogCellEditor#DialogCellEditor(Composite parent, int style)
-	 */
-	public PagePathDialogCellEditor(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see DialogCellEditor#openDialogBox(Control)
-	 */
-	protected Object openDialogBox(Control cellEditorWindow) {
-		String jsfSelection = "";
-		if (getDefaultText() != null && getDefaultText().getText().length() > 0) {
-			jsfSelection = getDefaultText().getText();
-			IProject project = WebrootUtil.getProject(element);
-			ProjectWebPageSelectionDialog dlg = new ProjectWebPageSelectionDialog(
-					cellEditorWindow.getShell(), project);
-			if (dlg.open() == Window.OK) {
-				jsfSelection = dlg.getResultFilePath();
-			}
-		}
-		return jsfSelection;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageSectionDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageSectionDescriptor.java
deleted file mode 100644
index 3c5bdca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageSectionDescriptor.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.util.List;
-
-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.wst.common.ui.properties.internal.provisional.ISection;
-import org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor;
-import org.eclipse.wst.common.ui.properties.internal.provisional.ITypeMapper;
-
-/**
- * @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#getFilter()
-	 */
-	public ITypeMapper getFilter() {
-		return null;
-	}
-
-	/*
-	 * (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() {
-		// TODO Auto-generated method stub
-		return ENABLES_FOR_ANY;
-	}
-
-}
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 25ee177..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowElementPropertySource.java
+++ /dev/null
@@ -1,476 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-/**
- * This class is intended to be a generic property source for all the objects in
- * the application's model. It currently only supports String and boolean types,
- * and doesn't support reset or nested properties. It uses information in the
- * EMF EAttribute and EDataType classes to get the id, display name, and type
- * information.
- * 
- * @author Xiao-guang Zhang
- */
-public class PageflowElementPropertySource implements IPropertySource {
-	/** attribute name of "path" and "action", which have special property editor */
-	private static final String PAGEFLOW_PATH = "path"; //$NON-NLS-1$    
-
-	static final String PAGEFLOW_NAME = "name"; //$NON-NLS-1$
-
-	static final String PAGEFLOW_COMMENT = "comment"; //$NON-NLS-1$
-
-	private static final String PAGEFLOW_CONFIG_FILE = "configfile"; //$NON-NLS-1$
-
-	/** pageflow elememt */
-	PageflowElement element;
-
-	/** boolean value's label */
-	private static final String P_VALUE_TRUE_LABEL = PageflowMessages.Pageflow_Label_True;
-
-	private static final String P_VALUE_FALSE_LABEL = PageflowMessages.Pageflow_Label_False;
-
-	/** Integer value for boolean type */
-	private static final int P_VALUE_TRUE = 0;
-
-	private static final int P_VALUE_FALSE = 1;
-
-	static class BooleanLabelProvider extends LabelProvider {
-		public String getText(Object element) {
-			String[] values = new String[] { P_VALUE_TRUE_LABEL,
-					P_VALUE_FALSE_LABEL };
-			return values[((Integer) element).intValue()];
-		}
-
-		public Image getImage(Object element) {
-			return EditorPlugin.getDefault().getImage(
-					"facesconfig/Pageflow_BooleanValue.gif"); //$NON-NLS-1$
-		}
-	}
-
-	static class PageflowLabelProvider extends LabelProvider {
-
-		public Image getImage(Object element) {
-			if (element instanceof String) {
-				return EditorPlugin.getDefault().getImage(
-						"facesconfig/Pageflow_TextValue.gif");//$NON-NLS-1$
-			} else if (element instanceof Integer) {
-				return EditorPlugin.getDefault().getImage(
-						"facesconfig/Pageflow_IntegralValue.gif");//$NON-NLS-1$
-			} else {
-				return EditorPlugin.getDefault().getImage(
-						"facesconfig/Pageflow_GenericValue.gif");//$NON-NLS-1$
-			}
-		}
-	}
-
-	/**
-	 * constructor
-	 * 
-	 * @param element -
-	 *            pageflow element model.
-	 */
-	public PageflowElementPropertySource(PageflowElement element) {
-		this.element = element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPropertySource#getEditableValue()
-	 */
-	public Object getEditableValue() {
-		return element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPropertySource#getPropertyDescriptors()
-	 */
-	public IPropertyDescriptor[] getPropertyDescriptors() {
-		// property descriptors
-		List propertyDescriptors = new Vector();
-
-		// if (element instanceof PageflowLink) {
-		// return getLinkPropertyDescriptors();
-		// }
-
-		Iterator it;
-		EClass cls = element.eClass();
-
-		it = cls.getEAllAttributes().iterator();
-		while (it.hasNext()) {
-			EAttribute attr = (EAttribute) it.next();
-			if (attr.isID()
-					|| attr.getFeatureID() == PageflowPackage.PAGEFLOW__REFERENCE_LINK) {
-				continue;
-			}
-			EDataType type = attr.getEAttributeType();
-			if (type.getInstanceClass() == String.class) {
-				PropertyDescriptor propertyDescriptor;
-				if (attr.getName().equalsIgnoreCase(PAGEFLOW_PATH)) {
-					propertyDescriptor = getPagePathPropertyDescriptor(attr);
-				} else if (attr.getName()
-						.equalsIgnoreCase(PAGEFLOW_CONFIG_FILE)) {
-					propertyDescriptor = null;
-				} else {
-					propertyDescriptor = new TextPropertyDescriptor(Integer
-							.toString(attr.getFeatureID()), getString(attr
-							.getName()));
-				}
-				if (propertyDescriptor != null) {
-					propertyDescriptor
-							.setLabelProvider(new PageflowLabelProvider());
-					propertyDescriptors.add(propertyDescriptor);
-				}
-
-			} else if (type.getInstanceClass() == boolean.class) {
-				PropertyDescriptor propertyDescriptor;
-				propertyDescriptor = getBooleanTypePropertyDescriptor(attr);
-				propertyDescriptor.setLabelProvider(new BooleanLabelProvider());
-				propertyDescriptors.add(propertyDescriptor);
-			}
-		}
-
-		return (IPropertyDescriptor[]) propertyDescriptors
-				.toArray(new IPropertyDescriptor[] {});
-	}
-
-	/**
-	 * @return
-	 */
-    // TODO: method not used; dead?
-//	private IPropertyDescriptor[] getLinkPropertyDescriptors() {
-//		// property descriptors
-//		List propertyDescriptors = new Vector();
-//
-//		Iterator it;
-//		EClass cls = element.eClass();
-//
-//		it = cls.getEAllAttributes().iterator();
-//		while (it.hasNext()) {
-//			EAttribute attr = (EAttribute) it.next();
-//			if (attr.isID()
-//					|| attr.getName().equalsIgnoreCase(PAGEFLOW_NAME)
-//					|| attr.getName().equalsIgnoreCase(PAGEFLOW_COMMENT)
-//					|| attr.getFeatureID() == PageflowPackage.PAGEFLOW__REFERENCE_LINK) {
-//				continue;
-//			}
-//
-//			EDataType type = attr.getEAttributeType();
-//			if (type.getInstanceClass() == String.class) {
-//				PropertyDescriptor propertyDescriptor;
-//
-//				propertyDescriptor = new TextPropertyDescriptor(Integer
-//						.toString(attr.getFeatureID()), getString(attr
-//						.getName()));
-//
-//				if (propertyDescriptor != null) {
-//					propertyDescriptor
-//							.setLabelProvider(new PageflowLabelProvider());
-//					propertyDescriptors.add(propertyDescriptor);
-//				}
-//
-//			} else if (type.getInstanceClass() == boolean.class) {
-//				PropertyDescriptor propertyDescriptor;
-//				propertyDescriptor = getBooleanTypePropertyDescriptor(attr);
-//				propertyDescriptor.setLabelProvider(new BooleanLabelProvider());
-//				propertyDescriptors.add(propertyDescriptor);
-//			}
-//		}
-//
-//		return (IPropertyDescriptor[]) propertyDescriptors
-//				.toArray(new IPropertyDescriptor[] {});
-//	}
-
-	/**
-	 * get the property descriptor for the attribute "path" of page component
-	 * 
-	 * @param attr -
-	 *            EAttribute
-	 * @return
-	 */
-	private PropertyDescriptor getPagePathPropertyDescriptor(EAttribute attr) {
-		PropertyDescriptor propertyDescriptor = new PropertyDescriptor(Integer
-				.toString(attr.getFeatureID()), getString(attr.getName())) {
-			public CellEditor createPropertyEditor(Composite parent) {
-				CellEditor editor = new PagePathDialogCellEditor(parent,
-						(PageflowPage) element);
-				if (getValidator() != null) {
-					editor.setValidator(getValidator());
-				}
-				return editor;
-			}
-
-			/**
-			 * Returns the input validator for editing the property.
-			 * 
-			 * @return the validator used to verify correct values for this
-			 *         property, or <code>null</code>
-			 */
-			protected ICellEditorValidator getValidator() {
-				return new ICellEditorValidator() {
-					public String isValid(Object value) {
-						if (((PageflowPage) element).getPath() != null
-								&& value != null
-								&& !((PageflowPage) element).getPath()
-										.equalsIgnoreCase((String) value)) {
-							if (PageflowValidation.getInstance().isExistedPage(
-									((PageflowPage) element).getPageflow(),
-									(String) value)) {
-								// Pageflow.PageflowEditor.Alert.DNDResourceTitle
-								// = Pageflow Creation Error
-								// Pageflow.PageflowEditor.Alert.ExistingPage =
-								// The web page {0} is already existed in
-								// current PageFlow.
-								EditorPlugin
-										.getAlerts()
-										.error(
-												"Pageflow.PageflowEditor.Alert.DNDResourceTitle",
-												"Pageflow.PageflowEditor.Alert.ExistingPage",
-												value);
-
-								return EditorPlugin
-										.getResourceString("Pageflow.PageflowEditor.Alert.ExistingPage");
-							}
-						}
-						return null;
-					}
-
-				};
-			}
-
-		};
-		return propertyDescriptor;
-	}
-
-	/**
-	 * get the property descriptor for the attribute "action" of Action
-	 * component
-	 * 
-	 * @param attr -
-	 *            EAttribute
-	 * @return
-	 */
-    // TODO: method not used; dead?
-//	private PropertyDescriptor getActionPropertyDescriptor(EAttribute attr) {
-//		PropertyDescriptor propertyDescriptor = new PropertyDescriptor(Integer
-//				.toString(attr.getFeatureID()), getString(attr.getName())) {
-//			public CellEditor createPropertyEditor(Composite parent) {
-//				CellEditor editor = new ActionDialogCellEditor(parent);
-//				if (getValidator() != null) {
-//					editor.setValidator(getValidator());
-//				}
-//				return editor;
-//			}
-//
-//			/**
-//			 * Returns the input validator for editing the property.
-//			 * 
-//			 * @return the validator used to verify correct values for this
-//			 *         property, or <code>null</code>
-//			 */
-//			protected ICellEditorValidator getValidator() {
-//				return new ICellEditorValidator() {
-//					public String isValid(Object value) {
-//
-//						return null;
-//					}
-//
-//				};
-//			}
-//		};
-//		return propertyDescriptor;
-//	}
-
-	/**
-	 * get the property descriptor for the attribute "outcome" of Link component
-	 * 
-	 * @param attr -
-	 *            EAttribute
-	 * @return
-	 */
-    // TODO: method not used; dead?
-//	private PropertyDescriptor getActionOutcomePropertyDescriptor(
-//			EAttribute attr) {
-//		PropertyDescriptor propertyDescriptor = new PropertyDescriptor(Integer
-//				.toString(attr.getFeatureID()), getString(attr.getName())) {
-//			public CellEditor createPropertyEditor(Composite parent) {
-//				CellEditor editor = new ActionOutcomeDialogCellEditor(parent,
-//						element);
-//				if (getValidator() != null) {
-//					editor.setValidator(getValidator());
-//				}
-//				return editor;
-//			}
-//		};
-//		return propertyDescriptor;
-//	}
-
-	/**
-	 * get property descriptor for the attribute with the boolean type
-	 * 
-	 * @param attr -
-	 *            EAttribute
-	 * @return
-	 */
-	PropertyDescriptor getBooleanTypePropertyDescriptor(EAttribute attr) {
-		PropertyDescriptor propertyDescriptor;
-		propertyDescriptor = new ComboBoxPropertyDescriptor(Integer
-				.toString(attr.getFeatureID()), getString(attr.getName()),
-				new String[] { P_VALUE_TRUE_LABEL, P_VALUE_FALSE_LABEL });
-		return propertyDescriptor;
-	}
-
-	/**
-	 * Get a translated string from the resource locator.
-	 */
-	protected String getString(String key) {
-		if ("comment".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_comment;
-		}
-
-		if ("name".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_name;
-		}
-
-		if ("largeicon".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_largeicon;
-		}
-
-		if ("smallicon".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_smallicon;
-		}
-		
-		if ("source".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_source;
-		}
-		
-		if ("target".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_target;
-		}
-
-		if ("fromaction".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_fromaction;
-		}
-
-		if ("path".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_path;
-		}
-		if ("begin".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_begin;
-		}
-		if ("end".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_end;
-		}
-		if ("configfile".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_configfile;
-		}
-		if ("outcome".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_outcome;
-		}
-		if ("redirect".equals(key)) {
-			return PageflowMessages.Pageflow_Model_Attributes_redirect;
-		}
-
-		return "";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPropertySource#getPropertyValue(Object)
-	 */
-	public Object getPropertyValue(Object id) {
-		EStructuralFeature feature = element.eClass().getEStructuralFeature(
-				Integer.parseInt((String) id));
-
-		Object result = element.eGet(feature);
-
-		if (result instanceof Boolean) {
-			if (result == Boolean.TRUE) {
-				result = new Integer(P_VALUE_TRUE);
-			} else {
-				result = new Integer(P_VALUE_FALSE);
-			}
-		}
-
-		return result != null ? result : "";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPropertySource#isPropertySet(Object)
-	 */
-	public boolean isPropertySet(Object id) {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPropertySouce#resetPropertyValue(Object)
-	 */
-	public void resetPropertyValue(Object id) {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPropertySource#setPropertyValue(Object, Object)
-	 */
-	public void setPropertyValue(Object id, Object value) {
-		EStructuralFeature feature = element.eClass().getEStructuralFeature(
-				Integer.parseInt((String) id));
-
-		Object result = element.eGet(feature);
-		// if the attribute is boolean type, the value should be changed from
-		// string "true" or "false"
-		// to Boolean.TRUE or Boolean.FALSE
-		if (result instanceof Boolean) {
-			if (value.equals(new Integer(P_VALUE_TRUE))) {
-				value = Boolean.TRUE;
-			} else {
-				value = Boolean.FALSE;
-			}
-		}
-		element.eSet(feature, value);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowLinkPropertySource.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowLinkPropertySource.java
deleted file mode 100644
index 8fdeef7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowLinkPropertySource.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-/**
- * The property source for Pageflow Link.
- * 
- * @author hmeng
- */
-
-public class PageflowLinkPropertySource extends PageflowElementPropertySource {
-
-	public PageflowLinkPropertySource(PageflowElement element) {
-		super(element);
-		// TODO Auto-generated constructor stub
-	}
-
-	public Object getPropertyValue(Object id) {
-		Object result = super.getPropertyValue(id);
-		if (Integer.parseInt((String) id) == PageflowPackage.PF_LINK__SOURCE
-				|| Integer.parseInt((String) id) == PageflowPackage.PF_LINK__TARGET) {
-			result = ((PageflowPage) result).getPath();
-		}
-		return result;
-	}
-
-	public void setPropertyValue(Object id, Object value) {
-		if (Integer.parseInt((String) id) == PageflowPackage.PF_LINK__SOURCE) {
-			((PageflowLink) element).setSourcePath((String) value);
-
-		} else if (Integer.parseInt((String) id) == PageflowPackage.PF_LINK__TARGET) {
-			((PageflowLink) element).setTargetPath((String) value);
-		} else {
-			super.setPropertyValue(id, value);
-		}
-	}
-
-	public IPropertyDescriptor[] getPropertyDescriptors() {
-		// property descriptors
-		List propertyDescriptors = new Vector();
-
-		Iterator it;
-		EClass cls = element.eClass();
-
-		it = cls.getEAllAttributes().iterator();
-		while (it.hasNext()) {
-			EAttribute attr = (EAttribute) it.next();
-			if (attr.isID()
-					|| attr.getName().equalsIgnoreCase(PAGEFLOW_NAME)
-					|| attr.getName().equalsIgnoreCase(PAGEFLOW_COMMENT)
-					|| attr.getFeatureID() == PageflowPackage.PAGEFLOW__REFERENCE_LINK) {
-				continue;
-			}
-
-			EDataType type = attr.getEAttributeType();
-			if (type.getInstanceClass() == String.class) {
-				PropertyDescriptor propertyDescriptor;
-
-				propertyDescriptor = new TextPropertyDescriptor(Integer
-						.toString(attr.getFeatureID()),
-						getString(attr.getName()));
-
-				if (propertyDescriptor != null) {
-					propertyDescriptor
-							.setLabelProvider(new PageflowLabelProvider());
-					propertyDescriptors.add(propertyDescriptor);
-				}
-
-			} else if (type.getInstanceClass() == boolean.class) {
-				PropertyDescriptor propertyDescriptor;
-				propertyDescriptor = getBooleanTypePropertyDescriptor(attr);
-				propertyDescriptor.setLabelProvider(new BooleanLabelProvider());
-				propertyDescriptors.add(propertyDescriptor);
-			}
-		}
-		it = cls.getEReferences().iterator();
-		while (it.hasNext()) {
-			EReference attr = (EReference) it.next();
-			if (attr.getFeatureID() == PageflowPackage.PF_LINK__SOURCE
-					|| attr.getFeatureID() == PageflowPackage.PF_LINK__TARGET) {
-
-				PropertyDescriptor propertyDescriptor;
-
-				propertyDescriptor = getExistingPagePathPropertyDescriptor(attr);
-
-				if (propertyDescriptor != null) {
-					propertyDescriptor
-							.setLabelProvider(new PageflowLabelProvider());
-					propertyDescriptors.add(propertyDescriptor);
-				}
-			}
-		}
-
-		return (IPropertyDescriptor[]) propertyDescriptors
-				.toArray(new IPropertyDescriptor[] {});
-	}
-
-	/**
-	 * The link's ends can be modified to another page existing in current pageflow.
-	 * @param attr
-	 * @return
-	 */
-	private PropertyDescriptor getExistingPagePathPropertyDescriptor(
-			EReference attr) {
-		PropertyDescriptor propertyDescriptor = new PropertyDescriptor(Integer
-				.toString(attr.getFeatureID()), getString(attr.getName())) {
-			public CellEditor createPropertyEditor(Composite parent) {
-				CellEditor editor = new ExistingPagePathDialogCellEditor(
-						parent, (Pageflow) element.eContainer());
-				if (getValidator() != null) {
-					editor.setValidator(getValidator());
-				}
-				return editor;
-			}
-
-			/**
-			 * Returns the input validator for editing the property.
-			 * 
-			 * @return the validator used to verify correct values for this
-			 *         property, or <code>null</code>
-			 */
-			protected ICellEditorValidator getValidator() {
-				return new ICellEditorValidator() {
-					public String isValid(Object value) {
-						if (value != null) {
-							if (!PageflowValidation.getInstance()
-									.isExistedPage(
-											((Pageflow) element.eContainer()),
-											(String) value)) {
-								// Pageflow.PageflowEditor.Alert.DNDResourceTitle
-								// = Pageflow Creation Error
-								// Pageflow.PageflowEditor.Alert.ExistingPage =
-								// The web page {0} is already existed in
-								// current PageFlow.
-								EditorPlugin.getAlerts().info("Note",
-										"Please select an existing page");
-								// "Pageflow.PageflowEditor.Alert.DNDResourceTitle",
-								// "Pageflow.PageflowEditor.Alert.ExistingPage",
-								// (String) value);
-
-								return EditorPlugin
-										.getResourceString("Pageflow.PageflowEditor.Alert.ExistingPage");
-							}
-						}
-						return null;
-					}
-
-				};
-			}
-
-		};
-		return propertyDescriptor;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowSectionDescriptorProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowSectionDescriptorProvider.java
deleted file mode 100644
index f795fee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowSectionDescriptorProvider.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.properties;
-
-import org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor;
-import org.eclipse.wst.common.ui.properties.internal.provisional.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 {
-	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 28f5eb1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowSectionLabelProvider.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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 {
-
-	public PageflowSectionLabelProvider() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see getImage(java.lang.Object)
-	 */
-	public Image getImage(Object object) {
-		Image result = EditorPlugin.getDefault().getImage(
-				"facesconfig/FacesConfig_Pageflow16.gif");
-
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		String result = null;
-		if (object instanceof StructuredSelection) {
-			StructuredSelection structuredSelection = (StructuredSelection) object;
-			Object pageflow = structuredSelection.getFirstElement();
-			if (pageflow instanceof PageflowElementEditPart
-					|| pageflow instanceof PageflowLinkEditPart
-					|| pageflow instanceof PageflowElementTreeEditPart) {
-
-				if (((PageflowElement) ((AbstractEditPart) pageflow).getModel())
-						.eClass() == PageflowPackage.eINSTANCE.getPageflow()) {
-					result = PageflowMessages.Pageflow_Model_Items_Pageflow;
-				} else if (((PageflowElement) ((AbstractEditPart) pageflow)
-						.getModel()).eClass() == PageflowPackage.eINSTANCE
-						.getPFPage()) {
-					result = PageflowMessages.Pageflow_Model_Items_PFPage;
-				} else if (((PageflowElement) ((AbstractEditPart) pageflow)
-						.getModel()).eClass() == PageflowPackage.eINSTANCE
-						.getPFLink()) {
-					result = PageflowMessages.Pageflow_Model_Items_PFLink;
-				}
-			}
-		}
-		return result;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ProjectWebPageSelectionDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ProjectWebPageSelectionDialog.java
deleted file mode 100644
index 45a7b75..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ProjectWebPageSelectionDialog.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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.IFolder;
-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.swt.widgets.Shell;
-
-/**
- * @author hmeng
- */
-
-public class ProjectWebPageSelectionDialog extends CommonResourceDialog {
-
-	public ProjectWebPageSelectionDialog(Shell parentShell, IProject project,
-			int style) {
-		super(parentShell, project, style);
-		init();
-	}
-
-	public ProjectWebPageSelectionDialog(Shell parentShell, IProject project) {
-		super(parentShell, project);
-		init();
-	}
-
-	public ProjectWebPageSelectionDialog(Shell parentShell, IFolder folder,
-			int style) {
-		super(parentShell, folder, style);
-		init();
-	}
-
-	private void init() {
-		setResourceDescription("Web page");
-		setSuffixs(new String[] { "jsp", "jspx", "jsf", "html", "htm" });
-	}
-
-	public String getResultFilePath() {
-		String result = "";
-		IFile selectedFile = (IFile) getResult()[0];
-		IPath path = selectedFile.getProjectRelativePath();
-		path = path.removeFirstSegments(1);
-		result = "/" + path.toString();
-		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 e803844..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PropertyMessages.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.properties;
-
-import org.eclipse.osgi.util.NLS;
-
-public final class PropertyMessages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PropertyMessages";
-
-	private PropertyMessages() {
-		// Do not instantiate
-	}
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, PropertyMessages.class);
-	}
-
-	public static String property_displayName;
-
-	public static String property_description;
-
-	public static String property_configFile;
-
-	public static String property_largeIcon;
-
-	public static String property_smallIcon;
-
-	public static String property_fromAction;
-
-	public static String property_fromView;
-
-	public static String property_fromOutcome;
-
-	public static String property_redirect;
-
-	public static String property_browseButton;
-
-	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 b2a7b4c..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, 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
-###############################################################################
-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 a46eb1c..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,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.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
- */
-public 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());
-
-	}
-
-	/*
-	 * (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,
-			int col) {
-		displayNameField.doFillIntoGrid(toolkit, parent, col);
-		descField.doFillIntoGrid(toolkit, parent, col);
-
-	}
-
-	protected void refreshData(PageflowElement elem) {
-		descField.setTextWithoutUpdate(elem.getComment());
-		displayNameField.setTextWithoutUpdate(elem.getName());
-	}
-
-	public StringDialogField getDescField() {
-		return descField;
-	}
-
-	public 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;
-	}
-
-	protected String assertString(String value) {
-		return value == null ? "" : value;
-	}
-}
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 37d902d..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.wst.common.ui.properties.internal.provisional.AbstractPropertySection;
-
-/**
- * This is base section, which support GEF command stack to redo/undo setting
- * properties.
- * 
- * @author jchoi, Xiao-guang Zhang
- */
-public 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 87d191e..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
- */
-public 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 5f1d9c4..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.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage;
-import org.eclipse.wst.common.ui.properties.internal.provisional.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 55218d1..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,201 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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
- */
-public class LinkGroup extends AbstractEditPartGroup {
-	private StringButtonDialogField fromOutcomeField;
-
-	private StringDialogField fromActionField;
-
-	private ComboDialogField redirectField;
-
-	private PageflowLink pfLink;
-
-	/** Integer value for boolean type */
-	private static final Integer P_VALUE_TRUE = new Integer(0);
-
-	private static final Integer P_VALUE_FALSE = new Integer(1);
-
-	private class StringButtonAdapter implements IStringButtonAdapter {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.IStringButtonAdapter#changeControlPressed(org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogField)
-		 */
-		public void changeControlPressed(DialogField field) {
-			String outcome = "";
-			String jspPage = "";
-			Shell shell = field.getLabelControl(null, null).getShell();
-			if (pfLink != null) {
-				outcome = pfLink.getOutcome();
-				jspPage = WebrootUtil.getProjectPath(pfLink,
-						getPreviousJSPPath(pfLink));
-				ActionOutcomeSelectionDialog actionDialog = new ActionOutcomeSelectionDialog(
-						shell, outcome, jspPage);
-				if (actionDialog.open() == Window.OK) {
-					outcome = actionDialog.getSelectedAction();
-					fromOutcomeField.setText(outcome);
-					pfLink.setOutcome(outcome);
-					refreshData();
-				}
-			}
-		}
-
-		/**
-		 * @param _element
-		 * @return
-		 */
-		private String getPreviousJSPPath(PageflowElement element) {
-			String jspPath = null;
-			if (element instanceof PageflowLink) {
-				PageflowNode source = ((PageflowLink) element).getSource();
-				if (source instanceof PageflowPage) {
-					jspPath = ((PageflowPage) source).getPath();
-				}
-			}
-			return jspPath;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-		fromOutcomeField = new StringButtonDialogField(
-				new StringButtonAdapter());
-		fromOutcomeField.setLabelText(PropertyMessages.property_fromOutcome);
-		fromOutcomeField.setButtonLabel("...");
-		fromOutcomeField
-				.setDialogFieldChangeListener(getDefaultChangeListener());
-		fromActionField = new StringDialogField();
-		fromActionField.setLabelText(PropertyMessages.property_fromAction);
-		fromActionField
-				.setDialogFieldChangeListener(getDefaultChangeListener());
-		redirectField = new ComboDialogField(SWT.DROP_DOWN | SWT.READ_ONLY);
-		redirectField.setLabelText(PropertyMessages.property_redirect);
-		redirectField
-				.setDialogFieldChangeListener((getDefaultChangeListener()));
-		List redirectList;
-		redirectList = new ArrayList();
-		redirectList.add(Boolean.TRUE.toString());
-		redirectList.add(Boolean.FALSE.toString());
-		redirectField.setItems((String[]) redirectList.toArray(new String[0]));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#refreshData()
-	 */
-	public void refreshData() {
-		if (pfLink != null) {
-			fromOutcomeField.setTextWithoutUpdate(pfLink.getOutcome());
-			fromActionField.setTextWithoutUpdate(pfLink.getFromaction());
-			if (pfLink.isRedirect()) {
-				redirectField.setTextWithoutUpdate(Boolean.TRUE.toString());
-			} else {
-				redirectField.setTextWithoutUpdate(Boolean.FALSE.toString());
-			}
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#layoutDialogFields(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public void layoutDialogFields(FormToolkit toolkit, Composite parent) {
-		Composite top;
-		if (toolkit == null) {
-			top = new Composite(parent, SWT.NONE);
-		} else {
-			top = toolkit.createComposite(parent);
-		}
-		FillLayout fillLayout = new FillLayout(SWT.VERTICAL);
-		parent.setLayout(fillLayout);
-
-		int numberOfColumns = 4;
-		GridLayout layout = new GridLayout(numberOfColumns, false);
-		top.setLayout(layout);
-
-		fromActionField.doFillIntoGrid(toolkit, top, numberOfColumns);
-		fromOutcomeField.doFillIntoGrid(toolkit, top, numberOfColumns);
-		redirectField.doFillIntoGrid(toolkit, top, numberOfColumns);
-
-		LayoutUtil.setHorizontalGrabbing(fromOutcomeField.getTextControl(
-				toolkit, top));
-		GridData data = new GridData();
-		data.widthHint = ITabbedPropertiesConstants.BROWSE_WIDTH;
-		data.heightHint = ITabbedPropertiesConstants.BROWSE_HEIGHT;
-
-		fromOutcomeField.getChangeControl(toolkit, top).setLayoutData(data);
-
-	}
-
-	public void setPropertyProvider(PageflowLink elem) {
-		pfLink = elem;
-		this.refreshData();
-	}
-
-	public StringButtonDialogField getFromOutcomeField() {
-		return fromOutcomeField;
-	}
-
-	public StringDialogField getFromActionField() {
-		return fromActionField;
-	}
-
-	public ComboDialogField getRedirectField() {
-		return redirectField;
-	}
-
-	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 e223a74..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.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage;
-import org.eclipse.wst.common.ui.properties.internal.provisional.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 bcaba51..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,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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
- */
-public class PageGroup extends AbstractEditPartGroup {
-
-	private StringButtonDialogField fromViewField;
-
-	private PageflowPage pfPage = null;
-
-	private StringDialogField largeIconField;
-
-	private StringDialogField smallIconField;
-
-	class StringButtonAdapter implements IStringButtonAdapter {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.IStringButtonAdapter#changeControlPressed(org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogField)
-		 */
-		public void changeControlPressed(DialogField field) {
-			IProject project = WebrootUtil.getProject(pfPage);
-			ProjectWebPageSelectionDialog dlg = new ProjectWebPageSelectionDialog(
-					field.getLabelControl(null, null).getShell(), project);
-			if (dlg.open() == Window.OK) {
-				fromViewField.setText(dlg.getResultFilePath());
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-		fromViewField = new StringButtonDialogField(new StringButtonAdapter());
-		fromViewField.setLabelText(PropertyMessages.property_fromView);
-		fromViewField.setButtonLabel("...");
-		fromViewField.setDialogFieldChangeListener(getDefaultChangeListener());
-
-		largeIconField = new StringDialogField();
-		largeIconField.setLabelText(PropertyMessages.property_largeIcon);
-		largeIconField
-				.setDialogFieldChangeListener((getDefaultChangeListener()));
-		smallIconField = new StringDialogField();
-		smallIconField.setLabelText(PropertyMessages.property_smallIcon);
-		smallIconField
-				.setDialogFieldChangeListener((getDefaultChangeListener()));
-		super.initialize();
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#refreshData()
-	 */
-	public void refreshData() {
-		if (pfPage != null) {
-			fromViewField.setTextWithoutUpdate(assertString(pfPage.getPath()));
-			largeIconField.setTextWithoutUpdate(assertString(pfPage
-					.getLargeicon()));
-			smallIconField.setTextWithoutUpdate(assertString(pfPage
-					.getSmallicon()));
-			super.refreshData(pfPage);
-
-		}
-
-	}
-
-	/*
-	 * (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);
-	}
-
-	public void setPropertyProvider(PageflowPage elem) {
-		pfPage = elem;
-		this.refreshData();
-	}
-
-	public StringButtonDialogField getFromViewField() {
-		return fromViewField;
-	}
-
-	public StringDialogField getLargeIconField() {
-		return largeIconField;
-	}
-
-	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 6593174..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.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage;
-import org.eclipse.wst.common.ui.properties.internal.provisional.TabbedPropertySheetWidgetFactory;
-
-/**
- * Edit section for Pagflow Page Element (EditPart)
- * 
- * @author jchoi, Xiao-guang Zhang
- */
-public class PageSection extends AbstractEditPartSection {
-	/** edit group */
-	private PageGroup group;
-
-	/** the emf model for Pageflow page */
-	private PageflowPage pfPage = null;
-
-	/**
-	 * 
-	 */
-	public PageSection() {
-		super();
-		group = new PageGroup();
-		group.setDefaultChangeListener(changeListener);
-		group.initialize();
-
-		group.getFromViewField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						if (pfPage != null) {
-							String jsfNew = group.getFromViewField().getText();
-							if (jsfNew != null && jsfNew.length() > 0) {
-								if (PageflowValidation.getInstance()
-										.isExistedPage(pfPage.getPageflow(),
-												jsfNew)) {
-									// Pageflow.PageflowEditor.Alert.DNDResourceTitle
-									// = Pageflow Creation Error
-									// Pageflow.PageflowEditor.Alert.ExistingPage
-									// = The web page {0} is already existed in
-									// current PageFlow.
-									EditorPlugin
-											.getAlerts()
-											.error(
-													"Pageflow.PageflowEditor.Alert.DNDResourceTitle",
-													"Pageflow.PageflowEditor.Alert.ExistingPage",
-													jsfNew);
-								} else {
-									PageSection.this
-											.setValue(
-													PageflowPackageImpl.eINSTANCE
-															.getPFPage_Path()
-															.getName(), jsfNew);
-								}
-							}
-						}
-					}
-				});
-
-		group.getLargeIconField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						PageSection.this.setValue(PageflowPackageImpl.eINSTANCE
-								.getPFPage_Largeicon().getName(), group
-								.getLargeIconField().getText());
-					}
-				});
-		group.getSmallIconField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						PageSection.this.setValue(PageflowPackageImpl.eINSTANCE
-								.getPFPage_Smallicon().getName(), group
-								.getSmallIconField().getText());
-					}
-				});
-
-		group.getDescField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						PageSection.this.setValue(PageflowPackageImpl.eINSTANCE
-								.getPageflowElement_Comment().getName(), group
-								.getDescField().getText());
-					}
-				});
-
-		group.getDisplayNameField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						PageSection.this.setValue(PageflowPackageImpl.eINSTANCE
-								.getPageflowElement_Name().getName(), group
-								.getDisplayNameField().getText());
-					}
-				});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISection#createControls(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage aTabbedPropertySheetPage) {
-		super.createControls(parent, aTabbedPropertySheetPage);
-		TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage
-				.getWidgetFactory();
-		Composite top = factory.createFlatFormComposite(parent);
-
-		group.layoutDialogFields(factory, top);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISection#setInput(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-
-		if (getInput() != null && getInput() instanceof PageflowNodeEditPart) {
-			Object model = ((PageflowNodeEditPart) getInput()).getModel();
-			if (model instanceof PageflowPage) {
-				pfPage = (PageflowPage) model;
-				refreshData();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.properties.sections.AbstractEditPartSection#refreshData()
-	 */
-	public void refreshData() {
-		super.refreshData();
-		group.setPropertyProvider(pfPage);
-	}
-
-    public void validate() {
-        // do nothing
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/SetPropertyValueCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/SetPropertyValueCommand.java
deleted file mode 100644
index 67df3ca..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,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.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;
-
-public class SetPropertyValueCommand extends Command {
-
-	protected Object propertyValue;
-
-	protected Object propertyID;
-
-	protected Object undoValue;
-
-	protected boolean resetOnUndo;
-
-	protected IPropertySource target;
-
-	public SetPropertyValueCommand() {
-		super(""); //$NON-NLS-1$
-	}
-
-	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;
-		}
-	}
-
-	public IPropertySource getTarget() {
-		return target;
-	}
-
-	public void setTarget(IPropertySource aTarget) {
-		target = aTarget;
-	}
-
-	public void redo() {
-		execute();
-	}
-
-	public void setPropertyId(Object pName) {
-		propertyID = pName;
-	}
-
-	public 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 334b5b4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFSynchronizer.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.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);
-
-	public FC2PFSynchronizer(FC2PFTransformer transformer) {
-		this.transformer = transformer;
-	}
-
-	public Notifier getTarget() {
-		// can't set target so return null
-		return null;
-	}
-
-	public void setTarget(Notifier newTarget) {
-        // do nothing
-	}
-
-	public boolean isAdapterForType(Object type) {
-		return type == FC2PFSynchronizer.class;
-	}
-
-	public void notifyChanged(Notification notification) {
-		if (!isProcessorFor(notification)) {
-			return;
-		}
-		transformer.setInEvent(true);
-		try {
-			int type = notification.getEventType();
-			switch (type) {
-			case Notification.ADD: {
-				processAdd(notification);
-				notifyPageflow(notification);
-				break;
-			}
-			case Notification.SET: {
-				processSet(notification);
-				notifyPageflow(notification);
-				break;
-			}
-			case Notification.REMOVE:
-				processRemove(notification);
-				notifyPageflow(notification);
-				break;
-			}
-		} catch (Exception e) {
-			logger.error(e);
-		} finally {
-			if (notification.getEventType() != Notification.REMOVING_ADAPTER) {
-				transformer.refreshFCAdapter((EObject) notification
-						.getNotifier());
-				transformer.refreshPFAdapter(transformer.getPageflow());
-			}
-			transformer.setInEvent(false);
-		}
-	}
-
-	private boolean isProcessorFor(Notification notification) {
-		boolean result = false;
-		if (transformer.isListenToNotify()
-				&& (notification.getNotifier() instanceof EObject)) {
-			if (notification.getNotifier() == transformer.getFacesConfig()) {
-				// For faces-config, only navigation rule's change is awared.
-				if (notification.getFeature() == FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_NavigationRule()) {
-					result = true;
-				}
-			} else {
-				result = true;
-			}
-		}
-		return result;
-	}
-
-	private void processAdd(Notification notification) {
-		Object feature = notification.getFeature();
-		if (feature == FacesConfigPackage.eINSTANCE
-				.getNavigationRuleType_NavigationCase()) {
-			if (DEBUG)
-				System.out.println("New navigation case");
-			NavigationCaseType newCase = (NavigationCaseType) notification
-					.getNewValue();
-			transformer.updatePageflowElements(transformer.getPageflow(),
-					newCase);
-		} else if (feature == FacesConfigPackage.eINSTANCE
-				.getFacesConfigType_NavigationRule()) {
-			NavigationRuleType newRule = (NavigationRuleType) notification
-					.getNewValue();
-			if (newRule.getNavigationCase().size() > 0) {
-				for (int i = 0; i < newRule.getNavigationCase().size(); i++) {
-					transformer.updatePageflowElements(transformer
-							.getPageflow(), (NavigationCaseType) newRule
-							.getNavigationCase().get(i));
-				}
-			}
-			if (DEBUG)
-				System.out.println("New navigation rule");
-		} else if (DEBUG)
-			System.out.println("Something is added");
-	}
-
-	/**
-	 * Notify pageflow the changes.
-	 * 
-	 * @param notification
-	 */
-	private void notifyPageflow(Notification notification) {
-		Assert.isTrue(notification.getNotifier() instanceof InternalEObject);
-		transformer.getPageflow().notifyModelChanged(
-				new ENotificationImpl((InternalEObject) notification
-						.getNotifier(), Notification.SET,
-						PageflowPackage.PAGEFLOW, null, null));
-	}
-
-	/**
-	 * Deal with the case when some element is removed.
-	 * 
-	 * @param notification
-	 */
-	private void processRemove(Notification notification) {
-		if (notification.getFeature() == FacesConfigPackage.eINSTANCE
-				.getNavigationRuleType_NavigationCase()) {
-			if (notification.getOldValue() instanceof NavigationCaseType) {
-				NavigationCaseType caseType = (NavigationCaseType) notification
-						.getOldValue();
-				transformer.removeLink(caseType);
-			}
-			if (DEBUG)
-				System.out.println("Navigation case");
-		} else if (notification.getFeature() == FacesConfigPackage.eINSTANCE
-				.getNavigationCaseType()) {
-			if (notification.getOldValue() instanceof NavigationRuleType) {
-				NavigationRuleType rule = (NavigationRuleType) notification
-						.getOldValue();
-				for (int i = 0; i < rule.getNavigationCase().size(); i++) {
-					NavigationCaseType caseType = (NavigationCaseType) rule
-							.getNavigationCase().get(i);
-					transformer.refreshLink(caseType);
-				}
-			}
-			if (DEBUG)
-				System.out.println("navigation rule");
-		} else if (notification.getFeature() == FacesConfigPackage.eINSTANCE
-				.getFacesConfigType_NavigationRule()) {
-			if (notification.getOldValue() instanceof NavigationRuleType) {
-				NavigationRuleType rule = (NavigationRuleType) notification
-						.getOldValue();
-				for (int i = 0; i < rule.getNavigationCase().size(); i++) {
-					NavigationCaseType caseType = (NavigationCaseType) rule
-							.getNavigationCase().get(i);
-					transformer.refreshLink(caseType);
-				}
-			}
-		}
-		if (DEBUG)
-			System.out.println("Something is removed");
-	}
-
-	/**
-	 * Deal with property change.
-	 * 
-	 * @param notification
-	 */
-	private void processSet(Notification notification) {
-		Object feature = notification.getFeature();
-		if (feature == FacesConfigPackage.eINSTANCE
-				.getFromViewIdType_TextContent()
-				|| feature == FacesConfigPackage.eINSTANCE
-						.getNavigationRuleType_FromViewId()) {
-			fromViewIdChanged(notification);
-		} else if (feature == FacesConfigPackage.eINSTANCE
-				.getToViewIdType_TextContent()
-				|| feature == FacesConfigPackage.eINSTANCE
-						.getNavigationCaseType_ToViewId()) {
-			toViewIdChanged(notification);
-		}
-		if (DEBUG)
-			System.out.println("Something is set");
-	}
-
-	private void fromViewIdChanged(Notification notification) {
-		// remove
-		Object feature = notification.getFeature();
-		if (feature == FacesConfigPackage.eINSTANCE
-				.getNavigationRuleType_FromViewId()
-				&& notification.getNewValue() == null
-				&& notification.getOldValue() instanceof FromViewIdType) {
-			NavigationRuleType rule = (NavigationRuleType) notification
-					.getNotifier();
-			for (int i = 0; i < rule.getNavigationCase().size(); i++) {
-				NavigationCaseType caseType = (NavigationCaseType) rule
-						.getNavigationCase().get(i);
-				transformer.refreshLink(caseType);
-			}
-		}
-		// add or change
-		else if (feature == FacesConfigPackage.eINSTANCE
-				.getFromViewIdType_TextContent()) {
-			NavigationRuleType rule = (NavigationRuleType) ((EObject) notification
-					.getNotifier()).eContainer();
-			for (int i = 0; i < rule.getNavigationCase().size(); i++) {
-				NavigationCaseType caseType = (NavigationCaseType) rule
-						.getNavigationCase().get(i);
-				transformer.refreshLink(caseType);
-			}
-		}
-	}
-
-	private void toViewIdChanged(Notification notification) {
-		// remove
-		Object feature = notification.getFeature();
-		if (feature == FacesConfigPackage.eINSTANCE
-				.getNavigationCaseType_ToViewId()
-				&& notification.getNewValue() == null
-				&& notification.getOldValue() instanceof ToViewIdType) {
-			NavigationCaseType caseType = (NavigationCaseType) notification
-					.getNotifier();
-			transformer.refreshLink(caseType);
-		}
-		// add or change
-		else if (feature == FacesConfigPackage.eINSTANCE
-				.getToViewIdType_TextContent()) {
-			NavigationCaseType caseType = (NavigationCaseType) ((EObject) notification
-					.getNotifier()).eContainer();
-			transformer.refreshLink(caseType);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFTransformer.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFTransformer.java
deleted file mode 100644
index 6814b90..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFTransformer.java
+++ /dev/null
@@ -1,945 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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;
-
-	public static final int MY_NOTIFICATION_TYPE = Notification.EVENT_TYPE_COUNT + 1;
-
-	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;
-
-	public FC2PFTransformer() {
-		super();
-		// TODO Auto-generated constructor stub
-	}
-
-	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);
-	}
-
-	public void setFacesConfig(FacesConfigType facesConfig) {
-		this.facesConfig = facesConfig;
-		refreshFCAdapter(facesConfig);
-	}
-
-	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();
-			}
-		}
-	}
-
-	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;
-	}
-
-	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
-	}
-
-	public static FromViewIdType getSource(NavigationCaseType caseType) {
-		if (caseType.eContainer() instanceof NavigationRuleType) {
-			NavigationRuleType rule = (NavigationRuleType) caseType
-					.eContainer();
-			return rule.getFromViewId();
-		}
-		return null;
-	}
-
-	private PageflowPage getOrCreateStartPage(NavigationCaseType navCase) {// FromViewIdType
-		PageflowPage startPageflowNode = null;
-		String path = "*";
-		NavigationRuleType rule = (NavigationRuleType) navCase.eContainer();
-		FromViewIdType source = getSource(navCase);
-		if (source != null) {
-			path = source.getTextContent();
-		}
-		if (getValidPFPageInCache(path) == null) {
-			startPageflowNode = TransformUtil.findPage(path, pageflow);
-
-			if (startPageflowNode == null) {
-				// not exist or is "*"
-				if (DEBUG)
-					System.out.println("Create new start page");
-				startPageflowNode = createPFPage(path);
-				pageflowChanged = true;
-			}
-			mapPaths2PF.put(path, startPageflowNode);
-			PageflowTransform.getInstance().updatePageflowSourcePage(
-					startPageflowNode, rule);
-		} else {
-			startPageflowNode = (PageflowPage) mapPaths2PF.get(path);
-		}
-		if (source != null) {
-			ReferenceElement element = new PageReferenceElement(
-					startPageflowNode);
-			element.add(source);
-			startPageflowNode
-					.setReferenceLink(element.resolveReferenceString());
-			startPageflowNode.getFCElements().add(source);
-		}
-		return startPageflowNode;
-	}
-
-	/**
-	 * Search for an existing pageflow page matching to navigation case's
-	 * target, if there is no such page existing, create one.
-	 * 
-	 * @param navCase
-	 * @return
-	 */
-	private PageflowPage getOrCreateEndPage(NavigationCaseType navCase) {
-		PageflowPage endPageflowNode = null;
-		ToViewIdType target_ = navCase.getToViewId();
-		if (target_ != null) {
-			String path = target_.getTextContent();
-			if (getValidPFPageInCache(path) == null) {
-				endPageflowNode = TransformUtil.findPage(path, pageflow);
-				if (endPageflowNode == null) {
-					endPageflowNode = createPFPage(path);
-					if (DEBUG)
-						System.out.println("Create new end page");
-					pageflowChanged = true;
-				}
-				mapPaths2PF.put(path, endPageflowNode);
-				PageflowTransform.getInstance().updatePageflowTargetPage(
-						endPageflowNode, navCase);
-			} else {
-				endPageflowNode = (PageflowPage) mapPaths2PF.get(path);
-			}
-			if (target_ != null) {
-				ReferenceElement element = new PageReferenceElement(
-						endPageflowNode);
-				element.add(target_);
-				endPageflowNode.setReferenceLink(element
-						.resolveReferenceString());
-				endPageflowNode.getFCElements().add(target_);
-			}
-		}
-		return endPageflowNode;
-	}
-
-	/**
-	 * Return a valid cached pageflow node.
-	 * 
-	 * @param key
-	 * @return
-	 */
-	private PageflowPage getValidPFPageInCache(Object key) {
-		EObject element = (EObject) mapPaths2PF.get(key);
-		if (!TransformUtil.isValidPageflowElement(element)
-				|| !(element instanceof PageflowPage)
-				|| !((PageflowPage) element).getPath().equals(key)) {
-			mapPaths2PF.remove(key);
-			element = null;
-		}
-		return (PageflowPage) element;
-	}
-
-	/**
-	 * Return a valid cached pageflow link.
-	 * 
-	 * @param caseType
-	 * @return
-	 */
-	private PageflowLink getValidPFLinkInCache(EObject caseType) {
-		PageflowLink link = (PageflowLink) mapCases2Links.get(caseType);
-		if (!TransformUtil.isValidLink(link)) {
-			mapCases2Links.remove(caseType);
-			link = null;
-		}
-		return link;
-
-	}
-
-	/**
-	 * Update pageflow model elements against faces-config navigation case.
-	 */
-	public boolean updatePageflowElements(Pageflow pageflow_,
-			NavigationCaseType caseFC) {
-		this.pageflowChanged = false;
-		this.pageflow = pageflow_;
-		ToViewIdType target_ = caseFC.getToViewId();
-		if (target_ == null) {
-			return false;
-		}
-
-		PageflowPage start = null, end = null;
-		// start page
-		start = getOrCreateStartPage(caseFC);
-		String action = null;
-		// action
-		if (caseFC.getFromAction() != null) {
-			action = caseFC.getFromAction().getTextContent();
-		}
-		// from outcome
-		String fromOutCome = null;
-		if (caseFC.getFromOutcome() != null) {
-			fromOutCome = caseFC.getFromOutcome().getTextContent();
-		}
-		// end page
-		end = getOrCreateEndPage(caseFC);
-		// link
-		// Is there a link in pageflow model?
-		PageflowLink link = null;
-		if ((link = findUnmappedLink(start, end, caseFC)) == null) {
-			if (end != null) {
-				if (DEBUG)
-					System.out.println("Create new link");
-				link = createPFLink(start, end, action, fromOutCome);
-				pageflowChanged = true;
-			}
-		}
-		if (link != null) {
-			link.getFCElements().clear();
-			link.getFCElements().add(caseFC);
-			mapCases2Links.put(caseFC, link);
-		}
-		adapt(start);
-		adapt(end);
-		adapt(caseFC);
-		adapt(link);
-		return pageflowChanged;
-	}
-
-	private boolean cleanPageflowNavigationRule(Pageflow pageflow_) {
-		boolean dirty = false;
-		List links = pageflow_.getLinks();
-		Iterator linksIterator = links.iterator();
-		while (linksIterator.hasNext()) {
-			PageflowLink link = (PageflowLink) linksIterator.next();
-			if (link.getFCElements().isEmpty()) {
-				linksIterator.remove();
-				if (link.getSource() != null) {
-					link.getSource().getOutlinks().remove(link);
-				}
-				if (link.getTarget() != null) {
-					link.getTarget().getInlinks().remove(link);
-				}
-				dirty = true;
-			}
-		}
-		return dirty;
-	}
-
-	/**
-	 * merge the two navigation rules list between pageflow and face-config
-	 * file. merge rule: 1. if the from-view-id, from-action, and from-outcome
-	 * are same, they are the same navigation case, then the navigation case in
-	 * face-config file should be updated by one in the pageflow. 2. otherwise
-	 * the new navigation case should be created.
-	 * 
-	 * FIXME: Not merge, only update page flow from faces-config.
-	 * 
-	 * @param rulesFC -
-	 *            navigation rules in faces-config.
-	 * @param navigationRulesInPageflow -
-	 *            navigation rules in pageflow model.
-	 * 
-	 * @return boolean - whether add a new rule or not.
-	 */
-	private boolean updateNavigationRulesInPageflowFromFacesConfig(List rulesFC) {
-		boolean isNew = false;
-		// if the faces-config file is empty, the links should be removed.
-		if (rulesFC == null || rulesFC.isEmpty()) {
-			for (Iterator iterLink = pageflow.getLinks().iterator(); iterLink
-					.hasNext();) {
-				PageflowLink link = (PageflowLink) iterLink.next();
-				link.getSource().getOutlinks().remove(link);
-				link.getTarget().getInlinks().remove(link);
-			}
-			pageflow.getLinks().clear();
-		} else {
-			// Rule - Cases
-			for (Iterator iterRulesFC = rulesFC.iterator(); iterRulesFC
-					.hasNext();) {
-				NavigationRuleType ruleFC = (NavigationRuleType) iterRulesFC
-						.next();
-
-				List casesFC = ruleFC.getNavigationCase();
-				for (Iterator iterCasesFC = casesFC.iterator(); iterCasesFC
-						.hasNext();) {
-					NavigationCaseType navigationCaseFC = (NavigationCaseType) iterCasesFC
-							.next();
-					isNew |= updatePageflowElements(pageflow, navigationCaseFC);
-				}
-			}
-		}
-		isNew |= cleanPageflowNavigationRule(pageflow);
-		return isNew;
-	}
-
-	/**
-	 * Find a pageflow link that is not linked to a faces-config element. Since
-	 * user might edit faces-config file with other editor, so the path is not
-	 * always valid, here we still try to match link and navigation case. TODO:
-	 * should we always resolve mapping from referenceLink on PageflowElement?
-	 */
-	private PageflowLink findUnmappedLink(PageflowPage start, PageflowPage end,
-			NavigationCaseType caseFC) {
-		List links = start.getOutlinks();
-		for (int i = 0, n = links.size(); i < n; i++) {
-			PageflowLink link = (PageflowLink) links.get(i);
-			if (link.getSource() == start && link.getTarget() == end) {
-				link.update();
-				if (link.getFCElements().isEmpty()
-						|| link.getFCElements().getData().get(0) == caseFC) {
-					return link;
-				}
-			}
-		}
-		return null;
-	}
-
-	public PageflowLink createPFLink(PageflowNode start, PageflowNode target_,
-			NavigationCaseType caseFC) {
-		PageflowLink link = null;
-		String fromOutcome = caseFC.getFromOutcome() != null ? caseFC
-				.getFromOutcome().getTextContent() : null;
-		String action = caseFC.getFromAction() != null ? caseFC.getFromAction()
-				.getTextContent() : null;
-		NavigationRuleType rule = (NavigationRuleType) caseFC.eContainer();
-		link = createPFLink(fromOutcome);
-		link.setFromaction(action);
-		link.setSource(start);
-		link.setTarget(target_);
-		start.getOutlinks().add(link);
-		target_.getInlinks().add(link);
-		// The reference.
-		link.getFCElements().add(caseFC);
-		start.getFCElements().add(rule.getFromViewId());
-		target_.getFCElements().add(caseFC.getToViewId());
-		return link;
-	}
-
-	/**
-	 * 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 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);
-		}
-	}
-
-	public boolean isListenToNotify() {
-		return listenToNotify && !isInEvent;
-	}
-
-	public boolean isInEvent() {
-		return isInEvent;
-	}
-
-	public void setInEvent(boolean isInEvent) {
-		this.isInEvent = isInEvent;
-	}
-
-	public FacesConfigType getFacesConfig() {
-		return facesConfig;
-	}
-
-	public Pageflow getPageflow() {
-		return pageflow;
-	}
-
-	public static FromViewIdType createRLFromViewID(String value) {
-		FromViewIdType fromView = FacesConfigFactory.eINSTANCE
-				.createFromViewIdType();
-		fromView.setTextContent(value);
-		return fromView;
-	}
-
-	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 c446c0a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/PF2FCSynchronizer.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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);
-
-	public PF2FCSynchronizer(FC2PFTransformer tranformer) {
-		this.tranformer = tranformer;
-	}
-
-	public Notifier getTarget() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public void setTarget(Notifier newTarget) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public boolean isAdapterForType(Object type) {
-		return type == PF2FCSynchronizer.class;
-	}
-
-	public void notifyChanged(Notification notification) {
-		if (!isProcessorFor(notification)) {
-			return;
-		}
-		tranformer.setInEvent(true);
-		try {
-			if (!(notification.getNotifier() instanceof PageflowElement)) {
-				return;
-			}
-			processChange(notification);
-		} catch (Exception e) {
-			logger.error(e);
-		} finally {
-			if (notification.getEventType() != Notification.REMOVING_ADAPTER) {
-				tranformer.refreshPFAdapter(tranformer.getPageflow());
-				tranformer.refreshFCAdapter(tranformer.getFacesConfig());
-			}
-			tranformer.setInEvent(false);
-		}
-	}
-
-	private boolean isProcessorFor(Notification notification) {
-		return tranformer.isListenToNotify();
-	}
-
-	private void processChange(Notification notification) {
-		PageflowElement element;
-		element = (PageflowElement) notification.getNotifier();
-		int type = notification.getEventType();
-		switch (type) {
-		case Notification.ADD: {
-			int featureId = notification.getFeatureID(PageflowPackage.class);
-			switch (featureId) {
-			case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-				addOutLink(notification, element);
-				break;
-			case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-				addInLink(notification, element);
-				break;
-			case PageflowPackage.PAGEFLOW:
-				break;
-			}
-			if (!tranformer.isNeedBatchOperations()) {
-				updateAndNotify(notification);
-			}
-			break;
-		}
-		case Notification.SET:
-			if (notification.getNewValue() != null) {
-				processSet(notification, element);
-				updateAndNotify(notification);
-			}
-			break;
-		case Notification.REMOVE:
-		case Notification.REMOVE_MANY: {
-			int featureId = notification.getFeatureID(PageflowPackage.class);
-			switch (featureId) {
-			case PageflowPackage.PF_PAGE:
-				// removePage(notification, (PageflowPage) element);
-				break;
-			case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-			case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-				removeLink(notification, element);
-				break;
-			}
-			if (!tranformer.isNeedBatchOperations()) {
-				updateAndNotify(notification);
-			}
-			break;
-		}
-		}
-	}
-
-	private void processSet(Notification notification, PageflowElement element) {
-		if (notification.getNewValue() != null) {
-			int value = notification.getFeatureID(PageflowPackage.class);
-			if (element instanceof PageflowPage) {
-				setProperties(notification, element, value);
-			} else if (element instanceof PageflowLink) {
-				if (DEBUG)
-					System.out.println("The link property is changed");
-				setProperties(notification, element, value);
-			}
-		}
-	}
-
-	private void setProperties(Notification notification,
-			PageflowElement element, int value) {
-		if (notification.getFeature() == PageflowPackage.eINSTANCE
-				.getPFLink_Source()) {
-			if (notification.getNewValue() instanceof String) {
-				tranformer.changePFLinkStart((PageflowLink) element,
-						(String) notification.getNewValue());
-			}
-		} else if (notification.getFeature() == PageflowPackage.eINSTANCE
-				.getPFLink_Target()) {
-			if (notification.getNewValue() instanceof String) {
-				tranformer.changePFLinkEnd((PageflowLink) element,
-						(String) notification.getNewValue());
-			}
-		} else {
-			element.getFCElements().set(
-					(EStructuralFeature) notification.getFeature(),
-					notification.getNewValue());
-		}
-	}
-
-	private void addInLink(Notification notification, PageflowElement element) {
-		Object value = notification.getNewValue();
-		PageflowLink link = (PageflowLink) value;
-		if (element instanceof PageflowPage) {
-			PageflowNode source = link.getSource();
-			if (source instanceof PageflowPage) {
-				tranformer.addLink((PageflowPage) source,
-						(PageflowPage) element, link);
-			}
-		}
-
-	}
-
-	private void addOutLink(Notification notification, PageflowElement element) {
-		Object value = notification.getNewValue();
-		// for outLink remove, only target is referenced.
-		PageflowLink link = (PageflowLink) value;
-		if (element instanceof PageflowPage) {
-			PageflowNode target_ = link.getTarget();
-			// page->page
-			if (target_ instanceof PageflowPage) {
-				tranformer.addLink((PageflowPage) element,
-						(PageflowPage) target_, link);
-			}
-		}
-	}
-
-	private void removeLink(Notification notification, PageflowElement element) {
-		Object value = notification.getOldValue();
-		PageflowLink link = (PageflowLink) value;
-
-		if (!link.getFCElements().isEmpty()) {
-			NavigationCaseType caseFC = (NavigationCaseType) link
-					.getFCElements().getData().get(0);
-			if (caseFC != null)
-				tranformer.removeCase(caseFC);
-		}
-		link.update();
-	}
-
-	private void updateAndNotify(Notification notification) {
-		tranformer.getPageflow().notifyModelChanged(
-				new ENotificationImpl((InternalEObject) notification
-						.getNotifier(), Notification.SET,
-						PageflowPackage.PAGEFLOW, null, null));
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/PFBatchAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/PFBatchAdapter.java
deleted file mode 100644
index 5b1c148..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/PFBatchAdapter.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
-
-/**
- * @author hmeng
- */
-
-public abstract class PFBatchAdapter extends AdapterImpl {
-	private boolean needPostpone;
-
-	AbstractGraphicalEditPart editPart;
-
-	public boolean isNeedPostpone(Notification msg) {
-		return needPostpone
-				&& !(msg.getEventType() == FC2PFTransformer.MY_NOTIFICATION_TYPE || msg
-						.getEventType() == FC2PFTransformer.MY_NOTIFICATION_TYPE1);
-	}
-
-	public void setNeedPostpone(boolean needPostpone) {
-		this.needPostpone = needPostpone;
-	}
-
-	public AbstractGraphicalEditPart getEditPart() {
-		return editPart;
-	}
-
-	public void setEditPart(AbstractGraphicalEditPart editPart) {
-		this.editPart = editPart;
-	}
-
-	final public void notifyChanged(Notification msg) {
-		if (!isNeedPostpone(msg)) {
-			doNotifyChanged(msg);
-		}
-	}
-
-	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 39b447b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/TransformUtil.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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.
-	 */
-	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.
-	 */
-	public static boolean isValidPageflowElement(EObject element) {
-		EObject root = EcoreUtil.getRootContainer(element);
-		boolean result = root instanceof Pageflow;
-		return result;
-	}
-
-	public static boolean isValidLink(PageflowLink link) {
-		return isValidPageflowElement(link) && link.getSource() != null
-				&& link.getTarget() != null;
-	}
-
-	public static String getFromViewID(NavigationRuleType rule) {
-		String result = "*";
-		if (rule.getFromViewId() != null) {
-			result = rule.getFromViewId().getTextContent();
-		}
-		return result;
-	}
-
-	public static String getToViewID(NavigationCaseType navCase) {
-		String result = "*";
-		if (navCase.getToViewId() != null) {
-			result = navCase.getToViewId().getTextContent();
-		}
-		return result;
-	}
-
-	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;
-	}
-
-	public static PageflowNode findCaseEnd(PageflowPage action,
-			FromOutcomeType outcome, Pageflow pageflow) {
-		// TODO: find a case end in pageflow model
-		List links = action.getOutlinks();
-		for (int i = 0; i < links.size(); i++) {
-			PageflowLink link = (PageflowLink) links.get(i);
-			String outcomeStr = "";
-			if (outcome != null) {
-				outcomeStr = outcome.getTextContent();
-			}
-			if (link.getOutcome().equals(outcomeStr)) {
-				return link.getTarget();
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/EditPartMarkerUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/EditPartMarkerUtil.java
deleted file mode 100644
index a1e3c64..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/EditPartMarkerUtil.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-
-/**
- * 
- * Utility class to add and remove edit part markers.
- * 
- * FIXME: add the identification mechanism of the model and remove the
- * dependency on the PageflowElement
- * 
- * @author Xiao-guang Zhang
- * 
- * 
- */
-public class EditPartMarkerUtil {
-
-	/**
-	 * Removes all markers that were created using createMarker()
-	 * 
-	 * @param model -
-	 *            the emf model related with edit part
-	 * @throws CoreException 
-	 */
-	public static void removeAllMarkers(EObject model) throws CoreException {
-		IResource resource = getResource(model);
-
-		if (resource != null) {
-			String markerTypes[] = { IMarker.PROBLEM, IMarker.TASK };
-
-			for (int iMT = 0; iMT < markerTypes.length; iMT++) {
-				IMarker[] markers = resource.findMarkers(markerTypes[iMT],
-						false, IResource.DEPTH_ONE);
-
-				for (int iMark = 0; iMark < markers.length; iMark++) {
-					markers[iMark].delete();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Removes a specific problem marker type with the given severity.
-	 * 
-	 * @param model -
-	 *            the model related with this edit part.
-	 * @param sMarkerType -
-	 *            the marker type, either IMarker.PROBLEM or IMarker.TASK
-	 * @param iSeverity -
-	 *            severity/priority: if sMarkerType is IMarker.PROBLEM, then
-	 *            this value is one of the PROBLEM severities; if sMarkerType is
-	 *            IMarker.TASK, this is a task priority.
-	 * @throws CoreException
-	 *             passed on from IResource.findMarkers()
-	 */
-	public static void removeAllMarkers(EObject model, String sMarkerType,
-			int iSeverity) throws CoreException {
-		IResource resource = getResource(model);
-
-		if (resource != null) {
-			IMarker[] markers = resource.findMarkers(sMarkerType, false,
-					IResource.DEPTH_ONE);
-
-			for (int i = 0; i < markers.length; i++) {
-				IMarker marker = markers[i];
-				int iMarkerSeverity = marker.getAttribute(IMarker.SEVERITY,
-						IMarker.SEVERITY_ERROR);
-
-				if (iMarkerSeverity == iSeverity || iSeverity == -1) {
-					markers[i].delete();
-				}
-			}
-		}
-	}
-
-	/**
-	 * get the resouce according to part or model.
-	 * 
-	 * @param part
-	 * @param model
-	 * @return
-	 */
-	private static IResource getResource(EObject model) {
-		IResource resource = null;
-		resource = WebrootUtil.getResource(model);
-		return resource;
-	}
-
-	/**
-	 * Create a problem marker.
-	 * 
-	 * @param model -
-	 *            the model related with this edit part.
-	 * @param sMarkerType 
-	 * @param severity -
-	 *            the problem severity, one of IMarker.SEVERITY_ERROR,
-	 *            IMarker.SEVERITY_WARNING or IMarker.SEVERITY_INFO
-	 * @param message -
-	 *            the text associated with this marker
-	 * @param location -
-	 *            a unique ID that the application can use to locate the
-	 *            editpart
-	 * 
-	 * that corresponds to this marker; this is typically the DiagramElement's
-	 * ID string
-	 * @throws CoreException
-	 */
-	public static void createMarker(EObject model, String sMarkerType,
-			int severity, String message, String location) throws CoreException {
-		IResource resource = getResource(model);
-
-		if (resource != null) {
-			IMarker marker = resource.createMarker(sMarkerType);
-			marker.setAttribute(IMarker.MESSAGE, message);
-			marker.setAttribute(IMarker.SEVERITY, severity);
-			// The problem view doesn't show the location - only the line number
-			// is shown in the "location" column. Doh!
-			if (location != null && location.length() > 0) {
-				marker.setAttribute(IMarker.LOCATION, location);
-			}
-		}
-	}
-
-	/**
-	 * Removes a specific problem marker type with the given severity.
-	 * 
-	 * @param model -
-	 *            the model related with this edit part.
-	 * @param sMarkerType -
-	 *            the marker type, either IMarker.PROBLEM or IMarker.TASK
-	 * @throws CoreException
-	 *             passed on from IResource.findMarkers()
-	 */
-	public static void removeMarker(EObject model, String sMarkerType)
-			throws CoreException {
-		IResource resource = getResource(model);
-		if (resource != null) {
-			IMarker[] markers = resource.findMarkers(sMarkerType, false,
-					IResource.DEPTH_ONE);
-
-			for (int i = 0; i < markers.length; i++) {
-				IMarker marker = markers[i];
-				// get the marker's location
-				Object id = marker.getAttribute(IMarker.LOCATION);
-
-				if (model instanceof PageflowElement) {
-					if (((PageflowElement) model).getId().equals(id)) {
-						markers[i].delete();
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Searches the hierarchy starting at the given EditPart for a given model
-	 * object ID string (the DiagramElement.ID value) and returns that EditPart
-	 * 
-	 * @param containerPart
-	 * @param id
-	 * @return the EditPart that corresponds to the given ID string, or null if
-	 *         not found
-	 */
-	public static GraphicalEditPart findEditPart(
-			GraphicalEditPart containerPart, String id) {
-		Object model = containerPart.getModel();
-		if (model instanceof PageflowElement) {
-			String modelId = ((PageflowElement) model).getId();
-			if (modelId != null && modelId.equals(id)) {
-				return containerPart;
-			}
-		}
-
-		Iterator iterNode = containerPart.getChildren().iterator();
-		while (iterNode.hasNext()) {
-			GraphicalEditPart child = (GraphicalEditPart) iterNode.next();
-			GraphicalEditPart foundPart = findEditPart(child, id);
-			if (foundPart != null) {
-				return foundPart;
-			}
-		}
-
-		Iterator iterConnection = containerPart.getSourceConnections()
-				.iterator();
-		while (iterConnection.hasNext()) {
-			GraphicalEditPart child = (GraphicalEditPart) iterConnection.next();
-			GraphicalEditPart foundPart = findEditPart(child, id);
-			if (foundPart != null) {
-				return foundPart;
-			}
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/JSPDomAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/JSPDomAdapter.java
deleted file mode 100644
index 0954c3c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/JSPDomAdapter.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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.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.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Document;
-import org.w3c.dom.NodeList;
-
-/**
- * This class is defined as a simple adapter to JSP DOM model. User can get the
- * taglib prefix, and get the needed element by element tage name, and
- * namespace(prefix) Usage: User should initialize this class instance before
- * using it. Following is a typical example: JSPDomAdapter jspAdapter = new
- * JSPDomAdapter(); IFile jspFile =
- * ResourcesPlugin.getWorkspace().getRoot().getFile(jspPath); if
- * (_jspAdapter.initialize(jspFile)) { //the prefix of JSF HTML TagLib String
- * prefix = _jspAdapter.getTagLibPrefix(JSPDomAdapter.JSF_HTML_TAGLIB); }
- * 
- * @author Xiao-guang Zhang
- */
-public class JSPDomAdapter {
-	/** log instance */
-	private static final Logger log = EditorPlugin
-			.getLogger(JSPDomAdapter.class);
-
-	/** JSP Taglib's tag name */
-	public static String JSP_TAGLIB_TAG = "jsp:directive.taglib";
-
-	/** JSF HTML TagLib name */
-	public static String JSF_HTML_TAGLIB = "http://java.sun.com/jsf/html";
-
-	/** singleton model manager */
-	private static IModelManager modelManager;
-
-	/** source jsp file */
-	private IFile jspFile;
-
-	/** Structured Model of JSP File */
-	private IStructuredModel model;
-
-	/** Root Document (Node) of JSP file */
-	private Document document;
-
-	/**
-	 * 
-	 */
-	public JSPDomAdapter() {
-		super();
-
-	}
-
-	/**
-	 * initialize this adapter to get the StructuredModel for the input file.
-	 * At last user should call releaseModel() method to release the Structured Model.
-	 * 
-	 * @param file -
-	 *            JSP file
-	 * @return - True means sucessfully load jsp file.
-	 */
-	public boolean initialize(IFile file) {
-		jspFile = file;
-
-		if (jspFile != null && jspFile.exists()) {
-			try {
-				model = getModel(jspFile);
-			} catch (IOException e) {
-				// PageFlow.JSPDomAdapter.FailToGetStructuredModel = Failed to
-				// get the structured model
-				log.error("PageFlow.JSPDomAdapter.FailToGetStructuredModel", e); //$NON-NLS-1$
-			} catch (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(String taglibURI) {
-		String prefix = null;
-
-		if (getDocument() != null) {
-			prefix = JSPUtil.getPrefix((IDOMModel) model, 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(String namespace, 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); //$NON-NLS-1$
-			}
-
-			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(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 a50fbd1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/JSPUtil.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.pageflow.util;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-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.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-
-/**
- * utility class for JSP related information.
- * 
- * @author Yang Liu
- */
-public class JSPUtil {
-	/**
-	 * find out whether the specified taglib has been defined in the IDOMModel.
-	 * If found, then return the prefix. If can't find, then will try to add a
-	 * taglib declaration into the model, and try to use the specified default
-	 * prefix
-	 * 
-	 * @param model
-	 * @param uri
-	 * @param defaultPrefix 
-	 * @return the prefix if model has one or the default
-	 */
-	public static String getOrCreatePrefix(IDOMModel model, String uri,
-			String defaultPrefix) {
-		String prefix = getPrefix(model, uri);
-		if (prefix != null)
-			return prefix;
-		String s = findUnusedPrefix(model, defaultPrefix);
-
-		// TODO: should create the taglib inside the IDOMModel
-		return s;
-	}
-
-	/**
-	 * 
-	 * @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)
-			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;
-	}
-
-	/**
-	 * @param model
-	 * @param suggestion
-	 * @return the unsued prefix
-	 */
-	public static String findUnusedPrefix(IDOMModel model, String suggestion) {
-		if (suggestion == null)
-			suggestion = "p";
-		TLDCMDocumentManager m = TaglibController.getTLDCMDocumentManager(model
-				.getStructuredDocument());
-		if (m == null)
-			return suggestion;
-		List trackers = m.getTaglibTrackers();
-		Set map = new HashSet();
-		for (Iterator iter = trackers.iterator(); iter.hasNext();) {
-			TaglibTracker tracker = (TaglibTracker) iter.next();
-			map.add(tracker.getPrefix());
-		}
-		if (!map.contains(suggestion))
-			return suggestion;
-		for (int i = 1;; i++) {
-			if (!map.contains(suggestion + i))
-				return suggestion + i;
-		}
-	}
-
-	/**
-	 * given the prefix, find the corresponding jsp tld URI.
-	 * 
-	 * @param model
-	 * @param prefix
-	 * @return the uri corresponding to the 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();
-                }
-				return null;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * get the action list in the jsp file
-	 * @param jspFileName 
-	 * 
-	 * @return - action list
-	 */
-	public static List getActionListInJSPFile(String jspFileName) {
-		/** jsp dom adapter */
-		JSPDomAdapter jspAdapter;
-
-		List actions = new ArrayList();
-		jspAdapter = new JSPDomAdapter();
-		// 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()) {
-				// 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);
-				}
-			}
-		}
-		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 655b4c6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/ModelCreationFactory.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.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;
-
-	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 89e6190..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(GraphicalEditPart containerPart) {
-		if (containerPart == null) {
-			return;
-		}
-
-		// removeAllAnnotations(containerPart);
-
-		// validate the nodes including page and actions.
-		Iterator iterChild = containerPart.getChildren().iterator();
-		while (iterChild.hasNext()) {
-
-			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.
-			Iterator iterLinks = element.getSourceConnections().iterator();
-			while (iterLinks.hasNext()) {
-				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(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(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(GraphicalEditPart editPart, String message) {
-		if (editPart != null && editPart instanceof IAnnotationEditPart) {
-			Annotation annotation = new Annotation(IMarker.PROBLEM, false,
-					message);
-			((IAnnotationEditPart) editPart).addAnnotation(annotation);
-		}
-	}
-
-	/**
-	 * remove a marker
-	 * 
-	 * @param editPart
-	 * @param model
-	 */
-	private static void removeAnnotation(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 e09795a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowModelManager.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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()), 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()));
-		}
-		return resourcePageflow;
-	}
-
-	/**
-	 * Returns the resource set.
-	 * 
-	 * @param
-	 * @return
-	 */
-	private ResourceSet getResourceSet() {
-		if (null == resourceSet) {
-			// Initialize the pageflow package, this line can not be removed.
-			PageflowPackageImpl.init();
-			// Register the XML resource factory for the .pageflow extension
-			Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
-			Map regMap = reg.getExtensionToFactoryMap();
-			// m.put("pageflow", new XMIResourceFactoryImpl());
-			regMap.put("pageflow", new PageflowResourceFactoryImpl());
-
-			resourceSet = new ResourceSetImpl();
-		}
-
-		return resourceSet;
-	}
-
-	/**
-	 * Returns the factory associated with the model. Object creation are made
-	 * through that factory.
-	 * 
-	 * @return - pageflow factory
-	 */
-	static public PageflowFactory getFactory() {
-		if (pageflowFactory == null) {
-			// Access the factory (needed to create instances)
-			Map registry = EPackage.Registry.INSTANCE;
-			String pageflowURI = PageflowPackage.eNS_URI;
-			PageflowPackage pageflowPackage = (PageflowPackage) registry
-					.get(pageflowURI);
-			pageflowFactory = pageflowPackage.getPageflowFactory();
-		}
-		return pageflowFactory;
-	}
-
-	/**
-	 * Creates a new pageflow model with begin and end nodes.
-	 * 
-	 * @param path -
-	 *            the new pageflow file name
-	 * @return - new pageflow model
-	 */
-	public Pageflow createPageflow(IPath path) {
-		createResource(path);
-		// Create a new pageflow model
-		Map registry = EPackage.Registry.INSTANCE;
-		String pageflowURI = PageflowPackage.eNS_URI;
-		PageflowPackage nPackage = (PageflowPackage) registry.get(pageflowURI);
-		PageflowFactory nFactory = nPackage.getPageflowFactory();
-		pageflow = nFactory.createPageflow();
-
-		resourcePageflow.getContents().add(pageflow);
-		return pageflow;
-	}
-
-	/**
-	 * Loads the content of the model from the file.
-	 * 
-	 * @param path
-	 */
-	public void load(IPath path) {
-		getResource(path);
-	}
-
-	/**
-	 * reloads the content of the model from the file.
-	 * 
-	 * @param path
-	 */
-	public void reload(IPath path) {
-		getResource(path).unload();
-		load(path);
-	}
-
-	/**
-	 * Saves the content of the model to the file.
-	 * 
-	 * @param path
-	 */
-	public void save(final IPath path) throws IOException {
-		if (!pathPageflow.toString().equalsIgnoreCase(path.toString())) {
-			pathPageflow = path;
-			URI fileURI = URI.createPlatformResourceURI(path.toString());
-			resourcePageflow.setURI(fileURI);
-		}
-		resourcePageflow.save(defaultSaveOptions);
-	}
-
-	/**
-	 * get the file path of current pageflow resource
-	 * 
-	 * @return - the file path
-	 */
-	public IPath getPath() {
-		return pathPageflow;
-	}
-
-	/**
-	 * @param webPath
-	 * @return found page node according the web path.
-	 */
-	public PageflowPage foundPage(String webPath) {
-		PageflowPage page = null;
-
-		if (getModel() != null) {
-			Iterator iterNodes = getModel().getNodes().iterator();
-			while (iterNodes.hasNext()) {
-				PageflowNode node = (PageflowNode) iterNodes.next();
-				if (node instanceof PageflowPage) {
-					if (((PageflowPage) node).getPath().equalsIgnoreCase(webPath)) {
-						page = (PageflowPage) node;
-						break;
-					}
-				}
-			}
-		}
-
-		return page;
-	}
-
-	/**
-	 * 
-	 * Build a path for the resource in the .metadata directory given the path
-	 * of the model resource. For example, given a model resource path of
-	 * \test\folder\filename.ext the resulting Pageflow path name will be
-	 * \test\.metadata\folder\filename.pageflow
-	 * 
-	 * @param pathFacesConfig -
-	 *            faces-config file path.
-	 * 
-	 * @return the ipath
-	 */
-	public static IPath makePageflowPath(IPath pathFacesConfig) {
-		IPath pageflowPath;
-		String[] segs = pathFacesConfig.removeFileExtension().segments();
-		pageflowPath = new Path(segs[0]).makeAbsolute();
-		pageflowPath = pageflowPath.append(".metadata");
-		for (int i = 1; i < segs.length; i++) {
-			pageflowPath = pageflowPath.append(segs[i]);
-		}
-		// pageflowPath.removeFileExtension();
-		pageflowPath = pageflowPath.addFileExtension("pageflow");
-		return pageflowPath;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceFactory.java
deleted file mode 100644
index 305f7b5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceFactory.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.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;
-
-	public PageflowResourceFactory(IResource resource) {
-		this.resource = resource;
-	}
-
-	/*
-	 * (non-javadoc)
-	 * 
-	 * @see Factory#getNewObject()
-	 */
-	public Object getNewObject() {
-		if (null == resource) {
-			return null;
-		}
-
-		String strWebPath = WebrootUtil.getWebPath(resource.getFullPath());
-		if (strWebPath.length() > 0) {
-			PageflowFactory factory = PageflowModelManager.getFactory();
-			Object result = factory.createPFPage();
-			PageflowPage page = (PageflowPage) result;
-			page.setPath(strWebPath);
-			page.setName(WebrootUtil.getPageNameFromWebPath(strWebPath));
-			return page;
-		}
-        
-        EditorPlugin
-        		.getAlerts()
-        		.error(
-        				"Pageflow.Error.DNDResourceTitle",
-        				EditorPlugin
-        						.getResourceString("Pageflow.Error.InvalidResource")
-        						+ resource.getName());
-
-		return null;
-	}
-
-	/*
-	 * (non-javadoc)
-	 * 
-	 * @see Factory#getObjectType()
-	 */
-	public Object getObjectType() {
-		return resource;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceFactoryImpl.java
deleted file mode 100644
index 1181474..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceFactoryImpl.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl;
-
-/**
- * The <b>Resource Factory</b> associated with the package.
- * 
- * @author Xiao-guang Zhang
- */
-public class PageflowResourceFactoryImpl extends XMLResourceFactoryImpl {
-	/**
-	 * Creates an instance of the resource factory.
-	 */
-	public PageflowResourceFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * Creates an instance of the resource.
-	 */
-	public Resource createResource(URI uri) {
-		Resource result = new PageflowResourceImpl(uri);
-		return result;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceImpl.java
deleted file mode 100644
index 07e13ee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
-
-/**
- * 
- * The <b>Resource </b> associated with the package.
- * 
- * @author Xiao-guang Zhang
- */
-public class PageflowResourceImpl extends XMLResourceImpl {
-	/**
-	 * Creates an instance of the resource. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @param uri
-	 *            the URI of the new resource.
-	 * @generated
-	 */
-	public PageflowResourceImpl(URI uri) {
-		super(uri);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowSwitch.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowSwitch.java
deleted file mode 100644
index 944ee44..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowSwitch.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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 -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the first non-null result returned by a <code>caseXXX</code>
-	 *         call.
-	 * @generated
-	 */
-	public Object doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one
-	 * returns a non null result; it yields that result. <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the first non-null result returned by a <code>caseXXX</code>
-	 *         call.
-	 * @generated
-	 */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-        List eSuperTypes = theEClass.getESuperTypes();
-        return eSuperTypes.isEmpty() ? defaultCase(theEObject) : doSwitch(
-        		(EClass) eSuperTypes.get(0), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one
-	 * returns a non null result; it yields that result. <!-- begin-user-doc -->
-	 * <!-- 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 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 6a1011a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowTransform.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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.
-	 */
-	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 42e49e7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowValidation.java
+++ /dev/null
@@ -1,285 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.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.
-	 * 
-	 * @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.
-	 * 
-	 * @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.
-	 * 
-	 * @return - valid link or not.
-	 * 
-	 */
-	public String isValidLink(PageflowLink link) {
-		String errorMessage = null;
-		// action-page style
-		// TODO: it should guarantee that outcome should be defined in the
-		// managed bean's method.
-
-		if (link.getSource() instanceof PageflowPage
-				&& link.getTarget() instanceof PageflowPage) {
-			String outcome = link.getOutcome();
-			if (outcome != null && outcome.length() >= 0) {
-				// if (isValidServiceOutcome(outcome))
-				// {
-				// return errorMessage;
-				// }
-				String webPath = ((PageflowPage) link.getSource()).getPath();
-				if (webPath != null) {
-					String projectPath = WebrootUtil.getProjectPath(link,
-							webPath);
-
-					Path resourcePath = new Path(projectPath);
-					IWorkspaceRoot workspaceRoot = ResourcesPlugin
-							.getWorkspace().getRoot();
-					final IResource resource = workspaceRoot
-							.findMember(resourcePath);
-
-					if (resource == null || !resource.exists()) {
-						// Pageflow.Validation.NotExistedSourcePage = The source
-						// page {0} is not existed.
-						errorMessage = NLS
-								.bind(
-										PageflowMessages.Pageflow_Validation_UndefinedOutcome,
-										outcome, webPath);
-					}
-				} else {
-					// Pageflow.Validation.MissingSourcePage = The source page
-					// should be specified.
-					errorMessage = PageflowMessages.Pageflow_Validation_MissingSourcePage;
-				}
-			}
-		}
-		return errorMessage;
-	}
-
-	/**
-	 * Check whether the page is already existed in the pageflow.
-	 * 
-	 * @param pageflow
-	 * @param page
-	 * @return true if page exists (?)
-	 */
-	public boolean isExistedPage(Pageflow pageflow, PageflowPage page) {
-		if (pageflow == null || page == null || page.getPath() == null) {
-			return false;
-		}
-
-		return isExistedPage(pageflow, page.getPath());
-	}
-
-	/**
-	 * Check whether the page is already existed in the pageflow.
-	 * 
-	 * @param pageflow
-	 * @param pagePath
-	 * @return true if pageflow's path is equal to pagePath
-	 */
-	public boolean isExistedPage(Pageflow pageflow, String pagePath) {
-		if (pageflow == null || pagePath == null) {
-			return false;
-		}
-
-		Iterator iter = pageflow.getNodes().iterator();
-
-		while (iter.hasNext()) {
-			PageflowNode existedNode = (PageflowNode) iter.next();
-
-			if (existedNode instanceof PageflowPage) {
-				if (((PageflowPage) existedNode).getPath() != null
-						&& ((PageflowPage) existedNode).getPath()
-								.equalsIgnoreCase(pagePath)) {
-					return true;
-				}
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * Check whether the page is valid or not validate page is : 1. if the page
-	 * is general jsp page, it should physically existed. 2. if the page is in
-	 * the form of /foldername/* (it contains the folder), the folder should be
-	 * existed.
-	 * 
-	 * @param page
-	 * @return the notify message for page
-	 */
-	public String getNotifyMessage(PageflowPage page) {
-		String errorMessage = null;
-		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-		String pagePath = page.getPath();
-
-		// Check the path is empty or not
-		if (pagePath != null && pagePath.length() > 0) {
-			String resourceName = WebrootUtil.getProjectPath(page, pagePath);
-			Path resourcePath = new Path(resourceName);
-
-			final IResource resource = workspaceRoot.findMember(resourcePath);
-
-			if (resource != null && resource.exists()) {
-				// This page is related with jsp file
-				if (resourcePath.getFileExtension() != null) {
-					if (!WebrootUtil.isValidWebFile(resourcePath)) {
-						// Pageflow.Validation.InvalidWebPage = the file {0} is
-						// not valid web file.
-						errorMessage = NLS
-								.bind(
-										PageflowMessages.Pageflow_Validation_InvalidWebPage,
-										pagePath);
-					}
-				}
-			} else {
-				// Pageflow.Validation.NotExitedWebPage = the web page {0} is
-				// not existed.
-				errorMessage = NLS.bind(
-						PageflowMessages.Pageflow_Validation_NotExitedWebPage,
-						pagePath);
-			}
-		} else {
-			// Pageflow.Validation.MissingWebPage = the web page's path should
-			// be specified.
-			errorMessage = PageflowMessages.Pageflow_Validation_MissingWebPage;
-		}
-		return errorMessage;
-	}
-
-	/**
-	 * check that the action is valid EL or not,
-	 * 
-	 * @param actionEL -
-	 *            action string, it should be in the form of #{...}
-	 * @return - True or False
-	 */
-	public static boolean isValidActionEL(String actionEL) {
-		if (actionEL != null && actionEL.length() > 3) {
-			// action is defined in JSF expression language, e.g,
-			// #{beanname.methodname}
-			if (actionEL.substring(0, 2).equalsIgnoreCase("#{")//$NON-NLS-1$
-					&& actionEL.substring(actionEL.length() - 1,
-							actionEL.length()).equalsIgnoreCase("}"))//$NON-NLS-1$
-			{
-				// Check the bean is existed or not.
-				return true;
-			}
-
-		}
-		return false;
-	}
-
-	/**
-	 * get the managed bean from action's expression, e.g., beanName.methodName.
-	 * The return will be beanName.
-	 * 
-	 * @param actionEL
-	 * @return the managed bean name
-	 */
-	public static String getManagedBeanforAction(String actionEL) {
-		String managedBeanName = null;
-		if (isValidActionEL(actionEL)) {
-			actionEL = actionEL.substring(2, actionEL.length() - 1);
-			String[] actionParts = actionEL.split("[.]");
-			managedBeanName = actionParts[0];//$NON-NLS-1$
-		}
-
-		return managedBeanName;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/BaseFigureDecorator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/BaseFigureDecorator.java
deleted file mode 100644
index 301d6fe..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 2dbcbd8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/BaseNodeFigure.java
+++ /dev/null
@@ -1,923 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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
- * 
- */
-public class BaseNodeFigure extends Figure implements IBaseFigure {
-	protected IBaseFigure baseFigure;
-
-	protected boolean anchorsVisible = true;
-
-	protected Hashtable connectionAnchors = new Hashtable(7);
-
-	protected Vector inputConnectionAnchors = new Vector(2, 2);
-
-	protected Vector outputConnectionAnchors = new Vector(2, 2);
-
-	protected Vector topConnectionAnchors = new Vector();
-
-	protected Vector bottomConnectionAnchors = new Vector();
-
-	protected Vector leftConnectionAnchors = new Vector();
-
-	protected Vector rightConnectionAnchors = new Vector();
-
-	public BaseNodeFigure(IBaseFigure figure) {
-		setBaseFigure(figure);
-		ObserveVisibleXYLayout layout = new ObserveVisibleXYLayout();
-		layout.setObserveVisibility(true);
-		setLayoutManager(layout);
-	}
-
-	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);
-		}
-	}
-
-	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);
-			}
-		}
-	}
-
-	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
-	 */
-	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;
-	}
-
-	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.
-	 */
-	protected 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);
-		}
-	}
-
-	protected 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.
-	 */
-	public 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;
-	}
-
-	public 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;
-	}
-
-	public static void moveToTop(IFigure parent, IFigure child) {
-		parent.getChildren().remove(child);
-		parent.getChildren().add(child);
-	}
-
-	public 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 2bd8d23..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 cb344b3..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 69e0ad4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/CompoundFigureListener.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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)
- */
-public interface CompoundFigureListener extends WindowFigureListener {
-	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 6ddceb6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/CompoundNodeFigure.java
+++ /dev/null
@@ -1,507 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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.Point;
-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
- */
-public class CompoundNodeFigure extends BaseNodeFigure implements
-		FreeformFigure, IContainerFigure {
-	public final static int MINIMIZED = 1;
-
-	public final static int RESTORED = 2;
-
-	public final static int MAXIMIZED = 3;
-
-	private int state = RESTORED;
-
-	private TitleBarButton minButton;
-
-	private TitleBarButton maxButton;
-
-	private IconFigure iconFigure;
-
-	private WindowFigure windowFigure;
-
-	private static String DEFAULT_NAME = "CompoundNode";
-
-	private static String DEFAULT_ICON = "editor/CompoundNode.gif";
-
-	private static Image minimizeImage = EditorPlugin.getDefault().getImage(
-			"minimize.gif");
-
-	private static Image minimizeHiliteImage = EditorPlugin.getDefault()
-			.getImage("minimize_hilite.gif");
-
-	private static Image maximizeImage = EditorPlugin.getDefault().getImage(
-			"maximize.gif");
-
-	private static Image maximizeHiliteImage = EditorPlugin.getDefault()
-			.getImage("maximize_hilite.gif");
-
-	private static Image restoreImage = EditorPlugin.getDefault().getImage(
-			"restore.gif");
-
-	private static Image restoreHiliteImage = EditorPlugin.getDefault()
-			.getImage("restore_hilite.gif");
-
-	public CompoundNodeFigure() {
-		// create all of the figures and adornments:
-		// the icon figure
-		super(new IconFigure(DEFAULT_NAME, EditorPlugin.getDefault().getImage(
-				DEFAULT_ICON)));
-		iconFigure = (IconFigure) getBaseFigure();
-		// and the window figure
-		windowFigure = new WindowFigure();
-		windowFigure.setForegroundColor(IconFigure.defaultForegroundColor);
-		windowFigure.setFont(IconFigure.defaultFont);
-
-		// then the minimize/maximize buttons.
-		// Note that the maxButton is also used for the "Restore" action
-		// TODO:
-		// The reason for putting these buttons in CompoundNodeFigure instead of
-		// WindowFigure where they really belong, is that the TitleBarButton is
-		// a
-		// draw2d Button (which subclasses Figure) and these must be placed in
-		// the
-		// titlebar (i.e. a SchemeBorder) because that's where they belong. The
-		// problem
-		// with this is that the Figure.paint() method first draws all of its
-		// children
-		// figures, then the border which means that the buttons would be
-		// obscured.
-		// This should be fixed as time allows and the WindowFigureListener
-		// interface
-		// should then also be modified to include a buttonPressed()
-		// notification
-		// for which CompoundNodeFigure can be a listener.
-		minButton = new TitleBarButton(minimizeImage, minimizeHiliteImage,
-				null, null);
-		maxButton = new TitleBarButton(maximizeImage, maximizeHiliteImage,
-				restoreImage, restoreHiliteImage);
-
-		add(minButton);
-		add(maxButton);
-
-		minButton.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent event) {
-				setState(CompoundNodeFigure.MINIMIZED);
-			}
-		});
-		maxButton.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent event) {
-				setState(maxButton.getState() ? CompoundNodeFigure.MAXIMIZED
-						: CompoundNodeFigure.RESTORED);
-			}
-		});
-
-		// show as a normal window initially
-		showIcon();
-
-		// testing BaseFigureDecorators:
-		// BaseFigureDecorator decorator;
-		// decorator = new
-		// BaseFigureDecorator(EditorPlugin.getDefault().getGEMImage("delete.gif"),
-		// "top right",
-		// PositionConstants.NORTH_EAST);
-		// addDecorator(decorator);
-		// decorator = new
-		// BaseFigureDecorator(EditorPlugin.getDefault().getGEMImage("delete.gif"),
-		// "top left",
-		// PositionConstants.NORTH_WEST);
-		// addDecorator(decorator);
-		// decorator = new
-		// BaseFigureDecorator(EditorPlugin.getDefault().getGEMImage("delete.gif"),
-		// "bottom right",
-		// PositionConstants.SOUTH_EAST);
-		// addDecorator(decorator);
-		// decorator = new
-		// BaseFigureDecorator(EditorPlugin.getDefault().getGEMImage("delete.gif"),
-		// "bottom left",
-		// PositionConstants.SOUTH_WEST);
-		// addDecorator(decorator);
-	}
-
-	public void setOpaque(boolean flag) {
-		windowFigure.setOpaque(flag);
-	}
-
-	/*
-	 * Remove the window figure and its buttons and replace them with the icon
-	 * figure.
-	 */
-	private void showIcon() {
-		// CR400779: GEM minimizing a complex activity sometimes leaves junk on
-		// the screen
-		setVisible(false);
-		minButton.setVisible(false);
-		maxButton.setVisible(false);
-		super.setBaseFigure(iconFigure);
-
-		setAnchorsVisible(true);
-		// CR400779: GEM minimizing a complex activity sometimes leaves junk on
-		// the screen
-		setVisible(true);
-	}
-
-	/*
-	 * Remove the icon figure and replace with the window figure. Make sure the
-	 * buttons are reset to their correct states.
-	 */
-	private void showWindow() {
-		// CR400779: GEM minimizing a complex activity sometimes leaves junk on
-		// the screen
-		setVisible(false);
-		if (state == RESTORED) {
-			super.setBaseFigure(windowFigure);
-
-			minButton.setVisible(true);
-			minButton.setState(false);
-			minButton.setToolTip(new Label("Minimize"));
-
-			maxButton.setVisible(true);
-			maxButton.setState(false);
-			maxButton.setToolTip(new Label("Maximize"));
-
-			setAnchorsVisible(true);
-		} else if (state == MAXIMIZED) {
-			setAnchorsVisible(false);
-
-			Rectangle constraint = new Rectangle(0, 0, -1, -1);
-			IFigure parent = getParent();
-			if (parent != null) {
-				constraint = parent.getBounds().getCopy();
-				constraint.width += constraint.x;
-				constraint.height += constraint.y;
-				constraint.x = 0;
-				constraint.y = 0;
-			}
-
-			super.setBaseFigure(windowFigure, constraint);
-			if (parent != null && parent.getLayoutManager() != null) {
-				// System.out.println("CompoundNode.showWindow: maximize
-				// "+constraint);
-				parent.getLayoutManager().setConstraint(this, constraint);
-			}
-
-			// the maximize button is used for both Maximize and Restore actions
-			minButton.setVisible(false);
-
-			maxButton.setVisible(true);
-			maxButton.setState(true);
-			maxButton.setToolTip(new Label("Restore"));
-		}
-		// CR400779: GEM minimizing a complex activity sometimes leaves junk on
-		// the screen
-		setVisible(true);
-	}
-
-	public void addDecorator(BaseFigureDecorator decorator) {
-		iconFigure.addDecorator(decorator);
-	}
-
-	public void removeDecorator() {
-		iconFigure.removeDecorator();
-	}
-
-	public void removeDecorator(int position) {
-		iconFigure.removeDecorator(position);
-	}
-
-	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();
-	}
-
-	public IconFigure getIconFigure() {
-		return iconFigure;
-	}
-
-	/**
-	 * @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);
-	}
-
-	public int getState() {
-		return state;
-	}
-
-	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);
-	}
-
-	protected 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 Point getScrollPosition() {
-		return windowFigure.getScrollPosition();
-	}
-
-	public int addTab(String s) {
-		return windowFigure.addTab(s);
-	}
-
-	public void removeTab(int index) {
-		windowFigure.removeTab(index);
-	}
-
-	public void setCurrentTab(int index) {
-		windowFigure.setCurrentTab(index);
-	}
-
-	public int getCurrentTab() {
-		return windowFigure.getCurrentTab();
-	}
-
-	public void setContents(int index, Object contents) {
-		windowFigure.setContents(index, contents);
-	}
-
-	public Object getContents(int index) {
-		return windowFigure.getContents(index);
-	}
-
-	public Object getContents() {
-		return windowFigure.getContents();
-	}
-
-	public TabbedTitleBarBorder getTabbedTitleBarBorder() {
-		return windowFigure.getTabbedTitleBarBorder();
-	}
-
-	public void addCompoundFigureListener(CompoundFigureListener listener) {
-		windowFigure.getTabbedTitleBarBorder()
-				.addTabbedWindowListener(listener);
-	}
-
-	public void removeCompoundFigureListener(CompoundFigureListener listener) {
-		windowFigure.getTabbedTitleBarBorder().removeTabbedWindowListener(
-				listener);
-	}
-
-	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 81cfa26..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 781254c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/GEMPreferences.java
+++ /dev/null
@@ -1,718 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.jface.preference.ColorFieldEditor;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.IntegerFieldEditor;
-import org.eclipse.jface.preference.PreferenceConverter;
-import org.eclipse.jface.resource.ColorRegistry;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-/**
- * This class represents a preference page that is contributed to the
- * Preferences dialog. By subclassing <samp>FieldEditorPreferencePage </samp>,
- * we can use the field support built into JFace that allows us to create a page
- * that is small and knows how to save, restore and apply itself.
- * <p>
- * This page is used to modify preferences only. They are stored in the
- * preference store that belongs to the main plug-in class. That way,
- * preferences can be accessed directly via the preference store.
- */
-
-public 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$
-    
-	public final static String USE_SYSTEM_COLORS = "UseSystemColors"; //$NON-NLS-1$
-
-	public final static String CANVAS_COLOR = "CanvasColor"; //$NON-NLS-1$
-
-	public final static String FIGURE_LABEL_FONT = "FigureLabelFont"; //$NON-NLS-1$
-
-	public final static String FIGURE_LABEL_FONT_COLOR = "FigureLabelFontColor"; //$NON-NLS-1$
-
-	public final static String LABEL_PLACEMENT = "LabelPlacement"; //$NON-NLS-1$
-
-	public final static String INPUT_PORT_COLOR = "InputPortColor"; //$NON-NLS-1$
-
-	public final static String OUTPUT_PORT_COLOR = "OutputPortColor"; //$NON-NLS-1$
-
-	public final static String SHOW_LINE_LABELS = "ShowLineLabels"; //$NON-NLS-1$
-
-	public final static String LINE_LABEL_FONT = "LineLabelFont"; //$NON-NLS-1$
-
-	public final static String LINE_LABEL_FONT_COLOR = "LineLabelFontColor"; //$NON-NLS-1$
-
-	public final static String LINE_LABEL_COLOR = "LineLabelColor"; //$NON-NLS-1$
-
-	public final static String LINE_WIDTH = "LineWidth"; //$NON-NLS-1$
-
-	public final static String LINE_COLOR = "LineColor"; //$NON-NLS-1$
-
-	public final static String LINE_ROUTING = "LineRouting"; //$NON-NLS-1$
-
-	public final static String SNAP_TO_GRID = "SnapToGrid"; //$NON-NLS-1$
-
-	public final static String SNAP_TO_GEOMETRY = "SnapToGeometry"; //$NON-NLS-1$
-
-	public final static String GRID_WIDTH = "GridWidth"; //$NON-NLS-1$
-
-	public final static String GRID_HEIGHT = "GridHeight"; //$NON-NLS-1$
-
-	public final static String GRID_COLOR = "GridColor"; //$NON-NLS-1$
-
-	public final static String LABEL_PLACEMENT_TOP = "Top"; //$NON-NLS-1$
-
-	public final static String LABEL_PLACEMENT_BOTTOM = "Bottom"; //$NON-NLS-1$
-
-	public final static String LABEL_PLACEMENT_LEFT = "Left"; //$NON-NLS-1$
-
-	public final static String LABEL_PLACEMENT_RIGHT = "Right"; //$NON-NLS-1$
-
-	// "Direct" routing was intended for connections lines without bendpoints;
-	// this has been removed because it is unnecessary.
-	// public final static String LINE_ROUTING_DIRECT = "Direct";
-	// "Manhattan" line routing creates orthogonal lines
-	public final static String LINE_ROUTING_MANHATTAN = "Manhattan"; //$NON-NLS-1$
-
-	// "Manual" routing allows user to create bendpoints
-	public final static String LINE_ROUTING_MANUAL = "Manaul"; //$NON-NLS-1$
-
-	private final static String[][] m_lineRoutingLabels = {
-			// display, key
-			// { GEMPlugin.getResourceString("CanvasPreferences.LABEL.Direct"),
-			// LINE_ROUTING_DIRECT }, //$NON-NLS-1$ //$NON-NLS-2$
-			{
-				PreferenceMessages.CanvasPreferences_LABEL_Manual, LINE_ROUTING_MANUAL }, //$NON-NLS-1$ //$NON-NLS-2$
-			{
-					PreferenceMessages.CanvasPreferences_LABEL_Manhattan, LINE_ROUTING_MANHATTAN } //$NON-NLS-1$ //$NON-NLS-2$
-	};
-
-	private final static String[][] m_labelPlacementLabels = {
-			{
-				PreferenceMessages.CanvasPreferences_LABEL_Top, LABEL_PLACEMENT_TOP }, //$NON-NLS-1$ //$NON-NLS-2$
-			{
-					PreferenceMessages.CanvasPreferences_LABEL_Bottom, LABEL_PLACEMENT_BOTTOM }, //$NON-NLS-1$ //$NON-NLS-2$
-			{
-						PreferenceMessages.CanvasPreferences_LABEL_Left, LABEL_PLACEMENT_LEFT }, //$NON-NLS-1$ //$NON-NLS-2$
-			{
-							PreferenceMessages.CanvasPreferences_LABEL_Right, LABEL_PLACEMENT_RIGHT } //$NON-NLS-1$ //$NON-NLS-2$
-	};
-
-	private Group canvasGroup;
-
-	private Group iconGroup;
-
-	private Group lineGroup;
-
-	private BooleanField useSystemColors;
-
-	private ColorFieldEditor canvasColor;
-
-	private BooleanField snapToGrid;
-
-	private IntegerFieldEditor gridWidth;
-
-	private IntegerFieldEditor gridHeight;
-
-	private ColorFieldEditor gridColor;
-
-	private BooleanField showLineLabels;
-
-	private ColorFieldEditor lineLabelColor;
-
-	private ColorFieldEditor lineColor;
-
-	private ColorFontFieldEditor iconFont;
-
-	private ColorFontFieldEditor lineFont;
-
-	// private ColorFieldEditor inputPortColor;
-	//
-	// private ColorFieldEditor outputPortColor;
-
-	// CR392586: resource leaks
-	// at least keep leaks bounded...
-//	private static Hashtable resourceRegistry = new Hashtable();
-
-	private class BooleanField extends BooleanFieldEditor {
-		private Composite parent;
-
-		/**
-		 * @param name
-		 * @param label
-		 * @param parent
-		 */
-		public BooleanField(String name, String label, Composite parent) {
-			super(name, label, parent);
-			this.parent = parent;
-		}
-
-		/**
-		 * @return the change control button
-		 */
-		public Button getButton() {
-			return getChangeControl(parent);
-		}
-	}
-
-	/**
-	 * Constructor
-	 */
-	public GEMPreferences() {
-		super(GRID);
-		// FIXME: we should be encapsulating what pref store is used for all callers of this class
-		setPreferenceStore(EditorPlugin.getDefault().getPreferenceStore());
-		setDescription(PreferenceMessages.GEMPreferences_description);
-		initializeDefaults();
-	}
-
-	/**
-	 * Sets the default values of the preferences.
-	 */
-	private void initializeDefaults() {
-		IPreferenceStore store = getPreferenceStore();
-		Font f = JFaceResources.getFontRegistry().get(
-				JFaceResources.DEFAULT_FONT);
-
-		store.setDefault(SHOW_INTRO_EDITOR, true);
-		store.setDefault(USE_SYSTEM_COLORS, true);
-		PreferenceConverter.setDefault(store, CANVAS_COLOR, new RGB(255, 255,
-				255));
-		PreferenceConverter.setDefault(store, FIGURE_LABEL_FONT, f
-				.getFontData());
-		store.setDefault(LINE_WIDTH, 1);
-		store.setDefault(LINE_ROUTING, getLineRoutingLabels()[0][1]);
-		store.setDefault(SHOW_LINE_LABELS, true);
-		PreferenceConverter.setDefault(store, LINE_COLOR, new RGB(0, 0, 0));
-		PreferenceConverter.setDefault(store, LINE_LABEL_COLOR, new RGB(255,
-				255, 255));
-		PreferenceConverter.setDefault(store, LINE_LABEL_FONT, f.getFontData());
-		store.setDefault(SNAP_TO_GEOMETRY, true);
-		store.setDefault(SNAP_TO_GRID, true);
-		store.setDefault(GRID_WIDTH, 12);
-		store.setDefault(GRID_HEIGHT, 12);
-		PreferenceConverter.setDefault(store, GRID_COLOR,
-				new RGB(230, 230, 230));
-	}
-
-	/**
-	 * Creates the field editors. Field editors are abstractions of the common
-	 * GUI blocks needed to manipulate various types of preferences. Each field
-	 * editor knows how to save and restore itself.
-	 */
-
-	public void createFieldEditors() {
-	    
-	    // note, we aren't saving the reference.  It's assumed that parent
-	    // worries about destruction, persistence etc.
-	    addBooleanField(
-	            SHOW_INTRO_EDITOR,
-	            PreferenceMessages.EditorPreferences_LABEL_ShowIntroEditor,
-	            getFieldEditorParent());
-	            
-		useSystemColors = addBooleanField(
-				USE_SYSTEM_COLORS,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_UseSystemColors,
-				getFieldEditorParent());
-
-		canvasGroup = new Group(getFieldEditorParent(), SWT.NULL);
-		lineGroup = new Group(getFieldEditorParent(), SWT.NULL);
-		iconGroup = new Group(getFieldEditorParent(), SWT.NULL);
-
-		canvasGroup.setText(PreferenceMessages.CanvasPreferenceTab_LABEL_Canvas); //$NON-NLS-1$
-		canvasColor = addColorField(
-				CANVAS_COLOR,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_BackgroundColor, canvasGroup); //$NON-NLS-1$
-		addBooleanField(
-				SNAP_TO_GEOMETRY,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_SnapToGeometry, canvasGroup); //$NON-NLS-1$
-		snapToGrid = addBooleanField(
-				SNAP_TO_GRID,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_SnapToGrid, canvasGroup); //$NON-NLS-1$
-		gridColor = addColorField(
-				GRID_COLOR,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_GridLineColor, canvasGroup); //$NON-NLS-1$
-		gridWidth = addIntegerField(
-				GRID_WIDTH,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_GridWidth, canvasGroup); //$NON-NLS-1$
-		gridHeight = addIntegerField(
-				GRID_HEIGHT,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_GridHeight, canvasGroup); //$NON-NLS-1$
-
-		iconGroup.setText(PreferenceMessages.CanvasPreferenceTab_LABEL_IconGroup); //$NON-NLS-1$
-		iconFont = addFontField(
-				FIGURE_LABEL_FONT,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_IconLabelFont, iconGroup); //$NON-NLS-1$
-		addComboField(LABEL_PLACEMENT, PreferenceMessages.CanvasPreferenceTab_LABEL_LabelPlacement, //$NON-NLS-1$
-				getLabelPlacementLabels(), iconGroup);
-		// inputPortColor = addColorField(
-		// INPUT_PORT_COLOR,
-		// EditorPlugin
-		// .getResourceString("CanvasPreferenceTab.LABEL.InputPortColor"),
-		// iconGroup); //$NON-NLS-1$
-		// outputPortColor = addColorField(
-		// OUTPUT_PORT_COLOR,
-		// EditorPlugin
-		// .getResourceString("CanvasPreferenceTab.LABEL.OutputPortColor"),
-		// iconGroup); //$NON-NLS-1$
-
-		lineGroup.setText(PreferenceMessages.CanvasPreferenceTab_LABEL_LineGroup); //$NON-NLS-1$
-		showLineLabels = addBooleanField(SHOW_LINE_LABELS, PreferenceMessages.CanvasPreferenceTab_LABEL_ShowLineLabels,
-				lineGroup);
-		lineFont = addFontField(
-				LINE_LABEL_FONT,
-				 PreferenceMessages.CanvasPreferenceTab_LABEL_LineLabelFont, lineGroup); //$NON-NLS-1$
-		lineLabelColor = addColorField(
-				LINE_LABEL_COLOR,
-				 PreferenceMessages.CanvasPreferenceTab_LABEL_LineLabelColor, lineGroup); //$NON-NLS-1$
-		lineColor = addColorField(
-				LINE_COLOR,
-				 PreferenceMessages.CanvasPreferenceTab_LABEL_LineColor, lineGroup); //$NON-NLS-1$
-		addIntegerField(
-				LINE_WIDTH,
-				 PreferenceMessages.CanvasPreferenceTab_LABEL_LineWidth, lineGroup); //$NON-NLS-1$
-		addComboField(LINE_ROUTING,  PreferenceMessages.CanvasPreferenceTab_LABEL_LineRouting, //$NON-NLS-1$
-				getLineRoutingLabels(), lineGroup);
-	}
-
-	protected void initialize() {
-		// Color use: Default canvas colors should pick up system defaults
-		// enable or disable all of the color and font selection controls in the
-		// preference dialog
-		// depending on whether the "Use System Colors" checkbox is selected.
-		super.initialize();
-
-		((GridLayout) getFieldEditorParent().getLayout()).numColumns = 2;
-
-		canvasGroup.setLayout(new GridLayout(3, false));
-		canvasGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		canvasColor.fillIntoGrid(canvasGroup, 3);
-		gridColor.fillIntoGrid(canvasGroup, 3);
-
-		iconGroup.setLayout(new GridLayout(3, false));
-		iconGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		iconFont.fillIntoGrid(iconGroup, 3);
-
-		lineGroup.setLayout(new GridLayout(3, false));
-		lineGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		lineColor.fillIntoGrid(lineGroup, 3);
-		lineLabelColor.fillIntoGrid(lineGroup, 3);
-		lineFont.fillIntoGrid(lineGroup, 3);
-
-		boolean userColorsValue = !useSystemColors.getBooleanValue();
-		boolean showLineLabelsValue = showLineLabels.getBooleanValue();
-		boolean snapToGridValue = snapToGrid.getBooleanValue();
-		canvasColor.setEnabled(userColorsValue, canvasGroup);
-		gridColor.setEnabled(snapToGridValue && userColorsValue, canvasGroup);
-		iconFont.setEnabled(userColorsValue, iconGroup);
-		// inputPortColor.setEnabled(userColorsValue, iconGroup);
-		// outputPortColor.setEnabled(userColorsValue, iconGroup);
-		lineColor.setEnabled(userColorsValue, lineGroup);
-		lineLabelColor.setEnabled(showLineLabelsValue && userColorsValue,
-				lineGroup);
-		lineFont.setEnabled(showLineLabelsValue && userColorsValue, lineGroup);
-		gridWidth.setEnabled(snapToGridValue, canvasGroup);
-		gridHeight.setEnabled(snapToGridValue, canvasGroup);
-
-		useSystemColors.getButton().addSelectionListener(
-				new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						boolean userColorsValue_ = !useSystemColors
-								.getBooleanValue();
-						boolean showLineLabelsValue_ = showLineLabels
-								.getBooleanValue();
-						boolean snapToGridValue_ = snapToGrid.getBooleanValue();
-
-						canvasColor.setEnabled(userColorsValue_, canvasGroup);
-						gridColor
-								.setEnabled(snapToGridValue_ && userColorsValue_,
-										canvasGroup);
-						iconFont.setEnabled(userColorsValue_, iconGroup);
-						// inputPortColor.setEnabled(userColorsValue,
-						// iconGroup);
-						// outputPortColor.setEnabled(userColorsValue,
-						// iconGroup);
-						lineColor.setEnabled(userColorsValue_, lineGroup);
-						lineLabelColor.setEnabled(showLineLabelsValue_
-								&& userColorsValue_, lineGroup);
-						lineFont.setEnabled(showLineLabelsValue_
-								&& userColorsValue_, lineGroup);
-					}
-				});
-
-		showLineLabels.getButton().addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				boolean userColorsValue_ = !useSystemColors.getBooleanValue();
-				boolean showLineLabelsValue_ = showLineLabels.getBooleanValue();
-				lineLabelColor.setEnabled(showLineLabelsValue_
-						&& userColorsValue_, lineGroup);
-				lineFont.setEnabled(showLineLabelsValue_ && userColorsValue_,
-						lineGroup);
-			}
-		});
-
-		snapToGrid.getButton().addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				boolean userColorsValue_ = !useSystemColors.getBooleanValue();
-				boolean snapToGridValue_ = snapToGrid.getBooleanValue();
-
-				gridColor.setEnabled(snapToGridValue_ && userColorsValue_,
-						canvasGroup);
-				gridWidth.setEnabled(snapToGridValue_, canvasGroup);
-				gridHeight.setEnabled(snapToGridValue_, canvasGroup);
-			}
-		});
-
-	}
-
-	public void init(IWorkbench workbench) {
-        // no initialization
-	}
-
-	private ColorFieldEditor addColorField(String name, String labelText,
-			Composite parent) {
-		ColorFieldEditor f = new ColorFieldEditor(name, labelText, parent);
-		addField(f);
-		return f;
-	}
-
-	private ComboFieldEditor addComboField(String name, String labelText,
-			String[][] entryNamesAndValues, Composite parent) {
-		ComboFieldEditor f = new ComboFieldEditor(name, labelText,
-				entryNamesAndValues, parent);
-		addField(f);
-		return f;
-	}
-
-	private IntegerFieldEditor addIntegerField(String name, String labelText,
-			Composite parent) {
-		IntegerFieldEditor f = new IntegerFieldEditor(name, labelText, parent);
-		addField(f);
-		return f;
-	}
-
-	private BooleanField addBooleanField(String name, String labelText,
-			Composite parent) {
-		BooleanField f = new BooleanField(name, labelText, parent);
-		addField(f);
-		return f;
-	}
-
-//	private StringFieldEditor addStringField(String name, String labelText,
-//			Composite parent) {
-//		StringFieldEditor f = new StringFieldEditor(name, labelText, parent);
-//		addField(f);
-//		return f;
-//	}
-
-	// protected NumberField addNumberField(String name, String labelText,
-	// Composite parent)
-	// {
-	// NumberField f = new NumberField(name,labelText,parent);
-	// addField(f);
-	// return f;
-	// }
-
-	private ColorFontFieldEditor addFontField(String name, String labelText,
-			Composite parent) {
-		ColorFontFieldEditor f = new ColorFontFieldEditor(name, labelText,
-				parent);
-		addField(f);
-		return f;
-	}
-
-	private static String[][] getLineRoutingLabels() {
-		return m_lineRoutingLabels;
-	}
-
-	private static String[][] getLabelPlacementLabels() {
-		return m_labelPlacementLabels;
-	}
-
-//	private static void propagateProperty(String property, EditPart part) {
-//		Iterator iter = part.getChildren().iterator();
-//		while (iter.hasNext()) {
-//			EditPart child = (EditPart) iter.next();
-//			Figure fig = (Figure) ((GraphicalEditPart) child).getFigure();
-//			GEMPreferences.propagateProperty(property, fig);
-//			propagateProperty(property, child);
-//		}
-//	}
-
-	/**
-	 * @return true if the preference is set to show the introduction
-	 * editor.  false otherwise.
-	 */
-	public static boolean getShowIntroEditor()
-	{
-	    IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-	    return store.getBoolean(SHOW_INTRO_EDITOR);
-	}
-	
-	/**
-	 * @param store
-	 * @param property
-	 * @return the color property for the key 'property'
-	 */
-	public static Color getColor(IPreferenceStore store, String property) {
-		boolean useSystemColors = store.getBoolean(USE_SYSTEM_COLORS);
-
-		Color c = ColorConstants.black;
-		if (useSystemColors) {
-			if (GRID_COLOR.equals(property))
-				// c = ColorConstants.buttonDarkest;
-				c = ColorConstants.button;
-			if (LINE_COLOR.equals(property))
-				c = ColorConstants.listForeground;
-			if (LINE_LABEL_FONT_COLOR.equals(property))
-				c = ColorConstants.listForeground;
-			if (LINE_LABEL_COLOR.equals(property))
-				c = ColorConstants.listBackground;
-			if (CANVAS_COLOR.equals(property))
-				c = ColorConstants.listBackground;
-			if (INPUT_PORT_COLOR.equals(property))
-				c = ColorConstants.listForeground;
-			if (OUTPUT_PORT_COLOR.equals(property))
-				c = ColorConstants.listForeground;
-			if (FIGURE_LABEL_FONT_COLOR.equals(property))
-				c = ColorConstants.listForeground;
-		} else {
-			// CR392586: resource leaks
-			RGB rgb = PreferenceConverter.getColor(store, property);
-			ColorRegistry registry = JFaceResources.getColorRegistry();
-			if (registry.get(rgb.toString()) != null)
-				return registry.get(rgb.toString());
-			registry.put(rgb.toString(), rgb);
-			c = registry.get(rgb.toString());
-		}
-		return c;
-	}
-
-//	// CR392586: resource leaks
-//	private static Font getFont(IPreferenceStore store, String property) {
-//		FontData fd = PreferenceConverter.getFontData(store, property);
-//		FontRegistry registry = JFaceResources.getFontRegistry();
-//		if (!registry.get(fd.toString()).equals(registry.defaultFont()))
-//			return registry.get(fd.toString());
-//
-//		registry.put(fd.toString(), new FontData[] {fd});
-//		return registry.get(fd.toString());
-//	}
-
-//	private static void propagateProperty(String property, Figure fig) {
-//		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-//		WindowFigure window = null;
-//		IconFigure icon = null;
-//		LinkFigure link = null;
-//		if (fig instanceof CompoundNodeFigure) {
-//			window = ((CompoundNodeFigure) fig).getWindowFigure();
-//			icon = ((CompoundNodeFigure) fig).getIconFigure();
-//		} else if (fig instanceof WindowFigure)
-//			window = (WindowFigure) fig;
-//		else if (fig instanceof LinkFigure)
-//			link = (LinkFigure) fig;
-//
-//		if (property != null && property.equals(USE_SYSTEM_COLORS))
-//			// reload all properties - it's easiest
-//			property = null;
-//
-//		if (property == null || SNAP_TO_GRID.equals(property)) {
-//			boolean b = store.getBoolean(SNAP_TO_GRID);
-//			WindowFigure.defaultGridEnabled = b;
-//
-//			if (window != null)
-//				window.getGridLayer().setVisible(b);
-//		}
-//
-//		if (property == null || GRID_WIDTH.equals(property)
-//				|| GRID_HEIGHT.equals(property)) {
-//			Dimension d = new Dimension(store.getInt(GRID_WIDTH), store
-//					.getInt(GRID_HEIGHT));
-//			WindowFigure.defaultGridSpacing = d;
-//
-//			if (window != null)
-//				window.getGridLayer().setSpacing(d);
-//		}
-//
-//		if (property == null || GRID_COLOR.equals(property)) {
-//			Color c = getColor(store, GRID_COLOR);
-//			WindowFigure.defaultGridColor = c;
-//
-//			if (window != null)
-//				window.getGridLayer().setForegroundColor(c);
-//		}
-//
-//		// TODO: since the line router is managed by the EditPart for the
-//		// container figure, setting the line routing style in the WindowFigure
-//		// does not change the line routing immediately. The editor must be
-//		// restarted for line routing to take effect.
-//		if (property == null || LINE_ROUTING.equals(property)) {
-//			String s = store.getString(LINE_ROUTING);
-//			int style;
-//			if (LINE_ROUTING_MANHATTAN.equals(s))
-//				style = WindowFigure.LINE_ROUTING_MANHATTAN;
-//			else
-//				style = WindowFigure.LINE_ROUTING_MANUAL;
-//
-//			WindowFigure.defaultLineRoutingStyle = style;
-//			if (window != null)
-//				window.setLineRoutingStyle(style);
-//		}
-//
-//		if (property == null || LINE_WIDTH.equals(property)) {
-//			int w = store.getInt(LINE_WIDTH);
-//			LinkFigure.defaultLineWidth = w;
-//
-//			if (link != null)
-//				link.setLineWidth(w);
-//		}
-//
-//		if (property == null || LINE_COLOR.equals(property)) {
-//			Color c = getColor(store, LINE_COLOR);
-//			LinkFigure.defaultLineColor = c;
-//
-//			if (link != null)
-//				link.setForegroundColor(c);
-//		}
-//
-//		if (property == null || SHOW_LINE_LABELS.equals(property)) {
-//			boolean b = store.getBoolean(SHOW_LINE_LABELS);
-//			LinkFigure.defaultLabelVisible = b;
-//
-//			if (link != null)
-//				link.setLabelVisible(b);
-//		}
-//
-//		if (property == null || LINE_LABEL_FONT.equals(property)
-//				|| LINE_LABEL_FONT_COLOR.equals(property)) {
-//			// CR392586: resource leaks
-//			Font f = getFont(store, LINE_LABEL_FONT);
-//			Color c = getColor(store, LINE_LABEL_FONT_COLOR);
-//			LinkFigure.defaultFont = f;
-//			LinkFigure.defaultLabelForeground = c;
-//
-//			if (link != null) {
-//				link.setFont(f);
-//				link.setLabelForeground(c);
-//			}
-//		}
-//
-//		if (property == null || LINE_LABEL_COLOR.equals(property)) {
-//			Color c = getColor(store, LINE_LABEL_COLOR);
-//			LinkFigure.defaultLabelBackground = c;
-//
-//			if (link != null)
-//				link.setLabelBackground(c);
-//		}
-//
-//		if (property == null || CANVAS_COLOR.equals(property)) {
-//			Color c = getColor(store, CANVAS_COLOR);
-//			WindowFigure.defaultBackgroundColor = c;
-//
-//			if (window != null)
-//				window.setBackgroundColor(c);
-//			if (icon != null)
-//				icon.setBackgroundColor(c);
-//		}
-//
-//		if (property == null || INPUT_PORT_COLOR.equals(property)) {
-//			Color c = getColor(store, INPUT_PORT_COLOR);
-//			InputPortFigure.defaultForegroundColor = c;
-//
-//			if (fig instanceof InputPortFigure)
-//				fig.setForegroundColor(c);
-//		}
-//
-//		if (property == null || OUTPUT_PORT_COLOR.equals(property)) {
-//			Color c = getColor(store, OUTPUT_PORT_COLOR);
-//			OutputPortFigure.defaultForegroundColor = c;
-//
-//			if (fig instanceof OutputPortFigure)
-//				fig.setForegroundColor(c);
-//		}
-//
-//		if (property == null || FIGURE_LABEL_FONT.equals(property)
-//				|| FIGURE_LABEL_FONT_COLOR.equals(property)) {
-//			// CR392586: resource leaks
-//			Font f = getFont(store, FIGURE_LABEL_FONT);
-//			Color c = getColor(store, FIGURE_LABEL_FONT_COLOR);
-//			IconFigure.defaultFont = f;
-//			IconFigure.defaultForegroundColor = c;
-//			WindowFigure.defaultFont = f;
-//			WindowFigure.defaultForegroundColor = c;
-//
-//			if (window != null) {
-//				window.setFont(f);
-//				window.setForegroundColor(c);
-//			}
-//			if (icon != null) {
-//				icon.setFont(f);
-//				icon.setForegroundColor(c);
-//			}
-//			if (fig instanceof IconFigure) {
-//				fig.setFont(f);
-//				fig.setForegroundColor(c);
-//			}
-//		}
-//
-//		if (property == null || LABEL_PLACEMENT.equals(property)) {
-//			int placement = PositionConstants.SOUTH;
-//			String s = store.getString(LABEL_PLACEMENT);
-//			if (LABEL_PLACEMENT_TOP.equals(s))
-//				placement = PositionConstants.NORTH;
-//			if (LABEL_PLACEMENT_BOTTOM.equals(s))
-//				placement = PositionConstants.SOUTH;
-//			if (LABEL_PLACEMENT_LEFT.equals(s))
-//				placement = PositionConstants.WEST;
-//			if (LABEL_PLACEMENT_RIGHT.equals(s))
-//				placement = PositionConstants.EAST;
-//			IconFigure.defaultTextPlacement = placement;
-//
-//			if (icon != null)
-//				icon.setTextPlacement(placement);
-//			if (fig instanceof IconFigure)
-//				((IconFigure) fig).setTextPlacement(placement);
-//		}
-//
-//		Iterator iter = fig.getChildren().iterator();
-//		while (iter.hasNext()) {
-//			Figure child = (Figure) iter.next();
-//			propagateProperty(property, child);
-//		}
-//	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/IBaseFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/IBaseFigure.java
deleted file mode 100644
index 16f6834..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/IBaseFigure.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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
- * 
- * TODO To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Style - Code Templates
- */
-public interface IBaseFigure extends IFigure {
-	public abstract void setText(String 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.
-	 */
-	public abstract Rectangle getTextBounds();
-
-	public abstract void setIcon(Image image);
-
-	public abstract Image getIcon();
-
-	public abstract void setToolTipText(String text);
-
-	public abstract String getToolTipText();
-
-	public abstract void setHighlight(boolean flag);
-
-	public abstract void addDecorator(BaseFigureDecorator decorator);
-
-	public abstract void removeDecorator();
-
-	public abstract void removeDecorator(int position);
-
-	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 e627c53..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 9c06a68..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/IconFigure.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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
- */
-public class IconFigure extends Label implements IBaseFigure {
-	public static int defaultTextPlacement = PositionConstants.SOUTH;
-
-	public static Font defaultFont = JFaceResources.getFontRegistry().get(
-			JFaceResources.DEFAULT_FONT);
-
-	public 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;
-
-		public IconLabel(IconFigure host, String text) {
-			super(text);
-			this.host = host;
-			locator = new LabelLocator(this);
-		}
-
-		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;
-
-		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
-	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 f58ecc8..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 60a9fca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/LinkFigure.java
+++ /dev/null
@@ -1,337 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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
- * 
- * TODO To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Style - Code Templates
- */
-public class LinkFigure extends PolylineConnection implements IBaseFigure {
-	public static Color defaultLineColor = ColorConstants.black;
-
-	public static int defaultLineWidth = 1;
-
-	public static boolean defaultLabelVisible = false;
-
-	public static Color defaultLabelForeground = ColorConstants.black;
-
-	public static Color defaultLabelBackground = ColorConstants.white;
-
-	public static Font defaultFont = JFaceResources.getFontRegistry().get(
-			JFaceResources.DEFAULT_FONT);
-
-	private LinkLabel label;
-
-	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(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(boolean flag) {
-		if (flag) {
-			setForegroundColor(ColorConstants.titleBackground);
-			// setLineWidth(defaultLineWidth * 2);
-		} else {
-			setForegroundColor(defaultLineColor);
-			// setLineWidth(defaultLineWidth);
-		}
-	}
-
-	public void setSelected(boolean flag) {
-		if (flag) {
-			// setForegroundColor(ColorConstants.titleBackground);
-			setLineWidth(defaultLineWidth * 2);
-		} else {
-			// setForegroundColor(defaultLineColor);
-			setLineWidth(defaultLineWidth);
-		}
-	}
-
-	public void setLabelVisible(boolean flag) {
-		getLabel().setVisible(flag);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setText()
-	 */
-	public void setText(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(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(BaseFigureDecorator decorator) {
-		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(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() {
-		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;
-	}
-
-	public LinkLabel getLabel() {
-		if (label == null) {
-			label = new LinkLabel();
-			add(label, new MidpointLocator(this, 0));
-		}
-		return label;
-	}
-
-	public void setLabelForeground(Color c) {
-		getLabel().setForegroundColor(c);
-	}
-
-	public void setLabelBackground(Color c) {
-		getLabel().setBackgroundColor(c);
-	}
-
-	public void setFont(Font f) {
-		getLabel().setFont(f);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Shape#setLineWidth(int)
-	 */
-	public void setLineWidth(int w) {
-		getLabel().setBorderWidth(w);
-		super.setLineWidth(w);
-	}
-
-	public void setForegroundColor(Color c) {
-		getLabel().setBorderColor(c);
-		super.setForegroundColor(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Polyline#setPoints(org.eclipse.draw2d.geometry.PointList)
-	 */
-	public void setPoints(PointList points) {
-		// TODO Auto-generated method stub
-		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));
-		}
-	}
-
-	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++) {
-					IFigure child = (IFigure) getChildren().get(i);
-					bounds.union(child.getBounds());
-				}
-			}
-		}
-		return bounds;
-	}
-
-	/*
-	 * Helper class for line labels.
-	 */
-	public class LinkLabel extends Label {
-		public LinkLabel() {
-			setBorder(new LineBorder());
-			setOpaque(true);
-			setForegroundColor(defaultLabelForeground);
-			setBackgroundColor(defaultLabelBackground);
-			setFont(defaultFont);
-			LineBorder border_ = new LineBorder(defaultLineWidth);
-			setBorder(border_);
-			border_.setColor(defaultLineColor);
-			setVisible(defaultLabelVisible);
-		}
-
-		public void setBorderWidth(int w) {
-			((LineBorder) getBorder()).setWidth(w);
-		}
-
-		public void setBorderColor(Color c) {
-			((LineBorder) getBorder()).setColor(c);
-		}
-
-		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 70b72e2..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()
- */
-public 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 e6ef854..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 02ef0f4..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 3444ffb..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 2d7f252..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PreferenceMessages.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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
- * 
- */
-public final class PreferenceMessages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facesconfig.ui.preference.PreferenceMessages";
-
-	private PreferenceMessages() {
-		// Do not instantiate
-	}
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, PreferenceMessages.class);
-	}
-
-	/**
-	 * see PreferenceMessages.properties
-	 */
-	public static String CanvasPreferenceTab_LABEL_UseSystemColors;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_BackgroundColor;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_Canvas;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_GridHeight;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_GridLineColor;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_GridWidth;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_IconLabelFont;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_IconGroup;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_InputPortColor;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_OutputPortColor;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_LineGroup;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_LineColor;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_ShowLineLabels;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_LineLabelColor;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_LineLabelFont;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_LineRouting;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_LineWidth;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_SnapToGeometry;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_SnapToGrid;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_UndoStackSize;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Direct;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Manhattan;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Manual;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_LabelPlacement;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Top;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Bottom;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Left;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Right;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_IconSize;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Small;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Medium;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Large;
-
-    /**
-     * label property for check box that selects whether or not
-     * the introduction section editor should be loaded.
-     */
-    public static String EditorPreferences_LABEL_ShowIntroEditor;
-
-	public static String GEMPreferences_description;
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PreferenceMessages.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PreferenceMessages.properties
deleted file mode 100644
index a65ffd1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PreferenceMessages.properties
+++ /dev/null
@@ -1,47 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-#
-# Appearance preference labels
-#
-CanvasPreferenceTab_LABEL_UseSystemColors=Use System colors
-EditorPreferences_LABEL_ShowIntroEditor=Show Introduction Tab (open editors must be reloaded to take effect)
-CanvasPreferenceTab_LABEL_BackgroundColor=Background color:
-CanvasPreferenceTab_LABEL_Canvas=Canvas
-CanvasPreferenceTab_LABEL_GridHeight=Grid height:
-CanvasPreferenceTab_LABEL_GridLineColor=Grid color:
-CanvasPreferenceTab_LABEL_GridWidth=Grid width:
-CanvasPreferenceTab_LABEL_IconLabelFont=Label font:
-CanvasPreferenceTab_LABEL_IconGroup=Icons
-CanvasPreferenceTab_LABEL_InputPortColor=Input Port color:
-CanvasPreferenceTab_LABEL_OutputPortColor=Output Port color:
-CanvasPreferenceTab_LABEL_LineGroup=Connection Lines
-CanvasPreferenceTab_LABEL_LineColor=Line color:
-CanvasPreferenceTab_LABEL_ShowLineLabels=Show labels
-CanvasPreferenceTab_LABEL_LineLabelColor=Label color:
-CanvasPreferenceTab_LABEL_LineLabelFont=Label font:
-CanvasPreferenceTab_LABEL_LineRouting=Line Routing:
-CanvasPreferenceTab_LABEL_LineWidth=Line width:
-CanvasPreferenceTab_LABEL_SnapToGeometry=Snap to geometry
-CanvasPreferenceTab_LABEL_SnapToGrid=Snap to grid
-CanvasPreferenceTab_LABEL_UndoStackSize="Undo\" stack size:
-CanvasPreferences_LABEL_Direct=Direct
-CanvasPreferences_LABEL_Manhattan=Manhattan
-CanvasPreferences_LABEL_Manual=Manual
-CanvasPreferenceTab_LABEL_LabelPlacement=Label Placement:
-CanvasPreferences_LABEL_Top=Top
-CanvasPreferences_LABEL_Bottom=Bottom
-CanvasPreferences_LABEL_Left=Left
-CanvasPreferences_LABEL_Right=Right
-CanvasPreferenceTab_LABEL_IconSize=Icon Size:
-CanvasPreferences_LABEL_Small=Small
-CanvasPreferences_LABEL_Medium=Medium
-CanvasPreferences_LABEL_Large=Large
-GEMPreferences_description=Preferences for the graphical page of FacesConfig editor.
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PrintedPageLayer.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PrintedPageLayer.java
deleted file mode 100644
index 5bd3f1c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PrintedPageLayer.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.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.
- */
-public class PrintedPageLayer extends FreeformLayer {
-	// our layer name
-	public static final String PRINTED_PAGE_LAYER = "Printed Page";
-
-	// the size of the page tiles (this should be the printer's resolution)
-	protected 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...
-	class PrintedPageFigure extends RectangleFigure {
-		PrintedPageFigure() {
-			super();
-			setFill(false);
-			setOutline(true);
-			setLineWidth(1);
-		}
-	}
-
-	public PrintedPageLayer(WindowFigure figure) {
-		super();
-		this.host = 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 068c89f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/RectangleList.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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.Figure;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-public class RectangleList extends Figure {
-	protected List rectangles = new ArrayList();
-
-	public RectangleList() {
-        // ??
-	}
-
-	public void addRectangle(int x1, int y1, int x2, int y2) {
-		rectangles.add(new Rectangle(x1, y1, x2 - x1, y2 - y1));
-	}
-
-	public List getRectangles() {
-		return rectangles;
-	}
-}
\ 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 8111427..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/TabbedTitleBarBorder.java
+++ /dev/null
@@ -1,463 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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;
-
-public 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.
-	 * 
-	 * @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
-			}
-		});
-	}
-
-	protected List getTabList() {
-		if (tabList == null)
-			tabList = new ArrayList();
-		return tabList;
-	}
-
-	public int addTab(String text) {
-		getTabList().add(new Tab(text));
-		return getTabList().size() - 1;
-	}
-
-	public void removeTab(int index) {
-		if (index >= 0 && index < getTabList().size()) {
-			tabList.remove(index);
-			if (index >= tabList.size())
-				index = tabList.size() - 1;
-			setCurrentTab(index);
-		}
-	}
-
-	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);
-		}
-	}
-
-	public int getCurrentTab() {
-		return currentTab;
-	}
-
-	public Object getContents(int index) {
-		if (index >= 0 && index < getTabList().size())
-			return ((Tab) tabList.get(index)).getContents();
-		return null;
-	}
-
-	public void setContents(int index, Object contents) {
-		if (index >= 0 && index < getTabList().size())
-			((Tab) tabList.get(index)).setContents(contents);
-	}
-
-	public void addTabbedWindowListener(WindowFigureListener listener) {
-		if (listenerList == null)
-			listenerList = new ListenerList(ListenerList.IDENTITY);
-		listenerList.add(listener);
-	}
-
-	public void removeTabbedWindowListener(WindowFigureListener listener) {
-		if (listenerList != null)
-			listenerList.remove(listener);
-	}
-
-	public Object[] getListeners() {
-		return listenerList.getListeners();
-	}
-
-	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;
-	}
-
-	public void setTextColor(Color c) {
-		textColor = c;
-	}
-
-	public Color getTextColor() {
-		return textColor;
-	}
-
-	public void setBackgroundColor(Color c) {
-		bgColor = c;
-	}
-
-	public Color getBackgroundColor() {
-		return bgColor;
-	}
-
-	public void setPadding(Insets p) {
-		padding = p;
-		invalidate();
-	}
-
-	public Insets getPadding() {
-		return padding;
-	}
-
-	public void setLabel(String text) {
-		setLabel(currentTab, text);
-	}
-
-	public void setLabel(int index, String text) {
-		if (index >= 0 && index < getTabList().size())
-			((Tab) tabList.get(index)).setLabel(text);
-	}
-
-	public String getLabel() {
-		return getLabel(currentTab);
-	}
-
-	public String getLabel(int index) {
-		if (index >= 0 && index < getTabList().size())
-			return ((Tab) tabList.get(index)).getLabel();
-		return "";
-	}
-
-	public IFigure getParent() {
-		return parent;
-	}
-
-	public void invalidate() {
-		insets = null;
-		for (int i = 0; i < getTabList().size(); ++i) {
-			Tab t = (Tab) tabList.get(i);
-			t.invalidate();
-		}
-	}
-
-	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());
-	}
-
-	public Dimension getMinimumSize(int wHint, int hHint) {
-		Dimension d = getTextExtents(parent);
-		getInsets(parent);
-		d.expand(insets.left + insets.right, insets.top + insets.bottom);
-		// add enough width for the min/max buttons
-		// d.width += minButton.getSize().width + maxButton.getSize().width;
-		return d;
-	}
-
-	private class Tab {
-		private String label = "";
-
-		private Object contents = null;
-
-		private Dimension textExtents;
-
-		private boolean active;
-
-		public Tab(String text) {
-			this.label = text;
-		}
-
-		public void setContents(Object contents) {
-			this.contents = contents;
-		}
-
-		public Object getContents() {
-			return contents;
-		}
-
-		public void setActive(boolean active) {
-			this.active = active;
-		}
-
-		public boolean isActive() {
-			return active;
-		}
-
-		public String getLabel() {
-			return label;
-		}
-
-		public void setLabel(String text) {
-			if (text == null)
-				this.label = "";
-			else
-				this.label = text;
-			textExtents = null;
-		}
-
-		public Dimension calculateTextExtents() {
-			textExtents = FigureUtilities.getTextExtents(label == null ? "W"
-					: label, getFont());
-			textExtents.width += getPadding().getWidth();
-			textExtents.height += getPadding().getHeight();
-			return textExtents;
-		}
-
-		public Dimension getTextExtents() {
-			if (textExtents == null)
-				calculateTextExtents();
-			return textExtents.getCopy();
-		}
-
-		public void invalidate() {
-			textExtents = null;
-		}
-
-		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 9e8ce13..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/TabbedWindowBorder.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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;
-
-public 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) }));
-
-	public static class MySchemeBorder extends SchemeBorder {
-		public static class MyScheme extends SchemeBorder.Scheme {
-			public MyScheme(Color[] highlight, Color[] shadow) {
-				super(highlight, shadow);
-			}
-
-			public Color[] getHighlight() {
-				return super.getHighlight();
-			}
-
-			public Color[] getShadow() {
-				return super.getHighlight();
-			}
-		}
-
-		MySchemeBorder(MyScheme scheme) {
-			super(scheme);
-		}
-
-		public MyScheme getMyScheme() {
-			return (MyScheme) super.getScheme();
-		}
-
-		/**
-		 * @see org.eclipse.draw2d.Border#paint(IFigure, Graphics, Insets)
-		 */
-		public void paint(Composite comp, GC gc, Insets insets) {
-			Color[] tl = getMyScheme().getHighlight();
-			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(Composite comp, GC gc, Insets insets, Color[] tl,
-				Color[] br) {
-			org.eclipse.swt.graphics.Rectangle rect = comp.getBounds();
-
-			gc.setLineWidth(1);
-			gc.setLineStyle(SWT.LINE_SOLID);
-			// TODO: deprecated with no obvious replacement: 
-			gc.setXORMode(false);
-
-			int top = rect.y - insets.top;
-			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));
-
-			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();
-		}
-	}
-
-	public TabbedWindowBorder(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;
-	}
-
-	public void setVisible(boolean flag) {
-		if (isVisible != flag) {
-			isVisible = flag;
-			((TabbedTitleBarBorder) inner).setVisible(flag);
-			if (flag)
-				((TabbedTitleBarBorder) inner).getParent().repaint();
-		}
-	}
-
-	public void setHighlight(boolean flag) {
-		if (flag)
-			outer = highlightBorder;
-		else
-			outer = normalBorder;
-		((TabbedTitleBarBorder) inner).getParent().repaint();
-	}
-
-	protected void createBorders() {
-        // TODO: NOTE: this is overriding default border creation
-	}
-
-	public void paint(IFigure figure, Graphics g, Insets insets) {
-		if (isVisible) {
-			if (comp != null) {
-				GC gc = new GC(comp);
-				paint(comp, gc, insets);
-				gc.dispose();
-			} else
-				super.paint(figure, g, insets);
-		}
-	}
-
-	private Composite comp;
-
-	public void paint(Composite comp_, GC gc, 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 a30063e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/TitleBarButton.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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;
-
-public class TitleBarButton extends Button {
-	boolean state = false;
-
-	Image uncheckedImage;
-
-	Image checkedImage;
-
-	Image uncheckedHiliteImage;
-
-	Image checkedHiliteImage;
-
-	RectangleList uncheckedRects;
-
-	RectangleList checkedRects;
-
-	boolean hilite = false;
-
-	public TitleBarButton(Image image) {
-		this(image, null, null, null);
-	}
-
-	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();
-	}
-
-	public TitleBarButton(RectangleList rects) {
-		super();
-		uncheckedRects = rects;
-		initialize();
-	}
-
-	public TitleBarButton(RectangleList unchecked, RectangleList checked) {
-		super();
-		uncheckedRects = unchecked;
-		checkedRects = checked;
-		initialize();
-	}
-
-	public boolean getState() {
-		return state;
-	}
-
-	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
-
-			}
-		});
-	}
-
-	public Dimension calculatePreferredSize() {
-		if (prefSize == null) {
-			Rectangle rect = new Rectangle(0, 0, 0, 0);
-			if (uncheckedRects != null) {
-				Iterator iter = uncheckedRects.getRectangles().iterator();
-				while (iter.hasNext()) {
-					/*Point p =*/ getLocation();
-					Rectangle r = ((Rectangle) iter.next()).getCopy();
-					rect = rect.getUnion(r);
-				}
-			}
-			if (checkedRects != null) {
-				Iterator iter = checkedRects.getRectangles().iterator();
-				while (iter.hasNext()) {
-					/*Point p =*/ getLocation();
-					Rectangle r = ((Rectangle) 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 iter = null;
-			if (state == false)
-				iter = uncheckedRects.getRectangles().iterator();
-			else
-				iter = checkedRects.getRectangles().iterator();
-			while (iter.hasNext()) {
-				Point p = getLocation();
-				Rectangle r = ((Rectangle) 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 57e6062..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFigure.java
+++ /dev/null
@@ -1,570 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-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.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-
-public 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;
-
-	public static Font defaultFont = JFaceResources.getFontRegistry().get(
-			JFaceResources.DEFAULT_FONT);
-
-	public static Color defaultForegroundColor = ColorConstants.black;
-
-	public static Color defaultBackgroundColor = ColorConstants.white;
-
-	public static Color defaultGridColor = ColorConstants.lightGray;
-
-	public static Dimension defaultGridSpacing = null;
-
-	public 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.
-	public static int LINE_ROUTING_MANUAL = 0;
-
-	public static int LINE_ROUTING_MANHATTAN = 1;
-
-	public 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);
-		}
-	}
-
-	public WindowFigure() {
-		super();
-
-		windowBorder = new TabbedWindowBorder(this);
-		titleBarBorder = (TabbedTitleBarBorder) windowBorder.getInnerBorder();
-		setBorder(windowBorder);
-		setFont(defaultFont);
-		setForegroundColor(defaultForegroundColor);
-		setBackgroundColor(defaultBackgroundColor);
-
-		innerLayers = new FreeformLayeredPane();
-		createLayers(innerLayers);
-
-		myViewport = new FreeformViewport();
-		myViewport.setContents(innerLayers);
-
-		setViewport(myViewport);
-
-		// CR389495: Working with nested complex activities causes in the BP
-		// editor causes lockup
-		// not related to this CR but discovered while working on it:
-		// make sure we observe grid visibility from preferences
-		getGridLayer().setVisible(defaultGridEnabled);
-		getGridLayer().setSpacing(defaultGridSpacing);
-		getGridLayer().setForegroundColor(defaultGridColor);
-
-		setText("Window");
-
-		addTabbedWindowListener(new WindowFigureListener() {
-			public void tabChanged(int oldIndex, int newIndex) {
-				internalSetCurrentTab(newIndex);
-				validate();
-			}
-		});
-		addAncestorListener(new AncestorListener() {
-
-			public void ancestorAdded(IFigure ancestor) {
-				setVisible(true);
-			}
-
-			public void ancestorMoved(IFigure ancestor) {
-				// validateComposite();
-			}
-
-			public void ancestorRemoved(IFigure ancestor) {
-				// TODO: fix this - shouldn't be throwing an exception
-				try {
-					setVisible(false);
-				} catch (Exception e) {
-                    EditorPlugin.getDefault().getLog().log(
-                       new Status(IStatus.ERROR, EditorPlugin.getPluginId(), 0, "Error setting visible", e));
-				}
-			}
-		});
-	}
-
-	// //////////////////////////////////////////////////////////////////////////
-	// Layer management
-	// //////////////////////////////////////////////////////////////////////////
-
-	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);
-	}
-
-	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;
-	}
-
-	protected LayeredPane getScaledLayers() {
-		if (scaledLayers == null)
-			scaledLayers = createScaledLayers();
-		return scaledLayers;
-	}
-
-	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;
-	}
-
-	protected LayeredPane getPrintableLayers() {
-		if (printableLayers == null)
-			printableLayers = createPrintableLayers();
-		return printableLayers;
-	}
-
-	protected GridLayer createGridLayer() {
-		return new MyGridLayer();
-	}
-
-	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
-	// //////////////////////////////////////////////////////////////////////////
-
-	public Point getScrollPosition() {
-		int x = getHorizontalScrollBar().getRangeModel().getValue();
-		int y = getVerticalScrollBar().getRangeModel().getValue();
-		return new Point(x, y);
-	}
-
-	public TabbedTitleBarBorder getTabbedTitleBarBorder() {
-		return titleBarBorder;
-	}
-
-	public TabbedWindowBorder getTabbedWindowBorder() {
-		return windowBorder;
-	}
-
-	public void addTabbedWindowListener(WindowFigureListener listener) {
-		titleBarBorder.addTabbedWindowListener(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;
-	}
-
-	public int addTab(String s) {
-		return titleBarBorder.addTab(s);
-	}
-
-	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);
-	}
-
-	public void setCurrentTab(int index) {
-		internalSetCurrentTab(index);
-		titleBarBorder.setCurrentTab(index);
-	}
-
-	public int getCurrentTab() {
-		return titleBarBorder.getCurrentTab();
-	}
-
-	public void setContents(IFigure figure) {
-		titleBarBorder.setContents(0, figure);
-		super.setContents(figure);
-	}
-
-	public void setContents(int index, Object contents) {
-		if (contents instanceof IFigure)
-			setContents((IFigure) contents);
-		titleBarBorder.setContents(index, contents);
-	}
-
-	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);
-	}
-
-	public void setLineRoutingStyle(int style) {
-		defaultLineRoutingStyle = style;
-		revalidate();
-	}
-
-	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.basic.ITabbedWindow#setName(int,
-	 *      java.lang.String)
-	 */
-	public void setText(int index, String name) {
-		titleBarBorder.setLabel(index, name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getText()
-	 */
-	public String getText() {
-		if (titleBarBorder == null)
-			return "??";
-		return titleBarBorder.getLabel();
-	}
-
-	/*
-	 * CR374981: Long activity labels do not get wrapped or truncated This
-	 * method was added to the IBaseFigure interface to support direct edit of
-	 * figure labels on the canvas.
-	 */
-	public Rectangle getTextBounds() {
-		Rectangle r = getClientArea().getCopy();
-		r.height = titleBarBorder.getTextExtents(this).height;
-		r.x += getInsets().left;
-		r.y -= getInsets().top;
-		return r;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getIcon()
-	 */
-	public Image getIcon() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setIcon(org.eclipse.swt.graphics.Image)
-	 */
-	public void setIcon(Image image) {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setToolTipText(java.lang.String)
-	 */
-	public void setToolTipText(String text) {
-        // do nothing
-	}
-
-	public String getToolTipText() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#addDecorator(com.sybase.stf.gem.diagram.editor.figures.BaseFigureDecorator)
-	 */
-	public void addDecorator(BaseFigureDecorator decorator) {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#removeDecorator()
-	 */
-	public void removeDecorator() {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#removeDecorator(int)
-	 */
-	public void removeDecorator(int position) {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getDecorators()
-	 */
-	public List getDecorators() {
-		return null;
-	}
-
-	// //////////////////////////////////////////////////////////////////////
-	// FreeformFigure methods
-	// //////////////////////////////////////////////////////////////////////
-
-	private WindowFreeformHelper helper = new WindowFreeformHelper(this);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#addFreeformListener(org.eclipse.draw2d.FreeformListener)
-	 */
-	public void addFreeformListener(FreeformListener listener) {
-		addListener(FreeformListener.class, listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#fireExtentChanged()
-	 */
-	public void fireExtentChanged() {
-		Iterator iter = getListeners(FreeformListener.class);
-		while (iter.hasNext())
-			((FreeformListener) iter.next()).notifyFreeformExtentChanged();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#getFreeformExtent()
-	 */
-	public Rectangle getFreeformExtent() {
-		Rectangle r = helper.getFreeformExtent();
-		r.x = 0;
-		r.y = 0;
-		return r;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#removeFreeformListener(org.eclipse.draw2d.FreeformListener)
-	 */
-	public void removeFreeformListener(FreeformListener listener) {
-		removeListener(FreeformListener.class, listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#setFreeformBounds(org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void setFreeformBounds(Rectangle bounds) {
-		helper.setFreeformBounds(bounds);
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFigureListener.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFigureListener.java
deleted file mode 100644
index 0a6d4b1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFigureListener.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.preference;
-
-/**
- * @author Bob Brodt
- * 
- * Defines an interface for notifying listeners of page switches on a tabbed
- * window figure.
- */
-public interface WindowFigureListener {
-	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 834d516..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFreeformHelper.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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
- */
-public 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();
-
-	public WindowFreeformHelper(FreeformFigure host) {
-		this.host = host;
-	}
-
-	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;
-	}
-
-	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();
-	}
-
-	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);
-	}
-
-	public void unhookChild(IFigure child) {
-		invalidate();
-		if (child instanceof FreeformFigure)
-			((FreeformFigure) child).removeFreeformListener(this);
-		else
-			child.removeFigureListener(figureListener);
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/provider/ManagedBeanContentProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/provider/ManagedBeanContentProvider.java
deleted file mode 100644
index 45d15b4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/provider/ManagedBeanContentProvider.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.provider;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ManagedBeanScopeTreeItem;
-
-/**
- * Managed bean Content Provider.
- * <p>
- * <b>Provides grouping by Scope.</b>
- * </p>
- * 
- * @author Xiao-guang Zhang, sfshi
- * @version 1.5
- */
-public class ManagedBeanContentProvider implements ITreeContentProvider {
-
-	private List scopeItemList = null;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(Object
-	 *      parent)
-	 */
-	public Object[] getChildren(Object parent) {
-
-		if (parent instanceof FacesConfigType) {
-			if (scopeItemList == null) {
-				scopeItemList = new ArrayList();
-				for (int i = 0; i < ManagedBeanScopeTreeItem.scopeItems.length; i++) {
-					ManagedBeanScopeTreeItem scopeTreeItem = new ManagedBeanScopeTreeItem(
-							ManagedBeanScopeTreeItem.scopeItems[i],
-							(FacesConfigType) parent);
-					scopeItemList.add(scopeTreeItem);
-				}
-			}
-			return scopeItemList.toArray();
-		} else if (parent instanceof ManagedBeanScopeTreeItem) {
-			return ((ManagedBeanScopeTreeItem) parent).getChildren().toArray();
-		}
-
-		return new Object[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getElements(Object
-	 *      parent)
-	 */
-	public Object[] getElements(Object inputElement) {
-		return getChildren(inputElement);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object element) {
-		if (element instanceof ManagedBeanScopeTreeItem) {
-			return ((ManagedBeanScopeTreeItem) element).getParent();
-		} else if (element instanceof ManagedBeanType) {
-			String scope = null;
-			if (((ManagedBeanType) element).getManagedBeanScope() != null) {
-				scope = ((ManagedBeanType) element).getManagedBeanScope()
-						.getTextContent();
-			}
-
-			if (scope != null) {
-				for (int i = 0; i < scopeItemList.size(); i++) {
-					if (((ManagedBeanScopeTreeItem) scopeItemList.get(i))
-							.getScope().equals(scope)) {
-						return scopeItemList.get(i);
-					}
-
-				}
-			}
-		}
-
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-	 */
-	public boolean hasChildren(Object element) {
-		if (element instanceof FacesConfigType) {
-			return true;
-		} else if (element instanceof ManagedBeanScopeTreeItem) {
-			return ((ManagedBeanScopeTreeItem) element).hasChildren();
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-	 */
-	public void dispose() {
-		// TODO Auto-generated method stub
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-	 *      java.lang.Object, java.lang.Object)
-	 */
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		if (newInput != null) {
-//			initialize(newInput);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/provider/ManagedBeanLabelProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/provider/ManagedBeanLabelProvider.java
deleted file mode 100644
index 3a729c8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/provider/ManagedBeanLabelProvider.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.provider;
-
-import java.util.Hashtable;
-import java.util.Map;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ManagedBeanScopeTreeItem;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * The Managed Bean Page's TreeViewer Label Provider
- * 
- * @author Xiao-guang Zhang, sfshi
- * @version 1.5
- */
-public class ManagedBeanLabelProvider extends LabelProvider {
-	/** Cache of images that have been dispensed by this provider */
-	private Map imageTable;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.LabelProvider#getText(Object obj)
-	 */
-	public String getText(Object obj) {
-		String text = "";
-
-		if (obj instanceof ManagedBeanType) {
-			ManagedBeanType bean = (ManagedBeanType) obj;
-			if (bean.getManagedBeanName() != null) {
-				text = bean.getManagedBeanName().getTextContent();
-
-			}
-			if (text == null || text.length() < 1) {
-				if (bean.getManagedBeanClass() != null)
-					text = bean.getManagedBeanClass().getTextContent();
-			}
-		} else if (obj instanceof ManagedBeanScopeTreeItem) {
-			text = ((ManagedBeanScopeTreeItem) obj).getScope();
-		}
-
-		return text;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.LabelProvider#getImage(Object obj)
-	 */
-	public Image getImage(Object obj) {
-		ImageDescriptor imageDesc = null;
-		if (obj instanceof ManagedBeanType) {
-
-			imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-					"facesconfig/FacesConfig_ManagedBean.gif"); //$NON-NLS-1$
-
-		} else if (obj instanceof ManagedBeanScopeTreeItem) {
-			ManagedBeanScopeTreeItem scopeTreeItem = (ManagedBeanScopeTreeItem) obj;
-			if (IFacesConfigConstants.MANAGED_BEAN_SCOPE_SESSION
-					.equals(scopeTreeItem.getScope())) {
-				imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-						"Scope_Session.gif");
-			} else if (IFacesConfigConstants.MANAGED_BEAN_SCOPE_REQUEST
-					.equals(scopeTreeItem.getScope())) {
-				imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-						"Scope_Request.gif");
-			} else if (IFacesConfigConstants.MANAGED_BEAN_SCOPE_APPLICATION
-					.equals(scopeTreeItem.getScope())) {
-				imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-						"Scope_Application.gif");
-			} else if (IFacesConfigConstants.MANAGED_BEAN_SCOPE_NONE
-					.equals(scopeTreeItem.getScope())) {
-				imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-						"Scope_None.gif");
-			} else {
-				imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-						"Scope.gif");
-			}
-		}
-
-		if (imageDesc != null) {
-			// Obtain the cached image corresponding to the descriptor
-			if (imageTable == null) {
-				imageTable = new Hashtable(40);
-			}
-			Image image = (Image) imageTable.get(imageDesc);
-			if (image == null) {
-				image = imageDesc.createImage();
-				imageTable.put(imageDesc, image);
-			}
-			return image;
-		}
-		return PlatformUI.getWorkbench().getSharedImages().getImage(
-				ISharedImages.IMG_OBJ_ELEMENT);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AbstractFacesConfigSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AbstractFacesConfigSection.java
deleted file mode 100644
index 8d47489..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AbstractFacesConfigSection.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.help.HelpSystem;
-import org.eclipse.help.IContext;
-import org.eclipse.help.IHelpResource;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.SectionPart;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ImageHyperlink;
-import org.eclipse.ui.forms.widgets.Section;
-
-/**
- * The abstract implementation of IFacesConfigSection.
- * 
- * 
- * @author jchoi, xgzhang, sfshi
- * 
- * @version 1.0
- */
-public abstract class AbstractFacesConfigSection extends SectionPart implements
-		IFacesConfigSection, ISelectionProvider, ISelectionChangedListener {
-	/** tool kit */
-	private FormToolkit toolkit;
-
-	/** help context id */
-	private String helpContextId = null;
-
-	/** help tool tip string */
-	private String helpTooltip = null;
-
-	/** model object */
-	private Object input = null;
-
-	private IFacesConfigPage page;
-
-	private List selectionChangedListeners = new ArrayList();
-
-	/** help image */
-	private final static Image HELP_IMAGE = EditorPlugin.getDefault().getImage(
-			"help.gif"); //$NON-NLS-1$
-
-	/**
-	 * Constructor with help option.
-
-	 * @param parent 
-	 * @param managedForm
-	 * @param page 
-	 * @param toolkit
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public AbstractFacesConfigSection(Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page,
-			FormToolkit toolkit, String helpContextId, String helpTooltip) {
-		super(parent, toolkit, ExpandableComposite.TITLE_BAR
-				| ExpandableComposite.TWISTIE | Section.DESCRIPTION
-				| ExpandableComposite.EXPANDED);
-		super.initialize(managedForm);
-		this.page = page;
-		this.toolkit = toolkit;
-		this.helpContextId = helpContextId;
-		this.helpTooltip = helpTooltip;
-	}
-
-	/**
-	 * 
-	 */
-	public void initialize() {
-		if (helpContextId != null) {
-			createTextClientWithHelp();
-		}
-
-		getSection().setLayout(new GridLayout());
-
-		Composite clientContainer = toolkit.createComposite(getSection());
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		clientContainer.setLayoutData(gd);
-
-		createContents(clientContainer, toolkit);
-		getSection().setClient(clientContainer);
-
-	}
-
-	/**
-	 * 
-	 * 
-	 */
-	private void createTextClientWithHelp() {
-		ImageHyperlink helpImage = new ImageHyperlink(getSection(), SWT.NULL);
-
-		toolkit.adapt(helpImage, true, true);
-
-		helpImage.setImage(HELP_IMAGE); //$NON-NLS-1$    	
-
-		helpImage.setBackground(getSection().getTitleBarGradientBackground());
-		if (helpTooltip != null) {
-			helpImage.setToolTipText(helpTooltip);
-		}
-
-		helpImage.addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				IContext context = HelpSystem.getContext(helpContextId);
-				if (context != null) {
-					IHelpResource[] topics = context.getRelatedTopics();
-					if (topics != null && topics.length == 1) {
-						EditorPlugin.getDefault().getWorkbench()
-								.getHelpSystem().displayHelpResource(
-										topics[0].getHref());
-					} else {
-						EditorPlugin.getDefault().getWorkbench()
-								.getHelpSystem().displayHelp(helpContextId);
-					}
-				}
-			}
-		});
-
-		getSection().setTextClient(helpImage);
-	}
-
-	/**
-	 * The sub calss should implement this method to create and fill the
-	 * contents in the section
-	 * 
-	 * @param container
-	 * @param toolkit_
-	 */
-	protected abstract void createContents(Composite container,
-			FormToolkit toolkit_);
-
-	/**
-	 * get the input object of this section.
-	 */
-	public Object getInput() {
-		return input;
-	}
-
-	/**
-	 * set input object for this section.
-	 */
-	public void setInput(Object newInput) {
-		if (input != null)
-			removeAdaptersFromInput(input);
-
-		input = newInput;
-
-		if (newInput != null)
-			addAdaptersOntoInput(newInput);
-		// if (this.getSection().isExpanded())
-		refreshAll();
-	}
-
-	/**
-	 * Remove adapters from the input object when the section changes it's
-	 * input. Sub classes should overwrite this method to remove the adapters
-	 * that they added on.
-	 * 
-	 * @param oldInput
-	 */
-	protected void removeAdaptersFromInput(Object oldInput) {
-	    // do nothing; subs should override
-	}
-
-	/**
-	 * Add adapters onto the input object when the section has new input. Sub
-	 * classes should their own adapters.
-	 * 
-	 * @param newInput
-	 */
-	protected void addAdaptersOntoInput(Object newInput) {
-        // do nothing; subs should override
-	}
-
-	/**
-	 * @return the page that this section lies in.
-	 */
-	public IFacesConfigPage getPage() {
-		return page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return StructuredSelection.EMPTY;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-	    // do nothing: no selection change
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/**
-	 * transfer the selection changed event to detail part.
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-
-		for (Iterator listeners = selectionChangedListeners.iterator(); listeners
-				.hasNext();) {
-			ISelectionChangedListener listener = (ISelectionChangedListener) listeners
-					.next();
-			listener.selectionChanged(new SelectionChangedEvent(this,
-					event != null ? event.getSelection()
-							: StructuredSelection.EMPTY));
-		}
-	}
-
-	/**
-	 * the convenient method to get the AdapterFactory instance of the editor;
-	 * 
-	 * @return the AdapterFactory instance.
-	 */
-	public AdapterFactory getAdapterFactory() {
-		return (AdapterFactory) getPage().getEditor().getAdapter(
-				AdapterFactory.class);
-	}
-
-	/**
-	 * the convenient method to get the EditingDomain instance of the editor;
-	 * 
-	 * @return the EditingDomain instance.
-	 */
-	public EditingDomain getEditingDomain() {
-		return (EditingDomain) getPage().getEditor().getAdapter(
-				EditingDomain.class);
-	}
-    
-    public void clearAll()
-    {
-        // do nothing, sub-classes may choose to override to clear their contents
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AbstractOverviewSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AbstractOverviewSection.java
deleted file mode 100644
index 34b51e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AbstractOverviewSection.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jst.jsf.common.ui.internal.actions.OpenPageAction;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author sfshi
- * 
- */
-public abstract class AbstractOverviewSection extends
-		AbstractFacesConfigSection {
-
-	/**
-	 * the common table viewer used for  the contents
-	 */
-	protected TableViewer tableViewer;
-
-	private String targetPageID;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 * @param targetPageID
-	 * @param title
-	 * @param description
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public AbstractOverviewSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit, String targetPageID,
-			String title, String description, String helpContextId,
-			String helpTooltip) {
-		super(parent, managedForm, page, toolkit, helpContextId, helpTooltip);
-		this.targetPageID = targetPageID;
-		getSection().setText(title); //$NON-NLS-1$
-		getSection().setDescription(description); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#createContents(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.ui.forms.widgets.FormToolkit)
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 1;
-		layout.marginHeight = 2;
-		layout.marginWidth = 2;
-		layout.verticalSpacing = 5;
-		layout.horizontalSpacing = 6;
-		container.setLayout(layout);
-		toolkit.paintBordersFor(container);
-		Table table = createTable(container);
-		if (targetPageID != null) {
-			table.addMouseListener(new MouseAdapter() {
-				public void mouseDoubleClick(MouseEvent e) {
-					if (((IStructuredSelection) tableViewer.getSelection())
-							.size() == 1) {
-						OpenPageAction action = new OpenPageAction();
-						action.setPageName(targetPageID);
-						action.setSelection(tableViewer.getSelection());
-						action.run();
-					}
-				}
-			});
-		}
-		tableViewer = new TableViewer(table);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		ComposedAdapterFactory factory = (ComposedAdapterFactory)getAdapterFactory();
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(factory));
-		configTableViewer(tableViewer);
-	}
-
-	/**
-	 * 
-	 * @param container 
-	 * @return the table
-	 */
-	abstract protected Table createTable(Composite container);
-
-	/**
-	 * 
-	 * @param tableViewer1
-	 */
-	abstract protected void configTableViewer(TableViewer tableViewer1);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection#clearAll()
-	 */
-	public void clearAll() {
-		tableViewer.setInput(null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection#refreshAll()
-	 */
-	public void refreshAll() {
-		tableViewer.setInput(getInput());
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ApplicationSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ApplicationSection.java
deleted file mode 100644
index b121d0e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ApplicationSection.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.jdt.ui.IJavaElementSearchConstants;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.DialogUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ModelUtil;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * A common <code>IFacesConfigSection</code> implementation for the sections that editing
- * the child elements of <application>, including: <action-listener>,
- * <default-render-kit-id>, <message-bundle>, <navigation-handler>,
- * <view-handler>,<state-manager>, <property-resolver>, <variable-resolver> and
- * <locale-config>. This sections will use the EClass object of these elements
- * as the key.
- * 
- * @author Zhi-peng Zhang, sfshi
- * @version
- */
-public class ApplicationSection extends OthersPageBaseSection {
-
-	/** The Eclass object this Section operated */
-	private EClass applicationChildClass;
-
-	/**
-	 * 
-	 * @param applicationChildClass
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public ApplicationSection(EClass applicationChildClass, Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page,
-			FormToolkit toolkit, String helpContextId, String helpTooltip) {
-		super(parent, managedForm, page, toolkit, helpContextId, helpTooltip);
-		this.applicationChildClass = applicationChildClass;
-	}
-
-	/**
-	 * 
-	 * @param componentClass
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public ApplicationSection(EClass componentClass, Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		this(componentClass, parent, managedForm, page, toolkit, null, null);
-	}
-
-	/**
-	 * Create an object which is instance of <code>applicationChildClass</code>.
-	 * 
-	 * @return the child class object
-	 */
-	public EObject createApplicationChildObject() {
-		String textValue = null;
-		IProject project = (IProject) this.getPage().getEditor().getAdapter(
-				IProject.class);
-		FacesConfigType facesConfig = (FacesConfigType) this.getPage()
-				.getInput();
-		if (applicationChildClass == FacesConfigPackage.eINSTANCE
-				.getDefaultRenderKitIdType()) {
-
-			/** Open a dialog to select a render-kit of this faces config. */
-			textValue = DialogUtil.openRenderKitDialog(getSection().getShell(),
-					facesConfig);
-		} else if (applicationChildClass == FacesConfigPackage.eINSTANCE
-				.getMessageBundleType()) {
-			/**
-			 * Open a dialog the select the message bundles that in current
-			 * project. If user select a bundle that already declared in this
-			 * faces config, then shows a warning message.
-			 */
-			List bundles = new ArrayList();
-			if (facesConfig.getApplication().size() > 0) {
-				ApplicationType applicationType = (ApplicationType) facesConfig
-						.getApplication().get(0);
-				bundles = applicationType.getMessageBundle();
-			}
-
-			textValue = DialogUtil.openMessageBundleDialog(getSection()
-					.getShell(), project, bundles);
-
-		} else {
-			/**
-			 * For other types children, open a ClassDialog to select a class in
-			 * current project.
-			 */
-			String superType = ModelUtil.getSuperType(applicationChildClass);
-			textValue = DialogUtil.openClassDialog(getSection().getShell(),
-					project, superType,
-					IJavaElementSearchConstants.CONSIDER_ALL_TYPES);
-		}
-		if (textValue != null && textValue.length() > 0) {
-			EObject component = FacesConfigFactory.eINSTANCE
-					.create(applicationChildClass);
-			// set text content.
-			EStructuralFeature feature = applicationChildClass
-					.getEStructuralFeatures().get(0);
-			component.eSet(feature, textValue);
-			return component;
-		}
-		return null;
-	}
-
-	/**
-	 * Set the <application> element as the structuredViewer's input.
-	 * 
-	 * @param input
-	 */
-	protected void setViewerInput(Object input) {
-		if (input instanceof ApplicationType) {
-			tableViewer.setInput(input);
-		} else
-			tableViewer.setInput(null);
-	}
-
-	/**
-	 * Add a filter on the table viewer. Only the elements that is a instance of
-	 * <code>applicationChildClass</code> could be selected.
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return applicationChildClass.isInstance(element);
-			}
-		});
-	}
-
-	/**
-	 * Perform some actions to create new child object and append it to the
-	 * <application> element.
-	 */
-	void addButtonSelected(SelectionEvent e) {
-		/** Create such a new object. */
-		EObject obj = createApplicationChildObject();
-		if (obj != null) {
-
-			boolean needRefreshAll = false;
-			Command command = null;
-			if (getInput() instanceof ApplicationType) {
-				/**
-				 * The input is a <application> element and not null, append the
-				 * new object to it.
-				 */
-				ApplicationType application = (ApplicationType) getInput();
-				command = AddCommand.create(getEditingDomain(), application,
-						null, obj);
-			} else {
-				/**
-				 * The input is null, create a <application> element and append
-				 * it to <faces-config>.
-				 */
-				needRefreshAll = true;
-
-				List list = new ArrayList(2);
-				ApplicationType application = FacesConfigFactory.eINSTANCE
-						.createApplicationType();
-				Command cmd1 = AddCommand.create(getEditingDomain(),
-						application, null, obj);
-				list.add(cmd1);
-				Command cmd2 = AddCommand.create(getEditingDomain(), this
-						.getPage().getInput(), null, application);
-				list.add(cmd2);
-				command = new CompoundCommand(list);
-			}
-
-			if (command.canExecute()) {
-				getEditingDomain().getCommandStack().execute(command);
-				if (needRefreshAll) {
-					/** reset the application input. */
-					((OthersPage) this.getPage()).resetApplicationInput();
-				}
-			}
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AttributeSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AttributeSection.java
deleted file mode 100644
index 6a8d0fb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AttributeSection.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.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;
-
-public class AttributeSection extends AbstractFacesConfigSection  {
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private TableViewer tableViewer;
-
-	private Button removeButton;
-
-	private Button editButton;	
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public AttributeSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		this.getSection().setText(EditorMessages.AttributeSection_Name);
-		this.getSection().setDescription(
-				EditorMessages.AttributeSection_Description);
-
-	}
-
-	/**
-	 * 
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		GridLayout gl = new GridLayout();
-		gl.horizontalSpacing = 0;
-		gl.marginWidth = 0;
-		gl.numColumns = 2;
-		container.setLayout(gl);
-		GridData td = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-
-		Composite attributeSection = toolkit.createComposite(container);
-		GridLayout gl2 = new GridLayout();
-		gl2.horizontalSpacing = 0;
-		gl2.verticalSpacing = 0;
-		gl2.marginWidth = 0;
-		gl2.marginHeight = 0;
-		gl2.numColumns = 2;
-		attributeSection.setLayout(gl2);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		attributeSection.setLayoutData(gd);
-
-		createTableSection(attributeSection, toolkit);
-		createButtonsSection(attributeSection, toolkit);
-		
-	}
-
-	/**
-	 * create table section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createTableSection(Composite container, FormToolkit toolkit) {
-		Composite tableContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_HORIZONTAL);
-		tableContainer.setLayoutData(gd);
-		toolkit.paintBordersFor(tableContainer);
-
-		GridLayout gl = new GridLayout();
-		tableContainer.setLayout(gl);
-
-		Table table = new Table(tableContainer, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		table.setLayoutData(gd);
-
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		table.setLayout(layout);
-
-		TableColumn nameCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		nameCol
-				.setText(EditorMessages.AttributeSection_Table_NameColumn);
-
-		TableColumn classCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		classCol
-				.setText(EditorMessages.AttributeSection_Table_ClassColumn);
-
-		TableColumn valueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		valueCol
-				.setText(EditorMessages.AttributeSection_Table_DefaultValueColumn);
-
-		TableColumn suggestedValueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		suggestedValueCol
-				.setText(EditorMessages.AttributeSection_Table_SuggestedValueColumn);
-
-		table.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateButtons();
-			}
-		});
-
-		table.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected();
-			}
-		});
-
-		tableViewer = new TableViewer(table);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getAttributeType()
-						.isInstance(element);
-			}
-		});
-		
-		tableViewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * Update the buttons' enable and disable status
-	 */
-	private void updateButtons() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/**
-	 * create buttons
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createButtonsSection(Composite container, FormToolkit toolkit) {
-		// create operation buttons's container
-		Composite operationContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_VERTICAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		operationContainer.setLayoutData(gd);
-		GridLayout gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Add_more, //$NON-NLS-1$
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		editButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Edit_more, //$NON-NLS-1$
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-
-		removeButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Remove, //$NON-NLS-1$
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected();
-			}
-
-		});
-
-		editButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected();
-			}
-
-		});
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-
-		});
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		tableViewer.setInput(getInput());
-		updateButtons();
-
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		super.refresh();
-		tableViewer.refresh();
-		updateButtons();
-	}
-
-	/**
-	 * add an attribute.
-	 * 
-	 */
-	private void addButtonSelected() {
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditAttributeDialog dialog = new AddEditAttributeDialog(shell, true);
-		dialog.setProject((IProject) getPage().getEditor().getAdapter(
-				IProject.class));
-		if (dialog.open() == Dialog.OK) {
-
-			// AttributeType newAttribute = dialog.getResult();
-			AttributeType newAttribute = FacesConfigFactory.eINSTANCE
-					.createAttributeType();
-
-			if (dialog.getAttributeName().length() > 0) {
-				AttributeNameType attributeNameType = FacesConfigFactory.eINSTANCE
-						.createAttributeNameType();
-				attributeNameType.setTextContent(dialog.getAttributeName());
-				newAttribute.setAttributeName(attributeNameType);
-			}
-
-			if (dialog.getAttributeClass().length() > 0) {
-				AttributeClassType attributeClassType = FacesConfigFactory.eINSTANCE
-						.createAttributeClassType();
-				attributeClassType.setTextContent(dialog.getAttributeClass());
-				newAttribute.setAttributeClass(attributeClassType);
-			}
-
-			if (dialog.getDefaultValue().length() > 0) {
-				DefaultValueType defaultValueType = FacesConfigFactory.eINSTANCE
-						.createDefaultValueType();
-				defaultValueType.setTextContent(dialog.getDefaultValue());
-				newAttribute.setDefaultValue(defaultValueType);
-			}
-
-			if (dialog.getSuggestedValue().length() > 0) {
-				SuggestedValueType suggestedValueType = FacesConfigFactory.eINSTANCE
-						.createSuggestedValueType();
-				suggestedValueType.setTextContent(dialog.getSuggestedValue());
-				newAttribute.setSuggestedValue(suggestedValueType);
-			}
-
-			Command addCommand = AddCommand.create(this.getEditingDomain(),
-					getInput(), null, newAttribute); // getEReference(),
-														// newAttribute);
-			if (addCommand.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(addCommand);
-
-			}
-		}
-
-	}
-
-	/**
-	 * edit an attribute.
-	 * 
-	 */
-	private void editButtonSelected() {
-
-		AttributeType attribute = (AttributeType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(attribute);
-
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditAttributeDialog dialog = new AddEditAttributeDialog(shell, false);
-		dialog.setProject((IProject) getPage().getEditor().getAdapter(
-				IProject.class));
-		if (attribute.getAttributeName() != null) {
-			dialog.setAttributeName(attribute.getAttributeName()
-					.getTextContent());
-		}
-
-		if (attribute.getAttributeClass() != null) {
-			dialog.setAttributeClass(attribute.getAttributeClass()
-					.getTextContent());
-		}
-
-		if (attribute.getDefaultValue() != null) {
-			dialog
-					.setDefaultValue(attribute.getDefaultValue()
-							.getTextContent());
-		}
-
-		if (attribute.getSuggestedValue() != null) {
-			dialog.setSuggestedValue(attribute.getSuggestedValue()
-					.getTextContent());
-		}
-
-		if (dialog.open() == Dialog.OK) {
-			List commands = new ArrayList(4);
-
-			if (attribute.getAttributeName() != null) {
-				Command cmd1 = SetCommand.create(this.getEditingDomain(),
-						attribute.getAttributeName(),
-						FacesConfigPackage.eINSTANCE
-								.getAttributeNameType_TextContent(), dialog
-								.getAttributeName());
-				commands.add(cmd1);
-			} else if (dialog.getAttributeName().length() > 0) {
-				AttributeNameType attributeNameType = FacesConfigFactory.eINSTANCE
-						.createAttributeNameType();
-				attributeNameType.setTextContent(dialog.getAttributeName());
-
-				Command cmd2 = AddCommand.create(this.getEditingDomain(),
-						attribute, FacesConfigPackage.eINSTANCE
-								.getAttributeType_AttributeName(),
-						attributeNameType);
-				commands.add(cmd2);
-			}
-
-			if (attribute.getAttributeClass() != null) {
-				Command cmd3 = SetCommand.create(this.getEditingDomain(),
-						attribute.getAttributeClass(),
-						FacesConfigPackage.eINSTANCE
-								.getAttributeClassType_TextContent(), dialog
-								.getAttributeClass());
-				commands.add(cmd3);
-			} else if (dialog.getAttributeClass().length() > 0) {
-				AttributeClassType attributeClassType = FacesConfigFactory.eINSTANCE
-						.createAttributeClassType();
-				attributeClassType.setTextContent(dialog.getAttributeClass());
-
-				Command cmd4 = AddCommand.create(this.getEditingDomain(),
-						attribute, FacesConfigPackage.eINSTANCE
-								.getAttributeType_AttributeClass(),
-						attributeClassType);
-				commands.add(cmd4);
-			}
-
-			if (attribute.getDefaultValue() != null) {
-				Command cmd5 = SetCommand.create(this.getEditingDomain(),
-						attribute.getDefaultValue(),
-						FacesConfigPackage.eINSTANCE
-								.getDefaultValueType_TextContent(), dialog
-								.getDefaultValue());
-				commands.add(cmd5);
-
-			} else if (dialog.getDefaultValue().length() > 0) {
-				DefaultValueType defaultValueType = FacesConfigFactory.eINSTANCE
-						.createDefaultValueType();
-				defaultValueType.setTextContent(dialog.getDefaultValue());
-				Command cmd6 = AddCommand.create(this.getEditingDomain(),
-						attribute, FacesConfigPackage.eINSTANCE
-								.getAttributeType_DefaultValue(),
-						defaultValueType);
-				commands.add(cmd6);
-			}
-
-			if (attribute.getSuggestedValue() != null) {
-				Command cmd7 = SetCommand.create(this.getEditingDomain(),
-						attribute.getSuggestedValue(),
-						FacesConfigPackage.eINSTANCE
-								.getSuggestedValueType_TextContent(), dialog
-								.getSuggestedValue());
-				commands.add(cmd7);
-			} else if (dialog.getSuggestedValue().length() > 0) {
-				SuggestedValueType suggestedValueType = FacesConfigFactory.eINSTANCE
-						.createSuggestedValueType();
-				suggestedValueType.setTextContent(dialog.getSuggestedValue());
-				Command cmd8 = AddCommand.create(this.getEditingDomain(),
-						attribute, FacesConfigPackage.eINSTANCE
-								.getAttributeType_SuggestedValue(),
-						suggestedValueType);
-				commands.add(cmd8);
-			}
-
-			CompoundCommand command = new CompoundCommand(commands);
-			if (command.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(command);
-				tableViewer.refresh(attribute);
-
-			}
-		}
-
-	}
-
-	/**
-	 * remove an attribute.
-	 * 
-	 */
-	private void removeButtonSelected() {
-		AttributeType attribute = (AttributeType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(attribute);
-
-		Command removeCommand = RemoveCommand.create(this.getEditingDomain(),
-				getInput(), null, attribute);// getEReference(), attribute);
-
-		if (removeCommand.canExecute()) {
-			this.getEditingDomain().getCommandStack().execute(removeCommand);
-			refreshAll();
-		}
-
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return tableViewer.getSelection();
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-
-		tableViewer.setSelection(selection);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ComponentGeneralSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ComponentGeneralSection.java
deleted file mode 100644
index 9c0f27e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ComponentGeneralSection.java
+++ /dev/null
@@ -1,403 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ModelUtil;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * The sections that used for displaying and editing the general information of
- * a component, the information includs display name, description, component
- * type and component class.
- * 
- * @author sfshi
- * 
- */
-public class ComponentGeneralSection extends AbstractFacesConfigSection {
-
-	private StringDialogField displayNameField;
-
-	private StringDialogField descriptionField;
-
-	private StringDialogField componentTypeField;
-
-	private ClassButtonDialogField componentClassField;
-
-	private ComponentGeneralAdapter componentGeneralAdapter;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public ComponentGeneralSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		getSection()
-				.setText(EditorMessages.ComponentGeneralSection_Name);
-		getSection().setDescription(
-				EditorMessages.ComponentGeneralSection_Description);
-	}
-
-	/**
-	 * Create the UI fields.
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		int numberOfColumns = 4;
-		GridLayout layout = new GridLayout(numberOfColumns, false);
-		container.setLayout(layout);
-		GridData td = new GridData(GridData.FILL_HORIZONTAL);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-		displayNameField = new StringDialogField();
-		displayNameField
-				.setLabelText(EditorMessages.ComponentGeneralSection_Label_DisplayName);
-		displayNameField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		displayNameField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						String newDisplayNameValue = ((StringDialogField) field)
-								.getText().trim();
-						Command cmd = null;
-						ComponentType component = (ComponentType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (component.getDisplayName().size() > 0) {
-							DisplayNameType displayName = (DisplayNameType) component
-									.getDisplayName().get(0);
-							cmd = SetCommand.create(editingDomain, displayName,
-									FacesConfigPackage.eINSTANCE
-											.getDisplayNameType_TextContent(),
-									newDisplayNameValue);
-						} else {
-							DisplayNameType displayNameType = FacesConfigFactory.eINSTANCE
-									.createDisplayNameType();
-							displayNameType.setTextContent(newDisplayNameValue);
-
-							/** For the new displayname object, add the adapter. */
-							displayNameType.eAdapters().add(
-									getComponentGeneralAdapter());
-							cmd = AddCommand.create(editingDomain, component,
-									FacesConfigPackage.eINSTANCE
-											.getComponentType_DisplayName(),
-									displayNameType);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-
-				});
-
-		descriptionField = new StringDialogField(2);
-		descriptionField
-				.setLabelText(EditorMessages.ComponentGeneralSection_Label_Description);
-		descriptionField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		descriptionField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String newDescriptionValue = ((StringDialogField) field)
-								.getText().trim();
-
-						newDescriptionValue = ModelUtil
-								.escapeEntities(newDescriptionValue);
-						Command cmd = null;
-						ComponentType component = (ComponentType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (component.getDescription().size() > 0) {
-							DescriptionType description = (DescriptionType) component
-									.getDescription().get(0);
-							cmd = SetCommand.create(editingDomain, description,
-									FacesConfigPackage.eINSTANCE
-											.getDescriptionType_TextContent(),
-									newDescriptionValue);
-						} else {
-							DescriptionType description = FacesConfigFactory.eINSTANCE
-									.createDescriptionType();
-							description.setTextContent(newDescriptionValue);
-							/** For the new description object, add the adapter. */
-							description.eAdapters().add(
-									getComponentGeneralAdapter());
-
-							cmd = AddCommand.create(editingDomain, component,
-									FacesConfigPackage.eINSTANCE
-											.getComponentType_Description(),
-									description);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-				});
-
-		componentTypeField = new StringDialogField();
-		componentTypeField
-				.setLabelText(EditorMessages.ComponentGeneralSection_Label_ComponentType);
-		componentTypeField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		componentTypeField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						ComponentTypeType componentType = FacesConfigFactory.eINSTANCE
-								.createComponentTypeType();
-						componentType
-								.setTextContent(((StringDialogField) field)
-										.getText());
-
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getComponentType_ComponentType(),
-									componentType);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-					}
-				});
-
-		componentClassField = new ClassButtonDialogField(null);
-		componentClassField
-				.setLabelText(EditorMessages.ComponentGeneralSection_Label_ComponentClass);
-		componentClassField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(componentClassField.getTextControl(
-				toolkit, container));
-		componentClassField.setProject((IProject) getPage().getEditor()
-				.getAdapter(IProject.class));
-		componentClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-
-						ComponentClassType componentClass = FacesConfigFactory.eINSTANCE
-								.createComponentClassType();
-						componentClass
-								.setTextContent(((StringDialogField) field)
-										.getText());
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getComponentType_ComponentClass(),
-									componentClass);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-
-					}
-				});
-		componentClassField
-				.setSuperClassName(IFacesConfigConstants.COMPONENT_SUPER_CLASS);
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		refresh();
-	}
-
-	/**
-	 * Refresh the content on this section.
-	 */
-	public void refresh() {
-		super.refresh();
-		Object input = this.getInput();
-		if (input instanceof ComponentType) {
-			ComponentType component = (ComponentType) input;
-
-			if (component.getDisplayName().size() > 0) {
-				DisplayNameType displayName = (DisplayNameType) component
-						.getDisplayName().get(0);
-				displayNameField.setTextWithoutUpdate(displayName
-						.getTextContent());
-			} else {
-				displayNameField.setTextWithoutUpdate("");
-			}
-
-			if (component.getDescription().size() > 0) {
-				DescriptionType description = (DescriptionType) component
-						.getDescription().get(0);
-				String descriptionString = description.getTextContent();
-				descriptionString = ModelUtil.unEscapeEntities(descriptionString);
-				descriptionField.setTextWithoutUpdate(descriptionString);
-			} else {
-				descriptionField.setTextWithoutUpdate("");
-			}
-
-			if (component.getComponentType() != null) {
-				componentTypeField.setTextWithoutUpdate(component
-						.getComponentType().getTextContent());
-			} else {
-				componentTypeField.setTextWithoutUpdate("");
-			}
-
-			if (component.getComponentClass() != null) {
-				componentClassField.setTextWithoutUpdate(component
-						.getComponentClass().getTextContent());
-			} else {
-				componentClassField.setTextWithoutUpdate("");
-			}
-		}
-	}
-
-	/**
-	 * Add ComponentGeneralAdapter onto <component> and the first <display-name>
-	 * and <description> elements.
-	 */
-	protected void addAdaptersOntoInput(Object newInput) {
-		ComponentType component = (ComponentType) newInput;
-		if (EcoreUtil.getExistingAdapter(component,
-				ComponentGeneralSection.class) == null) {
-
-			component.eAdapters().add(getComponentGeneralAdapter());
-		}
-
-		if (component.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) component
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					ComponentGeneralSection.class) == null) {
-
-				displayName.eAdapters().add(getComponentGeneralAdapter());
-			}
-		}
-
-		if (component.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) component
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					ComponentGeneralSection.class) == null) {
-
-				description.eAdapters().add(getComponentGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * Remove ComponentGeneralAdapter from <component> and the first
-	 * <display-name> and <description> elements.
-	 */
-	protected void removeAdaptersFromInput(Object oldInput) {
-		ComponentType component = (ComponentType) oldInput;
-		if (EcoreUtil.getExistingAdapter(component,
-				ComponentGeneralSection.class) != null) {
-			component.eAdapters().remove(getComponentGeneralAdapter());
-		}
-		if (component.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) component
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					ComponentGeneralSection.class) != null) {
-
-				displayName.eAdapters().remove(getComponentGeneralAdapter());
-			}
-		}
-
-		if (component.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) component
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					ComponentGeneralSection.class) != null) {
-
-				description.eAdapters().remove(getComponentGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * 
-	 * @return
-	 */
-	private Adapter getComponentGeneralAdapter() {
-
-		if (componentGeneralAdapter == null) {
-			componentGeneralAdapter = new ComponentGeneralAdapter();
-		}
-		return componentGeneralAdapter;
-	}
-
-	/**
-	 * The adapter that will be added onto <component> element, to listen the
-	 * events of the children that are displayed in this section, notify the
-	 * section to refresh.
-	 * 
-	 * @author sfshi
-	 * 
-	 */
-	class ComponentGeneralAdapter extends AdapterImpl {
-
-		public boolean isAdapterForType(Object type) {
-			if (type == ComponentGeneralSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-
-			if (msg.getEventType() == Notification.ADD
-					|| msg.getEventType() == Notification.REMOVE
-					|| msg.getEventType() == Notification.SET) {
-				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getComponentType_ComponentClass()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getComponentType_ComponentType()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getComponentType_DisplayName()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getComponentType_Description()) {
-					refresh();
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getDisplayNameType_TextContent()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getDescriptionType_TextContent()) {
-					refresh();
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ComponentMasterSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ComponentMasterSection.java
deleted file mode 100644
index 551b85f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ComponentMasterSection.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class ComponentMasterSection extends FacesConfigMasterSection {
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page
-	 */
-	public ComponentMasterSection(Composite parent, IManagedForm managedForm,
-			FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		super(parent, managedForm, toolkit, page, null, null);
-		getSection().setText(EditorMessages.ComponentMasterSection_Name); //$NON-NLS-1$
-		getSection().setDescription(
-				EditorMessages.ComponentMasterSection_Description);
-	}
-
-	/**
-	 * Config the table viwer, set a filter for it, only the object of
-	 * ComponentType will be selected.
-	 */
-	protected void configViewer(StructuredViewer structuredViewer) {
-		super.configViewer(structuredViewer);
-		structuredViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getComponentType()
-						.isInstance(element);
-			}
-		});
-
-	}
-
-	/**
-	 * Create a new component.
-	 */
-	protected void addButtonSelected(SelectionEvent e) {
-		ComponentType component = FacesConfigFactory.eINSTANCE
-				.createComponentType();
-
-		Command command = AddCommand.create(getEditingDomain(),
-				this.getInput(), FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_Component(), component);
-
-		if (command.canExecute()) {
-			getEditingDomain().getCommandStack().execute(command);
-			IStructuredSelection selection = new StructuredSelection(component);
-			getStructuredViewer().refresh();
-			getStructuredViewer().setSelection(selection);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ConverterGeneralSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ConverterGeneralSection.java
deleted file mode 100644
index baf6097..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ConverterGeneralSection.java
+++ /dev/null
@@ -1,472 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ModelUtil;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class ConverterGeneralSection extends AbstractFacesConfigSection {
-
-	private StringDialogField displayNameField;
-
-	private StringDialogField descriptionField;
-
-	private StringDialogField converterIdField;
-
-	private ClassButtonDialogField converterForClassField;
-
-	private ClassButtonDialogField converterClassField;
-
-	private ConverterGeneralAdapter converterGeneralAdapter;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public ConverterGeneralSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		getSection()
-				.setText(EditorMessages.ConverterGeneralSection_Name);
-		getSection().setDescription(
-				EditorMessages.ConverterGeneralSection_Description);
-	}
-
-	/**
-	 * 
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		int numberOfColumns = 4;
-		GridLayout layout = new GridLayout(numberOfColumns, false);
-		container.setLayout(layout);
-		GridData td = new GridData(GridData.FILL_HORIZONTAL);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-		displayNameField = new StringDialogField();
-		displayNameField
-				.setLabelText(EditorMessages.ConverterGeneralSection_Label_DisplayName);
-		displayNameField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		displayNameField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						String newDisplayNameValue = ((StringDialogField) field)
-								.getText().trim();
-						Command cmd = null;
-						ConverterType Converter = (ConverterType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (Converter.getDisplayName().size() > 0) {
-							DisplayNameType displayName = (DisplayNameType) Converter
-									.getDisplayName().get(0);
-							cmd = SetCommand.create(editingDomain, displayName,
-									FacesConfigPackage.eINSTANCE
-											.getDisplayNameType_TextContent(),
-									newDisplayNameValue);
-						} else {
-							DisplayNameType displayNameType = FacesConfigFactory.eINSTANCE
-									.createDisplayNameType();
-							displayNameType.setTextContent(newDisplayNameValue);
-
-							displayNameType.eAdapters().add(
-									getConverterGeneralAdapter());
-							cmd = AddCommand.create(editingDomain, Converter,
-									FacesConfigPackage.eINSTANCE
-											.getConverterType_DisplayName(),
-									displayNameType);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-
-				});
-
-		descriptionField = new StringDialogField(2);
-		descriptionField
-				.setLabelText(EditorMessages.ConverterGeneralSection_Label_Description);
-		descriptionField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		descriptionField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String newDescriptionValue = ((StringDialogField) field)
-								.getText().trim();
-
-						newDescriptionValue = ModelUtil
-								.escapeEntities(newDescriptionValue);
-						Command cmd = null;
-						ConverterType Converter = (ConverterType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (Converter.getDescription().size() > 0) {
-							DescriptionType description = (DescriptionType) Converter
-									.getDescription().get(0);
-							cmd = SetCommand.create(editingDomain, description,
-									FacesConfigPackage.eINSTANCE
-											.getDescriptionType_TextContent(),
-									newDescriptionValue);
-						} else {
-							DescriptionType description = FacesConfigFactory.eINSTANCE
-									.createDescriptionType();
-							description.setTextContent(newDescriptionValue);
-
-							description.eAdapters().add(
-									getConverterGeneralAdapter());
-							cmd = AddCommand.create(editingDomain, Converter,
-									FacesConfigPackage.eINSTANCE
-											.getConverterType_Description(),
-									description);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-				});
-
-		converterIdField = new StringDialogField();
-		// converterIdField.setRequired(true);
-		converterIdField
-				.setLabelText(EditorMessages.ConverterGeneralSection_Label_ConverterID);
-		converterIdField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		converterIdField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						ConverterIdType converterIdType = FacesConfigFactory.eINSTANCE
-								.createConverterIdType();
-
-						converterIdType
-								.setTextContent(((StringDialogField) field)
-										.getText());
-
-						EditingDomain editingDomain = getEditingDomain();
-						List commands = new ArrayList(2);
-						Command cmd1 = SetCommand.create(editingDomain,
-								getInput(), FacesConfigPackage.eINSTANCE
-										.getConverterType_ConverterForClass(),
-								SetCommand.UNSET_VALUE);
-						commands.add(cmd1);
-						Command cmd2 = SetCommand.create(editingDomain,
-								getInput(), FacesConfigPackage.eINSTANCE
-										.getConverterType_ConverterId(),
-								converterIdType);
-						commands.add(cmd2);
-						Command command = new CompoundCommand(commands);
-						if (editingDomain != null) {
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-								refresh();
-							}
-						}
-					}
-				});
-
-		converterForClassField = new ClassButtonDialogField(null);
-		// converterForClassField.setRequired(true);
-		converterForClassField
-				.setLabelText(EditorMessages.ConverterGeneralSection_Label_ConverterForClass);
-		converterForClassField.setProject((IProject) getPage().getEditor()
-				.getAdapter(IProject.class));
-		converterForClassField.doFillIntoGrid(toolkit, container,
-				numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(converterForClassField.getTextControl(
-				toolkit, container));
-
-		converterForClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-
-						ConverterForClassType converterForClass = FacesConfigFactory.eINSTANCE
-								.createConverterForClassType();
-						converterForClass
-								.setTextContent(((StringDialogField) field)
-										.getText());
-						EditingDomain editingDomain = getEditingDomain();
-						List commands = new ArrayList(2);
-						Command cmd1 = SetCommand.create(editingDomain,
-								getInput(), FacesConfigPackage.eINSTANCE
-										.getConverterType_ConverterId(),
-								SetCommand.UNSET_VALUE);
-						commands.add(cmd1);
-						Command cmd2 = SetCommand.create(editingDomain,
-								getInput(), FacesConfigPackage.eINSTANCE
-										.getConverterType_ConverterForClass(),
-								converterForClass);
-						commands.add(cmd2);
-						Command command = new CompoundCommand(commands);
-						if (editingDomain != null) {
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-								refresh();
-							}
-						}
-
-					}
-				});
-
-		converterClassField = new ClassButtonDialogField(null);
-		// converterClassField.setRequired(true);
-		converterClassField
-				.setLabelText(EditorMessages.ConverterGeneralSection_Label_ConverterClass);
-		converterClassField.setProject((IProject) getPage().getEditor()
-				.getAdapter(IProject.class));
-		converterClassField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(converterClassField.getTextControl(
-				toolkit, container));
-
-		converterClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-
-						ConverterClassType ConverterClass = FacesConfigFactory.eINSTANCE
-								.createConverterClassType();
-						ConverterClass
-								.setTextContent(((StringDialogField) field)
-										.getText());
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getConverterType_ConverterClass(),
-									ConverterClass);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-
-					}
-				});
-		converterClassField
-				.setInterface(IFacesConfigConstants.CONVERTER_INTERFACE);
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		refresh();
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		super.refresh();
-		Object input = this.getInput();
-		if (input instanceof ConverterType) {
-			ConverterType Converter = (ConverterType) input;
-
-			if (Converter.getDisplayName().size() > 0) {
-				DisplayNameType displayName = (DisplayNameType) Converter
-						.getDisplayName().get(0);
-				displayNameField.setTextWithoutUpdate(displayName
-						.getTextContent());
-			} else {
-				displayNameField.setTextWithoutUpdate("");
-			}
-
-			if (Converter.getDescription().size() > 0) {
-				DescriptionType description = (DescriptionType) Converter
-						.getDescription().get(0);
-				String descriptionString = description.getTextContent();
-				descriptionString = ModelUtil
-						.unEscapeEntities(descriptionString);
-				descriptionField.setTextWithoutUpdate(descriptionString);
-			} else {
-				descriptionField.setTextWithoutUpdate("");
-			}
-
-			if (Converter.getConverterId() != null) {
-				converterIdField.setTextWithoutUpdate(Converter
-						.getConverterId().getTextContent());
-			} else {
-				converterIdField.setTextWithoutUpdate("");
-			}
-
-			if (Converter.getConverterForClass() != null) {
-				converterForClassField.setTextWithoutUpdate(Converter
-						.getConverterForClass().getTextContent());
-			} else {
-				converterForClassField.setTextWithoutUpdate("");
-			}
-
-			if (Converter.getConverterClass() != null) {
-				converterClassField.setTextWithoutUpdate(Converter
-						.getConverterClass().getTextContent());
-			} else {
-				converterClassField.setTextWithoutUpdate("");
-			}
-
-		}
-	}
-
-	/**
-	 * Add ConverterGeneralAdapter onto <converter> and the first <display-name>
-	 * and <description> elements.
-	 */
-	protected void addAdaptersOntoInput(Object newInput) {
-		ConverterType converter = (ConverterType) newInput;
-		if (EcoreUtil.getExistingAdapter(converter,
-				ConverterGeneralSection.class) == null) {
-
-			converter.eAdapters().add(getConverterGeneralAdapter());
-		}
-
-		if (converter.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) converter
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					ConverterGeneralSection.class) == null) {
-
-				displayName.eAdapters().add(getConverterGeneralAdapter());
-			}
-		}
-
-		if (converter.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) converter
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					ConverterGeneralSection.class) == null) {
-
-				description.eAdapters().add(getConverterGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * Remove ConverterGeneralAdapter from <converter> and the first
-	 * <display-name> and <description> elements.
-	 */
-	protected void removeAdaptersFromInput(Object oldInput) {
-		ConverterType converter = (ConverterType) oldInput;
-		if (EcoreUtil.getExistingAdapter(converter,
-				ConverterGeneralSection.class) != null) {
-			converter.eAdapters().remove(getConverterGeneralAdapter());
-		}
-		if (converter.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) converter
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					ConverterGeneralSection.class) != null) {
-
-				displayName.eAdapters().remove(getConverterGeneralAdapter());
-			}
-		}
-
-		if (converter.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) converter
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					ConverterGeneralSection.class) != null) {
-
-				description.eAdapters().remove(getConverterGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * 
-	 * @return
-	 */
-	private Adapter getConverterGeneralAdapter() {
-
-		if (converterGeneralAdapter == null) {
-			converterGeneralAdapter = new ConverterGeneralAdapter();
-		}
-		return converterGeneralAdapter;
-	}
-
-	/**
-	 * The adapter that will be added onto <converter> element, to listen the
-	 * events of the children that are displayed in this section, notify the
-	 * section to refresh.
-	 * 
-	 * @author sfshi
-	 * 
-	 */
-	class ConverterGeneralAdapter extends AdapterImpl {
-
-		public boolean isAdapterForType(Object type) {
-			if (type == ConverterGeneralSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-
-			if (msg.getEventType() == Notification.ADD
-					|| msg.getEventType() == Notification.REMOVE
-					|| msg.getEventType() == Notification.SET) {
-				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getConverterType_ConverterId()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getConverterType_ConverterClass()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getConverterType_ConverterForClass()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getConverterType_Description()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getConverterType_DisplayName()) {
-					refresh();
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getDisplayNameType_TextContent()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getDescriptionType_TextContent()) {
-					refresh();
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ConverterMasterSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ConverterMasterSection.java
deleted file mode 100644
index 054fff7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ConverterMasterSection.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class ConverterMasterSection extends FacesConfigMasterSection {
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page
-	 */
-	public ConverterMasterSection(Composite parent, IManagedForm managedForm,
-			FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		super(parent, managedForm, toolkit, page, null, null);
-		getSection().setText(EditorMessages.ConverterMasterSection_Name); //$NON-NLS-1$
-		getSection().setDescription(
-				EditorMessages.ConverterMasterSection_Description);
-	}
-
-	/**
-	 * Config the table viwer, set a filter for it, only the object of
-	 * ConverterType will be selected.
-	 */
-	protected void configViewer(StructuredViewer structuredViewer) {
-		super.configViewer(structuredViewer);
-		structuredViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getConverterType()
-						.isInstance(element);
-			}
-		});
-
-	}
-
-	/**
-	 * Create a new Converter.
-	 */
-	protected void addButtonSelected(SelectionEvent e) {
-		ConverterType Converter = FacesConfigFactory.eINSTANCE
-				.createConverterType();
-
-		Command command = AddCommand.create(getEditingDomain(),
-				this.getInput(), FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_Converter(), Converter);
-
-		if (command.canExecute()) {
-			getEditingDomain().getCommandStack().execute(command);
-			IStructuredSelection selection = new StructuredSelection(Converter);
-			getStructuredViewer().refresh();
-			getStructuredViewer().setSelection(selection);
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FacesConfigMasterSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FacesConfigMasterSection.java
deleted file mode 100644
index baa845c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FacesConfigMasterSection.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * An default implementation of AbstractFacesConfigSection for Master Section.
- * 
- * @author sfshi
- * 
- */
-public abstract class FacesConfigMasterSection extends AbstractFacesConfigSection {
-
-	private StructuredViewer structuredViewer;
-
-	private Button removeButton;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public FacesConfigMasterSection(Composite parent, IManagedForm managedForm,
-			FormToolkit toolkit, FacesConfigMasterDetailPage page,
-			String helpContextId, String helpTooltip) {
-		super(parent, managedForm, page, toolkit, helpContextId, helpTooltip);
-	}
-
-	/**
-	 * 
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = layout.marginHeight = 5;
-		container.setLayout(layout);
-		structuredViewer = createViewer(container, toolkit);
-		structuredViewer.addSelectionChangedListener(this);
-		createOperationSection(container, toolkit);
-	}
-
-	/**
-	 * Create the structured viewer, set up content & label provider for it.
-	 * Defaultly create a tableviewer.
-	 * 
-	 * @param parent
-	 * @param toolkit
-	 * @return the structured viewer
-	 */
-	protected StructuredViewer createViewer(Composite parent,
-			FormToolkit toolkit) {
-		Composite tableContainer = toolkit.createComposite(parent);
-		toolkit.paintBordersFor(tableContainer);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.heightHint = 200;
-		tableContainer.setLayoutData(gd);
-		GridLayout layout = new GridLayout();
-		tableContainer.setLayout(layout);
-
-		TableViewer tableViewer = new TableViewer(tableContainer, SWT.SINGLE
-				| SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		gd = new GridData(GridData.FILL_BOTH);
-		tableViewer.getControl().setLayoutData(gd);
-
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-
-		configViewer(tableViewer);
-
-		return tableViewer;
-	}
-
-	/**
-	 * Config the viewer, such as set a filter and so on. Sub classes should
-	 * override this method to add filter.
-	 * 
-	 * @param viewer
-	 */
-	protected void configViewer(StructuredViewer viewer) {
-        // do nothing; subs may override
-	}
-
-	/**
-	 * Defaultly we create a "New" button and a "Remove" button. Sub classes can
-	 * overwrite this method if need other functions.
-	 * 
-	 * @param parent
-	 * @param toolkit
-	 */
-	protected void createOperationSection(Composite parent, FormToolkit toolkit) {
-		Composite operationContainer = toolkit.createComposite(parent);
-		GridData gd = new GridData(GridData.FILL_VERTICAL);
-		operationContainer.setLayoutData(gd);
-		GridLayout layout = new GridLayout();
-
-		operationContainer.setLayout(layout);
-
-		Button addButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Add, SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected(e);
-			}
-		});
-
-		setRemoveButton(toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Remove, SWT.PUSH));
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		getRemoveButton().setLayoutData(gd);
-		getRemoveButton().addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected(e);
-			}
-		});
-	}
-    
-    /**
-	 * 
-	 * @param e
-	 */
-    protected abstract void addButtonSelected(SelectionEvent e);
-
-	/**
-	 * 
-	 * @param e
-	 */
-	protected void removeButtonSelected(SelectionEvent e) {
-
-		IStructuredSelection ssel = StructuredSelection.EMPTY;
-		ISelection selection = getSelection();
-		if (selection instanceof IStructuredSelection) {
-			ssel = (IStructuredSelection) selection;
-		}
-
-		if (!ssel.isEmpty()) {
-			List commands = new ArrayList(ssel.size());
-			for (Iterator iter = ssel.iterator(); iter.hasNext();) {
-				EObject element = (EObject) iter.next();
-				Command command = RemoveCommand.create(getEditingDomain(),
-						element);
-				commands.add(command);
-			}
-
-			CompoundCommand command = new CompoundCommand(commands);
-			if (command.canExecute()) {
-				getEditingDomain().getCommandStack().execute(command);
-			}
-		}
-
-	}
-
-	/**
-	 * 
-	 * update the buttons' enable state.
-	 */
-	protected void updateButtons() {
-		IStructuredSelection ssel = (IStructuredSelection) structuredViewer
-				.getSelection();
-
-		getRemoveButton().setEnabled(!ssel.isEmpty());
-	}
-
-	/**
-	 * 
-	 */
-	public ISelection getSelection() {
-		return structuredViewer.getSelection();
-	}
-
-	/**
-	 * 
-	 */
-	public void setSelection(ISelection selection) {
-		structuredViewer.setSelection(selection);
-	}
-
-	/**
-	 * refresh the display of this section.
-	 */
-	public void refresh() {
-		super.refresh();
-		structuredViewer.refresh();
-		updateButtons();
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		// master section refresh all:
-		setViewerInput(getInput());
-		updateButtons();
-
-		// detial sections refresh:
-		// fire an event to the detail sections, let them
-		// refresh.
-		selectionChanged(null);
-	}
-
-	/**
-	 * set the structuredViewer's input
-	 * 
-	 * @param input
-	 */
-	private void setViewerInput(Object input) {
-		structuredViewer.setInput(input);
-	}
-
-	/**
-	 * 
-	 */
-	protected void expansionStateChanged(boolean expanded) {
-		if (expanded) {
-			if (structuredViewer.getInput() == null) {
-				refreshAll();
-			}
-			structuredViewer.refresh(true);
-			structuredViewer.setSelection(structuredViewer.getSelection());
-		} else {
-			structuredViewer.setSelection(null);
-		}
-		super.expansionStateChanged(expanded);
-	}
-
-	/**
-	 * 
-	 */
-	protected void expansionStateChanging(boolean expanding) {
-		if (!expanding) {
-			GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-			this.getSection().setLayoutData(gd);
-		} else {
-			((FacesConfigMasterDetailPage) getPage()).closeOtherSections(this);
-
-			GridData gd = new GridData(GridData.FILL_BOTH);
-			this.getSection().setLayoutData(gd);
-		}
-
-		super.expansionStateChanging(expanding);
-	}
-
-	/**
-	 * get the viewer.
-	 * 
-	 * @return the viewer
-	 */
-	public StructuredViewer getStructuredViewer() {
-		return structuredViewer;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		super.selectionChanged(event);
-		updateButtons();
-	}
-
-    private void setRemoveButton(Button removeButton) {
-        this.removeButton = removeButton;
-    }
-
-    /**
-     * @return the remove button
-     */
-    protected Button getRemoveButton() {
-        return removeButton;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FacetSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FacetSection.java
deleted file mode 100644
index 7bcb10a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FacetSection.java
+++ /dev/null
@@ -1,451 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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;
-
-public class FacetSection extends AbstractFacesConfigSection {
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private TableViewer tableViewer;
-
-	private Button removeButton;
-
-	private Button editButton;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public FacetSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		this.getSection().setText(EditorMessages.FacetSection_Name);
-		this.getSection().setDescription(
-				EditorMessages.FacetSection_Description);
-
-	}
-
-	/**
-	 * 
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		GridLayout gl = new GridLayout();
-		gl.horizontalSpacing = 0;
-		gl.marginWidth = 0;
-		gl.numColumns = 2;
-		container.setLayout(gl);
-		GridData td = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-
-		Composite facetSection = toolkit.createComposite(container);
-		GridLayout gl2 = new GridLayout();
-		gl2.horizontalSpacing = 0;
-		gl2.marginWidth = 0;
-		gl2.numColumns = 2;
-		facetSection.setLayout(gl2);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		facetSection.setLayoutData(gd);
-
-		createTableSection(facetSection, toolkit);
-		createButtonsSection(facetSection, toolkit);
-
-	}
-
-	/**
-	 * create facet table section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createTableSection(Composite container, FormToolkit toolkit) {
-		Composite tableContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_HORIZONTAL);
-		tableContainer.setLayoutData(gd);
-		toolkit.paintBordersFor(tableContainer);
-
-		GridLayout gl = new GridLayout();
-		tableContainer.setLayout(gl);
-
-		Table table = new Table(tableContainer, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		table.setLayoutData(gd);
-
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		table.setLayout(layout);
-
-		TableColumn facetNameCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		facetNameCol
-				.setText(EditorMessages.FacetSection_Table_FacetNameColumn);
-		TableColumn displayNameCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		displayNameCol
-				.setText(EditorMessages.FacetSection_Table_DisplayNameColumn);//$NON-NLS-1$
-
-		TableColumn descriptionCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		descriptionCol
-				.setText(EditorMessages.FacetSection_Table_DescriptionColumn);
-
-		table.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateButtons();
-			}
-		});
-
-		table.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected();
-			}
-		});
-
-		tableViewer = new TableViewer(table);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getFacetType().isInstance(
-						element);
-			}
-		});
-		
-		tableViewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * create buttons
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createButtonsSection(Composite container, FormToolkit toolkit) {
-		// create operation buttons's container
-		Composite operationContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_VERTICAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		operationContainer.setLayoutData(gd);
-		GridLayout gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Add_more, //$NON-NLS-1$
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		editButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Edit_more, //$NON-NLS-1$
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-
-		removeButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Remove, //$NON-NLS-1$
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected();
-			}
-		});
-
-		editButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected();
-			}
-		});
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-		});
-	}
-
-	/**
-	 * refresh the table viewer and update buttons.
-	 */
-	public void refresh() {
-		super.refresh();
-		tableViewer.refresh();
-		updateButtons();
-	}
-
-	public void refreshAll() {
-		tableViewer.setInput(getInput());
-		updateButtons();
-	}
-
-	/**
-	 * Update the buttons' enable status.
-	 */
-	private void updateButtons() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/**
-	 * add a facet.
-	 * 
-	 */
-	private void addButtonSelected() {
-
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditFacetDialog dialog = new AddEditFacetDialog(shell, true);
-		if (dialog.open() == Dialog.OK) {
-
-			String newFacetName = dialog.getFacetName();
-			String newDisplayName = dialog.getDisplayName();
-			String newDescription = dialog.getDescription();
-
-			FacetType newFacet = FacesConfigFactory.eINSTANCE.createFacetType();
-			if (newFacetName.length() > 0) {
-				FacetNameType facetNameType = FacesConfigFactory.eINSTANCE
-						.createFacetNameType();
-				facetNameType.setTextContent(newFacetName);
-				newFacet.setFacetName(facetNameType);
-			}
-
-			if (newDisplayName.length() > 0) {
-				DisplayNameType displayNameType = FacesConfigFactory.eINSTANCE
-						.createDisplayNameType();
-				displayNameType.setTextContent(newDisplayName);
-				newFacet.getDisplayName().add(displayNameType);
-			}
-
-			if (newDescription.length() > 0) {
-				DescriptionType descriptionType = FacesConfigFactory.eINSTANCE
-						.createDescriptionType();
-				descriptionType.setTextContent(newDescription);
-				newFacet.getDescription().add(descriptionType);
-			}
-
-			Command addCommand = AddCommand.create(this.getEditingDomain(),
-					getInput(), FacesConfigPackage.eINSTANCE
-							.getComponentType_Facet(), newFacet);
-			if (addCommand.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(addCommand);
-
-			}
-		}
-
-	}
-
-	/**
-	 * edit a facet.
-	 * 
-	 */
-	private void editButtonSelected() {
-		FacetType facet = (FacetType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(facet);
-
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditFacetDialog dialog = new AddEditFacetDialog(shell, false);
-		if (facet.getFacetName() != null)
-			dialog.setFacetName(facet.getFacetName().getTextContent());
-
-		if (facet.getDisplayName().size() > 0) {
-			dialog.setDisplayName(((DisplayNameType) facet.getDisplayName()
-					.get(0)).getTextContent());
-		}
-
-		if (facet.getDescription().size() > 0) {
-			dialog.setDescription(((DescriptionType) facet.getDescription()
-					.get(0)).getTextContent());
-		}
-
-		if (dialog.open() == Dialog.OK) {
-			List commands = new ArrayList(3);
-
-			String newFacetName = dialog.getFacetName();
-			String newDisplayName = dialog.getDisplayName();
-			String newDescription = dialog.getDescription();
-			if (facet.getFacetName() != null) {
-				Command cmd1 = SetCommand.create(getEditingDomain(), facet
-						.getFacetName(), FacesConfigPackage.eINSTANCE
-						.getFacetNameType_TextContent(), newFacetName);
-				commands.add(cmd1);
-			} else if (newFacetName.length() > 0) {
-				FacetNameType newFacetNameType = FacesConfigFactory.eINSTANCE
-						.createFacetNameType();
-				newFacetNameType.setTextContent(newFacetName);
-				Command cmd2 = AddCommand.create(getEditingDomain(), facet,
-						FacesConfigPackage.eINSTANCE.getFacetType_FacetName(),
-						newFacetNameType);
-				commands.add(cmd2);
-			}
-
-			if (facet.getDisplayName().size() > 0) {
-				DisplayNameType displayNameType = (DisplayNameType) facet
-						.getDisplayName().get(0);
-				Command cmd3 = SetCommand.create(this.getEditingDomain(),
-						displayNameType, FacesConfigPackage.eINSTANCE
-								.getDisplayNameType_TextContent(),
-						newDisplayName);
-				commands.add(cmd3);
-			} else if (newDisplayName.length() > 0) {
-				DisplayNameType newDisplayNameType = FacesConfigFactory.eINSTANCE
-						.createDisplayNameType();
-				newDisplayNameType.setTextContent(newDisplayName);
-				Command cmd4 = AddCommand
-						.create(this.getEditingDomain(), facet,
-								FacesConfigPackage.eINSTANCE
-										.getFacetType_DisplayName(),
-								newDisplayNameType);
-				commands.add(cmd4);
-			}
-
-			if (facet.getDescription().size() > 0) {
-				DescriptionType descriptionType = (DescriptionType) facet
-						.getDescription().get(0);
-				Command cmd5 = SetCommand.create(this.getEditingDomain(),
-						descriptionType, FacesConfigPackage.eINSTANCE
-								.getDescriptionType_TextContent(),
-						newDescription);
-				commands.add(cmd5);
-			} else if (newDescription.length() > 0) {
-				DescriptionType newDescriptionType = FacesConfigFactory.eINSTANCE
-						.createDescriptionType();
-				newDescriptionType.setTextContent(newDescription);
-				Command cmd6 = AddCommand
-						.create(this.getEditingDomain(), facet,
-								FacesConfigPackage.eINSTANCE
-										.getFacetType_Description(),
-								newDescriptionType);
-				commands.add(cmd6);
-			}
-
-			CompoundCommand command = new CompoundCommand(commands);
-			if (command.canExecute()) {
-				getEditingDomain().getCommandStack().execute(command);
-				tableViewer.refresh(facet);
-			}
-		}
-
-	}
-
-	/**
-	 * remove a facet.
-	 * 
-	 */
-	private void removeButtonSelected() {
-		FacetType facet = (FacetType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(facet);
-		Command removeCommand = RemoveCommand.create(this.getEditingDomain(),
-				getInput(), FacesConfigPackage.eINSTANCE
-						.getComponentType_Facet(), facet);
-
-		if (removeCommand.canExecute()) {
-			this.getEditingDomain().getCommandStack().execute(removeCommand);
-			refreshAll();
-		}
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return tableViewer.getSelection();
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-
-		tableViewer.setSelection(selection);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FactorySection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FactorySection.java
deleted file mode 100644
index 2ffe62a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FactorySection.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.jdt.ui.IJavaElementSearchConstants;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryType;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.DialogUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ModelUtil;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Zhi-peng Zhang, sfshi
- * @version
- */
-public class FactorySection extends OthersPageBaseSection {
-	/** The Eclass object this Section operated */
-	private EClass factoryChildClass;
-
-	/**
-	 * 
-	 * @param factoryChildClass
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public FactorySection(EClass factoryChildClass, Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page,
-			FormToolkit toolkit, String helpContextId, String helpTooltip) {
-		super(parent, managedForm, page, toolkit, helpContextId, helpTooltip);
-		this.factoryChildClass = factoryChildClass;
-	}
-
-	/**
-	 * 
-	 * @param factoryChildClass
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public FactorySection(EClass factoryChildClass, Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		this(factoryChildClass, parent, managedForm, page, toolkit, null, null);
-	}
-
-	/**
-	 * @return an new object which is instance of <code>factoryChildClass</code>.
-	 */
-	public EObject createFactoryChildObject() {
-		String superType = ModelUtil.getSuperType(factoryChildClass);
-		IProject project = (IProject) this.getPage().getEditor().getAdapter(
-				IProject.class);
-		String result = DialogUtil.openClassDialog(getSection().getShell(),
-				project, superType,
-				IJavaElementSearchConstants.CONSIDER_ALL_TYPES);
-
-		if (result != null) {
-			EObject component = FacesConfigFactory.eINSTANCE
-					.create(factoryChildClass);
-			// set the text content value.
-			EStructuralFeature feature = factoryChildClass
-					.getEStructuralFeatures().get(0);
-			component.eSet(feature, result);
-			return component;
-		}
-		return null;
-	}
-
-	/**
-	 * Set the <factory> element as the structuredViewer's input.
-	 * 
-	 * @param input
-	 */
-	protected void setViewerInput(Object input) {
-		if (input instanceof FactoryType) {
-			tableViewer.setInput(input);
-		} else
-			tableViewer.setInput(null);
-	}
-
-	/**
-	 * Add a filter on the table viewer. Only the elements that is a instance of
-	 * <code>factoryChildClass</code> could be selected.
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return factoryChildClass.isInstance(element);
-			}
-		});
-	}
-
-	/**
-	 * Perform some actions to create new child object and append it to the
-	 * <factory> element.
-	 */
-	void addButtonSelected(SelectionEvent e) {
-		/** Create a new object which is instance of factoryChildClass. */
-		EObject obj = createFactoryChildObject();
-		if (obj != null) {
-			boolean needRefreshAll = false;
-			Command command = null;
-			if (getInput() instanceof FactoryType) {
-				/**
-				 * The input is a <factory> element and not null, append the new
-				 * object to it.
-				 */
-				FactoryType factory = (FactoryType) getInput();
-				command = AddCommand.create(getEditingDomain(), factory, null,
-						obj);
-			} else {
-				/**
-				 * The input is null, create a <factory> element and append it
-				 * to <faces-config>.
-				 */
-				needRefreshAll = true;
-				List list = new ArrayList(2);
-				FactoryType factory = FacesConfigFactory.eINSTANCE
-						.createFactoryType();
-				Command cmd1 = AddCommand.create(getEditingDomain(), factory,
-						null, obj);
-				list.add(cmd1);
-				Command cmd2 = AddCommand.create(getEditingDomain(), this
-						.getPage().getInput(), null, factory);
-				list.add(cmd2);
-				command = new CompoundCommand(list);
-			}
-
-			if (command.canExecute()) {
-				getEditingDomain().getCommandStack().execute(command);
-				if (needRefreshAll)
-					((OthersPage) this.getPage()).resetFactoryInput();
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/IDialogFieldGroup.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/IDialogFieldGroup.java
deleted file mode 100644
index 5c5b7c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/IDialogFieldGroup.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-/**
- * This interface is used to build relation between model SSEModel and
- * controller DialogFieldGroup
- * 
- * @author Xiao-guang Zhang
- * @version
- */
-public interface IDialogFieldGroup {
-	/**
-	 * set the input of this section
-	 * 
-	 * @param newInput
-	 */
-	void setInput(Object newInput);
-
-	/**
-	 * @return the input of this section 
-	 */
-	Object getInput();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/IFacesConfigSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/IFacesConfigSection.java
deleted file mode 100644
index 4fb65dc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/IFacesConfigSection.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-
-/**
- * Section interface to build relation between model and adapter
- * 
- * @author sfshi
- * 
- */
-public interface IFacesConfigSection {
-	/**
-	 * set the input of this section
-	 * 
-	 * @param newInput
-	 */
-	void setInput(Object newInput);
-
-	/**
-	 * @return the input of this section
-	 */
-	Object getInput();
-	
-	/**
-	 * initialize current section based on the input
-	 * 
-	 */
-	void initialize();
-
-	/**
-	 * clear all section's contents.
-	 * 
-	 */
-	void clearAll();
-
-	/**
-	 * refresh the needed parts of the section
-	 * 
-	 */
-	void refresh();
-
-	/**
-	 * refresh all parts of the section
-	 * 
-	 */
-	void refreshAll();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/InitializationSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/InitializationSection.java
deleted file mode 100644
index db1dcb4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/InitializationSection.java
+++ /dev/null
@@ -1,363 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.RadiosDialogField;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.part.PageBook;
-
-/**
- * This section handles managed bean's initialization, including general class
- * type, map and list type managed bean.
- * 
- * @author Xiao-guang Zhang, sfshi
- */
-public class InitializationSection extends AbstractFacesConfigSection {
-	private static final String MANAGEDBEAN_GENERAL_CLASS = EditorMessages.InitializationSection_ClassType_General;
-
-	private static final String MANAGEDBEAN_MAP = EditorMessages.InitializationSection_ClassType_Map;
-
-	private static final String MANAGEDBEAN_LIST = EditorMessages.InitializationSection_ClassType_List;
-
-	/** property initiliazation container composite */
-	private Composite propertySection;
-
-	/** property initiliazation DialogFieldGroup */
-	private ManagedPropertyEditGroup managedPropertyGroup;
-
-	/** map entries initiliazation container composite */
-	private Composite mapSection;
-
-	/** map entries initiliazation DialogFieldGroup */
-	private MapEntriesEditGroup mapEntryGroup;
-
-	/** list entries initiliazation container composite */
-	private Composite listSection;
-
-	/** list entries initiliazation DialogFieldGroup */
-	private ListEntriesEditGroup listEntryGroup;
-
-	/** the PageBook control for three kinds of managed bean */
-	private PageBook pageBook;
-
-	/** RadiosDialogField for three kinds of managed bean */
-	private RadiosDialogField beanTypeField;
-
-	/** current pages selection */
-	private int currentPageIndex = 0;
-
-	/**
-	 * @param parent 
-	 * @param managedForm
-	 * @param page 
-	 * @param toolkit
-	 */
-	public InitializationSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null); //$NON-NLS-1$
-		getSection().setText(EditorMessages.InitializationSection_Name); //$NON-NLS-1$
-		getSection().setDescription(
-				EditorMessages.InitializationSection_Description); //$NON-NLS-1$
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.managedbean.sections.BaseSectionPart#createClient(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.ui.forms.widgets.FormToolkit)
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		int numberOfColumns = 3;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		gl.horizontalSpacing = 0;
-		gl.marginWidth = 0;
-		container.setLayout(gl);
-		toolkit.paintBordersFor(container);
-
-		createBeanTypeEntry(container, toolkit, numberOfColumns);
-		createInitializationEntry(container, toolkit, numberOfColumns);
-	}
-
-	/**
-	 * create the bean type selection section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createBeanTypeEntry(Composite container, FormToolkit toolkit,
-			int numberOfColumns) {
-		beanTypeField = new RadiosDialogField();
-		String[] items = { MANAGEDBEAN_GENERAL_CLASS, MANAGEDBEAN_MAP,
-				MANAGEDBEAN_LIST };
-		beanTypeField
-				.setLabelText(EditorMessages.InitializationSection_ClassType);
-		beanTypeField.setItems(items);
-		beanTypeField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		beanTypeField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						RadiosDialogField beanTypeField1 = (RadiosDialogField) field;
-
-						boolean bChangedSuccess = false;
-						if (beanTypeField1.getSelectedIndex() == 0) {
-							bChangedSuccess = switchPage(
-									IFacesConfigConstants.MANAGED_PROPERTY,
-									false);
-						} else if (beanTypeField1.getSelectedIndex() == 1) {
-							bChangedSuccess = switchPage(
-									IFacesConfigConstants.MAP_ENTRIES, false);
-						} else if (beanTypeField1.getSelectedIndex() == 2) {
-							bChangedSuccess = switchPage(
-									IFacesConfigConstants.LIST_ENTRIES, false);
-						}
-
-						if (bChangedSuccess) {
-							currentPageIndex = beanTypeField1.getSelectedIndex();
-						} else {
-							beanTypeField1.setSelectedIndexWithoutUpdate(-1);
-							beanTypeField1
-									.setSelectedIndexWithoutUpdate(currentPageIndex);
-						}
-					}
-				});
-	}
-
-	/**
-	 * switch to general property, map-entries, or list-entries group If
-	 * bForceClear equals to true, the others page will be cleared without user
-	 * confirmation. if bForceClear equals to false, the confirmation dialog
-	 * will pop up and let user determine whether this page is cleared or not.
-	 * 
-	 * @param pageID -
-	 *            IFacesConfigConstants.MANAGED_PROPERTY,
-	 *            MAP_ENTRIES,LIST_ENTRIES
-	 * @param bForceClearOthers -
-	 *            Force to clear other pages.
-	 */
-	private boolean switchPage(String pageID, boolean bForceClearOthers) {
-		if (pageID == IFacesConfigConstants.MANAGED_PROPERTY) {
-			if (clearPage(IFacesConfigConstants.MAP_ENTRIES, bForceClearOthers)
-					&& clearPage(IFacesConfigConstants.LIST_ENTRIES,
-							bForceClearOthers)) {
-				managedPropertyGroup.refreshAll();
-				pageBook.showPage(propertySection);
-				// FIXME: there should be some other methods to resize the whole
-				// section.
-				InitializationSection.this.getSection().setExpanded(false);
-				InitializationSection.this.getSection().setExpanded(true);
-				return true;
-			}
-		} else if (pageID == IFacesConfigConstants.MAP_ENTRIES) {
-			if (clearPage(IFacesConfigConstants.MANAGED_PROPERTY,
-					bForceClearOthers)
-					&& clearPage(IFacesConfigConstants.LIST_ENTRIES,
-							bForceClearOthers)) {
-				mapEntryGroup.refreshAll();
-				pageBook.showPage(mapSection);
-				// FIXME: there should be some other methods to resize the whole
-				// section.
-				InitializationSection.this.getSection().setExpanded(false);
-				InitializationSection.this.getSection().setExpanded(true);
-				return true;
-			}
-		} else if (pageID == IFacesConfigConstants.LIST_ENTRIES) {
-			if (clearPage(IFacesConfigConstants.MANAGED_PROPERTY,
-					bForceClearOthers)
-					&& clearPage(IFacesConfigConstants.MAP_ENTRIES,
-							bForceClearOthers)) {
-				listEntryGroup.refreshAll();
-				pageBook.showPage(listSection);
-				// FIXME: there should be some other methods to resize the whole
-				// section.
-				InitializationSection.this.getSection().setExpanded(false);
-				InitializationSection.this.getSection().setExpanded(true);
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * clear one specified page according to pageID if bForceClear equals to
-	 * false, the confirmation dialog will pop up and let user determine whether
-	 * this page is cleared or not.
-	 * 
-	 * @param pageID -
-	 *            IFacesConfigConstants.MANAGED_PROPERTY,
-	 *            MAP_ENTRIES,LIST_ENTRIES
-	 * @param bForceClear -
-	 *            force to clear current page.
-	 * @return
-	 */
-	private boolean clearPage(String pageID, boolean bForceClear) {
-		ManagedBeanType managedBean = (ManagedBeanType) getInput();
-
-		if (pageID == IFacesConfigConstants.MANAGED_PROPERTY) {
-			if (managedBean.getManagedProperty().size() == 0) {
-				return true;
-			}
-
-			if (bForceClear
-					|| EditorPlugin
-							.getAlerts()
-							.confirm(
-									"ManagedBeanInitializationSection.Remove.Title",
-									"ManagedBeanInitializationSection.RemoveManagedProperty")) {
-				Command cmd = SetCommand.create(this.getEditingDomain(),
-						managedBean, FacesConfigPackage.eINSTANCE
-								.getManagedBeanType_ManagedProperty(),
-						SetCommand.UNSET_VALUE);
-				if (cmd.canExecute()) {
-					getEditingDomain().getCommandStack().execute(cmd);
-					return true;
-				}
-
-				return false;
-			}
-		} else if (pageID == IFacesConfigConstants.MAP_ENTRIES) {
-			if (managedBean.getMapEntries() == null) {
-				return true;
-			}
-
-			if (bForceClear
-					|| EditorPlugin
-							.getAlerts()
-							.confirm(
-									"ManagedBeanInitializationSection.Remove.Title",
-									"ManagedBeanInitializationSection.RemoveMapEntries")) {
-				Command cmd = SetCommand.create(this.getEditingDomain(),
-						managedBean, FacesConfigPackage.eINSTANCE
-								.getManagedBeanType_MapEntries(),
-						SetCommand.UNSET_VALUE);
-				if (cmd.canExecute()) {
-					getEditingDomain().getCommandStack().execute(cmd);
-					return true;
-				}
-			}
-		} else if (pageID == IFacesConfigConstants.LIST_ENTRIES) {
-			if (managedBean.getListEntries() == null) {
-				return true;
-			}
-
-			if (bForceClear
-					|| EditorPlugin
-							.getAlerts()
-							.confirm(
-									"ManagedBeanInitializationSection.Remove.Title",
-									"ManagedBeanInitializationSection.RemoveListEntries")) {
-				Command cmd = SetCommand.create(this.getEditingDomain(),
-						managedBean, FacesConfigPackage.eINSTANCE
-								.getManagedBeanType_ListEntries(),
-						SetCommand.UNSET_VALUE);
-				if (cmd.canExecute()) {
-					getEditingDomain().getCommandStack().execute(cmd);
-					return true;
-				}
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * create property initialization section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createInitializationEntry(Composite container,
-			FormToolkit toolkit, int numberOfColumns) {
-		pageBook = new PageBook(container, SWT.NONE);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = numberOfColumns;
-		pageBook.setLayoutData(gd);
-		toolkit.paintBordersFor(pageBook);
-
-		managedPropertyGroup = new ManagedPropertyEditGroup(this);
-		managedPropertyGroup.initialize();
-		managedPropertyGroup.addSelectionChangedListener(this);
-		
-		mapEntryGroup = new MapEntriesEditGroup(this);
-		mapEntryGroup.initialize();
-		mapEntryGroup.addSelectionChangedListener(this);
-		
-		listEntryGroup = new ListEntriesEditGroup(this);
-		listEntryGroup.initialize();
-		listEntryGroup.addSelectionChangedListener(this);
-		
-		propertySection = toolkit.createComposite(pageBook);
-		GridLayout gl = new GridLayout();
-		gl.horizontalSpacing = 0;
-		gl.marginWidth = 0;
-		propertySection.setLayout(gl);
-		gd = new GridData(GridData.FILL_BOTH);
-		propertySection.setLayoutData(gd);
-		managedPropertyGroup.layoutDialogFields(toolkit, propertySection);
-		
-		mapSection = toolkit.createComposite(pageBook);
-		mapEntryGroup.layoutDialogFields(toolkit, mapSection);
-		
-		listSection = toolkit.createComposite(pageBook);
-		listEntryGroup.layoutDialogFields(toolkit, listSection);
-		
-		pageBook.showPage(propertySection);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.managedbean.sections.ISSESection#setInput(java.lang.Object)
-	 */
-	public void setInput(Object newInput) {
-		super.setInput(newInput);
-		refreshAll();
-	}
-
-	public void refreshAll() {
-		if (getInput() instanceof ManagedBeanType) {
-			ManagedBeanType managedBean = (ManagedBeanType) getInput();
-			managedPropertyGroup.setInput(managedBean);
-			mapEntryGroup.setInput(managedBean);
-			listEntryGroup.setInput(managedBean);
-			if (managedBean.getManagedProperty().size() > 0) {
-				beanTypeField.setSelectedIndexWithoutUpdate(-1);
-				beanTypeField.setSelectedIndex(0);
-			} else if (managedBean.getMapEntries() != null) {
-				beanTypeField.setSelectedIndexWithoutUpdate(-1);
-				beanTypeField.setSelectedIndex(1);
-			} else if (managedBean.getListEntries() != null) {
-				beanTypeField.setSelectedIndexWithoutUpdate(-1);
-				beanTypeField.setSelectedIndex(2);
-			} else {
-				beanTypeField.setSelectedIndexWithoutUpdate(-1);
-				beanTypeField.setSelectedIndex(0);
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/LifecycleSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/LifecycleSection.java
deleted file mode 100644
index 2c694c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/LifecycleSection.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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);
-	}
-
-	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 1f62382..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ListEntriesEditGroup.java
+++ /dev/null
@@ -1,630 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldBase;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.EditValueDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * ListEntries editing DialogFieldGroup
- * 
- * @author Xiao-guang Zhang, sfshi
- * @version
- */
-public class ListEntriesEditGroup extends DialogFieldGroup implements
-		IDialogFieldGroup, ISelectionProvider, ISelectionChangedListener {
-
-	private ClassButtonDialogField valueClassField;
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private IProject currentProject;
-
-	private TableViewer tableViewer;
-
-	private Button removeButton;
-
-	private Button editButton;
-
-	private ManagedBeanType managedBean;
-
-	private AbstractFacesConfigSection section;
-
-	private List selectionChangedListeners = new ArrayList();
-
-	/**
-	 * @param section 
-	 */
-	public ListEntriesEditGroup(AbstractFacesConfigSection section) {
-		super();
-		this.section = section;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-	    // TODO: initialize?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#refreshData()
-	 */
-	public void refreshData() {
-        // TODO: initialize?
-    }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#layoutDialogFields(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public void layoutDialogFields(FormToolkit toolkit, Composite parent) {
-		GridData data = new GridData(GridData.FILL_BOTH);
-		parent.setLayoutData(data);
-
-		GridLayout gl = new GridLayout();
-		gl.verticalSpacing = 0;
-		gl.marginHeight = 0;
-		parent.setLayout(gl);
-
-		layoutListTypeSelectionSection(toolkit, parent);
-
-		createAndLayoutListValueSection(toolkit, parent);
-	}
-
-	/**
-	 * 
-	 */
-	private void layoutListTypeSelectionSection(FormToolkit toolkit,
-			Composite container) {
-		Composite typeSelectionSection = null;
-		if (toolkit != null) {
-			typeSelectionSection = toolkit.createComposite(container);
-			toolkit.paintBordersFor(typeSelectionSection);
-		} else {
-			typeSelectionSection = SWTUtils
-					.createComposite(container, SWT.NONE);
-		}
-
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		typeSelectionSection.setLayoutData(gd);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		typeSelectionSection.setLayout(gl);
-		valueClassField = new ClassButtonDialogField(getProject());
-
-		valueClassField
-				.setLabelText(EditorMessages.InitializationSection_MapType_ValueClass);//$NON-NLS-1$
-		valueClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						ManagedBeanType managedBean_ = (ManagedBeanType) getInput();
-						String className = ((ClassButtonDialogField) field)
-								.getText();
-						ValueClassType valueClass = FacesConfigFactory.eINSTANCE
-								.createValueClassType();
-						valueClass.setTextContent(className);
-						EditingDomain editingDomain = section
-								.getEditingDomain();
-						Command cmd;
-						boolean isNew;
-						if (managedBean_.getListEntries() == null) {
-							isNew = true;
-							ListEntriesType listEntries = FacesConfigFactory.eINSTANCE
-									.createListEntriesType();
-							listEntries.setValueClass(valueClass);
-							cmd = SetCommand.create(editingDomain, managedBean_,
-									FacesConfigPackage.eINSTANCE
-											.getManagedBeanType_ListEntries(),
-									listEntries);
-						} else {
-							isNew = false;
-							ListEntriesType listEntries = managedBean_
-									.getListEntries();
-							cmd = SetCommand.create(editingDomain, listEntries,
-									FacesConfigPackage.eINSTANCE
-											.getListEntriesType_ValueClass(),
-									valueClass);
-						}
-
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-							if (isNew)
-								refreshAll();
-						}
-
-					}
-				});
-		valueClassField.doFillIntoGrid(toolkit, typeSelectionSection,
-				numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(valueClassField.getTextControl(
-				toolkit, container));
-	}
-
-	/**
-	 * @param toolkit
-	 * @param parent
-	 */
-	private void createAndLayoutListValueSection(FormToolkit toolkit,
-			Composite parent) {
-		Composite listValueSection = null;
-		if (toolkit != null) {
-			listValueSection = toolkit.createComposite(parent);
-			toolkit.paintBordersFor(listValueSection);
-		} else {
-			listValueSection = SWTUtils.createComposite(parent, SWT.NONE);
-		}
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		listValueSection.setLayoutData(gd);
-
-		int numberOfColumns = 3;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		listValueSection.setLayout(gl);
-		DialogFieldBase valuesTitle = new DialogFieldBase();
-		valuesTitle
-				.setLabelText(EditorMessages.InitializationSection_MapTable_Title);//$NON-NLS-1$    
-		valuesTitle.doFillIntoGrid(toolkit, listValueSection, numberOfColumns);
-
-		// list's value table
-		Table listTable;
-		if (toolkit == null) {
-			listTable = new Table(listValueSection, SWT.H_SCROLL | SWT.V_SCROLL
-					| SWT.FULL_SELECTION | SWT.BORDER);
-		} else {
-			listTable = new Table(listValueSection, SWT.H_SCROLL | SWT.V_SCROLL
-					| SWT.FULL_SELECTION | SWT.BORDER);
-		}
-
-		listTable.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				updateButtons();
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				updateButtons();
-			}
-
-		});
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		listTable.setLayoutData(gd);
-		listTable.setHeaderVisible(true);
-		listTable.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		layout.addColumnData(new ColumnWeightData(1, true));
-		listTable.setLayout(layout);
-		TableColumn valueCol = new TableColumn(listTable, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		valueCol
-				.setText(EditorMessages.InitializationSection_MapTable_Value);//$NON-NLS-1$
-		valueCol.setResizable(true);
-
-		listTable.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected();
-			}
-		});
-		tableViewer = new TableViewer(listTable);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				section.getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(section
-				.getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getValueType().isInstance(
-						element)
-						|| FacesConfigPackage.eINSTANCE.getNullValueType()
-								.isInstance(element);
-			}
-		});
-		tableViewer.addSelectionChangedListener(this);
-
-		Composite operationContainer = null;
-		if (toolkit != null) {
-			operationContainer = toolkit.createComposite(listValueSection);
-		} else {
-			operationContainer = SWTUtils.createComposite(listValueSection,
-					SWT.NONE);
-		}
-		gd = new GridData(GridData.FILL_VERTICAL);
-		operationContainer.setLayoutData(gd);
-		gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = null;
-		if (toolkit != null) {
-			addButton = toolkit.createButton(operationContainer,
-					EditorMessages.UI_Button_Add_more, //$NON-NLS-1$
-					SWT.PUSH);
-		} else {
-			addButton = SWTUtils.createPushButton(operationContainer,
-					EditorMessages.UI_Button_Add_more); //$NON-NLS-1$
-		}
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		editButton = null;
-		if (toolkit != null) {
-			editButton = toolkit.createButton(operationContainer,
-					EditorMessages.UI_Button_Edit_more, SWT.PUSH);
-		} else {
-			editButton = SWTUtils.createPushButton(operationContainer,
-					EditorMessages.UI_Button_Edit_more);
-		}
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-
-		removeButton = null;
-		if (toolkit != null) {
-			removeButton = toolkit.createButton(operationContainer,
-					EditorMessages.UI_Button_Remove, //$NON-NLS-1$
-					SWT.PUSH);
-		} else {
-			removeButton = SWTUtils.createPushButton(operationContainer,
-					EditorMessages.UI_Button_Remove); //$NON-NLS-1$
-		}
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected();
-			}
-
-		});
-
-		editButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected();
-			}
-		});
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-		});
-	}
-
-	protected 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);
-				}
-			}
-
-		}
-	}
-
-	protected 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);
-			}
-		}
-	}
-
-	protected 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;
-	}
-
-	public void setProject(IProject project) {
-		currentProject = project;
-	}
-
-	public void updateButtons() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#validateDialogFields()
-	 */
-	public IStatus[] validateDialogFields() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-	    // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		for (Iterator listeners = selectionChangedListeners.iterator(); listeners
-				.hasNext();) {
-			ISelectionChangedListener listener = (ISelectionChangedListener) listeners
-					.next();
-			listener.selectionChanged(new SelectionChangedEvent(this, event
-					.getSelection()));
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/LocaleConfigSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/LocaleConfigSection.java
deleted file mode 100644
index 5183648..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/LocaleConfigSection.java
+++ /dev/null
@@ -1,380 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.DialogUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Zhi-peng Zhang, sfshi
- * @version
- */
-public class LocaleConfigSection extends ApplicationSection implements
-		ICheckStateListener {
-	/**
-	 * 
-	 * @param componentClass
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public LocaleConfigSection(EClass componentClass, Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page,
-			FormToolkit toolkit, String helpContextId, String helpTooltip) {
-		super(componentClass, parent, managedForm, page, toolkit,
-				helpContextId, helpTooltip);
-	}
-
-	/**
-	 * 
-	 * @param componentClass
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public LocaleConfigSection(EClass componentClass, Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		this(componentClass, parent, managedForm, page, toolkit, null, null);
-	}
-
-	/**
-	 * create a CheckboxTableViewer for this section.
-	 */
-	protected TableViewer createTableViewer(Composite parent) {
-		CheckboxTableViewer tableViewer1 = CheckboxTableViewer.newCheckList(
-				parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		tableViewer1.addCheckStateListener(this);
-		tableViewer1.setSorter(new ViewerSorter());
-		return tableViewer1;
-	}
-
-	/**
-	 * Add a filter for this table viewer, only <supported-locale> and
-	 * <default-locale> elements would be listed.
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getSupportedLocaleType()
-						.isInstance(element)
-						|| FacesConfigPackage.eINSTANCE.getDefaultLocaleType()
-								.isInstance(element);
-			}
-		});
-	}
-
-	/**
-	 * Pop up a dialog for user to select a locale string, then create a
-	 * <supported-locale> element with the string as value.
-	 * 
-	 * @return the supported locale object
-	 */
-	public SupportedLocaleType createSupportedLocaleObject() {
-		ArrayList locales = new ArrayList();
-
-		/**
-		 * Compute the locales that already declared in this <locale-config>
-		 * element. If user select a locale that already declared, then a
-		 * warning message will be shown in the dialog.
-		 */
-
-		if (getInput() instanceof ApplicationType
-				&& ((ApplicationType) getInput()).getLocaleConfig().size() > 0) {
-			LocaleConfigType localeConfigType = (LocaleConfigType) ((ApplicationType) getInput())
-					.getLocaleConfig().get(0);
-			if (localeConfigType.getDefaultLocale() != null) {
-				String locale = localeConfigType.getDefaultLocale()
-						.getTextContent();
-				if (locale != null) {
-					locales.add(locale);
-				}
-			}
-			List list = localeConfigType.getSupportedLocale();
-			for (int i = 0, n = list.size(); i < n; i++) {
-				String locale = ((SupportedLocaleType) list.get(i))
-						.getTextContent();
-				if (locale != null) {
-					locales.add(locale);
-				}
-			}
-		}
-		String result = DialogUtil.openLocaleDialog(getSection().getShell(),
-				locales);
-		if (result != null) {
-			SupportedLocaleType component = FacesConfigFactory.eINSTANCE
-					.createSupportedLocaleType();
-			component.setTextContent(result);
-			return component;
-		}
-		return null;
-	}
-
-	/**
-	 * When user click "Add" button on this section, pop up a dialog to create a
-	 * <supported-locale> element, then add it onto <locale-config> element, if
-	 * the <locale-config> or <application> doesn't exist, create them together.
-	 */
-	void addButtonSelected(SelectionEvent e) {
-		SupportedLocaleType obj = createSupportedLocaleObject();
-		if (obj != null) {
-
-			boolean needRefreshAll = false;
-			Command command = null;
-
-			if (getInput() instanceof ApplicationType) {
-				/** the <application> element exists. */
-				ApplicationType application = (ApplicationType) getInput();
-				if (application.getLocaleConfig().size() > 0) {
-					/** the <locale-config> element exists. */
-					LocaleConfigType localeConfig = (LocaleConfigType) application
-							.getLocaleConfig().get(0);
-					command = AddCommand.create(this.getEditingDomain(),
-							localeConfig, null, obj);
-				} else {
-					/** the <locale-config> element doesn't exist, create it. */
-					LocaleConfigType localeConfig = FacesConfigFactory.eINSTANCE
-							.createLocaleConfigType();
-					localeConfig.getSupportedLocale().add(obj);
-					command = AddCommand.create(getEditingDomain(),
-							application, null, localeConfig);
-				}
-			} else {
-				/**
-				 * the <application> element doesn't exist, then create it,
-				 * after execute, reset the input for all the application
-				 * sections.
-				 */
-				needRefreshAll = true;
-				ApplicationType application = FacesConfigFactory.eINSTANCE
-						.createApplicationType();
-				LocaleConfigType localeConfig = FacesConfigFactory.eINSTANCE
-						.createLocaleConfigType();
-				localeConfig.getSupportedLocale().add(obj);
-				application.getLocaleConfig().add(localeConfig);
-				command = AddCommand.create(getEditingDomain(), this.getPage()
-						.getInput(), null, application);
-			}
-
-			if (command.canExecute()) {
-				getEditingDomain().getCommandStack().execute(command);
-				if (needRefreshAll)
-					/** reset input for all the application sections. */
-					((OthersPage) this.getPage()).resetApplicationInput();
-			}
-		}
-
-	}
-
-	/**
-	 * when user click on the CheckboxTableViewer, perform some actions to
-	 * set/unset <default-locale> and <supported-locale> elements.
-	 * 
-	 * If an item is selected, that means it's a <default-locale>, otherwise
-	 * it's a <supported-locale>.
-	 * 
-	 * @see org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent)
-	 */
-	public void checkStateChanged(CheckStateChangedEvent event) {
-		boolean checked = event.getChecked();
-
-		if (event.getElement() == null) {
-			return;
-		}
-
-		EObject node = (EObject) event.getElement();
-		LocaleConfigType localeConfigType = (LocaleConfigType) ((ApplicationType) getInput())
-				.getLocaleConfig().get(0);
-		CompoundCommand compoundCommand = new CompoundCommand();
-
-		if (checked) {
-			/** user checked one item, going to set it as <default-locale>. */
-			if (localeConfigType.getDefaultLocale() != null) {
-				/**
-				 * Change the <default-locale> value to <supported-locale>.
-				 */
-				Command command = RemoveCommand.create(getEditingDomain(),
-						localeConfigType, null, localeConfigType
-								.getDefaultLocale());
-
-				compoundCommand.append(command);
-
-				SupportedLocaleType supportedLocale = FacesConfigFactory.eINSTANCE
-						.createSupportedLocaleType();
-				supportedLocale.setTextContent(localeConfigType
-						.getDefaultLocale().getTextContent());
-				command = AddCommand.create(getEditingDomain(),
-						localeConfigType, FacesConfigPackage.eINSTANCE
-								.getLocaleConfigType_SupportedLocale(),
-						supportedLocale);
-				compoundCommand.append(command);
-			}
-
-			/**
-			 * Change the selected item from <supported-locale> to
-			 * <default-locale>
-			 */
-			SupportedLocaleType supportedLocale = (SupportedLocaleType) node;
-			Command command = RemoveCommand.create(getEditingDomain(),
-					localeConfigType, FacesConfigPackage.eINSTANCE
-							.getLocaleConfigType_SupportedLocale(),
-					supportedLocale);
-			compoundCommand.append(command);
-
-			DefaultLocaleType defaultLocale = FacesConfigFactory.eINSTANCE
-					.createDefaultLocaleType();
-			defaultLocale.setTextContent(supportedLocale.getTextContent());
-			command = SetCommand
-					.create(getEditingDomain(), localeConfigType,
-							FacesConfigPackage.eINSTANCE
-									.getLocaleConfigType_DefaultLocale(),
-							defaultLocale);
-			compoundCommand.append(command);
-
-		} else {
-			/**
-			 * User unchecked one item, going to change it from <default-locale>
-			 * to <supported-locale>.
-			 */
-			DefaultLocaleType defaultLocale = (DefaultLocaleType) node;
-			Command command = RemoveCommand.create(getEditingDomain(),
-					localeConfigType, null, defaultLocale);
-			compoundCommand.append(command);
-
-			SupportedLocaleType supportedLocale = FacesConfigFactory.eINSTANCE
-					.createSupportedLocaleType();
-			supportedLocale.setTextContent(defaultLocale.getTextContent());
-			command = AddCommand.create(getEditingDomain(), localeConfigType,
-					null, supportedLocale);
-			compoundCommand.append(command);
-		}
-
-		if (compoundCommand.canExecute()) {
-			getEditingDomain().getCommandStack().execute(compoundCommand);
-			this.refresh();
-			setTableViewerCheckedState();
-		}
-	}
-
-	/**
-	 * Set the checked state for items in the checkbox table viewer. This method
-	 * could be used for refresh the checked state of the table viewer.
-	 */
-	private void setTableViewerCheckedState() {
-		if (getInput() instanceof ApplicationType) {
-			ApplicationType application = (ApplicationType) getInput();
-			if (application.getLocaleConfig().size() > 0) {
-
-				LocaleConfigType localeConfigType = (LocaleConfigType) application
-						.getLocaleConfig().get(0);
-				if (localeConfigType.getDefaultLocale() != null) {
-					((CheckboxTableViewer) getTableViewer()).setChecked(
-							localeConfigType.getDefaultLocale(), true);
-				}
-			}
-		}
-	}
-
-	/**
-	 * set the structuredViewer's input. Set the first LocaleConfig as input.
-	 * 
-	 * @param input
-	 */
-	protected void setViewerInput(Object input) {
-		if (input instanceof ApplicationType) {
-			ApplicationType application = (ApplicationType) input;
-			if (EcoreUtil.getExistingAdapter(application,
-					LocaleConfigSection.class) == null) {
-				application.eAdapters().add(new LocaleConfigAdapter());
-			}
-			if (application.getLocaleConfig().size() > 0) {
-				tableViewer.setInput(application.getLocaleConfig().get(0));
-			} else
-				tableViewer.setInput(null);
-		} else
-			tableViewer.setInput(null);
-
-	}
-
-	public void refreshAll() {
-		super.refreshAll();
-		setTableViewerCheckedState();
-	}
-
-	/**
-	 * A listener that is be adapted on the input <application> element, to
-	 * listen the event that the first <locale-config> being created and
-	 * removed, then reset the input of the tabel viewer.
-	 * 
-	 * @author sfshi
-	 * 
-	 */
-	class LocaleConfigAdapter extends AdapterImpl {
-		public boolean isAdapterForType(Object type) {
-			if (type == LocaleConfigSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-			if (msg.getEventType() == Notification.ADD
-					|| msg.getEventType() == Notification.REMOVE) {
-				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getApplicationType_LocaleConfig()) {
-					/**
-					 * a <locale-config> was created or removed, notify this
-					 * section to reset it's input.
-					 */
-					setInput(getInput());
-
-				}
-			}
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanGeneralSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanGeneralSection.java
deleted file mode 100644
index e7c475b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanGeneralSection.java
+++ /dev/null
@@ -1,318 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ComboDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldChangeListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class ManagedBeanGeneralSection extends AbstractFacesConfigSection {
-
-	private StringDialogField mbNameField;
-
-	private ClassButtonDialogField mbClassField;
-
-	private ComboDialogField mbScopeField;
-
-	private ManagedBeanGeneralSectionAdapter managedBeanGeneralSectionAdapter;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public ManagedBeanGeneralSection(Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		getSection().setText(
-				EditorMessages.ManagedBeanGeneralSection_Name);
-		getSection().setDescription(
-				EditorMessages.ManagedBeanGeneralSection_Desc);
-	}
-
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		int numberOfColumns = 4;
-		GridLayout layout = new GridLayout(numberOfColumns, false);
-		container.setLayout(layout);
-
-		toolkit.paintBordersFor(container);
-
-		createMBNameEntry(container, toolkit, numberOfColumns);
-
-		createMBClassEntry(container, toolkit, numberOfColumns);
-
-		createMBScopeEntry(container, toolkit, numberOfColumns);
-
-	}
-
-	/**
-	 * create managed bean's name editing field
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createMBNameEntry(Composite container, FormToolkit toolkit,
-			int numberOfColumns) {
-		mbNameField = new StringDialogField();
-		mbNameField
-				.setLabelText(EditorMessages.ManagedBeanGeneralSection_ManagedBeanName);//$NON-NLS-1$
-		mbNameField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(mbNameField.getTextControl(toolkit,
-				container));
-		mbNameField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String mbNameValue = ((StringDialogField) field)
-								.getText();
-						Command cmd = null;
-						ManagedBeanType managedBean = (ManagedBeanType) getInput();
-						// if (managedBean.getManagedBeanName() != null) {
-						// cmd = SetCommand
-						// .create(
-						// getEditingDomain(),
-						// managedBean.getManagedBeanName(),
-						// FacesConfigPackage.eINSTANCE
-						// .getManagedBeanNameType_TextContent(),
-						// mbNameValue);
-						// } else {
-						ManagedBeanNameType newManagedBeanName = FacesConfigFactory.eINSTANCE
-								.createManagedBeanNameType();
-						newManagedBeanName.setTextContent(mbNameValue);
-						cmd = SetCommand.create(getEditingDomain(),
-								managedBean, FacesConfigPackage.eINSTANCE
-										.getManagedBeanType_ManagedBeanName(),
-								newManagedBeanName);
-						// }
-						if (cmd.canExecute()) {
-							getEditingDomain().getCommandStack().execute(cmd);
-						}
-					}
-				});
-	}
-
-	/**
-	 * create managed bean's class field.
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createMBClassEntry(final Composite container,
-			final FormToolkit toolkit, int numberOfColumns) {
-		mbClassField = new ClassButtonDialogField(null);
-		mbClassField
-				.setLabelText(EditorMessages.ManagedBeanGeneralSection_ManagedBeanClass);//$NON-NLS-1$
-		mbClassField.setProject((IProject) getPage().getEditor().getAdapter(
-				IProject.class));
-		mbClassField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(mbClassField.getTextControl(toolkit,
-				container));
-
-		mbClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String newValue = ((StringDialogField) field).getText();
-						Command cmd = null;
-						ManagedBeanType managedBean = (ManagedBeanType) getInput();
-						// if (managedBean.getManagedBeanClass() != null) {
-						// cmd = SetCommand
-						// .create(
-						// getEditingDomain(),
-						// managedBean.getManagedBeanClass(),
-						// FacesConfigPackage.eINSTANCE
-						// .getManagedBeanClassType_TextContent(),
-						// newValue);
-						// } else {
-						ManagedBeanClassType newManagedBeanClass = FacesConfigFactory.eINSTANCE
-								.createManagedBeanClassType();
-						newManagedBeanClass.setTextContent(newValue);
-						cmd = SetCommand.create(getEditingDomain(),
-								managedBean, FacesConfigPackage.eINSTANCE
-										.getManagedBeanType_ManagedBeanClass(),
-								newManagedBeanClass);
-						// }
-						if (cmd.canExecute()) {
-							getEditingDomain().getCommandStack().execute(cmd);
-						}
-					}
-				});
-	}
-
-	/**
-	 * create managed bean's scope field
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createMBScopeEntry(Composite container, FormToolkit toolkit,
-			int numberOfColumns) {
-		mbScopeField = new ComboDialogField(SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER);
-		mbScopeField
-				.setLabelText(EditorMessages.ManagedBeanGeneralSection_ManagedBeanScope);//$NON-NLS-1$
-		mbScopeField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(mbScopeField.getComboControl(toolkit,
-				container));
-
-		mbScopeField.setItems(ManagedBeanScopeTreeItem.scopeItems);
-
-		mbScopeField
-				.setDialogFieldChangeListener(new IDialogFieldChangeListener() {
-					public void dialogFieldChanged(DialogField field) {
-						String newValue = ((ComboDialogField) field).getText();
-						Command cmd = null;
-						ManagedBeanType managedBean = (ManagedBeanType) getInput();
-						// if (managedBean.getManagedBeanScope() != null) {
-						// cmd = SetCommand
-						// .create(
-						// getEditingDomain(),
-						// managedBean.getManagedBeanScope(),
-						// FacesConfigPackage.eINSTANCE
-						// .getManagedBeanScopeType_TextContent(),
-						// newValue);
-						// } else {
-						ManagedBeanScopeType newManagedBeanScope = FacesConfigFactory.eINSTANCE
-								.createManagedBeanScopeType();
-						newManagedBeanScope.setTextContent(newValue);
-						cmd = SetCommand.create(getEditingDomain(),
-								managedBean, FacesConfigPackage.eINSTANCE
-										.getManagedBeanType_ManagedBeanScope(),
-								newManagedBeanScope);
-						// }
-						if (cmd.canExecute()) {
-							getEditingDomain().getCommandStack().execute(cmd);
-						}
-					}
-				});
-	}
-
-	public void refreshAll() {
-		refresh();
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		super.refresh();
-		Object input = this.getInput();
-		if (input instanceof ManagedBeanType) {
-			ManagedBeanType component = (ManagedBeanType) input;
-
-			if (component.getManagedBeanName() != null) {
-				mbNameField.setTextWithoutUpdate(component.getManagedBeanName()
-						.getTextContent());
-			} else {
-				mbNameField.setTextWithoutUpdate("");
-			}
-
-			if (component.getManagedBeanClass() != null) {
-				mbClassField.setTextWithoutUpdate(component
-						.getManagedBeanClass().getTextContent());
-			} else {
-				mbClassField.setTextWithoutUpdate("");
-			}
-
-			if (component.getManagedBeanScope() != null) {
-				mbScopeField.setTextWithoutUpdate(component
-						.getManagedBeanScope().getTextContent());
-			} else {
-				// defaultly set it's scope to "session";
-				mbScopeField
-						.setTextWithoutUpdate(IFacesConfigConstants.MANAGED_BEAN_SCOPE_SESSION);
-			}
-		}
-	}
-
-	protected void addAdaptersOntoInput(Object newInput) {
-		super.addAdaptersOntoInput(newInput);
-		ManagedBeanType managedBean = (ManagedBeanType) newInput;
-		if (EcoreUtil.getExistingAdapter(managedBean,
-				ManagedBeanGeneralSection.class) == null) {
-			managedBean.eAdapters().add(getManagedBeanGeneralSectionAdatper());
-		}
-
-	}
-
-	protected void removeAdaptersFromInput(Object oldInput) {
-		super.removeAdaptersFromInput(oldInput);
-		ManagedBeanType managedBean = (ManagedBeanType) oldInput;
-		if (EcoreUtil.getExistingAdapter(managedBean,
-				ManagedBeanGeneralSection.class) != null) {
-			managedBean.eAdapters().remove(
-					getManagedBeanGeneralSectionAdatper());
-		}
-	}
-
-	protected ManagedBeanGeneralSectionAdapter getManagedBeanGeneralSectionAdatper() {
-		if (managedBeanGeneralSectionAdapter == null) {
-			managedBeanGeneralSectionAdapter = new ManagedBeanGeneralSectionAdapter();
-		}
-		return managedBeanGeneralSectionAdapter;
-	}
-
-	class ManagedBeanGeneralSectionAdapter extends AdapterImpl {
-
-		public boolean isAdapterForType(Object type) {
-
-			if (type == ManagedBeanGeneralSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-			if (msg.getEventType() == Notification.ADD
-					|| msg.getEventType() == Notification.REMOVE
-					|| msg.getEventType() == Notification.SET) {
-				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getManagedBeanType_ManagedBeanName()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getManagedBeanType_ManagedBeanClass()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getManagedBeanType_ManagedBeanScope()) {
-					refresh();
-				}
-			}
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanMasterSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanMasterSection.java
deleted file mode 100644
index 1204dd1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanMasterSection.java
+++ /dev/null
@@ -1,354 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.jst.jsf.facesconfig.ui.provider.ManagedBeanContentProvider;
-import org.eclipse.jst.jsf.facesconfig.ui.provider.ManagedBeanLabelProvider;
-import org.eclipse.jst.jsf.facesconfig.ui.wizard.NewManagedBeanWizard;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author sfshi
- */
-public class ManagedBeanMasterSection extends FacesConfigMasterSection {
-
-	private ManagedBeanMasterSectionAdapter managedBeanMasterSectionAdapter;
-
-	/**
-	 * @param parent
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page
-	 */
-	public ManagedBeanMasterSection(Composite parent, IManagedForm managedForm,
-			FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		super(parent, managedForm, toolkit, page, null, null);
-		getSection().setText(EditorMessages.ManagedBeanMasterSection_Name); //$NON-NLS-1$
-		getSection().setDescription(
-				EditorMessages.ManagedBeanMasterSection_Description);
-	}
-
-	protected StructuredViewer createViewer(Composite parent,
-			FormToolkit toolkit) {
-		Composite treeContainer = toolkit.createComposite(parent);
-		toolkit.paintBordersFor(treeContainer);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		treeContainer.setLayoutData(gd);
-		GridLayout layout = new GridLayout();
-		treeContainer.setLayout(layout);
-
-		// Create tree viewer
-		TreeViewer treeViewer = new TreeViewer(treeContainer, SWT.SINGLE
-				| SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		gd = new GridData(GridData.FILL_BOTH);
-		treeViewer.getControl().setLayoutData(gd);
-
-		treeViewer.setContentProvider(new ManagedBeanContentProvider());
-		treeViewer.setLabelProvider(new ManagedBeanLabelProvider());
-		treeViewer.addSelectionChangedListener(this);
-
-		treeViewer.setAutoExpandLevel(3);
-		return treeViewer;
-	}
-
-	protected void addButtonSelected(SelectionEvent e) {
-		IProject project = (IProject) this.getPage().getEditor().getAdapter(
-				IProject.class);
-
-		NewManagedBeanWizard wizard = new NewManagedBeanWizard(project);
-		IStructuredSelection selection = (IStructuredSelection) this
-				.getSelection();
-		if (selection.getFirstElement() instanceof ManagedBeanScopeTreeItem) {
-			// if user is selecting a scope tree item, then use this scope as
-			// the default scope for the new managed bean.
-			ManagedBeanScopeTreeItem scopeTreeItem = (ManagedBeanScopeTreeItem) selection
-					.getFirstElement();
-			wizard.setDefaultScope(scopeTreeItem.getScope());
-		}
-
-		wizard.setForcePreviousAndNextButtons(true);
-
-		Shell shell = EditorPlugin.getActiveShell();
-		WizardDialog wizardDialog = new WizardDialog(shell, wizard);
-		wizardDialog.create();
-		wizardDialog.setBlockOnOpen(true);
-		if (wizardDialog.open() == Window.OK) {
-			ManagedBeanType managedBean = FacesConfigFactory.eINSTANCE
-					.createManagedBeanType();
-
-			ManagedBeanNameType name = FacesConfigFactory.eINSTANCE
-					.createManagedBeanNameType();
-			name.setTextContent(wizard.getManagedBeanName());
-			managedBean.setManagedBeanName(name);
-
-			ManagedBeanClassType clazz = FacesConfigFactory.eINSTANCE
-					.createManagedBeanClassType();
-			clazz.setTextContent(wizard.getManagedBeanClass());
-			managedBean.setManagedBeanClass(clazz);
-
-			ManagedBeanScopeType scope = FacesConfigFactory.eINSTANCE
-					.createManagedBeanScopeType();
-			scope.setTextContent(wizard.getManagedBeanScope());
-			managedBean.setManagedBeanScope(scope);
-
-			String desc = wizard.getManagedBeanDescription();
-			if (desc != null && desc.trim().length() > 0) {
-				DescriptionType description = FacesConfigFactory.eINSTANCE
-						.createDescriptionType();
-				description.setTextContent(wizard.getManagedBeanDescription());
-				managedBean.getDescription().add(description);
-			}
-
-			Command cmd = AddCommand.create(getEditingDomain(), getInput(),
-					null, managedBean);
-			if (cmd.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(cmd);
-			}
-		}
-
-	}
-
-	protected void removeButtonSelected(SelectionEvent e) {
-		IStructuredSelection ssel = StructuredSelection.EMPTY;
-		ISelection selection = getSelection();
-		if (selection instanceof IStructuredSelection) {
-			ssel = (IStructuredSelection) selection;
-		}
-
-		if (!ssel.isEmpty()) {
-			if (ssel.getFirstElement() instanceof ManagedBeanType) {
-				ManagedBeanType element = (ManagedBeanType) ssel
-						.getFirstElement();
-				Command command = RemoveCommand.create(getEditingDomain(), this
-						.getInput(), FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_ManagedBean(), element);
-				if (command.canExecute()) {
-					getEditingDomain().getCommandStack().execute(command);
-				}
-			}
-		}
-	}
-
-	protected void updateButtons() {
-		IStructuredSelection ssel = (IStructuredSelection) getStructuredViewer()
-				.getSelection();
-		boolean isRemoveEnable = false;
-		if (!ssel.isEmpty()) {
-			Object s1 = ssel.getFirstElement();
-			if (s1 instanceof ManagedBeanType) {
-				isRemoveEnable = true;
-			}
-		}
-		getRemoveButton().setEnabled(isRemoveEnable);
-	}
-
-	/**
-	 * Override the super method to ignore the selection on ScopeTreeItem.
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-
-		if (event != null
-				&& event.getSelection() != null
-				&& ((IStructuredSelection) event.getSelection())
-						.getFirstElement() instanceof ManagedBeanScopeTreeItem) {
-
-			event = new SelectionChangedEvent(this, StructuredSelection.EMPTY);
-		}
-		super.selectionChanged(event);
-		updateButtons();
-
-	}
-
-	protected void addAdaptersOntoInput(Object newInput) {
-		super.addAdaptersOntoInput(newInput);
-
-		FacesConfigType facesConfig = (FacesConfigType) newInput;
-		if (EcoreUtil.getExistingAdapter(facesConfig,
-				ManagedBeanMasterSection.class) == null) {
-
-			facesConfig.eAdapters().add(getManagedBeanMasterSectionAdapter());
-		}
-
-		List managedbeans = facesConfig.getManagedBean();
-		for (Iterator it = managedbeans.iterator(); it.hasNext();) {
-			ManagedBeanType managedbean = (ManagedBeanType) it.next();
-			if (EcoreUtil.getExistingAdapter(managedbean,
-					ManagedBeanMasterSection.class) == null) {
-
-				managedbean.eAdapters().add(
-						getManagedBeanMasterSectionAdapter());
-			}
-		}
-	}
-
-	protected void removeAdaptersFromInput(Object oldInput) {
-		super.removeAdaptersFromInput(oldInput);
-		FacesConfigType facesConfig = (FacesConfigType) oldInput;
-		if (EcoreUtil.getExistingAdapter(facesConfig,
-				ManagedBeanMasterSection.class) != null) {
-
-			facesConfig.eAdapters()
-					.remove(getManagedBeanMasterSectionAdapter());
-		}
-
-		List managedbeans = facesConfig.getManagedBean();
-		for (Iterator it = managedbeans.iterator(); it.hasNext();) {
-			ManagedBeanType managedbean = (ManagedBeanType) it.next();
-			if (EcoreUtil.getExistingAdapter(managedbean,
-					ManagedBeanMasterSection.class) != null) {
-
-				managedbean.eAdapters().remove(
-						getManagedBeanMasterSectionAdapter());
-			}
-		}
-	}
-
-	protected ManagedBeanMasterSectionAdapter getManagedBeanMasterSectionAdapter() {
-		if (managedBeanMasterSectionAdapter == null) {
-			managedBeanMasterSectionAdapter = new ManagedBeanMasterSectionAdapter();
-		}
-		return managedBeanMasterSectionAdapter;
-	}
-
-	class ManagedBeanMasterSectionAdapter extends AdapterImpl {
-
-		public boolean isAdapterForType(Object type) {
-			if (type == ManagedBeanMasterSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-			super.notifyChanged(msg);
-
-			if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getFacesConfigType_ManagedBean()) {
-				if (msg.getEventType() == Notification.ADD) {
-					final EObject mbean = (EObject) msg.getNewValue();
-					if (EcoreUtil.getExistingAdapter(mbean,
-							ManagedBeanMasterSection.class) == null) {
-
-						mbean.eAdapters().add(
-								getManagedBeanMasterSectionAdapter());
-					}
-
-					Runnable run = new Runnable() {
-
-						public void run() {
-							getStructuredViewer().refresh(true);
-							IStructuredSelection selection = new StructuredSelection(
-									mbean);
-							getStructuredViewer().setSelection(selection);
-						}
-
-					};
-					PlatformUI.getWorkbench().getDisplay().asyncExec(run);
-				} else if (msg.getEventType() == Notification.REMOVE) {
-
-					Runnable run = new Runnable() {
-						public void run() {
-							getStructuredViewer().refresh(true);
-						}
-
-					};
-					PlatformUI.getWorkbench().getDisplay().asyncExec(run);
-				}
-
-				else if (msg.getEventType() == Notification.SET) {
-					final Object mbean = msg.getNewValue();
-					Runnable run = new Runnable() {
-						public void run() {
-							getStructuredViewer().refresh(mbean, true);
-						}
-
-					};
-					PlatformUI.getWorkbench().getDisplay().asyncExec(run);
-				}
-			}
-
-			if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getManagedBeanType_ManagedBeanClass()
-					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-							.getManagedBeanType_ManagedBeanName()) {
-
-				final Object bean = msg.getNotifier();
-
-				Runnable run = new Runnable() {
-
-					public void run() {
-						getStructuredViewer().refresh(bean, true);
-					}
-
-				};
-				PlatformUI.getWorkbench().getDisplay().asyncExec(run);
-
-			} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getManagedBeanType_ManagedBeanScope()) {
-
-				final Object mbean = msg.getNotifier();
-
-				Runnable run1 = new Runnable() {
-
-					public void run() {
-						getStructuredViewer().refresh();
-						IStructuredSelection selection = new StructuredSelection(
-								mbean);
-						getStructuredViewer().setSelection(selection);
-					}
-
-				};
-				PlatformUI.getWorkbench().getDisplay().asyncExec(run1);
-			}
-
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanScopeTreeItem.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanScopeTreeItem.java
deleted file mode 100644
index 69f6016..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanScopeTreeItem.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.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 {
-
-	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;
-	}
-
-	public Object getParent() {
-		return facesConfig;
-	}
-
-	public boolean hasChildren() {
-		return !getChildren().isEmpty();
-	}
-
-	public String getScope() {
-		return scope;
-	}
-
-	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 18c9fc5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedPropertyEditGroup.java
+++ /dev/null
@@ -1,580 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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();
-
-	/**
-	 * 
-	 */
-	public ManagedPropertyEditGroup(AbstractFacesConfigSection section) {
-		super();
-		this.section = section;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-		// TODO Auto-generated method stub
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#refreshData()
-	 */
-	public void refreshData() {
-		refresh();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#layoutDialogFields(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public void layoutDialogFields(FormToolkit toolkit, Composite parent) {
-		createGeneralClassPage(parent, toolkit);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#validateDialogFields()
-	 */
-	public IStatus[] validateDialogFields() {
-		return null;
-	}
-
-	/**
-	 * create general class initialization section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createGeneralClassPage(Composite container, FormToolkit toolkit) {
-		Composite generalSection = toolkit.createComposite(container);
-		generalSection.setLayoutData(new GridData(GridData.FILL_BOTH));
-		toolkit.paintBordersFor(generalSection);
-
-		GridLayout gl = new GridLayout();
-		gl.horizontalSpacing = 0;
-		gl.marginWidth = 0;
-		gl.numColumns = 2;
-		generalSection.setLayout(gl);
-
-		createTableSection(generalSection, toolkit);
-
-		createButtonsSection(generalSection, toolkit);
-	}
-
-	/**
-	 * create proeprty table section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createTableSection(Composite container, FormToolkit toolkit) {
-		// create property container
-		Composite propertyContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_HORIZONTAL);
-		propertyContainer.setLayoutData(gd);
-		toolkit.paintBordersFor(propertyContainer);
-
-		GridLayout gl = new GridLayout();
-		propertyContainer.setLayout(gl);
-
-		// Create property table
-		Table table = new Table(propertyContainer, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-		TableLayout layout = new TableLayout();
-		table.setLayout(layout);
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		table.setLayoutData(gd);
-
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-		TableColumn propertyCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		propertyCol
-				.setText(EditorMessages.InitializationSection_PropertyTable_Name);
-		propertyCol.setResizable(true);
-
-		TableColumn classCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		classCol
-				.setText(EditorMessages.InitializationSection_PropertyTable_Class);
-		classCol.setResizable(true);
-
-		TableColumn valueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		valueCol
-				.setText(EditorMessages.InitializationSection_PropertyTable_Value);
-		valueCol.setResizable(true);
-
-		table.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateButtons();
-			}
-		});
-
-		table.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected();
-			}
-		});
-
-		tableViewer = new TableViewer(table);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				section.getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(section
-				.getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getManagedPropertyType()
-						.isInstance(element);
-			}
-		});
-		
-		tableViewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * Update the buttons' enable and disable status
-	 */
-	private void updateButtons() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/**
-	 * create property's editing buttons
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createButtonsSection(Composite container, FormToolkit toolkit) {
-		// create operation buttons's container
-		Composite operationContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_VERTICAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		operationContainer.setLayoutData(gd);
-		GridLayout gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		// create list operation buttons
-		Button addButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Add_more, SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		editButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Edit_more, //$NON-NLS-1$
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-
-		removeButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Remove, //$NON-NLS-1$
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected();
-			}
-
-		});
-
-		editButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected();
-			}
-		});
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-		});
-
-	}
-
-	protected 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);
-
-			}
-		}
-
-	}
-
-	protected 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);
-			}
-		}
-	}
-
-	protected 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;
-	}
-
-	protected 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;
-	}
-
-	public EditingDomain getEditingDomain() {
-		return section.getEditingDomain();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		// TODO Auto-generated method stub
-		selectionChangedListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		// TODO Auto-generated method stub
-		selectionChangedListeners.remove(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		// TODO Auto-generated method stub
-		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 a2f16a0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/MapEntriesEditGroup.java
+++ /dev/null
@@ -1,695 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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();
-
-	/**
-	 */
-	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?
-	}
-
-	public void updateButtons() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#layoutDialogFields(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public void layoutDialogFields(FormToolkit toolkit, Composite parent) {
-		GridData data = new GridData(GridData.FILL_BOTH);
-		parent.setLayoutData(data);
-
-		GridLayout gl = new GridLayout();
-		gl.verticalSpacing = 0;
-		gl.marginHeight = 0;
-		parent.setLayout(gl);
-
-		layoutMapTypeSelectionSection(toolkit, parent);
-
-		createAndLayoutMapValueSection(toolkit, parent);
-	}
-
-	/**
-	 * 
-	 */
-	private void layoutMapTypeSelectionSection(FormToolkit toolkit,
-			Composite container) {
-
-		Composite typeSelectionSection = null;
-		if (toolkit != null) {
-			typeSelectionSection = toolkit.createComposite(container);
-			toolkit.paintBordersFor(typeSelectionSection);
-		} else {
-			typeSelectionSection = SWTUtils
-					.createComposite(container, SWT.NONE);
-		}
-
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		typeSelectionSection.setLayoutData(gd);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		typeSelectionSection.setLayout(gl);
-		keyClassField = new ClassButtonDialogField(getProject());
-		keyClassField
-				.setLabelText(EditorMessages.InitializationSection_MapType_KeyClass);
-		keyClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						ManagedBeanType managedBean1 = (ManagedBeanType) getInput();
-						String className = ((ClassButtonDialogField) field)
-								.getText();
-						KeyClassType keyClass = FacesConfigFactory.eINSTANCE
-								.createKeyClassType();
-						keyClass.setTextContent(className);
-						EditingDomain editingDomain = section
-								.getEditingDomain();
-						Command cmd;
-						boolean isNew;
-						if (managedBean1.getMapEntries() == null) {
-							isNew = true;
-							MapEntriesType mapEntries = FacesConfigFactory.eINSTANCE
-									.createMapEntriesType();
-							mapEntries.setKeyClass(keyClass);
-							cmd = SetCommand.create(editingDomain, managedBean1,
-									FacesConfigPackage.eINSTANCE
-											.getManagedBeanType_MapEntries(),
-									mapEntries);
-						} else {
-							isNew = false;
-							cmd = SetCommand.create(editingDomain, managedBean1
-									.getMapEntries(),
-									FacesConfigPackage.eINSTANCE
-											.getMapEntriesType_KeyClass(),
-									keyClass);
-						}
-
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-							if (isNew)
-								refreshAll();
-						}
-
-					}
-				});
-
-		valueClassField = new ClassButtonDialogField(getProject());
-
-		valueClassField
-				.setLabelText(EditorMessages.InitializationSection_MapType_ValueClass);
-		valueClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						ManagedBeanType managedBean1 = (ManagedBeanType) getInput();
-						String className = ((ClassButtonDialogField) field)
-								.getText();
-						ValueClassType valueClass = FacesConfigFactory.eINSTANCE
-								.createValueClassType();
-						valueClass.setTextContent(className);
-						EditingDomain editingDomain = section
-								.getEditingDomain();
-						Command cmd;
-						boolean isNew;
-						if (managedBean1.getMapEntries() == null) {
-							isNew = true;
-							MapEntriesType mapEntries = FacesConfigFactory.eINSTANCE
-									.createMapEntriesType();
-							mapEntries.setValueClass(valueClass);
-							cmd = SetCommand.create(editingDomain, managedBean1,
-									FacesConfigPackage.eINSTANCE
-											.getManagedBeanType_MapEntries(),
-									mapEntries);
-						} else {
-							isNew = false;
-							cmd = SetCommand.create(editingDomain, managedBean1
-									.getMapEntries(),
-									FacesConfigPackage.eINSTANCE
-											.getMapEntriesType_ValueClass(),
-									valueClass);
-						}
-
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-							if (isNew)
-								refreshAll();
-						}
-
-					}
-				});
-
-		keyClassField.doFillIntoGrid(toolkit, typeSelectionSection,
-				numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(keyClassField.getTextControl(toolkit,
-				container));
-
-		valueClassField.doFillIntoGrid(toolkit, typeSelectionSection,
-				numberOfColumns);
-	}
-
-	/**
-	 * @param toolkit
-	 * @param parent
-	 */
-	private void createAndLayoutMapValueSection(FormToolkit toolkit,
-			Composite parent) {
-		Composite mapValueSection = null;
-		if (toolkit != null) {
-			mapValueSection = toolkit.createComposite(parent);
-			toolkit.paintBordersFor(mapValueSection);
-		} else {
-			mapValueSection = SWTUtils.createComposite(parent, SWT.NONE);
-		}
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		mapValueSection.setLayoutData(gd);
-
-		int numberOfColumns = 3;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		mapValueSection.setLayout(gl);
-		DialogField valuesTitle = new DialogFieldBase();
-		valuesTitle
-				.setLabelText(EditorMessages.InitializationSection_MapTable_Title);//$NON-NLS-1$    
-
-		valuesTitle.doFillIntoGrid(toolkit, mapValueSection, numberOfColumns);
-		Table table;
-		if (toolkit == null) {
-			table = new Table(mapValueSection, SWT.FULL_SELECTION
-					| SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		} else {
-			table = new Table(mapValueSection, SWT.H_SCROLL | SWT.V_SCROLL
-					| SWT.FULL_SELECTION | SWT.BORDER);
-		}
-
-		table.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				updateButtons();
-
-			}
-		});
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		table.setLayoutData(gd);
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		table.setLayout(layout);
-
-		TableColumn keyCol = new TableColumn(table, SWT.NONE);
-		keyCol.setText(EditorMessages.InitializationSection_MapTable_Key);//$NON-NLS-1$
-		layout.addColumnData(new ColumnWeightData(1, true));
-		keyCol.setResizable(true);
-
-		TableColumn valueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		valueCol.setText(EditorMessages.InitializationSection_MapTable_Value);//$NON-NLS-1$
-		valueCol.setResizable(true);
-		table.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected();
-			}
-		});
-		tableViewer = new TableViewer(table);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				section.getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(section
-				.getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getMapEntryType()
-						.isInstance(element);
-			}
-		});
-
-		tableViewer.addSelectionChangedListener(this);
-
-		Composite operationContainer = null;
-		if (toolkit != null) {
-			operationContainer = toolkit.createComposite(mapValueSection);
-		} else {
-			operationContainer = SWTUtils.createComposite(mapValueSection,
-					SWT.NONE);
-		}
-		gd = new GridData(GridData.FILL_VERTICAL);
-		operationContainer.setLayoutData(gd);
-		gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = null;
-		if (toolkit != null) {
-			addButton = toolkit.createButton(operationContainer,
-					EditorMessages.UI_Button_Add_more, //$NON-NLS-1$
-					SWT.PUSH);
-		} else {
-			addButton = SWTUtils.createPushButton(operationContainer,
-					EditorMessages.UI_Button_Add_more); //$NON-NLS-1$
-		}
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		if (toolkit != null) {
-			editButton = toolkit.createButton(operationContainer,
-					EditorMessages.UI_Button_Edit_more, SWT.PUSH);
-		} else {
-			editButton = SWTUtils.createPushButton(operationContainer,
-					EditorMessages.UI_Button_Edit_more); //$NON-NLS-1$
-		}
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-
-		if (toolkit != null) {
-			removeButton = toolkit.createButton(operationContainer,
-					EditorMessages.UI_Button_Remove, //$NON-NLS-1$
-					SWT.PUSH);
-		} else {
-			removeButton = SWTUtils.createPushButton(operationContainer,
-					EditorMessages.UI_Button_Remove); //$NON-NLS-1$
-		}
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-		addButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected();
-			}
-
-		});
-
-		editButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected();
-			}
-		});
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-		});
-	}
-
-	protected 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();
-			}
-
-		}
-	}
-
-	protected 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);
-			}
-
-		}
-
-	}
-
-	protected 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;
-	}
-
-	public void setProject(IProject project) {
-		currentProject = project;
-	}
-
-	/*
-	 * (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();
-		}
-	}
-
-	public void refreshAll() {
-		if (managedBean.getMapEntries() != null
-				&& managedBean.getMapEntries().getKeyClass() != null) {
-			this.keyClassField.setTextWithoutUpdate(managedBean.getMapEntries()
-					.getKeyClass().getTextContent());
-		} else {
-			this.keyClassField.setTextWithoutUpdate(null);
-		}
-
-		if (managedBean.getMapEntries() != null
-				&& managedBean.getMapEntries().getValueClass() != null) {
-			this.valueClassField.setTextWithoutUpdate(managedBean
-					.getMapEntries().getValueClass().getTextContent());
-		} else {
-			this.valueClassField.setTextWithoutUpdate(null);
-		}
-
-		tableViewer.setInput(((ManagedBeanType) getInput()).getMapEntries());
-		updateButtons();
-	}
-
-	public Object getInput() {
-		return this.managedBean;
-	}
-
-	public void refreshData() {
-		refresh();
-
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		tableViewer.refresh();
-		updateButtons();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		for (Iterator listeners = selectionChangedListeners.iterator(); listeners
-				.hasNext();) {
-			ISelectionChangedListener listener = (ISelectionChangedListener) listeners
-					.next();
-			listener.selectionChanged(new SelectionChangedEvent(this, event
-					.getSelection()));
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OthersPageBaseSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OthersPageBaseSection.java
deleted file mode 100644
index 1d1d312..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OthersPageBaseSection.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Zhi-peng Zhang
- * @version
- */
-/**
- * The base class for the Sections in Others Page.
- */
-public abstract class OthersPageBaseSection extends AbstractFacesConfigSection {
-
-	/**
-	 * Table viewer for all sections based on this calss
-	 */
-	protected TableViewer tableViewer;
-
-	private Button removeButton;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public OthersPageBaseSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit, String helpContextId,
-			String helpTooltip) {
-		super(parent, managedForm, page, toolkit, helpContextId, helpTooltip);
-	}
-
-	/**
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public OthersPageBaseSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		this(parent, managedForm, page, toolkit, null, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#createContents(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.ui.forms.widgets.FormToolkit)
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = layout.marginHeight = 5;
-		container.setLayout(layout);
-		createViewer(container, toolkit);
-		createOperationSection(container, toolkit);
-	}
-
-	/**
-	 * create TableViewer for this section. sub-class may override it to return
-	 * a new type tableViewer. for example CheckboxTableViewer.
-	 * 
-	 * @param parent
-	 * @return the table viewer for this section
-	 */
-	protected TableViewer createTableViewer(Composite parent) {
-		return new TableViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.BORDER);
-	}
-
-	/**
-	 * Config the viewer, such as set a filter and so on. Sub classes should
-	 * override this method to add filter.
-	 * 
-	 * @param tableViewer1
-	 */
-	protected abstract void configTableViewer(TableViewer tableViewer1);
-
-	/**
-	 * 
-	 * @param parent
-	 * @param toolkit
-	 */
-	protected void createViewer(Composite parent, FormToolkit toolkit) {
-		Composite tableContainer = toolkit.createComposite(parent);
-		toolkit.paintBordersFor(tableContainer);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.heightHint = 200;
-		tableContainer.setLayoutData(gd);
-		tableContainer.setLayout(new GridLayout());
-
-		tableViewer = createTableViewer(tableContainer);
-		tableViewer.getControl()
-				.setLayoutData(new GridData(GridData.FILL_BOTH));
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-		configTableViewer(tableViewer);
-
-		tableViewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * 
-	 * @param parent
-	 * @param toolkit
-	 */
-	protected void createOperationSection(Composite parent, FormToolkit toolkit) {
-		Composite operationContainer = toolkit.createComposite(parent);
-		operationContainer.setLayoutData(new GridData(GridData.FILL_VERTICAL));
-
-		operationContainer.setLayout(new GridLayout());
-
-		Button addButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Add, SWT.PUSH);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected(e);
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				addButtonSelected(e);
-			}
-		});
-
-		setRemoveButton(toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Remove, SWT.PUSH));
-
-		getRemoveButton().setEnabled(true);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		getRemoveButton().setLayoutData(gd);
-		getRemoveButton().addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected(e);
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				removeButtonSelected(e);
-			}
-		});
-	}
-
-
-	abstract void addButtonSelected(SelectionEvent e);
-
-	/**
-	 * Respond to selection of the remove button
-	 * @param e
-	 */
-	protected void removeButtonSelected(SelectionEvent e) {
-		IStructuredSelection ssel = StructuredSelection.EMPTY;
-		ISelection selection = getSelection();
-		if (selection instanceof IStructuredSelection) {
-			ssel = (IStructuredSelection) selection;
-		}
-
-		if (!ssel.isEmpty()) {
-			List commands = new ArrayList(ssel.size());
-			for (Iterator iter = ssel.iterator(); iter.hasNext();) {
-				EObject element = (EObject) iter.next();
-				if (element.eContainer().eContents().size() == 1) {
-					// if the parent only have this one child, then remove it
-					// together.
-					element = element.eContainer();
-				}
-				Command command = RemoveCommand.create(getEditingDomain(),
-						element);
-				commands.add(command);
-
-			}
-
-			CompoundCommand command = new CompoundCommand(commands);
-			if (command.canExecute()) {
-				getEditingDomain().getCommandStack().execute(command);
-			}
-		}
-	}
-
-	public ISelection getSelection() {
-		return tableViewer.getSelection();
-	}
-
-	/**
-	 * update all buttons with the current selection
-	 */
-	protected void updateButtons() {
-		if (!getRemoveButton().isDisposed()) {
-			IStructuredSelection ssel = (IStructuredSelection) getSelection();
-			getRemoveButton().setEnabled(!ssel.isEmpty());
-		}
-	}
-
-	public void refresh() {
-		super.refresh();
-		tableViewer.refresh();
-		updateButtons();
-	}
-
-	public void setSelection(ISelection selection) {
-		tableViewer.setSelection(selection);
-	}
-
-	/**
-	 * @return Returns the tableViewer.
-	 */
-	public TableViewer getTableViewer() {
-		return tableViewer;
-	}
-
-	public void refreshAll() {
-		setViewerInput(getInput());
-		updateButtons();
-	}
-
-	/**
-	 * set the structuredViewer's input
-	 * 
-	 * @param input
-	 */
-	abstract protected void setViewerInput(Object input);
-
-	public void expansionStateChanged(boolean expanded) {
-		if (expanded) {
-			if (tableViewer.getInput() == null) {
-				refreshAll();
-			}
-			tableViewer.setSelection(tableViewer.getSelection());
-		} else {
-			tableViewer.setSelection(null);
-		}
-		super.expansionStateChanged(expanded);
-	}
-
-	protected void expansionStateChanging(boolean expanding) {
-		if (!expanding) {
-			GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-			this.getSection().setLayoutData(gd);
-		} else {
-			((OthersPage) getPage()).closeOtherSections(this);
-
-			GridData gd = new GridData(GridData.FILL_BOTH);
-			this.getSection().setLayoutData(gd);
-		}
-
-		super.expansionStateChanging(expanding);
-	}
-
-	public void selectionChanged(SelectionChangedEvent event) {
-		super.selectionChanged(event);
-		updateButtons();
-	}
-
-    /**
-     * @param removeButton
-     */
-    protected void setRemoveButton(Button removeButton) {
-        this.removeButton = removeButton;
-    }
-
-    /**
-     * @return the button widget
-     */
-    protected Button getRemoveButton() {
-        return removeButton;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewComponentsSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewComponentsSection.java
deleted file mode 100644
index c7f5016..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewComponentsSection.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.ComponentsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author sfshi
- * @version
- */
-public class OverviewComponentsSection extends AbstractOverviewSection {
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public OverviewComponentsSection(Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, ComponentsPage.PAGE_ID,
-				EditorMessages.OverviewPage_ComponentsSection_name,
-				EditorMessages.OverviewPage_ComponentsSection_description,
-				null, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#configTableViewer(org.eclipse.jface.viewers.TableViewer)
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getComponentType()
-						.isInstance(element)
-						|| FacesConfigPackage.eINSTANCE.getConverterType()
-								.isInstance(element)
-						|| FacesConfigPackage.eINSTANCE.getRenderKitType()
-								.isInstance(element)
-						|| FacesConfigPackage.eINSTANCE.getValidatorType()
-								.isInstance(element);
-			}
-		});
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#createTable(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Table createTable(Composite container) {
-		Table table = new Table(container, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = 100;
-		table.setLayoutData(gd);
-
-		table.setLinesVisible(true);
-		table.setHeaderVisible(true);
-		TableLayout tablelayout = new TableLayout();
-		table.setLayout(tablelayout);
-
-		TableColumn typecol = new TableColumn(table, SWT.LEFT);
-		tablelayout.addColumnData(new ColumnWeightData(1, true));
-		typecol
-				.setText(EditorMessages.OverviewPage_ComponentsSection_table_typecol);
-		typecol.setResizable(true);
-
-		TableColumn namecol = new TableColumn(table, SWT.LEFT);
-		tablelayout.addColumnData(new ColumnWeightData(1, true));
-		namecol
-				.setText(EditorMessages.OverviewPage_ComponentsSection_table_namecol);
-		namecol.setResizable(true);
-
-		return table;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewGeneralSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewGeneralSection.java
deleted file mode 100644
index c19346d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewGeneralSection.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * @author jchoi, Xiao-guang Zhang
- * @version
- */
-public class OverviewGeneralSection extends AbstractFacesConfigSection {
-
-	private Text versionText;
-
-	/**
-	 * @param parent
-	 * @param managedForm 
-	 * @param page 
-	 * @param toolkit
-	 */
-	public OverviewGeneralSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-
-		getSection().setText(
-				EditorMessages.OverviewPage_GeneralSection_name); //$NON-NLS-1$
-		getSection().setDescription(
-				EditorMessages.OverviewPage_GeneralSection_description); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.update.ui.forms.internal.FormSection#createClient(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.update.ui.forms.internal.FormWidgetFactory)
-	 */
-	public void createContents(Composite container, FormToolkit toolkit) {
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		container.setLayout(layout);
-
-		IEditorInput editorInput = this.getPage().getEditor().getEditorInput();
-
-		toolkit.createLabel(container,
-				EditorMessages.OverviewPage_GeneralSection_label_name); //$NON-NLS-1$ 	 
-		Text typeText = toolkit.createText(container, ((FileEditorInput)editorInput).getName());
-		typeText.setEditable(false);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		typeText.setLayoutData(data);
-
-		toolkit.createLabel(container,
-				EditorMessages.OverviewPage_GeneralSection_label_version); //$NON-NLS-1$
-		versionText = toolkit.createText(container, "");
-		versionText.setLayoutData(data);
-		versionText.setEditable(false);
-
-		// set the service type description
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		versionText.setLayoutData(data);
-
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		Label sep = toolkit.createSeparator(container, SWT.HORIZONTAL);
-		sep.setLayoutData(gd);
-		toolkit.paintBordersFor(container);
-
-		// return container;
-	}
-
-	public void refreshAll() {
-		if (getInput() == null || !(getInput() instanceof EObject)) {
-			return;
-		}
-		
-//		FacesConfigType facesConfig = (FacesConfigType)getInput();
-		// TODO get the version and display it.
-		// String version = FacesConfigUtil
-		// .getFacesConfigVersion((IDOMModel) getInput());
-		//
-		// if (null == version) {
-		// Document document = ((IDOMModel) getInput()).getDocument();
-		// DocumentType doctype = document.getDoctype();
-		// if (doctype != null) {
-		// String pid = doctype.getPublicId();
-		// version = pid.substring(PUBLIC_ID.length() + 1);
-		// version = version.substring(version.indexOf(VERSION_PREFIX)
-		// + VERSION_PREFIX.length() + 1, version.indexOf("//"));
-		// }
-		// if (null == version) {
-		// version = "";
-		// }
-		// }
-		// versionText.setText(version);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewManagedBeanSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewManagedBeanSection.java
deleted file mode 100644
index c066246..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewManagedBeanSection.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.ManagedBeanPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author sfshi
- * @version
- */
-public class OverviewManagedBeanSection extends AbstractOverviewSection {
-
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public OverviewManagedBeanSection(Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, ManagedBeanPage.PAGE_ID,
-				EditorMessages.OverviewPage_ManagedBeanSection_name,
-				EditorMessages.OverviewPage_ManagedBeanSection_description,
-				null, null);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#configTableViewer(org.eclipse.jface.viewers.TableViewer)
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getManagedBeanType()
-						.isInstance(element);
-			}
-		});
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#createTable()
-	 */
-	protected Table createTable(Composite container) {
-		Table table = new Table(container, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = 100;
-		table.setLayoutData(gd);
-
-		table.setLinesVisible(true);
-		table.setHeaderVisible(true);
-		TableLayout tablelayout = new TableLayout();
-		table.setLayout(tablelayout);
-
-		TableColumn namecol = new TableColumn(table, SWT.LEFT);
-		namecol
-				.setText(EditorMessages.OverviewPage_ManagedBeanSection_table_namecol);
-		tablelayout.addColumnData(new ColumnWeightData(1, true));
-		namecol.setResizable(true);
-
-		TableColumn scopecol = new TableColumn(table, SWT.LEFT);
-		scopecol
-				.setText(EditorMessages.OverviewPage_ManagedBeanSection_table_scopecol);
-		tablelayout.addColumnData(new ColumnWeightData(1, true));
-		scopecol.setResizable(true);
-
-		TableColumn classcol = new TableColumn(table, SWT.LEFT);
-		classcol
-				.setText(EditorMessages.OverviewPage_ManagedBeanSection_table_classcol);
-		tablelayout.addColumnData(new ColumnWeightData(1, true));
-		classcol.setResizable(true);
-
-		return table;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewNavigationSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewNavigationSection.java
deleted file mode 100644
index 05a63c4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewNavigationSection.java
+++ /dev/null
@@ -1,381 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author sfshi
- * 
- */
-public class OverviewNavigationSection extends AbstractOverviewSection {
-
-	private static final int COLUMN_WITH = 70;
-
-	private OverviewNavigationSectionAdapter overviewNavigationSectionAdapter;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public OverviewNavigationSection(Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, PageflowEditor.PAGE_ID,
-				EditorMessages.OverviewPage_NavigationSection_name,
-				EditorMessages.OverviewPage_NavigationSection_description,
-				null, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#configTableViewer(org.eclipse.jface.viewers.TableViewer)
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.setContentProvider(new IStructuredContentProvider() {
-
-			public Object[] getElements(Object inputElement) {
-				List navigationCaseList = (List) inputElement;
-				return navigationCaseList.toArray();
-			}
-
-			public void dispose() {
-			    // nothing to dispose
-			}
-
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-			    // do nothing
-			}
-		});
-
-		tableViewer1.setLabelProvider(new ITableLabelProvider() {
-
-			public Image getColumnImage(Object element, int columnIndex) {
-				return null;
-			}
-
-			public String getColumnText(Object element, int columnIndex) {
-				NavigationCaseType navigationCase = (NavigationCaseType) element;
-				switch (columnIndex) {
-
-				case 0:
-					return ((NavigationRuleType) navigationCase.eContainer())
-							.getFromViewId() == null ? ""
-							: ((NavigationRuleType) navigationCase.eContainer())
-									.getFromViewId().getTextContent();
-
-				case 1:
-					return navigationCase.getFromOutcome() == null ? ""
-							: navigationCase.getFromOutcome().getTextContent();
-
-				case 2:
-					return navigationCase.getToViewId() == null ? ""
-							: navigationCase.getToViewId().getTextContent();
-				}
-				return null;
-			}
-
-			public void addListener(ILabelProviderListener listener) {
-			    // no listeners?
-			}
-
-			public void dispose() {
-			    // do nothing
-			}
-
-			public boolean isLabelProperty(Object element, String property) {
-				return false;
-			}
-
-			public void removeListener(ILabelProviderListener listener) {
-			    // no listeners?
-			}
-		});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#createTable(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Table createTable(Composite container) {
-		Table table = new Table(container, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER | SWT.BORDER);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = 100;
-		table.setLayoutData(gd);
-
-		table.setLinesVisible(true);
-		table.setHeaderVisible(true);
-		TableLayout tablelayout = new TableLayout();
-		table.setLayout(tablelayout);
-
-		TableColumn column1 = new TableColumn(table, SWT.LEFT);
-		column1
-				.setText(EditorMessages.OverviewPage_NavigationSection_table_col1);
-		// column1.setWidth(COLUMN_WITH);
-		tablelayout.addColumnData(new ColumnWeightData(1, COLUMN_WITH, true));
-		// tablelayout.addColumnData(new ColumnWeightData(1, true));
-		column1.setResizable(true);
-
-		TableColumn column2 = new TableColumn(table, SWT.LEFT);
-		column2
-				.setText(EditorMessages.OverviewPage_NavigationSection_table_col2);
-		tablelayout.addColumnData(new ColumnWeightData(1, COLUMN_WITH, true));
-		// tablelayout.addColumnData(new ColumnWeightData(1, true));
-		column2.setResizable(true);
-		// column2.setWidth(COLUMN_WITH);
-
-		TableColumn column3 = new TableColumn(table, SWT.LEFT);
-		column3
-				.setText(EditorMessages.OverviewPage_NavigationSection_table_col3);
-		tablelayout.addColumnData(new ColumnWeightData(1, COLUMN_WITH, true));
-		// tablelayout.addColumnData(new ColumnWeightData(1, true));
-		column3.setResizable(true);
-		// column3.setWidth(COLUMN_WITH);
-
-		return table;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection#refreshAll()
-	 */
-	public void refreshAll() {
-		List navigationCaseList = new ArrayList();
-		if (getInput() instanceof FacesConfigType) {
-			List navigationRules = ((FacesConfigType) getInput())
-					.getNavigationRule();
-			for (int i = 0, n = navigationRules.size(); i < n; i++) {
-				NavigationRuleType navigationRule = (NavigationRuleType) navigationRules
-						.get(i);
-				navigationCaseList.addAll(navigationRule.getNavigationCase());
-			}
-		}
-
-		tableViewer.setInput(navigationCaseList);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#addAdaptersOntoInput(java.lang.Object)
-	 */
-	protected void addAdaptersOntoInput(Object newInput) {
-		FacesConfigType facesConfig = (FacesConfigType) newInput;
-		addOverviewNavigationSectionAdapter(facesConfig);
-
-		for (Iterator it = facesConfig.getNavigationRule().iterator(); it
-				.hasNext();) {
-			NavigationRuleType navigationRule = (NavigationRuleType) it.next();
-
-			addOverviewNavigationSectionAdapter(navigationRule);
-
-			if (navigationRule.getFromViewId() != null) {
-				addOverviewNavigationSectionAdapter(navigationRule
-						.getFromViewId());
-			}
-
-			for (Iterator it2 = navigationRule.getNavigationCase().iterator(); it2
-					.hasNext();) {
-				NavigationCaseType navigationCase = (NavigationCaseType) it2
-						.next();
-				addOverviewNavigationSectionAdapter(navigationCase);
-
-				if (navigationCase.getFromOutcome() != null) {
-					addOverviewNavigationSectionAdapter(navigationCase
-							.getFromOutcome());
-				}
-
-				if (navigationCase.getToViewId() != null) {
-					addOverviewNavigationSectionAdapter(navigationCase
-							.getToViewId());
-				}
-			}
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#removeAdaptersFromInput(java.lang.Object)
-	 */
-	protected void removeAdaptersFromInput(Object oldInput) {
-		super.removeAdaptersFromInput(oldInput);
-
-		FacesConfigType facesConfig = (FacesConfigType) oldInput;
-		removeOverviewNavigationSectionAdapter(facesConfig);
-
-		for (Iterator it = facesConfig.getNavigationRule().iterator(); it
-				.hasNext();) {
-			NavigationRuleType navigationRule = (NavigationRuleType) it.next();
-
-			removeOverviewNavigationSectionAdapter(navigationRule);
-
-			if (navigationRule.getFromViewId() != null) {
-				removeOverviewNavigationSectionAdapter(navigationRule
-						.getFromViewId());
-			}
-
-			for (Iterator it2 = navigationRule.getNavigationCase().iterator(); it2
-					.hasNext();) {
-				NavigationCaseType navigationCase = (NavigationCaseType) it2
-						.next();
-				removeOverviewNavigationSectionAdapter(navigationCase);
-
-				if (navigationCase.getFromOutcome() != null) {
-					removeOverviewNavigationSectionAdapter(navigationCase
-							.getFromOutcome());
-				}
-
-				if (navigationCase.getToViewId() != null) {
-					removeOverviewNavigationSectionAdapter(navigationCase
-							.getToViewId());
-				}
-			}
-		}
-
-	}
-
-	protected void addOverviewNavigationSectionAdapter(EObject object) {
-		if (EcoreUtil.getExistingAdapter(object,
-				OverviewNavigationSection.class) == null) {
-			object.eAdapters().add(getOverviewNavigationSectionAdapter());
-		}
-
-	}
-
-	protected void removeOverviewNavigationSectionAdapter(EObject object) {
-		if (EcoreUtil.getExistingAdapter(object,
-				OverviewNavigationSection.class) != null) {
-			object.eAdapters().remove(getOverviewNavigationSectionAdapter());
-		}
-	}
-
-	protected OverviewNavigationSectionAdapter getOverviewNavigationSectionAdapter() {
-		if (overviewNavigationSectionAdapter == null)
-			overviewNavigationSectionAdapter = new OverviewNavigationSectionAdapter();
-		return overviewNavigationSectionAdapter;
-	}
-
-	class OverviewNavigationSectionAdapter extends AdapterImpl {
-
-		public boolean isAdapterForType(Object type) {
-			if (type == OverviewNavigationSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-
-			if ((msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getFacesConfigType_NavigationRule()
-					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-							.getNavigationRuleType_NavigationCase()
-					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-							.getNavigationRuleType_FromViewId() || msg
-					.getFeature() == FacesConfigPackage.eINSTANCE
-					.getFromViewIdType_TextContent())) {
-				if (msg.getEventType() == Notification.ADD
-						|| msg.getEventType() == Notification.SET) {
-					if (msg.getNewValue() instanceof EObject) {
-						EObject newObject = (EObject) msg.getNewValue();
-						addOverviewNavigationSectionAdapter(newObject);
-					}
-				}
-				if (msg.getEventType() == Notification.ADD
-						|| msg.getEventType() == Notification.REMOVE
-						|| msg.getEventType() == Notification.SET)
-					refreshAll();
-				return;
-			}
-
-			if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getNavigationCaseType_FromOutcome()
-					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-							.getNavigationCaseType_ToViewId()) {
-
-				if (msg.getEventType() == Notification.ADD
-						|| msg.getEventType() == Notification.SET) {
-					if (msg.getNewValue() instanceof EObject) {
-						EObject newObject = (EObject) msg.getNewValue();
-						addOverviewNavigationSectionAdapter(newObject);
-					}
-				}
-				if (msg.getEventType() == Notification.ADD
-
-				|| msg.getEventType() == Notification.REMOVE
-						|| msg.getEventType() == Notification.SET) {
-
-					NavigationCaseType navigationCase = (NavigationCaseType) msg
-							.getNotifier();
-					tableViewer.refresh(navigationCase);
-				}
-				return;
-			}
-
-			if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getFromOutcomeType_TextContent()
-					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-							.getToViewIdType_TextContent()) {
-
-				if (msg.getEventType() == Notification.ADD
-						|| msg.getEventType() == Notification.REMOVE
-						|| msg.getEventType() == Notification.SET) {
-					NavigationCaseType navigationCase = (NavigationCaseType) ((EObject) msg
-							.getNotifier()).eContainer();
-					tableViewer.refresh(navigationCase);
-				}
-				return;
-			}
-
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewOthersSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewOthersSection.java
deleted file mode 100644
index 2ca4867..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewOthersSection.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author sfshi
- * 
- */
-public class OverviewOthersSection extends AbstractOverviewSection {
-
-	private static final int COLUMN_WITH = 100;
-
-	private OverviewOthersSectionAdapter overviewOthersSectionAdapter;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public OverviewOthersSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, OthersPage.PAGE_ID,
-				EditorMessages.OverviewPage_OthersSection_name,
-				EditorMessages.OverviewPage_OthersSection_description,
-				null, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#configTableViewer(org.eclipse.jface.viewers.TableViewer)
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.setContentProvider(new IStructuredContentProvider() {
-
-			public Object[] getElements(Object inputElement) {
-				List othersNodesList = (List) inputElement;
-				return othersNodesList.toArray();
-			}
-
-			public void dispose() {
-                // do nothing
-			}
-
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-			    // do nothing
-			}
-		});
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#createTable(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Table createTable(Composite container) {
-		Table table = new Table(container, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = 100;
-		table.setLayoutData(gd);
-
-		table.setLinesVisible(true);
-		table.setHeaderVisible(true);
-		TableLayout tablelayout = new TableLayout();
-		table.setLayout(tablelayout);
-
-		TableColumn valuecol = new TableColumn(table, SWT.NONE);
-		tablelayout.addColumnData(new ColumnWeightData(1, COLUMN_WITH, true));
-		valuecol
-				.setText(EditorMessages.OverviewPage_OthersSection_table_valuecol);
-		valuecol.setResizable(true);
-
-		TableColumn typecol = new TableColumn(table, SWT.NONE);
-		tablelayout.addColumnData(new ColumnWeightData(1, COLUMN_WITH, true));
-		typecol
-				.setText(EditorMessages.OverviewPage_OthersSection_table_typecol);
-		typecol.setResizable(true);
-
-		return table;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#refreshAll()
-	 */
-	public void refreshAll() {
-
-		List othersNodesList = new ArrayList();
-		if (getInput() instanceof FacesConfigType) {
-			Object[] applicationNodes = null;
-			Object[] factoryNodes = null;
-			Object[] lifecycleNodes = null;
-			FacesConfigType facesConfig = (FacesConfigType) getInput();
-			IStructuredContentProvider contentProvider = new AdapterFactoryContentProvider(
-					getAdapterFactory());
-			if (facesConfig.getApplication().size() > 0) {
-
-				ApplicationType application = (ApplicationType) facesConfig
-						.getApplication().get(0);
-				applicationNodes = contentProvider.getElements(application);
-
-			}
-
-			if (facesConfig.getFactory().size() > 0) {
-				FactoryType factory = (FactoryType) facesConfig.getFactory()
-						.get(0);
-				factoryNodes = contentProvider.getElements(factory);
-			}
-
-			if (facesConfig.getLifecycle().size() > 0) {
-				LifecycleType lifecycle = (LifecycleType) facesConfig
-						.getLifecycle().get(0);
-				lifecycleNodes = contentProvider.getElements(lifecycle);
-			}
-
-			if (applicationNodes != null) {
-				for (int i = 0, n = applicationNodes.length; i < n; i++) {
-					othersNodesList.add(applicationNodes[i]);
-				}
-			}
-
-			if (factoryNodes != null) {
-				for (int i = 0, n = factoryNodes.length; i < n; i++) {
-					othersNodesList.add(factoryNodes[i]);
-				}
-			}
-
-			if (lifecycleNodes != null) {
-				for (int i = 0, n = lifecycleNodes.length; i < n; i++) {
-					othersNodesList.add(lifecycleNodes[i]);
-				}
-			}
-		}
-
-		tableViewer.setInput(othersNodesList);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#addAdaptersOntoInput(java.lang.Object)
-	 */
-	protected void addAdaptersOntoInput(Object newInput) {
-		FacesConfigType facesConfig = (FacesConfigType) newInput;
-		addOverviewOthersSectionAdapter(facesConfig);
-		IStructuredContentProvider contentProvider = new AdapterFactoryContentProvider(
-				getAdapterFactory());
-		if (facesConfig.getApplication().size() > 0) {
-			ApplicationType application = (ApplicationType) facesConfig
-					.getApplication().get(0);
-			addOverviewOthersSectionAdapter(application);
-
-			Object[] applicationNodes = contentProvider
-					.getElements(application);
-			for (int i = 0, n = applicationNodes.length; i < n; i++) {
-				addOverviewOthersSectionAdapter((EObject) applicationNodes[i]);
-			}
-
-		}
-
-		if (facesConfig.getFactory().size() > 0) {
-			FactoryType factory = (FactoryType) facesConfig.getFactory().get(0);
-			addOverviewOthersSectionAdapter(factory);
-
-			Object[] factoryNodes = contentProvider.getElements(factory);
-			for (int i = 0, n = factoryNodes.length; i < n; i++) {
-				addOverviewOthersSectionAdapter((EObject) factoryNodes[i]);
-			}
-
-		}
-
-		if (facesConfig.getLifecycle().size() > 0) {
-			LifecycleType lifecycle = (LifecycleType) facesConfig
-					.getLifecycle().get(0);
-			addOverviewOthersSectionAdapter(lifecycle);
-
-			Object[] lifecycleNodes = contentProvider.getElements(lifecycle);
-			for (int i = 0, n = lifecycleNodes.length; i < n; i++) {
-				addOverviewOthersSectionAdapter((EObject) lifecycleNodes[i]);
-			}
-
-		}
-
-	}
-
-	protected void addOverviewOthersSectionAdapter(EObject object) {
-		if (EcoreUtil.getExistingAdapter(object, OverviewOthersSection.class) == null) {
-			object.eAdapters().add(getOverviewOthersSectionAdapter());
-		}
-
-	}
-
-	protected void removeOverviewOthersSectionAdapter(EObject object) {
-		if (EcoreUtil.getExistingAdapter(object, OverviewOthersSection.class) != null) {
-			object.eAdapters().remove(getOverviewOthersSectionAdapter());
-		}
-	}
-
-	protected OverviewOthersSectionAdapter getOverviewOthersSectionAdapter() {
-		if (overviewOthersSectionAdapter == null) {
-			overviewOthersSectionAdapter = new OverviewOthersSectionAdapter();
-		}
-
-		return overviewOthersSectionAdapter;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#removeAdaptersFromInput(java.lang.Object)
-	 */
-	protected void removeAdaptersFromInput(Object oldInput) {
-
-		FacesConfigType facesConfig = (FacesConfigType) oldInput;
-		removeOverviewOthersSectionAdapter(facesConfig);
-		IStructuredContentProvider contentProvider = new AdapterFactoryContentProvider(
-				getAdapterFactory());
-		if (facesConfig.getApplication().size() > 0) {
-			ApplicationType application = (ApplicationType) facesConfig
-					.getApplication().get(0);
-			removeOverviewOthersSectionAdapter(application);
-
-			Object[] applicationNodes = contentProvider
-					.getElements(application);
-			for (int i = 0, n = applicationNodes.length; i < n; i++) {
-				removeOverviewOthersSectionAdapter((EObject) applicationNodes[i]);
-			}
-
-		}
-
-		if (facesConfig.getFactory().size() > 0) {
-			FactoryType factory = (FactoryType) facesConfig.getFactory().get(0);
-			removeOverviewOthersSectionAdapter(factory);
-
-			Object[] factoryNodes = contentProvider.getElements(factory);
-			for (int i = 0, n = factoryNodes.length; i < n; i++) {
-				removeOverviewOthersSectionAdapter((EObject) factoryNodes[i]);
-			}
-
-		}
-
-		if (facesConfig.getLifecycle().size() > 0) {
-			LifecycleType lifecycle = (LifecycleType) facesConfig
-					.getLifecycle().get(0);
-			removeOverviewOthersSectionAdapter(lifecycle);
-
-			Object[] lifecycleNodes = contentProvider.getElements(lifecycle);
-			for (int i = 0, n = lifecycleNodes.length; i < n; i++) {
-				removeOverviewOthersSectionAdapter((EObject) lifecycleNodes[i]);
-			}
-
-		}
-
-	}
-
-	class OverviewOthersSectionAdapter extends AdapterImpl {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#isAdapterForType(java.lang.Object)
-		 */
-		public boolean isAdapterForType(Object type) {
-			if (type == OverviewOthersSection.class)
-				return true;
-			return false;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
-		 */
-		public void notifyChanged(Notification msg) {
-			if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getFacesConfigType_Application()
-					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-							.getFacesConfigType_Factory()
-					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-							.getFacesConfigType_Lifecycle()
-					|| msg.getNotifier() instanceof ApplicationType
-					|| msg.getNotifier() instanceof FactoryType
-					|| msg.getNotifier() instanceof LifecycleType) {
-
-				if (msg.getEventType() == Notification.ADD) {
-					EObject newObject = (EObject) msg.getNewValue();
-					if (newObject != null) {
-						addOverviewOthersSectionAdapter(newObject);
-					}
-				}
-
-				if (msg.getEventType() == Notification.ADD
-						|| msg.getEventType() == Notification.REMOVE
-						|| msg.getEventType() == Notification.SET) {
-					refreshAll();
-				}
-			}
-
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/PropertySection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/PropertySection.java
deleted file mode 100644
index fdabeb1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/PropertySection.java
+++ /dev/null
@@ -1,501 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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;
-
-public class PropertySection extends AbstractFacesConfigSection {
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private TableViewer tableViewer;
-
-	private Button removeButton;
-
-	private Button editButton;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public PropertySection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		this.getSection().setText(EditorMessages.PropertySection_Name);
-		this.getSection().setDescription(
-				EditorMessages.PropertySection_Description);
-
-	}
-
-	/**
-	 * @param container
-	 * @param toolkit
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		GridLayout gl = new GridLayout();
-		gl.horizontalSpacing = 0;
-		gl.marginWidth = 0;
-		gl.numColumns = 2;
-		container.setLayout(gl);
-		GridData td = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-
-		Composite propertySection = toolkit.createComposite(container);
-		GridLayout gl2 = new GridLayout();
-		gl2.horizontalSpacing = 0;
-		gl2.verticalSpacing = 0;
-		gl2.marginWidth = 0;
-		gl2.marginHeight = 0;
-		gl2.numColumns = 2;
-		propertySection.setLayout(gl2);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		propertySection.setLayoutData(gd);
-
-		createTableSection(propertySection, toolkit);
-		createButtonsSection(propertySection, toolkit);
-
-	}
-
-	/**
-	 * create table section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createTableSection(Composite container, FormToolkit toolkit) {
-		Composite tableContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_HORIZONTAL);
-		tableContainer.setLayoutData(gd);
-		toolkit.paintBordersFor(tableContainer);
-
-		GridLayout gl = new GridLayout();
-		tableContainer.setLayout(gl);
-
-		Table table = new Table(tableContainer, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		table.setLayoutData(gd);
-
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		table.setLayout(layout);
-
-		TableColumn nameCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		nameCol.setText(EditorMessages.PropertySection_Table_NameColumn);//$NON-NLS-1$
-
-		TableColumn classCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		classCol
-				.setText(EditorMessages.PropertySection_Table_ClassColumn);
-
-		TableColumn valueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		valueCol
-				.setText(EditorMessages.PropertySection_Table_DefaultValueColumn);
-
-		TableColumn suggestedValueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		suggestedValueCol
-				.setText(EditorMessages.PropertySection_Table_SuggestedValueColumn);
-
-		table.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateButtons();
-			}
-		});
-
-		table.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected();
-			}
-		});
-
-		tableViewer = new TableViewer(table);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getPropertyType()
-						.isInstance(element);
-			}
-		});
-		tableViewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * Update the buttons' enable and disable status
-	 */
-	private void updateButtons() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/**
-	 * create property's editing buttons
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createButtonsSection(Composite container, FormToolkit toolkit) {
-		// create operation buttons's container
-		Composite operationContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_VERTICAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		operationContainer.setLayoutData(gd);
-		GridLayout gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Add_more, //$NON-NLS-1$
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		editButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Edit_more, //$NON-NLS-1$
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-
-		removeButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Remove, //$NON-NLS-1$
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected();
-			}
-
-		});
-
-		editButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected();
-			}
-
-		});
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-
-		});
-	}
-
-	/**
-	 * refresh the table viewer and update buttons.
-	 */
-	public void refresh() {
-		super.refresh();
-		tableViewer.refresh();
-		updateButtons();
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		tableViewer.setInput(getInput());
-		updateButtons();
-
-	}
-
-	/**
-	 * add a property.
-	 * 
-	 */
-	private void addButtonSelected() {
-
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditPropertyDialog dialog = new AddEditPropertyDialog(shell, true);
-		dialog.setProject((IProject) getPage().getEditor().getAdapter(
-				IProject.class));
-		if (dialog.open() == Dialog.OK) {
-
-			PropertyType newProperty = FacesConfigFactory.eINSTANCE
-					.createPropertyType();
-
-			if (dialog.getPropertyName().length() > 0) {
-				PropertyNameType propertyNameType = FacesConfigFactory.eINSTANCE
-						.createPropertyNameType();
-				propertyNameType.setTextContent(dialog.getPropertyName());
-				newProperty.setPropertyName(propertyNameType);
-			}
-
-			if (dialog.getPropertyClass().length() > 0) {
-				PropertyClassType propertyClassType = FacesConfigFactory.eINSTANCE
-						.createPropertyClassType();
-				propertyClassType.setTextContent(dialog.getPropertyClass());
-				newProperty.setPropertyClass(propertyClassType);
-			}
-
-			if (dialog.getDefaultValue().length() > 0) {
-				DefaultValueType defaultValueType = FacesConfigFactory.eINSTANCE
-						.createDefaultValueType();
-				defaultValueType.setTextContent(dialog.getDefaultValue());
-				newProperty.setDefaultValue(defaultValueType);
-			}
-
-			if (dialog.getSuggestedValue().length() > 0) {
-				SuggestedValueType suggestedValueType = FacesConfigFactory.eINSTANCE
-						.createSuggestedValueType();
-				suggestedValueType.setTextContent(dialog.getSuggestedValue());
-				newProperty.setSuggestedValue(suggestedValueType);
-			}
-
-			Command addCommand = AddCommand.create(this.getEditingDomain(),
-					getInput(), null, newProperty);
-			if (addCommand.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(addCommand);
-
-			}
-		}
-
-	}
-
-	/**
-	 * edit a property.
-	 * 
-	 */
-	private void editButtonSelected() {
-
-		PropertyType property = (PropertyType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(property);
-
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditPropertyDialog dialog = new AddEditPropertyDialog(shell, false);
-		dialog.setProject((IProject) getPage().getEditor().getAdapter(
-				IProject.class));
-		if (property.getPropertyName() != null) {
-			dialog.setPropertyName(property.getPropertyName().getTextContent());
-		}
-
-		if (property.getPropertyClass() != null) {
-			dialog.setPropertyClass(property.getPropertyClass()
-					.getTextContent());
-		}
-
-		if (property.getDefaultValue() != null) {
-			dialog.setDefaultValue(property.getDefaultValue().getTextContent());
-		}
-
-		if (property.getSuggestedValue() != null) {
-			dialog.setSuggestedValue(property.getSuggestedValue()
-					.getTextContent());
-		}
-
-		if (dialog.open() == Dialog.OK) {
-			List commands = new ArrayList(4);
-
-			if (property.getPropertyName() != null) {
-				Command cmd1 = SetCommand.create(this.getEditingDomain(),
-						property.getPropertyName(),
-						FacesConfigPackage.eINSTANCE
-								.getPropertyNameType_TextContent(), dialog
-								.getPropertyName());
-				commands.add(cmd1);
-			} else if (dialog.getPropertyName().length() > 0) {
-				PropertyNameType propertyNameType = FacesConfigFactory.eINSTANCE
-						.createPropertyNameType();
-				propertyNameType.setTextContent(dialog.getPropertyName());
-
-				Command cmd2 = AddCommand.create(this.getEditingDomain(),
-						property, FacesConfigPackage.eINSTANCE
-								.getPropertyType_PropertyName(),
-						propertyNameType);
-				commands.add(cmd2);
-			}
-
-			if (property.getPropertyClass() != null) {
-				Command cmd3 = SetCommand.create(this.getEditingDomain(),
-						property.getPropertyClass(),
-						FacesConfigPackage.eINSTANCE
-								.getPropertyClassType_TextContent(), dialog
-								.getPropertyClass());
-				commands.add(cmd3);
-			} else if (dialog.getPropertyClass().length() > 0) {
-				PropertyClassType propertyClassType = FacesConfigFactory.eINSTANCE
-						.createPropertyClassType();
-				propertyClassType.setTextContent(dialog.getPropertyClass());
-
-				Command cmd4 = AddCommand.create(this.getEditingDomain(),
-						property, FacesConfigPackage.eINSTANCE
-								.getPropertyType_PropertyClass(),
-						propertyClassType);
-				commands.add(cmd4);
-			}
-
-			if (property.getDefaultValue() != null) {
-				Command cmd5 = SetCommand.create(this.getEditingDomain(),
-						property.getDefaultValue(),
-						FacesConfigPackage.eINSTANCE
-								.getDefaultValueType_TextContent(), dialog
-								.getDefaultValue());
-				commands.add(cmd5);
-
-			} else if (dialog.getDefaultValue().length() > 0) {
-				DefaultValueType defaultValueType = FacesConfigFactory.eINSTANCE
-						.createDefaultValueType();
-				defaultValueType.setTextContent(dialog.getDefaultValue());
-				Command cmd6 = AddCommand.create(this.getEditingDomain(),
-						property, FacesConfigPackage.eINSTANCE
-								.getPropertyType_DefaultValue(),
-						defaultValueType);
-				commands.add(cmd6);
-			}
-
-			if (property.getSuggestedValue() != null) {
-				Command cmd7 = SetCommand.create(this.getEditingDomain(),
-						property.getSuggestedValue(),
-						FacesConfigPackage.eINSTANCE
-								.getSuggestedValueType_TextContent(), dialog
-								.getSuggestedValue());
-				commands.add(cmd7);
-			} else if (dialog.getSuggestedValue().length() > 0) {
-				SuggestedValueType suggestedValueType = FacesConfigFactory.eINSTANCE
-						.createSuggestedValueType();
-				suggestedValueType.setTextContent(dialog.getSuggestedValue());
-				Command cmd8 = AddCommand.create(this.getEditingDomain(),
-						property, FacesConfigPackage.eINSTANCE
-								.getPropertyType_SuggestedValue(),
-						suggestedValueType);
-				commands.add(cmd8);
-			}
-
-			CompoundCommand command = new CompoundCommand(commands);
-			if (command.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(command);
-				tableViewer.refresh(property);
-
-			}
-		}
-
-	}
-
-	/**
-	 * remove a property.
-	 * 
-	 */
-	private void removeButtonSelected() {
-		PropertyType property = (PropertyType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(property);
-
-		Command removeCommand = RemoveCommand.create(this.getEditingDomain(),
-				getInput(), null, property);
-
-		if (removeCommand.canExecute()) {
-			this.getEditingDomain().getCommandStack().execute(removeCommand);
-			refreshAll();
-		}
-
-	}
-	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return tableViewer.getSelection();
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-
-		tableViewer.setSelection(selection);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RendererSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RendererSection.java
deleted file mode 100644
index ea1b719..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RendererSection.java
+++ /dev/null
@@ -1,531 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.AddEditRendererDialog;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class RendererSection extends AbstractFacesConfigSection {
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private TableViewer tableViewer;
-
-	private Button removeButton;
-
-	private Button editButton;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public RendererSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		this.getSection().setText(EditorMessages.RendererSection_Name);
-		this.getSection().setDescription(
-				EditorMessages.RendererSection_Description);
-
-	}
-
-	/**
-	 * 
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		GridLayout gl = new GridLayout();
-		gl.horizontalSpacing = 0;
-		gl.marginWidth = 0;
-		gl.numColumns = 2;
-		container.setLayout(gl);
-		GridData td = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-
-		Composite RendererSection = toolkit.createComposite(container);
-		GridLayout gl2 = new GridLayout();
-		gl2.horizontalSpacing = 0;
-		gl2.verticalSpacing = 0;
-		gl2.marginWidth = 0;
-		gl2.marginHeight = 0;
-		gl2.numColumns = 2;
-		RendererSection.setLayout(gl2);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		RendererSection.setLayoutData(gd);
-
-		createTableSection(RendererSection, toolkit);
-		createButtonsSection(RendererSection, toolkit);
-
-	}
-
-	/**
-	 * create table section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createTableSection(Composite container, FormToolkit toolkit) {
-		Composite tableContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_HORIZONTAL);
-		tableContainer.setLayoutData(gd);
-		toolkit.paintBordersFor(tableContainer);
-
-		GridLayout gl = new GridLayout();
-		tableContainer.setLayout(gl);
-
-		Table table = new Table(tableContainer, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		table.setLayoutData(gd);
-
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		table.setLayout(layout);
-
-		TableColumn nameCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		nameCol.setText(EditorMessages.RendererSection_Table_NameColumn);
-
-		TableColumn valueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		valueCol
-				.setText(EditorMessages.RendererSection_Table_ComponentFamilyColumn);
-
-		TableColumn suggestedValueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		suggestedValueCol
-				.setText(EditorMessages.RendererSection_Table_TypeColumn);
-
-		TableColumn classCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		classCol.setText(EditorMessages.RendererSection_Table_ClassColumn);
-
-		table.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateButtons();
-			}
-		});
-
-		table.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected();
-			}
-		});
-
-		tableViewer = new TableViewer(table);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getRendererType()
-						.isInstance(element);
-			}
-		});
-		
-		tableViewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * Update the buttons' enable and disable status
-	 */
-	private void updateButtons() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/**
-	 * create buttons
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createButtonsSection(Composite container, FormToolkit toolkit) {
-		// create operation buttons's container
-		Composite operationContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_VERTICAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		operationContainer.setLayoutData(gd);
-		GridLayout gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Add_more, //$NON-NLS-1$
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		editButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Edit_more, //$NON-NLS-1$
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-
-		removeButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Remove, //$NON-NLS-1$
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected();
-			}
-
-		});
-
-		editButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected();
-			}
-
-		});
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-
-		});
-	}
-
-	/**
-	 * 
-	 * @return
-	 */
-	private EReference getEReference() {
-		EReference reference = null;
-		if (getInput() instanceof RenderKitType) {
-			reference = FacesConfigPackage.eINSTANCE
-					.getRenderKitType_Renderer();
-		}
-		return reference;
-	}
-
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		tableViewer.setInput(getInput());
-		updateButtons();
-
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		super.refresh();
-		tableViewer.refresh();
-		updateButtons();
-	}
-
-	/**
-	 * add an Renderer.
-	 * 
-	 */
-	private void addButtonSelected() {
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditRendererDialog dialog = new AddEditRendererDialog(shell, this
-				.getPage(), true);
-		dialog.setProject((IProject) getPage().getEditor().getAdapter(
-				IProject.class));
-		if (dialog.open() == Dialog.OK) {
-
-			// RendererType newRenderer = dialog.getResult();
-			RendererType newRenderer = FacesConfigFactory.eINSTANCE
-					.createRendererType();
-
-			if (dialog.getRendererName().length() > 0) {
-				DisplayNameType diaplayName = FacesConfigFactory.eINSTANCE
-						.createDisplayNameType();
-				diaplayName.setTextContent(dialog.getRendererName());
-				newRenderer.getDisplayName().add(diaplayName);
-			}
-
-			if (dialog.getRendererClass().length() > 0) {
-				RendererClassType RendererClassType = FacesConfigFactory.eINSTANCE
-						.createRendererClassType();
-				RendererClassType.setTextContent(dialog.getRendererClass());
-				newRenderer.setRendererClass(RendererClassType);
-			}
-
-			if (dialog.getComponentFamily().length() > 0) {
-				ComponentFamilyType componentFamilyType = FacesConfigFactory.eINSTANCE
-						.createComponentFamilyType();
-				componentFamilyType.setTextContent(dialog.getComponentFamily());
-				newRenderer.setComponentFamily(componentFamilyType);
-			}
-
-			if (dialog.getRendererType().length() > 0) {
-				RendererTypeType rendererType = FacesConfigFactory.eINSTANCE
-						.createRendererTypeType();
-				rendererType.setTextContent(dialog.getRendererType());
-				newRenderer.setRendererType(rendererType);
-			}
-
-			Command addCommand = AddCommand.create(this.getEditingDomain(),
-					getInput(), getEReference(), newRenderer);
-			if (addCommand.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(addCommand);
-
-			}
-		}
-
-	}
-
-	/**
-	 * edit an Renderer.
-	 * 
-	 */
-	private void editButtonSelected() {
-
-		RendererType renderer = (RendererType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(renderer);
-
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditRendererDialog dialog = new AddEditRendererDialog(shell, this
-				.getPage(), false);
-		dialog.setProject((IProject) getPage().getEditor().getAdapter(
-				IProject.class));
-		if (renderer.getDisplayName() != null
-				&& renderer.getDisplayName().size() > 0) {
-			String name = ((DisplayNameType) (renderer.getDisplayName().get(0)))
-					.getTextContent();
-			if (name == null) {
-				name = "";
-			}
-			dialog.setRendererName(name);
-		}
-
-		if (renderer.getRendererClass() != null) {
-			dialog.setRendererClass(renderer.getRendererClass()
-					.getTextContent());
-		}
-
-		if (renderer.getComponentFamily() != null) {
-			dialog.setComponentFamily(renderer.getComponentFamily()
-					.getTextContent());
-		}
-
-		if (renderer.getRendererType() != null) {
-			dialog.setRendererType(renderer.getRendererType().getTextContent());
-		}
-
-		if (dialog.open() == Dialog.OK) {
-			List commands = new ArrayList(4);
-
-			if (renderer.getDisplayName() != null
-					&& renderer.getDisplayName().size() > 0) {
-				DisplayNameType diaplayName = FacesConfigFactory.eINSTANCE
-						.createDisplayNameType();
-				diaplayName.setTextContent(dialog.getRendererName());
-
-				Command cmd1 = SetCommand.create(this.getEditingDomain(),
-						renderer.getDisplayName().get(0),
-						FacesConfigPackage.eINSTANCE
-								.getRendererType_DisplayName(), diaplayName);
-				commands.add(cmd1);
-			} else if (dialog.getRendererName().length() > 0) {
-				DisplayNameType displayName = FacesConfigFactory.eINSTANCE
-						.createDisplayNameType();
-				displayName.setTextContent(dialog.getRendererName());
-
-				EList dl = renderer.getDisplayName();
-				dl.add(displayName);
-				Command cmd2 = AddCommand.create(this.getEditingDomain(),
-						renderer.getDisplayName(), FacesConfigPackage.eINSTANCE
-								.getRendererType_DisplayName(), dl);
-				commands.add(cmd2);
-			}
-
-			if (renderer.getRendererClass() != null) {
-				Command cmd3 = SetCommand.create(this.getEditingDomain(),
-						renderer.getRendererClass(),
-						FacesConfigPackage.eINSTANCE
-								.getRendererClassType_TextContent(), dialog
-								.getRendererClass());
-				commands.add(cmd3);
-			} else if (dialog.getRendererClass().length() > 0) {
-				RendererClassType RendererClassType = FacesConfigFactory.eINSTANCE
-						.createRendererClassType();
-				RendererClassType.setTextContent(dialog.getRendererClass());
-
-				Command cmd4 = AddCommand.create(this.getEditingDomain(),
-						renderer, FacesConfigPackage.eINSTANCE
-								.getRendererType_RendererClass(),
-						RendererClassType);
-				commands.add(cmd4);
-			}
-
-			if (renderer.getComponentFamily() != null) {
-				Command cmd5 = SetCommand.create(this.getEditingDomain(),
-						renderer.getComponentFamily(),
-						FacesConfigPackage.eINSTANCE
-								.getDefaultValueType_TextContent(), dialog
-								.getComponentFamily());
-				commands.add(cmd5);
-
-			} else if (dialog.getComponentFamily().length() > 0) {
-				ComponentFamilyType componentFamily = FacesConfigFactory.eINSTANCE
-						.createComponentFamilyType();
-				componentFamily.setTextContent(dialog.getComponentFamily());
-				Command cmd6 = AddCommand.create(this.getEditingDomain(),
-						renderer, FacesConfigPackage.eINSTANCE
-								.getRendererType_ComponentFamily(),
-						componentFamily);
-				commands.add(cmd6);
-			}
-
-			if (renderer.getRendererType() != null) {
-				Command cmd7 = SetCommand.create(this.getEditingDomain(),
-						renderer.getRendererType(),
-						FacesConfigPackage.eINSTANCE
-								.getSuggestedValueType_TextContent(), dialog
-								.getRendererType());
-				commands.add(cmd7);
-			} else if (dialog.getRendererType().length() > 0) {
-				RendererTypeType rendererType = FacesConfigFactory.eINSTANCE
-						.createRendererTypeType();
-				rendererType.setTextContent(dialog.getRendererType());
-				Command cmd8 = AddCommand.create(this.getEditingDomain(),
-						renderer, FacesConfigPackage.eINSTANCE
-								.getRendererType_RendererType(), rendererType);
-				commands.add(cmd8);
-			}
-
-			CompoundCommand command = new CompoundCommand(commands);
-			if (command.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(command);
-				tableViewer.refresh(renderer);
-
-			}
-		}
-
-	}
-
-	/**
-	 * remove an Renderer.
-	 * 
-	 */
-	private void removeButtonSelected() {
-		RendererType Renderer = (RendererType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(Renderer);
-
-		Command removeCommand = RemoveCommand.create(this.getEditingDomain(),
-				getInput(), getEReference(), Renderer);
-
-		if (removeCommand.canExecute()) {
-			this.getEditingDomain().getCommandStack().execute(removeCommand);
-			refreshAll();
-		}
-
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return tableViewer.getSelection();
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-
-		tableViewer.setSelection(selection);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RenderkitGeneralSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RenderkitGeneralSection.java
deleted file mode 100644
index 399f547..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RenderkitGeneralSection.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ModelUtil;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class RenderkitGeneralSection extends AbstractFacesConfigSection {
-
-	private StringDialogField displayNameField;
-
-	private StringDialogField descriptionField;
-
-	private StringDialogField renderkitIdField;
-
-	private ClassButtonDialogField renderkitClassField;
-
-	private RenderKitGeneralAdapter renderKitGeneralAdapter;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public RenderkitGeneralSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		getSection()
-				.setText(EditorMessages.RenderKitGeneralSection_Name);
-		getSection().setDescription(
-				EditorMessages.RenderKitGeneralSection_Description);
-	}
-
-	/**
-	 * 
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		int numberOfColumns = 4;
-		GridLayout layout = new GridLayout(numberOfColumns, false);
-		container.setLayout(layout);
-		GridData td = new GridData(GridData.FILL_HORIZONTAL);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-		displayNameField = new StringDialogField();
-		displayNameField
-				.setLabelText(EditorMessages.RenderKitGeneralSection_Label_DisplayName);
-		displayNameField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		displayNameField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						String newDisplayNameValue = ((StringDialogField) field)
-								.getText().trim();
-						Command cmd = null;
-						RenderKitType Renderkit = (RenderKitType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (Renderkit.getDisplayName().size() > 0) {
-							DisplayNameType displayName = (DisplayNameType) Renderkit
-									.getDisplayName().get(0);
-							cmd = SetCommand.create(editingDomain, displayName,
-									FacesConfigPackage.eINSTANCE
-											.getDisplayNameType_TextContent(),
-									newDisplayNameValue);
-						} else {
-							DisplayNameType displayNameType = FacesConfigFactory.eINSTANCE
-									.createDisplayNameType();
-							displayNameType.setTextContent(newDisplayNameValue);
-							displayNameType.eAdapters().add(
-									getRenderKitGeneralAdapter());
-
-							cmd = AddCommand.create(editingDomain, Renderkit,
-									FacesConfigPackage.eINSTANCE
-											.getRenderKitType_DisplayName(),
-									displayNameType);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-
-				});
-
-		descriptionField = new StringDialogField(2);
-		descriptionField
-				.setLabelText(EditorMessages.RenderKitGeneralSection_Label_Description);
-		descriptionField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		descriptionField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String newDescriptionValue = ((StringDialogField) field)
-								.getText().trim();
-						newDescriptionValue = ModelUtil
-								.escapeEntities(newDescriptionValue);
-						Command cmd = null;
-						RenderKitType Renderkit = (RenderKitType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (Renderkit.getDescription().size() > 0) {
-							DescriptionType description = (DescriptionType) Renderkit
-									.getDescription().get(0);
-							cmd = SetCommand.create(editingDomain, description,
-									FacesConfigPackage.eINSTANCE
-											.getDescriptionType_TextContent(),
-									newDescriptionValue);
-						} else {
-							DescriptionType description = FacesConfigFactory.eINSTANCE
-									.createDescriptionType();
-							description.setTextContent(newDescriptionValue);
-							description.eAdapters().add(
-									getRenderKitGeneralAdapter());
-
-							cmd = AddCommand.create(editingDomain, Renderkit,
-									FacesConfigPackage.eINSTANCE
-											.getRenderKitType_Description(),
-									description);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-				});
-
-		renderkitIdField = new StringDialogField();
-		// renderkitIdField.setRequired(true);
-		renderkitIdField
-				.setLabelText(EditorMessages.RenderKitGeneralSection_Label_RenderKitID);
-		renderkitIdField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		renderkitIdField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						RenderKitIdType RenderkitId = FacesConfigFactory.eINSTANCE
-								.createRenderKitIdType();
-						RenderkitId.setTextContent(((StringDialogField) field)
-								.getText());
-
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getRenderKitType_RenderKitId(),
-									RenderkitId);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-					}
-				});
-
-		renderkitClassField = new ClassButtonDialogField(null);
-		// renderkitClassField.setRequired(true);
-		renderkitClassField
-				.setLabelText(EditorMessages.RenderKitGeneralSection_Label_RenderKitClass);
-		renderkitClassField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		renderkitClassField.setProject((IProject) getPage().getEditor()
-				.getAdapter(IProject.class));
-		LayoutUtil.setHorizontalGrabbing(renderkitClassField.getTextControl(
-				toolkit, container));
-
-		renderkitClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-
-						RenderKitClassType RenderkitClass = FacesConfigFactory.eINSTANCE
-								.createRenderKitClassType();
-						RenderkitClass
-								.setTextContent(((StringDialogField) field)
-										.getText());
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getRenderKitType_RenderKitClass(),
-									RenderkitClass);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-
-					}
-				});
-		renderkitClassField
-				.setSuperClassName(IFacesConfigConstants.RENDER_KIT_SUPER_CLASS);
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		refresh();
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		super.refresh();
-		Object input = this.getInput();
-		if (input instanceof RenderKitType) {
-			RenderKitType Renderkit = (RenderKitType) input;
-
-			if (Renderkit.getDisplayName().size() > 0) {
-				DisplayNameType displayName = (DisplayNameType) Renderkit
-						.getDisplayName().get(0);
-				displayNameField.setTextWithoutUpdate(displayName
-						.getTextContent());
-			} else {
-				displayNameField.setTextWithoutUpdate("");
-			}
-
-			if (Renderkit.getDescription().size() > 0) {
-				DescriptionType description = (DescriptionType) Renderkit
-						.getDescription().get(0);
-				String descriptionString = description.getTextContent();
-				descriptionString = ModelUtil
-						.unEscapeEntities(descriptionString);
-				descriptionField.setTextWithoutUpdate(descriptionString);
-			} else {
-				descriptionField.setTextWithoutUpdate("");
-			}
-
-			if (Renderkit.getRenderKitId() != null) {
-				renderkitIdField.setTextWithoutUpdate(Renderkit
-						.getRenderKitId().getTextContent());
-			} else {
-				renderkitIdField.setTextWithoutUpdate("");
-			}
-
-			if (Renderkit.getRenderKitClass() != null) {
-				renderkitClassField.setTextWithoutUpdate(Renderkit
-						.getRenderKitClass().getTextContent());
-			} else {
-				renderkitClassField.setTextWithoutUpdate("");
-			}
-		}
-	}
-
-	/**
-	 * Add RenderKitGeneralAdapter onto <render-kit> and the first
-	 * <display-name> and <description> elements.
-	 */
-	protected void addAdaptersOntoInput(Object newInput) {
-		RenderKitType renderkit = (RenderKitType) newInput;
-		if (EcoreUtil.getExistingAdapter(renderkit,
-				RenderkitGeneralSection.class) == null) {
-
-			renderkit.eAdapters().add(getRenderKitGeneralAdapter());
-		}
-
-		if (renderkit.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) renderkit
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					RenderkitGeneralSection.class) == null) {
-
-				displayName.eAdapters().add(getRenderKitGeneralAdapter());
-			}
-		}
-
-		if (renderkit.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) renderkit
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					RenderkitGeneralSection.class) == null) {
-
-				description.eAdapters().add(getRenderKitGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * Remove RenderKitGeneralAdapter from <render-kit> and the first
-	 * <display-name> and <description> elements.
-	 */
-	protected void removeAdaptersFromInput(Object oldInput) {
-		RenderKitType renderkit = (RenderKitType) oldInput;
-		if (EcoreUtil.getExistingAdapter(renderkit,
-				RenderkitGeneralSection.class) != null) {
-			renderkit.eAdapters().remove(getRenderKitGeneralAdapter());
-		}
-		if (renderkit.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) renderkit
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					RenderkitGeneralSection.class) != null) {
-
-				displayName.eAdapters().remove(getRenderKitGeneralAdapter());
-			}
-		}
-
-		if (renderkit.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) renderkit
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					RenderkitGeneralSection.class) != null) {
-
-				description.eAdapters().remove(getRenderKitGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * 
-	 * @return
-	 */
-	private Adapter getRenderKitGeneralAdapter() {
-
-		if (renderKitGeneralAdapter == null) {
-			renderKitGeneralAdapter = new RenderKitGeneralAdapter();
-		}
-		return renderKitGeneralAdapter;
-	}
-
-	/**
-	 * The adapter that will be added onto <render-kit> element, to listen the
-	 * events of the children that are displayed in this section, notify the
-	 * section to refresh.
-	 * 
-	 * @author sfshi
-	 * 
-	 */
-	class RenderKitGeneralAdapter extends AdapterImpl {
-
-		public boolean isAdapterForType(Object type) {
-			if (type == RenderkitGeneralSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-
-			if (msg.getEventType() == Notification.ADD
-					|| msg.getEventType() == Notification.REMOVE
-					|| msg.getEventType() == Notification.SET) {
-				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getRenderKitType_RenderKitId()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getRenderKitType_RenderKitClass()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getRenderKitType_Description()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getRenderKitType_DisplayName()) {
-					refresh();
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getDisplayNameType_TextContent()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getDescriptionType_TextContent()) {
-					refresh();
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RenderkitMasterSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RenderkitMasterSection.java
deleted file mode 100644
index 3e8e20f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RenderkitMasterSection.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class RenderkitMasterSection extends FacesConfigMasterSection {
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page
-	 */
-	public RenderkitMasterSection(Composite parent, IManagedForm managedForm,
-			FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		super(parent, managedForm, toolkit, page, null, null);
-		getSection().setText(EditorMessages.RenderKitMasterSection_Name); //$NON-NLS-1$
-		getSection().setDescription(
-				EditorMessages.RenderKitMasterSection_Description);
-	}
-
-	/**
-	 * Config the table viwer, set a filter for it, only the object of
-	 * RenderKitType will be selected.
-	 */
-	protected void configViewer(StructuredViewer structuredViewer) {
-		super.configViewer(structuredViewer);
-		structuredViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getRenderKitType()
-						.isInstance(element);
-			}
-		});
-
-	}
-
-	/**
-	 * Create a new render kit.
-	 */
-	protected void addButtonSelected(SelectionEvent e) {
-		RenderKitType Renderkit = FacesConfigFactory.eINSTANCE
-				.createRenderKitType();
-
-		Command command = AddCommand.create(getEditingDomain(),
-				this.getInput(), FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_RenderKit(), Renderkit);
-
-		if (command.canExecute()) {
-			getEditingDomain().getCommandStack().execute(command);
-			IStructuredSelection selection = new StructuredSelection(Renderkit);
-			getStructuredViewer().refresh();
-			getStructuredViewer().setSelection(selection);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ValidatorGeneralSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ValidatorGeneralSection.java
deleted file mode 100644
index 649b7f7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ValidatorGeneralSection.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ModelUtil;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class ValidatorGeneralSection extends AbstractFacesConfigSection {
-
-	private StringDialogField displayNameField;
-
-	private StringDialogField descriptionField;
-
-	private StringDialogField validatorIDField;
-
-	private ClassButtonDialogField validatorClassField;
-
-	private ValidatorGeneralAdapter validatorGeneralAdapter;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public ValidatorGeneralSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		getSection()
-				.setText(EditorMessages.ValidatorGeneralSection_Name);
-		getSection().setDescription(
-				EditorMessages.ValidatorGeneralSection_Description);
-	}
-
-	/**
-	 * 
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		int numberOfColumns = 4;
-		GridLayout layout = new GridLayout(numberOfColumns, false);
-		container.setLayout(layout);
-		GridData td = new GridData(GridData.FILL_HORIZONTAL);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-		displayNameField = new StringDialogField();
-		displayNameField
-				.setLabelText(EditorMessages.ValidatorGeneralSection_Label_DisplayName);
-		displayNameField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		displayNameField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						String newDisplayNameValue = ((StringDialogField) field)
-								.getText().trim();
-						Command cmd = null;
-						ValidatorType validator = (ValidatorType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (validator.getDisplayName().size() > 0) {
-							DisplayNameType displayName = (DisplayNameType) validator
-									.getDisplayName().get(0);
-							cmd = SetCommand.create(editingDomain, displayName,
-									FacesConfigPackage.eINSTANCE
-											.getDisplayNameType_TextContent(),
-									newDisplayNameValue);
-						} else {
-							DisplayNameType displayNameType = FacesConfigFactory.eINSTANCE
-									.createDisplayNameType();
-							displayNameType.setTextContent(newDisplayNameValue);
-							displayNameType.eAdapters().add(
-									getValidatorGeneralAdapter());
-
-							cmd = AddCommand.create(editingDomain, validator,
-									FacesConfigPackage.eINSTANCE
-											.getValidatorType_DisplayName(),
-									displayNameType);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-
-				});
-
-		descriptionField = new StringDialogField(2);
-		descriptionField
-				.setLabelText(EditorMessages.ValidatorGeneralSection_Label_Description);
-		descriptionField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		descriptionField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String newDescriptionValue = ((StringDialogField) field)
-								.getText().trim();
-						newDescriptionValue = ModelUtil
-								.escapeEntities(newDescriptionValue);
-						Command cmd = null;
-						ValidatorType validator = (ValidatorType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (validator.getDescription().size() > 0) {
-							DescriptionType description = (DescriptionType) validator
-									.getDescription().get(0);
-							cmd = SetCommand.create(editingDomain, description,
-									FacesConfigPackage.eINSTANCE
-											.getDescriptionType_TextContent(),
-									newDescriptionValue);
-						} else {
-							DescriptionType description = FacesConfigFactory.eINSTANCE
-									.createDescriptionType();
-							description.setTextContent(newDescriptionValue);
-							description.eAdapters().add(
-									getValidatorGeneralAdapter());
-
-							cmd = AddCommand.create(editingDomain, validator,
-									FacesConfigPackage.eINSTANCE
-											.getValidatorType_Description(),
-									description);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-				});
-
-		validatorIDField = new StringDialogField();
-		// validatorIDField.setRequired(true);
-		validatorIDField
-				.setLabelText(EditorMessages.ValidatorGeneralSection_Label_ValidatorID);
-		validatorIDField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		validatorIDField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						ValidatorIdType ValidatorType = FacesConfigFactory.eINSTANCE
-								.createValidatorIdType();
-						ValidatorType
-								.setTextContent(((StringDialogField) field)
-										.getText());
-
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getValidatorType_ValidatorId(),
-									ValidatorType);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-					}
-				});
-
-		validatorClassField = new ClassButtonDialogField(null);
-		// validatorClassField.setRequired(true);
-		validatorClassField
-				.setLabelText(EditorMessages.ValidatorGeneralSection_Label_ValidatorClass);
-		validatorClassField.setProject((IProject) getPage().getEditor()
-				.getAdapter(IProject.class));
-		validatorClassField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(validatorClassField.getTextControl(
-				toolkit, container));
-
-		validatorClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-
-						ValidatorClassType ValidatorClass = FacesConfigFactory.eINSTANCE
-								.createValidatorClassType();
-						ValidatorClass
-								.setTextContent(((StringDialogField) field)
-										.getText());
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getValidatorType_ValidatorClass(),
-									ValidatorClass);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-
-					}
-				});
-		validatorClassField
-				.setInterface(IFacesConfigConstants.VALIDATOR_INTERFACE);
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		refresh();
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		super.refresh();
-		Object input = this.getInput();
-		if (input instanceof ValidatorType) {
-			ValidatorType validator = (ValidatorType) input;
-
-			if (validator.getDisplayName().size() > 0) {
-				DisplayNameType displayName = (DisplayNameType) validator
-						.getDisplayName().get(0);
-				displayNameField.setTextWithoutUpdate(displayName
-						.getTextContent());
-			} else {
-				displayNameField.setTextWithoutUpdate("");
-			}
-
-			if (validator.getDescription().size() > 0) {
-				DescriptionType description = (DescriptionType) validator
-						.getDescription().get(0);
-				String descriptionString = description.getTextContent();
-				descriptionString = ModelUtil
-						.unEscapeEntities(descriptionString);
-				descriptionField.setTextWithoutUpdate(descriptionString);
-			} else {
-				descriptionField.setTextWithoutUpdate("");
-			}
-
-			if (validator.getValidatorId() != null) {
-				validatorIDField.setTextWithoutUpdate(validator
-						.getValidatorId().getTextContent());
-			} else {
-				validatorIDField.setTextWithoutUpdate("");
-			}
-
-			if (validator.getValidatorClass() != null) {
-				validatorClassField.setTextWithoutUpdate(validator
-						.getValidatorClass().getTextContent());
-			} else {
-				validatorClassField.setTextWithoutUpdate("");
-			}
-		}
-	}
-
-	/**
-	 * Add ValidatorGeneralAdapter onto <validator> and the first <display-name>
-	 * and <description> elements.
-	 */
-	protected void addAdaptersOntoInput(Object newInput) {
-		ValidatorType validator = (ValidatorType) newInput;
-		if (EcoreUtil.getExistingAdapter(validator,
-				ValidatorGeneralSection.class) == null) {
-
-			validator.eAdapters().add(getValidatorGeneralAdapter());
-		}
-
-		if (validator.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) validator
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					ValidatorGeneralSection.class) == null) {
-
-				displayName.eAdapters().add(getValidatorGeneralAdapter());
-			}
-		}
-
-		if (validator.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) validator
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					ValidatorGeneralSection.class) == null) {
-
-				description.eAdapters().add(getValidatorGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * Remove ValidatorGeneralAdapter from <validator> and the first
-	 * <display-name> and <description> elements.
-	 */
-	protected void removeAdaptersFromInput(Object oldInput) {
-		ValidatorType validator = (ValidatorType) oldInput;
-		if (EcoreUtil.getExistingAdapter(validator,
-				ValidatorGeneralSection.class) != null) {
-			validator.eAdapters().remove(getValidatorGeneralAdapter());
-		}
-		if (validator.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) validator
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					ValidatorGeneralSection.class) != null) {
-
-				displayName.eAdapters().remove(getValidatorGeneralAdapter());
-			}
-		}
-
-		if (validator.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) validator
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					ValidatorGeneralSection.class) != null) {
-
-				description.eAdapters().remove(getValidatorGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * 
-	 * @return
-	 */
-	private Adapter getValidatorGeneralAdapter() {
-
-		if (validatorGeneralAdapter == null) {
-			validatorGeneralAdapter = new ValidatorGeneralAdapter();
-		}
-		return validatorGeneralAdapter;
-	}
-
-	/**
-	 * The adapter that will be added onto <validator> element, to listen the
-	 * events of the children that are displayed in this section, notify the
-	 * section to refresh.
-	 * 
-	 * @author sfshi
-	 * 
-	 */
-	class ValidatorGeneralAdapter extends AdapterImpl {
-
-		public boolean isAdapterForType(Object type) {
-			if (type == ValidatorGeneralSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-
-			if (msg.getEventType() == Notification.ADD
-					|| msg.getEventType() == Notification.REMOVE
-					|| msg.getEventType() == Notification.SET) {
-				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getValidatorType_ValidatorId()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getValidatorType_ValidatorClass()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getValidatorType_Description()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getValidatorType_DisplayName()) {
-					refresh();
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getDisplayNameType_TextContent()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getDescriptionType_TextContent()) {
-					refresh();
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ValidatorMasterSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ValidatorMasterSection.java
deleted file mode 100644
index 034e70f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ValidatorMasterSection.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class ValidatorMasterSection extends FacesConfigMasterSection {
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page
-	 */
-	public ValidatorMasterSection(Composite parent, IManagedForm managedForm,
-			FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		super(parent, managedForm, toolkit, page, null, null);
-		getSection().setText(EditorMessages.ValidatorMasterSection_Name); //$NON-NLS-1$
-		getSection().setDescription(
-				EditorMessages.ValidatorMasterSection_Description);
-	}
-
-	/**
-	 * Config the table viwer, set a filter for it, only the object of
-	 * ValidatorType will be selected.
-	 */
-	protected void configViewer(StructuredViewer structuredViewer) {
-		super.configViewer(structuredViewer);
-		structuredViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getValidatorType()
-						.isInstance(element);
-			}
-		});
-
-	}
-
-	/**
-	 * Create a new Validator.
-	 */
-	protected void addButtonSelected(SelectionEvent e) {
-		ValidatorType Validator = FacesConfigFactory.eINSTANCE
-				.createValidatorType();
-
-		Command command = AddCommand.create(getEditingDomain(),
-				this.getInput(), FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_Validator(), Validator);
-
-		if (command.canExecute()) {
-			getEditingDomain().getCommandStack().execute(command);
-			IStructuredSelection selection = new StructuredSelection(Validator);
-			getStructuredViewer().refresh();
-			getStructuredViewer().setSelection(selection);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaBeanProperty.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaBeanProperty.java
deleted file mode 100644
index fcd01ca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaBeanProperty.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.util;
-
-import org.eclipse.jdt.core.IMethod;
-
-/**
- * This class is used to encapsulate the property following the java bean's
- * spec.
- * 
- * @author xgzhang
- * @version
- */
-public class JavaBeanProperty {
-	private String name;
-
-	private String qualifiedType;
-
-	private String signatureType;
-
-	private IMethod getterMethod;
-
-	private IMethod setterMethod;
-
-	/**
-	 * @param name 
-	 * @param signatureType 
-	 * @param getterMethod 
-	 * @param setterMethod 
-	 */
-	public JavaBeanProperty(String name, String signatureType,
-			IMethod getterMethod, IMethod setterMethod) {
-		this.name = name;
-		this.signatureType = signatureType;
-
-		this.getterMethod = getterMethod;
-		this.setterMethod = setterMethod;
-	}
-
-	/**
-	 * @return Returns the name.
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * @return Returns the setterMethod.
-	 */
-	public IMethod getSetterMethod() {
-		return setterMethod;
-	}
-
-	/**
-	 * @return Returns the setterMethod.
-	 */
-	public IMethod getGetterMethod() {
-		return getterMethod;
-	}
-
-	/**
-	 * @return Returns the type.
-	 */
-	public String getQualifiedType() {
-		if (qualifiedType == null) {
-			IMethod getterSetterMethod = getterMethod != null ? getterMethod
-					: setterMethod;
-
-			qualifiedType = JavaClassUtils.getQualifiedTypeNameInTypeHierarchy(
-					getterSetterMethod.getDeclaringType(), signatureType);
-		}
-		return qualifiedType;
-	}
-
-	/**
-	 * @return Returns the signatureType.
-	 */
-	public String getSignatureType() {
-		return signatureType;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaBeanUtils.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaBeanUtils.java
deleted file mode 100644
index 59283e3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaBeanUtils.java
+++ /dev/null
@@ -1,775 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.util;
-
-import java.beans.Introspector;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JavaModelUtil;
-
-/**
- * This utility class is used to access java bean class, e.g., get java bean's
- * property
- * 
- * @author xgzhang
- * @version
- */
-public final class JavaBeanUtils {
-	/**
-	 * fully qualified name of a List
-	 */
-	private static final String JAVA_UTIL_LIST = "java.util.List";
-
-	/**
-	 * fully qualifed name of a Map
-	 */
-	private static final String JAVA_UTIL_MAP = "java.util.Map";
-
-	/**
-	 * 
-	 */
-	private JavaBeanUtils() {
-		super();
-	}
-
-	/**
-	 * get the getter method according to property name
-	 * 
-	 * @param type
-	 * @param propertyName
-	 * @return - can be <b>null</b>, if not found
-	 * @throws JavaModelException
-	 * @throws JavaModelException
-	 */
-	private static IMethod getPropertyGetterMethod(IType type,
-			String propertyName)  {
-		if (type == null || !type.exists() || propertyName == null) {
-			return null;
-		}
-		IMethod getterMethod = null;
-
-		String methodBaseName = null;
-		// Uppercase 1st letter
-		if (propertyName.length() == 1) {
-			methodBaseName = propertyName.substring(0, 1).toUpperCase();
-		} else {
-			methodBaseName = propertyName.substring(0, 1).toUpperCase()
-					+ propertyName.substring(1);
-		}
-
-		String getterMethodName = "get" + methodBaseName;
-
-		getterMethod = type.getMethod(getterMethodName, null);
-		if (getterMethod == null || !getterMethod.exists()
-				|| !JavaClassUtils.isPublicMethod(getterMethod)) {
-			getterMethodName = "is" + methodBaseName;
-			getterMethod = type.getMethod(getterMethodName, null);
-
-			if (getterMethod == null || !getterMethod.exists()
-					|| !JavaClassUtils.isPublicMethod(getterMethod)) {
-				getterMethod = null;
-			}
-		}
-		return getterMethod;
-	}
-
-	/**
-	 * get the getter method in the type hierarchy according to property name
-	 * 
-	 * @param type
-	 * @param propertyName
-	 * @return - can be <b>null</b>, if not found
-	 * @throws JavaModelException
-	 * @throws JavaModelException
-	 */
-	private static IMethod getPropertyGetterMethodInTypeHierarchy(IType type,
-			String propertyName) throws JavaModelException {
-		if (type == null || !type.exists() || propertyName == null) {
-			return null;
-		}
-		IMethod getterMethod = null;
-
-		getterMethod = getPropertyGetterMethod(type, propertyName);
-
-		if (getterMethod == null) {
-			ITypeHierarchy typeHierarchy = null;
-			typeHierarchy = type.newSupertypeHierarchy(null);
-
-			if (typeHierarchy == null) {
-				return null;
-			}
-
-			IType[] superTypes = typeHierarchy.getAllSuperclasses(type);
-
-			if (superTypes == null || superTypes.length == 0) {
-				return null;
-			}
-			for (int i = 0; i < superTypes.length; i++) {
-				if (!superTypes[i].getFullyQualifiedName().equals(
-						"java.lang.Object")) {
-					getterMethod = getPropertyGetterMethod(superTypes[i],
-							propertyName);
-					if (getterMethod != null) {
-						break;
-					}
-				}
-			}
-		}
-		return getterMethod;
-	}
-
-	/**
-	 * get the setter method in the type hierarchy according to property name
-	 * 
-	 * @param type
-	 * @param propertyName
-	 * @return - can be <b>null</b>, if not found
-	 * @throws JavaModelException
-	 */
-	private static IMethod getPropertySetterMethodInTypeHierarchy(IType type,
-			String propertyName) throws JavaModelException {
-		if (type == null || !type.exists() || propertyName == null) {
-			return null;
-		}
-		IMethod setterMethod = null;
-
-		setterMethod = getPropertySetterMethod(type, propertyName);
-
-		if (setterMethod == null) {
-			ITypeHierarchy typeHierarchy = null;
-			typeHierarchy = type.newSupertypeHierarchy(null);
-
-			if (typeHierarchy == null) {
-				return null;
-			}
-
-			IType[] superTypes = typeHierarchy.getAllSuperclasses(type);
-
-			if (superTypes == null || superTypes.length == 0) {
-				return null;
-			}
-			for (int i = 0; i < superTypes.length; i++) {
-				if (!superTypes[i].getFullyQualifiedName().equals(
-						"java.lang.Object")) {
-					setterMethod = getPropertySetterMethod(superTypes[i],
-							propertyName);
-					if (setterMethod != null) {
-						break;
-					}
-				}
-			}
-		}
-
-		return setterMethod;
-	}
-
-	/**
-	 * get the setter method according to property name
-	 * 
-	 * @param type
-	 * @param propertyName
-	 * @return - can be <b>null</b>, if not found
-	 * @throws JavaModelException
-	 */
-	private static IMethod getPropertySetterMethod(IType type,
-			String propertyName) throws JavaModelException {
-		if (type == null || !type.exists() || propertyName == null) {
-			return null;
-		}
-		IMethod setterMethod = null;
-
-		String methodBaseName = null;
-		// Uppercase 1st letter
-		if (propertyName.length() == 1) {
-			methodBaseName = propertyName.substring(0, 1).toUpperCase();
-		} else {
-			methodBaseName = propertyName.substring(0, 1).toUpperCase()
-					+ propertyName.substring(1);
-		}
-
-		String setterMethodName = "set" + methodBaseName;
-
-		IMethod[] methods = null;
-
-		methods = type.getMethods();
-
-		if (methods == null || methods.length == 0) {
-			return null;
-		}
-
-		for (int i = 0; i < methods.length; i++) {
-			if (methods[i].getElementName().equals(setterMethodName)) {
-				if (methods[i] == null || !methods[i].exists()
-						|| !JavaClassUtils.isPublicMethod(methods[i])) {
-					continue;
-				}
-
-				// Method must return void
-				String returnType = methods[i].getReturnType();
-				if (!returnType.equals(Signature.SIG_VOID)) {
-					continue;
-				}
-
-				String params[] = methods[i].getParameterTypes();
-				// method must have only one argument
-				if (params.length != 1) {
-					continue;
-				}
-				setterMethod = methods[i];
-			}
-		}
-
-		return setterMethod;
-	}
-
-	/**
-	 * Check whether the propertyName is bean's property or not.
-	 * 
-	 * @param baseType
-	 * @param propertyName
-	 * 
-	 * @return - True means the property name is valid bean's property,
-	 *         otherwise, not.
-	 * 
-	 */
-	public static boolean isBeanProperty(IType baseType, String propertyName)
-    {
-		if (baseType == null || !baseType.exists() || propertyName == null) {
-			return false;
-		}
-
-		return (getBeanPropertyType(baseType, propertyName) != null);
-	}
-
-	/**
-	 * get the bean's property type
-	 * 
-	 * @param baseType
-	 * @param propertyName
-	 * @return - can be <b>null</b>, if not found
-	 * 
-	 */
-	public static IType getBeanPropertyType(IType baseType, String propertyName) {
-		if (baseType == null || !baseType.exists() || propertyName == null) {
-			return null;
-		}
-
-		String typeSignature = null;
-		IMethod getterMethod = null;
-		IMethod setterMethod = null;
-
-		IType declaredType = baseType;
-		try {
-			getterMethod = getPropertyGetterMethodInTypeHierarchy(baseType,
-					propertyName);
-			setterMethod = getPropertySetterMethodInTypeHierarchy(baseType,
-					propertyName);
-		} catch (JavaModelException e1) {
-			// Need not any error handling.
-		}
-
-		if (getterMethod != null && setterMethod == null) {
-			declaredType = getterMethod.getDeclaringType();
-			try {
-				typeSignature = getterMethod.getReturnType();
-			} catch (JavaModelException e2) {
-				// Need not any error handling.
-			}
-		} else if (setterMethod != null && getterMethod == null) {
-			declaredType = setterMethod.getDeclaringType();
-			typeSignature = setterMethod.getParameterTypes()[0];
-		} else if (setterMethod != null && getterMethod != null) {
-			declaredType = getterMethod.getDeclaringType();
-			try {
-				// FIXME: should check the type hierachy
-				if (getterMethod.getReturnType().equals(
-						setterMethod.getParameterTypes()[0])) {
-					typeSignature = getterMethod.getReturnType();
-				}
-			} catch (JavaModelException e2) {
-				// Need not any error handling.
-			}
-		}
-
-		if (typeSignature == null) {
-			return null;
-		}
-
-		IType type = null;
-
-		try {
-			String typeName = JavaModelUtil.getResolvedTypeName(typeSignature,
-					declaredType);
-			if (typeName != null) {
-				type = baseType.getJavaProject().findType(typeName);
-			}
-		} catch (JavaModelException e) {
-			// Need not any error handling.
-		}
-		return type;
-	}
-
-	/**
-	 * get the bean's property's getter and setter methods.
-	 * 
-	 * @param baseType
-	 * @param propertyName
-	 * @return - IMethod[], the first is getter and the second is setter method,
-	 *         however, both of them can be null.
-	 */
-	public static IMethod[] getBeanPropertyMethods(IType baseType,
-			String propertyName) {
-		if (baseType == null || !baseType.exists() || propertyName == null) {
-			return null;
-		}
-
-		IMethod[] methods = new IMethod[2];
-
-		IMethod getterMethod = null;
-		IMethod setterMethod = null;
-		try {
-			getterMethod = getPropertyGetterMethodInTypeHierarchy(baseType,
-					propertyName);
-
-			setterMethod = getPropertySetterMethodInTypeHierarchy(baseType,
-					propertyName);
-		} catch (JavaModelException e) {
-			// Need not any error handling.
-		}
-
-		if (getterMethod != null && setterMethod == null) {
-			methods[0] = getterMethod;
-		} else if (setterMethod != null && getterMethod == null) {
-			methods[1] = setterMethod;
-		} else if (setterMethod != null && getterMethod != null) {
-			try {
-				// FIXME: should check the type hierachy
-				if (getterMethod.getReturnType().equals(
-						setterMethod.getParameterTypes()[0])) {
-					methods[0] = getterMethod;
-					methods[1] = setterMethod;
-				}
-			} catch (JavaModelException e1) {
-				// Need not any error handling.
-			}
-		}
-
-		return methods;
-	}
-
-	/**
-	 * check whether the type implements <code>java.util.List</code>
-	 * 
-	 * @param type
-	 * @return - True if the type is the sub class of
-	 *         <code>java.util.List</code>, otherwise, not.
-	 */
-	public static boolean isListType(IType type) {
-		if (type == null) {
-			return false;
-		}
-		if (type.getFullyQualifiedName().equalsIgnoreCase(JAVA_UTIL_LIST)) {
-			return true;
-		}
-
-		return JavaClassUtils.isSubClassOf(type.getJavaProject(), type
-				.getFullyQualifiedName(), JAVA_UTIL_LIST);
-	}
-
-	/**
-	 * check whether the type implements <code>java.util.Map</code>
-	 * 
-	 * @param type
-	 * @return - True if the type is the sub class of <code>java.uitl.Map</code>,
-	 *         otherwise, not.
-	 */
-	public static boolean isMapType(IType type) {
-		if (type == null) {
-			return false;
-		}
-		if (type.getFullyQualifiedName().equalsIgnoreCase(JAVA_UTIL_MAP)) {
-			return true;
-		}
-
-		return JavaClassUtils.isSubClassOf(type.getJavaProject(), type
-				.getFullyQualifiedName(), JAVA_UTIL_MAP);
-	}
-
-	/**
-	 * Test for method inclusion in bindings list.
-	 * <p>
-	 * This test has the following conditions:
-	 * </p>
-	 * <ul>
-	 * <li>method starts with <code>get</code></li>
-	 * <li>method has no arguments</li>
-	 * <li>method does not return void</li>
-	 * </ul>
-	 * 
-	 * @param method -
-	 *            the IMethod to examine
-	 * @return boolean - true, if method satisfies the condition test
-	 */
-	public static boolean isGetterMethod(IMethod method) {
-		try {
-			if (!JavaClassUtils.isPublicMethod(method)) {
-				return false;
-			}
-			String params[] = method.getParameterTypes();
-			// Has no arguments
-			if (params.length > 0) {
-				return false;
-			}
-
-			// Starts with "get"
-			if (!(method.getElementName().startsWith("get") || method.getElementName().startsWith("is"))) //$NON-NLS-1$
-			{
-				return false;
-			}
-			// Does not return void
-			String rtn = method.getReturnType();
-			if (!rtn.equals(Signature.SIG_VOID)) {
-				return true;
-			}
-		} catch (JavaModelException e) {
-			// Need not any error handling.
-		}
-		return false;
-	}
-
-	/**
-	 * Test for method inclusion in bindings list.
-	 * <p>
-	 * This test has the following conditions:
-	 * </p>
-	 * <ul>
-	 * <li>method starts with <code>set</code></li>
-	 * <li>method returns void</li>
-	 * </ul>
-	 * 
-	 * @param method -
-	 *            the IMethod to examine
-	 * @return boolean - true, if method satisfies the condition test
-	 */
-	public static boolean isSetterMethod(IMethod method) {
-		try {
-			if (!JavaClassUtils.isPublicMethod(method)) {
-				return false;
-			}
-			// Starts with "set"
-			if (!method.getElementName().startsWith("set")) //$NON-NLS-1$
-			{
-				return false;
-			}
-
-			// the parameter's number should be one.
-			if (method.getParameterTypes().length != 1) {
-				return false;
-			}
-			// Returns void
-			String rtn = method.getReturnType();
-			if (rtn.equals(Signature.SIG_VOID)) {
-				return true;
-			}
-		} catch (JavaModelException e) {
-			// Need not any error handling.
-		}
-		return false;
-	}
-
-	/**
-	 * set the first character into low case.
-	 * 
-	 * @param str
-	 * @return str with the first char lower cased
-	 */
-	public static String toLowCaseFirstChar(String str) {
-		// change the first alphabet to lowcase.
-		if (str != null && str.length() > 0) {
-			if (str.length() == 1) {
-				str = str.toLowerCase();
-			} else {
-				str = str.substring(0, 1).toLowerCase() + str.substring(1);
-			}
-		}
-		return str;
-	}
-
-	/**
-	 * set the first character into low case.
-	 * 
-	 * @param str
-	 * @return str with the first char upper-cased
-	 */
-	public static String toUpperCaseFirstChar(String str) {
-		// change the first alphabet to lowcase.
-		if (str != null && str.length() > 0) {
-			if (str.length() == 1) {
-				str = str.toUpperCase();
-			} else {
-				str = str.substring(0, 1).toUpperCase() + str.substring(1);
-			}
-		}
-		return str;
-	}
-
-	/**
-	 * get property name from getter method.
-	 * 
-	 * @param method
-	 * @return - can be <b>null</b>, if the method is not a valid getter method
-	 */
-	public static String getPropertyNameFromGetterMethod(IMethod method) {
-		if (!isGetterMethod(method)) {
-			return null;
-		}
-		String methodName = method.getElementName();
-		String propertyName = null;
-		// Starts with "get"
-		if (methodName.startsWith("get") && methodName.length() > 3) {
-			propertyName = methodName.substring(3);
-		} else if (methodName.startsWith("is") && methodName.length() > 2) // Starts
-		// with
-		// "is"
-		{
-			propertyName = methodName.substring(2);
-		}
-		propertyName = Introspector.decapitalize(propertyName);
-		return propertyName;
-	}
-
-	/**
-	 * get property name from setter class.
-	 * 
-	 * @param method
-	 * @return - can be <b>null</b>, if the method is not a valid setter method
-	 */
-	public static String getPropertyNameFromSetterMethod(IMethod method) {
-		if (!isSetterMethod(method)) {
-			return null;
-		}
-		String methodName = method.getElementName();
-		String propertyName = null;
-		// Starts with "get"
-		if (methodName.startsWith("set") && methodName.length() > 3) {
-			propertyName = methodName.substring(3);
-		}
-		propertyName = Introspector.decapitalize(propertyName);
-		return propertyName;
-	}
-
-	/**
-	 * get the method with the same parameters
-	 * 
-	 * @param methods
-	 * @param visitedMethods
-	 * @param foundMethod
-	 * @param foundMethodName
-	 * @param foundParamTypes
-	 * @return
-	 */
-	private static IMethod getMethodWithSameParamters(IMethod[] methods,
-			Map visitedMethods, IMethod foundMethod, String foundMethodName,
-			String[] foundParamTypes) {
-		// get all qualified type name for the found method's parameters.
-		String[] foundParamQulifiedTypeNames = null;
-		if (foundParamTypes != null && foundParamTypes.length > 0) {
-			foundParamQulifiedTypeNames = new String[foundParamTypes.length];
-			for (int i = 0; i < foundParamTypes.length; i++) {
-				foundParamQulifiedTypeNames[i] = JavaClassUtils
-						.getQualifiedTypeNameInTypeHierarchy(foundMethod
-								.getDeclaringType(), foundParamTypes[i]);
-			}
-		}
-		for (int i = 0; i < methods.length; i++) {
-			if (visitedMethods.get(methods[i]) != null) {
-				continue;
-			}
-
-			if (!methods[i].getElementName().equals(foundMethodName)) {
-				continue;
-			}
-			if (methods[i].getParameterTypes() == null
-					&& foundParamTypes == null) {
-				return methods[i];
-			} else if (methods[i].getParameterTypes() != null
-					&& foundParamTypes != null
-					&& foundParamTypes.length == methods[i].getParameterTypes().length) {
-				boolean bSameParams = true;
-				String[] methodParamTypes = methods[i].getParameterTypes();
-				for (int j = 0; j < foundParamQulifiedTypeNames.length; j++) {
-					String methodParamQualifiedTypeName = JavaClassUtils
-							.getQualifiedTypeNameInTypeHierarchy(methods[i]
-									.getDeclaringType(), methodParamTypes[j]);
-					// if the qualified type name is not same or not subclass or
-					// supper class between each other.
-					if (!methodParamQualifiedTypeName
-							.equals(foundParamQulifiedTypeNames[j])
-							&& !JavaClassUtils.isSubClassOf(methods[i]
-									.getJavaProject(),
-									methodParamQualifiedTypeName,
-									foundParamQulifiedTypeNames[j])
-							&& !JavaClassUtils.isSubClassOf(methods[i]
-									.getJavaProject(),
-									foundParamQulifiedTypeNames[j],
-									methodParamQualifiedTypeName)) {
-						bSameParams = false;
-						break;
-					}
-				}
-				if (bSameParams) {
-					return methods[i];
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Creates an array of bean properties
-	 * 
-	 * 
-	 * @param classType
-	 * @return it can be <b>null</b>, if property is not found.
-	 */
-	public static JavaBeanProperty[] getBeanProperties(IType classType) {
-		IMethod[] methods;
-		try {
-			methods = JavaClassUtils.getMethods(classType);
-		} catch (JavaModelException e2) {
-			return null;
-		}
-
-		return getBeanProperties(classType, methods);
-	}
-
-	/**
-	 * Creates an array of bean properties
-	 * 
-	 * @param type
-	 * @param methods
-	 * 
-	 * @return - the array of java bean properties.
-	 */
-	public static JavaBeanProperty[] getBeanProperties(IType type,
-			IMethod[] methods) {
-		if (methods == null || methods.length == 0) {
-			return null;
-		}
-
-		List properties = new ArrayList();
-		Map visitedMethods = new HashMap();
-		for (int m = 0; m < methods.length; m++) {
-			String propertyName = null;
-			// if a property's getter method or setter method already visited,
-			// just skip it.
-			if (visitedMethods.get(methods[m]) != null) {
-				continue;
-			}
-
-			visitedMethods.put(methods[m], methods[m]);
-
-			// Check getter firstly
-			propertyName = JavaBeanUtils
-					.getPropertyNameFromGetterMethod(methods[m]);
-
-			if (propertyName != null && propertyName.length() > 0) //$NON-NLS-1$
-			{
-				String setterMethodName = "set"
-						+ JavaBeanUtils.toUpperCaseFirstChar(propertyName);
-
-				String getterReturnType = null;
-				try {
-					getterReturnType = methods[m].getReturnType();
-				} catch (JavaModelException e1) {
-					continue;
-				}
-				IMethod setterMethod = getMethodWithSameParamters(methods,
-						visitedMethods, methods[m], setterMethodName,
-						new String[] { getterReturnType });
-				if (setterMethod != null && setterMethod.exists()) {
-					visitedMethods.put(setterMethod, setterMethod);
-				}
-
-				properties.add(new JavaBeanProperty(propertyName,
-						getterReturnType, methods[m], setterMethod));
-				continue;
-			}
-
-			// Check setter secondly.
-			propertyName = JavaBeanUtils
-					.getPropertyNameFromSetterMethod(methods[m]);
-
-			if (propertyName != null && propertyName.length() > 0) //$NON-NLS-1$
-			{
-				// first form of getter method, "get..."
-				String getterMethodName = "get"
-						+ JavaBeanUtils.toUpperCaseFirstChar(propertyName);
-				IMethod getterMethod = getMethodWithSameParamters(methods,
-						visitedMethods, methods[m], getterMethodName, null);
-
-				if (getterMethod != null && getterMethod.exists()) {
-					try {
-						if (getterMethod.getReturnType().equals(
-								methods[m].getParameterTypes()[0])) {
-							visitedMethods.put(getterMethod, getterMethod);
-						}
-					} catch (JavaModelException e) {
-						// need not error logging
-					}
-				} else {
-					// another form of getter method, "is...".
-					getterMethodName = "is"
-							+ JavaBeanUtils.toUpperCaseFirstChar(propertyName);
-					getterMethod = getMethodWithSameParamters(methods,
-							visitedMethods, methods[m], getterMethodName, null);
-					try {
-						if (getterMethod != null
-								&& getterMethod.exists()
-								&& getterMethod.getReturnType().equals(
-										methods[m].getParameterTypes()[0])) {
-							visitedMethods.put(getterMethod, getterMethod);
-						}
-					} catch (JavaModelException e) {
-						// need not error logging
-					}
-				}
-
-				properties.add(new JavaBeanProperty(propertyName, methods[m]
-						.getParameterTypes()[0], getterMethod, methods[m]));
-				continue;
-			}
-		}
-
-		JavaBeanProperty[] propertyArray = (JavaBeanProperty[]) properties
-				.toArray(new JavaBeanProperty[properties.size()]);
-
-		Arrays.sort(propertyArray, new Comparator() {
-			public int compare(Object o1, Object o2) {
-				String name1 = ((JavaBeanProperty) o1).getName();
-				String name2 = ((JavaBeanProperty) o2).getName();
-				return name1.compareTo(name2);
-			}
-		});
-		return propertyArray;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaClassUtils.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaClassUtils.java
deleted file mode 100644
index 2983664..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaClassUtils.java
+++ /dev/null
@@ -1,529 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.util;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageDeclaration;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JavaModelUtil;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PartInitException;
-
-/**
- * This utility class defines typical operations on java class, such as check
- * public constructor, and check type is primitive or not, etc.
- * 
- * @author Jane Cantz, Xiao-guang Zhang
- */
-public class JavaClassUtils {
-	/**
-	 * Determines if a string contains any illegal characters
-	 * 
-	 * @param text -
-	 *            the string to test
-	 * @return boolean - true if an illegal character is found, otherwise false
-	 */
-	public static boolean hasIllegalCharacters(String text) {
-		if (text.length() == 0
-				|| !Character.isJavaIdentifierStart(text.charAt(0))) {
-			return true;
-		}
-		for (int i = 1; i < text.length(); i++) {
-			if (!Character.isJavaIdentifierPart(text.charAt(i))) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Test for constructor.
-	 * <p>
-	 * This test determines if the class has any constructors
-	 * </p>
-	 * 
-	 * @param methods -
-	 *            the IMethod array to examine
-	 * @return boolean - true, if method has no constructors
-	 */
-	public static boolean hasNoConstructor(IMethod[] methods) {
-		for (int m = 0; m < methods.length; m++) {
-			try {
-				if (methods[m].isConstructor()) {
-					return false;
-				}
-			} catch (JavaModelException e) {
-                // suppress: this is possible; fall through
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * check whether the method is public or not.
-	 * 
-	 * @param method
-	 * @return true if method is public
-	 */
-	public static boolean isPublicMethod(IMethod method) {
-		int accessFlags = 0;
-
-		try {
-			accessFlags = method.getFlags();
-		} catch (JavaModelException e) {
-			return false;
-		}
-
-		boolean isPublic = Flags.isPublic(accessFlags);
-		if ((!Flags.isPrivate(accessFlags))
-				&& (!Flags.isProtected(accessFlags))
-				&& (!Flags.isPublic(accessFlags))) {
-			// No specific modifier was set, so assume to be public
-			isPublic = true;
-		}
-		if (!isPublic) {
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * Test for constructor.
-	 * <p>
-	 * This test has the following conditions:
-	 * </p>
-	 * <ul>
-	 * <li>method takes 0 arguments and the method name is the class name:
-	 * <ul>
-	 * <li>takes 0 arguments</li>
-	 * <li>the method name is the class name</li>
-	 * <li>the method returns void</code></li>
-	 * </ul>
-	 * </li>
-	 * </ul>
-	 * 
-	 * @param methods -
-	 *            the IMethod array to examine
-	 * @return boolean - true, if method is a constructor
-	 */
-	public static boolean hasPublicConstructor(IMethod[] methods) {
-		for (int m = 0; m < methods.length; m++) {
-			try {
-				if (methods[m].isConstructor() && isPublicMethod(methods[m])) {
-					// Constructor must have the following 0 arguments
-					String[] params = methods[m].getParameterTypes();
-					if (params.length == 0) {
-						// And must return a void
-						String rtn = methods[m].getReturnType();
-						if (rtn.equals(Signature.SIG_VOID)) {
-							return true;
-						}
-						break;
-					}
-				}
-			} catch (JavaModelException e) {
-				// Nothing to do.
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Determines if a datatype is primitive type or part of java.lang or
-	 * java.util package. If not, it is considered to be a bean reference
-	 * 
-	 * @param classType -
-	 *            the parent class compilation unit
-	 * @param signatureName -
-	 *            the datatype of the property
-	 * @return boolean - true, if the datatype is primitive or part of java.lang
-	 *         or java.util package
-	 */
-	public static boolean isPrimitiveType(IType classType, String signatureName) {
-		while (signatureName.startsWith("[")) {
-			signatureName = signatureName.substring(1);
-		}
-		int kind = Signature.getTypeSignatureKind(signatureName);
-		if (kind == Signature.BASE_TYPE_SIGNATURE
-				|| signatureName.equals(Signature.SIG_VOID)) {
-			// These are true primitive types
-			return true;
-		}
-
-		String qualifiedName = getQualifiedTypeNameInTypeHierarchy(classType,
-				signatureName);
-
-		if ((qualifiedName.startsWith("java.lang")) || (qualifiedName.startsWith("java.util"))) //$NON-NLS-1$
-		{
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * get the type from the input class name
-	 * 
-	 * @param project
-	 * @param className
-	 * @return - can be null.
-	 */
-	public static IType getType(IProject project, String className) {
-		if (project == null) {
-			return null;
-		}
-		IType cunit = null;
-		if (className.length() > 0) {
-
-			IJavaProject jProject = JavaCore.create(project);
-			try {
-				cunit = jProject.findType(className);
-			} catch (JavaModelException e) {
-                // suppress: fall-through and return null
-			}
-		}
-		return cunit;
-	}
-
-	/**
-	 * open the type in the editor.
-	 * 
-	 * @param type
-	 * @return true if the type could opened in an editor
-	 */
-	public static boolean openType(IType type) {
-		if (type == null || !type.exists()) {
-			return false;
-		}
-
-		try {
-			IEditorPart editorPart = JavaUI.openInEditor(type
-					.getPrimaryElement());
-			if (editorPart != null) {
-				JavaUI.revealInEditor(editorPart, type.getPrimaryElement());
-				return true;
-			}
-		} catch (PartInitException e) {
-			// ignore this error.
-		} catch (JavaModelException e) {
-			// ignore this error.
-		}
-		return false;
-	}
-
-	/**
-	 * get package name from java source file
-	 * 
-	 * @param javaFile
-	 * @return - can be null.
-	 */
-	public static String getPackageName(IFile javaFile) {
-		if (javaFile == null) {
-			return null;
-		}
-		String ext = "." + javaFile.getFileExtension(); //$NON-NLS-1$
-		// See if the file is a java file
-		if (!ext.equalsIgnoreCase(IFileFolderConstants.EXT_JAVA)) {
-			return null;
-		}
-		String packagename = new String();
-		ICompilationUnit cunit = JavaCore.createCompilationUnitFrom(javaFile);
-		try {
-			IPackageDeclaration[] packages = cunit.getPackageDeclarations();
-			if (packages.length == 0) {
-				packagename = new String();
-			} else {
-				packagename = packages[0].getElementName();
-			}
-		} catch (JavaModelException jme) {
-            // suppress: fall-through and return an empty string?? TODO:?
-		}
-		return packagename;
-	}
-
-	/**
-	 * copy the array to the list.
-	 * 
-	 * @param methodList
-	 * @param methods
-	 */
-	private static void copyToMethodList(List methodList, IMethod[] methods) {
-		if (methods != null && methods.length > 0) {
-			for (int i = 0; i < methods.length; i++) {
-				if (!isDuplicateMethod(methodList, methods[i])) {
-					methodList.add(methods[i]);
-				}
-			}
-		}
-	}
-
-	/**
-	 * check whether this method is duplicated or not in the existing method
-	 * list.
-	 * 
-	 * @param methodList
-	 * @param method
-	 * @return
-	 */
-	private static boolean isDuplicateMethod(List methodList, IMethod method) {
-		if (method == null || !method.exists()) {
-			return false;
-		}
-
-		String[] paramTypes = method.getParameterTypes();
-		String methodName = method.getElementName();
-
-		for (Iterator iter = methodList.iterator(); iter.hasNext();) {
-			IMethod existedMethod = (IMethod) iter.next();
-			if (isSameMethodSignature(methodName, paramTypes, existedMethod)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Tests if a method equals to the given signature. Parameter types are only
-	 * compared by the simple name, no resolving for the fully qualified type
-	 * name is done. Constructors are only compared by parameters, not the name.
-	 * 
-	 * @param name
-	 *            Name of the method
-	 * @param paramTypes
-	 *            The type signatures of the parameters e.g.
-	 *            <code>{"QString;","I"}</code>
-	 * @param curr 
-	 * @return Returns <code>true</code> if the method has the given name and
-	 *         parameter types and constructor state.
-	 */
-	public static boolean isSameMethodSignature(String name,
-			String[] paramTypes, IMethod curr) {
-		if (name.equals(curr.getElementName())) {
-			String[] currParamTypes = curr.getParameterTypes();
-			if (paramTypes.length == currParamTypes.length) {
-				for (int i = 0; i < paramTypes.length; i++) {
-					String t1 = Signature.getSimpleName(Signature
-							.toString(paramTypes[i]));
-					String t2 = Signature.getSimpleName(Signature
-							.toString(currParamTypes[i]));
-					if (!t1.equals(t2)) {
-						return false;
-					}
-				}
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * get methods for the class Type including its super class
-	 * 
-	 * @param classType
-	 * @return - can be null
-	 * @throws JavaModelException
-	 */
-	public static IMethod[] getMethods(IType classType)
-			throws JavaModelException {
-		if (classType == null) {
-			return null;
-		}
-		List methodList = new ArrayList();
-		IMethod[] methods = classType.getMethods();
-		copyToMethodList(methodList, methods);
-
-		ITypeHierarchy typeHierarchy = classType.newSupertypeHierarchy(null);
-
-		if (typeHierarchy != null) {
-			IType[] superTypes = typeHierarchy.getAllSuperclasses(classType);
-
-			if (superTypes != null && superTypes.length > 0) {
-				for (int i = 0; i < superTypes.length; i++) {
-					if (!superTypes[i].getFullyQualifiedName().equals(
-							"java.lang.Object")) {
-						methods = superTypes[i].getMethods();
-
-						copyToMethodList(methodList, methods);
-					}
-				}
-			}
-		}
-
-		if (methodList != null && methodList.size() > 0) {
-			IMethod[] validMethods = (IMethod[]) methodList
-					.toArray(new IMethod[methodList.size()]);
-
-			Arrays.sort(validMethods, new Comparator() {
-				public int compare(Object o1, Object o2) {
-					String name1 = ((IMethod) o1).getElementName();
-					String name2 = ((IMethod) o2).getElementName();
-					return name1.compareTo(name2);
-				}
-			});
-			return validMethods;
-		}
-		return null;
-	}
-
-	/**
-	 * resolve and get the qualified name for the incomplete typename
-	 * 
-	 * @param classType
-	 * @param signatureName
-	 * @return - at least equal to Signature.toString(signatureName).
-	 */
-	public static String getQualifiedTypeNameInTypeHierarchy(IType classType,
-			String signatureName) {
-		int arrayNum = 0;
-		while (signatureName.startsWith("[")) {
-			arrayNum++;
-			signatureName = signatureName.substring(1);
-		}
-
-		String qualifiedTypeName = Signature.toString(signatureName);
-		int kind = Signature.getTypeSignatureKind(signatureName);
-		if (kind == Signature.BASE_TYPE_SIGNATURE
-				|| signatureName.equals(Signature.SIG_VOID)) {
-			// Add back array identifiers
-			while (arrayNum > 0) {
-				qualifiedTypeName = qualifiedTypeName + "[]";
-				arrayNum--;
-			}
-			return qualifiedTypeName;
-		}
-
-		String typeName = Signature.toString(signatureName);
-
-		String foundName = getQualifiedTypeName(classType, typeName);
-		// if found in current type
-		if (foundName != null) {
-			qualifiedTypeName = foundName;
-		} else // else found in the type hierachy.
-		{
-			ITypeHierarchy typeHierarchy = null;
-			try {
-				typeHierarchy = classType.newSupertypeHierarchy(null);
-			} catch (JavaModelException e) {
-				// Nothing to do.
-			}
-			if (typeHierarchy != null) {
-				IType[] superTypes = typeHierarchy.getAllSupertypes(classType);
-
-				if (superTypes != null && superTypes.length > 0) {
-					for (int i = 0; i < superTypes.length; i++) {
-						if (!superTypes[i].getFullyQualifiedName().equals(
-								"java.lang.Object")) {
-							foundName = getQualifiedTypeName(superTypes[i],
-									typeName);
-							if (foundName != null) {
-								qualifiedTypeName = foundName;
-								break;
-							}
-						}
-					}
-				}
-			}
-		}
-
-		// Add back array identifiers
-		while (arrayNum > 0) {
-			qualifiedTypeName = qualifiedTypeName + "[]";
-			arrayNum--;
-		}
-		return qualifiedTypeName;
-	}
-
-	/**
-	 * resolve and get the qualified name for the incomplete typename
-	 * 
-	 * @param classType
-	 * @param typeName
-	 * @return can be null.
-	 */
-	public static String getQualifiedTypeName(IType classType, String typeName) {
-		String qualifiedTypeName = null;
-
-		try {
-			String[][] resolvedNames = classType.resolveType(typeName);
-			if (resolvedNames != null && resolvedNames.length > 0) {
-				qualifiedTypeName = JavaModelUtil.concatenateName(
-						resolvedNames[0][0], resolvedNames[0][1]);
-			}
-		} catch (JavaModelException e1) {
-			// Nothing to do.
-		}
-
-		return qualifiedTypeName;
-	}
-
-	/**
-	 * check whether subclass is sub class of supperclass
-	 * 
-	 * @param jProject
-	 * @param subClass -
-	 *            fully qualified name of sub class
-	 * @param superClass -
-	 *            fully qualified name of super class
-	 * 
-	 * @return true if subClass is a sub  of  superClass
-	 */
-	public static boolean isSubClassOf(IJavaProject jProject, String subClass,
-			String superClass) {
-		if (jProject == null || subClass == null || superClass == null) {
-			return false;
-		}
-
-		try {
-			IType subClassType = jProject.findType(subClass);
-
-			if (subClassType != null) {
-				ITypeHierarchy typeHierarchy = null;
-				try {
-					typeHierarchy = subClassType.newSupertypeHierarchy(null);
-				} catch (JavaModelException e) {
-					// Nothing to do.
-				}
-				IType[] superTypes = typeHierarchy
-						.getAllSupertypes(subClassType);
-
-				if (superTypes != null && superTypes.length > 0) {
-					for (int i = 0; i < superTypes.length; i++) {
-						if (superTypes[i].getFullyQualifiedName().equals(
-								superClass)) {
-							return true;
-						}
-					}
-				}
-			}
-		} catch (JavaModelException e) {
-			// Nothing to do.
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/ManagedBeanUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/ManagedBeanUtil.java
deleted file mode 100644
index c17cb9f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/ManagedBeanUtil.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.util;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class ManagedBeanUtil {
-
-	/**
-	 * Determines if the new bean to be added is already a member of the
-	 * configuration set.
-	 * @param project 
-	 * 
-	 * @param beanName -
-	 *            The name of the bean being added
-	 * @return int - 0 if bean doesn't exist, otherwise the choice from the
-	 *         Duplicate Bean dialog
-	 */
-	public static boolean isBeanDuplicate(IProject project, String beanName) 
-    {
-	    JSFAppConfigManager appCfgMgr = JSFAppConfigManager.getInstance(project);
-        
-		if (appCfgMgr != null) 
-        {
-			List beans = appCfgMgr.getManagedBeans();
-
-			// Iterate through the bean list
-			for (Iterator i = beans.iterator(); i.hasNext();) {
-				Object o = i.next();
-				if (o instanceof ManagedBeanType) {
-					ManagedBeanType mbti = (ManagedBeanType) o;
-					if (mbti.getManagedBeanName() != null) {
-						String name = mbti.getManagedBeanName()
-								.getTextContent();
-						if (name != null && name.equals(beanName)) {
-							return true;
-						}
-					}
-				}
-			}
-
-		}
-		return false;
-	}
-
-	/**
-	 * get the default managed bean name in the current project according to
-	 * reference name
-	 * 
-	 * @param project -
-	 *            current project
-	 * @param refName -
-	 *            seed reference name
-	 * @return String - default managed bean name
-	 */
-	public static String getDefaultManagedBeanName(IProject project,
-			String refName) {
-		String defaultName = refName;
-
-		int newRefNameIndex = 1;
-		while (isBeanDuplicate(project, defaultName)) {
-			defaultName = refName + newRefNameIndex;
-			newRefNameIndex++;
-		}
-		return defaultName;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/ModelUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/ModelUtil.java
deleted file mode 100644
index 1a0030a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/ModelUtil.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.util;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-
-/**
- * @author Zhi-peng Zhang
- * @version
- */
-public class ModelUtil {
-
-	/**
-	 * Get the super class's name of certain element. For example, a class for
-	 * <action-listener> should implement interface
-	 * "javax.faces.event.ActionListener".
-	 * 
-	 * 
-	 * 
-	 * @param key
-	 *            the EClass object of the application child.
-	 * @return the expected super type for a particular element
-	 * TODO: could make common with the faces-config validator
-	 */
-	public static String getSuperType(Object key) {
-		if (key == FacesConfigPackage.eINSTANCE.getActionListenerType()) {
-			return IFacesConfigConstants.ACTION_LISTENER_INTERFACE;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getNavigationHandlerType()) {
-			return IFacesConfigConstants.NAVIGATION_HANDLE_SUPER_CLASS;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getPropertyResolverType()) {
-			return IFacesConfigConstants.PROPERTY_RESOLVER_SUPER_CLASS;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getStateManagerType()) {
-			return IFacesConfigConstants.STATE_MANAGER_SUPER_CLASS;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getVariableResolverType()) {
-			return IFacesConfigConstants.VARIABLE_RESOLVER_SUPER_CLASS;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getViewHandlerType()) {
-			return IFacesConfigConstants.VIEW_HANDLER_SUPER_CLASS;
-		}
-
-		if (key == FacesConfigPackage.eINSTANCE.getApplicationFactoryType()) {
-			return IFacesConfigConstants.APPLICATION_FACTORY_SUPER_CLASS;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getFacesContextFactoryType()) {
-			return IFacesConfigConstants.FACES_CONTEXT_FACTORY_SUPER_CLASS;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getLifecycleFactoryType()) {
-			return IFacesConfigConstants.LIFECYCLE_FACTORY_SUPER_CLASS;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getRenderKitFactoryType()) {
-			return IFacesConfigConstants.RENDER_KIT_FACTORY_SUPER_CLASS;
-		}
-
-		if (key == FacesConfigPackage.eINSTANCE.getPhaseListenerType()) {
-			return IFacesConfigConstants.PHASE_LISTENER_INTERFACE;
-		}
-
-		return null;
-	}
-	
-
-	/**
-	 * This will take the three pre-defined entities in XML 1.0 (used
-	 * specifically in XML elements) and convert their character representation
-	 * to the appropriate entity reference, suitable for XML element content.
-	 * 
-	 * @param str
-	 *            <code>String</code> input to escape.
-	 * @return <code>String</code> with escaped content.
-	 */
-	public static String escapeEntities(String str) {
-		if (isEmptyString(str)) {
-			return "";
-		}
-
-		StringBuffer buffer;
-		char ch;
-		String entity;
-
-		buffer = null;
-		for (int i = 0, n = str.length(); i < n; i++) {
-			ch = str.charAt(i);
-			switch (ch) {
-			case '<':
-				entity = "&lt;";
-				break;
-			case '>':
-				entity = "&gt;";
-				break;
-			case '\'':
-				entity = "&apos;";
-				break;
-			case '\"':
-				entity = "&quot;";
-				break;
-			case '&':
-				entity = "&amp;";
-				break;
-			case '\r':
-				entity = "&#xD;";
-				break;
-			case '\t':
-				entity = "&#x9;";
-				break;
-			case '\n':
-				entity = "&#xA;";
-				break;
-			default:
-				entity = null;
-				break;
-			}
-			if (buffer == null) {
-				if (entity != null) {
-					// An entity occurred, so we'll have to use StringBuffer
-					// (allocate room for it plus a few more entities).
-					buffer = new StringBuffer(str.length() + 20);
-					// Copy previous skipped characters and fall through
-					// to pickup current character
-					buffer.append(str.substring(0, i));
-					buffer.append(entity);
-				}
-			} else {
-				if (entity == null) {
-					buffer.append(ch);
-				} else {
-					buffer.append(entity);
-				}
-			}
-		}
-
-		// If there were any entities, return the escaped characters
-		// that we put in the StringBuffer. Otherwise, just return
-		// the unmodified input string.
-		return (buffer == null) ? str : buffer.toString();
-	}
-
-	/**
-	 * @param str
-	 * @return removes XML/HTML escaped characters from str.
-	 */
-	public static String unEscapeEntities(String str) {
-		if (isEmptyString(str)) {
-			return "";
-		}
-
-		String result = new String(str);
-
-		result = result.replaceAll("&amp;", "&");
-		result = result.replaceAll("&lt;", "<");
-		result = result.replaceAll("&gt;", ">");
-		result = result.replaceAll("&apos;", "\'");
-		result = result.replaceAll("&quot;", "\"");
-		result = result.replaceAll("&#xD;", "\r");
-		result = result.replaceAll("&#x9;", "\t");
-		result = result.replaceAll("&#xA;", "\n");
-
-		return result;
-	}
-
-	private static boolean isEmptyString(String value) {
-		if (value == null || value.length() == 0) {
-			return true;
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/WebrootUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/WebrootUtil.java
deleted file mode 100644
index e0bc3a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/WebrootUtil.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.util;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-
-
-/**
- * This utility class is used to make a bridge between the relative path from
- * webroot and physical path in the project.
- * 
- * @author Xiao-guang Zhang
- * 
- */
-public class WebrootUtil extends
-            org.eclipse.jst.jsf.common.ui.internal.utils.WebrootUtil {
-
-	/**
-	 * get the the project path for webpath The project path is something like
-	 * "/projectname/webroot/filename.jsp", or "/projectname/webroot/folder".
-	 * The project information should be removed from project path, e.g,
-	 * "/filename.jsp" or "/folder/*";
-	 * @param model 
-	 * 
-	 * @param strPath -
-	 *            the web path
-	 * @return - project path from "/projectname/webroot"
-	 */
-	static public String getProjectPath(EObject model, String strPath) {
-
-		IProject project = getProject(model);
-
-		String strProjectPath = "";
-		if (strPath != null) {
-			IPath path = new Path(strPath);
-			// jsp file
-			if (path.getFileExtension() != null) {
-				IPath webContentPath = getWebContentPath(project);
-				if (webContentPath != null)
-					strProjectPath = webContentPath.toString() + strPath;
-
-			} else
-			// jsp folder
-			{
-				strPath = new String(strPath.getBytes(), 0,
-						strPath.length() - 1);
-				IPath webContentPath = getWebContentPath(project);
-				if (webContentPath != null)
-					strProjectPath = webContentPath.toString() + strPath;
-			}
-		}
-		return strProjectPath;
-	}
-
-	/**
-	 * @param model -
-	 *            emf model
-	 * @return the current resource according to EMF model
-	 */
-	static public IResource getResource(EObject model) {
-		IResource resource = null;
-
-		if (model != null && model.eResource() != null) {
-			URI uri = model.eResource().getURI();
-			IPath path = new Path(URI.decode(uri.devicePath()));
-
-			// since the uri format is "platform:/resource/..."
-			// we will remove the first part
-			path = path.removeFirstSegments(1);
-
-			IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace()
-					.getRoot();
-			resource = workspaceRoot.findMember(path);
-		}
-
-		return resource;
-	}
-
-	/**
-	 * get the current project according to EMF model
-	 * 
-	 * @param model -
-	 *            emf model
-	 * @return the current project according to EMF model
-	 */
-	static public IProject getProject(EObject model) {
-		IProject project = null;
-
-		IResource resource = getResource(model);
-
-		if (resource != null) {
-			project = resource.getProject();
-		}
-
-		return project;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ISummaryDataSource.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ISummaryDataSource.java
deleted file mode 100644
index ae1fa5e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ISummaryDataSource.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.wizard;
-
-import java.util.List;
-
-/**
- * Specifies behavior for a datasource that client wizards use to communicate
- * summary information to summary page.
- * 
- * @author plevin
- * @version 1.0
- */
-public interface ISummaryDataSource {
-	/**
-	 * Returns key-value summary data.
-	 * 
-	 * @return List - Summary data.
-	 */
-	public List getSummaryData();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ManagedBeanClassSelectionPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ManagedBeanClassSelectionPage.java
deleted file mode 100644
index c2306cf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ManagedBeanClassSelectionPage.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others. All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html Contributors: Sybase,
- * Inc. - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.wizard;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaConventions;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldChangeListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.util.JavaClassUtils;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-
-/**
- * This class used to select an existing java class or generate a new one.
- * However, the actural generated new java class is left to other pages.
- * 
- * @author Xiao-guang Zhang
- */
-public class ManagedBeanClassSelectionPage extends WizardPage {
-	private static final int HORIZONTAL_INDENT_DEFAULT = 25;
-
-	/** the class name */
-	private String className;
-
-	/**
-	 * Search Section, including radio button, label, text and browser button.
-	 */
-	private Button searchRadioButton;
-
-	private ClassButtonDialogField classSearchDialogField;
-
-	/** selected type */
-	private IType searchedType;
-
-	/** Generate radio button */
-	private Button createRadioButton;
-
-	private IProject currentProject;
-
-	/**
-	 * Constructor.
-	 * 
-	 * @param project
-	 *            The project.
-	 */
-	public ManagedBeanClassSelectionPage(IProject project) {
-		super("JavaSelectionWizardPage"); //$NON-NLS-1$
-
-		currentProject = project;
-		setTitle(WizardMessages.JavaSelectionWizardPage_Title);
-		setDescription(WizardMessages.JavaSelectionWizardPage_Description);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 10;
-		layout.marginHeight = 5;
-		container.setLayout(layout);
-		container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		final Group group = new Group(container, SWT.NONE);
-
-		group.setLayout(new GridLayout());
-
-		group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		createSearchSection(group);
-		createGenerateSection(group);
-
-		setControl(container);
-		Dialog.applyDialogFont(container);
-		setPageComplete(classSearchDialogField.getText().length() > 0);
-		EditorPlugin.getDefault().getWorkbench().getHelpSystem().setHelp(
-				container,
-				WizardMessages.JavaSelectionWizardPage_HelpContextID);
-	}
-
-	/**
-	 * enabled or disabled the search section including the labels and texts
-	 * 
-	 * @param enabled -
-	 *            enabled or disabled the search section
-	 */
-	private void enableSearchSection(boolean enabled) {
-		classSearchDialogField.setEnabled(enabled);
-	}
-
-	/**
-	 * Create the search section including the labels, texts, and browser
-	 * buttons
-	 * 
-	 * @param parent -
-	 *            parent composite control
-	 */
-	private void createSearchSection(Composite parent) {
-		searchRadioButton = new Button(parent, SWT.RADIO);
-		// JavaSelectionWizardPage.Search = Using an existing Java class
-		searchRadioButton
-				.setText(WizardMessages.JavaSelectionWizardPage_Search);
-		searchRadioButton.setSelection(true);
-		searchRadioButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				createRadioButton.setSelection(!searchRadioButton
-						.getSelection());
-				enableSearchSection(searchRadioButton.getSelection());
-				verifyComplete();
-			}
-		});
-
-		Composite searchSection = new Composite(parent, SWT.NULL);
-
-		classSearchDialogField = new ClassButtonDialogField(currentProject);
-		classSearchDialogField.setHyperLink(null);
-		int numberOfControls = classSearchDialogField.getNumberOfControls();
-
-		GridLayout layout = new GridLayout();
-		layout.numColumns = numberOfControls;
-		layout.verticalSpacing = 9;
-		searchSection.setLayout(layout);
-		searchSection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		classSearchDialogField.doFillIntoGrid(null, searchSection,
-				numberOfControls);
-
-		GridData gd = (GridData) classSearchDialogField.getLabelControl(null,
-				searchSection).getLayoutData();
-		gd.horizontalIndent = HORIZONTAL_INDENT_DEFAULT;
-
-		// JavaSelectionWizardPage.Search.ClassName = Qulified class name:
-		classSearchDialogField
-				.setLabelText(WizardMessages.JavaSelectionWizardPage_Search_ClassName);
-
-		LayoutUtil.setHorizontalGrabbing(classSearchDialogField.getTextControl(
-				null, searchSection));
-
-		classSearchDialogField
-				.setDialogFieldChangeListener(new IDialogFieldChangeListener() {
-					public void dialogFieldChanged(DialogField field) {
-						className = classSearchDialogField.getText();
-						verifyComplete();
-					}
-
-				});
-
-		Label searchDesp = new Label(searchSection, SWT.NONE);
-		searchDesp
-				.setText(WizardMessages.JavaSelectionWizardPage_Search_Description);
-
-		gd = new GridData();
-		gd.horizontalSpan = numberOfControls;
-		gd.horizontalIndent = HORIZONTAL_INDENT_DEFAULT;
-		searchDesp.setLayoutData(gd);
-	}
-
-	/**
-	 * Create the generation section including the labels, texts, and browser
-	 * buttons
-	 * 
-	 * @param parent -
-	 *            parent composite control
-	 */
-	private void createGenerateSection(Composite parent) {
-		createRadioButton = new Button(parent, SWT.RADIO);
-		createRadioButton
-				.setText(WizardMessages.JavaSelectionWizardPage_Create);
-		createRadioButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				searchRadioButton.setSelection(!createRadioButton
-						.getSelection());
-				enableSearchSection(!createRadioButton.getSelection());
-				verifyComplete();
-			}
-		});
-
-		Composite createSection = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 3;
-		layout.verticalSpacing = 9;
-		createSection.setLayout(layout);
-		createSection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		Label createDesp = new Label(createSection, SWT.NONE);
-		createDesp
-				.setText(WizardMessages.JavaSelectionWizardPage_Create_Description);
-
-		GridData gd = new GridData();
-		gd.horizontalIndent = HORIZONTAL_INDENT_DEFAULT;
-		createDesp.setLayoutData(gd);
-	}
-
-	/**
-	 * create a new java class or not
-	 * 
-	 * @return true if the create new java class radio button is selected
-	 */
-	public boolean isCreateNewJavaClass() {
-		return createRadioButton.getSelection();
-	}
-
-	/**
-	 * get the selected java type
-	 * 
-	 * @return - type
-	 */
-	public IType getSelectedType() {
-		searchedType = JavaClassUtils.getType(currentProject,
-				classSearchDialogField.getText());
-
-		return searchedType;
-	}
-
-	/**
-	 * @return the class name
-	 */
-	public String getClassName() {
-		return className;
-	}
-
-	/**
-	 * validate the selected or input java type name
-	 * 
-	 * @return
-	 */
-	private IStatus validateJavaTypeName() {
-		IStatus status = null;
-		if (classSearchDialogField.getText().length() == 0) {
-			status = new Status(
-					IStatus.ERROR,
-					EditorPlugin.getPluginId(),
-					-1,
-					NLS
-							.bind(
-									WizardMessages.JavaSelectionWizardPage_Error_ClassIsEmpty,
-									classSearchDialogField.getText()), null);
-		} else {
-			// ensure the name follows the java conventsions.
-			status = JavaConventions
-					    .validateJavaTypeName(classSearchDialogField.getText(), JavaCore.VERSION_1_3,JavaCore.VERSION_1_3);
-			if (status.getSeverity() != IStatus.ERROR) {
-				// ensure the input or selected type is defined in the current
-				// project
-				if (getSelectedType() == null) {
-					status = new Status(
-							IStatus.ERROR,
-							EditorPlugin.getPluginId(),
-							-1,
-							NLS
-									.bind(
-											WizardMessages.JavaSelectionWizardPage_Error_ClassIsNotDefined,
-											classSearchDialogField.getText()),
-							null);
-				}
-			}
-		}
-		return status;
-	}
-
-	/**
-	 * verify and update the complete status
-	 */
-	private void verifyComplete() {
-		IStatus status = null;
-
-		if (isCreateNewJavaClass()) {
-			setPageComplete(true);
-			setMessage(null);
-			setErrorMessage(null);
-		} else {
-			if (searchRadioButton.getSelection()) {
-				status = validateJavaTypeName();
-			}
-			String errorMessage = null;
-			setPageComplete(status.getSeverity() != IStatus.ERROR);
-
-			if (status.getSeverity() == IStatus.ERROR) {
-				errorMessage = status.getMessage();
-			}
-
-			if (errorMessage != null) {
-				setErrorMessage(errorMessage);
-			} else {
-				setErrorMessage(null);
-			}
-
-			if (status.getSeverity() != IStatus.OK) {
-				setMessage(status.getMessage());
-			} else {
-				setMessage(null);
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ManagedBeanPropertyPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ManagedBeanPropertyPage.java
deleted file mode 100644
index 0f01854..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ManagedBeanPropertyPage.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others. All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html Contributors: Sybase,
- * Inc. - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.wizard;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.util.JavaClassUtils;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ManagedBeanUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * ManangedBeanProperty wizard page used to show properties of the previous
- * selected java class, suade services. and set the default values for each
- * property.
- * 
- * @author Xiao-guang Zhang, sfshi
- */
-public class ManagedBeanPropertyPage extends WizardPage implements ISummaryDataSource {
-	/** Default height of description Text Control */
-	private static final int DESCRIPTION_TEXT_HEIGHT = 60;
-
-	private static final int DEFAULT_WIDTHHINT = 10;
-
-	/** The Text control for managed bean instance name */
-	private Text managedBeanNameText;
-
-	/** The Combo control for Project Selection */
-	private Combo scopeCombo;
-
-	/** The Text control for managed bean's description */
-	private Text managedBeanDescriptionText;
-
-	private String helpID = null;
-
-	private IProject currentProject;
-
-	private String defaultScope;
-
-	/**
-	 * @param defaultScope
-	 *            the default scope, if be null, then use "session".
-	 * @param project
-	 */
-	public ManagedBeanPropertyPage(String defaultScope, IProject project) {
-		super("ManagedBeanPropertyWizardPage"); //$NON-NLS-1$);
-
-		this.defaultScope = defaultScope;
-		currentProject = project;
-		setTitle(WizardMessages.ManagedBeanPropertyWizardPage_Title);
-		setDescription(WizardMessages.ManagedBeanPropertyWizardPage_Description);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see WizardPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		initializeDialogUnits(parent);
-
-		Composite container = new Composite(parent, SWT.NONE);
-		GridLayout gl = new GridLayout();
-		gl.numColumns = 1;
-		container.setLayout(gl);
-		GridData gridData = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gridData);
-
-		createGeneralSection(container);
-
-		setControl(container);
-
-		setPageComplete(false);
-
-		if (helpID != null) {
-			EditorPlugin.getDefault().getWorkbench().getHelpSystem().setHelp(
-					getControl(), helpID);
-		}
-	}
-
-	/**
-	 * create managed bean 's configuration group
-	 * 
-	 * @param container
-	 */
-	private void createGeneralSection(Composite container) {
-		Group generalSection = new Group(container, SWT.NONE);
-
-		// ManagedBeanPropertyWizardPage.General = General
-		generalSection
-				.setText(WizardMessages.ManagedBeanPropertyWizardPage_General);
-
-		GridLayout gl = new GridLayout();
-		// gl.marginHeight = 20;
-		gl.numColumns = 2;
-		generalSection.setLayout(gl);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		generalSection.setLayoutData(gridData);
-
-		SWTUtils
-				.createLabel(
-						generalSection,
-						WizardMessages.ManagedBeanPropertyWizardPage_ManagedBeanName,
-						1);
-
-		managedBeanNameText = SWTUtils.createTextBox(generalSection, 1);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 1;
-		gd.widthHint = DEFAULT_WIDTHHINT;
-		managedBeanNameText.setLayoutData(gd);
-
-		managedBeanNameText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				// dialogChanged();
-				if (isValidManagedBeanName(true)) {
-					setPageComplete(true);
-				} else {
-					setPageComplete(false);
-				}
-			}
-		});
-
-		SWTUtils
-				.createLabel(
-						generalSection,
-						WizardMessages.ManagedBeanPropertyWizardPage_ManagedBeanScope,
-						1); //$NON-NLS-1$
-
-		String[] items = {
-				IFacesConfigConstants.MANAGED_BEAN_SCOPE_APPLICATION,
-				IFacesConfigConstants.MANAGED_BEAN_SCOPE_SESSION,
-				IFacesConfigConstants.MANAGED_BEAN_SCOPE_REQUEST,
-				IFacesConfigConstants.MANAGED_BEAN_SCOPE_NONE };
-
-		scopeCombo = SWTUtils.createCombo(generalSection, items, 1);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 1;
-		gd.widthHint = DEFAULT_WIDTHHINT;
-		scopeCombo.setLayoutData(gd);
-
-		Label labelDesp = SWTUtils
-				.createLabel(
-						generalSection,
-						WizardMessages.ManagedBeanPropertyWizardPage_ManagedBeanDescription,
-						1); //$NON-NLS-1$
-
-		gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
-		labelDesp.setLayoutData(gd);
-
-		managedBeanDescriptionText = SWTUtils.createTextBoxScrollable(
-				generalSection, 1, -1, DESCRIPTION_TEXT_HEIGHT);
-
-	}
-
-	/**
-	 * Validates the managed bean Name entry
-	 * 
-	 * @param reportError -
-	 *            true, to report errors.
-	 * @return boolean - the valid state of the data entered
-	 */
-	private boolean isValidManagedBeanName(boolean reportError) {
-		if (managedBeanNameText.getText().length() == 0) {
-			if (reportError) {
-				setErrorMessage(WizardMessages.ManagedBeanPropertyWizardPage_Warning_MissingManagedBeanName); //$NON-NLS-1$
-			}
-			return false;
-		} else if (JavaClassUtils.hasIllegalCharacters(managedBeanNameText
-				.getText())) {
-			if (reportError) {
-				setErrorMessage(WizardMessages.ManagedBeanPropertyWizardPage_Warning_InvalidManagedBeanName); //$NON-NLS-1$
-			}
-			return false;
-		} else {
-			if (ManagedBeanUtil.isBeanDuplicate(currentProject,
-					managedBeanNameText.getText())) {
-				if (reportError) {
-					setErrorMessage(WizardMessages.ManagedBeanPropertyWizardPage_Warning_DuplicateManagedBeanName);
-				}
-				return false;
-			}
-
-		}
-
-		setErrorMessage(null);
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizardPage#setPreviousPage(org.eclipse.jface.wizard.IWizardPage)
-	 */
-	public void setPreviousPage(IWizardPage page) {
-		super.setPreviousPage(page);
-		initialize();
-	}
-
-	protected void initialize() {
-		if (defaultScope != null && defaultScope.length() > 0)
-			scopeCombo.setText(defaultScope);
-		else
-			scopeCombo.setText("session");
-
-		if (((NewManagedBeanWizard) getWizard()).getSuggestedBeanName() != null) {
-			this.managedBeanNameText
-					.setText(((NewManagedBeanWizard) getWizard())
-							.getSuggestedBeanName());
-		} else {
-			String beanName;
-			if (this.getPreviousPage() instanceof ManagedBeanClassSelectionPage) {
-				beanName = ((ManagedBeanClassSelectionPage) this.getPreviousPage())
-						.getClassName();
-			} else {
-				beanName = ((NewJavaClassPage) this.getPreviousPage())
-						.getTypeName();
-			}
-			beanName = beanName.substring(beanName.lastIndexOf(".") + 1);
-			if (beanName != null && beanName.length() > 0) {
-				beanName = (beanName.substring(0, 1)).toLowerCase()
-						+ (beanName.substring(1));
-
-				beanName = ManagedBeanUtil.getDefaultManagedBeanName(
-						currentProject, beanName);
-
-			} else
-				beanName = "";
-			managedBeanNameText.setText(beanName);
-		}
-	}
-
-	/**
-	 * Returns key-value summary data.
-	 * 
-	 * @return List - Summary data.
-	 */
-	public List getSummaryData() {
-		List data = new ArrayList();
-
-		data
-				.add(new String[] {
-						WizardMessages.NewJavaManagedBeanWizard_Summary_ManagedBeanName,
-						getManagedBeanName() }); //$NON-NLS-1$
-		data
-				.add(new String[] {
-						WizardMessages.NewJavaManagedBeanWizard_Summary_ManagedBeanScope,
-						getManagedBeanScope() });
-		data.add(new String[] {
-				WizardMessages.NewJavaManagedBeanWizard_Summary_ClassName,
-				getManagedBeanClass() });
-
-		data
-				.add(new String[] {
-						WizardMessages.NewJavaManagedBeanWizard_Summary_Description,
-						getManagedBeanDescription() });
-		return data;
-	}
-
-	public String getManagedBeanName() {
-		return this.managedBeanNameText.getText().trim();
-	}
-
-	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$
-	}
-
-	public String getManagedBeanScope() {
-		return this.scopeCombo.getText().trim();
-	}
-
-	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 73285ac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/NewJavaClassPage.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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 IProject currentProject;
-
-	public NewJavaClassPage(IProject project) {
-		super();
-		currentProject = project;
-		setPageComplete(false);
-	}
-
-	public void initialize() {
-		if (getPackageFragmentRoot() == null
-				|| currentProject != getPackageFragmentRoot().getJavaProject()
-						.getProject()) {
-			IJavaProject jProject = JavaCore.create(currentProject);
-			StructuredSelection selection = new StructuredSelection(jProject);
-			init(selection);
-		}
-	}
-
-	private boolean isSkipped() {
-		if ((getPreviousPage() instanceof ManagedBeanClassSelectionPage)
-				&& !((ManagedBeanClassSelectionPage) getPreviousPage()).isCreateNewJavaClass())
-			return true;
-		return false;
-	}
-
-	public List getSummaryData() {
-		List data = new ArrayList();
-
-		if (!isSkipped()) {
-			data
-					.add(new String[] {
-							WizardMessages.NewJavaManagedBeanWizard_Summary_SourceFolder,
-							getPackageFragmentRootText(), }); //$NON-NLS-1$
-
-			data
-					.add(new String[] {
-							WizardMessages.NewJavaManagedBeanWizard_Summary_PackageName, //$NON-NLS-1$
-							getPackageText(), });
-
-			data
-					.add(new String[] {
-							WizardMessages.NewJavaManagedBeanWizard_Summary_TypeName, //$NON-NLS-1$
-							getTypeName() }); 
-		}
-		return data;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizardPage#setPreviousPage(org.eclipse.jface.wizard.IWizardPage)
-	 */
-	public void setPreviousPage(IWizardPage page) {
-		super.setPreviousPage(page);
-		initialize();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/NewManagedBeanWizard.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/NewManagedBeanWizard.java
deleted file mode 100644
index 4226952..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/NewManagedBeanWizard.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others. All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html Contributors: Sybase,
- * Inc. - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.wizard;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-
-/**
- * The wizard for creating a managed bean on faces config model.
- * 
- * @author Xiao-guang Zhang, sfshi
- */
-public class NewManagedBeanWizard extends Wizard implements ISummaryDataSource {
-
-	/** log instance */
-	private static final Logger log = EditorPlugin
-			.getLogger(NewManagedBeanWizard.class);
-
-	/**
-	 * The wizard page where user can select a Java class for the managed bean
-	 * to be created.
-	 */
-	private ManagedBeanClassSelectionPage managedBeanClassSelectionPage;
-
-	/**
-	 * The wizard page where user can create a new Java class for the managed
-	 * bean to be created.
-	 */
-	private NewJavaClassPage newJavaClassPage;
-
-	private ManagedBeanPropertyPage managedBeanPropertyPage;
-
-	private String managedBeanName;
-
-	private String managedBeanScope;
-
-	private String managedBeanClass;
-
-	private String managedBeanDescription;
-
-	private IProject project;
-
-	/**
-	 * the suggested name for the managed bean, if setted, then use it in
-	 * ManagedBeanPropertyWizardPage.
-	 */
-	private String suggestedBeanName;
-
-	private String defaultScope;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param project
-	 *            The project.
-	 */
-	public NewManagedBeanWizard(IProject project) {
-		super();
-		setWindowTitle(WizardMessages.NewManagedBeanWizardBase_Title);
-		this.project = project;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.wizards.NewWizard#addPages()
-	 */
-	public void addPages() {
-		setDialogSettings(EditorPlugin.getDefault().getDialogSettings());
-
-		// add java source selection page.
-		managedBeanClassSelectionPage = new ManagedBeanClassSelectionPage(project);
-		addPage(managedBeanClassSelectionPage);
-
-		// add the class type page
-		newJavaClassPage = new NewJavaClassPage(project);
-		addPage(newJavaClassPage);
-
-		managedBeanPropertyPage = new ManagedBeanPropertyPage(defaultScope, project);
-		addPage(managedBeanPropertyPage);
-
-		// // add the summary page
-		SummaryPage summaryPage = new SummaryPage(this);
-		addPage(summaryPage);
-		summaryPage
-				.setDescription(WizardMessages.NewJavaManagedBeanWizard_SummaryPage_Description);
-	}
-
-	/**
-	 * Skip the NewJavaClassPage when user select "Using an existing class" on the
-	 * ManagedBeanClassSelectionPage.
-	 */
-	public IWizardPage getNextPage(IWizardPage page) {
-		IWizardPage nextPage = super.getNextPage(page);
-		if (page instanceof ManagedBeanClassSelectionPage
-				&& !((ManagedBeanClassSelectionPage) page).isCreateNewJavaClass()) {
-			((WizardPage) nextPage).setPageComplete(true);
-			return getNextPage(nextPage);
-		}
-		return nextPage;
-	}
-
-	public boolean performFinish() {
-
-		managedBeanName = managedBeanPropertyPage.getManagedBeanName();
-		managedBeanClass = managedBeanPropertyPage.getManagedBeanClass();
-		managedBeanScope = managedBeanPropertyPage.getManagedBeanScope();
-		managedBeanDescription = managedBeanPropertyPage.getManagedBeanDescription();
-		if (managedBeanClassSelectionPage.isCreateNewJavaClass())
-			createNewJavaClass();
-
-		return true;
-	}
-
-	/**
-	 * create a new java class according to current inputs in
-	 * NewClassWizardPage.
-	 */
-	private void createNewJavaClass() {
-		try {
-			newJavaClassPage.createType(new NullProgressMonitor());
-		} catch (CoreException e) {
-			log.info("NewJavaManagedBeanWizard.Error.CreateType", e); //$NON-NLS-1$
-
-			EditorPlugin.getAlerts().error(
-					"NewJavaManagedBeanWizard.Alert.CreateType.Title", //$NON-NLS-1$
-					"NewJavaManagedBeanWizard.Alert.CreateType.Description"); //$NON-NLS-1$
-			return;
-		} catch (InterruptedException e) {
-			log.info("NewJavaManagedBeanWizard.Error.CreateType", e); //$NON-NLS-1$
-			EditorPlugin.getAlerts().error(
-					"NewJavaManagedBeanWizard.Alert.CreateType.Title", //$NON-NLS-1$
-					"NewJavaManagedBeanWizard.Alert.CreateType.Description"); //$NON-NLS-1$
-			return;
-		}
-		newJavaClassPage.getCreatedType();
-	}
-
-	/**
-	 * @return the suggested bean name
-	 */
-	public String getSuggestedBeanName() {
-		return suggestedBeanName;
-	}
-
-	/**
-	 * Set a name for the new managed bean, this name will be shown in the
-	 * ManagedBeanPropertyWizardPage. If don't set the name, then will get a
-	 * default bean name from the managed bean class name.
-	 * 
-	 * @param suggestedBeanName
-	 */
-	public void setSuggestedBeanName(String suggestedBeanName) {
-		this.suggestedBeanName = suggestedBeanName;
-	}
-
-	/**
-	 * @return the default scope value
-	 */
-	public String getDefaultScope() {
-		return defaultScope;
-	}
-
-	/**
-	 * set a default scope value for this new managed bean.
-	 * 
-	 * @param defaultScope
-	 */
-	public void setDefaultScope(String defaultScope) {
-		this.defaultScope = defaultScope;
-	}
-
-	/**
-	 * @return the class name
-	 */
-	public String getManagedBeanClass() {
-		return managedBeanClass;
-	}
-
-	/**
-	 * @return the bean description
-	 */
-	public String getManagedBeanDescription() {
-		return managedBeanDescription;
-	}
-
-	/**
-	 * @return the managed bean's symbolic name
-	 */
-	public String getManagedBeanName() {
-		return managedBeanName;
-	}
-
-	/**
-	 * @return the managed bean's scope
-	 */
-	public String getManagedBeanScope() {
-		return managedBeanScope;
-	}
-
-	public List getSummaryData() {
-		List data = new ArrayList();
-		IWizardPage[] pages = getPages();
-
-		for (int i = 0; i < pages.length; i++) {
-			if (pages[i] instanceof ISummaryDataSource) {
-
-				data.addAll(((ISummaryDataSource) pages[i]).getSummaryData());
-			}
-		}
-		return data;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/SummaryPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/SummaryPage.java
deleted file mode 100644
index a62ede9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/SummaryPage.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others. All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html Contributors: Sybase,
- * Inc. - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.wizard;
-
-import org.eclipse.jface.viewers.ColumnPixelData;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * Common wizard page used to summarize information entered in previous pages.
- * 
- * @author plevin
- * @version 1.0
- */
-public class SummaryPage extends WizardPage
-{
-	private static final String WIZARD_SUMMARY_PAGE = "WizardSummaryPage";
-
-	/** The source of the summary items */
-	private ISummaryDataSource source;
-
-	/** The table control that displays the summary items */
-	private Table table;
-
-	/**
-	 * This Constructor creates the summary page
-	 */
-	public SummaryPage()
-	{
-		super( WIZARD_SUMMARY_PAGE );
-		setTitle( WizardMessages.WizardSummaryPage_Title_WizardSummary );
-		setDescription( WizardMessages.WizardSummaryPage_Summary_SummaryDesc );
-	}
-
-	/**
-	 * This Constructor initializes the data source.
-	 * 
-	 * @param source -
-	 *            Summary data source
-	 */
-	public SummaryPage( ISummaryDataSource source )
-	{
-		this();
-		this.source = source;
-	}
-
-	/**
-	 * Determines if the wizard can enable the Next button
-	 * 
-	 * @return boolean - the state of the Next button
-	 */
-	public boolean canFlipToNextPage()
-	{
-		return false;
-	}
-
-	/**
-	 * Creates the page controls
-	 * 
-	 * @param parent -
-	 *            the wizard composite
-	 */
-	public void createControl( Composite parent )
-	{
-
-		Composite composite = SWTUtils.createComposite( parent, 1 );
-
-		table = new Table( composite, SWT.BORDER );
-		table.setLayoutData( new GridData( GridData.FILL_BOTH ) );
-		table.setHeaderVisible( true );
-		table.setLinesVisible( true );
-
-		TableLayout layout = new TableLayout();
-		table.setLayout( layout );
-
-		layout.addColumnData( new ColumnPixelData( 163 ) );
-		layout.addColumnData( new ColumnPixelData( 350 ) );
-
-		TableColumn keyCol = new TableColumn( table, SWT.NONE );
-		keyCol.setText( WizardMessages.WizardSummaryPage_Label_Field );
-
-		TableColumn valueCol = new TableColumn( table, SWT.NONE );
-		valueCol
-				.setText( WizardMessages.WizardSummaryPage_Label_Value );
-
-		setControl( composite );
-		setPageComplete( true );
-	}
-
-	/**
-	 * Populates the table with summary information.
-	 */
-	public void loadSummaryData()
-	{
-		if ( source == null )
-		{
-			return;
-		}
-		Object[] data = source.getSummaryData().toArray();
-		table.removeAll();
-		for ( int i = 0; i < data.length; i++ )
-		{
-			TableItem item = new TableItem( table, SWT.NONE );
-			item.setText( (String[]) data[i] );
-		}
-		return;
-	}
-
-	/**
-	 * Sets summary page data source.
-	 * 
-	 * @param s -
-	 *            Data source.
-	 */
-	public void setSummaryDataSource( ISummaryDataSource s )
-	{
-		source = s;
-	}
-
-	/**
-	 * Populates the table with summary items when the page becomes visible.
-	 * 
-	 * @param visible -
-	 *            the visible state of the page
-	 */
-	public void setVisible( boolean visible )
-	{
-		super.setVisible( visible );
-
-		if ( visible == true )
-		{
-			loadSummaryData();
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/WizardMessages.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/WizardMessages.java
deleted file mode 100644
index d9a162d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/WizardMessages.java
+++ /dev/null
@@ -1,199 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.wizard;
-
-import org.eclipse.osgi.util.NLS;
-
-public final class WizardMessages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facesconfig.ui.wizard.WizardMessages";
-
-	private WizardMessages() {
-		// Do not instantiate
-	}
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, WizardMessages.class);
-	}
-
-	public static String NewManagedBeanWizardBase_Type;
-
-	public static String NewManagedBeanWizardBase_Description;
-
-	public static String NewManagedBeanWizardBase_Title;
-
-	public static String NewManagedBeanCreationWizard_Title;
-
-	public static String IntroWizardPage_Title;
-
-	public static String IntroWizardPage_Intro;
-
-	public static String ManagedBeanWizardSelectionPage_Title;
-
-	public static String ManagedBeanWizardSelectionPage_Description;
-
-	public static String ManagedBeanWizardSelectionPage_Group;
-
-	public static String ManagedBeanWizardSelectionPage_HelpContextID;
-
-	public static String Registry_LoadWizard_Error;
-
-	public static String NewWizard_Title_WizardDefault;
-
-	public static String ManagedBeanPropertyWizardPage_Title;
-
-	public static String ManagedBeanPropertyWizardPage_Description;
-
-	public static String ManagedBeanPropertyWizardPage_General;
-
-	public static String ManagedBeanPropertyWizardPage_ManagedBeanName;
-
-	public static String ManagedBeanPropertyWizardPage_ManagedBeanScope;
-
-	public static String ManagedBeanPropertyWizardPage_ManagedBeanDescription;
-
-	public static String ManagedBeanPropertyWizardPage_ManagedBeanProperty;
-
-	public static String ManagedBeanPropertyWizardPage_PropertyName;
-
-	public static String ManagedBeanPropertyWizardPage_Type;
-
-	public static String ManagedBeanPropertyWizardPage_Value;
-
-	public static String ManagedBeanPropertyWizardPage_Button_Add;
-
-	public static String ManagedBeanPropertyWizardPage_Button_Edit;
-
-	public static String ManagedBeanPropertyWizardPage_Button_Remove;
-
-	public static String ManagedBeanPropertyWizardPage_Warning_MissingManagedBeanName;
-
-	public static String ManagedBeanPropertyWizardPage_Warning_InvalidManagedBeanName;
-
-	public static String ManagedBeanPropertyWizardPage_Warning_DuplicateManagedBeanName;
-
-	public static String ManagedBeanPropertyEditDialog_PropertyName;
-
-	public static String ManagedBeanPropertyEditDialog_DataType;
-
-	public static String ManagedBeanPropertyEditDialog_InitialValue;
-
-	public static String ManagedBeanPropertyEditDialog_Title_NewPropertyEntry;
-
-	public static String ManagedBeanPropertyEditDialog_Title_ExistingPropertyEntry;
-
-	public static String FacesConfigSelectionWizardPage_Title;
-
-	public static String FacesConfigSelectionWizardPage_Description;
-
-	public static String FacesConfigSelectionWizardPage_Project;
-
-	public static String FacesConfigSelectionWizardPage_FacesConfig;
-
-	public static String FacesConfigSelectionWizardPage_FacesConfig_Browser;
-
-	public static String FacesConfigSelectionWizardPage_Warning_MissingProjectName;
-
-	public static String FacesConfigSelectionWizardPage_Warning_MissingFacesConfigName;
-
-	public static String FacesConfigSelectionWizardPage_Warning_InvalidFacesConfigName;
-
-	public static String FacesConfigSelectionWizardPage_Warning_InvalidFacesConfigContent;
-
-	public static String FacesConfigSelectionWizardPage_Warning_FacesConfigNotDefinedInWebDotXML;
-
-	public static String FacesConfigSelectionWizardPage_HelpContextID;
-
-	public static String FacesConfigFileSelectionDialog_Title;
-
-	public static String FacesConfigFileSelectionDialog_Description;
-
-	public static String JavaSelectionWizardPage_Title;
-
-	public static String JavaSelectionWizardPage_Description;
-
-	public static String JavaSelectionWizardPage_Group;
-
-	public static String JavaSelectionWizardPage_Search;
-
-	public static String JavaSelectionWizardPage_Search_Description;
-
-	public static String JavaSelectionWizardPage_Search_ClassName;
-
-	public static String JavaSelectionWizardPage_Search_ClassName_Browse;
-
-	public static String JavaSelectionWizardPage_Create;
-
-	public static String JavaSelectionWizardPage_Create_Description;
-
-	public static String JavaSelectionWizardPage_FindType;
-
-	public static String JavaSelectionWizardPage_FindType_Filter;
-
-	public static String JavaSelectionWizardPage_Error_ClassIsEmpty;
-
-	public static String JavaSelectionWizardPage_Error_ClassIsNotDefined;
-
-	public static String JavaSelectionWizardPage_HelpContextID;
-
-	public static String NewJavaManagedBeanWizard_Summary_ProjectName;
-
-	public static String NewJavaManagedBeanWizard_Summary_FacesConfigFileName;
-
-	public static String NewJavaManagedBeanWizard_Summary_TypeName;
-
-	public static String NewJavaManagedBeanWizard_Summary_PackageName;
-
-	public static String NewJavaManagedBeanWizard_Summary_SourceFolder;
-
-	public static String NewJavaManagedBeanWizard_Summary_ManagedBeanName;
-
-	public static String NewJavaManagedBeanWizard_Summary_ManagedBeanScope;
-
-	public static String NewJavaManagedBeanWizard_Summary_ClassName;
-
-	public static String NewJavaManagedBeanWizard_Summary_Description;
-
-	public static String NewJavaManagedBeanWizard_SummaryPage_Description;
-
-	public static String NewJavaManagedBeanWizard_Task_CreateNewManagedBean;
-
-	public static String NewJavaManagedBeanWizard_Task_CreateNewJavaClass;
-
-	public static String DuplicateBeanWizard_Title;
-
-	public static String DuplicateBeanPage_Title;
-
-	public static String DuplicateBeanPage_Description;
-
-	public static String DuplicateBeanGroup_Group_Label;
-
-	public static String DuplicateBeanGroup_OverwriteButton_Text;
-
-	public static String DuplicateBeanGroup_NewButton_Text;
-
-	public static String DuplicateBeanGroup_NewNameDialogField_Label;
-
-	public static String DuplicateBeanGroup_Error_EmptyManagedBeanName;
-
-	public static String DuplicateBeanGroup_Error_InvalidManagedBeanName;
-
-	public static String DuplicateBeanGroup_Error_DuplicatedManagedBeanName;
-
-	public static String WizardSummaryPage_Title_WizardSummary;
-
-	public static String WizardSummaryPage_Summary_SummaryDesc;
-
-	public static String WizardSummaryPage_Label_Field;
-
-	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 b63e540..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, 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
-###############################################################################
-NewManagedBeanWizardBase_Type = ManagedBeanTypeName
-NewManagedBeanWizardBase_Description = ManagedBeanTypeDescription
-NewManagedBeanWizardBase_Title = New Managed Bean Wizard
-
-NewManagedBeanCreationWizard_Title = Create a Managed Bean
-
-IntroWizardPage_Title = Introduction Page
-IntroWizardPage_Intro = This wizard walks through the steps to create a managed bean.
-
-ManagedBeanWizardSelectionPage_Title = Managed Bean Selection Page
-ManagedBeanWizardSelectionPage_Description = Select a managed bean type to proceed
-ManagedBeanWizardSelectionPage_Group = Please select the managed bean type:
-ManagedBeanWizardSelectionPage_HelpContextID = com.sybase.stf.jmt.new_managedbean_wizard
-
-Registry_LoadWizard_Error = Error loading wizard element, couldn't initialize!
-####################################################
-# Resource message for NewWizard
-####################################################
-NewWizard_Title_WizardDefault = call setWindowTitle(String) in your wizard sub-class
-
-##################################################################
-# Resource message for NewJavaManagedBeanWizards and its' pages.
-##################################################################
-ManagedBeanPropertyWizardPage_Title = Managed Bean Configuration
-ManagedBeanPropertyWizardPage_Description = Set managed bean's name and scope, and create or update Managed Bean's properties, their types and default values.
-
-ManagedBeanPropertyWizardPage_General = General
-
-ManagedBeanPropertyWizardPage_ManagedBeanName = Name:
-ManagedBeanPropertyWizardPage_ManagedBeanScope = Scope:
-ManagedBeanPropertyWizardPage_ManagedBeanDescription = Description:
-
-ManagedBeanPropertyWizardPage_ManagedBeanProperty = Properties:
-ManagedBeanPropertyWizardPage_PropertyName = Property Name
-ManagedBeanPropertyWizardPage_Type = Property Type
-ManagedBeanPropertyWizardPage_Value = Value
-ManagedBeanPropertyWizardPage_Button_Add = Add...
-ManagedBeanPropertyWizardPage_Button_Edit = Edit...
-ManagedBeanPropertyWizardPage_Button_Remove = Remove
-
-ManagedBeanPropertyWizardPage_Warning_MissingManagedBeanName = Managed bean name must be entered!
-ManagedBeanPropertyWizardPage_Warning_InvalidManagedBeanName = Managed bean name is not valid!
-ManagedBeanPropertyWizardPage_Warning_DuplicateManagedBeanName = Managed bean name can not be duplicate!
-
-ManagedBeanPropertyEditDialog_PropertyName = Property name:
-ManagedBeanPropertyEditDialog_DataType = Data type:
-ManagedBeanPropertyEditDialog_InitialValue = Initial value:
-
-ManagedBeanPropertyEditDialog_Title_NewPropertyEntry = New Property Entry
-ManagedBeanPropertyEditDialog_Title_ExistingPropertyEntry = Existing Property Entry
-
-FacesConfigSelectionWizardPage_Title = Faces-Config File
-FacesConfigSelectionWizardPage_Description = Select an existing faces-config file, such as faces-config.xml, to save the new managed bean.
-
-FacesConfigSelectionWizardPage_Project = Project name:
-FacesConfigSelectionWizardPage_FacesConfig = Faces-Config file:
-FacesConfigSelectionWizardPage_FacesConfig_Browser = Browse...
-
-FacesConfigSelectionWizardPage_Warning_MissingProjectName = Project name must be entered!
-FacesConfigSelectionWizardPage_Warning_MissingFacesConfigName = Faces-Config file name must be entered!
-FacesConfigSelectionWizardPage_Warning_InvalidFacesConfigName = Faces-config file name does not exist!
-FacesConfigSelectionWizardPage_Warning_InvalidFacesConfigContent = ''{0}'' is not a valid faces-config file!
-FacesConfigSelectionWizardPage_Warning_FacesConfigNotDefinedInWebDotXML = ''{0}'' is not specified in web.xml file!
-FacesConfigSelectionWizardPage_HelpContextID = com.sybase.stf.jmt.select_facesconfig_page
-
-FacesConfigFileSelectionDialog_Title = Faces-config File Selection
-FacesConfigFileSelectionDialog_Description = Select a faces-config file in the current project.
-
-JavaSelectionWizardPage_Title = Java Class Selection
-JavaSelectionWizardPage_Description = Search for an existing class or generate a new one.
-JavaSelectionWizardPage_Group = Source type for Java class
-JavaSelectionWizardPage_Search = Using an existing Java class
-JavaSelectionWizardPage_Search_Description = (This option will use an existing java class as managed bean's type.)
-JavaSelectionWizardPage_Search_ClassName = Qualified class name:
-JavaSelectionWizardPage_Search_ClassName_Browse = Browse...
-JavaSelectionWizardPage_Create = Create a new Java class
-JavaSelectionWizardPage_Create_Description = (This option will create a new java class in the next wizard page.)
-
-JavaSelectionWizardPage_FindType = Find Type
-JavaSelectionWizardPage_FindType_Filter = Choose a type (?=any character, *=any string):
-JavaSelectionWizardPage_Error_ClassIsEmpty = The type name should not be empty.
-JavaSelectionWizardPage_Error_ClassIsNotDefined = The type name ''{0}'' does not exist.
-JavaSelectionWizardPage_HelpContextID = com.sybase.stf.jmt.new_java_managedbean_wizard
-
-NewJavaManagedBeanWizard_Summary_ProjectName = Project name
-NewJavaManagedBeanWizard_Summary_FacesConfigFileName = Faces-Config file name
-NewJavaManagedBeanWizard_Summary_TypeName = Type name
-NewJavaManagedBeanWizard_Summary_PackageName = Package name
-NewJavaManagedBeanWizard_Summary_SourceFolder = Source folder
-NewJavaManagedBeanWizard_Summary_ManagedBeanName = Managed bean name
-NewJavaManagedBeanWizard_Summary_ManagedBeanScope = Managed bean scope
-NewJavaManagedBeanWizard_Summary_ClassName = Managed bean class
-NewJavaManagedBeanWizard_Summary_Description = Description
-NewJavaManagedBeanWizard_SummaryPage_Description = A new java managed bean will be created.
-
-NewJavaManagedBeanWizard_Task_CreateNewManagedBean = Creating a new managed bean
-NewJavaManagedBeanWizard_Task_CreateNewJavaClass = Creating a new java class
-
-DuplicateBeanWizard_Title = Set Duplicated Managed Bean
-DuplicateBeanPage_Title = Set duplicated managed bean
-DuplicateBeanPage_Description = Overwrite the duplicated managed bean or create a new one.
-
-DuplicateBeanGroup_Group_Label = Duplicated Managed Bean Options
-DuplicateBeanGroup_OverwriteButton_Text = Overwrite an existing managed bean using the new one
-
-DuplicateBeanGroup_NewButton_Text = Create a new managed bean
-DuplicateBeanGroup_NewNameDialogField_Label = New managed bean name:
-
-DuplicateBeanGroup_Error_EmptyManagedBeanName = The managed bean name can not be empty.
-DuplicateBeanGroup_Error_InvalidManagedBeanName = The managed bean name ''{0}'' contains invalid string, such as #,!.
-DuplicateBeanGroup_Error_DuplicatedManagedBeanName = The managed bean name ''{0}'' is duplicated.
-
-WizardSummaryPage_Title_WizardSummary = Wizard Summarys
-WizardSummaryPage_Summary_SummaryDesc = A new java managed bean will be created.
-WizardSummaryPage_Label_Field = Field
-WizardSummaryPage_Label_Value = Value
-
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.classpath b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.classpath
deleted file mode 100644
index eb95f1a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="facesconfig"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.cvsignore b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.cvsignore
deleted file mode 100644
index 96a949c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-bin
-build.xml
-javaCompiler...args
-@dot
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.project b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.project
deleted file mode 100644
index 2b7e076..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.facesconfig</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 2a4d55b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 16:03:03 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index aca62eb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,77 +0,0 @@
-#Tue Apr 10 09:06:00 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.jdt.ui.prefs b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 82eb6c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Apr 06 18:25:15 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/META-INF/MANIFEST.MF
deleted file mode 100644
index e05a184..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,29 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %plugin.name
-Bundle-SymbolicName: org.eclipse.jst.jsf.facesconfig; singleton:=true
-Bundle-Version: 1.0.1.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin$Implementation
-Bundle-Vendor: %plugin.provider
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.j2ee;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,2.4.0)",
- org.eclipse.wst.common.emf;bundle-version="[1.1.103,2.0.0)",
- org.eclipse.emf.edit.ui;bundle-version="[2.2.0,2.4.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.common.uriresolver;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.common.emfworkbench.integration;bundle-version="[1.1.0,1.2.0)"
-Eclipse-LazyStart: true
-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 04d4782..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 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>
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 4ac8b45..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";
-
-	/**
-	 * Editor id string.  TODO: broken?
-	 */
-	public static final String FACES_CONFIG_EDITOR_ID = "org.eclipse.jst.jsf.facesconfig.internal.presentation.FacesConfigEditor";
-
-	/**
-	 * The plugin instance
-	 */
-	public static final FacesConfigPlugin INSTANCE = new FacesConfigPlugin();
-	private static Implementation plugin;
-
-    private FacesConfigPlugin() {
-	    super(new ResourceLocator[] {});
-    }
-
-    public ResourceLocator getPluginResourceLocator() {
-      return plugin;
-    }
-
-    /**
-     * Returns the singleton instance of the Eclipse plugin.
-     * @return the singleton instance.
-     */
-    public static Implementation getPlugin() {
-      return plugin;
-    }
-
-    /**
-     * Returns the singleton instance of the Eclipse plugin.
-     * @param exception 
-     */
-    public static void write(Exception exception)
-    {
-      INSTANCE.log(exception);
-    }
-
-	/**
-	 * The actual implementation of the Eclipse <b>Plugin</b>.
-	 */
-	public final static class Implementation extends EMFPlugin.EclipsePlugin {
-		/**
-		 * Internal constructor
-		 */
-		public Implementation() {
-			super();
-			// Remember the static instance.
-			plugin = this;
-		}
-		public void start(BundleContext context) throws Exception {
-			super.start(context);
-			// Init Faces Config Package
-			FacesConfigPackageImpl.init();
-
-			getFacesconfigPackage();
-			
-			// TODO: XN: no sure whether this line is needed
-			FacesConfigResourceFactory.registerDtds();
-			
-			FacesConfigResourceFactory.register();
-		}
-
-		/**
-		 * @return The faces config package instance
-		 * TODO: used?
-		 */
-		public FacesConfigPackage getFacesconfigPackage() {
-			return FacesConfigPackage.eINSTANCE;
-		}
-		
-		/**
-		 * @return the faces config factory instance.
-		 * TODO: used?
-		 */
-		public FacesConfigFactory getFacesconfigFactory() {
-			return (FacesConfigFactory) getFacesconfigPackage().getEFactoryInstance();
-		}
-
-	}
-}
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ActionListenerTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ActionListenerTypeItemProvider.java
deleted file mode 100644
index 2181211..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.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.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 --> <!-- end-user-doc -->
- * 
- * @generated
- */
-public class ActionListenerTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-	/**
-	 * This constructs an instance from a factory and a notifier. 
-	 * <!--begin-user-doc --> 
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ActionListenerTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-	/**
-	 * This returns the property descriptors for the adapted class. 
-	 * <!-- begin-user-doc --> 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addTextContentPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-	/**
-	 * This adds a property descriptor for the Text Content feature. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * @param object 
-	 * 
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ActionListenerType_textContent_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ActionListenerType_textContent_feature", "_UI_ActionListenerType_type"),
-                 FacesConfigPackage.Literals.ACTION_LISTENER_TYPE__TEXT_CONTENT,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @param object 
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ActionListenerType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ActionListenerType_id_feature", "_UI_ActionListenerType_type"),
-                 FacesConfigPackage.Literals.ACTION_LISTENER_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns ActionListenerType.gif.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ActionListenerType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ActionListenerType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ActionListenerType_type") :
-            getString("_UI_ActionListenerType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ActionListenerType.class)) {
-            case FacesConfigPackage.ACTION_LISTENER_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.ACTION_LISTENER_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// 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_ActionListenerType_type");
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationExtensionTypeItemProvider.java
deleted file mode 100644
index d50eeb4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ApplicationExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ApplicationExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This returns ApplicationExtensionType.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ApplicationExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((ApplicationExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ApplicationExtensionType_type") :
-            getString("_UI_ApplicationExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationFactoryTypeItemProvider.java
deleted file mode 100644
index ecab7b9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationFactoryTypeItemProvider.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType} object.
- * <!-- begin-user-doc --> 
- * @extends {@link ITableItemLabelProvider}
- * <!-- end-user-doc -->
- * @generated
- */
-public class ApplicationFactoryTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource,ITableItemLabelProvider {
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-	/**
-	 * This constructs an instance from a factory and a notifier. 
-	 * <!-- begin-user-doc --> 
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ApplicationFactoryTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addTextContentPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-	/**
-	 * This adds a property descriptor for the Text Content feature. 
-	 * <!--begin-user-doc --> 
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ApplicationFactoryType_textContent_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ApplicationFactoryType_textContent_feature", "_UI_ApplicationFactoryType_type"),
-                 FacesConfigPackage.Literals.APPLICATION_FACTORY_TYPE__TEXT_CONTENT,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ApplicationFactoryType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ApplicationFactoryType_id_feature", "_UI_ApplicationFactoryType_type"),
-                 FacesConfigPackage.Literals.APPLICATION_FACTORY_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns ApplicationFactoryType.gif.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ApplicationFactoryType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ApplicationFactoryType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ApplicationFactoryType_type") :
-            getString("_UI_ApplicationFactoryType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ApplicationFactoryType.class)) {
-            case FacesConfigPackage.APPLICATION_FACTORY_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.APPLICATION_FACTORY_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-
-	/**
-	 * @param object
-	 * @param columnIndex
-	 * @return the column image
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_ApplicationFactoryType_type");
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationTypeItemProvider.java
deleted file mode 100644
index 7cc8cfc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationTypeItemProvider.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ApplicationTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ApplicationTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addIdPropertyDescriptor(object);
-            addELResolverPropertyDescriptor(object);
-            addResourceBundlePropertyDescriptor(object);
-            addApplicationExtensionPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addELResolverPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ApplicationType_eLResolver_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ApplicationType_eLResolver_feature", "_UI_ApplicationType_type"),
-                 FacesConfigPackage.Literals.APPLICATION_TYPE__EL_RESOLVER,
-                 true,
-                 false,
-                 true,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Resource Bundle feature.
-     * <!-- begin-user-doc -->
-     * <!-- 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 -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addApplicationExtensionPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ApplicationType_applicationExtension_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ApplicationType_applicationExtension_feature", "_UI_ApplicationType_type"),
-                 FacesConfigPackage.Literals.APPLICATION_TYPE__APPLICATION_EXTENSION,
-                 true,
-                 false,
-                 true,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__ACTION_LISTENER);
-            childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID);
-            childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__MESSAGE_BUNDLE);
-            childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__NAVIGATION_HANDLER);
-            childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__VIEW_HANDLER);
-            childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__STATE_MANAGER);
-            childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__PROPERTY_RESOLVER);
-            childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__VARIABLE_RESOLVER);
-            childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__LOCALE_CONFIG);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-        // Check the type of the specified child object and return the proper feature to use for
-        // adding (see {@link AddCommand}) it as a child.
-
-        return super.getChildFeature(object, child);
-    }
-
-    /**
-     * This returns ApplicationType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ApplicationType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ApplicationType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ApplicationType_type") :
-            getString("_UI_ApplicationType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ApplicationType.class)) {
-            case FacesConfigPackage.APPLICATION_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__ACTION_LISTENER:
-            case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID:
-            case FacesConfigPackage.APPLICATION_TYPE__MESSAGE_BUNDLE:
-            case FacesConfigPackage.APPLICATION_TYPE__NAVIGATION_HANDLER:
-            case FacesConfigPackage.APPLICATION_TYPE__VIEW_HANDLER:
-            case FacesConfigPackage.APPLICATION_TYPE__STATE_MANAGER:
-            case FacesConfigPackage.APPLICATION_TYPE__PROPERTY_RESOLVER:
-            case FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER:
-            case FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.APPLICATION_TYPE__ACTION_LISTENER,
-                 FacesConfigFactory.eINSTANCE.createActionListenerType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID,
-                 FacesConfigFactory.eINSTANCE.createDefaultRenderKitIdType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.APPLICATION_TYPE__MESSAGE_BUNDLE,
-                 FacesConfigFactory.eINSTANCE.createMessageBundleType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.APPLICATION_TYPE__NAVIGATION_HANDLER,
-                 FacesConfigFactory.eINSTANCE.createNavigationHandlerType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.APPLICATION_TYPE__VIEW_HANDLER,
-                 FacesConfigFactory.eINSTANCE.createViewHandlerType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.APPLICATION_TYPE__STATE_MANAGER,
-                 FacesConfigFactory.eINSTANCE.createStateManagerType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.APPLICATION_TYPE__PROPERTY_RESOLVER,
-                 FacesConfigFactory.eINSTANCE.createPropertyResolverType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.APPLICATION_TYPE__VARIABLE_RESOLVER,
-                 FacesConfigFactory.eINSTANCE.createVariableResolverType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.APPLICATION_TYPE__LOCALE_CONFIG,
-                 FacesConfigFactory.eINSTANCE.createLocaleConfigType()));
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeClassTypeItemProvider.java
deleted file mode 100644
index c378606..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeClassTypeItemProvider.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class AttributeClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public AttributeClassTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addTextContentPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Text Content feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addTextContentPropertyDescriptor(Object object) {
-	    
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_AttributeClassType_textContent_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_AttributeClassType_textContent_feature", "_UI_AttributeClassType_type"),
-                 FacesConfigPackage.Literals.ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_AttributeClassType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_AttributeClassType_id_feature", "_UI_AttributeClassType_type"),
-                 FacesConfigPackage.Literals.ATTRIBUTE_CLASS_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns AttributeClassType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/AttributeClassType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((AttributeClassType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_AttributeClassType_type") :
-            getString("_UI_AttributeClassType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(AttributeClassType.class)) {
-            case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeExtensionTypeItemProvider.java
deleted file mode 100644
index 4904e38..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class AttributeExtensionTypeItemProvider
-	extends ExtensionTypeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public AttributeExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This returns AttributeExtensionType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/AttributeExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((AttributeExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_AttributeExtensionType_type") :
-            getString("_UI_AttributeExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeNameTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeNameTypeItemProvider.java
deleted file mode 100644
index bfb262b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeNameTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class AttributeNameTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public AttributeNameTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addTextContentPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Text Content feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addTextContentPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_AttributeNameType_textContent_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_AttributeNameType_textContent_feature", "_UI_AttributeNameType_type"),
-                 FacesConfigPackage.Literals.ATTRIBUTE_NAME_TYPE__TEXT_CONTENT,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_AttributeNameType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_AttributeNameType_id_feature", "_UI_AttributeNameType_type"),
-                 FacesConfigPackage.Literals.ATTRIBUTE_NAME_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns AttributeNameType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/AttributeNameType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((AttributeNameType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_AttributeNameType_type") :
-            getString("_UI_AttributeNameType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(AttributeNameType.class)) {
-            case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeTypeItemProvider.java
deleted file mode 100644
index 1ba0ca6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeTypeItemProvider.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * 
- */
-public class AttributeTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource,
-		ITableItemLabelProvider{
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public AttributeTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addAttributeClassPropertyDescriptor(object);
-            addDefaultValuePropertyDescriptor(object);
-            addSuggestedValuePropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Attribute Class feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addAttributeClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_AttributeType_attributeClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_AttributeType_attributeClass_feature", "_UI_AttributeType_type"),
-                 FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Default Value feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addDefaultValuePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_AttributeType_defaultValue_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_AttributeType_defaultValue_feature", "_UI_AttributeType_type"),
-                 FacesConfigPackage.Literals.ATTRIBUTE_TYPE__DEFAULT_VALUE,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Suggested Value feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addSuggestedValuePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_AttributeType_suggestedValue_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_AttributeType_suggestedValue_feature", "_UI_AttributeType_type"),
-                 FacesConfigPackage.Literals.ATTRIBUTE_TYPE__SUGGESTED_VALUE,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_AttributeType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_AttributeType_id_feature", "_UI_AttributeType_type"),
-                 FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__DESCRIPTION);
-            childrenFeatures.add(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__DISPLAY_NAME);
-            childrenFeatures.add(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ICON);
-            childrenFeatures.add(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ATTRIBUTE_NAME);
-            childrenFeatures.add(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-        // Check the type of the specified child object and return the proper feature to use for
-        // adding (see {@link AddCommand}) it as a child.
-
-        return super.getChildFeature(object, child);
-    }
-
-    /**
-     * This returns AttributeType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/AttributeType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((AttributeType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_AttributeType_type") :
-            getString("_UI_AttributeType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(AttributeType.class)) {
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS:
-            case FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE:
-            case FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE:
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.ATTRIBUTE_TYPE__DESCRIPTION:
-            case FacesConfigPackage.ATTRIBUTE_TYPE__DISPLAY_NAME:
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ICON:
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME:
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.ATTRIBUTE_TYPE__DESCRIPTION,
-                 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.ATTRIBUTE_TYPE__DISPLAY_NAME,
-                 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ICON,
-                 FacesConfigFactory.eINSTANCE.createIconType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ATTRIBUTE_NAME,
-                 FacesConfigFactory.eINSTANCE.createAttributeNameType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION,
-                 FacesConfigFactory.eINSTANCE.createAttributeExtensionType()));
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	public String getColumnText(Object object, int columnIndex) {
-		AttributeType attribute = (AttributeType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return attribute.getAttributeName() == null ? "" : attribute
-					.getAttributeName().getTextContent();
-		case 1:
-			return attribute.getAttributeClass() == null ? "" : attribute
-					.getAttributeClass().getTextContent();
-		case 2:
-			return attribute.getDefaultValue() == null ? "" : attribute
-					.getDefaultValue().getTextContent();
-		case 3:
-			return attribute.getSuggestedValue() == null ? "" : attribute
-					.getSuggestedValue().getTextContent();
-		}
-		return null;
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BaseNameTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BaseNameTypeItemProvider.java
deleted file mode 100644
index 163ec94..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BaseNameTypeItemProvider.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.BaseNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class BaseNameTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public BaseNameTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addTextContentPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Text Content feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addTextContentPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_BaseNameType_textContent_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_BaseNameType_textContent_feature", "_UI_BaseNameType_type"),
-                 FacesConfigPackage.Literals.BASE_NAME_TYPE__TEXT_CONTENT,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_BaseNameType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_BaseNameType_id_feature", "_UI_BaseNameType_type"),
-                 FacesConfigPackage.Literals.BASE_NAME_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns BaseNameType.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/BaseNameType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((BaseNameType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_BaseNameType_type") :
-            getString("_UI_BaseNameType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(BaseNameType.class)) {
-            case FacesConfigPackage.BASE_NAME_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.BASE_NAME_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentClassTypeItemProvider.java
deleted file mode 100644
index 2a73dda..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentClassTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ComponentClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ComponentClassType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ComponentClassType_id_feature", "_UI_ComponentClassType_type"),
-                 FacesConfigPackage.Literals.COMPONENT_CLASS_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns ComponentClassType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ComponentClassType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ComponentClassType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ComponentClassType_type") :
-            getString("_UI_ComponentClassType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ComponentClassType.class)) {
-            case FacesConfigPackage.COMPONENT_CLASS_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.COMPONENT_CLASS_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentExtensionTypeItemProvider.java
deleted file mode 100644
index 0757a79..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ComponentExtensionTypeItemProvider
-	extends ExtensionTypeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ComponentExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This returns ComponentExtensionType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ComponentExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ComponentExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ComponentExtensionType_type") :
-            getString("_UI_ComponentExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentFamilyTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentFamilyTypeItemProvider.java
deleted file mode 100644
index 46eb3d8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentFamilyTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ComponentFamilyTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ComponentFamilyType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ComponentFamilyType_id_feature", "_UI_ComponentFamilyType_type"),
-                 FacesConfigPackage.Literals.COMPONENT_FAMILY_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns ComponentFamilyType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ComponentFamilyType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ComponentFamilyType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ComponentFamilyType_type") :
-            getString("_UI_ComponentFamilyType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ComponentFamilyType.class)) {
-            case FacesConfigPackage.COMPONENT_FAMILY_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.COMPONENT_FAMILY_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentTypeItemProvider.java
deleted file mode 100644
index 72adf3f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentTypeItemProvider.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import 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.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a
- * {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType} object. <!--
- * begin-user-doc --> <!-- end-user-doc -->
- * 
- * @generated
- */
-public class ComponentTypeItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-	/**
-	 * This constructs an instance from a factory and a notifier. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @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;
-    }
-
-	protected void addComponentClassPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-				((ComposeableAdapterFactory) adapterFactory)
-						.getRootAdapterFactory(), getResourceLocator(),
-				getString("_UI_ComponentType_componentClass_feature"),
-				getString("_UI_PropertyDescriptor_description",
-						"_UI_ComponentType_componentClass_feature",
-						"_UI_ComponentType_type"), FacesConfigPackage.eINSTANCE
-						.getComponentType_ComponentClass(), true, null, null,
-				null));
-	}
-	
-	protected void addComponentTypePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-				((ComposeableAdapterFactory) adapterFactory)
-						.getRootAdapterFactory(), getResourceLocator(),
-				getString("_UI_ComponentType_componentType_feature"),
-				getString("_UI_PropertyDescriptor_description",
-						"_UI_ComponentType_componentType_feature",
-						"_UI_ComponentType_type"), FacesConfigPackage.eINSTANCE
-						.getComponentType_ComponentType(), true, null, null,
-				null));
-	}
-	
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ComponentType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ComponentType_id_feature", "_UI_ComponentType_type"),
-                 FacesConfigPackage.Literals.COMPONENT_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__DESCRIPTION);
-            childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__DISPLAY_NAME);
-            childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__ICON);
-            childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__COMPONENT_TYPE);
-            childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__COMPONENT_CLASS);
-            childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__FACET);
-            childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__ATTRIBUTE);
-            childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__PROPERTY);
-            childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__COMPONENT_EXTENSION);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-        // Check the type of the specified child object and return the proper feature to use for
-        // adding (see {@link AddCommand}) it as a child.
-
-        return super.getChildFeature(object, child);
-    }
-
-	/**
-	 * This returns ComponentType.gif. <!-- begin-user-doc --> <!-- end-user-doc
-	 * -->
-	 * 
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ComponentType"));
-    }
-
-	/**
-	 * This returns the label text for the adapted class. <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * 
-	 * 
-	 */
-	public String getText(Object object) {
-		String label = null;
-		// if (((ComponentType) object).getDisplayName() != null
-		// && ((ComponentType) object).getDisplayName().size() > 0) {
-		// label = ((DisplayNameType) ((ComponentType) object)
-		// .getDisplayName().get(0)).getTextContent();
-		//		}
-
-		if (label == null || label.length() == 0) {
-			if (((ComponentType) object).getComponentClass() != null) {
-				label = ((ComponentType) object).getComponentClass()
-						.getTextContent();
-			}
-		}
-		
-		return label == null || label.length() == 0 ? getString("_UI_ComponentType_type")
-				: getString("_UI_ComponentType_type") + " " + label;
-	}
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ComponentType.class)) {
-            case FacesConfigPackage.COMPONENT_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.COMPONENT_TYPE__DESCRIPTION:
-            case FacesConfigPackage.COMPONENT_TYPE__DISPLAY_NAME:
-            case FacesConfigPackage.COMPONENT_TYPE__ICON:
-            case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE:
-            case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS:
-            case FacesConfigPackage.COMPONENT_TYPE__FACET:
-            case FacesConfigPackage.COMPONENT_TYPE__ATTRIBUTE:
-            case FacesConfigPackage.COMPONENT_TYPE__PROPERTY:
-            case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_EXTENSION:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.COMPONENT_TYPE__DESCRIPTION,
-                 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.COMPONENT_TYPE__DISPLAY_NAME,
-                 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.COMPONENT_TYPE__ICON,
-                 FacesConfigFactory.eINSTANCE.createIconType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.COMPONENT_TYPE__COMPONENT_TYPE,
-                 FacesConfigFactory.eINSTANCE.createComponentTypeType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.COMPONENT_TYPE__COMPONENT_CLASS,
-                 FacesConfigFactory.eINSTANCE.createComponentClassType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.COMPONENT_TYPE__FACET,
-                 FacesConfigFactory.eINSTANCE.createFacetType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.COMPONENT_TYPE__ATTRIBUTE,
-                 FacesConfigFactory.eINSTANCE.createAttributeType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.COMPONENT_TYPE__PROPERTY,
-                 FacesConfigFactory.eINSTANCE.createPropertyType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.COMPONENT_TYPE__COMPONENT_EXTENSION,
-                 FacesConfigFactory.eINSTANCE.createComponentExtensionType()));
-    }
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		ComponentType component = (ComponentType) object;
-		switch (columnIndex) {
-		case 0:
-			return getText(object);
-		case 1:
-			return component.getComponentClass() == null ? "" : component
-					.getComponentClass().getTextContent();
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentTypeTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentTypeTypeItemProvider.java
deleted file mode 100644
index 2f66694..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentTypeTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ComponentTypeTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ComponentTypeType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ComponentTypeType_id_feature", "_UI_ComponentTypeType_type"),
-                 FacesConfigPackage.Literals.COMPONENT_TYPE_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns ComponentTypeType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ComponentTypeType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ComponentTypeType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ComponentTypeType_type") :
-            getString("_UI_ComponentTypeType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ComponentTypeType.class)) {
-            case FacesConfigPackage.COMPONENT_TYPE_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.COMPONENT_TYPE_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterClassTypeItemProvider.java
deleted file mode 100644
index ba5e398..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterClassTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ConverterClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ConverterClassType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ConverterClassType_id_feature", "_UI_ConverterClassType_type"),
-                 FacesConfigPackage.Literals.CONVERTER_CLASS_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns ConverterClassType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ConverterClassType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ConverterClassType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ConverterClassType_type") :
-            getString("_UI_ConverterClassType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ConverterClassType.class)) {
-            case FacesConfigPackage.CONVERTER_CLASS_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.CONVERTER_CLASS_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterExtensionTypeItemProvider.java
deleted file mode 100644
index 4ffb589..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ConverterExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ConverterExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This returns ConverterExtensionType.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ConverterExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((ConverterExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ConverterExtensionType_type") :
-            getString("_UI_ConverterExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterForClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterForClassTypeItemProvider.java
deleted file mode 100644
index 3007a8c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterForClassTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ConverterForClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addTextContentPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ConverterForClassType_textContent_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ConverterForClassType_textContent_feature", "_UI_ConverterForClassType_type"),
-                 FacesConfigPackage.Literals.CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ConverterForClassType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ConverterForClassType_id_feature", "_UI_ConverterForClassType_type"),
-                 FacesConfigPackage.Literals.CONVERTER_FOR_CLASS_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns ConverterForClassType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ConverterForClassType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ConverterForClassType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ConverterForClassType_type") :
-            getString("_UI_ConverterForClassType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ConverterForClassType.class)) {
-            case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterIdTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterIdTypeItemProvider.java
deleted file mode 100644
index 9b368d0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterIdTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ConverterIdTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ConverterIdType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ConverterIdType_id_feature", "_UI_ConverterIdType_type"),
-                 FacesConfigPackage.Literals.CONVERTER_ID_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns ConverterIdType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ConverterIdType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ConverterIdType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ConverterIdType_type") :
-            getString("_UI_ConverterIdType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ConverterIdType.class)) {
-            case FacesConfigPackage.CONVERTER_ID_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.CONVERTER_ID_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterTypeItemProvider.java
deleted file mode 100644
index 97fbff5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterTypeItemProvider.java
+++ /dev/null
@@ -1,325 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import 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.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a
- * {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType} object. <!--
- * begin-user-doc --> <!-- end-user-doc -->
- * 
- * @generated
- */
-public class ConverterTypeItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-	/**
-	 * This constructs an instance from a factory and a notifier. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ConverterTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addConverterIdPropertyDescriptor(object);
-            addConverterForClassPropertyDescriptor(object);
-            addConverterClassPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-	/**
-	 * This adds a property descriptor for the Converter Id feature. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addConverterIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ConverterType_converterId_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ConverterType_converterId_feature", "_UI_ConverterType_type"),
-                 FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_ID,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-	/**
-	 * This adds a property descriptor for the Converter For Class feature. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addConverterForClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ConverterType_converterForClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ConverterType_converterForClass_feature", "_UI_ConverterType_type"),
-                 FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_FOR_CLASS,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-	/**
-	 * This adds a property descriptor for the Converter Class feature. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addConverterClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ConverterType_converterClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ConverterType_converterClass_feature", "_UI_ConverterType_type"),
-                 FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_CLASS,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ConverterType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ConverterType_id_feature", "_UI_ConverterType_type"),
-                 FacesConfigPackage.Literals.CONVERTER_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__DESCRIPTION);
-            childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__DISPLAY_NAME);
-            childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__ICON);
-            childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__ATTRIBUTE);
-            childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__PROPERTY);
-            childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_EXTENSION);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-        // Check the type of the specified child object and return the proper feature to use for
-        // adding (see {@link AddCommand}) it as a child.
-
-        return super.getChildFeature(object, child);
-    }
-
-	/**
-	 * This returns ConverterType.gif. <!-- begin-user-doc --> <!-- end-user-doc
-	 * -->
-	 * 
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ConverterType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ConverterType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ConverterType_type") :
-            getString("_UI_ConverterType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ConverterType.class)) {
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID:
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS:
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS:
-            case FacesConfigPackage.CONVERTER_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.CONVERTER_TYPE__DESCRIPTION:
-            case FacesConfigPackage.CONVERTER_TYPE__DISPLAY_NAME:
-            case FacesConfigPackage.CONVERTER_TYPE__ICON:
-            case FacesConfigPackage.CONVERTER_TYPE__ATTRIBUTE:
-            case FacesConfigPackage.CONVERTER_TYPE__PROPERTY:
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_EXTENSION:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.CONVERTER_TYPE__DESCRIPTION,
-                 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.CONVERTER_TYPE__DISPLAY_NAME,
-                 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.CONVERTER_TYPE__ICON,
-                 FacesConfigFactory.eINSTANCE.createIconType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.CONVERTER_TYPE__ATTRIBUTE,
-                 FacesConfigFactory.eINSTANCE.createAttributeType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.CONVERTER_TYPE__PROPERTY,
-                 FacesConfigFactory.eINSTANCE.createPropertyType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_EXTENSION,
-                 FacesConfigFactory.eINSTANCE.createConverterExtensionType()));
-    }
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// 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) {
-		ConverterType converter = (ConverterType) object;
-		switch (columnIndex) {
-		case 0:
-			return getText(object);
-		case 1:
-			return converter.getConverterClass() == null ? "" : converter
-					.getConverterClass().getTextContent();
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultLocaleTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultLocaleTypeItemProvider.java
deleted file mode 100644
index c741921..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultLocaleTypeItemProvider.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a
- * {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType} object. <!--
- * begin-user-doc --> <!-- end-user-doc -->
- * 
- * @generated
- */
-public class DefaultLocaleTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-	/**
-	 * This constructs an instance from a factory and a notifier. <!--
-	 * begin-user-doc --> <!-- 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 --> <!-- 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
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_DefaultLocaleType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_DefaultLocaleType_id_feature", "_UI_DefaultLocaleType_type"),
-                 FacesConfigPackage.Literals.DEFAULT_LOCALE_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns DefaultLocaleType.gif.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/DefaultLocaleType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        String label = ((DefaultLocaleType)object).getTextContent();
-        return label == null || label.length() == 0 ?
-            getString("_UI_DefaultLocaleType_type") :
-            label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(DefaultLocaleType.class)) {
-            case FacesConfigPackage.DEFAULT_LOCALE_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.DEFAULT_LOCALE_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultRenderKitIdTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultRenderKitIdTypeItemProvider.java
deleted file mode 100644
index 46ae685..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultRenderKitIdTypeItemProvider.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.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.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 --> <!-- end-user-doc -->
- * @generated
- */
-public class DefaultRenderKitIdTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-	/**
-	 * This constructs an instance from a factory and a notifier. <!--
-	 * begin-user-doc --> <!-- 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 --> <!-- 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
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_DefaultRenderKitIdType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_DefaultRenderKitIdType_id_feature", "_UI_DefaultRenderKitIdType_type"),
-                 FacesConfigPackage.Literals.DEFAULT_RENDER_KIT_ID_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns DefaultRenderKitIdType.gif.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/DefaultRenderKitIdType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((DefaultRenderKitIdType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_DefaultRenderKitIdType_type") :
-            getString("_UI_DefaultRenderKitIdType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(DefaultRenderKitIdType.class)) {
-            case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// 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_DefaultRenderKitIdType_type");
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultValueTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultValueTypeItemProvider.java
deleted file mode 100644
index 7f03d26..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultValueTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DefaultValueTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_DefaultValueType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_DefaultValueType_id_feature", "_UI_DefaultValueType_type"),
-                 FacesConfigPackage.Literals.DEFAULT_VALUE_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns DefaultValueType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/DefaultValueType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((DefaultValueType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_DefaultValueType_type") :
-            getString("_UI_DefaultValueType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(DefaultValueType.class)) {
-            case FacesConfigPackage.DEFAULT_VALUE_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.DEFAULT_VALUE_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DescriptionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DescriptionTypeItemProvider.java
deleted file mode 100644
index f4293a2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DescriptionTypeItemProvider.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DescriptionTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_DescriptionType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_DescriptionType_id_feature", "_UI_DescriptionType_type"),
-                 FacesConfigPackage.Literals.DESCRIPTION_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns DescriptionType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/DescriptionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((DescriptionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_DescriptionType_type") :
-            getString("_UI_DescriptionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(DescriptionType.class)) {
-            case FacesConfigPackage.DESCRIPTION_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.DESCRIPTION_TYPE__LANG:
-            case FacesConfigPackage.DESCRIPTION_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DisplayNameTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DisplayNameTypeItemProvider.java
deleted file mode 100644
index cd915c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DisplayNameTypeItemProvider.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DisplayNameTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addTextContentPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_DisplayNameType_textContent_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_DisplayNameType_textContent_feature", "_UI_DisplayNameType_type"),
-                 FacesConfigPackage.Literals.DISPLAY_NAME_TYPE__TEXT_CONTENT,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Lang feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addLangPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_DisplayNameType_lang_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_DisplayNameType_lang_feature", "_UI_DisplayNameType_type"),
-                 FacesConfigPackage.Literals.DISPLAY_NAME_TYPE__LANG,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_DisplayNameType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_DisplayNameType_id_feature", "_UI_DisplayNameType_type"),
-                 FacesConfigPackage.Literals.DISPLAY_NAME_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns DisplayNameType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/DisplayNameType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((DisplayNameType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_DisplayNameType_type") :
-            getString("_UI_DisplayNameType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(DisplayNameType.class)) {
-            case FacesConfigPackage.DISPLAY_NAME_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.DISPLAY_NAME_TYPE__LANG:
-            case FacesConfigPackage.DISPLAY_NAME_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DocumentRootItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DocumentRootItemProvider.java
deleted file mode 100644
index bd15c75..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DocumentRootItemProvider.java
+++ /dev/null
@@ -1,389 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DocumentRootItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public DocumentRootItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__MIXED);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * This returns DocumentRoot.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/DocumentRoot"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        return getString("_UI_DocumentRoot_type");
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(DocumentRoot.class)) {
-            case FacesConfigPackage.DOCUMENT_ROOT__MIXED:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__ACTION_LISTENER,
-                 FacesConfigFactory.eINSTANCE.createActionListenerType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__APPLICATION,
-                 FacesConfigFactory.eINSTANCE.createApplicationType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__APPLICATION_FACTORY,
-                 FacesConfigFactory.eINSTANCE.createApplicationFactoryType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE,
-                 FacesConfigFactory.eINSTANCE.createAttributeType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION,
-                 FacesConfigFactory.eINSTANCE.createAttributeExtensionType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_NAME,
-                 FacesConfigFactory.eINSTANCE.createAttributeNameType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT,
-                 FacesConfigFactory.eINSTANCE.createComponentType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_CLASS,
-                 FacesConfigFactory.eINSTANCE.createComponentClassType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_EXTENSION,
-                 FacesConfigFactory.eINSTANCE.createComponentExtensionType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_TYPE,
-                 FacesConfigFactory.eINSTANCE.createComponentTypeType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER,
-                 FacesConfigFactory.eINSTANCE.createConverterType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_LOCALE,
-                 FacesConfigFactory.eINSTANCE.createDefaultLocaleType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__DESCRIPTION,
-                 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__DISPLAY_NAME,
-                 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONFIG,
-                 FacesConfigFactory.eINSTANCE.createFacesConfigType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY,
-                 FacesConfigFactory.eINSTANCE.createFacesContextFactoryType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__FACTORY,
-                 FacesConfigFactory.eINSTANCE.createFactoryType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__ICON,
-                 FacesConfigFactory.eINSTANCE.createIconType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__LIFECYCLE,
-                 FacesConfigFactory.eINSTANCE.createLifecycleType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__LIFECYCLE_FACTORY,
-                 FacesConfigFactory.eINSTANCE.createLifecycleFactoryType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__LIST_ENTRIES,
-                 FacesConfigFactory.eINSTANCE.createListEntriesType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__LOCALE_CONFIG,
-                 FacesConfigFactory.eINSTANCE.createLocaleConfigType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN,
-                 FacesConfigFactory.eINSTANCE.createManagedBeanType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_PROPERTY,
-                 FacesConfigFactory.eINSTANCE.createManagedPropertyType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__MAP_ENTRIES,
-                 FacesConfigFactory.eINSTANCE.createMapEntriesType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__MAP_ENTRY,
-                 FacesConfigFactory.eINSTANCE.createMapEntryType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__MESSAGE_BUNDLE,
-                 FacesConfigFactory.eINSTANCE.createMessageBundleType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_CASE,
-                 FacesConfigFactory.eINSTANCE.createNavigationCaseType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_HANDLER,
-                 FacesConfigFactory.eINSTANCE.createNavigationHandlerType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_RULE,
-                 FacesConfigFactory.eINSTANCE.createNavigationRuleType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__NULL_VALUE,
-                 FacesConfigFactory.eINSTANCE.createNullValueType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__PHASE_LISTENER,
-                 FacesConfigFactory.eINSTANCE.createPhaseListenerType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY,
-                 FacesConfigFactory.eINSTANCE.createPropertyType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_EXTENSION,
-                 FacesConfigFactory.eINSTANCE.createPropertyExtensionType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_RESOLVER,
-                 FacesConfigFactory.eINSTANCE.createPropertyResolverType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT,
-                 FacesConfigFactory.eINSTANCE.createRedirectType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN,
-                 FacesConfigFactory.eINSTANCE.createReferencedBeanType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER,
-                 FacesConfigFactory.eINSTANCE.createRendererType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_EXTENSION,
-                 FacesConfigFactory.eINSTANCE.createRendererExtensionType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT,
-                 FacesConfigFactory.eINSTANCE.createRenderKitType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_FACTORY,
-                 FacesConfigFactory.eINSTANCE.createRenderKitFactoryType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__STATE_MANAGER,
-                 FacesConfigFactory.eINSTANCE.createStateManagerType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__SUPPORTED_LOCALE,
-                 FacesConfigFactory.eINSTANCE.createSupportedLocaleType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR,
-                 FacesConfigFactory.eINSTANCE.createValidatorType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__VALUE,
-                 FacesConfigFactory.eINSTANCE.createValueType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__VARIABLE_RESOLVER,
-                 FacesConfigFactory.eINSTANCE.createVariableResolverType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_HANDLER,
-                 FacesConfigFactory.eINSTANCE.createViewHandlerType()));
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DynamicAttributeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DynamicAttributeItemProvider.java
deleted file mode 100644
index b87b805..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
- */
-public class DynamicAttributeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * <!-- 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 -->
-     * <!-- 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 -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addValuePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_DynamicAttribute_value_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_DynamicAttribute_value_feature", "_UI_DynamicAttribute_type"),
-                 FacesConfigPackage.Literals.DYNAMIC_ATTRIBUTE__VALUE,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns DynamicAttribute.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/DynamicAttribute"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((DynamicAttribute)object).getName();
-        return label == null || label.length() == 0 ?
-            getString("_UI_DynamicAttribute_type") :
-            getString("_UI_DynamicAttribute_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(DynamicAttribute.class)) {
-            case FacesConfigPackage.DYNAMIC_ATTRIBUTE__NAME:
-            case FacesConfigPackage.DYNAMIC_ATTRIBUTE__VALUE:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DynamicElementItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DynamicElementItemProvider.java
deleted file mode 100644
index ec595ee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DynamicElementItemProvider.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicElement;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DynamicElementItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * <!-- 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 -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addAttributesPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_DynamicElement_attributes_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_DynamicElement_attributes_feature", "_UI_DynamicElement_type"),
-                 FacesConfigPackage.Literals.DYNAMIC_ELEMENT__ATTRIBUTES,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Text Content feature.
-     * <!-- begin-user-doc -->
-     * <!-- 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 -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addNamePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_DynamicElement_name_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_DynamicElement_name_feature", "_UI_DynamicElement_type"),
-                 FacesConfigPackage.Literals.DYNAMIC_ELEMENT__NAME,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.DYNAMIC_ELEMENT__CHILD_NODES);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * This returns DynamicElement.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/DynamicElement"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((DynamicElement)object).getName();
-        return label == null || label.length() == 0 ?
-            getString("_UI_DynamicElement_type") :
-            getString("_UI_DynamicElement_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(DynamicElement.class)) {
-            case FacesConfigPackage.DYNAMIC_ELEMENT__NAME:
-            case FacesConfigPackage.DYNAMIC_ELEMENT__ATTRIBUTES:
-            case FacesConfigPackage.DYNAMIC_ELEMENT__TEXT_CONTENT:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.DYNAMIC_ELEMENT__CHILD_NODES:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.DYNAMIC_ELEMENT__CHILD_NODES,
-                 FacesConfigFactory.eINSTANCE.createDynamicElement()));
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ELResolverTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ELResolverTypeItemProvider.java
deleted file mode 100644
index bc6e861..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
- */
-public class ELResolverTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * <!-- 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 -->
-     * <!-- 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 -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ELResolverType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ELResolverType_id_feature", "_UI_ELResolverType_type"),
-                 FacesConfigPackage.Literals.EL_RESOLVER_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns ELResolverType.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ELResolverType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((ELResolverType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ELResolverType_type") :
-            getString("_UI_ELResolverType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ELResolverType.class)) {
-            case FacesConfigPackage.EL_RESOLVER_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.EL_RESOLVER_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ExtensionTypeItemProvider.java
deleted file mode 100644
index f51629b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ExtensionTypeItemProvider.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.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.ExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ExtensionTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * <!-- 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 -->
-     * <!-- 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 -->
-     * <!-- 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 -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ExtensionType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ExtensionType_id_feature", "_UI_ExtensionType_type"),
-                 FacesConfigPackage.Literals.EXTENSION_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((ExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ExtensionType_type") :
-            getString("_UI_ExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ExtensionType.class)) {
-            case FacesConfigPackage.EXTENSION_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.EXTENSION_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigEditPlugin.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigEditPlugin.java
deleted file mode 100644
index 60b7670..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigEditPlugin.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import org.eclipse.emf.common.EMFPlugin;
-import org.eclipse.emf.common.util.ResourceLocator;
-
-/**
- * This is the central singleton for the FacesConfig edit plugin.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public final class FacesConfigEditPlugin extends EMFPlugin {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-	/**
-	 * Keep track of the singleton.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final FacesConfigEditPlugin INSTANCE = new FacesConfigEditPlugin();
-
-	/**
-	 * Keep track of the singleton.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static Implementation plugin;
-
-	/**
-	 * Create the instance.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesConfigEditPlugin() {
-		super
-		  (new ResourceLocator [] {
-		   });
-	}
-
-	/**
-	 * Returns the singleton instance of the Eclipse plugin.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the singleton instance.
-	 * @generated
-	 */
-	public ResourceLocator getPluginResourceLocator() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the singleton instance of the Eclipse plugin.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the singleton instance.
-	 * @generated
-	 */
-	public static Implementation getPlugin() {
-		return plugin;
-	}
-
-	/**
-	 * The actual implementation of the Eclipse <b>Plugin</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static class Implementation extends EclipsePlugin {
-		/**
-		 * Creates an instance.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		public Implementation() {
-			super();
-
-			// Remember the static instance.
-			//
-			plugin = this;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigExtensionTypeItemProvider.java
deleted file mode 100644
index 97bad27..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class FacesConfigExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FacesConfigExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This returns FacesConfigExtensionType.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/FacesConfigExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((FacesConfigExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_FacesConfigExtensionType_type") :
-            getString("_UI_FacesConfigExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigItemProviderAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigItemProviderAdapterFactory.java
deleted file mode 100644
index c3f6b09..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,2396 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/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
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This keeps track of the root adapter factory that delegates to this adapter factory.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ComposedAdapterFactory parentAdapterFactory;
-
-    /**
-     * This is used to implement {@link org.eclipse.emf.edit.provider.IChangeNotifier}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected IChangeNotifier changeNotifier = new ChangeNotifier();
-
-    /**
-     * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected Collection supportedTypes = new ArrayList();
-
-    /**
-     * This constructs an instance.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public FacesConfigItemProviderAdapterFactory() {
-        supportedTypes.add(IEditingDomainItemProvider.class);
-        supportedTypes.add(IStructuredItemContentProvider.class);
-        supportedTypes.add(ITreeItemContentProvider.class);
-        supportedTypes.add(IItemLabelProvider.class);
-        supportedTypes.add(IItemPropertySource.class);		
-        supportedTypes.add(ITableItemLabelProvider.class);
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ActionListenerTypeItemProvider actionListenerTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createActionListenerTypeAdapter() {
-        if (actionListenerTypeItemProvider == null) {
-            actionListenerTypeItemProvider = new ActionListenerTypeItemProvider(this);
-        }
-
-        return actionListenerTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ApplicationFactoryTypeItemProvider applicationFactoryTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createApplicationFactoryTypeAdapter() {
-        if (applicationFactoryTypeItemProvider == null) {
-            applicationFactoryTypeItemProvider = new ApplicationFactoryTypeItemProvider(this);
-        }
-
-        return applicationFactoryTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ApplicationTypeItemProvider applicationTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createApplicationTypeAdapter() {
-        if (applicationTypeItemProvider == null) {
-            applicationTypeItemProvider = new ApplicationTypeItemProvider(this);
-        }
-
-        return applicationTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected AttributeClassTypeItemProvider attributeClassTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createAttributeClassTypeAdapter() {
-        if (attributeClassTypeItemProvider == null) {
-            attributeClassTypeItemProvider = new AttributeClassTypeItemProvider(this);
-        }
-
-        return attributeClassTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected AttributeExtensionTypeItemProvider attributeExtensionTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createAttributeExtensionTypeAdapter() {
-        if (attributeExtensionTypeItemProvider == null) {
-            attributeExtensionTypeItemProvider = new AttributeExtensionTypeItemProvider(this);
-        }
-
-        return attributeExtensionTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected AttributeNameTypeItemProvider attributeNameTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createAttributeNameTypeAdapter() {
-        if (attributeNameTypeItemProvider == null) {
-            attributeNameTypeItemProvider = new AttributeNameTypeItemProvider(this);
-        }
-
-        return attributeNameTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected AttributeTypeItemProvider attributeTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createAttributeTypeAdapter() {
-        if (attributeTypeItemProvider == null) {
-            attributeTypeItemProvider = new AttributeTypeItemProvider(this);
-        }
-
-        return attributeTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ComponentClassTypeItemProvider componentClassTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createComponentClassTypeAdapter() {
-        if (componentClassTypeItemProvider == null) {
-            componentClassTypeItemProvider = new ComponentClassTypeItemProvider(this);
-        }
-
-        return componentClassTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ComponentExtensionTypeItemProvider componentExtensionTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createComponentExtensionTypeAdapter() {
-        if (componentExtensionTypeItemProvider == null) {
-            componentExtensionTypeItemProvider = new ComponentExtensionTypeItemProvider(this);
-        }
-
-        return componentExtensionTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ComponentFamilyTypeItemProvider componentFamilyTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createComponentFamilyTypeAdapter() {
-        if (componentFamilyTypeItemProvider == null) {
-            componentFamilyTypeItemProvider = new ComponentFamilyTypeItemProvider(this);
-        }
-
-        return componentFamilyTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ComponentTypeItemProvider componentTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createComponentTypeAdapter() {
-        if (componentTypeItemProvider == null) {
-            componentTypeItemProvider = new ComponentTypeItemProvider(this);
-        }
-
-        return componentTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ComponentTypeTypeItemProvider componentTypeTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createComponentTypeTypeAdapter() {
-        if (componentTypeTypeItemProvider == null) {
-            componentTypeTypeItemProvider = new ComponentTypeTypeItemProvider(this);
-        }
-
-        return componentTypeTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ConverterClassTypeItemProvider converterClassTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createConverterClassTypeAdapter() {
-        if (converterClassTypeItemProvider == null) {
-            converterClassTypeItemProvider = new ConverterClassTypeItemProvider(this);
-        }
-
-        return converterClassTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ConverterForClassTypeItemProvider converterForClassTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createConverterForClassTypeAdapter() {
-        if (converterForClassTypeItemProvider == null) {
-            converterForClassTypeItemProvider = new ConverterForClassTypeItemProvider(this);
-        }
-
-        return converterForClassTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ConverterIdTypeItemProvider converterIdTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createConverterIdTypeAdapter() {
-        if (converterIdTypeItemProvider == null) {
-            converterIdTypeItemProvider = new ConverterIdTypeItemProvider(this);
-        }
-
-        return converterIdTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ConverterTypeItemProvider converterTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createConverterTypeAdapter() {
-        if (converterTypeItemProvider == null) {
-            converterTypeItemProvider = new ConverterTypeItemProvider(this);
-        }
-
-        return converterTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected DefaultLocaleTypeItemProvider defaultLocaleTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createDefaultLocaleTypeAdapter() {
-        if (defaultLocaleTypeItemProvider == null) {
-            defaultLocaleTypeItemProvider = new DefaultLocaleTypeItemProvider(this);
-        }
-
-        return defaultLocaleTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected DefaultRenderKitIdTypeItemProvider defaultRenderKitIdTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createDefaultRenderKitIdTypeAdapter() {
-        if (defaultRenderKitIdTypeItemProvider == null) {
-            defaultRenderKitIdTypeItemProvider = new DefaultRenderKitIdTypeItemProvider(this);
-        }
-
-        return defaultRenderKitIdTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected DefaultValueTypeItemProvider defaultValueTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createDefaultValueTypeAdapter() {
-        if (defaultValueTypeItemProvider == null) {
-            defaultValueTypeItemProvider = new DefaultValueTypeItemProvider(this);
-        }
-
-        return defaultValueTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected DescriptionTypeItemProvider descriptionTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createDescriptionTypeAdapter() {
-        if (descriptionTypeItemProvider == null) {
-            descriptionTypeItemProvider = new DescriptionTypeItemProvider(this);
-        }
-
-        return descriptionTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected DisplayNameTypeItemProvider displayNameTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createDisplayNameTypeAdapter() {
-        if (displayNameTypeItemProvider == null) {
-            displayNameTypeItemProvider = new DisplayNameTypeItemProvider(this);
-        }
-
-        return displayNameTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected DocumentRootItemProvider documentRootItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createDocumentRootAdapter() {
-        if (documentRootItemProvider == null) {
-            documentRootItemProvider = new DocumentRootItemProvider(this);
-        }
-
-        return documentRootItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute} instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected DynamicAttributeItemProvider dynamicAttributeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Adapter createDynamicAttributeAdapter() {
-        if (dynamicAttributeItemProvider == null) {
-            dynamicAttributeItemProvider = new DynamicAttributeItemProvider(this);
-        }
-
-        return dynamicAttributeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement} instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected DynamicElementItemProvider dynamicElementItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Adapter createDynamicElementAdapter() {
-        if (dynamicElementItemProvider == null) {
-            dynamicElementItemProvider = new DynamicElementItemProvider(this);
-        }
-
-        return dynamicElementItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType} instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ELResolverTypeItemProvider elResolverTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Adapter createELResolverTypeAdapter() {
-        if (elResolverTypeItemProvider == null) {
-            elResolverTypeItemProvider = new ELResolverTypeItemProvider(this);
-        }
-
-        return elResolverTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType} instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FacesConfigExtensionTypeItemProvider facesConfigExtensionTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Adapter createFacesConfigExtensionTypeAdapter() {
-        if (facesConfigExtensionTypeItemProvider == null) {
-            facesConfigExtensionTypeItemProvider = new FacesConfigExtensionTypeItemProvider(this);
-        }
-
-        return facesConfigExtensionTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType} instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FactoryExtensionTypeItemProvider factoryExtensionTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Adapter createFactoryExtensionTypeAdapter() {
-        if (factoryExtensionTypeItemProvider == null) {
-            factoryExtensionTypeItemProvider = new FactoryExtensionTypeItemProvider(this);
-        }
-
-        return factoryExtensionTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType} instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected LifecycleExtensionTypeItemProvider lifecycleExtensionTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Adapter createLifecycleExtensionTypeAdapter() {
-        if (lifecycleExtensionTypeItemProvider == null) {
-            lifecycleExtensionTypeItemProvider = new LifecycleExtensionTypeItemProvider(this);
-        }
-
-        return lifecycleExtensionTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType} instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ManagedBeanExtensionTypeItemProvider managedBeanExtensionTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Adapter createManagedBeanExtensionTypeAdapter() {
-        if (managedBeanExtensionTypeItemProvider == null) {
-            managedBeanExtensionTypeItemProvider = new ManagedBeanExtensionTypeItemProvider(this);
-        }
-
-        return managedBeanExtensionTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType} instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected NavigationRuleExtensionTypeItemProvider navigationRuleExtensionTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Adapter createNavigationRuleExtensionTypeAdapter() {
-        if (navigationRuleExtensionTypeItemProvider == null) {
-            navigationRuleExtensionTypeItemProvider = new NavigationRuleExtensionTypeItemProvider(this);
-        }
-
-        return navigationRuleExtensionTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType} instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ValidatorExtensionTypeItemProvider validatorExtensionTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Adapter createValidatorExtensionTypeAdapter() {
-        if (validatorExtensionTypeItemProvider == null) {
-            validatorExtensionTypeItemProvider = new ValidatorExtensionTypeItemProvider(this);
-        }
-
-        return validatorExtensionTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected FacesConfigTypeItemProvider facesConfigTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createFacesConfigTypeAdapter() {
-        if (facesConfigTypeItemProvider == null) {
-            facesConfigTypeItemProvider = new FacesConfigTypeItemProvider(this);
-        }
-
-        return facesConfigTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected FacesContextFactoryTypeItemProvider facesContextFactoryTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createFacesContextFactoryTypeAdapter() {
-        if (facesContextFactoryTypeItemProvider == null) {
-            facesContextFactoryTypeItemProvider = new FacesContextFactoryTypeItemProvider(this);
-        }
-
-        return facesContextFactoryTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected FacetExtensionTypeItemProvider facetExtensionTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createFacetExtensionTypeAdapter() {
-        if (facetExtensionTypeItemProvider == null) {
-            facetExtensionTypeItemProvider = new FacetExtensionTypeItemProvider(this);
-        }
-
-        return facetExtensionTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected FacetNameTypeItemProvider facetNameTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createFacetNameTypeAdapter() {
-        if (facetNameTypeItemProvider == null) {
-            facetNameTypeItemProvider = new FacetNameTypeItemProvider(this);
-        }
-
-        return facetNameTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FacetType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected FacetTypeItemProvider facetTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacetType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createFacetTypeAdapter() {
-        if (facetTypeItemProvider == null) {
-            facetTypeItemProvider = new FacetTypeItemProvider(this);
-        }
-
-        return facetTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected FactoryTypeItemProvider factoryTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createFactoryTypeAdapter() {
-        if (factoryTypeItemProvider == null) {
-            factoryTypeItemProvider = new FactoryTypeItemProvider(this);
-        }
-
-        return factoryTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected FromActionTypeItemProvider fromActionTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createFromActionTypeAdapter() {
-        if (fromActionTypeItemProvider == null) {
-            fromActionTypeItemProvider = new FromActionTypeItemProvider(this);
-        }
-
-        return fromActionTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected FromOutcomeTypeItemProvider fromOutcomeTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createFromOutcomeTypeAdapter() {
-        if (fromOutcomeTypeItemProvider == null) {
-            fromOutcomeTypeItemProvider = new FromOutcomeTypeItemProvider(this);
-        }
-
-        return fromOutcomeTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected FromViewIdTypeItemProvider fromViewIdTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createFromViewIdTypeAdapter() {
-        if (fromViewIdTypeItemProvider == null) {
-            fromViewIdTypeItemProvider = new FromViewIdTypeItemProvider(this);
-        }
-
-        return fromViewIdTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.IconType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected IconTypeItemProvider iconTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createIconTypeAdapter() {
-        if (iconTypeItemProvider == null) {
-            iconTypeItemProvider = new IconTypeItemProvider(this);
-        }
-
-        return iconTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected KeyClassTypeItemProvider keyClassTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createKeyClassTypeAdapter() {
-        if (keyClassTypeItemProvider == null) {
-            keyClassTypeItemProvider = new KeyClassTypeItemProvider(this);
-        }
-
-        return keyClassTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.KeyType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected KeyTypeItemProvider keyTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.KeyType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createKeyTypeAdapter() {
-        if (keyTypeItemProvider == null) {
-            keyTypeItemProvider = new KeyTypeItemProvider(this);
-        }
-
-        return keyTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected LargeIconTypeItemProvider largeIconTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createLargeIconTypeAdapter() {
-        if (largeIconTypeItemProvider == null) {
-            largeIconTypeItemProvider = new LargeIconTypeItemProvider(this);
-        }
-
-        return largeIconTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected LifecycleFactoryTypeItemProvider lifecycleFactoryTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createLifecycleFactoryTypeAdapter() {
-        if (lifecycleFactoryTypeItemProvider == null) {
-            lifecycleFactoryTypeItemProvider = new LifecycleFactoryTypeItemProvider(this);
-        }
-
-        return lifecycleFactoryTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected LifecycleTypeItemProvider lifecycleTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createLifecycleTypeAdapter() {
-        if (lifecycleTypeItemProvider == null) {
-            lifecycleTypeItemProvider = new LifecycleTypeItemProvider(this);
-        }
-
-        return lifecycleTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ListEntriesTypeItemProvider listEntriesTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createListEntriesTypeAdapter() {
-        if (listEntriesTypeItemProvider == null) {
-            listEntriesTypeItemProvider = new ListEntriesTypeItemProvider(this);
-        }
-
-        return listEntriesTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected LocaleConfigTypeItemProvider localeConfigTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createLocaleConfigTypeAdapter() {
-        if (localeConfigTypeItemProvider == null) {
-            localeConfigTypeItemProvider = new LocaleConfigTypeItemProvider(this);
-        }
-
-        return localeConfigTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ManagedBeanClassTypeItemProvider managedBeanClassTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createManagedBeanClassTypeAdapter() {
-        if (managedBeanClassTypeItemProvider == null) {
-            managedBeanClassTypeItemProvider = new ManagedBeanClassTypeItemProvider(this);
-        }
-
-        return managedBeanClassTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ManagedBeanNameTypeItemProvider managedBeanNameTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createManagedBeanNameTypeAdapter() {
-        if (managedBeanNameTypeItemProvider == null) {
-            managedBeanNameTypeItemProvider = new ManagedBeanNameTypeItemProvider(this);
-        }
-
-        return managedBeanNameTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ManagedBeanScopeTypeItemProvider managedBeanScopeTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createManagedBeanScopeTypeAdapter() {
-        if (managedBeanScopeTypeItemProvider == null) {
-            managedBeanScopeTypeItemProvider = new ManagedBeanScopeTypeItemProvider(this);
-        }
-
-        return managedBeanScopeTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ManagedBeanTypeItemProvider managedBeanTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createManagedBeanTypeAdapter() {
-        if (managedBeanTypeItemProvider == null) {
-            managedBeanTypeItemProvider = new ManagedBeanTypeItemProvider(this);
-        }
-
-        return managedBeanTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ManagedPropertyTypeItemProvider managedPropertyTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createManagedPropertyTypeAdapter() {
-        if (managedPropertyTypeItemProvider == null) {
-            managedPropertyTypeItemProvider = new ManagedPropertyTypeItemProvider(this);
-        }
-
-        return managedPropertyTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected MapEntriesTypeItemProvider mapEntriesTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createMapEntriesTypeAdapter() {
-        if (mapEntriesTypeItemProvider == null) {
-            mapEntriesTypeItemProvider = new MapEntriesTypeItemProvider(this);
-        }
-
-        return mapEntriesTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected MapEntryTypeItemProvider mapEntryTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createMapEntryTypeAdapter() {
-        if (mapEntryTypeItemProvider == null) {
-            mapEntryTypeItemProvider = new MapEntryTypeItemProvider(this);
-        }
-
-        return mapEntryTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected MessageBundleTypeItemProvider messageBundleTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createMessageBundleTypeAdapter() {
-        if (messageBundleTypeItemProvider == null) {
-            messageBundleTypeItemProvider = new MessageBundleTypeItemProvider(this);
-        }
-
-        return messageBundleTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected NavigationCaseTypeItemProvider navigationCaseTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createNavigationCaseTypeAdapter() {
-        if (navigationCaseTypeItemProvider == null) {
-            navigationCaseTypeItemProvider = new NavigationCaseTypeItemProvider(this);
-        }
-
-        return navigationCaseTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected NavigationHandlerTypeItemProvider navigationHandlerTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createNavigationHandlerTypeAdapter() {
-        if (navigationHandlerTypeItemProvider == null) {
-            navigationHandlerTypeItemProvider = new NavigationHandlerTypeItemProvider(this);
-        }
-
-        return navigationHandlerTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected NavigationRuleTypeItemProvider navigationRuleTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createNavigationRuleTypeAdapter() {
-        if (navigationRuleTypeItemProvider == null) {
-            navigationRuleTypeItemProvider = new NavigationRuleTypeItemProvider(this);
-        }
-
-        return navigationRuleTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected NullValueTypeItemProvider nullValueTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createNullValueTypeAdapter() {
-        if (nullValueTypeItemProvider == null) {
-            nullValueTypeItemProvider = new NullValueTypeItemProvider(this);
-        }
-
-        return nullValueTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected PhaseListenerTypeItemProvider phaseListenerTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createPhaseListenerTypeAdapter() {
-        if (phaseListenerTypeItemProvider == null) {
-            phaseListenerTypeItemProvider = new PhaseListenerTypeItemProvider(this);
-        }
-
-        return phaseListenerTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected PropertyClassTypeItemProvider propertyClassTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createPropertyClassTypeAdapter() {
-        if (propertyClassTypeItemProvider == null) {
-            propertyClassTypeItemProvider = new PropertyClassTypeItemProvider(this);
-        }
-
-        return propertyClassTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected PropertyExtensionTypeItemProvider propertyExtensionTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createPropertyExtensionTypeAdapter() {
-        if (propertyExtensionTypeItemProvider == null) {
-            propertyExtensionTypeItemProvider = new PropertyExtensionTypeItemProvider(this);
-        }
-
-        return propertyExtensionTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected PropertyNameTypeItemProvider propertyNameTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createPropertyNameTypeAdapter() {
-        if (propertyNameTypeItemProvider == null) {
-            propertyNameTypeItemProvider = new PropertyNameTypeItemProvider(this);
-        }
-
-        return propertyNameTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected PropertyResolverTypeItemProvider propertyResolverTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createPropertyResolverTypeAdapter() {
-        if (propertyResolverTypeItemProvider == null) {
-            propertyResolverTypeItemProvider = new PropertyResolverTypeItemProvider(this);
-        }
-
-        return propertyResolverTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected PropertyTypeItemProvider propertyTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createPropertyTypeAdapter() {
-        if (propertyTypeItemProvider == null) {
-            propertyTypeItemProvider = new PropertyTypeItemProvider(this);
-        }
-
-        return propertyTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected RedirectTypeItemProvider redirectTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createRedirectTypeAdapter() {
-        if (redirectTypeItemProvider == null) {
-            redirectTypeItemProvider = new RedirectTypeItemProvider(this);
-        }
-
-        return redirectTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ReferencedBeanClassTypeItemProvider referencedBeanClassTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createReferencedBeanClassTypeAdapter() {
-        if (referencedBeanClassTypeItemProvider == null) {
-            referencedBeanClassTypeItemProvider = new ReferencedBeanClassTypeItemProvider(this);
-        }
-
-        return referencedBeanClassTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ReferencedBeanNameTypeItemProvider referencedBeanNameTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createReferencedBeanNameTypeAdapter() {
-        if (referencedBeanNameTypeItemProvider == null) {
-            referencedBeanNameTypeItemProvider = new ReferencedBeanNameTypeItemProvider(this);
-        }
-
-        return referencedBeanNameTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ReferencedBeanTypeItemProvider referencedBeanTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createReferencedBeanTypeAdapter() {
-        if (referencedBeanTypeItemProvider == null) {
-            referencedBeanTypeItemProvider = new ReferencedBeanTypeItemProvider(this);
-        }
-
-        return referencedBeanTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected RendererClassTypeItemProvider rendererClassTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createRendererClassTypeAdapter() {
-        if (rendererClassTypeItemProvider == null) {
-            rendererClassTypeItemProvider = new RendererClassTypeItemProvider(this);
-        }
-
-        return rendererClassTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected RendererExtensionTypeItemProvider rendererExtensionTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createRendererExtensionTypeAdapter() {
-        if (rendererExtensionTypeItemProvider == null) {
-            rendererExtensionTypeItemProvider = new RendererExtensionTypeItemProvider(this);
-        }
-
-        return rendererExtensionTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RendererType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected RendererTypeItemProvider rendererTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RendererType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createRendererTypeAdapter() {
-        if (rendererTypeItemProvider == null) {
-            rendererTypeItemProvider = new RendererTypeItemProvider(this);
-        }
-
-        return rendererTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected RendererTypeTypeItemProvider rendererTypeTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createRendererTypeTypeAdapter() {
-        if (rendererTypeTypeItemProvider == null) {
-            rendererTypeTypeItemProvider = new RendererTypeTypeItemProvider(this);
-        }
-
-        return rendererTypeTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected RenderKitClassTypeItemProvider renderKitClassTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createRenderKitClassTypeAdapter() {
-        if (renderKitClassTypeItemProvider == null) {
-            renderKitClassTypeItemProvider = new RenderKitClassTypeItemProvider(this);
-        }
-
-        return renderKitClassTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected RenderKitFactoryTypeItemProvider renderKitFactoryTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createRenderKitFactoryTypeAdapter() {
-        if (renderKitFactoryTypeItemProvider == null) {
-            renderKitFactoryTypeItemProvider = new RenderKitFactoryTypeItemProvider(this);
-        }
-
-        return renderKitFactoryTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected RenderKitIdTypeItemProvider renderKitIdTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createRenderKitIdTypeAdapter() {
-        if (renderKitIdTypeItemProvider == null) {
-            renderKitIdTypeItemProvider = new RenderKitIdTypeItemProvider(this);
-        }
-
-        return renderKitIdTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected RenderKitTypeItemProvider renderKitTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createRenderKitTypeAdapter() {
-        if (renderKitTypeItemProvider == null) {
-            renderKitTypeItemProvider = new RenderKitTypeItemProvider(this);
-        }
-
-        return renderKitTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected SmallIconTypeItemProvider smallIconTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createSmallIconTypeAdapter() {
-        if (smallIconTypeItemProvider == null) {
-            smallIconTypeItemProvider = new SmallIconTypeItemProvider(this);
-        }
-
-        return smallIconTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected StateManagerTypeItemProvider stateManagerTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createStateManagerTypeAdapter() {
-        if (stateManagerTypeItemProvider == null) {
-            stateManagerTypeItemProvider = new StateManagerTypeItemProvider(this);
-        }
-
-        return stateManagerTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected SuggestedValueTypeItemProvider suggestedValueTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createSuggestedValueTypeAdapter() {
-        if (suggestedValueTypeItemProvider == null) {
-            suggestedValueTypeItemProvider = new SuggestedValueTypeItemProvider(this);
-        }
-
-        return suggestedValueTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected SupportedLocaleTypeItemProvider supportedLocaleTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createSupportedLocaleTypeAdapter() {
-        if (supportedLocaleTypeItemProvider == null) {
-            supportedLocaleTypeItemProvider = new SupportedLocaleTypeItemProvider(this);
-        }
-
-        return supportedLocaleTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ToViewIdTypeItemProvider toViewIdTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createToViewIdTypeAdapter() {
-        if (toViewIdTypeItemProvider == null) {
-            toViewIdTypeItemProvider = new ToViewIdTypeItemProvider(this);
-        }
-
-        return toViewIdTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ValidatorClassTypeItemProvider validatorClassTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createValidatorClassTypeAdapter() {
-        if (validatorClassTypeItemProvider == null) {
-            validatorClassTypeItemProvider = new ValidatorClassTypeItemProvider(this);
-        }
-
-        return validatorClassTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ValidatorIdTypeItemProvider validatorIdTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createValidatorIdTypeAdapter() {
-        if (validatorIdTypeItemProvider == null) {
-            validatorIdTypeItemProvider = new ValidatorIdTypeItemProvider(this);
-        }
-
-        return validatorIdTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ValidatorTypeItemProvider validatorTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createValidatorTypeAdapter() {
-        if (validatorTypeItemProvider == null) {
-            validatorTypeItemProvider = new ValidatorTypeItemProvider(this);
-        }
-
-        return validatorTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ValueClassTypeItemProvider valueClassTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createValueClassTypeAdapter() {
-        if (valueClassTypeItemProvider == null) {
-            valueClassTypeItemProvider = new ValueClassTypeItemProvider(this);
-        }
-
-        return valueClassTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ValueType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ValueTypeItemProvider valueTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValueType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createValueTypeAdapter() {
-        if (valueTypeItemProvider == null) {
-            valueTypeItemProvider = new ValueTypeItemProvider(this);
-        }
-
-        return valueTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected VariableResolverTypeItemProvider variableResolverTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createVariableResolverTypeAdapter() {
-        if (variableResolverTypeItemProvider == null) {
-            variableResolverTypeItemProvider = new VariableResolverTypeItemProvider(this);
-        }
-
-        return variableResolverTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType} instances.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ViewHandlerTypeItemProvider viewHandlerTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter createViewHandlerTypeAdapter() {
-        if (viewHandlerTypeItemProvider == null) {
-            viewHandlerTypeItemProvider = new ViewHandlerTypeItemProvider(this);
-        }
-
-        return viewHandlerTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType} instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ApplicationExtensionTypeItemProvider applicationExtensionTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Adapter createApplicationExtensionTypeAdapter() {
-        if (applicationExtensionTypeItemProvider == null) {
-            applicationExtensionTypeItemProvider = new ApplicationExtensionTypeItemProvider(this);
-        }
-
-        return applicationExtensionTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType} instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ConverterExtensionTypeItemProvider converterExtensionTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Adapter createConverterExtensionTypeAdapter() {
-        if (converterExtensionTypeItemProvider == null) {
-            converterExtensionTypeItemProvider = new ConverterExtensionTypeItemProvider(this);
-        }
-
-        return converterExtensionTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType} instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ResourceBundleTypeItemProvider resourceBundleTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Adapter createResourceBundleTypeAdapter() {
-        if (resourceBundleTypeItemProvider == null) {
-            resourceBundleTypeItemProvider = new ResourceBundleTypeItemProvider(this);
-        }
-
-        return resourceBundleTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType} instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected BaseNameTypeItemProvider baseNameTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Adapter createBaseNameTypeAdapter() {
-        if (baseNameTypeItemProvider == null) {
-            baseNameTypeItemProvider = new BaseNameTypeItemProvider(this);
-        }
-
-        return baseNameTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.VarType} instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected VarTypeItemProvider varTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.VarType}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Adapter createVarTypeAdapter() {
-        if (varTypeItemProvider == null) {
-            varTypeItemProvider = new VarTypeItemProvider(this);
-        }
-
-        return varTypeItemProvider;
-    }
-
-    /**
-     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType} instances.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected RenderKitExtensionTypeItemProvider renderKitExtensionTypeItemProvider;
-
-    /**
-     * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Adapter createRenderKitExtensionTypeAdapter() {
-        if (renderKitExtensionTypeItemProvider == null) {
-            renderKitExtensionTypeItemProvider = new RenderKitExtensionTypeItemProvider(this);
-        }
-
-        return renderKitExtensionTypeItemProvider;
-    }
-
-    /**
-     * This returns the root adapter factory that contains this factory.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ComposeableAdapterFactory getRootAdapterFactory() {
-        return parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();
-    }
-
-    /**
-     * This sets the composed adapter factory that contains this factory.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory) {
-        this.parentAdapterFactory = parentAdapterFactory;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public boolean isFactoryForType(Object type) {
-        return supportedTypes.contains(type) || super.isFactoryForType(type);
-    }
-
-    /**
-     * This implementation substitutes the factory itself as the key for the adapter.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Adapter adapt(Notifier notifier, Object type) {
-        return super.adapt(notifier, this);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object adapt(Object object, Object type) {
-        if (isFactoryForType(type)) {
-            Object adapter = super.adapt(object, type);
-            if (!(type instanceof Class) || (((Class)type).isInstance(adapter))) {
-                return adapter;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * This adds a listener.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void addListener(INotifyChangedListener notifyChangedListener) {
-        changeNotifier.addListener(notifyChangedListener);
-    }
-
-    /**
-     * This removes a listener.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void removeListener(INotifyChangedListener notifyChangedListener) {
-        changeNotifier.removeListener(notifyChangedListener);
-    }
-
-    /**
-     * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void fireNotifyChanged(Notification notification) {
-        changeNotifier.fireNotifyChanged(notification);
-
-        if (parentAdapterFactory != null) {
-            parentAdapterFactory.fireNotifyChanged(notification);
-        }
-    }
-
-    /**
-     * This disposes all of the item providers created by this factory. 
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void dispose() {
-        if (actionListenerTypeItemProvider != null) actionListenerTypeItemProvider.dispose();
-        if (applicationFactoryTypeItemProvider != null) applicationFactoryTypeItemProvider.dispose();
-        if (applicationTypeItemProvider != null) applicationTypeItemProvider.dispose();
-        if (attributeClassTypeItemProvider != null) attributeClassTypeItemProvider.dispose();
-        if (attributeExtensionTypeItemProvider != null) attributeExtensionTypeItemProvider.dispose();
-        if (attributeNameTypeItemProvider != null) attributeNameTypeItemProvider.dispose();
-        if (attributeTypeItemProvider != null) attributeTypeItemProvider.dispose();
-        if (componentClassTypeItemProvider != null) componentClassTypeItemProvider.dispose();
-        if (componentExtensionTypeItemProvider != null) componentExtensionTypeItemProvider.dispose();
-        if (componentFamilyTypeItemProvider != null) componentFamilyTypeItemProvider.dispose();
-        if (componentTypeItemProvider != null) componentTypeItemProvider.dispose();
-        if (componentTypeTypeItemProvider != null) componentTypeTypeItemProvider.dispose();
-        if (converterClassTypeItemProvider != null) converterClassTypeItemProvider.dispose();
-        if (converterForClassTypeItemProvider != null) converterForClassTypeItemProvider.dispose();
-        if (converterIdTypeItemProvider != null) converterIdTypeItemProvider.dispose();
-        if (converterTypeItemProvider != null) converterTypeItemProvider.dispose();
-        if (defaultLocaleTypeItemProvider != null) defaultLocaleTypeItemProvider.dispose();
-        if (defaultRenderKitIdTypeItemProvider != null) defaultRenderKitIdTypeItemProvider.dispose();
-        if (defaultValueTypeItemProvider != null) defaultValueTypeItemProvider.dispose();
-        if (descriptionTypeItemProvider != null) descriptionTypeItemProvider.dispose();
-        if (displayNameTypeItemProvider != null) displayNameTypeItemProvider.dispose();
-        if (documentRootItemProvider != null) documentRootItemProvider.dispose();
-        if (dynamicAttributeItemProvider != null) dynamicAttributeItemProvider.dispose();
-        if (dynamicElementItemProvider != null) dynamicElementItemProvider.dispose();
-        if (facesConfigTypeItemProvider != null) facesConfigTypeItemProvider.dispose();
-        if (facesContextFactoryTypeItemProvider != null) facesContextFactoryTypeItemProvider.dispose();
-        if (facetExtensionTypeItemProvider != null) facetExtensionTypeItemProvider.dispose();
-        if (facetNameTypeItemProvider != null) facetNameTypeItemProvider.dispose();
-        if (facetTypeItemProvider != null) facetTypeItemProvider.dispose();
-        if (factoryTypeItemProvider != null) factoryTypeItemProvider.dispose();
-        if (fromActionTypeItemProvider != null) fromActionTypeItemProvider.dispose();
-        if (fromOutcomeTypeItemProvider != null) fromOutcomeTypeItemProvider.dispose();
-        if (fromViewIdTypeItemProvider != null) fromViewIdTypeItemProvider.dispose();
-        if (iconTypeItemProvider != null) iconTypeItemProvider.dispose();
-        if (keyClassTypeItemProvider != null) keyClassTypeItemProvider.dispose();
-        if (keyTypeItemProvider != null) keyTypeItemProvider.dispose();
-        if (largeIconTypeItemProvider != null) largeIconTypeItemProvider.dispose();
-        if (lifecycleFactoryTypeItemProvider != null) lifecycleFactoryTypeItemProvider.dispose();
-        if (lifecycleTypeItemProvider != null) lifecycleTypeItemProvider.dispose();
-        if (listEntriesTypeItemProvider != null) listEntriesTypeItemProvider.dispose();
-        if (localeConfigTypeItemProvider != null) localeConfigTypeItemProvider.dispose();
-        if (managedBeanClassTypeItemProvider != null) managedBeanClassTypeItemProvider.dispose();
-        if (managedBeanNameTypeItemProvider != null) managedBeanNameTypeItemProvider.dispose();
-        if (managedBeanScopeTypeItemProvider != null) managedBeanScopeTypeItemProvider.dispose();
-        if (managedBeanTypeItemProvider != null) managedBeanTypeItemProvider.dispose();
-        if (managedPropertyTypeItemProvider != null) managedPropertyTypeItemProvider.dispose();
-        if (mapEntriesTypeItemProvider != null) mapEntriesTypeItemProvider.dispose();
-        if (mapEntryTypeItemProvider != null) mapEntryTypeItemProvider.dispose();
-        if (messageBundleTypeItemProvider != null) messageBundleTypeItemProvider.dispose();
-        if (navigationCaseTypeItemProvider != null) navigationCaseTypeItemProvider.dispose();
-        if (navigationHandlerTypeItemProvider != null) navigationHandlerTypeItemProvider.dispose();
-        if (navigationRuleTypeItemProvider != null) navigationRuleTypeItemProvider.dispose();
-        if (nullValueTypeItemProvider != null) nullValueTypeItemProvider.dispose();
-        if (phaseListenerTypeItemProvider != null) phaseListenerTypeItemProvider.dispose();
-        if (propertyClassTypeItemProvider != null) propertyClassTypeItemProvider.dispose();
-        if (propertyExtensionTypeItemProvider != null) propertyExtensionTypeItemProvider.dispose();
-        if (propertyNameTypeItemProvider != null) propertyNameTypeItemProvider.dispose();
-        if (propertyResolverTypeItemProvider != null) propertyResolverTypeItemProvider.dispose();
-        if (propertyTypeItemProvider != null) propertyTypeItemProvider.dispose();
-        if (redirectTypeItemProvider != null) redirectTypeItemProvider.dispose();
-        if (referencedBeanClassTypeItemProvider != null) referencedBeanClassTypeItemProvider.dispose();
-        if (referencedBeanNameTypeItemProvider != null) referencedBeanNameTypeItemProvider.dispose();
-        if (referencedBeanTypeItemProvider != null) referencedBeanTypeItemProvider.dispose();
-        if (rendererClassTypeItemProvider != null) rendererClassTypeItemProvider.dispose();
-        if (rendererExtensionTypeItemProvider != null) rendererExtensionTypeItemProvider.dispose();
-        if (rendererTypeItemProvider != null) rendererTypeItemProvider.dispose();
-        if (rendererTypeTypeItemProvider != null) rendererTypeTypeItemProvider.dispose();
-        if (renderKitClassTypeItemProvider != null) renderKitClassTypeItemProvider.dispose();
-        if (renderKitFactoryTypeItemProvider != null) renderKitFactoryTypeItemProvider.dispose();
-        if (renderKitIdTypeItemProvider != null) renderKitIdTypeItemProvider.dispose();
-        if (renderKitTypeItemProvider != null) renderKitTypeItemProvider.dispose();
-        if (smallIconTypeItemProvider != null) smallIconTypeItemProvider.dispose();
-        if (stateManagerTypeItemProvider != null) stateManagerTypeItemProvider.dispose();
-        if (suggestedValueTypeItemProvider != null) suggestedValueTypeItemProvider.dispose();
-        if (supportedLocaleTypeItemProvider != null) supportedLocaleTypeItemProvider.dispose();
-        if (toViewIdTypeItemProvider != null) toViewIdTypeItemProvider.dispose();
-        if (validatorClassTypeItemProvider != null) validatorClassTypeItemProvider.dispose();
-        if (validatorIdTypeItemProvider != null) validatorIdTypeItemProvider.dispose();
-        if (validatorTypeItemProvider != null) validatorTypeItemProvider.dispose();
-        if (valueClassTypeItemProvider != null) valueClassTypeItemProvider.dispose();
-        if (valueTypeItemProvider != null) valueTypeItemProvider.dispose();
-        if (variableResolverTypeItemProvider != null) variableResolverTypeItemProvider.dispose();
-        if (viewHandlerTypeItemProvider != null) viewHandlerTypeItemProvider.dispose();
-        if (applicationExtensionTypeItemProvider != null) applicationExtensionTypeItemProvider.dispose();
-        if (converterExtensionTypeItemProvider != null) converterExtensionTypeItemProvider.dispose();
-        if (elResolverTypeItemProvider != null) elResolverTypeItemProvider.dispose();
-        if (facesConfigExtensionTypeItemProvider != null) facesConfigExtensionTypeItemProvider.dispose();
-        if (factoryExtensionTypeItemProvider != null) factoryExtensionTypeItemProvider.dispose();
-        if (lifecycleExtensionTypeItemProvider != null) lifecycleExtensionTypeItemProvider.dispose();
-        if (managedBeanExtensionTypeItemProvider != null) managedBeanExtensionTypeItemProvider.dispose();
-        if (navigationRuleExtensionTypeItemProvider != null) navigationRuleExtensionTypeItemProvider.dispose();
-        if (validatorExtensionTypeItemProvider != null) validatorExtensionTypeItemProvider.dispose();
-        if (resourceBundleTypeItemProvider != null) resourceBundleTypeItemProvider.dispose();
-        if (baseNameTypeItemProvider != null) baseNameTypeItemProvider.dispose();
-        if (varTypeItemProvider != null) varTypeItemProvider.dispose();
-        if (renderKitExtensionTypeItemProvider != null) renderKitExtensionTypeItemProvider.dispose();
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigTypeItemProvider.java
deleted file mode 100644
index 70a07d3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigTypeItemProvider.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class FacesConfigTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public FacesConfigTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addFacesConfigExtensionPropertyDescriptor(object);
-            addXmlnsPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Faces Config Extension feature.
-     * <!-- begin-user-doc -->
-     * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_FacesConfigType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_FacesConfigType_id_feature", "_UI_FacesConfigType_type"),
-                 FacesConfigPackage.Literals.FACES_CONFIG_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__APPLICATION);
-            childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__FACTORY);
-            childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__COMPONENT);
-            childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__CONVERTER);
-            childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__MANAGED_BEAN);
-            childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__NAVIGATION_RULE);
-            childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__REFERENCED_BEAN);
-            childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__RENDER_KIT);
-            childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__LIFECYCLE);
-            childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__VALIDATOR);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-        // Check the type of the specified child object and return the proper feature to use for
-        // adding (see {@link AddCommand}) it as a child.
-
-        return super.getChildFeature(object, child);
-    }
-
-    /**
-     * This returns FacesConfigType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/FacesConfigType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((FacesConfigType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_FacesConfigType_type") :
-            getString("_UI_FacesConfigType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(FacesConfigType.class)) {
-            case FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS:
-            case FacesConfigPackage.FACES_CONFIG_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__APPLICATION:
-            case FacesConfigPackage.FACES_CONFIG_TYPE__FACTORY:
-            case FacesConfigPackage.FACES_CONFIG_TYPE__COMPONENT:
-            case FacesConfigPackage.FACES_CONFIG_TYPE__CONVERTER:
-            case FacesConfigPackage.FACES_CONFIG_TYPE__MANAGED_BEAN:
-            case FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE:
-            case FacesConfigPackage.FACES_CONFIG_TYPE__REFERENCED_BEAN:
-            case FacesConfigPackage.FACES_CONFIG_TYPE__RENDER_KIT:
-            case FacesConfigPackage.FACES_CONFIG_TYPE__LIFECYCLE:
-            case FacesConfigPackage.FACES_CONFIG_TYPE__VALIDATOR:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.FACES_CONFIG_TYPE__APPLICATION,
-                 FacesConfigFactory.eINSTANCE.createApplicationType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.FACES_CONFIG_TYPE__FACTORY,
-                 FacesConfigFactory.eINSTANCE.createFactoryType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.FACES_CONFIG_TYPE__COMPONENT,
-                 FacesConfigFactory.eINSTANCE.createComponentType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.FACES_CONFIG_TYPE__CONVERTER,
-                 FacesConfigFactory.eINSTANCE.createConverterType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.FACES_CONFIG_TYPE__MANAGED_BEAN,
-                 FacesConfigFactory.eINSTANCE.createManagedBeanType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.FACES_CONFIG_TYPE__NAVIGATION_RULE,
-                 FacesConfigFactory.eINSTANCE.createNavigationRuleType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.FACES_CONFIG_TYPE__REFERENCED_BEAN,
-                 FacesConfigFactory.eINSTANCE.createReferencedBeanType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.FACES_CONFIG_TYPE__RENDER_KIT,
-                 FacesConfigFactory.eINSTANCE.createRenderKitType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.FACES_CONFIG_TYPE__LIFECYCLE,
-                 FacesConfigFactory.eINSTANCE.createLifecycleType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.FACES_CONFIG_TYPE__VALIDATOR,
-                 FacesConfigFactory.eINSTANCE.createValidatorType()));
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesContextFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesContextFactoryTypeItemProvider.java
deleted file mode 100644
index 713373b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesContextFactoryTypeItemProvider.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.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.FacesContextFactoryType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType} object.
- * <!-- begin-user-doc --> <!-- end-user-doc -->
- * @generated
- */
-public class FacesContextFactoryTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-	/**
-	 * This constructs an instance from a factory and a notifier. <!--
-	 * begin-user-doc --> <!-- 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 --> <!-- 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
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_FacesContextFactoryType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_FacesContextFactoryType_id_feature", "_UI_FacesContextFactoryType_type"),
-                 FacesConfigPackage.Literals.FACES_CONTEXT_FACTORY_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns FacesContextFactoryType.gif.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/FacesContextFactoryType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((FacesContextFactoryType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_FacesContextFactoryType_type") :
-            getString("_UI_FacesContextFactoryType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(FacesContextFactoryType.class)) {
-            case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_FacesContextFactoryType_type");
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetExtensionTypeItemProvider.java
deleted file mode 100644
index cbb42ff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class FacetExtensionTypeItemProvider
-	extends ExtensionTypeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public FacetExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This returns FacetExtensionType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/FacetExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((FacetExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_FacetExtensionType_type") :
-            getString("_UI_FacetExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/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 fb94b32..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetNameTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetNameType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class FacetNameTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_FacetNameType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_FacetNameType_id_feature", "_UI_FacetNameType_type"),
-                 FacesConfigPackage.Literals.FACET_NAME_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns FacetNameType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/FacetNameType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((FacetNameType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_FacetNameType_type") :
-            getString("_UI_FacetNameType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(FacetNameType.class)) {
-            case FacesConfigPackage.FACET_NAME_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.FACET_NAME_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetTypeItemProvider.java
deleted file mode 100644
index 068d04b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetTypeItemProvider.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import 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 -->
- * <!-- end-user-doc -->
- * 
- */
-public class FacetTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource,
-		ITableItemLabelProvider{
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_FacetType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_FacetType_id_feature", "_UI_FacetType_type"),
-                 FacesConfigPackage.Literals.FACET_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.FACET_TYPE__DESCRIPTION);
-            childrenFeatures.add(FacesConfigPackage.Literals.FACET_TYPE__DISPLAY_NAME);
-            childrenFeatures.add(FacesConfigPackage.Literals.FACET_TYPE__ICON);
-            childrenFeatures.add(FacesConfigPackage.Literals.FACET_TYPE__FACET_NAME);
-            childrenFeatures.add(FacesConfigPackage.Literals.FACET_TYPE__FACET_EXTENSION);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-        // Check the type of the specified child object and return the proper feature to use for
-        // adding (see {@link AddCommand}) it as a child.
-
-        return super.getChildFeature(object, child);
-    }
-
-    /**
-     * This returns FacetType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/FacetType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((FacetType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_FacetType_type") :
-            getString("_UI_FacetType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(FacetType.class)) {
-            case FacesConfigPackage.FACET_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.FACET_TYPE__DESCRIPTION:
-            case FacesConfigPackage.FACET_TYPE__DISPLAY_NAME:
-            case FacesConfigPackage.FACET_TYPE__ICON:
-            case FacesConfigPackage.FACET_TYPE__FACET_NAME:
-            case FacesConfigPackage.FACET_TYPE__FACET_EXTENSION:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.FACET_TYPE__DESCRIPTION,
-                 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.FACET_TYPE__DISPLAY_NAME,
-                 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.FACET_TYPE__ICON,
-                 FacesConfigFactory.eINSTANCE.createIconType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.FACET_TYPE__FACET_NAME,
-                 FacesConfigFactory.eINSTANCE.createFacetNameType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.FACET_TYPE__FACET_EXTENSION,
-                 FacesConfigFactory.eINSTANCE.createFacetExtensionType()));
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	public String getColumnText(Object object, int columnIndex) {
-		FacetType facet = (FacetType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return facet.getFacetName() == null ? "" : facet.getFacetName()
-					.getTextContent();
-		case 1:
-			return facet.getDisplayName().size() > 0 ? ((DisplayNameType) facet
-					.getDisplayName().get(0)).getTextContent() : "";
-		case 2:
-			return facet.getDescription().size() > 0 ? ((DescriptionType) facet
-					.getDescription().get(0)).getTextContent() : "";
-		}
-		return null;
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		// 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/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 17c95fe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FactoryExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class FactoryExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FactoryExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This returns FactoryExtensionType.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/FactoryExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((FactoryExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_FactoryExtensionType_type") :
-            getString("_UI_FactoryExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FactoryTypeItemProvider.java
deleted file mode 100644
index 58c2235..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FactoryTypeItemProvider.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.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class FactoryTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-     * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_FactoryType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_FactoryType_id_feature", "_UI_FactoryType_type"),
-                 FacesConfigPackage.Literals.FACTORY_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__APPLICATION_FACTORY);
-            childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__FACES_CONTEXT_FACTORY);
-            childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__LIFECYCLE_FACTORY);
-            childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__RENDER_KIT_FACTORY);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-        // Check the type of the specified child object and return the proper feature to use for
-        // adding (see {@link AddCommand}) it as a child.
-
-        return super.getChildFeature(object, child);
-    }
-
-    /**
-     * This returns FactoryType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/FactoryType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((FactoryType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_FactoryType_type") :
-            getString("_UI_FactoryType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(FactoryType.class)) {
-            case FacesConfigPackage.FACTORY_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.FACTORY_TYPE__APPLICATION_FACTORY:
-            case FacesConfigPackage.FACTORY_TYPE__FACES_CONTEXT_FACTORY:
-            case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-            case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.FACTORY_TYPE__APPLICATION_FACTORY,
-                 FacesConfigFactory.eINSTANCE.createApplicationFactoryType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.FACTORY_TYPE__FACES_CONTEXT_FACTORY,
-                 FacesConfigFactory.eINSTANCE.createFacesContextFactoryType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.FACTORY_TYPE__LIFECYCLE_FACTORY,
-                 FacesConfigFactory.eINSTANCE.createLifecycleFactoryType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.FACTORY_TYPE__RENDER_KIT_FACTORY,
-                 FacesConfigFactory.eINSTANCE.createRenderKitFactoryType()));
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromActionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromActionTypeItemProvider.java
deleted file mode 100644
index bd2f9e3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromActionTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromActionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class FromActionTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_FromActionType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_FromActionType_id_feature", "_UI_FromActionType_type"),
-                 FacesConfigPackage.Literals.FROM_ACTION_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns FromActionType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/FromActionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((FromActionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_FromActionType_type") :
-            getString("_UI_FromActionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(FromActionType.class)) {
-            case FacesConfigPackage.FROM_ACTION_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.FROM_ACTION_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromOutcomeTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromOutcomeTypeItemProvider.java
deleted file mode 100644
index b91c2c6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromOutcomeTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class FromOutcomeTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_FromOutcomeType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_FromOutcomeType_id_feature", "_UI_FromOutcomeType_type"),
-                 FacesConfigPackage.Literals.FROM_OUTCOME_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns FromOutcomeType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/FromOutcomeType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((FromOutcomeType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_FromOutcomeType_type") :
-            getString("_UI_FromOutcomeType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(FromOutcomeType.class)) {
-            case FacesConfigPackage.FROM_OUTCOME_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.FROM_OUTCOME_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromViewIdTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromViewIdTypeItemProvider.java
deleted file mode 100644
index ef2b898..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromViewIdTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class FromViewIdTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_FromViewIdType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_FromViewIdType_id_feature", "_UI_FromViewIdType_type"),
-                 FacesConfigPackage.Literals.FROM_VIEW_ID_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns FromViewIdType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/FromViewIdType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((FromViewIdType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_FromViewIdType_type") :
-            getString("_UI_FromViewIdType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(FromViewIdType.class)) {
-            case FacesConfigPackage.FROM_VIEW_ID_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.FROM_VIEW_ID_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/IconTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/IconTypeItemProvider.java
deleted file mode 100644
index 31ba081..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.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.IconType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class IconTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IconTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addSmallIconPropertyDescriptor(object);
-            addLargeIconPropertyDescriptor(object);
-            addLangPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Small Icon feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addSmallIconPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_IconType_smallIcon_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_IconType_smallIcon_feature", "_UI_IconType_type"),
-                 FacesConfigPackage.Literals.ICON_TYPE__SMALL_ICON,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Large Icon feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addLargeIconPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_IconType_largeIcon_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_IconType_largeIcon_feature", "_UI_IconType_type"),
-                 FacesConfigPackage.Literals.ICON_TYPE__LARGE_ICON,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Lang feature.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_IconType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_IconType_id_feature", "_UI_IconType_type"),
-                 FacesConfigPackage.Literals.ICON_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns IconType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/IconType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((IconType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_IconType_type") :
-            getString("_UI_IconType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(IconType.class)) {
-            case FacesConfigPackage.ICON_TYPE__SMALL_ICON:
-            case FacesConfigPackage.ICON_TYPE__LARGE_ICON:
-            case FacesConfigPackage.ICON_TYPE__LANG:
-            case FacesConfigPackage.ICON_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/KeyClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/KeyClassTypeItemProvider.java
deleted file mode 100644
index 2c900d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/KeyClassTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class KeyClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_KeyClassType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_KeyClassType_id_feature", "_UI_KeyClassType_type"),
-                 FacesConfigPackage.Literals.KEY_CLASS_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns KeyClassType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/KeyClassType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((KeyClassType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_KeyClassType_type") :
-            getString("_UI_KeyClassType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(KeyClassType.class)) {
-            case FacesConfigPackage.KEY_CLASS_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.KEY_CLASS_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/KeyTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/KeyTypeItemProvider.java
deleted file mode 100644
index 33d74bf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/KeyTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.KeyType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class KeyTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_KeyType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_KeyType_id_feature", "_UI_KeyType_type"),
-                 FacesConfigPackage.Literals.KEY_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns KeyType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/KeyType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((KeyType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_KeyType_type") :
-            getString("_UI_KeyType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(KeyType.class)) {
-            case FacesConfigPackage.KEY_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.KEY_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LargeIconTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LargeIconTypeItemProvider.java
deleted file mode 100644
index 1984b2d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LargeIconTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LargeIconType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class LargeIconTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_LargeIconType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_LargeIconType_id_feature", "_UI_LargeIconType_type"),
-                 FacesConfigPackage.Literals.LARGE_ICON_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns LargeIconType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/LargeIconType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((LargeIconType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_LargeIconType_type") :
-            getString("_UI_LargeIconType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(LargeIconType.class)) {
-            case FacesConfigPackage.LARGE_ICON_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.LARGE_ICON_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleExtensionTypeItemProvider.java
deleted file mode 100644
index a5a6567..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class LifecycleExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public LifecycleExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This returns LifecycleExtensionType.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/LifecycleExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((LifecycleExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_LifecycleExtensionType_type") :
-            getString("_UI_LifecycleExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleFactoryTypeItemProvider.java
deleted file mode 100644
index e07f8e6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleFactoryTypeItemProvider.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.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 --> <!-- end-user-doc -->
- * 
- * @generated
- */
-public class LifecycleFactoryTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-	/**
-	 * This constructs an instance from a factory and a notifier. <!--
-	 * begin-user-doc --> <!-- 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 --> <!-- 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
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_LifecycleFactoryType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_LifecycleFactoryType_id_feature", "_UI_LifecycleFactoryType_type"),
-                 FacesConfigPackage.Literals.LIFECYCLE_FACTORY_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns LifecycleFactoryType.gif.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/LifecycleFactoryType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((LifecycleFactoryType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_LifecycleFactoryType_type") :
-            getString("_UI_LifecycleFactoryType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(LifecycleFactoryType.class)) {
-            case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-
-		switch (columnIndex) {
-
-			case 0:
-				return getText(object);
-			case 1:
-				return getString("_UI_LifecycleFactoryType_type");
-			}
-
-			return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleTypeItemProvider.java
deleted file mode 100644
index 57982b3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleTypeItemProvider.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.ecore.EStructuralFeature;
-
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class LifecycleTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_LifecycleType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_LifecycleType_id_feature", "_UI_LifecycleType_type"),
-                 FacesConfigPackage.Literals.LIFECYCLE_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.LIFECYCLE_TYPE__PHASE_LISTENER);
-            childrenFeatures.add(FacesConfigPackage.Literals.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EStructuralFeature getChildFeature(Object object, Object child) {
-        // Check the type of the specified child object and return the proper feature to use for
-        // adding (see {@link AddCommand}) it as a child.
-
-        return super.getChildFeature(object, child);
-    }
-
-    /**
-     * This returns LifecycleType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/LifecycleType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((LifecycleType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_LifecycleType_type") :
-            getString("_UI_LifecycleType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(LifecycleType.class)) {
-            case FacesConfigPackage.LIFECYCLE_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.LIFECYCLE_TYPE__PHASE_LISTENER:
-            case FacesConfigPackage.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.LIFECYCLE_TYPE__PHASE_LISTENER,
-                 FacesConfigFactory.eINSTANCE.createPhaseListenerType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION,
-                 FacesConfigFactory.eINSTANCE.createLifecycleExtensionType()));
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ListEntriesTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ListEntriesTypeItemProvider.java
deleted file mode 100644
index c24de79..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ListEntriesTypeItemProvider.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ListEntriesTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ListEntriesTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addValueClassPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Value Class feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addValueClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ListEntriesType_valueClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ListEntriesType_valueClass_feature", "_UI_ListEntriesType_type"),
-                 FacesConfigPackage.Literals.LIST_ENTRIES_TYPE__VALUE_CLASS,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ListEntriesType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ListEntriesType_id_feature", "_UI_ListEntriesType_type"),
-                 FacesConfigPackage.Literals.LIST_ENTRIES_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.LIST_ENTRIES_TYPE__NULL_VALUE);
-            childrenFeatures.add(FacesConfigPackage.Literals.LIST_ENTRIES_TYPE__VALUE);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-        // Check the type of the specified child object and return the proper feature to use for
-        // adding (see {@link AddCommand}) it as a child.
-
-        return super.getChildFeature(object, child);
-    }
-
-    /**
-     * This returns ListEntriesType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ListEntriesType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ListEntriesType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ListEntriesType_type") :
-            getString("_UI_ListEntriesType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ListEntriesType.class)) {
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS:
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__NULL_VALUE:
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.LIST_ENTRIES_TYPE__NULL_VALUE,
-                 FacesConfigFactory.eINSTANCE.createNullValueType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.LIST_ENTRIES_TYPE__VALUE,
-                 FacesConfigFactory.eINSTANCE.createValueType()));
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/Literals.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/Literals.java
deleted file mode 100644
index 678a586..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/Literals.java
+++ /dev/null
@@ -1,3595 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * Literal package types
- * 
- * @author cbateman
- *
- */
-public interface Literals {
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl <em>Action Listener Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getActionListenerType()
-	 * @generated
-	 */
-	EClass ACTION_LISTENER_TYPE = FacesConfigPackage.eINSTANCE.getActionListenerType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ACTION_LISTENER_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getActionListenerType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ACTION_LISTENER_TYPE__ID = FacesConfigPackage.eINSTANCE.getActionListenerType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl <em>Application Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationFactoryType()
-	 * @generated
-	 */
-	EClass APPLICATION_FACTORY_TYPE = FacesConfigPackage.eINSTANCE.getApplicationFactoryType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute APPLICATION_FACTORY_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getApplicationFactoryType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute APPLICATION_FACTORY_TYPE__ID = FacesConfigPackage.eINSTANCE.getApplicationFactoryType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl <em>Application Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationType()
-	 * @generated
-	 */
-	EClass APPLICATION_TYPE = FacesConfigPackage.eINSTANCE.getApplicationType();
-
-	/**
-	 * The meta object literal for the '<em><b>Action Listener</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__ACTION_LISTENER = FacesConfigPackage.eINSTANCE.getApplicationType_ActionListener();
-
-	/**
-	 * The meta object literal for the '<em><b>Default Render Kit Id</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID = FacesConfigPackage.eINSTANCE.getApplicationType_DefaultRenderKitId();
-
-	/**
-	 * The meta object literal for the '<em><b>Message Bundle</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__MESSAGE_BUNDLE = FacesConfigPackage.eINSTANCE.getApplicationType_MessageBundle();
-
-	/**
-	 * The meta object literal for the '<em><b>Navigation Handler</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__NAVIGATION_HANDLER = FacesConfigPackage.eINSTANCE.getApplicationType_NavigationHandler();
-
-	/**
-	 * The meta object literal for the '<em><b>View Handler</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__VIEW_HANDLER = FacesConfigPackage.eINSTANCE.getApplicationType_ViewHandler();
-
-	/**
-	 * The meta object literal for the '<em><b>State Manager</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__STATE_MANAGER = FacesConfigPackage.eINSTANCE.getApplicationType_StateManager();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Resolver</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__PROPERTY_RESOLVER = FacesConfigPackage.eINSTANCE.getApplicationType_PropertyResolver();
-
-	/**
-	 * The meta object literal for the '<em><b>Variable Resolver</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__VARIABLE_RESOLVER = FacesConfigPackage.eINSTANCE.getApplicationType_VariableResolver();
-
-	/**
-	 * The meta object literal for the '<em><b>Locale Config</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__LOCALE_CONFIG = FacesConfigPackage.eINSTANCE.getApplicationType_LocaleConfig();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute APPLICATION_TYPE__ID = FacesConfigPackage.eINSTANCE.getApplicationType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl <em>Attribute Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeClassType()
-	 * @generated
-	 */
-	EClass ATTRIBUTE_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getAttributeClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getAttributeClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ATTRIBUTE_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getAttributeClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeExtensionTypeImpl <em>Attribute Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeExtensionType()
-	 * @generated
-	 */
-	EClass ATTRIBUTE_EXTENSION_TYPE = FacesConfigPackage.eINSTANCE.getAttributeExtensionType();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl <em>Attribute Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeNameType()
-	 * @generated
-	 */
-	EClass ATTRIBUTE_NAME_TYPE = FacesConfigPackage.eINSTANCE.getAttributeNameType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ATTRIBUTE_NAME_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getAttributeNameType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ATTRIBUTE_NAME_TYPE__ID = FacesConfigPackage.eINSTANCE.getAttributeNameType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl <em>Attribute Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeType()
-	 * @generated
-	 */
-	EClass ATTRIBUTE_TYPE = FacesConfigPackage.eINSTANCE.getAttributeType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getAttributeType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getAttributeType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__ICON = FacesConfigPackage.eINSTANCE.getAttributeType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__ATTRIBUTE_NAME = FacesConfigPackage.eINSTANCE.getAttributeType_AttributeName();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__ATTRIBUTE_CLASS = FacesConfigPackage.eINSTANCE.getAttributeType_AttributeClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Default Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__DEFAULT_VALUE = FacesConfigPackage.eINSTANCE.getAttributeType_DefaultValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Suggested Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__SUGGESTED_VALUE = FacesConfigPackage.eINSTANCE.getAttributeType_SuggestedValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute Extension</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION = FacesConfigPackage.eINSTANCE.getAttributeType_AttributeExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ATTRIBUTE_TYPE__ID = FacesConfigPackage.eINSTANCE.getAttributeType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl <em>Component Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentClassType()
-	 * @generated
-	 */
-	EClass COMPONENT_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getComponentClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute COMPONENT_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getComponentClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute COMPONENT_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getComponentClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentExtensionTypeImpl <em>Component Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentExtensionType()
-	 * @generated
-	 */
-	EClass COMPONENT_EXTENSION_TYPE = FacesConfigPackage.eINSTANCE.getComponentExtensionType();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl <em>Component Family Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentFamilyType()
-	 * @generated
-	 */
-	EClass COMPONENT_FAMILY_TYPE = FacesConfigPackage.eINSTANCE.getComponentFamilyType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute COMPONENT_FAMILY_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getComponentFamilyType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute COMPONENT_FAMILY_TYPE__ID = FacesConfigPackage.eINSTANCE.getComponentFamilyType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl <em>Component Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentType()
-	 * @generated
-	 */
-	EClass COMPONENT_TYPE = FacesConfigPackage.eINSTANCE.getComponentType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getComponentType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getComponentType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__ICON = FacesConfigPackage.eINSTANCE.getComponentType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Type</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__COMPONENT_TYPE = FacesConfigPackage.eINSTANCE.getComponentType_ComponentType();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__COMPONENT_CLASS = FacesConfigPackage.eINSTANCE.getComponentType_ComponentClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Facet</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__FACET = FacesConfigPackage.eINSTANCE.getComponentType_Facet();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__ATTRIBUTE = FacesConfigPackage.eINSTANCE.getComponentType_Attribute();
-
-	/**
-	 * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__PROPERTY = FacesConfigPackage.eINSTANCE.getComponentType_Property();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Extension</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__COMPONENT_EXTENSION = FacesConfigPackage.eINSTANCE.getComponentType_ComponentExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute COMPONENT_TYPE__ID = FacesConfigPackage.eINSTANCE.getComponentType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl <em>Component Type Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentTypeType()
-	 * @generated
-	 */
-	EClass COMPONENT_TYPE_TYPE = FacesConfigPackage.eINSTANCE.getComponentTypeType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute COMPONENT_TYPE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getComponentTypeType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute COMPONENT_TYPE_TYPE__ID = FacesConfigPackage.eINSTANCE.getComponentTypeType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl <em>Converter Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterClassType()
-	 * @generated
-	 */
-	EClass CONVERTER_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getConverterClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute CONVERTER_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getConverterClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute CONVERTER_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getConverterClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl <em>Converter For Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterForClassType()
-	 * @generated
-	 */
-	EClass CONVERTER_FOR_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getConverterForClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getConverterForClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute CONVERTER_FOR_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getConverterForClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl <em>Converter Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterIdType()
-	 * @generated
-	 */
-	EClass CONVERTER_ID_TYPE = FacesConfigPackage.eINSTANCE.getConverterIdType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute CONVERTER_ID_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getConverterIdType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute CONVERTER_ID_TYPE__ID = FacesConfigPackage.eINSTANCE.getConverterIdType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl <em>Converter Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterType()
-	 * @generated
-	 */
-	EClass CONVERTER_TYPE = FacesConfigPackage.eINSTANCE.getConverterType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getConverterType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getConverterType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__ICON = FacesConfigPackage.eINSTANCE.getConverterType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__CONVERTER_ID = FacesConfigPackage.eINSTANCE.getConverterType_ConverterId();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter For Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__CONVERTER_FOR_CLASS = FacesConfigPackage.eINSTANCE.getConverterType_ConverterForClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__CONVERTER_CLASS = FacesConfigPackage.eINSTANCE.getConverterType_ConverterClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__ATTRIBUTE = FacesConfigPackage.eINSTANCE.getConverterType_Attribute();
-
-	/**
-	 * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__PROPERTY = FacesConfigPackage.eINSTANCE.getConverterType_Property();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute CONVERTER_TYPE__ID = FacesConfigPackage.eINSTANCE.getConverterType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl <em>Default Locale Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultLocaleType()
-	 * @generated
-	 */
-	EClass DEFAULT_LOCALE_TYPE = FacesConfigPackage.eINSTANCE.getDefaultLocaleType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DEFAULT_LOCALE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getDefaultLocaleType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DEFAULT_LOCALE_TYPE__ID = FacesConfigPackage.eINSTANCE.getDefaultLocaleType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl <em>Default Render Kit Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultRenderKitIdType()
-	 * @generated
-	 */
-	EClass DEFAULT_RENDER_KIT_ID_TYPE = FacesConfigPackage.eINSTANCE.getDefaultRenderKitIdType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getDefaultRenderKitIdType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DEFAULT_RENDER_KIT_ID_TYPE__ID = FacesConfigPackage.eINSTANCE.getDefaultRenderKitIdType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl <em>Default Value Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultValueType()
-	 * @generated
-	 */
-	EClass DEFAULT_VALUE_TYPE = FacesConfigPackage.eINSTANCE.getDefaultValueType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DEFAULT_VALUE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getDefaultValueType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DEFAULT_VALUE_TYPE__ID = FacesConfigPackage.eINSTANCE.getDefaultValueType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl <em>Description Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDescriptionType()
-	 * @generated
-	 */
-	EClass DESCRIPTION_TYPE = FacesConfigPackage.eINSTANCE.getDescriptionType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DESCRIPTION_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getDescriptionType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Lang</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DESCRIPTION_TYPE__LANG = FacesConfigPackage.eINSTANCE.getDescriptionType_Lang();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DESCRIPTION_TYPE__ID = FacesConfigPackage.eINSTANCE.getDescriptionType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl <em>Display Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDisplayNameType()
-	 * @generated
-	 */
-	EClass DISPLAY_NAME_TYPE = FacesConfigPackage.eINSTANCE.getDisplayNameType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DISPLAY_NAME_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getDisplayNameType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Lang</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DISPLAY_NAME_TYPE__LANG = FacesConfigPackage.eINSTANCE.getDisplayNameType_Lang();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DISPLAY_NAME_TYPE__ID = FacesConfigPackage.eINSTANCE.getDisplayNameType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl <em>Document Root</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDocumentRoot()
-	 * @generated
-	 */
-	EClass DOCUMENT_ROOT = FacesConfigPackage.eINSTANCE.getDocumentRoot();
-
-	/**
-	 * The meta object literal for the '<em><b>Mixed</b></em>' attribute list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DOCUMENT_ROOT__MIXED = FacesConfigPackage.eINSTANCE.getDocumentRoot_Mixed();
-
-	/**
-	 * The meta object literal for the '<em><b>XMLNS Prefix Map</b></em>' map feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__XMLNS_PREFIX_MAP = FacesConfigPackage.eINSTANCE.getDocumentRoot_XMLNSPrefixMap();
-
-	/**
-	 * The meta object literal for the '<em><b>XSI Schema Location</b></em>' map feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__XSI_SCHEMA_LOCATION = FacesConfigPackage.eINSTANCE.getDocumentRoot_XSISchemaLocation();
-
-	/**
-	 * The meta object literal for the '<em><b>Action Listener</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__ACTION_LISTENER = FacesConfigPackage.eINSTANCE.getDocumentRoot_ActionListener();
-
-	/**
-	 * The meta object literal for the '<em><b>Application</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__APPLICATION = FacesConfigPackage.eINSTANCE.getDocumentRoot_Application();
-
-	/**
-	 * The meta object literal for the '<em><b>Application Factory</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__APPLICATION_FACTORY = FacesConfigPackage.eINSTANCE.getDocumentRoot_ApplicationFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__ATTRIBUTE = FacesConfigPackage.eINSTANCE.getDocumentRoot_Attribute();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__ATTRIBUTE_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_AttributeClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute Extension</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__ATTRIBUTE_EXTENSION = FacesConfigPackage.eINSTANCE.getDocumentRoot_AttributeExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__ATTRIBUTE_NAME = FacesConfigPackage.eINSTANCE.getDocumentRoot_AttributeName();
-
-	/**
-	 * The meta object literal for the '<em><b>Component</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__COMPONENT = FacesConfigPackage.eINSTANCE.getDocumentRoot_Component();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__COMPONENT_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_ComponentClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Extension</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__COMPONENT_EXTENSION = FacesConfigPackage.eINSTANCE.getDocumentRoot_ComponentExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Family</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__COMPONENT_FAMILY = FacesConfigPackage.eINSTANCE.getDocumentRoot_ComponentFamily();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Type</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__COMPONENT_TYPE = FacesConfigPackage.eINSTANCE.getDocumentRoot_ComponentType();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__CONVERTER = FacesConfigPackage.eINSTANCE.getDocumentRoot_Converter();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__CONVERTER_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_ConverterClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter For Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__CONVERTER_FOR_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_ConverterForClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__CONVERTER_ID = FacesConfigPackage.eINSTANCE.getDocumentRoot_ConverterId();
-
-	/**
-	 * The meta object literal for the '<em><b>Default Locale</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__DEFAULT_LOCALE = FacesConfigPackage.eINSTANCE.getDocumentRoot_DefaultLocale();
-
-	/**
-	 * The meta object literal for the '<em><b>Default Render Kit Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID = FacesConfigPackage.eINSTANCE.getDocumentRoot_DefaultRenderKitId();
-
-	/**
-	 * The meta object literal for the '<em><b>Default Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__DEFAULT_VALUE = FacesConfigPackage.eINSTANCE.getDocumentRoot_DefaultValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__DESCRIPTION = FacesConfigPackage.eINSTANCE.getDocumentRoot_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getDocumentRoot_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Faces Config</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FACES_CONFIG = FacesConfigPackage.eINSTANCE.getDocumentRoot_FacesConfig();
-
-	/**
-	 * The meta object literal for the '<em><b>Faces Context Factory</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FACES_CONTEXT_FACTORY = FacesConfigPackage.eINSTANCE.getDocumentRoot_FacesContextFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>Facet</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FACET = FacesConfigPackage.eINSTANCE.getDocumentRoot_Facet();
-
-	/**
-	 * The meta object literal for the '<em><b>Facet Extension</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FACET_EXTENSION = FacesConfigPackage.eINSTANCE.getDocumentRoot_FacetExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Facet Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FACET_NAME = FacesConfigPackage.eINSTANCE.getDocumentRoot_FacetName();
-
-	/**
-	 * The meta object literal for the '<em><b>Factory</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FACTORY = FacesConfigPackage.eINSTANCE.getDocumentRoot_Factory();
-
-	/**
-	 * The meta object literal for the '<em><b>From Action</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FROM_ACTION = FacesConfigPackage.eINSTANCE.getDocumentRoot_FromAction();
-
-	/**
-	 * The meta object literal for the '<em><b>From Outcome</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FROM_OUTCOME = FacesConfigPackage.eINSTANCE.getDocumentRoot_FromOutcome();
-
-	/**
-	 * The meta object literal for the '<em><b>From View Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FROM_VIEW_ID = FacesConfigPackage.eINSTANCE.getDocumentRoot_FromViewId();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__ICON = FacesConfigPackage.eINSTANCE.getDocumentRoot_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Key</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__KEY = FacesConfigPackage.eINSTANCE.getDocumentRoot_Key();
-
-	/**
-	 * The meta object literal for the '<em><b>Key Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__KEY_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_KeyClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Large Icon</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__LARGE_ICON = FacesConfigPackage.eINSTANCE.getDocumentRoot_LargeIcon();
-
-	/**
-	 * The meta object literal for the '<em><b>Lifecycle</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__LIFECYCLE = FacesConfigPackage.eINSTANCE.getDocumentRoot_Lifecycle();
-
-	/**
-	 * The meta object literal for the '<em><b>Lifecycle Factory</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__LIFECYCLE_FACTORY = FacesConfigPackage.eINSTANCE.getDocumentRoot_LifecycleFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>List Entries</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__LIST_ENTRIES = FacesConfigPackage.eINSTANCE.getDocumentRoot_ListEntries();
-
-	/**
-	 * The meta object literal for the '<em><b>Locale Config</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__LOCALE_CONFIG = FacesConfigPackage.eINSTANCE.getDocumentRoot_LocaleConfig();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MANAGED_BEAN = FacesConfigPackage.eINSTANCE.getDocumentRoot_ManagedBean();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MANAGED_BEAN_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_ManagedBeanClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MANAGED_BEAN_NAME = FacesConfigPackage.eINSTANCE.getDocumentRoot_ManagedBeanName();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean Scope</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MANAGED_BEAN_SCOPE = FacesConfigPackage.eINSTANCE.getDocumentRoot_ManagedBeanScope();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Property</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MANAGED_PROPERTY = FacesConfigPackage.eINSTANCE.getDocumentRoot_ManagedProperty();
-
-	/**
-	 * The meta object literal for the '<em><b>Map Entries</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MAP_ENTRIES = FacesConfigPackage.eINSTANCE.getDocumentRoot_MapEntries();
-
-	/**
-	 * The meta object literal for the '<em><b>Map Entry</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MAP_ENTRY = FacesConfigPackage.eINSTANCE.getDocumentRoot_MapEntry();
-
-	/**
-	 * The meta object literal for the '<em><b>Message Bundle</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MESSAGE_BUNDLE = FacesConfigPackage.eINSTANCE.getDocumentRoot_MessageBundle();
-
-	/**
-	 * The meta object literal for the '<em><b>Navigation Case</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__NAVIGATION_CASE = FacesConfigPackage.eINSTANCE.getDocumentRoot_NavigationCase();
-
-	/**
-	 * The meta object literal for the '<em><b>Navigation Handler</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__NAVIGATION_HANDLER = FacesConfigPackage.eINSTANCE.getDocumentRoot_NavigationHandler();
-
-	/**
-	 * The meta object literal for the '<em><b>Navigation Rule</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__NAVIGATION_RULE = FacesConfigPackage.eINSTANCE.getDocumentRoot_NavigationRule();
-
-	/**
-	 * The meta object literal for the '<em><b>Null Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__NULL_VALUE = FacesConfigPackage.eINSTANCE.getDocumentRoot_NullValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Phase Listener</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__PHASE_LISTENER = FacesConfigPackage.eINSTANCE.getDocumentRoot_PhaseListener();
-
-	/**
-	 * The meta object literal for the '<em><b>Property</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__PROPERTY = FacesConfigPackage.eINSTANCE.getDocumentRoot_Property();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__PROPERTY_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_PropertyClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Extension</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__PROPERTY_EXTENSION = FacesConfigPackage.eINSTANCE.getDocumentRoot_PropertyExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__PROPERTY_NAME = FacesConfigPackage.eINSTANCE.getDocumentRoot_PropertyName();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Resolver</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__PROPERTY_RESOLVER = FacesConfigPackage.eINSTANCE.getDocumentRoot_PropertyResolver();
-
-	/**
-	 * The meta object literal for the '<em><b>Redirect</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__REDIRECT = FacesConfigPackage.eINSTANCE.getDocumentRoot_Redirect();
-
-	/**
-	 * The meta object literal for the '<em><b>Referenced Bean</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__REFERENCED_BEAN = FacesConfigPackage.eINSTANCE.getDocumentRoot_ReferencedBean();
-
-	/**
-	 * The meta object literal for the '<em><b>Referenced Bean Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__REFERENCED_BEAN_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_ReferencedBeanClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Referenced Bean Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__REFERENCED_BEAN_NAME = FacesConfigPackage.eINSTANCE.getDocumentRoot_ReferencedBeanName();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDERER = FacesConfigPackage.eINSTANCE.getDocumentRoot_Renderer();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDERER_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_RendererClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer Extension</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDERER_EXTENSION = FacesConfigPackage.eINSTANCE.getDocumentRoot_RendererExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer Type</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDERER_TYPE = FacesConfigPackage.eINSTANCE.getDocumentRoot_RendererType();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDER_KIT = FacesConfigPackage.eINSTANCE.getDocumentRoot_RenderKit();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDER_KIT_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_RenderKitClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit Factory</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDER_KIT_FACTORY = FacesConfigPackage.eINSTANCE.getDocumentRoot_RenderKitFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDER_KIT_ID = FacesConfigPackage.eINSTANCE.getDocumentRoot_RenderKitId();
-
-	/**
-	 * The meta object literal for the '<em><b>Small Icon</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__SMALL_ICON = FacesConfigPackage.eINSTANCE.getDocumentRoot_SmallIcon();
-
-	/**
-	 * The meta object literal for the '<em><b>State Manager</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__STATE_MANAGER = FacesConfigPackage.eINSTANCE.getDocumentRoot_StateManager();
-
-	/**
-	 * The meta object literal for the '<em><b>Suggested Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__SUGGESTED_VALUE = FacesConfigPackage.eINSTANCE.getDocumentRoot_SuggestedValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Supported Locale</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__SUPPORTED_LOCALE = FacesConfigPackage.eINSTANCE.getDocumentRoot_SupportedLocale();
-
-	/**
-	 * The meta object literal for the '<em><b>To View Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__TO_VIEW_ID = FacesConfigPackage.eINSTANCE.getDocumentRoot_ToViewId();
-
-	/**
-	 * The meta object literal for the '<em><b>Validator</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__VALIDATOR = FacesConfigPackage.eINSTANCE.getDocumentRoot_Validator();
-
-	/**
-	 * The meta object literal for the '<em><b>Validator Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__VALIDATOR_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_ValidatorClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Validator Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__VALIDATOR_ID = FacesConfigPackage.eINSTANCE.getDocumentRoot_ValidatorId();
-
-	/**
-	 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__VALUE = FacesConfigPackage.eINSTANCE.getDocumentRoot_Value();
-
-	/**
-	 * The meta object literal for the '<em><b>Value Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__VALUE_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_ValueClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Variable Resolver</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__VARIABLE_RESOLVER = FacesConfigPackage.eINSTANCE.getDocumentRoot_VariableResolver();
-
-	/**
-	 * The meta object literal for the '<em><b>View Handler</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__VIEW_HANDLER = FacesConfigPackage.eINSTANCE.getDocumentRoot_ViewHandler();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl <em>Faces Config Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesConfigType()
-	 * @generated
-	 */
-	EClass FACES_CONFIG_TYPE = FacesConfigPackage.eINSTANCE.getFacesConfigType();
-
-	/**
-	 * The meta object literal for the '<em><b>Application</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__APPLICATION = FacesConfigPackage.eINSTANCE.getFacesConfigType_Application();
-
-	/**
-	 * The meta object literal for the '<em><b>Factory</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__FACTORY = FacesConfigPackage.eINSTANCE.getFacesConfigType_Factory();
-
-	/**
-	 * The meta object literal for the '<em><b>Component</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__COMPONENT = FacesConfigPackage.eINSTANCE.getFacesConfigType_Component();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__CONVERTER = FacesConfigPackage.eINSTANCE.getFacesConfigType_Converter();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__MANAGED_BEAN = FacesConfigPackage.eINSTANCE.getFacesConfigType_ManagedBean();
-
-	/**
-	 * The meta object literal for the '<em><b>Navigation Rule</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__NAVIGATION_RULE = FacesConfigPackage.eINSTANCE.getFacesConfigType_NavigationRule();
-
-	/**
-	 * The meta object literal for the '<em><b>Referenced Bean</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__REFERENCED_BEAN = FacesConfigPackage.eINSTANCE.getFacesConfigType_ReferencedBean();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__RENDER_KIT = FacesConfigPackage.eINSTANCE.getFacesConfigType_RenderKit();
-
-	/**
-	 * The meta object literal for the '<em><b>Lifecycle</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__LIFECYCLE = FacesConfigPackage.eINSTANCE.getFacesConfigType_Lifecycle();
-
-	/**
-	 * The meta object literal for the '<em><b>Validator</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__VALIDATOR = FacesConfigPackage.eINSTANCE.getFacesConfigType_Validator();
-
-	/**
-	 * The meta object literal for the '<em><b>Xmlns</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACES_CONFIG_TYPE__XMLNS = FacesConfigPackage.eINSTANCE.getFacesConfigType_Xmlns();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACES_CONFIG_TYPE__ID = FacesConfigPackage.eINSTANCE.getFacesConfigType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl <em>Faces Context Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesContextFactoryType()
-	 * @generated
-	 */
-	EClass FACES_CONTEXT_FACTORY_TYPE = FacesConfigPackage.eINSTANCE.getFacesContextFactoryType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getFacesContextFactoryType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACES_CONTEXT_FACTORY_TYPE__ID = FacesConfigPackage.eINSTANCE.getFacesContextFactoryType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetExtensionTypeImpl <em>Facet Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetExtensionType()
-	 * @generated
-	 */
-	EClass FACET_EXTENSION_TYPE = FacesConfigPackage.eINSTANCE.getFacetExtensionType();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetNameTypeImpl <em>Facet Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetNameType()
-	 * @generated
-	 */
-	EClass FACET_NAME_TYPE = FacesConfigPackage.eINSTANCE.getFacetNameType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACET_NAME_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getFacetNameType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACET_NAME_TYPE__ID = FacesConfigPackage.eINSTANCE.getFacetNameType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl <em>Facet Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetType()
-	 * @generated
-	 */
-	EClass FACET_TYPE = FacesConfigPackage.eINSTANCE.getFacetType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACET_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getFacetType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACET_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getFacetType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACET_TYPE__ICON = FacesConfigPackage.eINSTANCE.getFacetType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Facet Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACET_TYPE__FACET_NAME = FacesConfigPackage.eINSTANCE.getFacetType_FacetName();
-
-	/**
-	 * The meta object literal for the '<em><b>Facet Extension</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACET_TYPE__FACET_EXTENSION = FacesConfigPackage.eINSTANCE.getFacetType_FacetExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACET_TYPE__ID = FacesConfigPackage.eINSTANCE.getFacetType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl <em>Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFactoryType()
-	 * @generated
-	 */
-	EClass FACTORY_TYPE = FacesConfigPackage.eINSTANCE.getFactoryType();
-
-	/**
-	 * The meta object literal for the '<em><b>Application Factory</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACTORY_TYPE__APPLICATION_FACTORY = FacesConfigPackage.eINSTANCE.getFactoryType_ApplicationFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>Faces Context Factory</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACTORY_TYPE__FACES_CONTEXT_FACTORY = FacesConfigPackage.eINSTANCE.getFactoryType_FacesContextFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>Lifecycle Factory</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACTORY_TYPE__LIFECYCLE_FACTORY = FacesConfigPackage.eINSTANCE.getFactoryType_LifecycleFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit Factory</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACTORY_TYPE__RENDER_KIT_FACTORY = FacesConfigPackage.eINSTANCE.getFactoryType_RenderKitFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACTORY_TYPE__ID = FacesConfigPackage.eINSTANCE.getFactoryType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromActionTypeImpl <em>From Action Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromActionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromActionType()
-	 * @generated
-	 */
-	EClass FROM_ACTION_TYPE = FacesConfigPackage.eINSTANCE.getFromActionType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FROM_ACTION_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getFromActionType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FROM_ACTION_TYPE__ID = FacesConfigPackage.eINSTANCE.getFromActionType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromOutcomeTypeImpl <em>From Outcome Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromOutcomeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromOutcomeType()
-	 * @generated
-	 */
-	EClass FROM_OUTCOME_TYPE = FacesConfigPackage.eINSTANCE.getFromOutcomeType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FROM_OUTCOME_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getFromOutcomeType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FROM_OUTCOME_TYPE__ID = FacesConfigPackage.eINSTANCE.getFromOutcomeType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromViewIdTypeImpl <em>From View Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromViewIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromViewIdType()
-	 * @generated
-	 */
-	EClass FROM_VIEW_ID_TYPE = FacesConfigPackage.eINSTANCE.getFromViewIdType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FROM_VIEW_ID_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getFromViewIdType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FROM_VIEW_ID_TYPE__ID = FacesConfigPackage.eINSTANCE.getFromViewIdType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl <em>Icon Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getIconType()
-	 * @generated
-	 */
-	EClass ICON_TYPE = FacesConfigPackage.eINSTANCE.getIconType();
-
-	/**
-	 * The meta object literal for the '<em><b>Small Icon</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ICON_TYPE__SMALL_ICON = FacesConfigPackage.eINSTANCE.getIconType_SmallIcon();
-
-	/**
-	 * The meta object literal for the '<em><b>Large Icon</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ICON_TYPE__LARGE_ICON = FacesConfigPackage.eINSTANCE.getIconType_LargeIcon();
-
-	/**
-	 * The meta object literal for the '<em><b>Lang</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ICON_TYPE__LANG = FacesConfigPackage.eINSTANCE.getIconType_Lang();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ICON_TYPE__ID = FacesConfigPackage.eINSTANCE.getIconType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl <em>Key Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getKeyClassType()
-	 * @generated
-	 */
-	EClass KEY_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getKeyClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute KEY_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getKeyClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute KEY_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getKeyClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyTypeImpl <em>Key Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.KeyTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getKeyType()
-	 * @generated
-	 */
-	EClass KEY_TYPE = FacesConfigPackage.eINSTANCE.getKeyType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute KEY_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getKeyType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute KEY_TYPE__ID = FacesConfigPackage.eINSTANCE.getKeyType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LargeIconTypeImpl <em>Large Icon Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LargeIconTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLargeIconType()
-	 * @generated
-	 */
-	EClass LARGE_ICON_TYPE = FacesConfigPackage.eINSTANCE.getLargeIconType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute LARGE_ICON_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getLargeIconType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute LARGE_ICON_TYPE__ID = FacesConfigPackage.eINSTANCE.getLargeIconType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleFactoryTypeImpl <em>Lifecycle Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLifecycleFactoryType()
-	 * @generated
-	 */
-	EClass LIFECYCLE_FACTORY_TYPE = FacesConfigPackage.eINSTANCE.getLifecycleFactoryType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getLifecycleFactoryType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute LIFECYCLE_FACTORY_TYPE__ID = FacesConfigPackage.eINSTANCE.getLifecycleFactoryType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl <em>Lifecycle Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLifecycleType()
-	 * @generated
-	 */
-	EClass LIFECYCLE_TYPE = FacesConfigPackage.eINSTANCE.getLifecycleType();
-
-	/**
-	 * The meta object literal for the '<em><b>Phase Listener</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference LIFECYCLE_TYPE__PHASE_LISTENER = FacesConfigPackage.eINSTANCE.getLifecycleType_PhaseListener();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute LIFECYCLE_TYPE__ID = FacesConfigPackage.eINSTANCE.getLifecycleType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl <em>List Entries Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getListEntriesType()
-	 * @generated
-	 */
-	EClass LIST_ENTRIES_TYPE = FacesConfigPackage.eINSTANCE.getListEntriesType();
-
-	/**
-	 * The meta object literal for the '<em><b>Value Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference LIST_ENTRIES_TYPE__VALUE_CLASS = FacesConfigPackage.eINSTANCE.getListEntriesType_ValueClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Null Value</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference LIST_ENTRIES_TYPE__NULL_VALUE = FacesConfigPackage.eINSTANCE.getListEntriesType_NullValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Value</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference LIST_ENTRIES_TYPE__VALUE = FacesConfigPackage.eINSTANCE.getListEntriesType_Value();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute LIST_ENTRIES_TYPE__ID = FacesConfigPackage.eINSTANCE.getListEntriesType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl <em>Locale Config Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLocaleConfigType()
-	 * @generated
-	 */
-	EClass LOCALE_CONFIG_TYPE = FacesConfigPackage.eINSTANCE.getLocaleConfigType();
-
-	/**
-	 * The meta object literal for the '<em><b>Default Locale</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference LOCALE_CONFIG_TYPE__DEFAULT_LOCALE = FacesConfigPackage.eINSTANCE.getLocaleConfigType_DefaultLocale();
-
-	/**
-	 * The meta object literal for the '<em><b>Supported Locale</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE = FacesConfigPackage.eINSTANCE.getLocaleConfigType_SupportedLocale();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute LOCALE_CONFIG_TYPE__ID = FacesConfigPackage.eINSTANCE.getLocaleConfigType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanClassTypeImpl <em>Managed Bean Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanClassType()
-	 * @generated
-	 */
-	EClass MANAGED_BEAN_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getManagedBeanClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getManagedBeanClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_BEAN_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getManagedBeanClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanNameTypeImpl <em>Managed Bean Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanNameType()
-	 * @generated
-	 */
-	EClass MANAGED_BEAN_NAME_TYPE = FacesConfigPackage.eINSTANCE.getManagedBeanNameType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getManagedBeanNameType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_BEAN_NAME_TYPE__ID = FacesConfigPackage.eINSTANCE.getManagedBeanNameType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanScopeTypeImpl <em>Managed Bean Scope Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanScopeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanScopeType()
-	 * @generated
-	 */
-	EClass MANAGED_BEAN_SCOPE_TYPE = FacesConfigPackage.eINSTANCE.getManagedBeanScopeType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getManagedBeanScopeType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_BEAN_SCOPE_TYPE__ID = FacesConfigPackage.eINSTANCE.getManagedBeanScopeType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl <em>Managed Bean Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanType()
-	 * @generated
-	 */
-	EClass MANAGED_BEAN_TYPE = FacesConfigPackage.eINSTANCE.getManagedBeanType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getManagedBeanType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getManagedBeanType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__ICON = FacesConfigPackage.eINSTANCE.getManagedBeanType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME = FacesConfigPackage.eINSTANCE.getManagedBeanType_ManagedBeanName();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS = FacesConfigPackage.eINSTANCE.getManagedBeanType_ManagedBeanClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean Scope</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE = FacesConfigPackage.eINSTANCE.getManagedBeanType_ManagedBeanScope();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Property</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__MANAGED_PROPERTY = FacesConfigPackage.eINSTANCE.getManagedBeanType_ManagedProperty();
-
-	/**
-	 * The meta object literal for the '<em><b>Map Entries</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__MAP_ENTRIES = FacesConfigPackage.eINSTANCE.getManagedBeanType_MapEntries();
-
-	/**
-	 * The meta object literal for the '<em><b>List Entries</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__LIST_ENTRIES = FacesConfigPackage.eINSTANCE.getManagedBeanType_ListEntries();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_BEAN_TYPE__ID = FacesConfigPackage.eINSTANCE.getManagedBeanType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl <em>Managed Property Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedPropertyType()
-	 * @generated
-	 */
-	EClass MANAGED_PROPERTY_TYPE = FacesConfigPackage.eINSTANCE.getManagedPropertyType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getManagedPropertyType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getManagedPropertyType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__ICON = FacesConfigPackage.eINSTANCE.getManagedPropertyType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__PROPERTY_NAME = FacesConfigPackage.eINSTANCE.getManagedPropertyType_PropertyName();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__PROPERTY_CLASS = FacesConfigPackage.eINSTANCE.getManagedPropertyType_PropertyClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Map Entries</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__MAP_ENTRIES = FacesConfigPackage.eINSTANCE.getManagedPropertyType_MapEntries();
-
-	/**
-	 * The meta object literal for the '<em><b>Null Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__NULL_VALUE = FacesConfigPackage.eINSTANCE.getManagedPropertyType_NullValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__VALUE = FacesConfigPackage.eINSTANCE.getManagedPropertyType_Value();
-
-	/**
-	 * The meta object literal for the '<em><b>List Entries</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__LIST_ENTRIES = FacesConfigPackage.eINSTANCE.getManagedPropertyType_ListEntries();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_PROPERTY_TYPE__ID = FacesConfigPackage.eINSTANCE.getManagedPropertyType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl <em>Map Entries Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMapEntriesType()
-	 * @generated
-	 */
-	EClass MAP_ENTRIES_TYPE = FacesConfigPackage.eINSTANCE.getMapEntriesType();
-
-	/**
-	 * The meta object literal for the '<em><b>Key Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MAP_ENTRIES_TYPE__KEY_CLASS = FacesConfigPackage.eINSTANCE.getMapEntriesType_KeyClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Value Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MAP_ENTRIES_TYPE__VALUE_CLASS = FacesConfigPackage.eINSTANCE.getMapEntriesType_ValueClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Map Entry</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MAP_ENTRIES_TYPE__MAP_ENTRY = FacesConfigPackage.eINSTANCE.getMapEntriesType_MapEntry();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MAP_ENTRIES_TYPE__ID = FacesConfigPackage.eINSTANCE.getMapEntriesType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl <em>Map Entry Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMapEntryType()
-	 * @generated
-	 */
-	EClass MAP_ENTRY_TYPE = FacesConfigPackage.eINSTANCE.getMapEntryType();
-
-	/**
-	 * The meta object literal for the '<em><b>Key</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MAP_ENTRY_TYPE__KEY = FacesConfigPackage.eINSTANCE.getMapEntryType_Key();
-
-	/**
-	 * The meta object literal for the '<em><b>Null Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MAP_ENTRY_TYPE__NULL_VALUE = FacesConfigPackage.eINSTANCE.getMapEntryType_NullValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MAP_ENTRY_TYPE__VALUE = FacesConfigPackage.eINSTANCE.getMapEntryType_Value();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MAP_ENTRY_TYPE__ID = FacesConfigPackage.eINSTANCE.getMapEntryType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl <em>Message Bundle Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMessageBundleType()
-	 * @generated
-	 */
-	EClass MESSAGE_BUNDLE_TYPE = FacesConfigPackage.eINSTANCE.getMessageBundleType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MESSAGE_BUNDLE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getMessageBundleType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MESSAGE_BUNDLE_TYPE__ID = FacesConfigPackage.eINSTANCE.getMessageBundleType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl <em>Navigation Case Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationCaseType()
-	 * @generated
-	 */
-	EClass NAVIGATION_CASE_TYPE = FacesConfigPackage.eINSTANCE.getNavigationCaseType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_CASE_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getNavigationCaseType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_CASE_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getNavigationCaseType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_CASE_TYPE__ICON = FacesConfigPackage.eINSTANCE.getNavigationCaseType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>From Action</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_CASE_TYPE__FROM_ACTION = FacesConfigPackage.eINSTANCE.getNavigationCaseType_FromAction();
-
-	/**
-	 * The meta object literal for the '<em><b>From Outcome</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_CASE_TYPE__FROM_OUTCOME = FacesConfigPackage.eINSTANCE.getNavigationCaseType_FromOutcome();
-
-	/**
-	 * The meta object literal for the '<em><b>To View Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_CASE_TYPE__TO_VIEW_ID = FacesConfigPackage.eINSTANCE.getNavigationCaseType_ToViewId();
-
-	/**
-	 * The meta object literal for the '<em><b>Redirect</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_CASE_TYPE__REDIRECT = FacesConfigPackage.eINSTANCE.getNavigationCaseType_Redirect();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute NAVIGATION_CASE_TYPE__ID = FacesConfigPackage.eINSTANCE.getNavigationCaseType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl <em>Navigation Handler Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationHandlerType()
-	 * @generated
-	 */
-	EClass NAVIGATION_HANDLER_TYPE = FacesConfigPackage.eINSTANCE.getNavigationHandlerType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute NAVIGATION_HANDLER_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getNavigationHandlerType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute NAVIGATION_HANDLER_TYPE__ID = FacesConfigPackage.eINSTANCE.getNavigationHandlerType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl <em>Navigation Rule Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationRuleType()
-	 * @generated
-	 */
-	EClass NAVIGATION_RULE_TYPE = FacesConfigPackage.eINSTANCE.getNavigationRuleType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_RULE_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getNavigationRuleType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_RULE_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getNavigationRuleType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_RULE_TYPE__ICON = FacesConfigPackage.eINSTANCE.getNavigationRuleType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>From View Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_RULE_TYPE__FROM_VIEW_ID = FacesConfigPackage.eINSTANCE.getNavigationRuleType_FromViewId();
-
-	/**
-	 * The meta object literal for the '<em><b>Navigation Case</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_RULE_TYPE__NAVIGATION_CASE = FacesConfigPackage.eINSTANCE.getNavigationRuleType_NavigationCase();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute NAVIGATION_RULE_TYPE__ID = FacesConfigPackage.eINSTANCE.getNavigationRuleType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NullValueTypeImpl <em>Null Value Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NullValueTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNullValueType()
-	 * @generated
-	 */
-	EClass NULL_VALUE_TYPE = FacesConfigPackage.eINSTANCE.getNullValueType();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute NULL_VALUE_TYPE__ID = FacesConfigPackage.eINSTANCE.getNullValueType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl <em>Phase Listener Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPhaseListenerType()
-	 * @generated
-	 */
-	EClass PHASE_LISTENER_TYPE = FacesConfigPackage.eINSTANCE.getPhaseListenerType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PHASE_LISTENER_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getPhaseListenerType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PHASE_LISTENER_TYPE__ID = FacesConfigPackage.eINSTANCE.getPhaseListenerType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl <em>Property Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyClassType()
-	 * @generated
-	 */
-	EClass PROPERTY_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getPropertyClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PROPERTY_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getPropertyClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PROPERTY_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getPropertyClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyExtensionTypeImpl <em>Property Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyExtensionType()
-	 * @generated
-	 */
-	EClass PROPERTY_EXTENSION_TYPE = FacesConfigPackage.eINSTANCE.getPropertyExtensionType();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl <em>Property Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyNameType()
-	 * @generated
-	 */
-	EClass PROPERTY_NAME_TYPE = FacesConfigPackage.eINSTANCE.getPropertyNameType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PROPERTY_NAME_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getPropertyNameType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PROPERTY_NAME_TYPE__ID = FacesConfigPackage.eINSTANCE.getPropertyNameType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl <em>Property Resolver Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyResolverType()
-	 * @generated
-	 */
-	EClass PROPERTY_RESOLVER_TYPE = FacesConfigPackage.eINSTANCE.getPropertyResolverType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PROPERTY_RESOLVER_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getPropertyResolverType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PROPERTY_RESOLVER_TYPE__ID = FacesConfigPackage.eINSTANCE.getPropertyResolverType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl <em>Property Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyType()
-	 * @generated
-	 */
-	EClass PROPERTY_TYPE = FacesConfigPackage.eINSTANCE.getPropertyType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getPropertyType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getPropertyType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__ICON = FacesConfigPackage.eINSTANCE.getPropertyType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__PROPERTY_NAME = FacesConfigPackage.eINSTANCE.getPropertyType_PropertyName();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__PROPERTY_CLASS = FacesConfigPackage.eINSTANCE.getPropertyType_PropertyClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Default Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__DEFAULT_VALUE = FacesConfigPackage.eINSTANCE.getPropertyType_DefaultValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Suggested Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__SUGGESTED_VALUE = FacesConfigPackage.eINSTANCE.getPropertyType_SuggestedValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Extension</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__PROPERTY_EXTENSION = FacesConfigPackage.eINSTANCE.getPropertyType_PropertyExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PROPERTY_TYPE__ID = FacesConfigPackage.eINSTANCE.getPropertyType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl <em>Redirect Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRedirectType()
-	 * @generated
-	 */
-	EClass REDIRECT_TYPE = FacesConfigPackage.eINSTANCE.getRedirectType();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute REDIRECT_TYPE__ID = FacesConfigPackage.eINSTANCE.getRedirectType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl <em>Referenced Bean Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanClassType()
-	 * @generated
-	 */
-	EClass REFERENCED_BEAN_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getReferencedBeanClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getReferencedBeanClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute REFERENCED_BEAN_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getReferencedBeanClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl <em>Referenced Bean Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanNameType()
-	 * @generated
-	 */
-	EClass REFERENCED_BEAN_NAME_TYPE = FacesConfigPackage.eINSTANCE.getReferencedBeanNameType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getReferencedBeanNameType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute REFERENCED_BEAN_NAME_TYPE__ID = FacesConfigPackage.eINSTANCE.getReferencedBeanNameType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl <em>Referenced Bean Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanType()
-	 * @generated
-	 */
-	EClass REFERENCED_BEAN_TYPE = FacesConfigPackage.eINSTANCE.getReferencedBeanType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference REFERENCED_BEAN_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getReferencedBeanType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference REFERENCED_BEAN_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getReferencedBeanType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference REFERENCED_BEAN_TYPE__ICON = FacesConfigPackage.eINSTANCE.getReferencedBeanType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Referenced Bean Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME = FacesConfigPackage.eINSTANCE.getReferencedBeanType_ReferencedBeanName();
-
-	/**
-	 * The meta object literal for the '<em><b>Referenced Bean Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS = FacesConfigPackage.eINSTANCE.getReferencedBeanType_ReferencedBeanClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute REFERENCED_BEAN_TYPE__ID = FacesConfigPackage.eINSTANCE.getReferencedBeanType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl <em>Renderer Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererClassType()
-	 * @generated
-	 */
-	EClass RENDERER_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getRendererClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDERER_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getRendererClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDERER_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getRendererClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererExtensionTypeImpl <em>Renderer Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererExtensionType()
-	 * @generated
-	 */
-	EClass RENDERER_EXTENSION_TYPE = FacesConfigPackage.eINSTANCE.getRendererExtensionType();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl <em>Renderer Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererType()
-	 * @generated
-	 */
-	EClass RENDERER_TYPE = FacesConfigPackage.eINSTANCE.getRendererType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getRendererType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getRendererType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__ICON = FacesConfigPackage.eINSTANCE.getRendererType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Family</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__COMPONENT_FAMILY = FacesConfigPackage.eINSTANCE.getRendererType_ComponentFamily();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer Type</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__RENDERER_TYPE = FacesConfigPackage.eINSTANCE.getRendererType_RendererType();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__RENDERER_CLASS = FacesConfigPackage.eINSTANCE.getRendererType_RendererClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Facet</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__FACET = FacesConfigPackage.eINSTANCE.getRendererType_Facet();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__ATTRIBUTE = FacesConfigPackage.eINSTANCE.getRendererType_Attribute();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer Extension</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__RENDERER_EXTENSION = FacesConfigPackage.eINSTANCE.getRendererType_RendererExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDERER_TYPE__ID = FacesConfigPackage.eINSTANCE.getRendererType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl <em>Renderer Type Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererTypeType()
-	 * @generated
-	 */
-	EClass RENDERER_TYPE_TYPE = FacesConfigPackage.eINSTANCE.getRendererTypeType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDERER_TYPE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getRendererTypeType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDERER_TYPE_TYPE__ID = FacesConfigPackage.eINSTANCE.getRendererTypeType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl <em>Render Kit Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitClassType()
-	 * @generated
-	 */
-	EClass RENDER_KIT_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getRenderKitClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDER_KIT_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getRenderKitClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDER_KIT_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getRenderKitClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl <em>Render Kit Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitFactoryType()
-	 * @generated
-	 */
-	EClass RENDER_KIT_FACTORY_TYPE = FacesConfigPackage.eINSTANCE.getRenderKitFactoryType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getRenderKitFactoryType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDER_KIT_FACTORY_TYPE__ID = FacesConfigPackage.eINSTANCE.getRenderKitFactoryType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl <em>Render Kit Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitIdType()
-	 * @generated
-	 */
-	EClass RENDER_KIT_ID_TYPE = FacesConfigPackage.eINSTANCE.getRenderKitIdType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDER_KIT_ID_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getRenderKitIdType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDER_KIT_ID_TYPE__ID = FacesConfigPackage.eINSTANCE.getRenderKitIdType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl <em>Render Kit Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitType()
-	 * @generated
-	 */
-	EClass RENDER_KIT_TYPE = FacesConfigPackage.eINSTANCE.getRenderKitType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDER_KIT_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getRenderKitType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDER_KIT_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getRenderKitType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDER_KIT_TYPE__ICON = FacesConfigPackage.eINSTANCE.getRenderKitType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDER_KIT_TYPE__RENDER_KIT_ID = FacesConfigPackage.eINSTANCE.getRenderKitType_RenderKitId();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDER_KIT_TYPE__RENDER_KIT_CLASS = FacesConfigPackage.eINSTANCE.getRenderKitType_RenderKitClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDER_KIT_TYPE__RENDERER = FacesConfigPackage.eINSTANCE.getRenderKitType_Renderer();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDER_KIT_TYPE__ID = FacesConfigPackage.eINSTANCE.getRenderKitType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl <em>Small Icon Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSmallIconType()
-	 * @generated
-	 */
-	EClass SMALL_ICON_TYPE = FacesConfigPackage.eINSTANCE.getSmallIconType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute SMALL_ICON_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getSmallIconType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute SMALL_ICON_TYPE__ID = FacesConfigPackage.eINSTANCE.getSmallIconType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl <em>State Manager Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getStateManagerType()
-	 * @generated
-	 */
-	EClass STATE_MANAGER_TYPE = FacesConfigPackage.eINSTANCE.getStateManagerType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute STATE_MANAGER_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getStateManagerType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute STATE_MANAGER_TYPE__ID = FacesConfigPackage.eINSTANCE.getStateManagerType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl <em>Suggested Value Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSuggestedValueType()
-	 * @generated
-	 */
-	EClass SUGGESTED_VALUE_TYPE = FacesConfigPackage.eINSTANCE.getSuggestedValueType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute SUGGESTED_VALUE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getSuggestedValueType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute SUGGESTED_VALUE_TYPE__ID = FacesConfigPackage.eINSTANCE.getSuggestedValueType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl <em>Supported Locale Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSupportedLocaleType()
-	 * @generated
-	 */
-	EClass SUPPORTED_LOCALE_TYPE = FacesConfigPackage.eINSTANCE.getSupportedLocaleType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute SUPPORTED_LOCALE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getSupportedLocaleType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute SUPPORTED_LOCALE_TYPE__ID = FacesConfigPackage.eINSTANCE.getSupportedLocaleType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl <em>To View Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getToViewIdType()
-	 * @generated
-	 */
-	EClass TO_VIEW_ID_TYPE = FacesConfigPackage.eINSTANCE.getToViewIdType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute TO_VIEW_ID_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getToViewIdType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute TO_VIEW_ID_TYPE__ID = FacesConfigPackage.eINSTANCE.getToViewIdType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl <em>Validator Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorClassType()
-	 * @generated
-	 */
-	EClass VALIDATOR_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getValidatorClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALIDATOR_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getValidatorClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALIDATOR_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getValidatorClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl <em>Validator Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorIdType()
-	 * @generated
-	 */
-	EClass VALIDATOR_ID_TYPE = FacesConfigPackage.eINSTANCE.getValidatorIdType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALIDATOR_ID_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getValidatorIdType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALIDATOR_ID_TYPE__ID = FacesConfigPackage.eINSTANCE.getValidatorIdType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl <em>Validator Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorType()
-	 * @generated
-	 */
-	EClass VALIDATOR_TYPE = FacesConfigPackage.eINSTANCE.getValidatorType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference VALIDATOR_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getValidatorType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference VALIDATOR_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getValidatorType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference VALIDATOR_TYPE__ICON = FacesConfigPackage.eINSTANCE.getValidatorType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Validator Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference VALIDATOR_TYPE__VALIDATOR_ID = FacesConfigPackage.eINSTANCE.getValidatorType_ValidatorId();
-
-	/**
-	 * The meta object literal for the '<em><b>Validator Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference VALIDATOR_TYPE__VALIDATOR_CLASS = FacesConfigPackage.eINSTANCE.getValidatorType_ValidatorClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference VALIDATOR_TYPE__ATTRIBUTE = FacesConfigPackage.eINSTANCE.getValidatorType_Attribute();
-
-	/**
-	 * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference VALIDATOR_TYPE__PROPERTY = FacesConfigPackage.eINSTANCE.getValidatorType_Property();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALIDATOR_TYPE__ID = FacesConfigPackage.eINSTANCE.getValidatorType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl <em>Value Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValueClassType()
-	 * @generated
-	 */
-	EClass VALUE_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getValueClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALUE_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getValueClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALUE_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getValueClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl <em>Value Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValueType()
-	 * @generated
-	 */
-	EClass VALUE_TYPE = FacesConfigPackage.eINSTANCE.getValueType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALUE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getValueType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALUE_TYPE__ID = FacesConfigPackage.eINSTANCE.getValueType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl <em>Variable Resolver Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getVariableResolverType()
-	 * @generated
-	 */
-	EClass VARIABLE_RESOLVER_TYPE = FacesConfigPackage.eINSTANCE.getVariableResolverType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VARIABLE_RESOLVER_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getVariableResolverType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VARIABLE_RESOLVER_TYPE__ID = FacesConfigPackage.eINSTANCE.getVariableResolverType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl <em>View Handler Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getViewHandlerType()
-	 * @generated
-	 */
-	EClass VIEW_HANDLER_TYPE = FacesConfigPackage.eINSTANCE.getViewHandlerType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VIEW_HANDLER_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getViewHandlerType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VIEW_HANDLER_TYPE__ID = FacesConfigPackage.eINSTANCE.getViewHandlerType_Id();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LocaleConfigTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LocaleConfigTypeItemProvider.java
deleted file mode 100644
index a5af85e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LocaleConfigTypeItemProvider.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.LocaleConfigType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class LocaleConfigTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_LocaleConfigType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_LocaleConfigType_id_feature", "_UI_LocaleConfigType_type"),
-                 FacesConfigPackage.Literals.LOCALE_CONFIG_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE);
-            childrenFeatures.add(FacesConfigPackage.Literals.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-        // Check the type of the specified child object and return the proper feature to use for
-        // adding (see {@link AddCommand}) it as a child.
-
-        return super.getChildFeature(object, child);
-    }
-
-    /**
-     * This returns LocaleConfigType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/LocaleConfigType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((LocaleConfigType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_LocaleConfigType_type") :
-            getString("_UI_LocaleConfigType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(LocaleConfigType.class)) {
-            case FacesConfigPackage.LOCALE_CONFIG_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE:
-            case FacesConfigPackage.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE,
-                 FacesConfigFactory.eINSTANCE.createDefaultLocaleType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE,
-                 FacesConfigFactory.eINSTANCE.createSupportedLocaleType()));
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_LocaleConfigType_type");
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanClassTypeItemProvider.java
deleted file mode 100644
index b37e332..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
- */
-public class ManagedBeanClassTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * <!-- 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 -->
-     * <!-- 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 -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ManagedBeanClassType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanClassType_id_feature", "_UI_ManagedBeanClassType_type"),
-                 FacesConfigPackage.Literals.MANAGED_BEAN_CLASS_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns ManagedBeanClassType.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ManagedBeanClassType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((ManagedBeanClassType)object).getTextContent();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ManagedBeanClassType_type") :
-            getString("_UI_ManagedBeanClassType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ManagedBeanClassType.class)) {
-            case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanExtensionTypeItemProvider.java
deleted file mode 100644
index 36baa15..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ManagedBeanExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ManagedBeanExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This returns ManagedBeanExtensionType.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ManagedBeanExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((ManagedBeanExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ManagedBeanExtensionType_type") :
-            getString("_UI_ManagedBeanExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanNameTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanNameTypeItemProvider.java
deleted file mode 100644
index 7f814a7..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
- */
-public class ManagedBeanNameTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * <!-- 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 -->
-     * <!-- 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 -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ManagedBeanNameType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanNameType_id_feature", "_UI_ManagedBeanNameType_type"),
-                 FacesConfigPackage.Literals.MANAGED_BEAN_NAME_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns ManagedBeanNameType.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ManagedBeanNameType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((ManagedBeanNameType)object).getTextContent();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ManagedBeanNameType_type") :
-            getString("_UI_ManagedBeanNameType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ManagedBeanNameType.class)) {
-            case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanScopeTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanScopeTypeItemProvider.java
deleted file mode 100644
index 53f688e..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
- */
-public class ManagedBeanScopeTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * <!-- 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 -->
-     * <!-- 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 -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ManagedBeanScopeType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanScopeType_id_feature", "_UI_ManagedBeanScopeType_type"),
-                 FacesConfigPackage.Literals.MANAGED_BEAN_SCOPE_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns ManagedBeanScopeType.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ManagedBeanScopeType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((ManagedBeanScopeType)object).getTextContent();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ManagedBeanScopeType_type") :
-            getString("_UI_ManagedBeanScopeType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ManagedBeanScopeType.class)) {
-            case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanTypeItemProvider.java
deleted file mode 100644
index 0c4060d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanTypeItemProvider.java
+++ /dev/null
@@ -1,346 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class ManagedBeanTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ManagedBeanTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addManagedBeanNamePropertyDescriptor(object);
-            addManagedBeanClassPropertyDescriptor(object);
-            addManagedBeanScopePropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Managed Bean Name feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addManagedBeanNamePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ManagedBeanType_managedBeanName_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanType_managedBeanName_feature", "_UI_ManagedBeanType_type"),
-                 FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Managed Bean Class feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addManagedBeanClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ManagedBeanType_managedBeanClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanType_managedBeanClass_feature", "_UI_ManagedBeanType_type"),
-                 FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Managed Bean Scope feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addManagedBeanScopePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ManagedBeanType_managedBeanScope_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanType_managedBeanScope_feature", "_UI_ManagedBeanType_type"),
-                 FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ManagedBeanType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanType_id_feature", "_UI_ManagedBeanType_type"),
-                 FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__DESCRIPTION);
-            childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__DISPLAY_NAME);
-            childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__ICON);
-            childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_PROPERTY);
-            childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MAP_ENTRIES);
-            childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__LIST_ENTRIES);
-            childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-        // Check the type of the specified child object and return the proper feature to use for
-        // adding (see {@link AddCommand}) it as a child.
-
-        return super.getChildFeature(object, child);
-    }
-
-    /**
-     * This returns ManagedBeanType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ManagedBeanType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        String label = null;
-        if (((ManagedBeanType) object).getManagedBeanName() != null)
-            label = ((ManagedBeanType) object).getManagedBeanName()
-                    .getTextContent();
-
-        if (label == null || label.length() == 0) {
-            if (((ManagedBeanType) object).getManagedBeanClass() != null)
-                label = ((ManagedBeanType) object).getManagedBeanClass()
-                        .getTextContent();
-        }
-        return label == null || label.length() == 0 ? getString("_UI_ManagedBeanType_type")
-                : label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ManagedBeanType.class)) {
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME:
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS:
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE:
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__DESCRIPTION:
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__DISPLAY_NAME:
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__ICON:
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_PROPERTY:
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES:
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES:
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__DESCRIPTION,
-                 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__DISPLAY_NAME,
-                 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__ICON,
-                 FacesConfigFactory.eINSTANCE.createIconType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_PROPERTY,
-                 FacesConfigFactory.eINSTANCE.createManagedPropertyType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MAP_ENTRIES,
-                 FacesConfigFactory.eINSTANCE.createMapEntriesType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__LIST_ENTRIES,
-                 FacesConfigFactory.eINSTANCE.createListEntriesType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION,
-                 FacesConfigFactory.eINSTANCE.createManagedBeanExtensionType()));
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	public String getColumnText(Object object, int columnIndex) {
-		ManagedBeanType managedBean = (ManagedBeanType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return managedBean.getManagedBeanName() == null ? "" : managedBean
-					.getManagedBeanName().getTextContent();
-		case 1:
-			return managedBean.getManagedBeanScope() == null ? "" : managedBean
-					.getManagedBeanScope().getTextContent();
-
-		case 2:
-			return managedBean.getManagedBeanClass() == null ? "" : managedBean
-					.getManagedBeanClass().getTextContent();
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedPropertyTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedPropertyTypeItemProvider.java
deleted file mode 100644
index edc901c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedPropertyTypeItemProvider.java
+++ /dev/null
@@ -1,359 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class ManagedPropertyTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider{
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ManagedPropertyTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addPropertyNamePropertyDescriptor(object);
-            addPropertyClassPropertyDescriptor(object);
-            addNullValuePropertyDescriptor(object);
-            addValuePropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Property Name feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addPropertyNamePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ManagedPropertyType_propertyName_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ManagedPropertyType_propertyName_feature", "_UI_ManagedPropertyType_type"),
-                 FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__PROPERTY_NAME,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Property Class feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addPropertyClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ManagedPropertyType_propertyClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ManagedPropertyType_propertyClass_feature", "_UI_ManagedPropertyType_type"),
-                 FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Null Value feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addNullValuePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ManagedPropertyType_nullValue_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ManagedPropertyType_nullValue_feature", "_UI_ManagedPropertyType_type"),
-                 FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__NULL_VALUE,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Value feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addValuePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ManagedPropertyType_value_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ManagedPropertyType_value_feature", "_UI_ManagedPropertyType_type"),
-                 FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__VALUE,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ManagedPropertyType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ManagedPropertyType_id_feature", "_UI_ManagedPropertyType_type"),
-                 FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__DESCRIPTION);
-            childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__DISPLAY_NAME);
-            childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__ICON);
-            childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__MAP_ENTRIES);
-            childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__LIST_ENTRIES);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-        // Check the type of the specified child object and return the proper feature to use for
-        // adding (see {@link AddCommand}) it as a child.
-
-        return super.getChildFeature(object, child);
-    }
-
-    /**
-     * This returns ManagedPropertyType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ManagedPropertyType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        String label = ((ManagedPropertyType) object).getId();
-        if (((ManagedPropertyType) object).getPropertyName() != null) {
-            label = ((ManagedPropertyType) object).getPropertyName()
-                    .getTextContent();
-        }
-        return label == null || label.length() == 0 ? getString("_UI_ManagedPropertyType_type")
-                : label;
-
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ManagedPropertyType.class)) {
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME:
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS:
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE:
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE:
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DESCRIPTION:
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DISPLAY_NAME:
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ICON:
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES:
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__DESCRIPTION,
-                 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__DISPLAY_NAME,
-                 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__ICON,
-                 FacesConfigFactory.eINSTANCE.createIconType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__MAP_ENTRIES,
-                 FacesConfigFactory.eINSTANCE.createMapEntriesType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__LIST_ENTRIES,
-                 FacesConfigFactory.eINSTANCE.createListEntriesType()));
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	public String getColumnText(Object object, int columnIndex) {
-		ManagedPropertyType attribute = (ManagedPropertyType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return attribute.getPropertyName() == null ? "" : attribute
-					.getPropertyName().getTextContent();
-		case 1:
-			return attribute.getPropertyClass() == null ? "" : attribute
-					.getPropertyClass().getTextContent();
-		case 2:
-			if(attribute.getValue() != null)
-			{
-				return attribute.getValue().getTextContent();
-			}
-			else if(attribute.getNullValue() != null)
-				return "<null-value>";
-			else if(attribute.getMapEntries() != null)
-				return "<map-entries>";
-			else if(attribute.getListEntries() != null)
-				return "<list-entries>";
-			return "";
-		}
-		return null;
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MapEntriesTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MapEntriesTypeItemProvider.java
deleted file mode 100644
index 79dc0e3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MapEntriesTypeItemProvider.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class MapEntriesTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public MapEntriesTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addKeyClassPropertyDescriptor(object);
-            addValueClassPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Key Class feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addKeyClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_MapEntriesType_keyClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_MapEntriesType_keyClass_feature", "_UI_MapEntriesType_type"),
-                 FacesConfigPackage.Literals.MAP_ENTRIES_TYPE__KEY_CLASS,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Value Class feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addValueClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_MapEntriesType_valueClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_MapEntriesType_valueClass_feature", "_UI_MapEntriesType_type"),
-                 FacesConfigPackage.Literals.MAP_ENTRIES_TYPE__VALUE_CLASS,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_MapEntriesType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_MapEntriesType_id_feature", "_UI_MapEntriesType_type"),
-                 FacesConfigPackage.Literals.MAP_ENTRIES_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.MAP_ENTRIES_TYPE__MAP_ENTRY);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * This returns MapEntriesType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/MapEntriesType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((MapEntriesType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_MapEntriesType_type") :
-            getString("_UI_MapEntriesType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(MapEntriesType.class)) {
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS:
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS:
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__MAP_ENTRY:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.MAP_ENTRIES_TYPE__MAP_ENTRY,
-                 FacesConfigFactory.eINSTANCE.createMapEntryType()));
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MapEntryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MapEntryTypeItemProvider.java
deleted file mode 100644
index aba986f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MapEntryTypeItemProvider.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntryType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class MapEntryTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource,
-		ITableItemLabelProvider{
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public MapEntryTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addKeyPropertyDescriptor(object);
-            addNullValuePropertyDescriptor(object);
-            addValuePropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Key feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addKeyPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_MapEntryType_key_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_MapEntryType_key_feature", "_UI_MapEntryType_type"),
-                 FacesConfigPackage.Literals.MAP_ENTRY_TYPE__KEY,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Null Value feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addNullValuePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_MapEntryType_nullValue_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_MapEntryType_nullValue_feature", "_UI_MapEntryType_type"),
-                 FacesConfigPackage.Literals.MAP_ENTRY_TYPE__NULL_VALUE,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Value feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addValuePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_MapEntryType_value_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_MapEntryType_value_feature", "_UI_MapEntryType_type"),
-                 FacesConfigPackage.Literals.MAP_ENTRY_TYPE__VALUE,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_MapEntryType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_MapEntryType_id_feature", "_UI_MapEntryType_type"),
-                 FacesConfigPackage.Literals.MAP_ENTRY_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns MapEntryType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/MapEntryType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        KeyType key = ((MapEntryType)object).getKey();
-        
-        String label = key != null ? key.getTextContent() : null;
-        return label == null || label.length() == 0 ?
-            getString("_UI_MapEntryType_type") : label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(MapEntryType.class)) {
-            case FacesConfigPackage.MAP_ENTRY_TYPE__KEY:
-            case FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE:
-            case FacesConfigPackage.MAP_ENTRY_TYPE__VALUE:
-            case FacesConfigPackage.MAP_ENTRY_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	public String getColumnText(Object object, int columnIndex) {
-
-		MapEntryType mapEntry = (MapEntryType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return mapEntry.getKey() == null ? "" : mapEntry.getKey()
-					.getTextContent();
-		case 1:
-			if (mapEntry.getNullValue() != null)
-            {
-				return "<null-value>";
-            }
-			return mapEntry.getValue() == null ? "" : mapEntry.getValue()
-					.getTextContent();
-		}
-		return null;
-	}	
-    public Object getColumnImage(Object object, int columnIndex) {
-		// no column images
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MessageBundleTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MessageBundleTypeItemProvider.java
deleted file mode 100644
index 12b57e8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MessageBundleTypeItemProvider.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.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.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.MessageBundleType;
-
-/**
- * This is the item provider adapter for a
- * {@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType} object. <!--
- * begin-user-doc --> <!-- end-user-doc -->
- * 
- * @generated
- */
-public class MessageBundleTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-	/**
-	 * This constructs an instance from a factory and a notifier. <!--
-	 * begin-user-doc --> <!-- 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 --> <!-- 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
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_MessageBundleType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_MessageBundleType_id_feature", "_UI_MessageBundleType_type"),
-                 FacesConfigPackage.Literals.MESSAGE_BUNDLE_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns MessageBundleType.gif.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/MessageBundleType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((MessageBundleType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_MessageBundleType_type") :
-            getString("_UI_MessageBundleType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(MessageBundleType.class)) {
-            case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_MessageBundleType_type");
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationCaseTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationCaseTypeItemProvider.java
deleted file mode 100644
index 87a5112..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationCaseTypeItemProvider.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.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.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 -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class NavigationCaseTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NavigationCaseTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addFromActionPropertyDescriptor(object);
-            addFromOutcomePropertyDescriptor(object);
-            addToViewIdPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the From Action feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addFromActionPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_NavigationCaseType_fromAction_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_NavigationCaseType_fromAction_feature", "_UI_NavigationCaseType_type"),
-                 FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__FROM_ACTION,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the From Outcome feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addFromOutcomePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_NavigationCaseType_fromOutcome_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_NavigationCaseType_fromOutcome_feature", "_UI_NavigationCaseType_type"),
-                 FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__FROM_OUTCOME,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the To View Id feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addToViewIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_NavigationCaseType_toViewId_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_NavigationCaseType_toViewId_feature", "_UI_NavigationCaseType_type"),
-                 FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__TO_VIEW_ID,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_NavigationCaseType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_NavigationCaseType_id_feature", "_UI_NavigationCaseType_type"),
-                 FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__DESCRIPTION);
-            childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__DISPLAY_NAME);
-            childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__ICON);
-            childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__REDIRECT);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-        // Check the type of the specified child object and return the proper feature to use for
-        // adding (see {@link AddCommand}) it as a child.
-
-        return super.getChildFeature(object, child);
-    }
-
-    /**
-     * This returns NavigationCaseType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/NavigationCaseType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((NavigationCaseType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_NavigationCaseType_type") :
-            getString("_UI_NavigationCaseType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(NavigationCaseType.class)) {
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION:
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME:
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID:
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__DESCRIPTION:
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__DISPLAY_NAME:
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__ICON:
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__DESCRIPTION,
-                 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__DISPLAY_NAME,
-                 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__ICON,
-                 FacesConfigFactory.eINSTANCE.createIconType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__REDIRECT,
-                 FacesConfigFactory.eINSTANCE.createRedirectType()));
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// 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) {
-		NavigationCaseType navigationcase = (NavigationCaseType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return ((NavigationRuleType) navigationcase.eContainer())
-					.getFromViewId() == null ? ""
-					: ((NavigationRuleType) navigationcase.eContainer())
-							.getFromViewId().getTextContent();
-		case 1:
-			return navigationcase.getFromOutcome() == null ? "" : navigationcase
-					.getFromOutcome().getTextContent();
-		case 2:
-			return navigationcase.getToViewId() == null ? "" : navigationcase
-					.getToViewId().getTextContent();
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationHandlerTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationHandlerTypeItemProvider.java
deleted file mode 100644
index 1abda44..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationHandlerTypeItemProvider.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.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.NavigationHandlerType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType} object.
- * <!-- begin-user-doc --> <!-- end-user-doc -->
- * @generated
- */
-public class NavigationHandlerTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-	/**
-	 * This constructs an instance from a factory and a notifier. <!--
-	 * begin-user-doc --> <!-- 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 --> <!-- 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
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_NavigationHandlerType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_NavigationHandlerType_id_feature", "_UI_NavigationHandlerType_type"),
-                 FacesConfigPackage.Literals.NAVIGATION_HANDLER_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns NavigationHandlerType.gif.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/NavigationHandlerType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((NavigationHandlerType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_NavigationHandlerType_type") :
-            getString("_UI_NavigationHandlerType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(NavigationHandlerType.class)) {
-            case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_NavigationHandlerType_type");
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationRuleExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationRuleExtensionTypeItemProvider.java
deleted file mode 100644
index 2f5e1e3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationRuleExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class NavigationRuleExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NavigationRuleExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This returns NavigationRuleExtensionType.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/NavigationRuleExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((NavigationRuleExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_NavigationRuleExtensionType_type") :
-            getString("_UI_NavigationRuleExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationRuleTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationRuleTypeItemProvider.java
deleted file mode 100644
index a72ac7a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationRuleTypeItemProvider.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.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import 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.NavigationRuleType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class NavigationRuleTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource{
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NavigationRuleTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addFromViewIdPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the From View Id feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addFromViewIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_NavigationRuleType_fromViewId_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_NavigationRuleType_fromViewId_feature", "_UI_NavigationRuleType_type"),
-                 FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__FROM_VIEW_ID,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_NavigationRuleType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_NavigationRuleType_id_feature", "_UI_NavigationRuleType_type"),
-                 FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__DESCRIPTION);
-            childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__DISPLAY_NAME);
-            childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__ICON);
-            childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__NAVIGATION_CASE);
-            childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-        // Check the type of the specified child object and return the proper feature to use for
-        // adding (see {@link AddCommand}) it as a child.
-
-        return super.getChildFeature(object, child);
-    }
-
-    /**
-     * This returns NavigationRuleType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/NavigationRuleType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((NavigationRuleType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_NavigationRuleType_type") :
-            getString("_UI_NavigationRuleType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(NavigationRuleType.class)) {
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID:
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__DESCRIPTION:
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__DISPLAY_NAME:
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__ICON:
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE:
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__DESCRIPTION,
-                 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__DISPLAY_NAME,
-                 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__ICON,
-                 FacesConfigFactory.eINSTANCE.createIconType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__NAVIGATION_CASE,
-                 FacesConfigFactory.eINSTANCE.createNavigationCaseType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION,
-                 FacesConfigFactory.eINSTANCE.createNavigationRuleExtensionType()));
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NullValueTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NullValueTypeItemProvider.java
deleted file mode 100644
index d3432f3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NullValueTypeItemProvider.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.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.NullValueType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class NullValueTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_NullValueType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_NullValueType_id_feature", "_UI_NullValueType_type"),
-                 FacesConfigPackage.Literals.NULL_VALUE_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns NullValueType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/NullValueType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((NullValueType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_NullValueType_type") :
-            getString("_UI_NullValueType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(NullValueType.class)) {
-            case FacesConfigPackage.NULL_VALUE_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	public String getColumnText(Object object, int columnIndex) {
-		return "<null-value>";
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		// 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/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 b88da6e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PhaseListenerTypeItemProvider.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.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 --> <!-- end-user-doc -->
- * 
- * @generated
- */
-public class PhaseListenerTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-	/**
-	 * This constructs an instance from a factory and a notifier. <!--
-	 * begin-user-doc --> <!-- 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 --> <!-- 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
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_PhaseListenerType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_PhaseListenerType_id_feature", "_UI_PhaseListenerType_type"),
-                 FacesConfigPackage.Literals.PHASE_LISTENER_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns PhaseListenerType.gif.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/PhaseListenerType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((PhaseListenerType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_PhaseListenerType_type") :
-            getString("_UI_PhaseListenerType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(PhaseListenerType.class)) {
-            case FacesConfigPackage.PHASE_LISTENER_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.PHASE_LISTENER_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-
-		switch (columnIndex) {
-
-			case 0:
-				return getText(object);
-			case 1:
-				return getString("_UI_ActionListenerType_type");
-			}
-
-			return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyClassTypeItemProvider.java
deleted file mode 100644
index 89ff554..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyClassTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class PropertyClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_PropertyClassType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_PropertyClassType_id_feature", "_UI_PropertyClassType_type"),
-                 FacesConfigPackage.Literals.PROPERTY_CLASS_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns PropertyClassType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/PropertyClassType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((PropertyClassType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_PropertyClassType_type") :
-            getString("_UI_PropertyClassType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(PropertyClassType.class)) {
-            case FacesConfigPackage.PROPERTY_CLASS_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.PROPERTY_CLASS_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyExtensionTypeItemProvider.java
deleted file mode 100644
index c643d90..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class PropertyExtensionTypeItemProvider
-	extends ExtensionTypeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public PropertyExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This returns PropertyExtensionType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/PropertyExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((PropertyExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_PropertyExtensionType_type") :
-            getString("_UI_PropertyExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyNameTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyNameTypeItemProvider.java
deleted file mode 100644
index 7454636..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyNameTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class PropertyNameTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_PropertyNameType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_PropertyNameType_id_feature", "_UI_PropertyNameType_type"),
-                 FacesConfigPackage.Literals.PROPERTY_NAME_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns PropertyNameType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/PropertyNameType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((PropertyNameType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_PropertyNameType_type") :
-            getString("_UI_PropertyNameType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(PropertyNameType.class)) {
-            case FacesConfigPackage.PROPERTY_NAME_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.PROPERTY_NAME_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyResolverTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyResolverTypeItemProvider.java
deleted file mode 100644
index d5e588f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyResolverTypeItemProvider.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.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 --> <!-- end-user-doc -->
- * 
- * @generated
- */
-public class PropertyResolverTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-	/**
-	 * This constructs an instance from a factory and a notifier. <!--
-	 * begin-user-doc --> <!-- 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 --> <!-- 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
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_PropertyResolverType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_PropertyResolverType_id_feature", "_UI_PropertyResolverType_type"),
-                 FacesConfigPackage.Literals.PROPERTY_RESOLVER_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns PropertyResolverType.gif.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/PropertyResolverType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((PropertyResolverType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_PropertyResolverType_type") :
-            getString("_UI_PropertyResolverType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(PropertyResolverType.class)) {
-            case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_PropertyResolverType_type");
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyTypeItemProvider.java
deleted file mode 100644
index 0471c59..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyTypeItemProvider.java
+++ /dev/null
@@ -1,347 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import 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 -->
- * <!-- end-user-doc -->
- * 
- */
-public class PropertyTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource, 
-		ITableItemLabelProvider{
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public PropertyTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addPropertyNamePropertyDescriptor(object);
-            addPropertyClassPropertyDescriptor(object);
-            addDefaultValuePropertyDescriptor(object);
-            addSuggestedValuePropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Property Name feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addPropertyNamePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_PropertyType_propertyName_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_PropertyType_propertyName_feature", "_UI_PropertyType_type"),
-                 FacesConfigPackage.Literals.PROPERTY_TYPE__PROPERTY_NAME,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Property Class feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addPropertyClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_PropertyType_propertyClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_PropertyType_propertyClass_feature", "_UI_PropertyType_type"),
-                 FacesConfigPackage.Literals.PROPERTY_TYPE__PROPERTY_CLASS,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Default Value feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addDefaultValuePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_PropertyType_defaultValue_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_PropertyType_defaultValue_feature", "_UI_PropertyType_type"),
-                 FacesConfigPackage.Literals.PROPERTY_TYPE__DEFAULT_VALUE,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Suggested Value feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addSuggestedValuePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_PropertyType_suggestedValue_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_PropertyType_suggestedValue_feature", "_UI_PropertyType_type"),
-                 FacesConfigPackage.Literals.PROPERTY_TYPE__SUGGESTED_VALUE,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_PropertyType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_PropertyType_id_feature", "_UI_PropertyType_type"),
-                 FacesConfigPackage.Literals.PROPERTY_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.PROPERTY_TYPE__DESCRIPTION);
-            childrenFeatures.add(FacesConfigPackage.Literals.PROPERTY_TYPE__DISPLAY_NAME);
-            childrenFeatures.add(FacesConfigPackage.Literals.PROPERTY_TYPE__ICON);
-            childrenFeatures.add(FacesConfigPackage.Literals.PROPERTY_TYPE__PROPERTY_EXTENSION);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-        // Check the type of the specified child object and return the proper feature to use for
-        // adding (see {@link AddCommand}) it as a child.
-
-        return super.getChildFeature(object, child);
-    }
-
-    /**
-     * This returns PropertyType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/PropertyType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((PropertyType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_PropertyType_type") :
-            getString("_UI_PropertyType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(PropertyType.class)) {
-            case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME:
-            case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS:
-            case FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE:
-            case FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE:
-            case FacesConfigPackage.PROPERTY_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.PROPERTY_TYPE__DESCRIPTION:
-            case FacesConfigPackage.PROPERTY_TYPE__DISPLAY_NAME:
-            case FacesConfigPackage.PROPERTY_TYPE__ICON:
-            case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_EXTENSION:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.PROPERTY_TYPE__DESCRIPTION,
-                 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.PROPERTY_TYPE__DISPLAY_NAME,
-                 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.PROPERTY_TYPE__ICON,
-                 FacesConfigFactory.eINSTANCE.createIconType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.PROPERTY_TYPE__PROPERTY_EXTENSION,
-                 FacesConfigFactory.eINSTANCE.createPropertyExtensionType()));
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	public String getColumnText(Object object, int columnIndex) {
-		PropertyType property = (PropertyType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return property.getPropertyName() == null ? "" : property
-					.getPropertyName().getTextContent();
-		case 1:
-			return property.getPropertyClass() == null ? "" : property
-					.getPropertyClass().getTextContent();
-		case 2:
-			return property.getDefaultValue() == null ? "" : property
-					.getDefaultValue().getTextContent();
-		case 3:
-			return property.getSuggestedValue() == null ? "" : property
-					.getSuggestedValue().getTextContent();
-		}
-		return null;
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RedirectTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RedirectTypeItemProvider.java
deleted file mode 100644
index 32a375e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RedirectTypeItemProvider.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RedirectType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class RedirectTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public RedirectTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_RedirectType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_RedirectType_id_feature", "_UI_RedirectType_type"),
-                 FacesConfigPackage.Literals.REDIRECT_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns RedirectType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/RedirectType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((RedirectType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_RedirectType_type") :
-            getString("_UI_RedirectType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(RedirectType.class)) {
-            case FacesConfigPackage.REDIRECT_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanClassTypeItemProvider.java
deleted file mode 100644
index b41f538..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanClassTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ReferencedBeanClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ReferencedBeanClassType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ReferencedBeanClassType_id_feature", "_UI_ReferencedBeanClassType_type"),
-                 FacesConfigPackage.Literals.REFERENCED_BEAN_CLASS_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns ReferencedBeanClassType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ReferencedBeanClassType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ReferencedBeanClassType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ReferencedBeanClassType_type") :
-            getString("_UI_ReferencedBeanClassType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ReferencedBeanClassType.class)) {
-            case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanNameTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanNameTypeItemProvider.java
deleted file mode 100644
index 50b8e23..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanNameTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ReferencedBeanNameTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ReferencedBeanNameType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ReferencedBeanNameType_id_feature", "_UI_ReferencedBeanNameType_type"),
-                 FacesConfigPackage.Literals.REFERENCED_BEAN_NAME_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns ReferencedBeanNameType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ReferencedBeanNameType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ReferencedBeanNameType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ReferencedBeanNameType_type") :
-            getString("_UI_ReferencedBeanNameType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ReferencedBeanNameType.class)) {
-            case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanTypeItemProvider.java
deleted file mode 100644
index 850990a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanTypeItemProvider.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ReferencedBeanTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ReferencedBeanTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addReferencedBeanNamePropertyDescriptor(object);
-            addReferencedBeanClassPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Referenced Bean Name feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addReferencedBeanNamePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ReferencedBeanType_referencedBeanName_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ReferencedBeanType_referencedBeanName_feature", "_UI_ReferencedBeanType_type"),
-                 FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Referenced Bean Class feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addReferencedBeanClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ReferencedBeanType_referencedBeanClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ReferencedBeanType_referencedBeanClass_feature", "_UI_ReferencedBeanType_type"),
-                 FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ReferencedBeanType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ReferencedBeanType_id_feature", "_UI_ReferencedBeanType_type"),
-                 FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__DESCRIPTION);
-            childrenFeatures.add(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__DISPLAY_NAME);
-            childrenFeatures.add(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__ICON);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-        // Check the type of the specified child object and return the proper feature to use for
-        // adding (see {@link AddCommand}) it as a child.
-
-        return super.getChildFeature(object, child);
-    }
-
-    /**
-     * This returns ReferencedBeanType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ReferencedBeanType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ReferencedBeanType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ReferencedBeanType_type") :
-            getString("_UI_ReferencedBeanType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ReferencedBeanType.class)) {
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME:
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS:
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__DESCRIPTION:
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__DISPLAY_NAME:
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__ICON:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__DESCRIPTION,
-                 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__DISPLAY_NAME,
-                 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__ICON,
-                 FacesConfigFactory.eINSTANCE.createIconType()));
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitClassTypeItemProvider.java
deleted file mode 100644
index 95b0c55..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitClassTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class RenderKitClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_RenderKitClassType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_RenderKitClassType_id_feature", "_UI_RenderKitClassType_type"),
-                 FacesConfigPackage.Literals.RENDER_KIT_CLASS_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns RenderKitClassType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/RenderKitClassType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((RenderKitClassType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_RenderKitClassType_type") :
-            getString("_UI_RenderKitClassType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(RenderKitClassType.class)) {
-            case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitExtensionTypeItemProvider.java
deleted file mode 100644
index 2000cf5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class RenderKitExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public RenderKitExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This returns RenderKitExtensionType.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/RenderKitExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((RenderKitExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_RenderKitExtensionType_type") :
-            getString("_UI_RenderKitExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitFactoryTypeItemProvider.java
deleted file mode 100644
index d2a1580..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitFactoryTypeItemProvider.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.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 --> <!-- end-user-doc -->
- * 
- * @generated
- */
-public class RenderKitFactoryTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-	/**
-	 * This constructs an instance from a factory and a notifier. <!--
-	 * begin-user-doc --> <!-- 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 --> <!-- 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
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_RenderKitFactoryType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_RenderKitFactoryType_id_feature", "_UI_RenderKitFactoryType_type"),
-                 FacesConfigPackage.Literals.RENDER_KIT_FACTORY_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns RenderKitFactoryType.gif.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/RenderKitFactoryType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((RenderKitFactoryType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_RenderKitFactoryType_type") :
-            getString("_UI_RenderKitFactoryType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(RenderKitFactoryType.class)) {
-            case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-
-		switch (columnIndex) {
-
-			case 0:
-				return getText(object);
-			case 1:
-				return getString("_UI_RenderKitFactoryType_type");
-			}
-
-			return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitIdTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitIdTypeItemProvider.java
deleted file mode 100644
index 508321b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitIdTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class RenderKitIdTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_RenderKitIdType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_RenderKitIdType_id_feature", "_UI_RenderKitIdType_type"),
-                 FacesConfigPackage.Literals.RENDER_KIT_ID_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns RenderKitIdType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/RenderKitIdType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((RenderKitIdType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_RenderKitIdType_type") :
-            getString("_UI_RenderKitIdType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(RenderKitIdType.class)) {
-            case FacesConfigPackage.RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.RENDER_KIT_ID_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitTypeItemProvider.java
deleted file mode 100644
index c11e104..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitTypeItemProvider.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import 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.RenderKitType;
-
-/**
- * This is the item provider adapter for a
- * {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType} object. <!--
- * begin-user-doc --> <!-- end-user-doc -->
- * 
- * @generated
- */
-public class RenderKitTypeItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-	/**
-	 * This constructs an instance from a factory and a notifier. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public RenderKitTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addRenderKitIdPropertyDescriptor(object);
-            addRenderKitClassPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-	/**
-	 * This adds a property descriptor for the Render Kit Id feature. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addRenderKitIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_RenderKitType_renderKitId_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_RenderKitType_renderKitId_feature", "_UI_RenderKitType_type"),
-                 FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDER_KIT_ID,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-	/**
-	 * This adds a property descriptor for the Render Kit Class feature. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addRenderKitClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_RenderKitType_renderKitClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_RenderKitType_renderKitClass_feature", "_UI_RenderKitType_type"),
-                 FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDER_KIT_CLASS,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_RenderKitType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_RenderKitType_id_feature", "_UI_RenderKitType_type"),
-                 FacesConfigPackage.Literals.RENDER_KIT_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.RENDER_KIT_TYPE__DESCRIPTION);
-            childrenFeatures.add(FacesConfigPackage.Literals.RENDER_KIT_TYPE__DISPLAY_NAME);
-            childrenFeatures.add(FacesConfigPackage.Literals.RENDER_KIT_TYPE__ICON);
-            childrenFeatures.add(FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDERER);
-            childrenFeatures.add(FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-        // Check the type of the specified child object and return the proper feature to use for
-        // adding (see {@link AddCommand}) it as a child.
-
-        return super.getChildFeature(object, child);
-    }
-
-	/**
-	 * This returns RenderKitType.gif. <!-- begin-user-doc --> <!-- end-user-doc
-	 * -->
-	 * 
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/RenderKitType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((RenderKitType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_RenderKitType_type") :
-            getString("_UI_RenderKitType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(RenderKitType.class)) {
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID:
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS:
-            case FacesConfigPackage.RENDER_KIT_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.RENDER_KIT_TYPE__DESCRIPTION:
-            case FacesConfigPackage.RENDER_KIT_TYPE__DISPLAY_NAME:
-            case FacesConfigPackage.RENDER_KIT_TYPE__ICON:
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDERER:
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.RENDER_KIT_TYPE__DESCRIPTION,
-                 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.RENDER_KIT_TYPE__DISPLAY_NAME,
-                 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.RENDER_KIT_TYPE__ICON,
-                 FacesConfigFactory.eINSTANCE.createIconType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDERER,
-                 FacesConfigFactory.eINSTANCE.createRendererType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION,
-                 FacesConfigFactory.eINSTANCE.createRenderKitExtensionType()));
-    }
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		RenderKitType renderkit = (RenderKitType) object;
-		switch (columnIndex) {
-		case 0:
-			return getText(object);
-		case 1:
-			return renderkit.getRenderKitClass() == null ? "" : renderkit
-					.getRenderKitClass().getTextContent();
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererClassTypeItemProvider.java
deleted file mode 100644
index d42e1bf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererClassTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class RendererClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_RendererClassType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_RendererClassType_id_feature", "_UI_RendererClassType_type"),
-                 FacesConfigPackage.Literals.RENDERER_CLASS_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns RendererClassType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/RendererClassType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((RendererClassType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_RendererClassType_type") :
-            getString("_UI_RendererClassType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(RendererClassType.class)) {
-            case FacesConfigPackage.RENDERER_CLASS_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.RENDERER_CLASS_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererExtensionTypeItemProvider.java
deleted file mode 100644
index 3880162..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class RendererExtensionTypeItemProvider
-	extends ExtensionTypeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public RendererExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This returns RendererExtensionType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/RendererExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((RendererExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_RendererExtensionType_type") :
-            getString("_UI_RendererExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererTypeItemProvider.java
deleted file mode 100644
index 8db67ba..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererTypeItemProvider.java
+++ /dev/null
@@ -1,331 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import 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.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 -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class RendererTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public RendererTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addComponentFamilyPropertyDescriptor(object);
-            addRendererTypePropertyDescriptor(object);
-            addRendererClassPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Component Family feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addComponentFamilyPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_RendererType_componentFamily_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_RendererType_componentFamily_feature", "_UI_RendererType_type"),
-                 FacesConfigPackage.Literals.RENDERER_TYPE__COMPONENT_FAMILY,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Renderer Type feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addRendererTypePropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_RendererType_rendererType_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_RendererType_rendererType_feature", "_UI_RendererType_type"),
-                 FacesConfigPackage.Literals.RENDERER_TYPE__RENDERER_TYPE,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Renderer Class feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addRendererClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_RendererType_rendererClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_RendererType_rendererClass_feature", "_UI_RendererType_type"),
-                 FacesConfigPackage.Literals.RENDERER_TYPE__RENDERER_CLASS,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_RendererType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_RendererType_id_feature", "_UI_RendererType_type"),
-                 FacesConfigPackage.Literals.RENDERER_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__DESCRIPTION);
-            childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__DISPLAY_NAME);
-            childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__ICON);
-            childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__FACET);
-            childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__ATTRIBUTE);
-            childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__RENDERER_EXTENSION);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-        // Check the type of the specified child object and return the proper feature to use for
-        // adding (see {@link AddCommand}) it as a child.
-
-        return super.getChildFeature(object, child);
-    }
-
-    /**
-     * This returns RendererType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/RendererType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((RendererType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_RendererType_type") :
-            getString("_UI_RendererType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(RendererType.class)) {
-            case FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY:
-            case FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE:
-            case FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS:
-            case FacesConfigPackage.RENDERER_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.RENDERER_TYPE__DESCRIPTION:
-            case FacesConfigPackage.RENDERER_TYPE__DISPLAY_NAME:
-            case FacesConfigPackage.RENDERER_TYPE__ICON:
-            case FacesConfigPackage.RENDERER_TYPE__FACET:
-            case FacesConfigPackage.RENDERER_TYPE__ATTRIBUTE:
-            case FacesConfigPackage.RENDERER_TYPE__RENDERER_EXTENSION:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.RENDERER_TYPE__DESCRIPTION,
-                 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.RENDERER_TYPE__DISPLAY_NAME,
-                 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.RENDERER_TYPE__ICON,
-                 FacesConfigFactory.eINSTANCE.createIconType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.RENDERER_TYPE__FACET,
-                 FacesConfigFactory.eINSTANCE.createFacetType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.RENDERER_TYPE__ATTRIBUTE,
-                 FacesConfigFactory.eINSTANCE.createAttributeType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.RENDERER_TYPE__RENDERER_EXTENSION,
-                 FacesConfigFactory.eINSTANCE.createRendererExtensionType()));
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	public String getColumnText(Object object, int columnIndex) {
-		RendererType renderer = (RendererType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return renderer.getDisplayName() == null || renderer.getDisplayName().size()==0 ? ""
-					: ((DisplayNameType) renderer.getDisplayName().get(0)).getTextContent();
-		case 1:
-			return renderer.getComponentFamily() == null ? ""
-					: renderer.getComponentFamily().getTextContent();
-		case 2:
-			return renderer.getRendererType()==null  ? ""
-					: renderer.getRendererType().getTextContent();
-		case 3:
-			return renderer.getRendererClass() == null ? "" : renderer
-					.getRendererClass().getTextContent();
-		}
-		return null;
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		// 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/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 b38e05e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererTypeTypeItemProvider.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.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.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 --> <!-- end-user-doc -->
- * 
- * @generated
- */
-public class RendererTypeTypeItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-	/**
-	 * This constructs an instance from a factory and a notifier. <!--
-	 * begin-user-doc --> <!-- 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 --> <!-- 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
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_RendererTypeType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_RendererTypeType_id_feature", "_UI_RendererTypeType_type"),
-                 FacesConfigPackage.Literals.RENDERER_TYPE_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns RendererTypeType.gif.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/RendererTypeType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((RendererTypeType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_RendererTypeType_type") :
-            getString("_UI_RendererTypeType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(RendererTypeType.class)) {
-            case FacesConfigPackage.RENDERER_TYPE_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.RENDERER_TYPE_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	public String getColumnText(Object object, int columnIndex) {
-		RendererType renderer = (RendererType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return renderer.getDisplayName().get(0) == null ? ""
-					: (String) renderer.getDisplayName().get(0);
-		case 1:
-			return renderer.getRendererClass() == null ? "" : renderer
-					.getRendererClass().getTextContent();
-		case 2:
-			return renderer.getComponentFamily().getTextContent() == null ? ""
-					: renderer.getComponentFamily().getTextContent();
-		case 3:
-			return renderer.getRendererType().getTextContent() == null ? ""
-					: renderer.getRendererType().getTextContent();
-		}
-		return null;
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ResourceBundleTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ResourceBundleTypeItemProvider.java
deleted file mode 100644
index 9d5f3c3..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
- */
-public class ResourceBundleTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * <!-- 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 -->
-     * <!-- 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 -->
-     * <!-- 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 -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ResourceBundleType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ResourceBundleType_id_feature", "_UI_ResourceBundleType_type"),
-                 FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__DESCRIPTION);
-            childrenFeatures.add(FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME);
-            childrenFeatures.add(FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__ICON);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EStructuralFeature getChildFeature(Object object, Object child) {
-        // Check the type of the specified child object and return the proper feature to use for
-        // adding (see {@link AddCommand}) it as a child.
-
-        return super.getChildFeature(object, child);
-    }
-
-    /**
-     * This returns ResourceBundleType.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ResourceBundleType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((ResourceBundleType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ResourceBundleType_type") :
-            getString("_UI_ResourceBundleType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ResourceBundleType.class)) {
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DESCRIPTION:
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME:
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ICON:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__DESCRIPTION,
-                 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME,
-                 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__ICON,
-                 FacesConfigFactory.eINSTANCE.createIconType()));
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SmallIconTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SmallIconTypeItemProvider.java
deleted file mode 100644
index 71ef245..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SmallIconTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SmallIconType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class SmallIconTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_SmallIconType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_SmallIconType_id_feature", "_UI_SmallIconType_type"),
-                 FacesConfigPackage.Literals.SMALL_ICON_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns SmallIconType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/SmallIconType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((SmallIconType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_SmallIconType_type") :
-            getString("_UI_SmallIconType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(SmallIconType.class)) {
-            case FacesConfigPackage.SMALL_ICON_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.SMALL_ICON_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/StateManagerTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/StateManagerTypeItemProvider.java
deleted file mode 100644
index d68c297..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/StateManagerTypeItemProvider.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.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.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.StateManagerType;
-
-/**
- * This is the item provider adapter for a
- * {@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType} object. <!--
- * begin-user-doc --> <!-- end-user-doc -->
- * 
- * @generated
- */
-public class StateManagerTypeItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-	/**
-	 * This constructs an instance from a factory and a notifier. <!--
-	 * begin-user-doc --> <!-- 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 --> <!-- 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
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_StateManagerType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_StateManagerType_id_feature", "_UI_StateManagerType_type"),
-                 FacesConfigPackage.Literals.STATE_MANAGER_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns StateManagerType.gif.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/StateManagerType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((StateManagerType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_StateManagerType_type") :
-            getString("_UI_StateManagerType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(StateManagerType.class)) {
-            case FacesConfigPackage.STATE_MANAGER_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.STATE_MANAGER_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_StateManagerType_type");
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SuggestedValueTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SuggestedValueTypeItemProvider.java
deleted file mode 100644
index 6a2e071..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SuggestedValueTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class SuggestedValueTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_SuggestedValueType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_SuggestedValueType_id_feature", "_UI_SuggestedValueType_type"),
-                 FacesConfigPackage.Literals.SUGGESTED_VALUE_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns SuggestedValueType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/SuggestedValueType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((SuggestedValueType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_SuggestedValueType_type") :
-            getString("_UI_SuggestedValueType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(SuggestedValueType.class)) {
-            case FacesConfigPackage.SUGGESTED_VALUE_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.SUGGESTED_VALUE_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SupportedLocaleTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SupportedLocaleTypeItemProvider.java
deleted file mode 100644
index dbbe830..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SupportedLocaleTypeItemProvider.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType;
-
-/**
- * This is the item provider adapter for a
- * {@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType} object. <!--
- * begin-user-doc --> <!-- end-user-doc -->
- * 
- * @generated
- */
-public class SupportedLocaleTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-	/**
-	 * This constructs an instance from a factory and a notifier. <!--
-	 * begin-user-doc --> <!-- 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 --> <!-- 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
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_SupportedLocaleType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_SupportedLocaleType_id_feature", "_UI_SupportedLocaleType_type"),
-                 FacesConfigPackage.Literals.SUPPORTED_LOCALE_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns SupportedLocaleType.gif.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/SupportedLocaleType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        String label = ((SupportedLocaleType)object).getTextContent();
-        return label == null || label.length() == 0 ?
-            getString("_UI_SupportedLocaleType_type") :
-            label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(SupportedLocaleType.class)) {
-            case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ToViewIdTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ToViewIdTypeItemProvider.java
deleted file mode 100644
index 02fb4a0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ToViewIdTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ToViewIdTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ToViewIdType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ToViewIdType_id_feature", "_UI_ToViewIdType_type"),
-                 FacesConfigPackage.Literals.TO_VIEW_ID_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns ToViewIdType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ToViewIdType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ToViewIdType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ToViewIdType_type") :
-            getString("_UI_ToViewIdType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ToViewIdType.class)) {
-            case FacesConfigPackage.TO_VIEW_ID_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.TO_VIEW_ID_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorClassTypeItemProvider.java
deleted file mode 100644
index 16adf0f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorClassTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ValidatorClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ValidatorClassType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ValidatorClassType_id_feature", "_UI_ValidatorClassType_type"),
-                 FacesConfigPackage.Literals.VALIDATOR_CLASS_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns ValidatorClassType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ValidatorClassType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ValidatorClassType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ValidatorClassType_type") :
-            getString("_UI_ValidatorClassType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ValidatorClassType.class)) {
-            case FacesConfigPackage.VALIDATOR_CLASS_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.VALIDATOR_CLASS_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorExtensionTypeItemProvider.java
deleted file mode 100644
index 7dafc40..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ValidatorExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ValidatorExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This returns ValidatorExtensionType.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ValidatorExtensionType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((ValidatorExtensionType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ValidatorExtensionType_type") :
-            getString("_UI_ValidatorExtensionType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorIdTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorIdTypeItemProvider.java
deleted file mode 100644
index ee3f427..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorIdTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ValidatorIdTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ValidatorIdType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ValidatorIdType_id_feature", "_UI_ValidatorIdType_type"),
-                 FacesConfigPackage.Literals.VALIDATOR_ID_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns ValidatorIdType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ValidatorIdType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ValidatorIdType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ValidatorIdType_type") :
-            getString("_UI_ValidatorIdType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ValidatorIdType.class)) {
-            case FacesConfigPackage.VALIDATOR_ID_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.VALIDATOR_ID_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorTypeItemProvider.java
deleted file mode 100644
index a2bbb78..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorTypeItemProvider.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import 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.ValidatorType;
-
-/**
- * This is the item provider adapter for a
- * {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType} object. <!--
- * begin-user-doc --> <!-- end-user-doc -->
- * 
- * @generated
- */
-public class ValidatorTypeItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-	/**
-	 * This constructs an instance from a factory and a notifier. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ValidatorTypeItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addValidatorIdPropertyDescriptor(object);
-            addValidatorClassPropertyDescriptor(object);
-            addIdPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-	/**
-	 * This adds a property descriptor for the Validator Id feature. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addValidatorIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ValidatorType_validatorId_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ValidatorType_validatorId_feature", "_UI_ValidatorType_type"),
-                 FacesConfigPackage.Literals.VALIDATOR_TYPE__VALIDATOR_ID,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-	/**
-	 * This adds a property descriptor for the Validator Class feature. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addValidatorClassPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ValidatorType_validatorClass_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ValidatorType_validatorClass_feature", "_UI_ValidatorType_type"),
-                 FacesConfigPackage.Literals.VALIDATOR_TYPE__VALIDATOR_CLASS,
-                 true,
-                 false,
-                 false,
-                 null,
-                 null,
-                 null));
-    }
-
-    /**
-     * This adds a property descriptor for the Id feature.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ValidatorType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ValidatorType_id_feature", "_UI_ValidatorType_type"),
-                 FacesConfigPackage.Literals.VALIDATOR_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren(Object)} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand(Object, org.eclipse.emf.edit.domain.EditingDomain, Class, org.eclipse.emf.edit.command.CommandParameter)}.
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public Collection getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(FacesConfigPackage.Literals.VALIDATOR_TYPE__DESCRIPTION);
-            childrenFeatures.add(FacesConfigPackage.Literals.VALIDATOR_TYPE__DISPLAY_NAME);
-            childrenFeatures.add(FacesConfigPackage.Literals.VALIDATOR_TYPE__ICON);
-            childrenFeatures.add(FacesConfigPackage.Literals.VALIDATOR_TYPE__ATTRIBUTE);
-            childrenFeatures.add(FacesConfigPackage.Literals.VALIDATOR_TYPE__PROPERTY);
-            childrenFeatures.add(FacesConfigPackage.Literals.VALIDATOR_TYPE__VALIDATOR_EXTENSION);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-        // Check the type of the specified child object and return the proper feature to use for
-        // adding (see {@link AddCommand}) it as a child.
-
-        return super.getChildFeature(object, child);
-    }
-
-	/**
-	 * This returns ValidatorType.gif. <!-- begin-user-doc --> <!-- end-user-doc
-	 * -->
-	 * 
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ValidatorType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ValidatorType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ValidatorType_type") :
-            getString("_UI_ValidatorType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ValidatorType.class)) {
-            case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID:
-            case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS:
-            case FacesConfigPackage.VALIDATOR_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-            case FacesConfigPackage.VALIDATOR_TYPE__DESCRIPTION:
-            case FacesConfigPackage.VALIDATOR_TYPE__DISPLAY_NAME:
-            case FacesConfigPackage.VALIDATOR_TYPE__ICON:
-            case FacesConfigPackage.VALIDATOR_TYPE__ATTRIBUTE:
-            case FacesConfigPackage.VALIDATOR_TYPE__PROPERTY:
-            case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_EXTENSION:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.VALIDATOR_TYPE__DESCRIPTION,
-                 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.VALIDATOR_TYPE__DISPLAY_NAME,
-                 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.VALIDATOR_TYPE__ICON,
-                 FacesConfigFactory.eINSTANCE.createIconType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.VALIDATOR_TYPE__ATTRIBUTE,
-                 FacesConfigFactory.eINSTANCE.createAttributeType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.VALIDATOR_TYPE__PROPERTY,
-                 FacesConfigFactory.eINSTANCE.createPropertyType()));
-
-        newChildDescriptors.add
-            (createChildParameter
-                (FacesConfigPackage.Literals.VALIDATOR_TYPE__VALIDATOR_EXTENSION,
-                 FacesConfigFactory.eINSTANCE.createValidatorExtensionType()));
-    }
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		ValidatorType validator = (ValidatorType) object;
-		switch (columnIndex) {
-		case 0:
-			return getText(object);
-		case 1:
-			return validator.getValidatorClass() == null ? "" : validator
-					.getValidatorClass().getTextContent();
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValueClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValueClassTypeItemProvider.java
deleted file mode 100644
index 306ed39..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValueClassTypeItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ValueClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ValueClassType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ValueClassType_id_feature", "_UI_ValueClassType_type"),
-                 FacesConfigPackage.Literals.VALUE_CLASS_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns ValueClassType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ValueClassType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ValueClassType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ValueClassType_type") :
-            getString("_UI_ValueClassType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ValueClassType.class)) {
-            case FacesConfigPackage.VALUE_CLASS_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.VALUE_CLASS_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValueTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValueTypeItemProvider.java
deleted file mode 100644
index fe36afa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValueTypeItemProvider.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValueType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class ValueTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ValueType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ValueType_id_feature", "_UI_ValueType_type"),
-                 FacesConfigPackage.Literals.VALUE_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns ValueType.gif.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ValueType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ValueType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ValueType_type") :
-            getString("_UI_ValueType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ValueType.class)) {
-            case FacesConfigPackage.VALUE_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.VALUE_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	public String getColumnText(Object object, int columnIndex) {
-
-		ValueType value = (ValueType)object;
-		return value.getTextContent();
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		// 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/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 a1975ee..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
- */
-public class VarTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * <!-- 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 -->
-     * <!-- 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 -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_VarType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_VarType_id_feature", "_UI_VarType_type"),
-                 FacesConfigPackage.Literals.VAR_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns VarType.gif.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/VarType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getText(Object object) {
-        String label = ((VarType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_VarType_type") :
-            getString("_UI_VarType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(VarType.class)) {
-            case FacesConfigPackage.VAR_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.VAR_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-    /**
-     * Return the resource locator for this item provider's resources.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VariableResolverTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VariableResolverTypeItemProvider.java
deleted file mode 100644
index ffe5531..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VariableResolverTypeItemProvider.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.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.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.VariableResolverType;
-
-/**
- * This is the item provider adapter for a
- * {@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType} object. <!--
- * begin-user-doc --> <!-- end-user-doc -->
- * 
- * @generated
- */
-public class VariableResolverTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-	/**
-	 * This constructs an instance from a factory and a notifier. <!--
-	 * begin-user-doc --> <!-- 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 --> <!-- 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
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_VariableResolverType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_VariableResolverType_id_feature", "_UI_VariableResolverType_type"),
-                 FacesConfigPackage.Literals.VARIABLE_RESOLVER_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns VariableResolverType.gif.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/VariableResolverType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((VariableResolverType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_VariableResolverType_type") :
-            getString("_UI_VariableResolverType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(VariableResolverType.class)) {
-            case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_VariableResolverType_type");
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ViewHandlerTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ViewHandlerTypeItemProvider.java
deleted file mode 100644
index 2b766d2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ViewHandlerTypeItemProvider.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.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.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.ViewHandlerType;
-
-/**
- * This is the item provider adapter for a
- * {@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType} object. <!--
- * begin-user-doc --> <!-- end-user-doc -->
- * 
- * @generated
- */
-public class ViewHandlerTypeItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-     * <!-- begin-user-doc --> <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-	/**
-	 * This constructs an instance from a factory and a notifier. <!--
-	 * begin-user-doc --> <!-- 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 --> <!-- 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
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void addIdPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add
-            (createItemPropertyDescriptor
-                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-                 getResourceLocator(),
-                 getString("_UI_ViewHandlerType_id_feature"),
-                 getString("_UI_PropertyDescriptor_description", "_UI_ViewHandlerType_id_feature", "_UI_ViewHandlerType_type"),
-                 FacesConfigPackage.Literals.VIEW_HANDLER_TYPE__ID,
-                 true,
-                 false,
-                 false,
-                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-                 null,
-                 null));
-    }
-
-    /**
-     * This returns ViewHandlerType.gif.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public Object getImage(Object object) {
-        return overlayImage(object, getResourceLocator().getImage("full/obj16/ViewHandlerType"));
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	public String getText(Object object) {
-        String label = ((ViewHandlerType)object).getId();
-        return label == null || label.length() == 0 ?
-            getString("_UI_ViewHandlerType_type") :
-            getString("_UI_ViewHandlerType_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren(Notification)} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged(Notification)}.
-     * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-     * @generated
-     */
-	public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(ViewHandlerType.class)) {
-            case FacesConfigPackage.VIEW_HANDLER_TYPE__TEXT_CONTENT:
-            case FacesConfigPackage.VIEW_HANDLER_TYPE__ID:
-                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-                return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-     * describing all of the children that can be created under this object.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated
-     */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-    }
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-        return FacesConfigPlugin.INSTANCE;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_ViewHandlerType_type");
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ActionListenerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ActionListenerType.java
deleted file mode 100644
index 1cd8da8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ActionListenerType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Action Listener Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getActionListenerType()
- * @model extendedMetaData="name='action-listener_._type' kind='simple'"
- * @generated
- */
-public interface ActionListenerType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getActionListenerType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getActionListenerType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ActionListenerType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationExtensionType.java
deleted file mode 100644
index 52d1767..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Application Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationExtensionType()
- * @model extendedMetaData="name='application-extension_._type'"
- * @generated
- */
-public interface ApplicationExtensionType extends ExtensionType {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-} // ApplicationExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationFactoryType.java
deleted file mode 100644
index e8ee002..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Application Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationFactoryType()
- * @model extendedMetaData="name='application-factory_._type' kind='simple'"
- * @generated
- */
-public interface ApplicationFactoryType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationFactoryType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationFactoryType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ApplicationFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationType.java
deleted file mode 100644
index 0d821f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationType.java
+++ /dev/null
@@ -1,285 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Application Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getActionListener <em>Action Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getDefaultRenderKitId <em>Default Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getMessageBundle <em>Message Bundle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getNavigationHandler <em>Navigation Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getViewHandler <em>View Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getStateManager <em>State Manager</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getPropertyResolver <em>Property Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getVariableResolver <em>Variable Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getLocaleConfig <em>Locale Config</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getELResolver <em>EL Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getResourceBundle <em>Resource Bundle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getApplicationExtension <em>Application Extension</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType()
- * @model extendedMetaData="name='application_._type' kind='elementOnly'"
- * @generated
- */
-public interface ApplicationType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Action Listener</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Action Listener</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Action Listener</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_ActionListener()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType" containment="true"
-     *        extendedMetaData="kind='element' name='action-listener' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getActionListener();
-
-    /**
-     * Returns the value of the '<em><b>Default Render Kit Id</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Render Kit Id</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Default Render Kit Id</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_DefaultRenderKitId()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType" containment="true"
-     *        extendedMetaData="kind='element' name='default-render-kit-id' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDefaultRenderKitId();
-
-    /**
-     * Returns the value of the '<em><b>Message Bundle</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Message Bundle</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Message Bundle</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_MessageBundle()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType" containment="true"
-     *        extendedMetaData="kind='element' name='message-bundle' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getMessageBundle();
-
-    /**
-     * Returns the value of the '<em><b>Navigation Handler</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Navigation Handler</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Navigation Handler</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_NavigationHandler()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType" containment="true"
-     *        extendedMetaData="kind='element' name='navigation-handler' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getNavigationHandler();
-
-    /**
-     * Returns the value of the '<em><b>View Handler</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>View Handler</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>View Handler</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_ViewHandler()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType" containment="true"
-     *        extendedMetaData="kind='element' name='view-handler' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getViewHandler();
-
-    /**
-     * Returns the value of the '<em><b>State Manager</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>State Manager</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>State Manager</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_StateManager()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.StateManagerType" containment="true"
-     *        extendedMetaData="kind='element' name='state-manager' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getStateManager();
-
-    /**
-     * Returns the value of the '<em><b>Property Resolver</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property Resolver</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Property Resolver</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_PropertyResolver()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType" containment="true"
-     *        extendedMetaData="kind='element' name='property-resolver' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getPropertyResolver();
-
-    /**
-     * Returns the value of the '<em><b>Variable Resolver</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Variable Resolver</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Variable Resolver</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_VariableResolver()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType" containment="true"
-     *        extendedMetaData="kind='element' name='variable-resolver' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getVariableResolver();
-
-    /**
-     * Returns the value of the '<em><b>Locale Config</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Locale Config</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Locale Config</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_LocaleConfig()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType" containment="true"
-     *        extendedMetaData="kind='element' name='locale-config' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getLocaleConfig();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-    /**
-     * Returns the value of the '<em><b>EL Resolver</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>EL Resolver</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>EL Resolver</em>' reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_ELResolver()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.ELResolverType"
-     *        extendedMetaData="kind='element' name='el-resolver' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList getELResolver();
-
-    /**
-     * Returns the value of the '<em><b>Resource Bundle</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Resource Bundle</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Resource Bundle</em>' reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_ResourceBundle()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType"
-     *        extendedMetaData="kind='element' name='resource-bundle' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList getResourceBundle();
-
-    /**
-     * Returns the value of the '<em><b>Application Extension</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Application Extension</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Application Extension</em>' reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_ApplicationExtension()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType"
-     *        extendedMetaData="kind='element' name='application-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList getApplicationExtension();
-
-} // ApplicationType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeClassType.java
deleted file mode 100644
index a475d58..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Attribute Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeClassType()
- * @model extendedMetaData="name='attribute-class_._type' kind='simple'"
- * @generated
- */
-public interface AttributeClassType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeClassType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeClassType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // AttributeClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeExtensionType.java
deleted file mode 100644
index ca7a3a8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Attribute Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeExtensionType()
- * @model extendedMetaData="name='attribute-extension_._type'"
- * @generated
- */
-public interface AttributeExtensionType extends ExtensionType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-} // AttributeExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeNameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeNameType.java
deleted file mode 100644
index faf77fa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeNameType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Attribute Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeNameType()
- * @model extendedMetaData="name='attribute-name_._type' kind='simple'"
- * @generated
- */
-public interface AttributeNameType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeNameType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeNameType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // AttributeNameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeType.java
deleted file mode 100644
index 240ee29..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeType.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Attribute Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeName <em>Attribute Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeClass <em>Attribute Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDefaultValue <em>Default Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getSuggestedValue <em>Suggested Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeExtension <em>Attribute Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType()
- * @model extendedMetaData="name='attribute_._type' kind='elementOnly'"
- * @generated
- */
-public interface AttributeType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Description</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_Description()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-     *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDescription();
-
-    /**
-     * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Display Name</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_DisplayName()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-     *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDisplayName();
-
-    /**
-     * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Icon</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_Icon()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-     *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getIcon();
-
-    /**
-     * Returns the value of the '<em><b>Attribute Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute Name</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Attribute Name</em>' containment reference.
-     * @see #setAttributeName(AttributeNameType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_AttributeName()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='attribute-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	AttributeNameType getAttributeName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeName <em>Attribute Name</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Attribute Name</em>' containment reference.
-     * @see #getAttributeName()
-     * @generated
-     */
-	void setAttributeName(AttributeNameType value);
-
-    /**
-     * Returns the value of the '<em><b>Attribute Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Attribute Class</em>' containment reference.
-     * @see #setAttributeClass(AttributeClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_AttributeClass()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='attribute-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	AttributeClassType getAttributeClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeClass <em>Attribute Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Attribute Class</em>' containment reference.
-     * @see #getAttributeClass()
-     * @generated
-     */
-	void setAttributeClass(AttributeClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Default Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Default Value</em>' containment reference.
-     * @see #setDefaultValue(DefaultValueType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_DefaultValue()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='default-value' namespace='##targetNamespace'"
-     * @generated
-     */
-	DefaultValueType getDefaultValue();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDefaultValue <em>Default Value</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Default Value</em>' containment reference.
-     * @see #getDefaultValue()
-     * @generated
-     */
-	void setDefaultValue(DefaultValueType value);
-
-    /**
-     * Returns the value of the '<em><b>Suggested Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Suggested Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Suggested Value</em>' containment reference.
-     * @see #setSuggestedValue(SuggestedValueType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_SuggestedValue()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='suggested-value' namespace='##targetNamespace'"
-     * @generated
-     */
-	SuggestedValueType getSuggestedValue();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getSuggestedValue <em>Suggested Value</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Suggested Value</em>' containment reference.
-     * @see #getSuggestedValue()
-     * @generated
-     */
-	void setSuggestedValue(SuggestedValueType value);
-
-    /**
-     * Returns the value of the '<em><b>Attribute Extension</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute Extension</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Attribute Extension</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_AttributeExtension()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType" containment="true"
-     *        extendedMetaData="kind='element' name='attribute-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getAttributeExtension();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // AttributeType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BaseNameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BaseNameType.java
deleted file mode 100644
index 744cdb8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BaseNameType.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Base Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBaseNameType()
- * @model extendedMetaData="name='base-name_._type' kind='simple'"
- * @generated
- */
-public interface BaseNameType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBaseNameType_TextContent()
-     * @model extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-    String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-    void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBaseNameType_Id()
-     * @model id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-    String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-    void setId(String value);
-
-} // BaseNameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentClassType.java
deleted file mode 100644
index c8f27a8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Component Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentClassType()
- * @model extendedMetaData="name='component-class_._type' kind='simple'"
- * @generated
- */
-public interface ComponentClassType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentClassType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentClassType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ComponentClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentExtensionType.java
deleted file mode 100644
index b411123..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Component Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentExtensionType()
- * @model extendedMetaData="name='component-extension_._type'"
- * @generated
- */
-public interface ComponentExtensionType extends ExtensionType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-} // ComponentExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentFamilyType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentFamilyType.java
deleted file mode 100644
index 1a6d729..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentFamilyType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Component Family Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentFamilyType()
- * @model extendedMetaData="name='component-family_._type' kind='simple'"
- * @generated
- */
-public interface ComponentFamilyType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentFamilyType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentFamilyType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ComponentFamilyType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentType.java
deleted file mode 100644
index 9d00c3e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentType.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Component Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentType <em>Component Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentClass <em>Component Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getFacet <em>Facet</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentExtension <em>Component Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType()
- * @model extendedMetaData="name='component_._type' kind='elementOnly'"
- * @generated
- */
-public interface ComponentType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Description</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_Description()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-     *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDescription();
-
-    /**
-     * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Display Name</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_DisplayName()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-     *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDisplayName();
-
-    /**
-     * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Icon</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_Icon()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-     *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getIcon();
-
-    /**
-     * Returns the value of the '<em><b>Component Type</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Component Type</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Component Type</em>' containment reference.
-     * @see #setComponentType(ComponentTypeType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_ComponentType()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='component-type' namespace='##targetNamespace'"
-     * @generated
-     */
-	ComponentTypeType getComponentType();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentType <em>Component Type</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Component Type</em>' containment reference.
-     * @see #getComponentType()
-     * @generated
-     */
-	void setComponentType(ComponentTypeType value);
-
-    /**
-     * Returns the value of the '<em><b>Component Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Component Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Component Class</em>' containment reference.
-     * @see #setComponentClass(ComponentClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_ComponentClass()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='component-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	ComponentClassType getComponentClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentClass <em>Component Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Component Class</em>' containment reference.
-     * @see #getComponentClass()
-     * @generated
-     */
-	void setComponentClass(ComponentClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Facet</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.FacetType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Facet</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Facet</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_Facet()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.FacetType" containment="true"
-     *        extendedMetaData="kind='element' name='facet' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getFacet();
-
-    /**
-     * Returns the value of the '<em><b>Attribute</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Attribute</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_Attribute()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.AttributeType" containment="true"
-     *        extendedMetaData="kind='element' name='attribute' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getAttribute();
-
-    /**
-     * Returns the value of the '<em><b>Property</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Property</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_Property()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.PropertyType" containment="true"
-     *        extendedMetaData="kind='element' name='property' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getProperty();
-
-    /**
-     * Returns the value of the '<em><b>Component Extension</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Component Extension</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Component Extension</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_ComponentExtension()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType" containment="true"
-     *        extendedMetaData="kind='element' name='component-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getComponentExtension();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ComponentType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentTypeType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentTypeType.java
deleted file mode 100644
index f040c18..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentTypeType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Component Type Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentTypeType()
- * @model extendedMetaData="name='component-type_._type' kind='simple'"
- * @generated
- */
-public interface ComponentTypeType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentTypeType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentTypeType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ComponentTypeType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterClassType.java
deleted file mode 100644
index 3c8a082..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Converter Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterClassType()
- * @model extendedMetaData="name='converter-class_._type' kind='simple'"
- * @generated
- */
-public interface ConverterClassType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterClassType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterClassType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ConverterClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterExtensionType.java
deleted file mode 100644
index de8df31..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Converter Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterExtensionType()
- * @model extendedMetaData="name='converter-extension_._type'"
- * @generated
- */
-public interface ConverterExtensionType extends ExtensionType {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-} // ConverterExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterForClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterForClassType.java
deleted file mode 100644
index 9865d29..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterForClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Converter For Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterForClassType()
- * @model extendedMetaData="name='converter-for-class_._type' kind='simple'"
- * @generated
- */
-public interface ConverterForClassType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterForClassType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterForClassType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ConverterForClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterIdType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterIdType.java
deleted file mode 100644
index f52a97b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterIdType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Converter Id Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterIdType()
- * @model extendedMetaData="name='converter-id_._type' kind='simple'"
- * @generated
- */
-public interface ConverterIdType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterIdType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterIdType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ConverterIdType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterType.java
deleted file mode 100644
index c3586a0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterType.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Converter Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterId <em>Converter Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterForClass <em>Converter For Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterClass <em>Converter Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterExtension <em>Converter Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType()
- * @model extendedMetaData="name='converter_._type' kind='elementOnly'"
- * @generated
- */
-public interface ConverterType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Description</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_Description()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-     *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDescription();
-
-    /**
-     * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Display Name</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_DisplayName()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-     *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDisplayName();
-
-    /**
-     * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Icon</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_Icon()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-     *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getIcon();
-
-    /**
-     * Returns the value of the '<em><b>Converter Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Converter Id</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Converter Id</em>' containment reference.
-     * @see #setConverterId(ConverterIdType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_ConverterId()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='converter-id' namespace='##targetNamespace'"
-     * @generated
-     */
-	ConverterIdType getConverterId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterId <em>Converter Id</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Converter Id</em>' containment reference.
-     * @see #getConverterId()
-     * @generated
-     */
-	void setConverterId(ConverterIdType value);
-
-    /**
-     * Returns the value of the '<em><b>Converter For Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Converter For Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Converter For Class</em>' containment reference.
-     * @see #setConverterForClass(ConverterForClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_ConverterForClass()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='converter-for-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	ConverterForClassType getConverterForClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterForClass <em>Converter For Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Converter For Class</em>' containment reference.
-     * @see #getConverterForClass()
-     * @generated
-     */
-	void setConverterForClass(ConverterForClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Converter Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Converter Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Converter Class</em>' containment reference.
-     * @see #setConverterClass(ConverterClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_ConverterClass()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='converter-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	ConverterClassType getConverterClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterClass <em>Converter Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Converter Class</em>' containment reference.
-     * @see #getConverterClass()
-     * @generated
-     */
-	void setConverterClass(ConverterClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Attribute</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Attribute</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_Attribute()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.AttributeType" containment="true"
-     *        extendedMetaData="kind='element' name='attribute' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getAttribute();
-
-    /**
-     * Returns the value of the '<em><b>Property</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Property</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_Property()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.PropertyType" containment="true"
-     *        extendedMetaData="kind='element' name='property' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getProperty();
-
-    /**
-     * Returns the value of the '<em><b>Converter Extension</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Converter Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Converter Extension</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_ConverterExtension()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType" containment="true"
-     *        extendedMetaData="kind='element' name='converter-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList getConverterExtension();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ConverterType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultLocaleType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultLocaleType.java
deleted file mode 100644
index 0f9e244..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultLocaleType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Default Locale Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultLocaleType()
- * @model extendedMetaData="name='default-locale_._type' kind='simple'"
- * @generated
- */
-public interface DefaultLocaleType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultLocaleType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultLocaleType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // DefaultLocaleType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultRenderKitIdType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultRenderKitIdType.java
deleted file mode 100644
index 9f5b875..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultRenderKitIdType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Default Render Kit Id Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultRenderKitIdType()
- * @model extendedMetaData="name='default-render-kit-id_._type' kind='simple'"
- * @generated
- */
-public interface DefaultRenderKitIdType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultRenderKitIdType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultRenderKitIdType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // DefaultRenderKitIdType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultValueType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultValueType.java
deleted file mode 100644
index d3f9c37..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultValueType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Default Value Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultValueType()
- * @model extendedMetaData="name='default-value_._type' kind='simple'"
- * @generated
- */
-public interface DefaultValueType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultValueType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultValueType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // DefaultValueType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DescriptionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DescriptionType.java
deleted file mode 100644
index 5ed46d0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DescriptionType.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Description Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getLang <em>Lang</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDescriptionType()
- * @model extendedMetaData="name='description_._type' kind='simple'"
- * @generated
- */
-public interface DescriptionType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDescriptionType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Lang</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Lang</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Lang</em>' attribute.
-     * @see #setLang(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDescriptionType_Lang()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Language"
-     *        extendedMetaData="kind='attribute' name='lang' namespace='http://www.w3.org/XML/1998/namespace'"
-     * @generated
-     */
-	String getLang();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getLang <em>Lang</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Lang</em>' attribute.
-     * @see #getLang()
-     * @generated
-     */
-	void setLang(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDescriptionType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // DescriptionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DisplayNameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DisplayNameType.java
deleted file mode 100644
index cc8a279..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DisplayNameType.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Display Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getLang <em>Lang</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDisplayNameType()
- * @model extendedMetaData="name='display-name_._type' kind='simple'"
- * @generated
- */
-public interface DisplayNameType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDisplayNameType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Lang</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Lang</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Lang</em>' attribute.
-     * @see #setLang(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDisplayNameType_Lang()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Language"
-     *        extendedMetaData="kind='attribute' name='lang' namespace='http://www.w3.org/XML/1998/namespace'"
-     * @generated
-     */
-	String getLang();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getLang <em>Lang</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Lang</em>' attribute.
-     * @see #getLang()
-     * @generated
-     */
-	void setLang(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDisplayNameType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // DisplayNameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DocumentRoot.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DocumentRoot.java
deleted file mode 100644
index 6ceae10..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DocumentRoot.java
+++ /dev/null
@@ -1,2589 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EMap;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Document Root</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMixed <em>Mixed</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getXMLNSPrefixMap <em>XMLNS Prefix Map</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getXSISchemaLocation <em>XSI Schema Location</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getActionListener <em>Action Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplication <em>Application</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplicationFactory <em>Application Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeClass <em>Attribute Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeExtension <em>Attribute Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeName <em>Attribute Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponent <em>Component</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentClass <em>Component Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentExtension <em>Component Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentFamily <em>Component Family</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentType <em>Component Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverter <em>Converter</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterClass <em>Converter Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterForClass <em>Converter For Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterId <em>Converter Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultLocale <em>Default Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultRenderKitId <em>Default Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultValue <em>Default Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesConfig <em>Faces Config</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesContextFactory <em>Faces Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacet <em>Facet</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetExtension <em>Facet Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetName <em>Facet Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFactory <em>Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromAction <em>From Action</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromOutcome <em>From Outcome</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromViewId <em>From View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKey <em>Key</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKeyClass <em>Key Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLargeIcon <em>Large Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycle <em>Lifecycle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycleFactory <em>Lifecycle Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getListEntries <em>List Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLocaleConfig <em>Locale Config</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBean <em>Managed Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanClass <em>Managed Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanName <em>Managed Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanScope <em>Managed Bean Scope</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedProperty <em>Managed Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntries <em>Map Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntry <em>Map Entry</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMessageBundle <em>Message Bundle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationCase <em>Navigation Case</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationHandler <em>Navigation Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationRule <em>Navigation Rule</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPhaseListener <em>Phase Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyClass <em>Property Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyExtension <em>Property Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyName <em>Property Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyResolver <em>Property Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRedirect <em>Redirect</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBean <em>Referenced Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanClass <em>Referenced Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanName <em>Referenced Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderer <em>Renderer</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererClass <em>Renderer Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererExtension <em>Renderer Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererType <em>Renderer Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKit <em>Render Kit</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitClass <em>Render Kit Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitFactory <em>Render Kit Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitId <em>Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSmallIcon <em>Small Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getStateManager <em>State Manager</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSuggestedValue <em>Suggested Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSupportedLocale <em>Supported Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getToViewId <em>To View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidator <em>Validator</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorClass <em>Validator Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorId <em>Validator Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValueClass <em>Value Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getVariableResolver <em>Variable Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getViewHandler <em>View Handler</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot()
- * @model extendedMetaData="name='' kind='mixed'"
- * @generated
- */
-public interface DocumentRoot extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Mixed</b></em>' attribute list.
-     * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Mixed</em>' attribute list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Mixed</em>' attribute list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Mixed()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-     *        extendedMetaData="kind='elementWildcard' name=':mixed'"
-     * @generated
-     */
-	FeatureMap getMixed();
-
-    /**
-     * Returns the value of the '<em><b>XMLNS Prefix Map</b></em>' map.
-     * The key is of type {@link java.lang.String},
-     * and the value is of type {@link java.lang.String},
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>XMLNS Prefix Map</em>' map isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>XMLNS Prefix Map</em>' map.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_XMLNSPrefixMap()
-     * @model mapType="org.eclipse.emf.ecore.EStringToStringMapEntry" keyType="java.lang.String" valueType="java.lang.String" transient="true"
-     *        extendedMetaData="kind='attribute' name='xmlns:prefix'"
-     * @generated
-     */
-	EMap getXMLNSPrefixMap();
-
-    /**
-     * Returns the value of the '<em><b>XSI Schema Location</b></em>' map.
-     * The key is of type {@link java.lang.String},
-     * and the value is of type {@link java.lang.String},
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>XSI Schema Location</em>' map isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>XSI Schema Location</em>' map.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_XSISchemaLocation()
-     * @model mapType="org.eclipse.emf.ecore.EStringToStringMapEntry" keyType="java.lang.String" valueType="java.lang.String" transient="true"
-     *        extendedMetaData="kind='attribute' name='xsi:schemaLocation'"
-     * @generated
-     */
-	EMap getXSISchemaLocation();
-
-    /**
-     * Returns the value of the '<em><b>Action Listener</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *  ==================== Subordinate
-     *                 Elements ============================       The
-     *                 "action-listener" element contains the fully
-     *                 qualified class name     of the concrete ActionListener
-     *                 implementation class that will be called     during the
-     *                 Invoke Application phase of the request processing
-     *                 lifecycle.     It must be of type "ClassName". 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Action Listener</em>' containment reference.
-     * @see #setActionListener(ActionListenerType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ActionListener()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='action-listener' namespace='##targetNamespace'"
-     * @generated
-     */
-	ActionListenerType getActionListener();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getActionListener <em>Action Listener</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Action Listener</em>' containment reference.
-     * @see #getActionListener()
-     * @generated
-     */
-	void setActionListener(ActionListenerType value);
-
-    /**
-     * Returns the value of the '<em><b>Application</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *  ==================== Definition Elements
-     *                 =============================       The
-     *                 "application" element provides a mechanism to
-     *                 define the various     per-application-singleton
-     *                 implementation classes for a particular web
-     *                 application that is utilizing JavaServer Faces.  For
-     *                 nested elements     that are not specified, the JSF
-     *                 implementation must provide a suitable     default. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Application</em>' containment reference.
-     * @see #setApplication(ApplicationType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Application()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='application' namespace='##targetNamespace'"
-     * @generated
-     */
-	ApplicationType getApplication();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplication <em>Application</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Application</em>' containment reference.
-     * @see #getApplication()
-     * @generated
-     */
-	void setApplication(ApplicationType value);
-
-    /**
-     * Returns the value of the '<em><b>Application Factory</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "application-factory"
-     *                 element contains the fully qualified class     name of
-     *                 the concrete ApplicationFactory implementation class
-     *                 that     will be called when
-     *                 FactoryFinder.getFactory(APPLICATION_FACTORY) is
-     *                 called. It must be of type "ClassName". 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Application Factory</em>' containment reference.
-     * @see #setApplicationFactory(ApplicationFactoryType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ApplicationFactory()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='application-factory' namespace='##targetNamespace'"
-     * @generated
-     */
-	ApplicationFactoryType getApplicationFactory();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplicationFactory <em>Application Factory</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Application Factory</em>' containment reference.
-     * @see #getApplicationFactory()
-     * @generated
-     */
-	void setApplicationFactory(ApplicationFactoryType value);
-
-    /**
-     * Returns the value of the '<em><b>Attribute</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "attribute" element
-     *                 represents a named, typed, value associated with     the
-     *                 parent UIComponent via the generic attributes mechanism.
-     *                 Attribute names must be unique within the scope of the
-     *                 parent (or related)     component. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Attribute</em>' containment reference.
-     * @see #setAttribute(AttributeType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Attribute()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='attribute' namespace='##targetNamespace'"
-     * @generated
-     */
-	AttributeType getAttribute();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttribute <em>Attribute</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Attribute</em>' containment reference.
-     * @see #getAttribute()
-     * @generated
-     */
-	void setAttribute(AttributeType value);
-
-    /**
-     * Returns the value of the '<em><b>Attribute Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "attribute-class" element represents the Java type of the value
-     *     associated with this attribute name.  It must be of type "ClassName".
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Attribute Class</em>' containment reference.
-     * @see #setAttributeClass(AttributeClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_AttributeClass()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='attribute-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	AttributeClassType getAttributeClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeClass <em>Attribute Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Attribute Class</em>' containment reference.
-     * @see #getAttributeClass()
-     * @generated
-     */
-	void setAttributeClass(AttributeClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Attribute Extension</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *       Extension element for attribute.
-     *                 May contain implementation     specific content. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Attribute Extension</em>' containment reference.
-     * @see #setAttributeExtension(AttributeExtensionType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_AttributeExtension()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='attribute-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-	AttributeExtensionType getAttributeExtension();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeExtension <em>Attribute Extension</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Attribute Extension</em>' containment reference.
-     * @see #getAttributeExtension()
-     * @generated
-     */
-	void setAttributeExtension(AttributeExtensionType value);
-
-    /**
-     * Returns the value of the '<em><b>Attribute Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "attribute-name"
-     *                 element represents the name under which the
-     *                 corresponding value will be stored, in the generic
-     *                 attributes of the     UIComponent we are related to. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Attribute Name</em>' containment reference.
-     * @see #setAttributeName(AttributeNameType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_AttributeName()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='attribute-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	AttributeNameType getAttributeName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeName <em>Attribute Name</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Attribute Name</em>' containment reference.
-     * @see #getAttributeName()
-     * @generated
-     */
-	void setAttributeName(AttributeNameType value);
-
-    /**
-     * Returns the value of the '<em><b>Component</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "component" element
-     *                 represents a concrete UIComponent implementation
-     *                 class that should be registered under the specified type
-     *                 identifier,     along with its associated properties and
-     *                 attributes.  Component types must     be unique within
-     *                 the entire web application.      Nested
-     *                 "attribute" elements identify generic
-     *                 attributes that are recognized     by the implementation
-     *                 logic of this component.  Nested "property"
-     *                 elements     identify JavaBeans properties of the
-     *                 component class that may be exposed     for manipulation
-     *                 via tools. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Component</em>' containment reference.
-     * @see #setComponent(ComponentType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Component()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='component' namespace='##targetNamespace'"
-     * @generated
-     */
-	ComponentType getComponent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponent <em>Component</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Component</em>' containment reference.
-     * @see #getComponent()
-     * @generated
-     */
-	void setComponent(ComponentType value);
-
-    /**
-     * Returns the value of the '<em><b>Component Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "component-class"
-     *                 element represents the fully qualified class name     of
-     *                 a concrete UIComponent implementation class.  It must be
-     *                 of     type "ClassName". 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Component Class</em>' containment reference.
-     * @see #setComponentClass(ComponentClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ComponentClass()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='component-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	ComponentClassType getComponentClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentClass <em>Component Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Component Class</em>' containment reference.
-     * @see #getComponentClass()
-     * @generated
-     */
-	void setComponentClass(ComponentClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Component Extension</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *       Extension element for component.
-     *                 May contain implementation     specific content. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Component Extension</em>' containment reference.
-     * @see #setComponentExtension(ComponentExtensionType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ComponentExtension()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='component-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-	ComponentExtensionType getComponentExtension();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentExtension <em>Component Extension</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Component Extension</em>' containment reference.
-     * @see #getComponentExtension()
-     * @generated
-     */
-	void setComponentExtension(ComponentExtensionType value);
-
-    /**
-     * Returns the value of the '<em><b>Component Family</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "component-family" element represents the component family for
-     *     which the Renderer represented by the parent "renderer" element will be
-     *     used.
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Component Family</em>' containment reference.
-     * @see #setComponentFamily(ComponentFamilyType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ComponentFamily()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='component-family' namespace='##targetNamespace'"
-     * @generated
-     */
-	ComponentFamilyType getComponentFamily();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentFamily <em>Component Family</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Component Family</em>' containment reference.
-     * @see #getComponentFamily()
-     * @generated
-     */
-	void setComponentFamily(ComponentFamilyType value);
-
-    /**
-     * Returns the value of the '<em><b>Component Type</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "component-type"
-     *                 element represents the name under which the
-     *                 corresponding UIComponent class should be registered. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Component Type</em>' containment reference.
-     * @see #setComponentType(ComponentTypeType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ComponentType()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='component-type' namespace='##targetNamespace'"
-     * @generated
-     */
-	ComponentTypeType getComponentType();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentType <em>Component Type</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Component Type</em>' containment reference.
-     * @see #getComponentType()
-     * @generated
-     */
-	void setComponentType(ComponentTypeType value);
-
-    /**
-     * Returns the value of the '<em><b>Converter</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "converter" element
-     *                 represents a concrete Converter implementation     class
-     *                 that should be registered under the specified converter
-     *                 identifier.     Converter identifiers must be unique
-     *                 within the entire web application.      Nested
-     *                 "attribute" elements identify generic
-     *                 attributes that may be     configured on the
-     *                 corresponding UIComponent in order to affect the
-     *                 operation of the Converter.  Nested "property"
-     *                 elements identify JavaBeans     properties of the
-     *                 Converter implementation class that may be configured
-     *                 to affect the operation of the Converter. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Converter</em>' containment reference.
-     * @see #setConverter(ConverterType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Converter()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='converter' namespace='##targetNamespace'"
-     * @generated
-     */
-	ConverterType getConverter();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverter <em>Converter</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Converter</em>' containment reference.
-     * @see #getConverter()
-     * @generated
-     */
-	void setConverter(ConverterType value);
-
-    /**
-     * Returns the value of the '<em><b>Converter Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "converter-class" element represents the fully qualified class name
-     *     of a concrete Converter implementation class.  It must be of
-     *     type "ClassName".
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Converter Class</em>' containment reference.
-     * @see #setConverterClass(ConverterClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ConverterClass()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='converter-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	ConverterClassType getConverterClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterClass <em>Converter Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Converter Class</em>' containment reference.
-     * @see #getConverterClass()
-     * @generated
-     */
-	void setConverterClass(ConverterClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Converter For Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "converter-for-class" element represents the fully qualified class name
-     *     for which a Converter class will be registered.  It must be of
-     *     type "ClassName".
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Converter For Class</em>' containment reference.
-     * @see #setConverterForClass(ConverterForClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ConverterForClass()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='converter-for-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	ConverterForClassType getConverterForClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterForClass <em>Converter For Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Converter For Class</em>' containment reference.
-     * @see #getConverterForClass()
-     * @generated
-     */
-	void setConverterForClass(ConverterForClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Converter Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "converter-id" element represents the identifier under which the
-     *     corresponding Converter class should be registered.
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Converter Id</em>' containment reference.
-     * @see #setConverterId(ConverterIdType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ConverterId()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='converter-id' namespace='##targetNamespace'"
-     * @generated
-     */
-	ConverterIdType getConverterId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterId <em>Converter Id</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Converter Id</em>' containment reference.
-     * @see #getConverterId()
-     * @generated
-     */
-	void setConverterId(ConverterIdType value);
-
-    /**
-     * Returns the value of the '<em><b>Default Locale</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *       The "default-locale"
-     *                 element declares the default locale for this
-     *                 application instance.  It must be specified as
-     *                 :language:[_:country:[_:variant:]] without the colons,
-     *                 for example      "ja_JP_SJIS".  The separators
-     *                 between the segments may be '-' or
-     *                 '_'. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Default Locale</em>' containment reference.
-     * @see #setDefaultLocale(DefaultLocaleType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_DefaultLocale()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='default-locale' namespace='##targetNamespace'"
-     * @generated
-     */
-	DefaultLocaleType getDefaultLocale();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultLocale <em>Default Locale</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Default Locale</em>' containment reference.
-     * @see #getDefaultLocale()
-     * @generated
-     */
-	void setDefaultLocale(DefaultLocaleType value);
-
-    /**
-     * Returns the value of the '<em><b>Default Render Kit Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "default-render-kit-id" element allows the application to define
-     *     a renderkit to be used other than the standard one. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Default Render Kit Id</em>' containment reference.
-     * @see #setDefaultRenderKitId(DefaultRenderKitIdType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_DefaultRenderKitId()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='default-render-kit-id' namespace='##targetNamespace'"
-     * @generated
-     */
-	DefaultRenderKitIdType getDefaultRenderKitId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultRenderKitId <em>Default Render Kit Id</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Default Render Kit Id</em>' containment reference.
-     * @see #getDefaultRenderKitId()
-     * @generated
-     */
-	void setDefaultRenderKitId(DefaultRenderKitIdType value);
-
-    /**
-     * Returns the value of the '<em><b>Default Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "default-value" contains the value for the property or attribute
-     *     in which this element resides.  This value differs from the
-     *     "suggested-value" in that the property or attribute must take the
-     *     value, whereas in "suggested-value" taking the value is optional.
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Default Value</em>' containment reference.
-     * @see #setDefaultValue(DefaultValueType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_DefaultValue()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='default-value' namespace='##targetNamespace'"
-     * @generated
-     */
-	DefaultValueType getDefaultValue();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultValue <em>Default Value</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Default Value</em>' containment reference.
-     * @see #getDefaultValue()
-     * @generated
-     */
-	void setDefaultValue(DefaultValueType value);
-
-    /**
-     * Returns the value of the '<em><b>Description</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "description" element
-     *                 contains a textual description of the element     it is
-     *                 nested in, optionally flagged with a language code using
-     *                 the     "xml:lang" attribute. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Description</em>' containment reference.
-     * @see #setDescription(DescriptionType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Description()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-     * @generated
-     */
-	DescriptionType getDescription();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDescription <em>Description</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Description</em>' containment reference.
-     * @see #getDescription()
-     * @generated
-     */
-	void setDescription(DescriptionType value);
-
-    /**
-     * Returns the value of the '<em><b>Display Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "display-name" element
-     *                 is a short descriptive name describing the     entity
-     *                 associated with the element it is nested in, intended to
-     *                 be     displayed by tools, and optionally flagged with a
-     *                 language code using     the "xml:lang"
-     *                 attribute. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Display Name</em>' containment reference.
-     * @see #setDisplayName(DisplayNameType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_DisplayName()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	DisplayNameType getDisplayName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDisplayName <em>Display Name</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Display Name</em>' containment reference.
-     * @see #getDisplayName()
-     * @generated
-     */
-	void setDisplayName(DisplayNameType value);
-
-    /**
-     * Returns the value of the '<em><b>Faces Config</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *  ==================== Top Level Elements
-     *                 ==============================       The
-     *                 "faces-config" element is the root of the
-     *                 configuration information     hierarchy, and contains
-     *                 nested elements for all of the other configuration
-     *                 settings. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Faces Config</em>' containment reference.
-     * @see #setFacesConfig(FacesConfigType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_FacesConfig()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='faces-config' namespace='##targetNamespace'"
-     * @generated
-     */
-	FacesConfigType getFacesConfig();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesConfig <em>Faces Config</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Faces Config</em>' containment reference.
-     * @see #getFacesConfig()
-     * @generated
-     */
-	void setFacesConfig(FacesConfigType value);
-
-    /**
-     * Returns the value of the '<em><b>Faces Context Factory</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The
-     *                 "faces-context-factory" element contains the
-     *                 fully qualified     class name of the concrete
-     *                 FacesContextFactory implementation class     that will
-     *                 be called when
-     *                 FactoryFinder.getFactory(FACES_CONTEXT_FACTORY) is
-     *                 called. It must     be of type "ClassName". 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Faces Context Factory</em>' containment reference.
-     * @see #setFacesContextFactory(FacesContextFactoryType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_FacesContextFactory()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='faces-context-factory' namespace='##targetNamespace'"
-     * @generated
-     */
-	FacesContextFactoryType getFacesContextFactory();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesContextFactory <em>Faces Context Factory</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Faces Context Factory</em>' containment reference.
-     * @see #getFacesContextFactory()
-     * @generated
-     */
-	void setFacesContextFactory(FacesContextFactoryType value);
-
-    /**
-     * Returns the value of the '<em><b>Facet</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *    Define the name and other design-time information for a facet that is
-     *    associated with a renderer or a component.
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Facet</em>' containment reference.
-     * @see #setFacet(FacetType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Facet()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='facet' namespace='##targetNamespace'"
-     * @generated
-     */
-	FacetType getFacet();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacet <em>Facet</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Facet</em>' containment reference.
-     * @see #getFacet()
-     * @generated
-     */
-	void setFacet(FacetType value);
-
-    /**
-     * Returns the value of the '<em><b>Facet Extension</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     Extension element for facet.  May contain implementation
-     *     specific content.
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Facet Extension</em>' containment reference.
-     * @see #setFacetExtension(FacetExtensionType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_FacetExtension()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='facet-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-	FacetExtensionType getFacetExtension();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetExtension <em>Facet Extension</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Facet Extension</em>' containment reference.
-     * @see #getFacetExtension()
-     * @generated
-     */
-	void setFacetExtension(FacetExtensionType value);
-
-    /**
-     * Returns the value of the '<em><b>Facet Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "facet-name" element represents the facet name under which a
-     *     UIComponent will be added to its parent.  It must be of type
-     *     "Identifier".
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Facet Name</em>' containment reference.
-     * @see #setFacetName(FacetNameType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_FacetName()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='facet-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	FacetNameType getFacetName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetName <em>Facet Name</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Facet Name</em>' containment reference.
-     * @see #getFacetName()
-     * @generated
-     */
-	void setFacetName(FacetNameType value);
-
-    /**
-     * Returns the value of the '<em><b>Factory</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "factory" element
-     *                 provides a mechanism to define the various     Factories
-     *                 that comprise parts of the implementation of JavaServer
-     *                 Faces.  For nested elements that are not specified, the
-     *                 JSF     implementation must provide a suitable default. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Factory</em>' containment reference.
-     * @see #setFactory(FactoryType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Factory()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='factory' namespace='##targetNamespace'"
-     * @generated
-     */
-	FactoryType getFactory();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFactory <em>Factory</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Factory</em>' containment reference.
-     * @see #getFactory()
-     * @generated
-     */
-	void setFactory(FactoryType value);
-
-    /**
-     * Returns the value of the '<em><b>From Action</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "from-action" element contains an action reference expression
-     *     that must have been executed (by the default ActionListener for handling
-     *     application level events) in order to select this navigation rule.  If
-     *     not specified, this rule will be relevant no matter which action reference
-     *     was executed (or if no action reference was executed).
-     * 
-     *     This value must be of type "Action".
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>From Action</em>' containment reference.
-     * @see #setFromAction(FromActionType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_FromAction()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='from-action' namespace='##targetNamespace'"
-     * @generated
-     */
-	FromActionType getFromAction();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromAction <em>From Action</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>From Action</em>' containment reference.
-     * @see #getFromAction()
-     * @generated
-     */
-	void setFromAction(FromActionType value);
-
-    /**
-     * Returns the value of the '<em><b>From Outcome</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "from-outcome" element contains a logical outcome string returned
-     *     by the execution of an application action method selected via an
-     *     "actionRef" property (or a literal value specified by an "action"
-     *     property) of a UICommand component.  If specified, this rule will be
-     *     relevant only if the outcome value matches this element's value.  If
-     *     not specified, this rule will be relevant no matter what the outcome
-     *     value was.
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>From Outcome</em>' containment reference.
-     * @see #setFromOutcome(FromOutcomeType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_FromOutcome()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='from-outcome' namespace='##targetNamespace'"
-     * @generated
-     */
-	FromOutcomeType getFromOutcome();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromOutcome <em>From Outcome</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>From Outcome</em>' containment reference.
-     * @see #getFromOutcome()
-     * @generated
-     */
-	void setFromOutcome(FromOutcomeType value);
-
-    /**
-     * Returns the value of the '<em><b>From View Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "from-view-id" element contains the view identifier of the view
-     *     for which the containing navigation rule is relevant.  If no
-     *     "from-view" element is specified, this rule applies to navigation
-     *     decisions on all views.  If this element is not specified, a value
-     *     of "*" is assumed, meaning that this navigation rule applies to all
-     *     views.
-     * 
-     *     This value must be of type "ViewIdPattern".
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>From View Id</em>' containment reference.
-     * @see #setFromViewId(FromViewIdType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_FromViewId()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='from-view-id' namespace='##targetNamespace'"
-     * @generated
-     */
-	FromViewIdType getFromViewId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromViewId <em>From View Id</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>From View Id</em>' containment reference.
-     * @see #getFromViewId()
-     * @generated
-     */
-	void setFromViewId(FromViewIdType value);
-
-    /**
-     * Returns the value of the '<em><b>Icon</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "icon" element
-     *                 contains "small-icon" and
-     *                 "large-icon" elements that     specify the
-     *                 resoruce paths for small and large GIF or JPG icon
-     *                 images     used to represent the parent element in a GUI
-     *                 tool. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Icon</em>' containment reference.
-     * @see #setIcon(IconType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Icon()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-     * @generated
-     */
-	IconType getIcon();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getIcon <em>Icon</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Icon</em>' containment reference.
-     * @see #getIcon()
-     * @generated
-     */
-	void setIcon(IconType value);
-
-    /**
-     * Returns the value of the '<em><b>Key</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "key" element is the String representation of a map key that
-     *     will be stored in a managed property of type java.util.Map.  
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Key</em>' containment reference.
-     * @see #setKey(KeyType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Key()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='key' namespace='##targetNamespace'"
-     * @generated
-     */
-	KeyType getKey();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKey <em>Key</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Key</em>' containment reference.
-     * @see #getKey()
-     * @generated
-     */
-	void setKey(KeyType value);
-
-    /**
-     * Returns the value of the '<em><b>Key Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "key-class" element defines the Java type to which each "key"
-     *     element in a set of "map-entry" elements will be converted to.  It
-     *     must be of type "ClassName".  If omitted, "java.lang.String"
-     *     is assumed.
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Key Class</em>' containment reference.
-     * @see #setKeyClass(KeyClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_KeyClass()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='key-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	KeyClassType getKeyClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKeyClass <em>Key Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Key Class</em>' containment reference.
-     * @see #getKeyClass()
-     * @generated
-     */
-	void setKeyClass(KeyClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Large Icon</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "large-icon" element contains the resource path to a large (32x32)
-     *     icon image.  The image may be in either GIF or JPG format.
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Large Icon</em>' containment reference.
-     * @see #setLargeIcon(LargeIconType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_LargeIcon()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='large-icon' namespace='##targetNamespace'"
-     * @generated
-     */
-	LargeIconType getLargeIcon();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLargeIcon <em>Large Icon</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Large Icon</em>' containment reference.
-     * @see #getLargeIcon()
-     * @generated
-     */
-	void setLargeIcon(LargeIconType value);
-
-    /**
-     * Returns the value of the '<em><b>Lifecycle</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "lifecycle" element
-     *                 provides a mechanism to specify     modifications to the
-     *                 behaviour of the default Lifecycle     implementation
-     *                 for this web application. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Lifecycle</em>' containment reference.
-     * @see #setLifecycle(LifecycleType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Lifecycle()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='lifecycle' namespace='##targetNamespace'"
-     * @generated
-     */
-	LifecycleType getLifecycle();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycle <em>Lifecycle</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Lifecycle</em>' containment reference.
-     * @see #getLifecycle()
-     * @generated
-     */
-	void setLifecycle(LifecycleType value);
-
-    /**
-     * Returns the value of the '<em><b>Lifecycle Factory</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "lifecycle-factory"
-     *                 element contains the fully qualified class name     of
-     *                 the concrete LifecycleFactory implementation class that
-     *                 will be called     when
-     *                 FactoryFinder.getFactory(LIFECYCLE_FACTORY) is called.
-     *                 It must be      of type "ClassName". 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Lifecycle Factory</em>' containment reference.
-     * @see #setLifecycleFactory(LifecycleFactoryType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_LifecycleFactory()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='lifecycle-factory' namespace='##targetNamespace'"
-     * @generated
-     */
-	LifecycleFactoryType getLifecycleFactory();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycleFactory <em>Lifecycle Factory</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Lifecycle Factory</em>' containment reference.
-     * @see #getLifecycleFactory()
-     * @generated
-     */
-	void setLifecycleFactory(LifecycleFactoryType value);
-
-    /**
-     * Returns the value of the '<em><b>List Entries</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "list-entries" element
-     *                 represents a set of initialization     elements for a
-     *                 managed property that is a java.util.List or an
-     *                 array.  In the former case, the "value-class"
-     *                 element can optionally     be used to declare the Java
-     *                 type to which each value should be     converted before
-     *                 adding it to the Collection. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>List Entries</em>' containment reference.
-     * @see #setListEntries(ListEntriesType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ListEntries()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='list-entries' namespace='##targetNamespace'"
-     * @generated
-     */
-	ListEntriesType getListEntries();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getListEntries <em>List Entries</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>List Entries</em>' containment reference.
-     * @see #getListEntries()
-     * @generated
-     */
-	void setListEntries(ListEntriesType value);
-
-    /**
-     * Returns the value of the '<em><b>Locale Config</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *       The "locale-config"
-     *                 element allows the app developer to declare the
-     *                 supported locales for this application.   
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Locale Config</em>' containment reference.
-     * @see #setLocaleConfig(LocaleConfigType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_LocaleConfig()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='locale-config' namespace='##targetNamespace'"
-     * @generated
-     */
-	LocaleConfigType getLocaleConfig();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLocaleConfig <em>Locale Config</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Locale Config</em>' containment reference.
-     * @see #getLocaleConfig()
-     * @generated
-     */
-	void setLocaleConfig(LocaleConfigType value);
-
-    /**
-     * Returns the value of the '<em><b>Managed Bean</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "managed-bean" element
-     *                 represents a JavaBean, of a particular class,     that
-     *                 will be dynamically instantiated at runtime (by the
-     *                 default     VariableResolver implementation) if it is
-     *                 referenced as the first element     of a value reference
-     *                 expression, and no corresponding bean can be
-     *                 identified in any scope.  In addition to the creation of
-     *                 the managed bean,     and the optional storing of it
-     *                 into the specified scope, the nested
-     *                 managed-property elements can be used to initialize the
-     *                 contents of     settable JavaBeans properties of the
-     *                 created instance. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Managed Bean</em>' containment reference.
-     * @see #setManagedBean(ManagedBeanType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ManagedBean()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='managed-bean' namespace='##targetNamespace'"
-     * @generated
-     */
-	ManagedBeanType getManagedBean();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBean <em>Managed Bean</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Managed Bean</em>' containment reference.
-     * @see #getManagedBean()
-     * @generated
-     */
-	void setManagedBean(ManagedBeanType value);
-
-    /**
-     * Returns the value of the '<em><b>Managed Bean Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "managed-bean-class" element represents the fully qualified class
-     *     name of the Java class that will be used to instantiate a new instance
-     *     if creation of the specified managed bean is requested.  It must be of
-     *     type "ClassName".
-     * 
-     *     The specified class must conform to standard JavaBeans conventions.
-     *     In particular, it must have a public zero-arguments constructor, and
-     *     zero or more public property setters.
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Managed Bean Class</em>' containment reference.
-     * @see #setManagedBeanClass(ManagedBeanClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ManagedBeanClass()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='managed-bean-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	ManagedBeanClassType getManagedBeanClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanClass <em>Managed Bean Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Managed Bean Class</em>' containment reference.
-     * @see #getManagedBeanClass()
-     * @generated
-     */
-	void setManagedBeanClass(ManagedBeanClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Managed Bean Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "managed-bean-name" element represents the attribute name under
-     *     which a managed bean will be searched for, as well as stored (unless
-     *     the "managed-bean-scope" value is "none").  It must be of type
-     *     "Identifier".
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Managed Bean Name</em>' containment reference.
-     * @see #setManagedBeanName(ManagedBeanNameType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ManagedBeanName()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='managed-bean-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	ManagedBeanNameType getManagedBeanName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanName <em>Managed Bean Name</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Managed Bean Name</em>' containment reference.
-     * @see #getManagedBeanName()
-     * @generated
-     */
-	void setManagedBeanName(ManagedBeanNameType value);
-
-    /**
-     * Returns the value of the '<em><b>Managed Bean Scope</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "managed-bean-scope" element represents the scope into which a newly
-     *     created instance of the specified managed bean will be stored (unless
-     *     the value is "none").  It must be of type "ScopeOrNone".
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Managed Bean Scope</em>' containment reference.
-     * @see #setManagedBeanScope(ManagedBeanScopeType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ManagedBeanScope()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='managed-bean-scope' namespace='##targetNamespace'"
-     * @generated
-     */
-	ManagedBeanScopeType getManagedBeanScope();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanScope <em>Managed Bean Scope</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Managed Bean Scope</em>' containment reference.
-     * @see #getManagedBeanScope()
-     * @generated
-     */
-	void setManagedBeanScope(ManagedBeanScopeType value);
-
-    /**
-     * Returns the value of the '<em><b>Managed Property</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "managed-property"
-     *                 element represents an individual property of a
-     *                 managed bean that will be configured to the specified
-     *                 value (or value set)     if the corresponding managed
-     *                 bean is automatically created. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Managed Property</em>' containment reference.
-     * @see #setManagedProperty(ManagedPropertyType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ManagedProperty()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='managed-property' namespace='##targetNamespace'"
-     * @generated
-     */
-	ManagedPropertyType getManagedProperty();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedProperty <em>Managed Property</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Managed Property</em>' containment reference.
-     * @see #getManagedProperty()
-     * @generated
-     */
-	void setManagedProperty(ManagedPropertyType value);
-
-    /**
-     * Returns the value of the '<em><b>Map Entries</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "map-entries' element
-     *                 represents a set of key-entry pairs that     will be
-     *                 added to the computed value of a managed property of
-     *                 type     java.util.Map.  In addition, the Java class
-     *                 types of the key and entry     values may be optionally
-     *                 declared. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Map Entries</em>' containment reference.
-     * @see #setMapEntries(MapEntriesType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_MapEntries()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='map-entries' namespace='##targetNamespace'"
-     * @generated
-     */
-	MapEntriesType getMapEntries();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntries <em>Map Entries</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Map Entries</em>' containment reference.
-     * @see #getMapEntries()
-     * @generated
-     */
-	void setMapEntries(MapEntriesType value);
-
-    /**
-     * Returns the value of the '<em><b>Map Entry</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "map-entry" element
-     *                 reprsents a single key-entry pair that     will be added
-     *                 to the computed value of a managed property of type
-     *                 java.util.Map. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Map Entry</em>' containment reference.
-     * @see #setMapEntry(MapEntryType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_MapEntry()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='map-entry' namespace='##targetNamespace'"
-     * @generated
-     */
-	MapEntryType getMapEntry();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntry <em>Map Entry</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Map Entry</em>' containment reference.
-     * @see #getMapEntry()
-     * @generated
-     */
-	void setMapEntry(MapEntryType value);
-
-    /**
-     * Returns the value of the '<em><b>Message Bundle</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The base name of a resource bundle
-     *                 representing the message resources     for this
-     *                 application.  See the JavaDocs for the
-     *                 "java.util.ResourceBundle"     class for more
-     *                 information on the syntax of resource bundle names. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Message Bundle</em>' containment reference.
-     * @see #setMessageBundle(MessageBundleType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_MessageBundle()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='message-bundle' namespace='##targetNamespace'"
-     * @generated
-     */
-	MessageBundleType getMessageBundle();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMessageBundle <em>Message Bundle</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Message Bundle</em>' containment reference.
-     * @see #getMessageBundle()
-     * @generated
-     */
-	void setMessageBundle(MessageBundleType value);
-
-    /**
-     * Returns the value of the '<em><b>Navigation Case</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "navigation-case"
-     *                 element describes a particular combination of
-     *                 conditions that must match for this case to be executed,
-     *                 and the     view id of the component tree that should be
-     *                 selected next. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Navigation Case</em>' containment reference.
-     * @see #setNavigationCase(NavigationCaseType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_NavigationCase()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='navigation-case' namespace='##targetNamespace'"
-     * @generated
-     */
-	NavigationCaseType getNavigationCase();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationCase <em>Navigation Case</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Navigation Case</em>' containment reference.
-     * @see #getNavigationCase()
-     * @generated
-     */
-	void setNavigationCase(NavigationCaseType value);
-
-    /**
-     * Returns the value of the '<em><b>Navigation Handler</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "navigation-handler"
-     *                 element contains the fully qualified class name     of
-     *                 the concrete NavigationHandler implementation class that
-     *                 will be called     during the Invoke Application phase
-     *                 of the request processing lifecycle,     if the default
-     *                 ActionListener (provided by the JSF implementation) is
-     *                 used.     It must be of type "ClassName". 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Navigation Handler</em>' containment reference.
-     * @see #setNavigationHandler(NavigationHandlerType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_NavigationHandler()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='navigation-handler' namespace='##targetNamespace'"
-     * @generated
-     */
-	NavigationHandlerType getNavigationHandler();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationHandler <em>Navigation Handler</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Navigation Handler</em>' containment reference.
-     * @see #getNavigationHandler()
-     * @generated
-     */
-	void setNavigationHandler(NavigationHandlerType value);
-
-    /**
-     * Returns the value of the '<em><b>Navigation Rule</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "navigation-rule"
-     *                 element represents an individual decision rule     that
-     *                 will be utilized by the default NavigationHandler
-     *                 implementation to make decisions on what view should be
-     *                 displayed     next, based on the view id being
-     *                 processed. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Navigation Rule</em>' containment reference.
-     * @see #setNavigationRule(NavigationRuleType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_NavigationRule()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='navigation-rule' namespace='##targetNamespace'"
-     * @generated
-     */
-	NavigationRuleType getNavigationRule();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationRule <em>Navigation Rule</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Navigation Rule</em>' containment reference.
-     * @see #getNavigationRule()
-     * @generated
-     */
-	void setNavigationRule(NavigationRuleType value);
-
-    /**
-     * Returns the value of the '<em><b>Null Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "null-value" element
-     *                 indicates that the managed property in which we     are
-     *                 nested will be explicitly set to null if our managed
-     *                 bean is     automatically created.  This is different
-     *                 from omitting the managed     property element entirely,
-     *                 which will cause no property setter to be     called for
-     *                 this property.      The "null-value" element
-     *                 can only be used when the associated
-     *                 "property-class" identifies a Java class, not
-     *                 a Java primitive. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Null Value</em>' containment reference.
-     * @see #setNullValue(NullValueType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_NullValue()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='null-value' namespace='##targetNamespace'"
-     * @generated
-     */
-	NullValueType getNullValue();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNullValue <em>Null Value</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Null Value</em>' containment reference.
-     * @see #getNullValue()
-     * @generated
-     */
-	void setNullValue(NullValueType value);
-
-    /**
-     * Returns the value of the '<em><b>Phase Listener</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *  The "phase-listener" element
-     *                 contains the fully qualified class name of the concrete
-     *                 PhaseListener implementation class that will be
-     *                 registered on the Lifecycle. It must be of type
-     *                 "ClassName". 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Phase Listener</em>' containment reference.
-     * @see #setPhaseListener(PhaseListenerType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_PhaseListener()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='phase-listener' namespace='##targetNamespace'"
-     * @generated
-     */
-	PhaseListenerType getPhaseListener();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPhaseListener <em>Phase Listener</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Phase Listener</em>' containment reference.
-     * @see #getPhaseListener()
-     * @generated
-     */
-	void setPhaseListener(PhaseListenerType value);
-
-    /**
-     * Returns the value of the '<em><b>Property</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "property" element
-     *                 represents a JavaBean property of the Java class
-     *                 represented by our parent element.      Property names
-     *                 must be unique within the scope of the Java class
-     *                 that is represented by the parent element, and must
-     *                 correspond to     property names that will be recognized
-     *                 when performing introspection     against that class via
-     *                 java.beans.Introspector. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Property</em>' containment reference.
-     * @see #setProperty(PropertyType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Property()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='property' namespace='##targetNamespace'"
-     * @generated
-     */
-	PropertyType getProperty();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getProperty <em>Property</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Property</em>' containment reference.
-     * @see #getProperty()
-     * @generated
-     */
-	void setProperty(PropertyType value);
-
-    /**
-     * Returns the value of the '<em><b>Property Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "property-class" element represents the Java type of the value
-     *     associated with this property name.  It must be of type "JavaType".
-     *     If not specified, it can be inferred from existing classes; however,
-     *     this element should be specified if the configuration file is going
-     *     to be the source for generating the corresponding classes.
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Property Class</em>' containment reference.
-     * @see #setPropertyClass(PropertyClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_PropertyClass()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='property-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	PropertyClassType getPropertyClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyClass <em>Property Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Property Class</em>' containment reference.
-     * @see #getPropertyClass()
-     * @generated
-     */
-	void setPropertyClass(PropertyClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Property Extension</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *       Extension element for property.
-     *                 May contain implementation     specific content. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Property Extension</em>' containment reference.
-     * @see #setPropertyExtension(PropertyExtensionType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_PropertyExtension()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='property-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-	PropertyExtensionType getPropertyExtension();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyExtension <em>Property Extension</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Property Extension</em>' containment reference.
-     * @see #getPropertyExtension()
-     * @generated
-     */
-	void setPropertyExtension(PropertyExtensionType value);
-
-    /**
-     * Returns the value of the '<em><b>Property Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "property-name" element represents the JavaBeans property name
-     *     under which the corresponding value may be stored.
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Property Name</em>' containment reference.
-     * @see #setPropertyName(PropertyNameType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_PropertyName()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='property-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	PropertyNameType getPropertyName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyName <em>Property Name</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Property Name</em>' containment reference.
-     * @see #getPropertyName()
-     * @generated
-     */
-	void setPropertyName(PropertyNameType value);
-
-    /**
-     * Returns the value of the '<em><b>Property Resolver</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "property-resolver"
-     *                 element contains the fully qualified class name     of
-     *                 the concrete PropertyResolver implementation class that
-     *                 will be used     during the processing of value
-     *                 reference expressions.     It must be of type
-     *                 "ClassName". 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Property Resolver</em>' containment reference.
-     * @see #setPropertyResolver(PropertyResolverType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_PropertyResolver()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='property-resolver' namespace='##targetNamespace'"
-     * @generated
-     */
-	PropertyResolverType getPropertyResolver();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyResolver <em>Property Resolver</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Property Resolver</em>' containment reference.
-     * @see #getPropertyResolver()
-     * @generated
-     */
-	void setPropertyResolver(PropertyResolverType value);
-
-    /**
-     * Returns the value of the '<em><b>Redirect</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "redirect" element
-     *                 indicates that navigation to the specified
-     *                 "to-view-id" should be accomplished by
-     *                 performing an HTTP redirect     rather than the usual
-     *                 ViewHandler mechanisms. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Redirect</em>' containment reference.
-     * @see #setRedirect(RedirectType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Redirect()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='redirect' namespace='##targetNamespace'"
-     * @generated
-     */
-	RedirectType getRedirect();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRedirect <em>Redirect</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Redirect</em>' containment reference.
-     * @see #getRedirect()
-     * @generated
-     */
-	void setRedirect(RedirectType value);
-
-    /**
-     * Returns the value of the '<em><b>Referenced Bean</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "referenced-bean"
-     *                 element represents at design time the promise     that a
-     *                 Java object of the specified type will exist at runtime
-     *                 in some     scope, under the specified key.  This can be
-     *                 used by design time tools     to construct user
-     *                 interface dialogs based on the properties of the
-     *                 specified class.  The presence or absence of a
-     *                 referenced bean     element has no impact on the
-     *                 JavaServer Faces runtime environment     inside a web
-     *                 application. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Referenced Bean</em>' containment reference.
-     * @see #setReferencedBean(ReferencedBeanType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ReferencedBean()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='referenced-bean' namespace='##targetNamespace'"
-     * @generated
-     */
-	ReferencedBeanType getReferencedBean();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBean <em>Referenced Bean</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Referenced Bean</em>' containment reference.
-     * @see #getReferencedBean()
-     * @generated
-     */
-	void setReferencedBean(ReferencedBeanType value);
-
-    /**
-     * Returns the value of the '<em><b>Referenced Bean Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "referenced-bean-class" element represents the fully qualified class
-     *     name of the Java class (either abstract or concrete) or Java interface
-     *     implemented by the corresponding referenced bean.  It must be of type
-     *     "ClassName".
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Referenced Bean Class</em>' containment reference.
-     * @see #setReferencedBeanClass(ReferencedBeanClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ReferencedBeanClass()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='referenced-bean-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	ReferencedBeanClassType getReferencedBeanClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanClass <em>Referenced Bean Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Referenced Bean Class</em>' containment reference.
-     * @see #getReferencedBeanClass()
-     * @generated
-     */
-	void setReferencedBeanClass(ReferencedBeanClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Referenced Bean Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "referenced-bean-name" element represents the attribute name under
-     *     which the corresponding referenced bean may be assumed to be stored,
-     *     in one of the scopes defined by the "Scope" type.  It must be of type
-     *     "Identifier".
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Referenced Bean Name</em>' containment reference.
-     * @see #setReferencedBeanName(ReferencedBeanNameType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ReferencedBeanName()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='referenced-bean-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	ReferencedBeanNameType getReferencedBeanName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanName <em>Referenced Bean Name</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Referenced Bean Name</em>' containment reference.
-     * @see #getReferencedBeanName()
-     * @generated
-     */
-	void setReferencedBeanName(ReferencedBeanNameType value);
-
-    /**
-     * Returns the value of the '<em><b>Renderer</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "renderer" element
-     *                 represents a concrete Renderer implementation     class
-     *                 that should be registered under the specified type
-     *                 identifier,     in the RenderKit associated with the
-     *                 parent render-kit element.  Renderer     types must be
-     *                 unique within the RenderKit associated with the parent
-     *                 "render-kit" element.      Nested
-     *                 "attribute" elements identify generic
-     *                 component attributes that     are recognized by this
-     *                 renderer.  Nested "supported-component-type"
-     *                 and     "supported-component-class" elements
-     *                 identify supported component classes,     by their type
-     *                 identifiers or the implementation class name,
-     *                 respectively,     that are supported by this Renderer. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Renderer</em>' containment reference.
-     * @see #setRenderer(RendererType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Renderer()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='renderer' namespace='##targetNamespace'"
-     * @generated
-     */
-	RendererType getRenderer();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderer <em>Renderer</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Renderer</em>' containment reference.
-     * @see #getRenderer()
-     * @generated
-     */
-	void setRenderer(RendererType value);
-
-    /**
-     * Returns the value of the '<em><b>Renderer Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "renderer-class" element represents the fully qualified class name
-     *     of a concrete Renderer implementation class.  It must be of
-     *     type "ClassName".
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Renderer Class</em>' containment reference.
-     * @see #setRendererClass(RendererClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RendererClass()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='renderer-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	RendererClassType getRendererClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererClass <em>Renderer Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Renderer Class</em>' containment reference.
-     * @see #getRendererClass()
-     * @generated
-     */
-	void setRendererClass(RendererClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Renderer Extension</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *       Extension element for renderer.
-     *                 May contain implementation     specific content. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Renderer Extension</em>' containment reference.
-     * @see #setRendererExtension(RendererExtensionType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RendererExtension()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='renderer-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-	RendererExtensionType getRendererExtension();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererExtension <em>Renderer Extension</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Renderer Extension</em>' containment reference.
-     * @see #getRendererExtension()
-     * @generated
-     */
-	void setRendererExtension(RendererExtensionType value);
-
-    /**
-     * Returns the value of the '<em><b>Renderer Type</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "renderer-type" element represents a renderer type identifier for the
-     *     Renderer represented by the parent "renderer" element.
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Renderer Type</em>' containment reference.
-     * @see #setRendererType(RendererTypeType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RendererType()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='renderer-type' namespace='##targetNamespace'"
-     * @generated
-     */
-	RendererTypeType getRendererType();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererType <em>Renderer Type</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Renderer Type</em>' containment reference.
-     * @see #getRendererType()
-     * @generated
-     */
-	void setRendererType(RendererTypeType value);
-
-    /**
-     * Returns the value of the '<em><b>Render Kit</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "render-kit" element
-     *                 represents a concrete RenderKit implementation     that
-     *                 should be registered under the specified render-kit-id.
-     *                 If no     render-kit-id is specified, the identifier of
-     *                 the default RenderKit
-     *                 (RenderKitFactory.DEFAULT_RENDER_KIT) is assumed. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Render Kit</em>' containment reference.
-     * @see #setRenderKit(RenderKitType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RenderKit()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='render-kit' namespace='##targetNamespace'"
-     * @generated
-     */
-	RenderKitType getRenderKit();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKit <em>Render Kit</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Render Kit</em>' containment reference.
-     * @see #getRenderKit()
-     * @generated
-     */
-	void setRenderKit(RenderKitType value);
-
-    /**
-     * Returns the value of the '<em><b>Render Kit Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "render-kit-class" element represents the fully qualified class name
-     *     of a concrete RenderKit implementation class.  It must be of
-     *     type "ClassName".
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Render Kit Class</em>' containment reference.
-     * @see #setRenderKitClass(RenderKitClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RenderKitClass()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='render-kit-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	RenderKitClassType getRenderKitClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitClass <em>Render Kit Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Render Kit Class</em>' containment reference.
-     * @see #getRenderKitClass()
-     * @generated
-     */
-	void setRenderKitClass(RenderKitClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Render Kit Factory</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "render-kit-factory"
-     *                 element contains the fully qualified class name     of
-     *                 the concrete RenderKitFactory implementation class that
-     *                 will be called     when
-     *                 FactoryFinder.getFactory(RENDER_KIT_FACTORY) is called.
-     *                 It must be      of type "ClassName". 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Render Kit Factory</em>' containment reference.
-     * @see #setRenderKitFactory(RenderKitFactoryType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RenderKitFactory()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='render-kit-factory' namespace='##targetNamespace'"
-     * @generated
-     */
-	RenderKitFactoryType getRenderKitFactory();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitFactory <em>Render Kit Factory</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Render Kit Factory</em>' containment reference.
-     * @see #getRenderKitFactory()
-     * @generated
-     */
-	void setRenderKitFactory(RenderKitFactoryType value);
-
-    /**
-     * Returns the value of the '<em><b>Render Kit Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "render-kit-id" element represents an identifier for the
-     *     RenderKit represented by the parent "render-kit" element.
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Render Kit Id</em>' containment reference.
-     * @see #setRenderKitId(RenderKitIdType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RenderKitId()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='render-kit-id' namespace='##targetNamespace'"
-     * @generated
-     */
-	RenderKitIdType getRenderKitId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitId <em>Render Kit Id</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Render Kit Id</em>' containment reference.
-     * @see #getRenderKitId()
-     * @generated
-     */
-	void setRenderKitId(RenderKitIdType value);
-
-    /**
-     * Returns the value of the '<em><b>Small Icon</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "small-icon" element contains the resource path to a small (16x16)
-     *     icon image.  The image may be in either GIF or JPG format.
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Small Icon</em>' containment reference.
-     * @see #setSmallIcon(SmallIconType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_SmallIcon()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='small-icon' namespace='##targetNamespace'"
-     * @generated
-     */
-	SmallIconType getSmallIcon();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSmallIcon <em>Small Icon</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Small Icon</em>' containment reference.
-     * @see #getSmallIcon()
-     * @generated
-     */
-	void setSmallIcon(SmallIconType value);
-
-    /**
-     * Returns the value of the '<em><b>State Manager</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *       The "state-manager"
-     *                 element contains the fully qualified class name     of
-     *                 the concrete StateManager implementation class that will
-     *                 be called     during the Restore View and Render
-     *                 Response phases of the request     processing lifecycle.
-     *                 The faces implementation must provide a     default
-     *                 implementation of this class 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>State Manager</em>' containment reference.
-     * @see #setStateManager(StateManagerType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_StateManager()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='state-manager' namespace='##targetNamespace'"
-     * @generated
-     */
-	StateManagerType getStateManager();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getStateManager <em>State Manager</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>State Manager</em>' containment reference.
-     * @see #getStateManager()
-     * @generated
-     */
-	void setStateManager(StateManagerType value);
-
-    /**
-     * Returns the value of the '<em><b>Suggested Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "suggested-value" contains the value for the property or
-     *     attribute in which this element resides.  This value is advisory
-     *     only and is intended for tools to use when populating pallettes.
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Suggested Value</em>' containment reference.
-     * @see #setSuggestedValue(SuggestedValueType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_SuggestedValue()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='suggested-value' namespace='##targetNamespace'"
-     * @generated
-     */
-	SuggestedValueType getSuggestedValue();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSuggestedValue <em>Suggested Value</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Suggested Value</em>' containment reference.
-     * @see #getSuggestedValue()
-     * @generated
-     */
-	void setSuggestedValue(SuggestedValueType value);
-
-    /**
-     * Returns the value of the '<em><b>Supported Locale</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *       The "supported-locale"
-     *                 element allows authors to declare which      locales are
-     *                 supported in this application instance.       It must be
-     *                 specified as :language:[_:country:[_:variant:]] without
-     *                 the colons, for example "ja_JP_SJIS".  The
-     *                 separators between the      segments may be
-     *                 '-' or '_'. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Supported Locale</em>' containment reference.
-     * @see #setSupportedLocale(SupportedLocaleType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_SupportedLocale()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='supported-locale' namespace='##targetNamespace'"
-     * @generated
-     */
-	SupportedLocaleType getSupportedLocale();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSupportedLocale <em>Supported Locale</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Supported Locale</em>' containment reference.
-     * @see #getSupportedLocale()
-     * @generated
-     */
-	void setSupportedLocale(SupportedLocaleType value);
-
-    /**
-     * Returns the value of the '<em><b>To View Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "to-view" element contains the view identifier of the next view
-     *     that should be displayed if this navigation rule is matched.  It
-     *     must be of type "ViewId".
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>To View Id</em>' containment reference.
-     * @see #setToViewId(ToViewIdType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ToViewId()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='to-view-id' namespace='##targetNamespace'"
-     * @generated
-     */
-	ToViewIdType getToViewId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getToViewId <em>To View Id</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>To View Id</em>' containment reference.
-     * @see #getToViewId()
-     * @generated
-     */
-	void setToViewId(ToViewIdType value);
-
-    /**
-     * Returns the value of the '<em><b>Validator</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "validator" element
-     *                 represents a concrete Validator implementation     class
-     *                 that should be registered under the specified validator
-     *                 identifier.     Validator identifiers must be unique
-     *                 within the entire web application.      Nested
-     *                 "attribute" elements identify generic
-     *                 attributes that may be     configured on the
-     *                 corresponding UIComponent in order to affect the
-     *                 operation of the Validator.  Nested "property"
-     *                 elements identify JavaBeans     properties of the
-     *                 Validator implementation class that may be configured
-     *                 to affect the operation of the Validator. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Validator</em>' containment reference.
-     * @see #setValidator(ValidatorType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Validator()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='validator' namespace='##targetNamespace'"
-     * @generated
-     */
-	ValidatorType getValidator();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidator <em>Validator</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Validator</em>' containment reference.
-     * @see #getValidator()
-     * @generated
-     */
-	void setValidator(ValidatorType value);
-
-    /**
-     * Returns the value of the '<em><b>Validator Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "validator-class" element represents the fully qualified class name
-     *     of a concrete Validator implementation class.  It must be of
-     *     type "ClassName".
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Validator Class</em>' containment reference.
-     * @see #setValidatorClass(ValidatorClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ValidatorClass()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='validator-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	ValidatorClassType getValidatorClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorClass <em>Validator Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Validator Class</em>' containment reference.
-     * @see #getValidatorClass()
-     * @generated
-     */
-	void setValidatorClass(ValidatorClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Validator Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "validator-id" element represents the identifier under which the
-     *     corresponding Validator class should be registered.
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Validator Id</em>' containment reference.
-     * @see #setValidatorId(ValidatorIdType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ValidatorId()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='validator-id' namespace='##targetNamespace'"
-     * @generated
-     */
-	ValidatorIdType getValidatorId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorId <em>Validator Id</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Validator Id</em>' containment reference.
-     * @see #getValidatorId()
-     * @generated
-     */
-	void setValidatorId(ValidatorIdType value);
-
-    /**
-     * Returns the value of the '<em><b>Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "value" element is the
-     *                 String representation of a literal     value to which a
-     *                 scalar managed property will be set, or a value
-     *                 reference expression ("#{...}") that will be
-     *                 used to calculate the     required value.  It will be
-     *                 converted as specified for the actual     property type. 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Value</em>' containment reference.
-     * @see #setValue(ValueType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Value()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='value' namespace='##targetNamespace'"
-     * @generated
-     */
-	ValueType getValue();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValue <em>Value</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Value</em>' containment reference.
-     * @see #getValue()
-     * @generated
-     */
-	void setValue(ValueType value);
-
-    /**
-     * Returns the value of the '<em><b>Value Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *     The "value-class" element defines the Java type to which each
-     *     "value" element's value will be converted to, prior to adding it to
-     *     the "list-entries" list for a managed property that is a
-     *     java.util.List, or a "map-entries" map for a managed property that
-     *     is a java.util.Map.  It must be of type "ClassName".  If omitted,
-     *     "java.lang.String" is assumed.
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Value Class</em>' containment reference.
-     * @see #setValueClass(ValueClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ValueClass()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='value-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	ValueClassType getValueClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValueClass <em>Value Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Value Class</em>' containment reference.
-     * @see #getValueClass()
-     * @generated
-     */
-	void setValueClass(ValueClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Variable Resolver</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *      The "variable-resolver"
-     *                 element contains the fully qualified class name     of
-     *                 the concrete VariableResolver implementation class that
-     *                 will be used     during the processing of value
-     *                 reference expressions.     It must be of type
-     *                 "ClassName". 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>Variable Resolver</em>' containment reference.
-     * @see #setVariableResolver(VariableResolverType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_VariableResolver()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='variable-resolver' namespace='##targetNamespace'"
-     * @generated
-     */
-	VariableResolverType getVariableResolver();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getVariableResolver <em>Variable Resolver</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Variable Resolver</em>' containment reference.
-     * @see #getVariableResolver()
-     * @generated
-     */
-	void setVariableResolver(VariableResolverType value);
-
-    /**
-     * Returns the value of the '<em><b>View Handler</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * <!-- begin-model-doc -->
-     *       The "view-handler"
-     *                 element contains the fully qualified class name     of
-     *                 the concrete ViewHandler implementation class that will
-     *                 be called     during the Restore View and Render
-     *                 Response phases of the request     processing lifecycle.
-     *                 The faces implementation must provide a     default
-     *                 implementation of this class 
-     * <!-- end-model-doc -->
-     * @return the value of the '<em>View Handler</em>' containment reference.
-     * @see #setViewHandler(ViewHandlerType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ViewHandler()
-     * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-     *        extendedMetaData="kind='element' name='view-handler' namespace='##targetNamespace'"
-     * @generated
-     */
-	ViewHandlerType getViewHandler();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getViewHandler <em>View Handler</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>View Handler</em>' containment reference.
-     * @see #getViewHandler()
-     * @generated
-     */
-	void setViewHandler(ViewHandlerType value);
-
-} // DocumentRoot
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DynamicAttribute.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DynamicAttribute.java
deleted file mode 100644
index 12107dd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DynamicAttribute.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Dynamic Attribute</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicAttribute()
- * @model
- * @generated
- */
-public interface DynamicAttribute extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Name</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Name</em>' attribute.
-     * @see #setName(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicAttribute_Name()
-     * @model
-     * @generated
-     */
-    String getName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getName <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Name</em>' attribute.
-     * @see #getName()
-     * @generated
-     */
-    void setName(String value);
-
-    /**
-     * Returns the value of the '<em><b>Value</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Value</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Value</em>' attribute.
-     * @see #setValue(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicAttribute_Value()
-     * @model
-     * @generated
-     */
-    String getValue();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getValue <em>Value</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Value</em>' attribute.
-     * @see #getValue()
-     * @generated
-     */
-    void setValue(String value);
-
-} // DynamicAttribute
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DynamicElement.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DynamicElement.java
deleted file mode 100644
index 987fa6c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DynamicElement.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Dynamic Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getChildNodes <em>Child Nodes</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getAttributes <em>Attributes</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getTextContent <em>Text Content</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicElement()
- * @model
- * @generated
- */
-public interface DynamicElement extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Child Nodes</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Child Nodes</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Child Nodes</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicElement_ChildNodes()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DynamicElement" containment="true"
-     * @generated
-     */
-    EList getChildNodes();
-
-    /**
-     * Returns the value of the '<em><b>Attributes</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Attributes</em>' attribute list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Attributes</em>' reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicElement_Attributes()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute"
-     * @generated
-     */
-    EList getAttributes();
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicElement_TextContent()
-     * @model
-     * @generated
-     */
-    String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-    void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Name</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Name</em>' attribute.
-     * @see #setName(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicElement_Name()
-     * @model
-     * @generated
-     */
-    String getName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getName <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Name</em>' attribute.
-     * @see #getName()
-     * @generated
-     */
-    void setName(String value);
-
-} // DynamicElement
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ELResolverType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ELResolverType.java
deleted file mode 100644
index f1c3898..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ELResolverType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>EL Resolver Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getELResolverType()
- * @model extendedMetaData="name='el-resolver_._type' kind='simple'"
- * @generated
- */
-public interface ELResolverType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getELResolverType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-    String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-    void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getELResolverType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-    String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-    void setId(String value);
-
-} // ELResolverType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExtensionType.java
deleted file mode 100644
index f371513..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExtensionType.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getChildNodes <em>Child Nodes</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExtensionType()
- * @model abstract="true"
- * @generated
- */
-public interface ExtensionType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Child Nodes</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Child Nodes</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Child Nodes</em>' reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExtensionType_ChildNodes()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DynamicElement"
-     * @generated
-     */
-    EList getChildNodes();
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExtensionType_TextContent()
-     * @model extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-    String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-    void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExtensionType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-    String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-    void setId(String value);
-
-} // ExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigExtensionType.java
deleted file mode 100644
index 3a3301e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigExtensionType()
- * @model extendedMetaData="name='faces-config-extension_._type'"
- * @generated
- */
-public interface FacesConfigExtensionType extends ExtensionType {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-} // FacesConfigExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigFactory.java
deleted file mode 100644
index 78a19ae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigFactory.java
+++ /dev/null
@@ -1,913 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage
- * @generated
- */
-public interface FacesConfigFactory extends EFactory {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The singleton instance of the factory.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	FacesConfigFactory eINSTANCE = org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigFactoryImpl.init();
-
-    /**
-     * Returns a new object of class '<em>Action Listener Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Action Listener Type</em>'.
-     * @generated
-     */
-	ActionListenerType createActionListenerType();
-
-    /**
-     * Returns a new object of class '<em>Application Factory Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Application Factory Type</em>'.
-     * @generated
-     */
-	ApplicationFactoryType createApplicationFactoryType();
-
-    /**
-     * Returns a new object of class '<em>Application Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Application Type</em>'.
-     * @generated
-     */
-	ApplicationType createApplicationType();
-
-    /**
-     * Returns a new object of class '<em>Attribute Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Attribute Class Type</em>'.
-     * @generated
-     */
-	AttributeClassType createAttributeClassType();
-
-    /**
-     * Returns a new object of class '<em>Attribute Extension Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Attribute Extension Type</em>'.
-     * @generated
-     */
-	AttributeExtensionType createAttributeExtensionType();
-
-    /**
-     * Returns a new object of class '<em>Attribute Name Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Attribute Name Type</em>'.
-     * @generated
-     */
-	AttributeNameType createAttributeNameType();
-
-    /**
-     * Returns a new object of class '<em>Attribute Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Attribute Type</em>'.
-     * @generated
-     */
-	AttributeType createAttributeType();
-
-    /**
-     * Returns a new object of class '<em>Component Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Component Class Type</em>'.
-     * @generated
-     */
-	ComponentClassType createComponentClassType();
-
-    /**
-     * Returns a new object of class '<em>Component Extension Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Component Extension Type</em>'.
-     * @generated
-     */
-	ComponentExtensionType createComponentExtensionType();
-
-    /**
-     * Returns a new object of class '<em>Component Family Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Component Family Type</em>'.
-     * @generated
-     */
-	ComponentFamilyType createComponentFamilyType();
-
-    /**
-     * Returns a new object of class '<em>Component Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Component Type</em>'.
-     * @generated
-     */
-	ComponentType createComponentType();
-
-    /**
-     * Returns a new object of class '<em>Component Type Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Component Type Type</em>'.
-     * @generated
-     */
-	ComponentTypeType createComponentTypeType();
-
-    /**
-     * Returns a new object of class '<em>Converter Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Converter Class Type</em>'.
-     * @generated
-     */
-	ConverterClassType createConverterClassType();
-
-    /**
-     * Returns a new object of class '<em>Converter For Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Converter For Class Type</em>'.
-     * @generated
-     */
-	ConverterForClassType createConverterForClassType();
-
-    /**
-     * Returns a new object of class '<em>Converter Id Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Converter Id Type</em>'.
-     * @generated
-     */
-	ConverterIdType createConverterIdType();
-
-    /**
-     * Returns a new object of class '<em>Converter Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Converter Type</em>'.
-     * @generated
-     */
-	ConverterType createConverterType();
-
-    /**
-     * Returns a new object of class '<em>Default Locale Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Default Locale Type</em>'.
-     * @generated
-     */
-	DefaultLocaleType createDefaultLocaleType();
-
-    /**
-     * Returns a new object of class '<em>Default Render Kit Id Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Default Render Kit Id Type</em>'.
-     * @generated
-     */
-	DefaultRenderKitIdType createDefaultRenderKitIdType();
-
-    /**
-     * Returns a new object of class '<em>Default Value Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Default Value Type</em>'.
-     * @generated
-     */
-	DefaultValueType createDefaultValueType();
-
-    /**
-     * Returns a new object of class '<em>Description Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Description Type</em>'.
-     * @generated
-     */
-	DescriptionType createDescriptionType();
-
-    /**
-     * Returns a new object of class '<em>Display Name Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Display Name Type</em>'.
-     * @generated
-     */
-	DisplayNameType createDisplayNameType();
-
-    /**
-     * Returns a new object of class '<em>Document Root</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Document Root</em>'.
-     * @generated
-     */
-	DocumentRoot createDocumentRoot();
-
-    /**
-     * Returns a new object of class '<em>Dynamic Attribute</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Dynamic Attribute</em>'.
-     * @generated
-     */
-    DynamicAttribute createDynamicAttribute();
-
-    /**
-     * Returns a new object of class '<em>Dynamic Element</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Dynamic Element</em>'.
-     * @generated
-     */
-    DynamicElement createDynamicElement();
-
-    /**
-     * Returns a new object of class '<em>EL Resolver Type</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>EL Resolver Type</em>'.
-     * @generated
-     */
-    ELResolverType createELResolverType();
-
-    /**
-     * Returns a new object of class '<em>Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Type</em>'.
-     * @generated
-     */
-	FacesConfigType createFacesConfigType();
-
-    /**
-     * Returns a new object of class '<em>Faces Context Factory Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Faces Context Factory Type</em>'.
-     * @generated
-     */
-	FacesContextFactoryType createFacesContextFactoryType();
-
-    /**
-     * Returns a new object of class '<em>Facet Extension Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Facet Extension Type</em>'.
-     * @generated
-     */
-	FacetExtensionType createFacetExtensionType();
-
-    /**
-     * Returns a new object of class '<em>Facet Name Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Facet Name Type</em>'.
-     * @generated
-     */
-	FacetNameType createFacetNameType();
-
-    /**
-     * Returns a new object of class '<em>Facet Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Facet Type</em>'.
-     * @generated
-     */
-	FacetType createFacetType();
-
-    /**
-     * Returns a new object of class '<em>Factory Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Factory Type</em>'.
-     * @generated
-     */
-	FactoryType createFactoryType();
-
-    /**
-     * Returns a new object of class '<em>From Action Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>From Action Type</em>'.
-     * @generated
-     */
-	FromActionType createFromActionType();
-
-    /**
-     * Returns a new object of class '<em>From Outcome Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>From Outcome Type</em>'.
-     * @generated
-     */
-	FromOutcomeType createFromOutcomeType();
-
-    /**
-     * Returns a new object of class '<em>From View Id Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>From View Id Type</em>'.
-     * @generated
-     */
-	FromViewIdType createFromViewIdType();
-
-    /**
-     * Returns a new object of class '<em>Icon Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Icon Type</em>'.
-     * @generated
-     */
-	IconType createIconType();
-
-    /**
-     * Returns a new object of class '<em>Key Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Key Class Type</em>'.
-     * @generated
-     */
-	KeyClassType createKeyClassType();
-
-    /**
-     * Returns a new object of class '<em>Key Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Key Type</em>'.
-     * @generated
-     */
-	KeyType createKeyType();
-
-    /**
-     * Returns a new object of class '<em>Large Icon Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Large Icon Type</em>'.
-     * @generated
-     */
-	LargeIconType createLargeIconType();
-
-    /**
-     * Returns a new object of class '<em>Lifecycle Factory Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Lifecycle Factory Type</em>'.
-     * @generated
-     */
-	LifecycleFactoryType createLifecycleFactoryType();
-
-    /**
-     * Returns a new object of class '<em>Lifecycle Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Lifecycle Type</em>'.
-     * @generated
-     */
-	LifecycleType createLifecycleType();
-
-    /**
-     * Returns a new object of class '<em>List Entries Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>List Entries Type</em>'.
-     * @generated
-     */
-	ListEntriesType createListEntriesType();
-
-    /**
-     * Returns a new object of class '<em>Locale Config Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Locale Config Type</em>'.
-     * @generated
-     */
-	LocaleConfigType createLocaleConfigType();
-
-    /**
-     * Returns a new object of class '<em>Managed Bean Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Managed Bean Class Type</em>'.
-     * @generated
-     */
-	ManagedBeanClassType createManagedBeanClassType();
-
-    /**
-     * Returns a new object of class '<em>Managed Bean Name Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Managed Bean Name Type</em>'.
-     * @generated
-     */
-	ManagedBeanNameType createManagedBeanNameType();
-
-    /**
-     * Returns a new object of class '<em>Managed Bean Scope Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Managed Bean Scope Type</em>'.
-     * @generated
-     */
-	ManagedBeanScopeType createManagedBeanScopeType();
-
-    /**
-     * Returns a new object of class '<em>Managed Bean Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Managed Bean Type</em>'.
-     * @generated
-     */
-	ManagedBeanType createManagedBeanType();
-
-    /**
-     * Returns a new object of class '<em>Managed Property Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Managed Property Type</em>'.
-     * @generated
-     */
-	ManagedPropertyType createManagedPropertyType();
-
-    /**
-     * Returns a new object of class '<em>Map Entries Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Map Entries Type</em>'.
-     * @generated
-     */
-	MapEntriesType createMapEntriesType();
-
-    /**
-     * Returns a new object of class '<em>Map Entry Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Map Entry Type</em>'.
-     * @generated
-     */
-	MapEntryType createMapEntryType();
-
-    /**
-     * Returns a new object of class '<em>Message Bundle Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Message Bundle Type</em>'.
-     * @generated
-     */
-	MessageBundleType createMessageBundleType();
-
-    /**
-     * Returns a new object of class '<em>Navigation Case Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Navigation Case Type</em>'.
-     * @generated
-     */
-	NavigationCaseType createNavigationCaseType();
-
-    /**
-     * Returns a new object of class '<em>Navigation Handler Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Navigation Handler Type</em>'.
-     * @generated
-     */
-	NavigationHandlerType createNavigationHandlerType();
-
-    /**
-     * Returns a new object of class '<em>Navigation Rule Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Navigation Rule Type</em>'.
-     * @generated
-     */
-	NavigationRuleType createNavigationRuleType();
-
-    /**
-     * Returns a new object of class '<em>Null Value Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Null Value Type</em>'.
-     * @generated
-     */
-	NullValueType createNullValueType();
-
-    /**
-     * Returns a new object of class '<em>Phase Listener Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Phase Listener Type</em>'.
-     * @generated
-     */
-	PhaseListenerType createPhaseListenerType();
-
-    /**
-     * Returns a new object of class '<em>Property Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Property Class Type</em>'.
-     * @generated
-     */
-	PropertyClassType createPropertyClassType();
-
-    /**
-     * Returns a new object of class '<em>Property Extension Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Property Extension Type</em>'.
-     * @generated
-     */
-	PropertyExtensionType createPropertyExtensionType();
-
-    /**
-     * Returns a new object of class '<em>Property Name Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Property Name Type</em>'.
-     * @generated
-     */
-	PropertyNameType createPropertyNameType();
-
-    /**
-     * Returns a new object of class '<em>Property Resolver Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Property Resolver Type</em>'.
-     * @generated
-     */
-	PropertyResolverType createPropertyResolverType();
-
-    /**
-     * Returns a new object of class '<em>Property Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Property Type</em>'.
-     * @generated
-     */
-	PropertyType createPropertyType();
-
-    /**
-     * Returns a new object of class '<em>Redirect Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Redirect Type</em>'.
-     * @generated
-     */
-	RedirectType createRedirectType();
-
-    /**
-     * Returns a new object of class '<em>Referenced Bean Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Referenced Bean Class Type</em>'.
-     * @generated
-     */
-	ReferencedBeanClassType createReferencedBeanClassType();
-
-    /**
-     * Returns a new object of class '<em>Referenced Bean Name Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Referenced Bean Name Type</em>'.
-     * @generated
-     */
-	ReferencedBeanNameType createReferencedBeanNameType();
-
-    /**
-     * Returns a new object of class '<em>Referenced Bean Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Referenced Bean Type</em>'.
-     * @generated
-     */
-	ReferencedBeanType createReferencedBeanType();
-
-    /**
-     * Returns a new object of class '<em>Renderer Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Renderer Class Type</em>'.
-     * @generated
-     */
-	RendererClassType createRendererClassType();
-
-    /**
-     * Returns a new object of class '<em>Renderer Extension Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Renderer Extension Type</em>'.
-     * @generated
-     */
-	RendererExtensionType createRendererExtensionType();
-
-    /**
-     * Returns a new object of class '<em>Renderer Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Renderer Type</em>'.
-     * @generated
-     */
-	RendererType createRendererType();
-
-    /**
-     * Returns a new object of class '<em>Renderer Type Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Renderer Type Type</em>'.
-     * @generated
-     */
-	RendererTypeType createRendererTypeType();
-
-    /**
-     * Returns a new object of class '<em>Render Kit Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Render Kit Class Type</em>'.
-     * @generated
-     */
-	RenderKitClassType createRenderKitClassType();
-
-    /**
-     * Returns a new object of class '<em>Render Kit Factory Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Render Kit Factory Type</em>'.
-     * @generated
-     */
-	RenderKitFactoryType createRenderKitFactoryType();
-
-    /**
-     * Returns a new object of class '<em>Render Kit Id Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Render Kit Id Type</em>'.
-     * @generated
-     */
-	RenderKitIdType createRenderKitIdType();
-
-    /**
-     * Returns a new object of class '<em>Render Kit Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Render Kit Type</em>'.
-     * @generated
-     */
-	RenderKitType createRenderKitType();
-
-    /**
-     * Returns a new object of class '<em>Small Icon Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Small Icon Type</em>'.
-     * @generated
-     */
-	SmallIconType createSmallIconType();
-
-    /**
-     * Returns a new object of class '<em>State Manager Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>State Manager Type</em>'.
-     * @generated
-     */
-	StateManagerType createStateManagerType();
-
-    /**
-     * Returns a new object of class '<em>Suggested Value Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Suggested Value Type</em>'.
-     * @generated
-     */
-	SuggestedValueType createSuggestedValueType();
-
-    /**
-     * Returns a new object of class '<em>Supported Locale Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Supported Locale Type</em>'.
-     * @generated
-     */
-	SupportedLocaleType createSupportedLocaleType();
-
-    /**
-     * Returns a new object of class '<em>To View Id Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>To View Id Type</em>'.
-     * @generated
-     */
-	ToViewIdType createToViewIdType();
-
-    /**
-     * Returns a new object of class '<em>Validator Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Validator Class Type</em>'.
-     * @generated
-     */
-	ValidatorClassType createValidatorClassType();
-
-    /**
-     * Returns a new object of class '<em>Validator Id Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Validator Id Type</em>'.
-     * @generated
-     */
-	ValidatorIdType createValidatorIdType();
-
-    /**
-     * Returns a new object of class '<em>Validator Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Validator Type</em>'.
-     * @generated
-     */
-	ValidatorType createValidatorType();
-
-    /**
-     * Returns a new object of class '<em>Value Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Value Class Type</em>'.
-     * @generated
-     */
-	ValueClassType createValueClassType();
-
-    /**
-     * Returns a new object of class '<em>Value Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Value Type</em>'.
-     * @generated
-     */
-	ValueType createValueType();
-
-    /**
-     * Returns a new object of class '<em>Variable Resolver Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>Variable Resolver Type</em>'.
-     * @generated
-     */
-	VariableResolverType createVariableResolverType();
-
-    /**
-     * Returns a new object of class '<em>View Handler Type</em>'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return a new object of class '<em>View Handler Type</em>'.
-     * @generated
-     */
-	ViewHandlerType createViewHandlerType();
-
-    /**
-     * Returns a new object of class '<em>Application Extension Type</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Application Extension Type</em>'.
-     * @generated
-     */
-    ApplicationExtensionType createApplicationExtensionType();
-
-    /**
-     * Returns a new object of class '<em>Resource Bundle Type</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Resource Bundle Type</em>'.
-     * @generated
-     */
-    ResourceBundleType createResourceBundleType();
-
-    /**
-     * Returns a new object of class '<em>Base Name Type</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Base Name Type</em>'.
-     * @generated
-     */
-    BaseNameType createBaseNameType();
-
-    /**
-     * Returns a new object of class '<em>Var Type</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Var Type</em>'.
-     * @generated
-     */
-    VarType createVarType();
-
-    /**
-     * Returns a new object of class '<em>Render Kit Extension Type</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Render Kit Extension Type</em>'.
-     * @generated
-     */
-    RenderKitExtensionType createRenderKitExtensionType();
-
-    /**
-     * Returns a new object of class '<em>Navigation Rule Extension Type</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Navigation Rule Extension Type</em>'.
-     * @generated
-     */
-    NavigationRuleExtensionType createNavigationRuleExtensionType();
-
-    /**
-     * Returns a new object of class '<em>Validator Extension Type</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Validator Extension Type</em>'.
-     * @generated
-     */
-    ValidatorExtensionType createValidatorExtensionType();
-
-    /**
-     * Returns a new object of class '<em>Extension Type</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Extension Type</em>'.
-     * @generated
-     */
-    FacesConfigExtensionType createFacesConfigExtensionType();
-
-    /**
-     * Returns a new object of class '<em>Factory Extension Type</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Factory Extension Type</em>'.
-     * @generated
-     */
-    FactoryExtensionType createFactoryExtensionType();
-
-    /**
-     * Returns a new object of class '<em>Lifecycle Extension Type</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Lifecycle Extension Type</em>'.
-     * @generated
-     */
-    LifecycleExtensionType createLifecycleExtensionType();
-
-    /**
-     * Returns a new object of class '<em>Managed Bean Extension Type</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Managed Bean Extension Type</em>'.
-     * @generated
-     */
-    ManagedBeanExtensionType createManagedBeanExtensionType();
-
-    /**
-     * Returns a new object of class '<em>Converter Extension Type</em>'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return a new object of class '<em>Converter Extension Type</em>'.
-     * @generated
-     */
-    ConverterExtensionType createConverterExtensionType();
-
-    /**
-     * Returns the package supported by this factory.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the package supported by this factory.
-     * @generated
-     */
-	FacesConfigPackage getFacesConfigPackage();
-
-} //FacesConfigFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigPackage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigPackage.java
deleted file mode 100644
index f10dda3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigPackage.java
+++ /dev/null
@@ -1,15004 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-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
- */
-public interface FacesConfigPackage extends EPackage {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The package name.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String eNAME = "facesconfig";
-
-    /**
-     * The package namespace URI.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String eNS_URI = "http://www.eclipse.org/webtools/jsf/schema/facesconfig.xsd";
-
-    /**
-     * The package namespace name.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String eNS_PREFIX = "facesconfig";
-
-    /**
-     * The singleton instance of the package.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	FacesConfigPackage eINSTANCE = org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl.init();
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl <em>Action Listener Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getActionListenerType()
-     * @generated
-     */
-	int ACTION_LISTENER_TYPE = 0;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ACTION_LISTENER_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ACTION_LISTENER_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Action Listener Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ACTION_LISTENER_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl <em>Application Factory Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationFactoryType()
-     * @generated
-     */
-	int APPLICATION_FACTORY_TYPE = 1;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int APPLICATION_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int APPLICATION_FACTORY_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Application Factory Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int APPLICATION_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl <em>Application Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationType()
-     * @generated
-     */
-	int APPLICATION_TYPE = 2;
-
-    /**
-     * The feature id for the '<em><b>Action Listener</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int APPLICATION_TYPE__ACTION_LISTENER = 0;
-
-    /**
-     * The feature id for the '<em><b>Default Render Kit Id</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID = 1;
-
-    /**
-     * The feature id for the '<em><b>Message Bundle</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int APPLICATION_TYPE__MESSAGE_BUNDLE = 2;
-
-    /**
-     * The feature id for the '<em><b>Navigation Handler</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int APPLICATION_TYPE__NAVIGATION_HANDLER = 3;
-
-    /**
-     * The feature id for the '<em><b>View Handler</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int APPLICATION_TYPE__VIEW_HANDLER = 4;
-
-    /**
-     * The feature id for the '<em><b>State Manager</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int APPLICATION_TYPE__STATE_MANAGER = 5;
-
-    /**
-     * The feature id for the '<em><b>Property Resolver</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int APPLICATION_TYPE__PROPERTY_RESOLVER = 6;
-
-    /**
-     * The feature id for the '<em><b>Variable Resolver</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int APPLICATION_TYPE__VARIABLE_RESOLVER = 7;
-
-    /**
-     * The feature id for the '<em><b>Locale Config</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int APPLICATION_TYPE__LOCALE_CONFIG = 8;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int APPLICATION_TYPE__ID = 9;
-
-    /**
-     * The feature id for the '<em><b>EL Resolver</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int APPLICATION_TYPE__EL_RESOLVER = 10;
-
-    /**
-     * The feature id for the '<em><b>Resource Bundle</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int APPLICATION_TYPE__RESOURCE_BUNDLE = 11;
-
-    /**
-     * The feature id for the '<em><b>Application Extension</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int APPLICATION_TYPE__APPLICATION_EXTENSION = 12;
-
-    /**
-     * The number of structural features of the '<em>Application Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int APPLICATION_TYPE_FEATURE_COUNT = 13;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl <em>Attribute Class Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeClassType()
-     * @generated
-     */
-	int ATTRIBUTE_CLASS_TYPE = 3;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ATTRIBUTE_CLASS_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Attribute Class Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ATTRIBUTE_CLASS_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeExtensionTypeImpl <em>Attribute Extension Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeExtensionTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeExtensionType()
-     * @generated
-     */
-	int ATTRIBUTE_EXTENSION_TYPE = 4;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl <em>Attribute Name Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeNameType()
-     * @generated
-     */
-	int ATTRIBUTE_NAME_TYPE = 5;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl <em>Attribute Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeType()
-     * @generated
-     */
-	int ATTRIBUTE_TYPE = 6;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl <em>Component Class Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentClassType()
-     * @generated
-     */
-	int COMPONENT_CLASS_TYPE = 7;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExtensionTypeImpl <em>Extension Type</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ExtensionTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getExtensionType()
-     * @generated
-     */
-    int EXTENSION_TYPE = 83;
-
-    /**
-     * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int EXTENSION_TYPE__CHILD_NODES = 0;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int EXTENSION_TYPE__TEXT_CONTENT = 1;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int EXTENSION_TYPE__ID = 2;
-
-    /**
-     * The number of structural features of the '<em>Extension Type</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int EXTENSION_TYPE_FEATURE_COUNT = 3;
-
-    /**
-     * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ATTRIBUTE_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int ATTRIBUTE_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ATTRIBUTE_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-     * The number of structural features of the '<em>Attribute Extension Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ATTRIBUTE_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ATTRIBUTE_NAME_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ATTRIBUTE_NAME_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Attribute Name Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ATTRIBUTE_NAME_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ATTRIBUTE_TYPE__DESCRIPTION = 0;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ATTRIBUTE_TYPE__DISPLAY_NAME = 1;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ATTRIBUTE_TYPE__ICON = 2;
-
-    /**
-     * The feature id for the '<em><b>Attribute Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ATTRIBUTE_TYPE__ATTRIBUTE_NAME = 3;
-
-    /**
-     * The feature id for the '<em><b>Attribute Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ATTRIBUTE_TYPE__ATTRIBUTE_CLASS = 4;
-
-    /**
-     * The feature id for the '<em><b>Default Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ATTRIBUTE_TYPE__DEFAULT_VALUE = 5;
-
-    /**
-     * The feature id for the '<em><b>Suggested Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ATTRIBUTE_TYPE__SUGGESTED_VALUE = 6;
-
-    /**
-     * The feature id for the '<em><b>Attribute Extension</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION = 7;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ATTRIBUTE_TYPE__ID = 8;
-
-    /**
-     * The number of structural features of the '<em>Attribute Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ATTRIBUTE_TYPE_FEATURE_COUNT = 9;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int COMPONENT_CLASS_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int COMPONENT_CLASS_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Component Class Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int COMPONENT_CLASS_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentExtensionTypeImpl <em>Component Extension Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentExtensionTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentExtensionType()
-     * @generated
-     */
-	int COMPONENT_EXTENSION_TYPE = 8;
-
-    /**
-     * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int COMPONENT_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int COMPONENT_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int COMPONENT_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-     * The number of structural features of the '<em>Component Extension Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int COMPONENT_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl <em>Component Family Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentFamilyType()
-     * @generated
-     */
-	int COMPONENT_FAMILY_TYPE = 9;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int COMPONENT_FAMILY_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int COMPONENT_FAMILY_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Component Family Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int COMPONENT_FAMILY_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl <em>Component Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentType()
-     * @generated
-     */
-	int COMPONENT_TYPE = 10;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int COMPONENT_TYPE__DESCRIPTION = 0;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int COMPONENT_TYPE__DISPLAY_NAME = 1;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int COMPONENT_TYPE__ICON = 2;
-
-    /**
-     * The feature id for the '<em><b>Component Type</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int COMPONENT_TYPE__COMPONENT_TYPE = 3;
-
-    /**
-     * The feature id for the '<em><b>Component Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int COMPONENT_TYPE__COMPONENT_CLASS = 4;
-
-    /**
-     * The feature id for the '<em><b>Facet</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int COMPONENT_TYPE__FACET = 5;
-
-    /**
-     * The feature id for the '<em><b>Attribute</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int COMPONENT_TYPE__ATTRIBUTE = 6;
-
-    /**
-     * The feature id for the '<em><b>Property</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int COMPONENT_TYPE__PROPERTY = 7;
-
-    /**
-     * The feature id for the '<em><b>Component Extension</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int COMPONENT_TYPE__COMPONENT_EXTENSION = 8;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int COMPONENT_TYPE__ID = 9;
-
-    /**
-     * The number of structural features of the '<em>Component Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int COMPONENT_TYPE_FEATURE_COUNT = 10;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl <em>Component Type Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentTypeType()
-     * @generated
-     */
-	int COMPONENT_TYPE_TYPE = 11;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int COMPONENT_TYPE_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int COMPONENT_TYPE_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Component Type Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int COMPONENT_TYPE_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl <em>Converter Class Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterClassType()
-     * @generated
-     */
-	int CONVERTER_CLASS_TYPE = 12;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int CONVERTER_CLASS_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int CONVERTER_CLASS_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Converter Class Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int CONVERTER_CLASS_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl <em>Converter For Class Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterForClassType()
-     * @generated
-     */
-	int CONVERTER_FOR_CLASS_TYPE = 13;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int CONVERTER_FOR_CLASS_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Converter For Class Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int CONVERTER_FOR_CLASS_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl <em>Converter Id Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterIdType()
-     * @generated
-     */
-	int CONVERTER_ID_TYPE = 14;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int CONVERTER_ID_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int CONVERTER_ID_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Converter Id Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int CONVERTER_ID_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl <em>Converter Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterType()
-     * @generated
-     */
-	int CONVERTER_TYPE = 15;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int CONVERTER_TYPE__DESCRIPTION = 0;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int CONVERTER_TYPE__DISPLAY_NAME = 1;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int CONVERTER_TYPE__ICON = 2;
-
-    /**
-     * The feature id for the '<em><b>Converter Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int CONVERTER_TYPE__CONVERTER_ID = 3;
-
-    /**
-     * The feature id for the '<em><b>Converter For Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int CONVERTER_TYPE__CONVERTER_FOR_CLASS = 4;
-
-    /**
-     * The feature id for the '<em><b>Converter Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int CONVERTER_TYPE__CONVERTER_CLASS = 5;
-
-    /**
-     * The feature id for the '<em><b>Attribute</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int CONVERTER_TYPE__ATTRIBUTE = 6;
-
-    /**
-     * The feature id for the '<em><b>Property</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int CONVERTER_TYPE__PROPERTY = 7;
-
-    /**
-     * The feature id for the '<em><b>Converter Extension</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONVERTER_TYPE__CONVERTER_EXTENSION = 8;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int CONVERTER_TYPE__ID = 9;
-
-    /**
-     * The number of structural features of the '<em>Converter Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int CONVERTER_TYPE_FEATURE_COUNT = 10;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl <em>Default Locale Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultLocaleType()
-     * @generated
-     */
-	int DEFAULT_LOCALE_TYPE = 16;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DEFAULT_LOCALE_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DEFAULT_LOCALE_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Default Locale Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DEFAULT_LOCALE_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl <em>Default Render Kit Id Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultRenderKitIdType()
-     * @generated
-     */
-	int DEFAULT_RENDER_KIT_ID_TYPE = 17;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DEFAULT_RENDER_KIT_ID_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Default Render Kit Id Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DEFAULT_RENDER_KIT_ID_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl <em>Default Value Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultValueType()
-     * @generated
-     */
-	int DEFAULT_VALUE_TYPE = 18;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DEFAULT_VALUE_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DEFAULT_VALUE_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Default Value Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DEFAULT_VALUE_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl <em>Description Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDescriptionType()
-     * @generated
-     */
-	int DESCRIPTION_TYPE = 19;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DESCRIPTION_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Lang</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DESCRIPTION_TYPE__LANG = 1;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DESCRIPTION_TYPE__ID = 2;
-
-    /**
-     * The number of structural features of the '<em>Description Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DESCRIPTION_TYPE_FEATURE_COUNT = 3;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl <em>Display Name Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDisplayNameType()
-     * @generated
-     */
-	int DISPLAY_NAME_TYPE = 20;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DISPLAY_NAME_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Lang</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DISPLAY_NAME_TYPE__LANG = 1;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DISPLAY_NAME_TYPE__ID = 2;
-
-    /**
-     * The number of structural features of the '<em>Display Name Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DISPLAY_NAME_TYPE_FEATURE_COUNT = 3;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl <em>Document Root</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDocumentRoot()
-     * @generated
-     */
-	int DOCUMENT_ROOT = 21;
-
-    /**
-     * The feature id for the '<em><b>Mixed</b></em>' attribute list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__MIXED = 0;
-
-    /**
-     * The feature id for the '<em><b>XMLNS Prefix Map</b></em>' map.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__XMLNS_PREFIX_MAP = 1;
-
-    /**
-     * The feature id for the '<em><b>XSI Schema Location</b></em>' map.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__XSI_SCHEMA_LOCATION = 2;
-
-    /**
-     * The feature id for the '<em><b>Action Listener</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__ACTION_LISTENER = 3;
-
-    /**
-     * The feature id for the '<em><b>Application</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__APPLICATION = 4;
-
-    /**
-     * The feature id for the '<em><b>Application Factory</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__APPLICATION_FACTORY = 5;
-
-    /**
-     * The feature id for the '<em><b>Attribute</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__ATTRIBUTE = 6;
-
-    /**
-     * The feature id for the '<em><b>Attribute Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__ATTRIBUTE_CLASS = 7;
-
-    /**
-     * The feature id for the '<em><b>Attribute Extension</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__ATTRIBUTE_EXTENSION = 8;
-
-    /**
-     * The feature id for the '<em><b>Attribute Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__ATTRIBUTE_NAME = 9;
-
-    /**
-     * The feature id for the '<em><b>Component</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__COMPONENT = 10;
-
-    /**
-     * The feature id for the '<em><b>Component Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__COMPONENT_CLASS = 11;
-
-    /**
-     * The feature id for the '<em><b>Component Extension</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__COMPONENT_EXTENSION = 12;
-
-    /**
-     * The feature id for the '<em><b>Component Family</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__COMPONENT_FAMILY = 13;
-
-    /**
-     * The feature id for the '<em><b>Component Type</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__COMPONENT_TYPE = 14;
-
-    /**
-     * The feature id for the '<em><b>Converter</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__CONVERTER = 15;
-
-    /**
-     * The feature id for the '<em><b>Converter Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__CONVERTER_CLASS = 16;
-
-    /**
-     * The feature id for the '<em><b>Converter For Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__CONVERTER_FOR_CLASS = 17;
-
-    /**
-     * The feature id for the '<em><b>Converter Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__CONVERTER_ID = 18;
-
-    /**
-     * The feature id for the '<em><b>Default Locale</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__DEFAULT_LOCALE = 19;
-
-    /**
-     * The feature id for the '<em><b>Default Render Kit Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID = 20;
-
-    /**
-     * The feature id for the '<em><b>Default Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__DEFAULT_VALUE = 21;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__DESCRIPTION = 22;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__DISPLAY_NAME = 23;
-
-    /**
-     * The feature id for the '<em><b>Faces Config</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__FACES_CONFIG = 24;
-
-    /**
-     * The feature id for the '<em><b>Faces Context Factory</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__FACES_CONTEXT_FACTORY = 25;
-
-    /**
-     * The feature id for the '<em><b>Facet</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__FACET = 26;
-
-    /**
-     * The feature id for the '<em><b>Facet Extension</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__FACET_EXTENSION = 27;
-
-    /**
-     * The feature id for the '<em><b>Facet Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__FACET_NAME = 28;
-
-    /**
-     * The feature id for the '<em><b>Factory</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__FACTORY = 29;
-
-    /**
-     * The feature id for the '<em><b>From Action</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__FROM_ACTION = 30;
-
-    /**
-     * The feature id for the '<em><b>From Outcome</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__FROM_OUTCOME = 31;
-
-    /**
-     * The feature id for the '<em><b>From View Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__FROM_VIEW_ID = 32;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__ICON = 33;
-
-    /**
-     * The feature id for the '<em><b>Key</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__KEY = 34;
-
-    /**
-     * The feature id for the '<em><b>Key Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__KEY_CLASS = 35;
-
-    /**
-     * The feature id for the '<em><b>Large Icon</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__LARGE_ICON = 36;
-
-    /**
-     * The feature id for the '<em><b>Lifecycle</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__LIFECYCLE = 37;
-
-    /**
-     * The feature id for the '<em><b>Lifecycle Factory</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__LIFECYCLE_FACTORY = 38;
-
-    /**
-     * The feature id for the '<em><b>List Entries</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__LIST_ENTRIES = 39;
-
-    /**
-     * The feature id for the '<em><b>Locale Config</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__LOCALE_CONFIG = 40;
-
-    /**
-     * The feature id for the '<em><b>Managed Bean</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__MANAGED_BEAN = 41;
-
-    /**
-     * The feature id for the '<em><b>Managed Bean Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__MANAGED_BEAN_CLASS = 42;
-
-    /**
-     * The feature id for the '<em><b>Managed Bean Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__MANAGED_BEAN_NAME = 43;
-
-    /**
-     * The feature id for the '<em><b>Managed Bean Scope</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__MANAGED_BEAN_SCOPE = 44;
-
-    /**
-     * The feature id for the '<em><b>Managed Property</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__MANAGED_PROPERTY = 45;
-
-    /**
-     * The feature id for the '<em><b>Map Entries</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__MAP_ENTRIES = 46;
-
-    /**
-     * The feature id for the '<em><b>Map Entry</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__MAP_ENTRY = 47;
-
-    /**
-     * The feature id for the '<em><b>Message Bundle</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__MESSAGE_BUNDLE = 48;
-
-    /**
-     * The feature id for the '<em><b>Navigation Case</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__NAVIGATION_CASE = 49;
-
-    /**
-     * The feature id for the '<em><b>Navigation Handler</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__NAVIGATION_HANDLER = 50;
-
-    /**
-     * The feature id for the '<em><b>Navigation Rule</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__NAVIGATION_RULE = 51;
-
-    /**
-     * The feature id for the '<em><b>Null Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__NULL_VALUE = 52;
-
-    /**
-     * The feature id for the '<em><b>Phase Listener</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__PHASE_LISTENER = 53;
-
-    /**
-     * The feature id for the '<em><b>Property</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__PROPERTY = 54;
-
-    /**
-     * The feature id for the '<em><b>Property Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__PROPERTY_CLASS = 55;
-
-    /**
-     * The feature id for the '<em><b>Property Extension</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__PROPERTY_EXTENSION = 56;
-
-    /**
-     * The feature id for the '<em><b>Property Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__PROPERTY_NAME = 57;
-
-    /**
-     * The feature id for the '<em><b>Property Resolver</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__PROPERTY_RESOLVER = 58;
-
-    /**
-     * The feature id for the '<em><b>Redirect</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__REDIRECT = 59;
-
-    /**
-     * The feature id for the '<em><b>Referenced Bean</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__REFERENCED_BEAN = 60;
-
-    /**
-     * The feature id for the '<em><b>Referenced Bean Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__REFERENCED_BEAN_CLASS = 61;
-
-    /**
-     * The feature id for the '<em><b>Referenced Bean Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__REFERENCED_BEAN_NAME = 62;
-
-    /**
-     * The feature id for the '<em><b>Renderer</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__RENDERER = 63;
-
-    /**
-     * The feature id for the '<em><b>Renderer Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__RENDERER_CLASS = 64;
-
-    /**
-     * The feature id for the '<em><b>Renderer Extension</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__RENDERER_EXTENSION = 65;
-
-    /**
-     * The feature id for the '<em><b>Renderer Type</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__RENDERER_TYPE = 66;
-
-    /**
-     * The feature id for the '<em><b>Render Kit</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__RENDER_KIT = 67;
-
-    /**
-     * The feature id for the '<em><b>Render Kit Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__RENDER_KIT_CLASS = 68;
-
-    /**
-     * The feature id for the '<em><b>Render Kit Factory</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__RENDER_KIT_FACTORY = 69;
-
-    /**
-     * The feature id for the '<em><b>Render Kit Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__RENDER_KIT_ID = 70;
-
-    /**
-     * The feature id for the '<em><b>Small Icon</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__SMALL_ICON = 71;
-
-    /**
-     * The feature id for the '<em><b>State Manager</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__STATE_MANAGER = 72;
-
-    /**
-     * The feature id for the '<em><b>Suggested Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__SUGGESTED_VALUE = 73;
-
-    /**
-     * The feature id for the '<em><b>Supported Locale</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__SUPPORTED_LOCALE = 74;
-
-    /**
-     * The feature id for the '<em><b>To View Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__TO_VIEW_ID = 75;
-
-    /**
-     * The feature id for the '<em><b>Validator</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__VALIDATOR = 76;
-
-    /**
-     * The feature id for the '<em><b>Validator Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__VALIDATOR_CLASS = 77;
-
-    /**
-     * The feature id for the '<em><b>Validator Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__VALIDATOR_ID = 78;
-
-    /**
-     * The feature id for the '<em><b>Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__VALUE = 79;
-
-    /**
-     * The feature id for the '<em><b>Value Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__VALUE_CLASS = 80;
-
-    /**
-     * The feature id for the '<em><b>Variable Resolver</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__VARIABLE_RESOLVER = 81;
-
-    /**
-     * The feature id for the '<em><b>View Handler</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT__VIEW_HANDLER = 82;
-
-    /**
-     * The number of structural features of the '<em>Document Root</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int DOCUMENT_ROOT_FEATURE_COUNT = 83;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicAttributeImpl <em>Dynamic Attribute</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicAttributeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDynamicAttribute()
-     * @generated
-     */
-    int DYNAMIC_ATTRIBUTE = 22;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int DYNAMIC_ATTRIBUTE__NAME = 0;
-
-    /**
-     * The feature id for the '<em><b>Value</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int DYNAMIC_ATTRIBUTE__VALUE = 1;
-
-    /**
-     * The number of structural features of the '<em>Dynamic Attribute</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int DYNAMIC_ATTRIBUTE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl <em>Dynamic Element</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDynamicElement()
-     * @generated
-     */
-    int DYNAMIC_ELEMENT = 23;
-
-    /**
-     * The feature id for the '<em><b>Child Nodes</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int DYNAMIC_ELEMENT__CHILD_NODES = 0;
-
-    /**
-     * The feature id for the '<em><b>Name</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int DYNAMIC_ELEMENT__NAME = 1;
-
-    /**
-     * The feature id for the '<em><b>Attributes</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int DYNAMIC_ELEMENT__ATTRIBUTES = 2;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int DYNAMIC_ELEMENT__TEXT_CONTENT = 3;
-
-    /**
-     * The number of structural features of the '<em>Dynamic Element</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int DYNAMIC_ELEMENT_FEATURE_COUNT = 4;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ELResolverTypeImpl <em>EL Resolver Type</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ELResolverTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getELResolverType()
-     * @generated
-     */
-    int EL_RESOLVER_TYPE = 86;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl <em>Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesConfigType()
-     * @generated
-     */
-	int FACES_CONFIG_TYPE = 24;
-
-    /**
-     * The feature id for the '<em><b>Application</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACES_CONFIG_TYPE__APPLICATION = 0;
-
-    /**
-     * The feature id for the '<em><b>Factory</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACES_CONFIG_TYPE__FACTORY = 1;
-
-    /**
-     * The feature id for the '<em><b>Component</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACES_CONFIG_TYPE__COMPONENT = 2;
-
-    /**
-     * The feature id for the '<em><b>Converter</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACES_CONFIG_TYPE__CONVERTER = 3;
-
-    /**
-     * The feature id for the '<em><b>Managed Bean</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACES_CONFIG_TYPE__MANAGED_BEAN = 4;
-
-    /**
-     * The feature id for the '<em><b>Navigation Rule</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACES_CONFIG_TYPE__NAVIGATION_RULE = 5;
-
-    /**
-     * The feature id for the '<em><b>Referenced Bean</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACES_CONFIG_TYPE__REFERENCED_BEAN = 6;
-
-    /**
-     * The feature id for the '<em><b>Render Kit</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACES_CONFIG_TYPE__RENDER_KIT = 7;
-
-    /**
-     * The feature id for the '<em><b>Lifecycle</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACES_CONFIG_TYPE__LIFECYCLE = 8;
-
-    /**
-     * The feature id for the '<em><b>Validator</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACES_CONFIG_TYPE__VALIDATOR = 9;
-
-    /**
-     * The feature id for the '<em><b>Faces Config Extension</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION = 10;
-
-    /**
-     * The feature id for the '<em><b>Xmlns</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACES_CONFIG_TYPE__XMLNS = 11;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACES_CONFIG_TYPE__ID = 12;
-
-    /**
-     * The number of structural features of the '<em>Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACES_CONFIG_TYPE_FEATURE_COUNT = 13;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl <em>Faces Context Factory Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesContextFactoryType()
-     * @generated
-     */
-	int FACES_CONTEXT_FACTORY_TYPE = 25;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACES_CONTEXT_FACTORY_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Faces Context Factory Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACES_CONTEXT_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetExtensionTypeImpl <em>Facet Extension Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetExtensionTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetExtensionType()
-     * @generated
-     */
-	int FACET_EXTENSION_TYPE = 26;
-
-    /**
-     * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACET_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACET_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACET_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-     * The number of structural features of the '<em>Facet Extension Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACET_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetNameTypeImpl <em>Facet Name Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetNameTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetNameType()
-     * @generated
-     */
-	int FACET_NAME_TYPE = 27;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACET_NAME_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACET_NAME_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Facet Name Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACET_NAME_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl <em>Facet Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetType()
-     * @generated
-     */
-	int FACET_TYPE = 28;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACET_TYPE__DESCRIPTION = 0;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACET_TYPE__DISPLAY_NAME = 1;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACET_TYPE__ICON = 2;
-
-    /**
-     * The feature id for the '<em><b>Facet Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACET_TYPE__FACET_NAME = 3;
-
-    /**
-     * The feature id for the '<em><b>Facet Extension</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACET_TYPE__FACET_EXTENSION = 4;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACET_TYPE__ID = 5;
-
-    /**
-     * The number of structural features of the '<em>Facet Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACET_TYPE_FEATURE_COUNT = 6;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl <em>Factory Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFactoryType()
-     * @generated
-     */
-	int FACTORY_TYPE = 29;
-
-    /**
-     * The feature id for the '<em><b>Application Factory</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACTORY_TYPE__APPLICATION_FACTORY = 0;
-
-    /**
-     * The feature id for the '<em><b>Faces Context Factory</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACTORY_TYPE__FACES_CONTEXT_FACTORY = 1;
-
-    /**
-     * The feature id for the '<em><b>Lifecycle Factory</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACTORY_TYPE__LIFECYCLE_FACTORY = 2;
-
-    /**
-     * The feature id for the '<em><b>Render Kit Factory</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACTORY_TYPE__RENDER_KIT_FACTORY = 3;
-
-    /**
-     * The feature id for the '<em><b>Factory Extension</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACTORY_TYPE__FACTORY_EXTENSION = 4;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACTORY_TYPE__ID = 5;
-
-    /**
-     * The number of structural features of the '<em>Factory Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FACTORY_TYPE_FEATURE_COUNT = 6;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromActionTypeImpl <em>From Action Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromActionTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromActionType()
-     * @generated
-     */
-	int FROM_ACTION_TYPE = 30;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FROM_ACTION_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FROM_ACTION_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>From Action Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FROM_ACTION_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromOutcomeTypeImpl <em>From Outcome Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromOutcomeTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromOutcomeType()
-     * @generated
-     */
-	int FROM_OUTCOME_TYPE = 31;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FROM_OUTCOME_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FROM_OUTCOME_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>From Outcome Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FROM_OUTCOME_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromViewIdTypeImpl <em>From View Id Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromViewIdTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromViewIdType()
-     * @generated
-     */
-	int FROM_VIEW_ID_TYPE = 32;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FROM_VIEW_ID_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FROM_VIEW_ID_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>From View Id Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int FROM_VIEW_ID_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl <em>Icon Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getIconType()
-     * @generated
-     */
-	int ICON_TYPE = 33;
-
-    /**
-     * The feature id for the '<em><b>Small Icon</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ICON_TYPE__SMALL_ICON = 0;
-
-    /**
-     * The feature id for the '<em><b>Large Icon</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ICON_TYPE__LARGE_ICON = 1;
-
-    /**
-     * The feature id for the '<em><b>Lang</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ICON_TYPE__LANG = 2;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ICON_TYPE__ID = 3;
-
-    /**
-     * The number of structural features of the '<em>Icon Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int ICON_TYPE_FEATURE_COUNT = 4;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl <em>Key Class Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getKeyClassType()
-     * @generated
-     */
-	int KEY_CLASS_TYPE = 34;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int KEY_CLASS_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int KEY_CLASS_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Key Class Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int KEY_CLASS_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyTypeImpl <em>Key Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.KeyTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getKeyType()
-     * @generated
-     */
-	int KEY_TYPE = 35;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int KEY_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int KEY_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Key Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int KEY_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LargeIconTypeImpl <em>Large Icon Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LargeIconTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLargeIconType()
-     * @generated
-     */
-	int LARGE_ICON_TYPE = 36;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int LARGE_ICON_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int LARGE_ICON_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Large Icon Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int LARGE_ICON_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleFactoryTypeImpl <em>Lifecycle Factory Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleFactoryTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLifecycleFactoryType()
-     * @generated
-     */
-	int LIFECYCLE_FACTORY_TYPE = 37;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int LIFECYCLE_FACTORY_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Lifecycle Factory Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int LIFECYCLE_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl <em>Lifecycle Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLifecycleType()
-     * @generated
-     */
-	int LIFECYCLE_TYPE = 38;
-
-    /**
-     * The feature id for the '<em><b>Phase Listener</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int LIFECYCLE_TYPE__PHASE_LISTENER = 0;
-
-    /**
-     * The feature id for the '<em><b>Lifecycle Extension</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int LIFECYCLE_TYPE__LIFECYCLE_EXTENSION = 1;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int LIFECYCLE_TYPE__ID = 2;
-
-    /**
-     * The number of structural features of the '<em>Lifecycle Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int LIFECYCLE_TYPE_FEATURE_COUNT = 3;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl <em>List Entries Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getListEntriesType()
-     * @generated
-     */
-	int LIST_ENTRIES_TYPE = 39;
-
-    /**
-     * The feature id for the '<em><b>Value Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int LIST_ENTRIES_TYPE__VALUE_CLASS = 0;
-
-    /**
-     * The feature id for the '<em><b>Null Value</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int LIST_ENTRIES_TYPE__NULL_VALUE = 1;
-
-    /**
-     * The feature id for the '<em><b>Value</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int LIST_ENTRIES_TYPE__VALUE = 2;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int LIST_ENTRIES_TYPE__ID = 3;
-
-    /**
-     * The number of structural features of the '<em>List Entries Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int LIST_ENTRIES_TYPE_FEATURE_COUNT = 4;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl <em>Locale Config Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLocaleConfigType()
-     * @generated
-     */
-	int LOCALE_CONFIG_TYPE = 40;
-
-    /**
-     * The feature id for the '<em><b>Default Locale</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int LOCALE_CONFIG_TYPE__DEFAULT_LOCALE = 0;
-
-    /**
-     * The feature id for the '<em><b>Supported Locale</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE = 1;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int LOCALE_CONFIG_TYPE__ID = 2;
-
-    /**
-     * The number of structural features of the '<em>Locale Config Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int LOCALE_CONFIG_TYPE_FEATURE_COUNT = 3;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanClassTypeImpl <em>Managed Bean Class Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanClassTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanClassType()
-     * @generated
-     */
-	int MANAGED_BEAN_CLASS_TYPE = 41;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_BEAN_CLASS_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Managed Bean Class Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_BEAN_CLASS_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanNameTypeImpl <em>Managed Bean Name Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanNameTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanNameType()
-     * @generated
-     */
-	int MANAGED_BEAN_NAME_TYPE = 42;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_BEAN_NAME_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Managed Bean Name Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_BEAN_NAME_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanScopeTypeImpl <em>Managed Bean Scope Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanScopeTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanScopeType()
-     * @generated
-     */
-	int MANAGED_BEAN_SCOPE_TYPE = 43;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_BEAN_SCOPE_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Managed Bean Scope Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_BEAN_SCOPE_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl <em>Managed Bean Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanType()
-     * @generated
-     */
-	int MANAGED_BEAN_TYPE = 44;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_BEAN_TYPE__DESCRIPTION = 0;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_BEAN_TYPE__DISPLAY_NAME = 1;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_BEAN_TYPE__ICON = 2;
-
-    /**
-     * The feature id for the '<em><b>Managed Bean Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME = 3;
-
-    /**
-     * The feature id for the '<em><b>Managed Bean Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS = 4;
-
-    /**
-     * The feature id for the '<em><b>Managed Bean Scope</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE = 5;
-
-    /**
-     * The feature id for the '<em><b>Managed Property</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_BEAN_TYPE__MANAGED_PROPERTY = 6;
-
-    /**
-     * The feature id for the '<em><b>Map Entries</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_BEAN_TYPE__MAP_ENTRIES = 7;
-
-    /**
-     * The feature id for the '<em><b>List Entries</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_BEAN_TYPE__LIST_ENTRIES = 8;
-
-    /**
-     * The feature id for the '<em><b>Managed Bean Extension</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION = 9;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_BEAN_TYPE__ID = 10;
-
-    /**
-     * The number of structural features of the '<em>Managed Bean Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_BEAN_TYPE_FEATURE_COUNT = 11;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl <em>Managed Property Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedPropertyType()
-     * @generated
-     */
-	int MANAGED_PROPERTY_TYPE = 45;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_PROPERTY_TYPE__DESCRIPTION = 0;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_PROPERTY_TYPE__DISPLAY_NAME = 1;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_PROPERTY_TYPE__ICON = 2;
-
-    /**
-     * The feature id for the '<em><b>Property Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_PROPERTY_TYPE__PROPERTY_NAME = 3;
-
-    /**
-     * The feature id for the '<em><b>Property Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_PROPERTY_TYPE__PROPERTY_CLASS = 4;
-
-    /**
-     * The feature id for the '<em><b>Map Entries</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_PROPERTY_TYPE__MAP_ENTRIES = 5;
-
-    /**
-     * The feature id for the '<em><b>Null Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_PROPERTY_TYPE__NULL_VALUE = 6;
-
-    /**
-     * The feature id for the '<em><b>Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_PROPERTY_TYPE__VALUE = 7;
-
-    /**
-     * The feature id for the '<em><b>List Entries</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_PROPERTY_TYPE__LIST_ENTRIES = 8;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_PROPERTY_TYPE__ID = 9;
-
-    /**
-     * The number of structural features of the '<em>Managed Property Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MANAGED_PROPERTY_TYPE_FEATURE_COUNT = 10;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl <em>Map Entries Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMapEntriesType()
-     * @generated
-     */
-	int MAP_ENTRIES_TYPE = 46;
-
-    /**
-     * The feature id for the '<em><b>Key Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MAP_ENTRIES_TYPE__KEY_CLASS = 0;
-
-    /**
-     * The feature id for the '<em><b>Value Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MAP_ENTRIES_TYPE__VALUE_CLASS = 1;
-
-    /**
-     * The feature id for the '<em><b>Map Entry</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MAP_ENTRIES_TYPE__MAP_ENTRY = 2;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MAP_ENTRIES_TYPE__ID = 3;
-
-    /**
-     * The number of structural features of the '<em>Map Entries Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MAP_ENTRIES_TYPE_FEATURE_COUNT = 4;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl <em>Map Entry Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMapEntryType()
-     * @generated
-     */
-	int MAP_ENTRY_TYPE = 47;
-
-    /**
-     * The feature id for the '<em><b>Key</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MAP_ENTRY_TYPE__KEY = 0;
-
-    /**
-     * The feature id for the '<em><b>Null Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MAP_ENTRY_TYPE__NULL_VALUE = 1;
-
-    /**
-     * The feature id for the '<em><b>Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MAP_ENTRY_TYPE__VALUE = 2;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MAP_ENTRY_TYPE__ID = 3;
-
-    /**
-     * The number of structural features of the '<em>Map Entry Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MAP_ENTRY_TYPE_FEATURE_COUNT = 4;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl <em>Message Bundle Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMessageBundleType()
-     * @generated
-     */
-	int MESSAGE_BUNDLE_TYPE = 48;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MESSAGE_BUNDLE_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MESSAGE_BUNDLE_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Message Bundle Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int MESSAGE_BUNDLE_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl <em>Navigation Case Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationCaseType()
-     * @generated
-     */
-	int NAVIGATION_CASE_TYPE = 49;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NAVIGATION_CASE_TYPE__DESCRIPTION = 0;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NAVIGATION_CASE_TYPE__DISPLAY_NAME = 1;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NAVIGATION_CASE_TYPE__ICON = 2;
-
-    /**
-     * The feature id for the '<em><b>From Action</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NAVIGATION_CASE_TYPE__FROM_ACTION = 3;
-
-    /**
-     * The feature id for the '<em><b>From Outcome</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NAVIGATION_CASE_TYPE__FROM_OUTCOME = 4;
-
-    /**
-     * The feature id for the '<em><b>To View Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NAVIGATION_CASE_TYPE__TO_VIEW_ID = 5;
-
-    /**
-     * The feature id for the '<em><b>Redirect</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NAVIGATION_CASE_TYPE__REDIRECT = 6;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NAVIGATION_CASE_TYPE__ID = 7;
-
-    /**
-     * The number of structural features of the '<em>Navigation Case Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NAVIGATION_CASE_TYPE_FEATURE_COUNT = 8;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl <em>Navigation Handler Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationHandlerType()
-     * @generated
-     */
-	int NAVIGATION_HANDLER_TYPE = 50;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NAVIGATION_HANDLER_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NAVIGATION_HANDLER_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Navigation Handler Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NAVIGATION_HANDLER_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl <em>Navigation Rule Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationRuleType()
-     * @generated
-     */
-	int NAVIGATION_RULE_TYPE = 51;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NAVIGATION_RULE_TYPE__DESCRIPTION = 0;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NAVIGATION_RULE_TYPE__DISPLAY_NAME = 1;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NAVIGATION_RULE_TYPE__ICON = 2;
-
-    /**
-     * The feature id for the '<em><b>From View Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NAVIGATION_RULE_TYPE__FROM_VIEW_ID = 3;
-
-    /**
-     * The feature id for the '<em><b>Navigation Case</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NAVIGATION_RULE_TYPE__NAVIGATION_CASE = 4;
-
-    /**
-     * The feature id for the '<em><b>Navigation Rule Extension</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION = 5;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NAVIGATION_RULE_TYPE__ID = 6;
-
-    /**
-     * The number of structural features of the '<em>Navigation Rule Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NAVIGATION_RULE_TYPE_FEATURE_COUNT = 7;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NullValueTypeImpl <em>Null Value Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NullValueTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNullValueType()
-     * @generated
-     */
-	int NULL_VALUE_TYPE = 52;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NULL_VALUE_TYPE__ID = 0;
-
-    /**
-     * The number of structural features of the '<em>Null Value Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int NULL_VALUE_TYPE_FEATURE_COUNT = 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl <em>Phase Listener Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPhaseListenerType()
-     * @generated
-     */
-	int PHASE_LISTENER_TYPE = 53;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PHASE_LISTENER_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PHASE_LISTENER_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Phase Listener Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PHASE_LISTENER_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl <em>Property Class Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyClassType()
-     * @generated
-     */
-	int PROPERTY_CLASS_TYPE = 54;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PROPERTY_CLASS_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PROPERTY_CLASS_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Property Class Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PROPERTY_CLASS_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyExtensionTypeImpl <em>Property Extension Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyExtensionTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyExtensionType()
-     * @generated
-     */
-	int PROPERTY_EXTENSION_TYPE = 55;
-
-    /**
-     * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int PROPERTY_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int PROPERTY_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PROPERTY_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-     * The number of structural features of the '<em>Property Extension Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PROPERTY_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl <em>Property Name Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyNameType()
-     * @generated
-     */
-	int PROPERTY_NAME_TYPE = 56;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PROPERTY_NAME_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PROPERTY_NAME_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Property Name Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PROPERTY_NAME_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl <em>Property Resolver Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyResolverType()
-     * @generated
-     */
-	int PROPERTY_RESOLVER_TYPE = 57;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PROPERTY_RESOLVER_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PROPERTY_RESOLVER_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Property Resolver Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PROPERTY_RESOLVER_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl <em>Property Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyType()
-     * @generated
-     */
-	int PROPERTY_TYPE = 58;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PROPERTY_TYPE__DESCRIPTION = 0;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PROPERTY_TYPE__DISPLAY_NAME = 1;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PROPERTY_TYPE__ICON = 2;
-
-    /**
-     * The feature id for the '<em><b>Property Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PROPERTY_TYPE__PROPERTY_NAME = 3;
-
-    /**
-     * The feature id for the '<em><b>Property Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PROPERTY_TYPE__PROPERTY_CLASS = 4;
-
-    /**
-     * The feature id for the '<em><b>Default Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PROPERTY_TYPE__DEFAULT_VALUE = 5;
-
-    /**
-     * The feature id for the '<em><b>Suggested Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PROPERTY_TYPE__SUGGESTED_VALUE = 6;
-
-    /**
-     * The feature id for the '<em><b>Property Extension</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PROPERTY_TYPE__PROPERTY_EXTENSION = 7;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PROPERTY_TYPE__ID = 8;
-
-    /**
-     * The number of structural features of the '<em>Property Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int PROPERTY_TYPE_FEATURE_COUNT = 9;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl <em>Redirect Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRedirectType()
-     * @generated
-     */
-	int REDIRECT_TYPE = 59;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int REDIRECT_TYPE__ID = 0;
-
-    /**
-     * The number of structural features of the '<em>Redirect Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int REDIRECT_TYPE_FEATURE_COUNT = 1;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl <em>Referenced Bean Class Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanClassType()
-     * @generated
-     */
-	int REFERENCED_BEAN_CLASS_TYPE = 60;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int REFERENCED_BEAN_CLASS_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Referenced Bean Class Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int REFERENCED_BEAN_CLASS_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl <em>Referenced Bean Name Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanNameType()
-     * @generated
-     */
-	int REFERENCED_BEAN_NAME_TYPE = 61;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int REFERENCED_BEAN_NAME_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Referenced Bean Name Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int REFERENCED_BEAN_NAME_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl <em>Referenced Bean Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanType()
-     * @generated
-     */
-	int REFERENCED_BEAN_TYPE = 62;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int REFERENCED_BEAN_TYPE__DESCRIPTION = 0;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int REFERENCED_BEAN_TYPE__DISPLAY_NAME = 1;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int REFERENCED_BEAN_TYPE__ICON = 2;
-
-    /**
-     * The feature id for the '<em><b>Referenced Bean Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME = 3;
-
-    /**
-     * The feature id for the '<em><b>Referenced Bean Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS = 4;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int REFERENCED_BEAN_TYPE__ID = 5;
-
-    /**
-     * The number of structural features of the '<em>Referenced Bean Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int REFERENCED_BEAN_TYPE_FEATURE_COUNT = 6;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl <em>Renderer Class Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererClassType()
-     * @generated
-     */
-	int RENDERER_CLASS_TYPE = 63;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDERER_CLASS_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDERER_CLASS_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Renderer Class Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDERER_CLASS_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererExtensionTypeImpl <em>Renderer Extension Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererExtensionTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererExtensionType()
-     * @generated
-     */
-	int RENDERER_EXTENSION_TYPE = 64;
-
-    /**
-     * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int RENDERER_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int RENDERER_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDERER_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-     * The number of structural features of the '<em>Renderer Extension Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDERER_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl <em>Renderer Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererType()
-     * @generated
-     */
-	int RENDERER_TYPE = 65;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDERER_TYPE__DESCRIPTION = 0;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDERER_TYPE__DISPLAY_NAME = 1;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDERER_TYPE__ICON = 2;
-
-    /**
-     * The feature id for the '<em><b>Component Family</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDERER_TYPE__COMPONENT_FAMILY = 3;
-
-    /**
-     * The feature id for the '<em><b>Renderer Type</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDERER_TYPE__RENDERER_TYPE = 4;
-
-    /**
-     * The feature id for the '<em><b>Renderer Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDERER_TYPE__RENDERER_CLASS = 5;
-
-    /**
-     * The feature id for the '<em><b>Facet</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDERER_TYPE__FACET = 6;
-
-    /**
-     * The feature id for the '<em><b>Attribute</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDERER_TYPE__ATTRIBUTE = 7;
-
-    /**
-     * The feature id for the '<em><b>Renderer Extension</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDERER_TYPE__RENDERER_EXTENSION = 8;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDERER_TYPE__ID = 9;
-
-    /**
-     * The number of structural features of the '<em>Renderer Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDERER_TYPE_FEATURE_COUNT = 10;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl <em>Renderer Type Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererTypeType()
-     * @generated
-     */
-	int RENDERER_TYPE_TYPE = 66;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDERER_TYPE_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDERER_TYPE_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Renderer Type Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDERER_TYPE_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl <em>Render Kit Class Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitClassType()
-     * @generated
-     */
-	int RENDER_KIT_CLASS_TYPE = 67;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDER_KIT_CLASS_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDER_KIT_CLASS_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Render Kit Class Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDER_KIT_CLASS_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl <em>Render Kit Factory Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitFactoryType()
-     * @generated
-     */
-	int RENDER_KIT_FACTORY_TYPE = 68;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDER_KIT_FACTORY_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Render Kit Factory Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDER_KIT_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl <em>Render Kit Id Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitIdType()
-     * @generated
-     */
-	int RENDER_KIT_ID_TYPE = 69;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDER_KIT_ID_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDER_KIT_ID_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Render Kit Id Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDER_KIT_ID_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl <em>Render Kit Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitType()
-     * @generated
-     */
-	int RENDER_KIT_TYPE = 70;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDER_KIT_TYPE__DESCRIPTION = 0;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDER_KIT_TYPE__DISPLAY_NAME = 1;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDER_KIT_TYPE__ICON = 2;
-
-    /**
-     * The feature id for the '<em><b>Render Kit Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDER_KIT_TYPE__RENDER_KIT_ID = 3;
-
-    /**
-     * The feature id for the '<em><b>Render Kit Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDER_KIT_TYPE__RENDER_KIT_CLASS = 4;
-
-    /**
-     * The feature id for the '<em><b>Renderer</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDER_KIT_TYPE__RENDERER = 5;
-
-    /**
-     * The feature id for the '<em><b>Render Kit Extension</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int RENDER_KIT_TYPE__RENDER_KIT_EXTENSION = 6;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDER_KIT_TYPE__ID = 7;
-
-    /**
-     * The number of structural features of the '<em>Render Kit Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int RENDER_KIT_TYPE_FEATURE_COUNT = 8;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl <em>Small Icon Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSmallIconType()
-     * @generated
-     */
-	int SMALL_ICON_TYPE = 71;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int SMALL_ICON_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int SMALL_ICON_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Small Icon Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int SMALL_ICON_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl <em>State Manager Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getStateManagerType()
-     * @generated
-     */
-	int STATE_MANAGER_TYPE = 72;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int STATE_MANAGER_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int STATE_MANAGER_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>State Manager Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int STATE_MANAGER_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl <em>Suggested Value Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSuggestedValueType()
-     * @generated
-     */
-	int SUGGESTED_VALUE_TYPE = 73;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int SUGGESTED_VALUE_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int SUGGESTED_VALUE_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Suggested Value Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int SUGGESTED_VALUE_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl <em>Supported Locale Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSupportedLocaleType()
-     * @generated
-     */
-	int SUPPORTED_LOCALE_TYPE = 74;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int SUPPORTED_LOCALE_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int SUPPORTED_LOCALE_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Supported Locale Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int SUPPORTED_LOCALE_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl <em>To View Id Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getToViewIdType()
-     * @generated
-     */
-	int TO_VIEW_ID_TYPE = 75;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int TO_VIEW_ID_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int TO_VIEW_ID_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>To View Id Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int TO_VIEW_ID_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl <em>Validator Class Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorClassType()
-     * @generated
-     */
-	int VALIDATOR_CLASS_TYPE = 76;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VALIDATOR_CLASS_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VALIDATOR_CLASS_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Validator Class Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VALIDATOR_CLASS_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl <em>Validator Id Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorIdType()
-     * @generated
-     */
-	int VALIDATOR_ID_TYPE = 77;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VALIDATOR_ID_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VALIDATOR_ID_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Validator Id Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VALIDATOR_ID_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl <em>Validator Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorType()
-     * @generated
-     */
-	int VALIDATOR_TYPE = 78;
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VALIDATOR_TYPE__DESCRIPTION = 0;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VALIDATOR_TYPE__DISPLAY_NAME = 1;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VALIDATOR_TYPE__ICON = 2;
-
-    /**
-     * The feature id for the '<em><b>Validator Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VALIDATOR_TYPE__VALIDATOR_ID = 3;
-
-    /**
-     * The feature id for the '<em><b>Validator Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VALIDATOR_TYPE__VALIDATOR_CLASS = 4;
-
-    /**
-     * The feature id for the '<em><b>Attribute</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VALIDATOR_TYPE__ATTRIBUTE = 5;
-
-    /**
-     * The feature id for the '<em><b>Property</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VALIDATOR_TYPE__PROPERTY = 6;
-
-    /**
-     * The feature id for the '<em><b>Validator Extension</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int VALIDATOR_TYPE__VALIDATOR_EXTENSION = 7;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VALIDATOR_TYPE__ID = 8;
-
-    /**
-     * The number of structural features of the '<em>Validator Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VALIDATOR_TYPE_FEATURE_COUNT = 9;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl <em>Value Class Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValueClassType()
-     * @generated
-     */
-	int VALUE_CLASS_TYPE = 79;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VALUE_CLASS_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VALUE_CLASS_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Value Class Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VALUE_CLASS_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl <em>Value Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValueType()
-     * @generated
-     */
-	int VALUE_TYPE = 80;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VALUE_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VALUE_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Value Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VALUE_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl <em>Variable Resolver Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getVariableResolverType()
-     * @generated
-     */
-	int VARIABLE_RESOLVER_TYPE = 81;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VARIABLE_RESOLVER_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VARIABLE_RESOLVER_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Variable Resolver Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VARIABLE_RESOLVER_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl <em>View Handler Type</em>}' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getViewHandlerType()
-     * @generated
-     */
-	int VIEW_HANDLER_TYPE = 82;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VIEW_HANDLER_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VIEW_HANDLER_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>View Handler Type</em>' class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	int VIEW_HANDLER_TYPE_FEATURE_COUNT = 2;
-
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationExtensionTypeImpl <em>Application Extension Type</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationExtensionTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationExtensionType()
-     * @generated
-     */
-    int APPLICATION_EXTENSION_TYPE = 84;
-
-    /**
-     * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int APPLICATION_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int APPLICATION_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int APPLICATION_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-     * The number of structural features of the '<em>Application Extension Type</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int APPLICATION_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl <em>Resource Bundle Type</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getResourceBundleType()
-     * @generated
-     */
-    int RESOURCE_BUNDLE_TYPE = 93;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BaseNameTypeImpl <em>Base Name Type</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.BaseNameTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getBaseNameType()
-     * @generated
-     */
-    int BASE_NAME_TYPE = 94;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VarTypeImpl <em>Var Type</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.VarTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getVarType()
-     * @generated
-     */
-    int VAR_TYPE = 95;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigExtensionTypeImpl <em>Extension Type</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigExtensionTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesConfigExtensionType()
-     * @generated
-     */
-    int FACES_CONFIG_EXTENSION_TYPE = 87;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryExtensionTypeImpl <em>Factory Extension Type</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryExtensionTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFactoryExtensionType()
-     * @generated
-     */
-    int FACTORY_EXTENSION_TYPE = 88;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleExtensionTypeImpl <em>Lifecycle Extension Type</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleExtensionTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLifecycleExtensionType()
-     * @generated
-     */
-    int LIFECYCLE_EXTENSION_TYPE = 89;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterExtensionTypeImpl <em>Converter Extension Type</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterExtensionTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterExtensionType()
-     * @generated
-     */
-    int CONVERTER_EXTENSION_TYPE = 85;
-
-    /**
-     * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONVERTER_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONVERTER_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONVERTER_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-     * The number of structural features of the '<em>Converter Extension Type</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int CONVERTER_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int EL_RESOLVER_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int EL_RESOLVER_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>EL Resolver Type</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int EL_RESOLVER_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACES_CONFIG_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACES_CONFIG_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACES_CONFIG_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-     * The number of structural features of the '<em>Extension Type</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACES_CONFIG_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-
-    /**
-     * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACTORY_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACTORY_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACTORY_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-     * The number of structural features of the '<em>Factory Extension Type</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int FACTORY_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-
-    /**
-     * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int LIFECYCLE_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int LIFECYCLE_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int LIFECYCLE_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-     * The number of structural features of the '<em>Lifecycle Extension Type</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int LIFECYCLE_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanExtensionTypeImpl <em>Managed Bean Extension Type</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanExtensionTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanExtensionType()
-     * @generated
-     */
-    int MANAGED_BEAN_EXTENSION_TYPE = 90;
-
-    /**
-     * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int MANAGED_BEAN_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int MANAGED_BEAN_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int MANAGED_BEAN_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-     * The number of structural features of the '<em>Managed Bean Extension Type</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int MANAGED_BEAN_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleExtensionTypeImpl <em>Navigation Rule Extension Type</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleExtensionTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationRuleExtensionType()
-     * @generated
-     */
-    int NAVIGATION_RULE_EXTENSION_TYPE = 91;
-
-    /**
-     * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int NAVIGATION_RULE_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int NAVIGATION_RULE_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int NAVIGATION_RULE_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-     * The number of structural features of the '<em>Navigation Rule Extension Type</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int NAVIGATION_RULE_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorExtensionTypeImpl <em>Validator Extension Type</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorExtensionTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorExtensionType()
-     * @generated
-     */
-    int VALIDATOR_EXTENSION_TYPE = 92;
-
-    /**
-     * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int VALIDATOR_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int VALIDATOR_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int VALIDATOR_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-     * The number of structural features of the '<em>Validator Extension Type</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int VALIDATOR_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-
-    /**
-     * The feature id for the '<em><b>Description</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int RESOURCE_BUNDLE_TYPE__DESCRIPTION = 0;
-
-    /**
-     * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int RESOURCE_BUNDLE_TYPE__DISPLAY_NAME = 1;
-
-    /**
-     * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int RESOURCE_BUNDLE_TYPE__ICON = 2;
-
-    /**
-     * The feature id for the '<em><b>Base Name</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int RESOURCE_BUNDLE_TYPE__BASE_NAME = 3;
-
-    /**
-     * The feature id for the '<em><b>Var</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int RESOURCE_BUNDLE_TYPE__VAR = 4;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int RESOURCE_BUNDLE_TYPE__ID = 5;
-
-    /**
-     * The number of structural features of the '<em>Resource Bundle Type</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int RESOURCE_BUNDLE_TYPE_FEATURE_COUNT = 6;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int BASE_NAME_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int BASE_NAME_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Base Name Type</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int BASE_NAME_TYPE_FEATURE_COUNT = 2;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int VAR_TYPE__TEXT_CONTENT = 0;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int VAR_TYPE__ID = 1;
-
-    /**
-     * The number of structural features of the '<em>Var Type</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int VAR_TYPE_FEATURE_COUNT = 2;
-
-
-    /**
-     * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitExtensionTypeImpl <em>Render Kit Extension Type</em>}' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitExtensionTypeImpl
-     * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitExtensionType()
-     * @generated
-     */
-    int RENDER_KIT_EXTENSION_TYPE = 96;
-
-    /**
-     * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int RENDER_KIT_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-     * The feature id for the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int RENDER_KIT_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-     * The feature id for the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int RENDER_KIT_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-     * The number of structural features of the '<em>Render Kit Extension Type</em>' class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    int RENDER_KIT_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType <em>Action Listener Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Action Listener Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType
-     * @generated
-     */
-	EClass getActionListenerType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getTextContent()
-     * @see #getActionListenerType()
-     * @generated
-     */
-	EAttribute getActionListenerType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getId()
-     * @see #getActionListenerType()
-     * @generated
-     */
-	EAttribute getActionListenerType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType <em>Application Factory Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Application Factory Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType
-     * @generated
-     */
-	EClass getApplicationFactoryType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getTextContent()
-     * @see #getApplicationFactoryType()
-     * @generated
-     */
-	EAttribute getApplicationFactoryType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getId()
-     * @see #getApplicationFactoryType()
-     * @generated
-     */
-	EAttribute getApplicationFactoryType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType <em>Application Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Application Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType
-     * @generated
-     */
-	EClass getApplicationType();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getActionListener <em>Action Listener</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Action Listener</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getActionListener()
-     * @see #getApplicationType()
-     * @generated
-     */
-	EReference getApplicationType_ActionListener();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getDefaultRenderKitId <em>Default Render Kit Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Default Render Kit Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getDefaultRenderKitId()
-     * @see #getApplicationType()
-     * @generated
-     */
-	EReference getApplicationType_DefaultRenderKitId();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getMessageBundle <em>Message Bundle</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Message Bundle</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getMessageBundle()
-     * @see #getApplicationType()
-     * @generated
-     */
-	EReference getApplicationType_MessageBundle();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getNavigationHandler <em>Navigation Handler</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Navigation Handler</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getNavigationHandler()
-     * @see #getApplicationType()
-     * @generated
-     */
-	EReference getApplicationType_NavigationHandler();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getViewHandler <em>View Handler</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>View Handler</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getViewHandler()
-     * @see #getApplicationType()
-     * @generated
-     */
-	EReference getApplicationType_ViewHandler();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getStateManager <em>State Manager</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>State Manager</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getStateManager()
-     * @see #getApplicationType()
-     * @generated
-     */
-	EReference getApplicationType_StateManager();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getPropertyResolver <em>Property Resolver</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Property Resolver</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getPropertyResolver()
-     * @see #getApplicationType()
-     * @generated
-     */
-	EReference getApplicationType_PropertyResolver();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getVariableResolver <em>Variable Resolver</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Variable Resolver</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getVariableResolver()
-     * @see #getApplicationType()
-     * @generated
-     */
-	EReference getApplicationType_VariableResolver();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getLocaleConfig <em>Locale Config</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Locale Config</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getLocaleConfig()
-     * @see #getApplicationType()
-     * @generated
-     */
-	EReference getApplicationType_LocaleConfig();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getId()
-     * @see #getApplicationType()
-     * @generated
-     */
-	EAttribute getApplicationType_Id();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getELResolver <em>EL Resolver</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>EL Resolver</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getELResolver()
-     * @see #getApplicationType()
-     * @generated
-     */
-    EReference getApplicationType_ELResolver();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getResourceBundle <em>Resource Bundle</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Resource Bundle</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getResourceBundle()
-     * @see #getApplicationType()
-     * @generated
-     */
-    EReference getApplicationType_ResourceBundle();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getApplicationExtension <em>Application Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Application Extension</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getApplicationExtension()
-     * @see #getApplicationType()
-     * @generated
-     */
-    EReference getApplicationType_ApplicationExtension();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType <em>Attribute Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Attribute Class Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType
-     * @generated
-     */
-	EClass getAttributeClassType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getTextContent()
-     * @see #getAttributeClassType()
-     * @generated
-     */
-	EAttribute getAttributeClassType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getId()
-     * @see #getAttributeClassType()
-     * @generated
-     */
-	EAttribute getAttributeClassType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType <em>Attribute Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Attribute Extension Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType
-     * @generated
-     */
-	EClass getAttributeExtensionType();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType <em>Attribute Name Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Attribute Name Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType
-     * @generated
-     */
-	EClass getAttributeNameType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getTextContent()
-     * @see #getAttributeNameType()
-     * @generated
-     */
-	EAttribute getAttributeNameType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getId()
-     * @see #getAttributeNameType()
-     * @generated
-     */
-	EAttribute getAttributeNameType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType <em>Attribute Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Attribute Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType
-     * @generated
-     */
-	EClass getAttributeType();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDescription <em>Description</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Description</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDescription()
-     * @see #getAttributeType()
-     * @generated
-     */
-	EReference getAttributeType_Description();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDisplayName <em>Display Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Display Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDisplayName()
-     * @see #getAttributeType()
-     * @generated
-     */
-	EReference getAttributeType_DisplayName();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getIcon <em>Icon</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Icon</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getIcon()
-     * @see #getAttributeType()
-     * @generated
-     */
-	EReference getAttributeType_Icon();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeName <em>Attribute Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Attribute Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeName()
-     * @see #getAttributeType()
-     * @generated
-     */
-	EReference getAttributeType_AttributeName();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeClass <em>Attribute Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Attribute Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeClass()
-     * @see #getAttributeType()
-     * @generated
-     */
-	EReference getAttributeType_AttributeClass();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDefaultValue <em>Default Value</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Default Value</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDefaultValue()
-     * @see #getAttributeType()
-     * @generated
-     */
-	EReference getAttributeType_DefaultValue();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getSuggestedValue <em>Suggested Value</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Suggested Value</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getSuggestedValue()
-     * @see #getAttributeType()
-     * @generated
-     */
-	EReference getAttributeType_SuggestedValue();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeExtension <em>Attribute Extension</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Attribute Extension</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeExtension()
-     * @see #getAttributeType()
-     * @generated
-     */
-	EReference getAttributeType_AttributeExtension();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getId()
-     * @see #getAttributeType()
-     * @generated
-     */
-	EAttribute getAttributeType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType <em>Component Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Component Class Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType
-     * @generated
-     */
-	EClass getComponentClassType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getTextContent()
-     * @see #getComponentClassType()
-     * @generated
-     */
-	EAttribute getComponentClassType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getId()
-     * @see #getComponentClassType()
-     * @generated
-     */
-	EAttribute getComponentClassType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType <em>Component Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Component Extension Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType
-     * @generated
-     */
-	EClass getComponentExtensionType();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType <em>Component Family Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Component Family Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType
-     * @generated
-     */
-	EClass getComponentFamilyType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getTextContent()
-     * @see #getComponentFamilyType()
-     * @generated
-     */
-	EAttribute getComponentFamilyType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getId()
-     * @see #getComponentFamilyType()
-     * @generated
-     */
-	EAttribute getComponentFamilyType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType <em>Component Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Component Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType
-     * @generated
-     */
-	EClass getComponentType();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getDescription <em>Description</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Description</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getDescription()
-     * @see #getComponentType()
-     * @generated
-     */
-	EReference getComponentType_Description();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getDisplayName <em>Display Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Display Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getDisplayName()
-     * @see #getComponentType()
-     * @generated
-     */
-	EReference getComponentType_DisplayName();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getIcon <em>Icon</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Icon</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getIcon()
-     * @see #getComponentType()
-     * @generated
-     */
-	EReference getComponentType_Icon();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentType <em>Component Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Component Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentType()
-     * @see #getComponentType()
-     * @generated
-     */
-	EReference getComponentType_ComponentType();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentClass <em>Component Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Component Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentClass()
-     * @see #getComponentType()
-     * @generated
-     */
-	EReference getComponentType_ComponentClass();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getFacet <em>Facet</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Facet</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getFacet()
-     * @see #getComponentType()
-     * @generated
-     */
-	EReference getComponentType_Facet();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getAttribute <em>Attribute</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Attribute</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getAttribute()
-     * @see #getComponentType()
-     * @generated
-     */
-	EReference getComponentType_Attribute();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getProperty <em>Property</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Property</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getProperty()
-     * @see #getComponentType()
-     * @generated
-     */
-	EReference getComponentType_Property();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentExtension <em>Component Extension</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Component Extension</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentExtension()
-     * @see #getComponentType()
-     * @generated
-     */
-	EReference getComponentType_ComponentExtension();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getId()
-     * @see #getComponentType()
-     * @generated
-     */
-	EAttribute getComponentType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType <em>Component Type Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Component Type Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType
-     * @generated
-     */
-	EClass getComponentTypeType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getTextContent()
-     * @see #getComponentTypeType()
-     * @generated
-     */
-	EAttribute getComponentTypeType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getId()
-     * @see #getComponentTypeType()
-     * @generated
-     */
-	EAttribute getComponentTypeType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType <em>Converter Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Converter Class Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType
-     * @generated
-     */
-	EClass getConverterClassType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getTextContent()
-     * @see #getConverterClassType()
-     * @generated
-     */
-	EAttribute getConverterClassType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getId()
-     * @see #getConverterClassType()
-     * @generated
-     */
-	EAttribute getConverterClassType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType <em>Converter For Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Converter For Class Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType
-     * @generated
-     */
-	EClass getConverterForClassType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getTextContent()
-     * @see #getConverterForClassType()
-     * @generated
-     */
-	EAttribute getConverterForClassType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getId()
-     * @see #getConverterForClassType()
-     * @generated
-     */
-	EAttribute getConverterForClassType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType <em>Converter Id Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Converter Id Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType
-     * @generated
-     */
-	EClass getConverterIdType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getTextContent()
-     * @see #getConverterIdType()
-     * @generated
-     */
-	EAttribute getConverterIdType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getId()
-     * @see #getConverterIdType()
-     * @generated
-     */
-	EAttribute getConverterIdType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType <em>Converter Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Converter Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType
-     * @generated
-     */
-	EClass getConverterType();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getDescription <em>Description</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Description</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getDescription()
-     * @see #getConverterType()
-     * @generated
-     */
-	EReference getConverterType_Description();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getDisplayName <em>Display Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Display Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getDisplayName()
-     * @see #getConverterType()
-     * @generated
-     */
-	EReference getConverterType_DisplayName();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getIcon <em>Icon</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Icon</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getIcon()
-     * @see #getConverterType()
-     * @generated
-     */
-	EReference getConverterType_Icon();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterId <em>Converter Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Converter Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterId()
-     * @see #getConverterType()
-     * @generated
-     */
-	EReference getConverterType_ConverterId();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterForClass <em>Converter For Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Converter For Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterForClass()
-     * @see #getConverterType()
-     * @generated
-     */
-	EReference getConverterType_ConverterForClass();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterClass <em>Converter Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Converter Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterClass()
-     * @see #getConverterType()
-     * @generated
-     */
-	EReference getConverterType_ConverterClass();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getAttribute <em>Attribute</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Attribute</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getAttribute()
-     * @see #getConverterType()
-     * @generated
-     */
-	EReference getConverterType_Attribute();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getProperty <em>Property</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Property</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getProperty()
-     * @see #getConverterType()
-     * @generated
-     */
-	EReference getConverterType_Property();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterExtension <em>Converter Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Converter Extension</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterExtension()
-     * @see #getConverterType()
-     * @generated
-     */
-    EReference getConverterType_ConverterExtension();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getId()
-     * @see #getConverterType()
-     * @generated
-     */
-	EAttribute getConverterType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType <em>Default Locale Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Default Locale Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType
-     * @generated
-     */
-	EClass getDefaultLocaleType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getTextContent()
-     * @see #getDefaultLocaleType()
-     * @generated
-     */
-	EAttribute getDefaultLocaleType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getId()
-     * @see #getDefaultLocaleType()
-     * @generated
-     */
-	EAttribute getDefaultLocaleType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType <em>Default Render Kit Id Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Default Render Kit Id Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType
-     * @generated
-     */
-	EClass getDefaultRenderKitIdType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getTextContent()
-     * @see #getDefaultRenderKitIdType()
-     * @generated
-     */
-	EAttribute getDefaultRenderKitIdType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getId()
-     * @see #getDefaultRenderKitIdType()
-     * @generated
-     */
-	EAttribute getDefaultRenderKitIdType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType <em>Default Value Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Default Value Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType
-     * @generated
-     */
-	EClass getDefaultValueType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getTextContent()
-     * @see #getDefaultValueType()
-     * @generated
-     */
-	EAttribute getDefaultValueType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getId()
-     * @see #getDefaultValueType()
-     * @generated
-     */
-	EAttribute getDefaultValueType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType <em>Description Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Description Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DescriptionType
-     * @generated
-     */
-	EClass getDescriptionType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getTextContent()
-     * @see #getDescriptionType()
-     * @generated
-     */
-	EAttribute getDescriptionType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getLang <em>Lang</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Lang</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getLang()
-     * @see #getDescriptionType()
-     * @generated
-     */
-	EAttribute getDescriptionType_Lang();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getId()
-     * @see #getDescriptionType()
-     * @generated
-     */
-	EAttribute getDescriptionType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType <em>Display Name Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Display Name Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType
-     * @generated
-     */
-	EClass getDisplayNameType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getTextContent()
-     * @see #getDisplayNameType()
-     * @generated
-     */
-	EAttribute getDisplayNameType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getLang <em>Lang</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Lang</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getLang()
-     * @see #getDisplayNameType()
-     * @generated
-     */
-	EAttribute getDisplayNameType_Lang();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getId()
-     * @see #getDisplayNameType()
-     * @generated
-     */
-	EAttribute getDisplayNameType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot <em>Document Root</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Document Root</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot
-     * @generated
-     */
-	EClass getDocumentRoot();
-
-    /**
-     * Returns the meta object for the attribute list '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMixed <em>Mixed</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute list '<em>Mixed</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMixed()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EAttribute getDocumentRoot_Mixed();
-
-    /**
-     * Returns the meta object for the map '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getXMLNSPrefixMap <em>XMLNS Prefix Map</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the map '<em>XMLNS Prefix Map</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getXMLNSPrefixMap()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_XMLNSPrefixMap();
-
-    /**
-     * Returns the meta object for the map '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getXSISchemaLocation <em>XSI Schema Location</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the map '<em>XSI Schema Location</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getXSISchemaLocation()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_XSISchemaLocation();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getActionListener <em>Action Listener</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Action Listener</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getActionListener()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ActionListener();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplication <em>Application</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Application</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplication()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_Application();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplicationFactory <em>Application Factory</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Application Factory</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplicationFactory()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ApplicationFactory();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttribute <em>Attribute</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Attribute</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttribute()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_Attribute();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeClass <em>Attribute Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Attribute Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeClass()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_AttributeClass();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeExtension <em>Attribute Extension</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Attribute Extension</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeExtension()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_AttributeExtension();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeName <em>Attribute Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Attribute Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeName()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_AttributeName();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponent <em>Component</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Component</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponent()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_Component();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentClass <em>Component Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Component Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentClass()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ComponentClass();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentExtension <em>Component Extension</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Component Extension</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentExtension()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ComponentExtension();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentFamily <em>Component Family</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Component Family</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentFamily()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ComponentFamily();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentType <em>Component Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Component Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentType()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ComponentType();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverter <em>Converter</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Converter</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverter()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_Converter();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterClass <em>Converter Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Converter Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterClass()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ConverterClass();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterForClass <em>Converter For Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Converter For Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterForClass()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ConverterForClass();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterId <em>Converter Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Converter Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterId()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ConverterId();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultLocale <em>Default Locale</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Default Locale</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultLocale()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_DefaultLocale();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultRenderKitId <em>Default Render Kit Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Default Render Kit Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultRenderKitId()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_DefaultRenderKitId();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultValue <em>Default Value</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Default Value</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultValue()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_DefaultValue();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDescription <em>Description</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Description</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDescription()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_Description();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDisplayName <em>Display Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Display Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDisplayName()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_DisplayName();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesConfig <em>Faces Config</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Faces Config</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesConfig()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_FacesConfig();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesContextFactory <em>Faces Context Factory</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Faces Context Factory</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesContextFactory()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_FacesContextFactory();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacet <em>Facet</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Facet</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacet()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_Facet();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetExtension <em>Facet Extension</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Facet Extension</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetExtension()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_FacetExtension();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetName <em>Facet Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Facet Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetName()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_FacetName();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFactory <em>Factory</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Factory</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFactory()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_Factory();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromAction <em>From Action</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>From Action</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromAction()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_FromAction();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromOutcome <em>From Outcome</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>From Outcome</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromOutcome()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_FromOutcome();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromViewId <em>From View Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>From View Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromViewId()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_FromViewId();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getIcon <em>Icon</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Icon</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getIcon()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_Icon();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKey <em>Key</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Key</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKey()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_Key();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKeyClass <em>Key Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Key Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKeyClass()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_KeyClass();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLargeIcon <em>Large Icon</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Large Icon</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLargeIcon()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_LargeIcon();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycle <em>Lifecycle</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Lifecycle</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycle()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_Lifecycle();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycleFactory <em>Lifecycle Factory</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Lifecycle Factory</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycleFactory()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_LifecycleFactory();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getListEntries <em>List Entries</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>List Entries</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getListEntries()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ListEntries();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLocaleConfig <em>Locale Config</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Locale Config</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLocaleConfig()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_LocaleConfig();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBean <em>Managed Bean</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Managed Bean</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBean()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ManagedBean();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanClass <em>Managed Bean Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Managed Bean Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanClass()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ManagedBeanClass();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanName <em>Managed Bean Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Managed Bean Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanName()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ManagedBeanName();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanScope <em>Managed Bean Scope</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Managed Bean Scope</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanScope()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ManagedBeanScope();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedProperty <em>Managed Property</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Managed Property</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedProperty()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ManagedProperty();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntries <em>Map Entries</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Map Entries</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntries()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_MapEntries();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntry <em>Map Entry</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Map Entry</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntry()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_MapEntry();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMessageBundle <em>Message Bundle</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Message Bundle</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMessageBundle()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_MessageBundle();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationCase <em>Navigation Case</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Navigation Case</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationCase()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_NavigationCase();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationHandler <em>Navigation Handler</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Navigation Handler</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationHandler()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_NavigationHandler();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationRule <em>Navigation Rule</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Navigation Rule</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationRule()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_NavigationRule();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNullValue <em>Null Value</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Null Value</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNullValue()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_NullValue();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPhaseListener <em>Phase Listener</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Phase Listener</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPhaseListener()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_PhaseListener();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getProperty <em>Property</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Property</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getProperty()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_Property();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyClass <em>Property Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Property Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyClass()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_PropertyClass();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyExtension <em>Property Extension</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Property Extension</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyExtension()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_PropertyExtension();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyName <em>Property Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Property Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyName()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_PropertyName();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyResolver <em>Property Resolver</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Property Resolver</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyResolver()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_PropertyResolver();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRedirect <em>Redirect</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Redirect</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRedirect()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_Redirect();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBean <em>Referenced Bean</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Referenced Bean</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBean()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ReferencedBean();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanClass <em>Referenced Bean Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Referenced Bean Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanClass()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ReferencedBeanClass();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanName <em>Referenced Bean Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Referenced Bean Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanName()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ReferencedBeanName();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderer <em>Renderer</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Renderer</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderer()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_Renderer();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererClass <em>Renderer Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Renderer Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererClass()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_RendererClass();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererExtension <em>Renderer Extension</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Renderer Extension</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererExtension()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_RendererExtension();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererType <em>Renderer Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Renderer Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererType()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_RendererType();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKit <em>Render Kit</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Render Kit</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKit()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_RenderKit();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitClass <em>Render Kit Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Render Kit Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitClass()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_RenderKitClass();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitFactory <em>Render Kit Factory</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Render Kit Factory</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitFactory()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_RenderKitFactory();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitId <em>Render Kit Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Render Kit Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitId()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_RenderKitId();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSmallIcon <em>Small Icon</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Small Icon</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSmallIcon()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_SmallIcon();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getStateManager <em>State Manager</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>State Manager</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getStateManager()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_StateManager();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSuggestedValue <em>Suggested Value</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Suggested Value</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSuggestedValue()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_SuggestedValue();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSupportedLocale <em>Supported Locale</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Supported Locale</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSupportedLocale()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_SupportedLocale();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getToViewId <em>To View Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>To View Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getToViewId()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ToViewId();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidator <em>Validator</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Validator</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidator()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_Validator();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorClass <em>Validator Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Validator Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorClass()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ValidatorClass();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorId <em>Validator Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Validator Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorId()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ValidatorId();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValue <em>Value</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Value</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValue()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_Value();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValueClass <em>Value Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Value Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValueClass()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ValueClass();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getVariableResolver <em>Variable Resolver</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Variable Resolver</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getVariableResolver()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_VariableResolver();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getViewHandler <em>View Handler</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>View Handler</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getViewHandler()
-     * @see #getDocumentRoot()
-     * @generated
-     */
-	EReference getDocumentRoot_ViewHandler();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute <em>Dynamic Attribute</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Dynamic Attribute</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute
-     * @generated
-     */
-    EClass getDynamicAttribute();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getName <em>Name</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getName()
-     * @see #getDynamicAttribute()
-     * @generated
-     */
-    EAttribute getDynamicAttribute_Name();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getValue <em>Value</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Value</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getValue()
-     * @see #getDynamicAttribute()
-     * @generated
-     */
-    EAttribute getDynamicAttribute_Value();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement <em>Dynamic Element</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Dynamic Element</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicElement
-     * @generated
-     */
-    EClass getDynamicElement();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getChildNodes <em>Child Nodes</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Child Nodes</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getChildNodes()
-     * @see #getDynamicElement()
-     * @generated
-     */
-    EReference getDynamicElement_ChildNodes();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getAttributes <em>Attributes</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Attributes</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getAttributes()
-     * @see #getDynamicElement()
-     * @generated
-     */
-    EReference getDynamicElement_Attributes();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getTextContent()
-     * @see #getDynamicElement()
-     * @generated
-     */
-    EAttribute getDynamicElement_TextContent();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType <em>EL Resolver Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>EL Resolver Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ELResolverType
-     * @generated
-     */
-    EClass getELResolverType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getTextContent()
-     * @see #getELResolverType()
-     * @generated
-     */
-    EAttribute getELResolverType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getId()
-     * @see #getELResolverType()
-     * @generated
-     */
-    EAttribute getELResolverType_Id();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getName <em>Name</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getName()
-     * @see #getDynamicElement()
-     * @generated
-     */
-    EAttribute getDynamicElement_Name();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType <em>Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType
-     * @generated
-     */
-	EClass getFacesConfigType();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getApplication <em>Application</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Application</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getApplication()
-     * @see #getFacesConfigType()
-     * @generated
-     */
-	EReference getFacesConfigType_Application();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getFactory <em>Factory</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Factory</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getFactory()
-     * @see #getFacesConfigType()
-     * @generated
-     */
-	EReference getFacesConfigType_Factory();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getComponent <em>Component</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Component</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getComponent()
-     * @see #getFacesConfigType()
-     * @generated
-     */
-	EReference getFacesConfigType_Component();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getConverter <em>Converter</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Converter</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getConverter()
-     * @see #getFacesConfigType()
-     * @generated
-     */
-	EReference getFacesConfigType_Converter();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getManagedBean <em>Managed Bean</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Managed Bean</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getManagedBean()
-     * @see #getFacesConfigType()
-     * @generated
-     */
-	EReference getFacesConfigType_ManagedBean();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getNavigationRule <em>Navigation Rule</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Navigation Rule</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getNavigationRule()
-     * @see #getFacesConfigType()
-     * @generated
-     */
-	EReference getFacesConfigType_NavigationRule();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getReferencedBean <em>Referenced Bean</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Referenced Bean</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getReferencedBean()
-     * @see #getFacesConfigType()
-     * @generated
-     */
-	EReference getFacesConfigType_ReferencedBean();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getRenderKit <em>Render Kit</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Render Kit</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getRenderKit()
-     * @see #getFacesConfigType()
-     * @generated
-     */
-	EReference getFacesConfigType_RenderKit();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getLifecycle <em>Lifecycle</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Lifecycle</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getLifecycle()
-     * @see #getFacesConfigType()
-     * @generated
-     */
-	EReference getFacesConfigType_Lifecycle();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getValidator <em>Validator</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Validator</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getValidator()
-     * @see #getFacesConfigType()
-     * @generated
-     */
-	EReference getFacesConfigType_Validator();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getFacesConfigExtension <em>Faces Config Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Faces Config Extension</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getFacesConfigExtension()
-     * @see #getFacesConfigType()
-     * @generated
-     */
-    EReference getFacesConfigType_FacesConfigExtension();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getXmlns <em>Xmlns</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Xmlns</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getXmlns()
-     * @see #getFacesConfigType()
-     * @generated
-     */
-	EAttribute getFacesConfigType_Xmlns();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getId()
-     * @see #getFacesConfigType()
-     * @generated
-     */
-	EAttribute getFacesConfigType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType <em>Faces Context Factory Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Faces Context Factory Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType
-     * @generated
-     */
-	EClass getFacesContextFactoryType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getTextContent()
-     * @see #getFacesContextFactoryType()
-     * @generated
-     */
-	EAttribute getFacesContextFactoryType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getId()
-     * @see #getFacesContextFactoryType()
-     * @generated
-     */
-	EAttribute getFacesContextFactoryType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType <em>Facet Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Facet Extension Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType
-     * @generated
-     */
-	EClass getFacetExtensionType();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType <em>Facet Name Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Facet Name Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacetNameType
-     * @generated
-     */
-	EClass getFacetNameType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getTextContent()
-     * @see #getFacetNameType()
-     * @generated
-     */
-	EAttribute getFacetNameType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getId()
-     * @see #getFacetNameType()
-     * @generated
-     */
-	EAttribute getFacetNameType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType <em>Facet Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Facet Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType
-     * @generated
-     */
-	EClass getFacetType();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getDescription <em>Description</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Description</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType#getDescription()
-     * @see #getFacetType()
-     * @generated
-     */
-	EReference getFacetType_Description();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getDisplayName <em>Display Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Display Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType#getDisplayName()
-     * @see #getFacetType()
-     * @generated
-     */
-	EReference getFacetType_DisplayName();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getIcon <em>Icon</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Icon</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType#getIcon()
-     * @see #getFacetType()
-     * @generated
-     */
-	EReference getFacetType_Icon();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getFacetName <em>Facet Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Facet Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType#getFacetName()
-     * @see #getFacetType()
-     * @generated
-     */
-	EReference getFacetType_FacetName();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getFacetExtension <em>Facet Extension</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Facet Extension</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType#getFacetExtension()
-     * @see #getFacetType()
-     * @generated
-     */
-	EReference getFacetType_FacetExtension();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType#getId()
-     * @see #getFacetType()
-     * @generated
-     */
-	EAttribute getFacetType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType <em>Factory Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Factory Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType
-     * @generated
-     */
-	EClass getFactoryType();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getApplicationFactory <em>Application Factory</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Application Factory</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getApplicationFactory()
-     * @see #getFactoryType()
-     * @generated
-     */
-	EReference getFactoryType_ApplicationFactory();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getFacesContextFactory <em>Faces Context Factory</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Faces Context Factory</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getFacesContextFactory()
-     * @see #getFactoryType()
-     * @generated
-     */
-	EReference getFactoryType_FacesContextFactory();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getLifecycleFactory <em>Lifecycle Factory</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Lifecycle Factory</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getLifecycleFactory()
-     * @see #getFactoryType()
-     * @generated
-     */
-	EReference getFactoryType_LifecycleFactory();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getRenderKitFactory <em>Render Kit Factory</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Render Kit Factory</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getRenderKitFactory()
-     * @see #getFactoryType()
-     * @generated
-     */
-	EReference getFactoryType_RenderKitFactory();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getFactoryExtension <em>Factory Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Factory Extension</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getFactoryExtension()
-     * @see #getFactoryType()
-     * @generated
-     */
-    EReference getFactoryType_FactoryExtension();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getId()
-     * @see #getFactoryType()
-     * @generated
-     */
-	EAttribute getFactoryType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType <em>From Action Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>From Action Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FromActionType
-     * @generated
-     */
-	EClass getFromActionType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getTextContent()
-     * @see #getFromActionType()
-     * @generated
-     */
-	EAttribute getFromActionType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getId()
-     * @see #getFromActionType()
-     * @generated
-     */
-	EAttribute getFromActionType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType <em>From Outcome Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>From Outcome Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType
-     * @generated
-     */
-	EClass getFromOutcomeType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getTextContent()
-     * @see #getFromOutcomeType()
-     * @generated
-     */
-	EAttribute getFromOutcomeType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getId()
-     * @see #getFromOutcomeType()
-     * @generated
-     */
-	EAttribute getFromOutcomeType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType <em>From View Id Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>From View Id Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType
-     * @generated
-     */
-	EClass getFromViewIdType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getTextContent()
-     * @see #getFromViewIdType()
-     * @generated
-     */
-	EAttribute getFromViewIdType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getId()
-     * @see #getFromViewIdType()
-     * @generated
-     */
-	EAttribute getFromViewIdType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType <em>Icon Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Icon Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.IconType
-     * @generated
-     */
-	EClass getIconType();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getSmallIcon <em>Small Icon</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Small Icon</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.IconType#getSmallIcon()
-     * @see #getIconType()
-     * @generated
-     */
-	EReference getIconType_SmallIcon();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getLargeIcon <em>Large Icon</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Large Icon</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.IconType#getLargeIcon()
-     * @see #getIconType()
-     * @generated
-     */
-	EReference getIconType_LargeIcon();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getLang <em>Lang</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Lang</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.IconType#getLang()
-     * @see #getIconType()
-     * @generated
-     */
-	EAttribute getIconType_Lang();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.IconType#getId()
-     * @see #getIconType()
-     * @generated
-     */
-	EAttribute getIconType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType <em>Key Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Key Class Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.KeyClassType
-     * @generated
-     */
-	EClass getKeyClassType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getTextContent()
-     * @see #getKeyClassType()
-     * @generated
-     */
-	EAttribute getKeyClassType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getId()
-     * @see #getKeyClassType()
-     * @generated
-     */
-	EAttribute getKeyClassType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType <em>Key Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Key Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.KeyType
-     * @generated
-     */
-	EClass getKeyType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.KeyType#getTextContent()
-     * @see #getKeyType()
-     * @generated
-     */
-	EAttribute getKeyType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.KeyType#getId()
-     * @see #getKeyType()
-     * @generated
-     */
-	EAttribute getKeyType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType <em>Large Icon Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Large Icon Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.LargeIconType
-     * @generated
-     */
-	EClass getLargeIconType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getTextContent()
-     * @see #getLargeIconType()
-     * @generated
-     */
-	EAttribute getLargeIconType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getId()
-     * @see #getLargeIconType()
-     * @generated
-     */
-	EAttribute getLargeIconType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType <em>Lifecycle Factory Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Lifecycle Factory Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType
-     * @generated
-     */
-	EClass getLifecycleFactoryType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getTextContent()
-     * @see #getLifecycleFactoryType()
-     * @generated
-     */
-	EAttribute getLifecycleFactoryType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getId()
-     * @see #getLifecycleFactoryType()
-     * @generated
-     */
-	EAttribute getLifecycleFactoryType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType <em>Lifecycle Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Lifecycle Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleType
-     * @generated
-     */
-	EClass getLifecycleType();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getPhaseListener <em>Phase Listener</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Phase Listener</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getPhaseListener()
-     * @see #getLifecycleType()
-     * @generated
-     */
-	EReference getLifecycleType_PhaseListener();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getLifecycleExtension <em>Lifecycle Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Lifecycle Extension</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getLifecycleExtension()
-     * @see #getLifecycleType()
-     * @generated
-     */
-    EReference getLifecycleType_LifecycleExtension();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getId()
-     * @see #getLifecycleType()
-     * @generated
-     */
-	EAttribute getLifecycleType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType <em>List Entries Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>List Entries Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType
-     * @generated
-     */
-	EClass getListEntriesType();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getValueClass <em>Value Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Value Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getValueClass()
-     * @see #getListEntriesType()
-     * @generated
-     */
-	EReference getListEntriesType_ValueClass();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getNullValue <em>Null Value</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Null Value</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getNullValue()
-     * @see #getListEntriesType()
-     * @generated
-     */
-	EReference getListEntriesType_NullValue();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getValue <em>Value</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Value</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getValue()
-     * @see #getListEntriesType()
-     * @generated
-     */
-	EReference getListEntriesType_Value();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getId()
-     * @see #getListEntriesType()
-     * @generated
-     */
-	EAttribute getListEntriesType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType <em>Locale Config Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Locale Config Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType
-     * @generated
-     */
-	EClass getLocaleConfigType();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getDefaultLocale <em>Default Locale</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Default Locale</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getDefaultLocale()
-     * @see #getLocaleConfigType()
-     * @generated
-     */
-	EReference getLocaleConfigType_DefaultLocale();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getSupportedLocale <em>Supported Locale</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Supported Locale</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getSupportedLocale()
-     * @see #getLocaleConfigType()
-     * @generated
-     */
-	EReference getLocaleConfigType_SupportedLocale();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getId()
-     * @see #getLocaleConfigType()
-     * @generated
-     */
-	EAttribute getLocaleConfigType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType <em>Managed Bean Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Managed Bean Class Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType
-     * @generated
-     */
-	EClass getManagedBeanClassType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getTextContent()
-     * @see #getManagedBeanClassType()
-     * @generated
-     */
-	EAttribute getManagedBeanClassType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getId()
-     * @see #getManagedBeanClassType()
-     * @generated
-     */
-	EAttribute getManagedBeanClassType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType <em>Managed Bean Name Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Managed Bean Name Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType
-     * @generated
-     */
-	EClass getManagedBeanNameType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getTextContent()
-     * @see #getManagedBeanNameType()
-     * @generated
-     */
-	EAttribute getManagedBeanNameType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getId()
-     * @see #getManagedBeanNameType()
-     * @generated
-     */
-	EAttribute getManagedBeanNameType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType <em>Managed Bean Scope Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Managed Bean Scope Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType
-     * @generated
-     */
-	EClass getManagedBeanScopeType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getTextContent()
-     * @see #getManagedBeanScopeType()
-     * @generated
-     */
-	EAttribute getManagedBeanScopeType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getId()
-     * @see #getManagedBeanScopeType()
-     * @generated
-     */
-	EAttribute getManagedBeanScopeType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType <em>Managed Bean Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Managed Bean Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType
-     * @generated
-     */
-	EClass getManagedBeanType();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getDescription <em>Description</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Description</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getDescription()
-     * @see #getManagedBeanType()
-     * @generated
-     */
-	EReference getManagedBeanType_Description();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getDisplayName <em>Display Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Display Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getDisplayName()
-     * @see #getManagedBeanType()
-     * @generated
-     */
-	EReference getManagedBeanType_DisplayName();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getIcon <em>Icon</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Icon</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getIcon()
-     * @see #getManagedBeanType()
-     * @generated
-     */
-	EReference getManagedBeanType_Icon();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanName <em>Managed Bean Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Managed Bean Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanName()
-     * @see #getManagedBeanType()
-     * @generated
-     */
-	EReference getManagedBeanType_ManagedBeanName();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanClass <em>Managed Bean Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Managed Bean Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanClass()
-     * @see #getManagedBeanType()
-     * @generated
-     */
-	EReference getManagedBeanType_ManagedBeanClass();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanScope <em>Managed Bean Scope</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Managed Bean Scope</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanScope()
-     * @see #getManagedBeanType()
-     * @generated
-     */
-	EReference getManagedBeanType_ManagedBeanScope();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedProperty <em>Managed Property</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Managed Property</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedProperty()
-     * @see #getManagedBeanType()
-     * @generated
-     */
-	EReference getManagedBeanType_ManagedProperty();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getMapEntries <em>Map Entries</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Map Entries</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getMapEntries()
-     * @see #getManagedBeanType()
-     * @generated
-     */
-	EReference getManagedBeanType_MapEntries();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getListEntries <em>List Entries</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>List Entries</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getListEntries()
-     * @see #getManagedBeanType()
-     * @generated
-     */
-	EReference getManagedBeanType_ListEntries();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanExtension <em>Managed Bean Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Managed Bean Extension</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanExtension()
-     * @see #getManagedBeanType()
-     * @generated
-     */
-    EReference getManagedBeanType_ManagedBeanExtension();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getId()
-     * @see #getManagedBeanType()
-     * @generated
-     */
-	EAttribute getManagedBeanType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType <em>Managed Property Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Managed Property Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType
-     * @generated
-     */
-	EClass getManagedPropertyType();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getDescription <em>Description</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Description</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getDescription()
-     * @see #getManagedPropertyType()
-     * @generated
-     */
-	EReference getManagedPropertyType_Description();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getDisplayName <em>Display Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Display Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getDisplayName()
-     * @see #getManagedPropertyType()
-     * @generated
-     */
-	EReference getManagedPropertyType_DisplayName();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getIcon <em>Icon</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Icon</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getIcon()
-     * @see #getManagedPropertyType()
-     * @generated
-     */
-	EReference getManagedPropertyType_Icon();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyName <em>Property Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Property Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyName()
-     * @see #getManagedPropertyType()
-     * @generated
-     */
-	EReference getManagedPropertyType_PropertyName();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyClass <em>Property Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Property Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyClass()
-     * @see #getManagedPropertyType()
-     * @generated
-     */
-	EReference getManagedPropertyType_PropertyClass();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getMapEntries <em>Map Entries</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Map Entries</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getMapEntries()
-     * @see #getManagedPropertyType()
-     * @generated
-     */
-	EReference getManagedPropertyType_MapEntries();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getNullValue <em>Null Value</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Null Value</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getNullValue()
-     * @see #getManagedPropertyType()
-     * @generated
-     */
-	EReference getManagedPropertyType_NullValue();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getValue <em>Value</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Value</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getValue()
-     * @see #getManagedPropertyType()
-     * @generated
-     */
-	EReference getManagedPropertyType_Value();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getListEntries <em>List Entries</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>List Entries</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getListEntries()
-     * @see #getManagedPropertyType()
-     * @generated
-     */
-	EReference getManagedPropertyType_ListEntries();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getId()
-     * @see #getManagedPropertyType()
-     * @generated
-     */
-	EAttribute getManagedPropertyType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType <em>Map Entries Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Map Entries Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType
-     * @generated
-     */
-	EClass getMapEntriesType();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getKeyClass <em>Key Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Key Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getKeyClass()
-     * @see #getMapEntriesType()
-     * @generated
-     */
-	EReference getMapEntriesType_KeyClass();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getValueClass <em>Value Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Value Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getValueClass()
-     * @see #getMapEntriesType()
-     * @generated
-     */
-	EReference getMapEntriesType_ValueClass();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getMapEntry <em>Map Entry</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Map Entry</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getMapEntry()
-     * @see #getMapEntriesType()
-     * @generated
-     */
-	EReference getMapEntriesType_MapEntry();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getId()
-     * @see #getMapEntriesType()
-     * @generated
-     */
-	EAttribute getMapEntriesType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType <em>Map Entry Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Map Entry Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntryType
-     * @generated
-     */
-	EClass getMapEntryType();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getKey <em>Key</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Key</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getKey()
-     * @see #getMapEntryType()
-     * @generated
-     */
-	EReference getMapEntryType_Key();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getNullValue <em>Null Value</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Null Value</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getNullValue()
-     * @see #getMapEntryType()
-     * @generated
-     */
-	EReference getMapEntryType_NullValue();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getValue <em>Value</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Value</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getValue()
-     * @see #getMapEntryType()
-     * @generated
-     */
-	EReference getMapEntryType_Value();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getId()
-     * @see #getMapEntryType()
-     * @generated
-     */
-	EAttribute getMapEntryType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType <em>Message Bundle Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Message Bundle Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType
-     * @generated
-     */
-	EClass getMessageBundleType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getTextContent()
-     * @see #getMessageBundleType()
-     * @generated
-     */
-	EAttribute getMessageBundleType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getId()
-     * @see #getMessageBundleType()
-     * @generated
-     */
-	EAttribute getMessageBundleType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType <em>Navigation Case Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Navigation Case Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType
-     * @generated
-     */
-	EClass getNavigationCaseType();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getDescription <em>Description</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Description</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getDescription()
-     * @see #getNavigationCaseType()
-     * @generated
-     */
-	EReference getNavigationCaseType_Description();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getDisplayName <em>Display Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Display Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getDisplayName()
-     * @see #getNavigationCaseType()
-     * @generated
-     */
-	EReference getNavigationCaseType_DisplayName();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getIcon <em>Icon</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Icon</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getIcon()
-     * @see #getNavigationCaseType()
-     * @generated
-     */
-	EReference getNavigationCaseType_Icon();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromAction <em>From Action</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>From Action</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromAction()
-     * @see #getNavigationCaseType()
-     * @generated
-     */
-	EReference getNavigationCaseType_FromAction();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromOutcome <em>From Outcome</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>From Outcome</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromOutcome()
-     * @see #getNavigationCaseType()
-     * @generated
-     */
-	EReference getNavigationCaseType_FromOutcome();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getToViewId <em>To View Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>To View Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getToViewId()
-     * @see #getNavigationCaseType()
-     * @generated
-     */
-	EReference getNavigationCaseType_ToViewId();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getRedirect <em>Redirect</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Redirect</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getRedirect()
-     * @see #getNavigationCaseType()
-     * @generated
-     */
-	EReference getNavigationCaseType_Redirect();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getId()
-     * @see #getNavigationCaseType()
-     * @generated
-     */
-	EAttribute getNavigationCaseType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType <em>Navigation Handler Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Navigation Handler Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType
-     * @generated
-     */
-	EClass getNavigationHandlerType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getTextContent()
-     * @see #getNavigationHandlerType()
-     * @generated
-     */
-	EAttribute getNavigationHandlerType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getId()
-     * @see #getNavigationHandlerType()
-     * @generated
-     */
-	EAttribute getNavigationHandlerType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType <em>Navigation Rule Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Navigation Rule Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType
-     * @generated
-     */
-	EClass getNavigationRuleType();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getDescription <em>Description</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Description</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getDescription()
-     * @see #getNavigationRuleType()
-     * @generated
-     */
-	EReference getNavigationRuleType_Description();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getDisplayName <em>Display Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Display Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getDisplayName()
-     * @see #getNavigationRuleType()
-     * @generated
-     */
-	EReference getNavigationRuleType_DisplayName();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getIcon <em>Icon</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Icon</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getIcon()
-     * @see #getNavigationRuleType()
-     * @generated
-     */
-	EReference getNavigationRuleType_Icon();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getFromViewId <em>From View Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>From View Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getFromViewId()
-     * @see #getNavigationRuleType()
-     * @generated
-     */
-	EReference getNavigationRuleType_FromViewId();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getNavigationCase <em>Navigation Case</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Navigation Case</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getNavigationCase()
-     * @see #getNavigationRuleType()
-     * @generated
-     */
-	EReference getNavigationRuleType_NavigationCase();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getNavigationRuleExtension <em>Navigation Rule Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Navigation Rule Extension</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getNavigationRuleExtension()
-     * @see #getNavigationRuleType()
-     * @generated
-     */
-    EReference getNavigationRuleType_NavigationRuleExtension();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getId()
-     * @see #getNavigationRuleType()
-     * @generated
-     */
-	EAttribute getNavigationRuleType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType <em>Null Value Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Null Value Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NullValueType
-     * @generated
-     */
-	EClass getNullValueType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NullValueType#getId()
-     * @see #getNullValueType()
-     * @generated
-     */
-	EAttribute getNullValueType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType <em>Phase Listener Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Phase Listener Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType
-     * @generated
-     */
-	EClass getPhaseListenerType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getTextContent()
-     * @see #getPhaseListenerType()
-     * @generated
-     */
-	EAttribute getPhaseListenerType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getId()
-     * @see #getPhaseListenerType()
-     * @generated
-     */
-	EAttribute getPhaseListenerType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType <em>Property Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Property Class Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType
-     * @generated
-     */
-	EClass getPropertyClassType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getTextContent()
-     * @see #getPropertyClassType()
-     * @generated
-     */
-	EAttribute getPropertyClassType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getId()
-     * @see #getPropertyClassType()
-     * @generated
-     */
-	EAttribute getPropertyClassType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType <em>Property Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Property Extension Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType
-     * @generated
-     */
-	EClass getPropertyExtensionType();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType <em>Property Name Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Property Name Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType
-     * @generated
-     */
-	EClass getPropertyNameType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getTextContent()
-     * @see #getPropertyNameType()
-     * @generated
-     */
-	EAttribute getPropertyNameType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getId()
-     * @see #getPropertyNameType()
-     * @generated
-     */
-	EAttribute getPropertyNameType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType <em>Property Resolver Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Property Resolver Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType
-     * @generated
-     */
-	EClass getPropertyResolverType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getTextContent()
-     * @see #getPropertyResolverType()
-     * @generated
-     */
-	EAttribute getPropertyResolverType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getId()
-     * @see #getPropertyResolverType()
-     * @generated
-     */
-	EAttribute getPropertyResolverType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType <em>Property Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Property Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType
-     * @generated
-     */
-	EClass getPropertyType();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDescription <em>Description</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Description</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDescription()
-     * @see #getPropertyType()
-     * @generated
-     */
-	EReference getPropertyType_Description();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDisplayName <em>Display Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Display Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDisplayName()
-     * @see #getPropertyType()
-     * @generated
-     */
-	EReference getPropertyType_DisplayName();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getIcon <em>Icon</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Icon</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getIcon()
-     * @see #getPropertyType()
-     * @generated
-     */
-	EReference getPropertyType_Icon();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyName <em>Property Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Property Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyName()
-     * @see #getPropertyType()
-     * @generated
-     */
-	EReference getPropertyType_PropertyName();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyClass <em>Property Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Property Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyClass()
-     * @see #getPropertyType()
-     * @generated
-     */
-	EReference getPropertyType_PropertyClass();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDefaultValue <em>Default Value</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Default Value</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDefaultValue()
-     * @see #getPropertyType()
-     * @generated
-     */
-	EReference getPropertyType_DefaultValue();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getSuggestedValue <em>Suggested Value</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Suggested Value</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getSuggestedValue()
-     * @see #getPropertyType()
-     * @generated
-     */
-	EReference getPropertyType_SuggestedValue();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyExtension <em>Property Extension</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Property Extension</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyExtension()
-     * @see #getPropertyType()
-     * @generated
-     */
-	EReference getPropertyType_PropertyExtension();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getId()
-     * @see #getPropertyType()
-     * @generated
-     */
-	EAttribute getPropertyType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType <em>Redirect Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Redirect Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectType
-     * @generated
-     */
-	EClass getRedirectType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectType#getId()
-     * @see #getRedirectType()
-     * @generated
-     */
-	EAttribute getRedirectType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType <em>Referenced Bean Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Referenced Bean Class Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType
-     * @generated
-     */
-	EClass getReferencedBeanClassType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getTextContent()
-     * @see #getReferencedBeanClassType()
-     * @generated
-     */
-	EAttribute getReferencedBeanClassType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getId()
-     * @see #getReferencedBeanClassType()
-     * @generated
-     */
-	EAttribute getReferencedBeanClassType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType <em>Referenced Bean Name Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Referenced Bean Name Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType
-     * @generated
-     */
-	EClass getReferencedBeanNameType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getTextContent()
-     * @see #getReferencedBeanNameType()
-     * @generated
-     */
-	EAttribute getReferencedBeanNameType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getId()
-     * @see #getReferencedBeanNameType()
-     * @generated
-     */
-	EAttribute getReferencedBeanNameType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType <em>Referenced Bean Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Referenced Bean Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType
-     * @generated
-     */
-	EClass getReferencedBeanType();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getDescription <em>Description</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Description</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getDescription()
-     * @see #getReferencedBeanType()
-     * @generated
-     */
-	EReference getReferencedBeanType_Description();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getDisplayName <em>Display Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Display Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getDisplayName()
-     * @see #getReferencedBeanType()
-     * @generated
-     */
-	EReference getReferencedBeanType_DisplayName();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getIcon <em>Icon</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Icon</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getIcon()
-     * @see #getReferencedBeanType()
-     * @generated
-     */
-	EReference getReferencedBeanType_Icon();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanName <em>Referenced Bean Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Referenced Bean Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanName()
-     * @see #getReferencedBeanType()
-     * @generated
-     */
-	EReference getReferencedBeanType_ReferencedBeanName();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanClass <em>Referenced Bean Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Referenced Bean Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanClass()
-     * @see #getReferencedBeanType()
-     * @generated
-     */
-	EReference getReferencedBeanType_ReferencedBeanClass();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getId()
-     * @see #getReferencedBeanType()
-     * @generated
-     */
-	EAttribute getReferencedBeanType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType <em>Renderer Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Renderer Class Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RendererClassType
-     * @generated
-     */
-	EClass getRendererClassType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getTextContent()
-     * @see #getRendererClassType()
-     * @generated
-     */
-	EAttribute getRendererClassType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getId()
-     * @see #getRendererClassType()
-     * @generated
-     */
-	EAttribute getRendererClassType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType <em>Renderer Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Renderer Extension Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType
-     * @generated
-     */
-	EClass getRendererExtensionType();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType <em>Renderer Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Renderer Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType
-     * @generated
-     */
-	EClass getRendererType();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getDescription <em>Description</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Description</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getDescription()
-     * @see #getRendererType()
-     * @generated
-     */
-	EReference getRendererType_Description();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getDisplayName <em>Display Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Display Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getDisplayName()
-     * @see #getRendererType()
-     * @generated
-     */
-	EReference getRendererType_DisplayName();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getIcon <em>Icon</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Icon</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getIcon()
-     * @see #getRendererType()
-     * @generated
-     */
-	EReference getRendererType_Icon();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getComponentFamily <em>Component Family</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Component Family</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getComponentFamily()
-     * @see #getRendererType()
-     * @generated
-     */
-	EReference getRendererType_ComponentFamily();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererType <em>Renderer Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Renderer Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererType()
-     * @see #getRendererType()
-     * @generated
-     */
-	EReference getRendererType_RendererType();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererClass <em>Renderer Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Renderer Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererClass()
-     * @see #getRendererType()
-     * @generated
-     */
-	EReference getRendererType_RendererClass();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getFacet <em>Facet</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Facet</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getFacet()
-     * @see #getRendererType()
-     * @generated
-     */
-	EReference getRendererType_Facet();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getAttribute <em>Attribute</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Attribute</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getAttribute()
-     * @see #getRendererType()
-     * @generated
-     */
-	EReference getRendererType_Attribute();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererExtension <em>Renderer Extension</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Renderer Extension</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererExtension()
-     * @see #getRendererType()
-     * @generated
-     */
-	EReference getRendererType_RendererExtension();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getId()
-     * @see #getRendererType()
-     * @generated
-     */
-	EAttribute getRendererType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType <em>Renderer Type Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Renderer Type Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType
-     * @generated
-     */
-	EClass getRendererTypeType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getTextContent()
-     * @see #getRendererTypeType()
-     * @generated
-     */
-	EAttribute getRendererTypeType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getId()
-     * @see #getRendererTypeType()
-     * @generated
-     */
-	EAttribute getRendererTypeType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType <em>Render Kit Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Render Kit Class Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType
-     * @generated
-     */
-	EClass getRenderKitClassType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getTextContent()
-     * @see #getRenderKitClassType()
-     * @generated
-     */
-	EAttribute getRenderKitClassType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getId()
-     * @see #getRenderKitClassType()
-     * @generated
-     */
-	EAttribute getRenderKitClassType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType <em>Render Kit Factory Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Render Kit Factory Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType
-     * @generated
-     */
-	EClass getRenderKitFactoryType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getTextContent()
-     * @see #getRenderKitFactoryType()
-     * @generated
-     */
-	EAttribute getRenderKitFactoryType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getId()
-     * @see #getRenderKitFactoryType()
-     * @generated
-     */
-	EAttribute getRenderKitFactoryType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType <em>Render Kit Id Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Render Kit Id Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType
-     * @generated
-     */
-	EClass getRenderKitIdType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getTextContent()
-     * @see #getRenderKitIdType()
-     * @generated
-     */
-	EAttribute getRenderKitIdType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getId()
-     * @see #getRenderKitIdType()
-     * @generated
-     */
-	EAttribute getRenderKitIdType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType <em>Render Kit Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Render Kit Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType
-     * @generated
-     */
-	EClass getRenderKitType();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getDescription <em>Description</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Description</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getDescription()
-     * @see #getRenderKitType()
-     * @generated
-     */
-	EReference getRenderKitType_Description();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getDisplayName <em>Display Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Display Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getDisplayName()
-     * @see #getRenderKitType()
-     * @generated
-     */
-	EReference getRenderKitType_DisplayName();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getIcon <em>Icon</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Icon</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getIcon()
-     * @see #getRenderKitType()
-     * @generated
-     */
-	EReference getRenderKitType_Icon();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitId <em>Render Kit Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Render Kit Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitId()
-     * @see #getRenderKitType()
-     * @generated
-     */
-	EReference getRenderKitType_RenderKitId();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitClass <em>Render Kit Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Render Kit Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitClass()
-     * @see #getRenderKitType()
-     * @generated
-     */
-	EReference getRenderKitType_RenderKitClass();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderer <em>Renderer</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Renderer</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderer()
-     * @see #getRenderKitType()
-     * @generated
-     */
-	EReference getRenderKitType_Renderer();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitExtension <em>Render Kit Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Render Kit Extension</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitExtension()
-     * @see #getRenderKitType()
-     * @generated
-     */
-    EReference getRenderKitType_RenderKitExtension();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getId()
-     * @see #getRenderKitType()
-     * @generated
-     */
-	EAttribute getRenderKitType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType <em>Small Icon Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Small Icon Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.SmallIconType
-     * @generated
-     */
-	EClass getSmallIconType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getTextContent()
-     * @see #getSmallIconType()
-     * @generated
-     */
-	EAttribute getSmallIconType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getId()
-     * @see #getSmallIconType()
-     * @generated
-     */
-	EAttribute getSmallIconType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType <em>State Manager Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>State Manager Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.StateManagerType
-     * @generated
-     */
-	EClass getStateManagerType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getTextContent()
-     * @see #getStateManagerType()
-     * @generated
-     */
-	EAttribute getStateManagerType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getId()
-     * @see #getStateManagerType()
-     * @generated
-     */
-	EAttribute getStateManagerType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType <em>Suggested Value Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Suggested Value Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType
-     * @generated
-     */
-	EClass getSuggestedValueType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getTextContent()
-     * @see #getSuggestedValueType()
-     * @generated
-     */
-	EAttribute getSuggestedValueType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getId()
-     * @see #getSuggestedValueType()
-     * @generated
-     */
-	EAttribute getSuggestedValueType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType <em>Supported Locale Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Supported Locale Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType
-     * @generated
-     */
-	EClass getSupportedLocaleType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getTextContent()
-     * @see #getSupportedLocaleType()
-     * @generated
-     */
-	EAttribute getSupportedLocaleType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getId()
-     * @see #getSupportedLocaleType()
-     * @generated
-     */
-	EAttribute getSupportedLocaleType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType <em>To View Id Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>To View Id Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType
-     * @generated
-     */
-	EClass getToViewIdType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getTextContent()
-     * @see #getToViewIdType()
-     * @generated
-     */
-	EAttribute getToViewIdType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getId()
-     * @see #getToViewIdType()
-     * @generated
-     */
-	EAttribute getToViewIdType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType <em>Validator Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Validator Class Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType
-     * @generated
-     */
-	EClass getValidatorClassType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getTextContent()
-     * @see #getValidatorClassType()
-     * @generated
-     */
-	EAttribute getValidatorClassType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getId()
-     * @see #getValidatorClassType()
-     * @generated
-     */
-	EAttribute getValidatorClassType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType <em>Validator Id Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Validator Id Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType
-     * @generated
-     */
-	EClass getValidatorIdType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getTextContent()
-     * @see #getValidatorIdType()
-     * @generated
-     */
-	EAttribute getValidatorIdType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getId()
-     * @see #getValidatorIdType()
-     * @generated
-     */
-	EAttribute getValidatorIdType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType <em>Validator Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Validator Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType
-     * @generated
-     */
-	EClass getValidatorType();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getDescription <em>Description</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Description</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getDescription()
-     * @see #getValidatorType()
-     * @generated
-     */
-	EReference getValidatorType_Description();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getDisplayName <em>Display Name</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Display Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getDisplayName()
-     * @see #getValidatorType()
-     * @generated
-     */
-	EReference getValidatorType_DisplayName();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getIcon <em>Icon</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Icon</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getIcon()
-     * @see #getValidatorType()
-     * @generated
-     */
-	EReference getValidatorType_Icon();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorId <em>Validator Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Validator Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorId()
-     * @see #getValidatorType()
-     * @generated
-     */
-	EReference getValidatorType_ValidatorId();
-
-    /**
-     * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorClass <em>Validator Class</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference '<em>Validator Class</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorClass()
-     * @see #getValidatorType()
-     * @generated
-     */
-	EReference getValidatorType_ValidatorClass();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getAttribute <em>Attribute</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Attribute</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getAttribute()
-     * @see #getValidatorType()
-     * @generated
-     */
-	EReference getValidatorType_Attribute();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getProperty <em>Property</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Property</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getProperty()
-     * @see #getValidatorType()
-     * @generated
-     */
-	EReference getValidatorType_Property();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorExtension <em>Validator Extension</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Validator Extension</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorExtension()
-     * @see #getValidatorType()
-     * @generated
-     */
-    EReference getValidatorType_ValidatorExtension();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getId()
-     * @see #getValidatorType()
-     * @generated
-     */
-	EAttribute getValidatorType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType <em>Value Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Value Class Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValueClassType
-     * @generated
-     */
-	EClass getValueClassType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getTextContent()
-     * @see #getValueClassType()
-     * @generated
-     */
-	EAttribute getValueClassType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getId()
-     * @see #getValueClassType()
-     * @generated
-     */
-	EAttribute getValueClassType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType <em>Value Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Value Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValueType
-     * @generated
-     */
-	EClass getValueType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValueType#getTextContent()
-     * @see #getValueType()
-     * @generated
-     */
-	EAttribute getValueType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValueType#getId()
-     * @see #getValueType()
-     * @generated
-     */
-	EAttribute getValueType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType <em>Variable Resolver Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Variable Resolver Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType
-     * @generated
-     */
-	EClass getVariableResolverType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getTextContent()
-     * @see #getVariableResolverType()
-     * @generated
-     */
-	EAttribute getVariableResolverType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getId()
-     * @see #getVariableResolverType()
-     * @generated
-     */
-	EAttribute getVariableResolverType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType <em>View Handler Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for class '<em>View Handler Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType
-     * @generated
-     */
-	EClass getViewHandlerType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getTextContent()
-     * @see #getViewHandlerType()
-     * @generated
-     */
-	EAttribute getViewHandlerType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getId()
-     * @see #getViewHandlerType()
-     * @generated
-     */
-	EAttribute getViewHandlerType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType <em>Resource Bundle Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Resource Bundle Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType
-     * @generated
-     */
-    EClass getResourceBundleType();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getDescription <em>Description</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Description</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getDescription()
-     * @see #getResourceBundleType()
-     * @generated
-     */
-    EReference getResourceBundleType_Description();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getDisplayName <em>Display Name</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Display Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getDisplayName()
-     * @see #getResourceBundleType()
-     * @generated
-     */
-    EReference getResourceBundleType_DisplayName();
-
-    /**
-     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getIcon <em>Icon</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the containment reference list '<em>Icon</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getIcon()
-     * @see #getResourceBundleType()
-     * @generated
-     */
-    EReference getResourceBundleType_Icon();
-
-    /**
-     * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getBaseName <em>Base Name</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference '<em>Base Name</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getBaseName()
-     * @see #getResourceBundleType()
-     * @generated
-     */
-    EReference getResourceBundleType_BaseName();
-
-    /**
-     * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getVar <em>Var</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference '<em>Var</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getVar()
-     * @see #getResourceBundleType()
-     * @generated
-     */
-    EReference getResourceBundleType_Var();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getId()
-     * @see #getResourceBundleType()
-     * @generated
-     */
-    EAttribute getResourceBundleType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType <em>Base Name Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Base Name Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.BaseNameType
-     * @generated
-     */
-    EClass getBaseNameType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getTextContent()
-     * @see #getBaseNameType()
-     * @generated
-     */
-    EAttribute getBaseNameType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getId()
-     * @see #getBaseNameType()
-     * @generated
-     */
-    EAttribute getBaseNameType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.VarType <em>Var Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Var Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.VarType
-     * @generated
-     */
-    EClass getVarType();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.VarType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.VarType#getTextContent()
-     * @see #getVarType()
-     * @generated
-     */
-    EAttribute getVarType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.VarType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.VarType#getId()
-     * @see #getVarType()
-     * @generated
-     */
-    EAttribute getVarType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType <em>Render Kit Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Render Kit Extension Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType
-     * @generated
-     */
-    EClass getRenderKitExtensionType();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType <em>Navigation Rule Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Navigation Rule Extension Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType
-     * @generated
-     */
-    EClass getNavigationRuleExtensionType();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType <em>Validator Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Validator Extension Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType
-     * @generated
-     */
-    EClass getValidatorExtensionType();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType <em>Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Extension Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType
-     * @generated
-     */
-    EClass getFacesConfigExtensionType();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType <em>Factory Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Factory Extension Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType
-     * @generated
-     */
-    EClass getFactoryExtensionType();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType <em>Lifecycle Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Lifecycle Extension Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType
-     * @generated
-     */
-    EClass getLifecycleExtensionType();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType <em>Managed Bean Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Managed Bean Extension Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType
-     * @generated
-     */
-    EClass getManagedBeanExtensionType();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType <em>Converter Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Converter Extension Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType
-     * @generated
-     */
-    EClass getConverterExtensionType();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType <em>Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Extension Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ExtensionType
-     * @generated
-     */
-    EClass getExtensionType();
-
-    /**
-     * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getChildNodes <em>Child Nodes</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the reference list '<em>Child Nodes</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getChildNodes()
-     * @see #getExtensionType()
-     * @generated
-     */
-    EReference getExtensionType_ChildNodes();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getTextContent <em>Text Content</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Text Content</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getTextContent()
-     * @see #getExtensionType()
-     * @generated
-     */
-    EAttribute getExtensionType_TextContent();
-
-    /**
-     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getId <em>Id</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for the attribute '<em>Id</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getId()
-     * @see #getExtensionType()
-     * @generated
-     */
-    EAttribute getExtensionType_Id();
-
-    /**
-     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType <em>Application Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @return the meta object for class '<em>Application Extension Type</em>'.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType
-     * @generated
-     */
-    EClass getApplicationExtensionType();
-
-    /**
-     * Returns the factory that creates the instances of the model.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the factory that creates the instances of the model.
-     * @generated
-     */
-	FacesConfigFactory getFacesConfigFactory();
-
-    /**
-     * <!-- begin-user-doc -->
-     * Defines literals for the meta objects that represent
-     * <ul>
-     *   <li>each class,</li>
-     *   <li>each feature of each class,</li>
-     *   <li>each enum,</li>
-     *   <li>and each data type</li>
-     * </ul>
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    interface Literals  {
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl <em>Action Listener Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getActionListenerType()
-         * @generated
-         */
-        EClass ACTION_LISTENER_TYPE = eINSTANCE.getActionListenerType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ACTION_LISTENER_TYPE__TEXT_CONTENT = eINSTANCE.getActionListenerType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ACTION_LISTENER_TYPE__ID = eINSTANCE.getActionListenerType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl <em>Application Factory Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationFactoryType()
-         * @generated
-         */
-        EClass APPLICATION_FACTORY_TYPE = eINSTANCE.getApplicationFactoryType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute APPLICATION_FACTORY_TYPE__TEXT_CONTENT = eINSTANCE.getApplicationFactoryType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute APPLICATION_FACTORY_TYPE__ID = eINSTANCE.getApplicationFactoryType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl <em>Application Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationType()
-         * @generated
-         */
-        EClass APPLICATION_TYPE = eINSTANCE.getApplicationType();
-
-        /**
-         * The meta object literal for the '<em><b>Action Listener</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference APPLICATION_TYPE__ACTION_LISTENER = eINSTANCE.getApplicationType_ActionListener();
-
-        /**
-         * The meta object literal for the '<em><b>Default Render Kit Id</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID = eINSTANCE.getApplicationType_DefaultRenderKitId();
-
-        /**
-         * The meta object literal for the '<em><b>Message Bundle</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference APPLICATION_TYPE__MESSAGE_BUNDLE = eINSTANCE.getApplicationType_MessageBundle();
-
-        /**
-         * The meta object literal for the '<em><b>Navigation Handler</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference APPLICATION_TYPE__NAVIGATION_HANDLER = eINSTANCE.getApplicationType_NavigationHandler();
-
-        /**
-         * The meta object literal for the '<em><b>View Handler</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference APPLICATION_TYPE__VIEW_HANDLER = eINSTANCE.getApplicationType_ViewHandler();
-
-        /**
-         * The meta object literal for the '<em><b>State Manager</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference APPLICATION_TYPE__STATE_MANAGER = eINSTANCE.getApplicationType_StateManager();
-
-        /**
-         * The meta object literal for the '<em><b>Property Resolver</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference APPLICATION_TYPE__PROPERTY_RESOLVER = eINSTANCE.getApplicationType_PropertyResolver();
-
-        /**
-         * The meta object literal for the '<em><b>Variable Resolver</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference APPLICATION_TYPE__VARIABLE_RESOLVER = eINSTANCE.getApplicationType_VariableResolver();
-
-        /**
-         * The meta object literal for the '<em><b>Locale Config</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference APPLICATION_TYPE__LOCALE_CONFIG = eINSTANCE.getApplicationType_LocaleConfig();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute APPLICATION_TYPE__ID = eINSTANCE.getApplicationType_Id();
-
-        /**
-         * The meta object literal for the '<em><b>EL Resolver</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference APPLICATION_TYPE__EL_RESOLVER = eINSTANCE.getApplicationType_ELResolver();
-
-        /**
-         * The meta object literal for the '<em><b>Resource Bundle</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference APPLICATION_TYPE__RESOURCE_BUNDLE = eINSTANCE.getApplicationType_ResourceBundle();
-
-        /**
-         * The meta object literal for the '<em><b>Application Extension</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference APPLICATION_TYPE__APPLICATION_EXTENSION = eINSTANCE.getApplicationType_ApplicationExtension();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl <em>Attribute Class Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeClassType()
-         * @generated
-         */
-        EClass ATTRIBUTE_CLASS_TYPE = eINSTANCE.getAttributeClassType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getAttributeClassType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ATTRIBUTE_CLASS_TYPE__ID = eINSTANCE.getAttributeClassType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeExtensionTypeImpl <em>Attribute Extension Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeExtensionTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeExtensionType()
-         * @generated
-         */
-        EClass ATTRIBUTE_EXTENSION_TYPE = eINSTANCE.getAttributeExtensionType();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl <em>Attribute Name Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeNameType()
-         * @generated
-         */
-        EClass ATTRIBUTE_NAME_TYPE = eINSTANCE.getAttributeNameType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ATTRIBUTE_NAME_TYPE__TEXT_CONTENT = eINSTANCE.getAttributeNameType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ATTRIBUTE_NAME_TYPE__ID = eINSTANCE.getAttributeNameType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl <em>Attribute Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeType()
-         * @generated
-         */
-        EClass ATTRIBUTE_TYPE = eINSTANCE.getAttributeType();
-
-        /**
-         * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference ATTRIBUTE_TYPE__DESCRIPTION = eINSTANCE.getAttributeType_Description();
-
-        /**
-         * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference ATTRIBUTE_TYPE__DISPLAY_NAME = eINSTANCE.getAttributeType_DisplayName();
-
-        /**
-         * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference ATTRIBUTE_TYPE__ICON = eINSTANCE.getAttributeType_Icon();
-
-        /**
-         * The meta object literal for the '<em><b>Attribute Name</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference ATTRIBUTE_TYPE__ATTRIBUTE_NAME = eINSTANCE.getAttributeType_AttributeName();
-
-        /**
-         * The meta object literal for the '<em><b>Attribute Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference ATTRIBUTE_TYPE__ATTRIBUTE_CLASS = eINSTANCE.getAttributeType_AttributeClass();
-
-        /**
-         * The meta object literal for the '<em><b>Default Value</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference ATTRIBUTE_TYPE__DEFAULT_VALUE = eINSTANCE.getAttributeType_DefaultValue();
-
-        /**
-         * The meta object literal for the '<em><b>Suggested Value</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference ATTRIBUTE_TYPE__SUGGESTED_VALUE = eINSTANCE.getAttributeType_SuggestedValue();
-
-        /**
-         * The meta object literal for the '<em><b>Attribute Extension</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION = eINSTANCE.getAttributeType_AttributeExtension();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute ATTRIBUTE_TYPE__ID = eINSTANCE.getAttributeType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl <em>Component Class Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentClassType()
-         * @generated
-         */
-        EClass COMPONENT_CLASS_TYPE = eINSTANCE.getComponentClassType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute COMPONENT_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getComponentClassType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute COMPONENT_CLASS_TYPE__ID = eINSTANCE.getComponentClassType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentExtensionTypeImpl <em>Component Extension Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentExtensionTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentExtensionType()
-         * @generated
-         */
-        EClass COMPONENT_EXTENSION_TYPE = eINSTANCE.getComponentExtensionType();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl <em>Component Family Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentFamilyType()
-         * @generated
-         */
-        EClass COMPONENT_FAMILY_TYPE = eINSTANCE.getComponentFamilyType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute COMPONENT_FAMILY_TYPE__TEXT_CONTENT = eINSTANCE.getComponentFamilyType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute COMPONENT_FAMILY_TYPE__ID = eINSTANCE.getComponentFamilyType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl <em>Component Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentType()
-         * @generated
-         */
-        EClass COMPONENT_TYPE = eINSTANCE.getComponentType();
-
-        /**
-         * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference COMPONENT_TYPE__DESCRIPTION = eINSTANCE.getComponentType_Description();
-
-        /**
-         * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference COMPONENT_TYPE__DISPLAY_NAME = eINSTANCE.getComponentType_DisplayName();
-
-        /**
-         * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference COMPONENT_TYPE__ICON = eINSTANCE.getComponentType_Icon();
-
-        /**
-         * The meta object literal for the '<em><b>Component Type</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference COMPONENT_TYPE__COMPONENT_TYPE = eINSTANCE.getComponentType_ComponentType();
-
-        /**
-         * The meta object literal for the '<em><b>Component Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference COMPONENT_TYPE__COMPONENT_CLASS = eINSTANCE.getComponentType_ComponentClass();
-
-        /**
-         * The meta object literal for the '<em><b>Facet</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference COMPONENT_TYPE__FACET = eINSTANCE.getComponentType_Facet();
-
-        /**
-         * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference COMPONENT_TYPE__ATTRIBUTE = eINSTANCE.getComponentType_Attribute();
-
-        /**
-         * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference COMPONENT_TYPE__PROPERTY = eINSTANCE.getComponentType_Property();
-
-        /**
-         * The meta object literal for the '<em><b>Component Extension</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference COMPONENT_TYPE__COMPONENT_EXTENSION = eINSTANCE.getComponentType_ComponentExtension();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute COMPONENT_TYPE__ID = eINSTANCE.getComponentType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl <em>Component Type Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentTypeType()
-         * @generated
-         */
-        EClass COMPONENT_TYPE_TYPE = eINSTANCE.getComponentTypeType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute COMPONENT_TYPE_TYPE__TEXT_CONTENT = eINSTANCE.getComponentTypeType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute COMPONENT_TYPE_TYPE__ID = eINSTANCE.getComponentTypeType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl <em>Converter Class Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterClassType()
-         * @generated
-         */
-        EClass CONVERTER_CLASS_TYPE = eINSTANCE.getConverterClassType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute CONVERTER_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getConverterClassType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute CONVERTER_CLASS_TYPE__ID = eINSTANCE.getConverterClassType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl <em>Converter For Class Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterForClassType()
-         * @generated
-         */
-        EClass CONVERTER_FOR_CLASS_TYPE = eINSTANCE.getConverterForClassType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getConverterForClassType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute CONVERTER_FOR_CLASS_TYPE__ID = eINSTANCE.getConverterForClassType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl <em>Converter Id Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterIdType()
-         * @generated
-         */
-        EClass CONVERTER_ID_TYPE = eINSTANCE.getConverterIdType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute CONVERTER_ID_TYPE__TEXT_CONTENT = eINSTANCE.getConverterIdType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute CONVERTER_ID_TYPE__ID = eINSTANCE.getConverterIdType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl <em>Converter Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterType()
-         * @generated
-         */
-        EClass CONVERTER_TYPE = eINSTANCE.getConverterType();
-
-        /**
-         * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference CONVERTER_TYPE__DESCRIPTION = eINSTANCE.getConverterType_Description();
-
-        /**
-         * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference CONVERTER_TYPE__DISPLAY_NAME = eINSTANCE.getConverterType_DisplayName();
-
-        /**
-         * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference CONVERTER_TYPE__ICON = eINSTANCE.getConverterType_Icon();
-
-        /**
-         * The meta object literal for the '<em><b>Converter Id</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference CONVERTER_TYPE__CONVERTER_ID = eINSTANCE.getConverterType_ConverterId();
-
-        /**
-         * The meta object literal for the '<em><b>Converter For Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference CONVERTER_TYPE__CONVERTER_FOR_CLASS = eINSTANCE.getConverterType_ConverterForClass();
-
-        /**
-         * The meta object literal for the '<em><b>Converter Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference CONVERTER_TYPE__CONVERTER_CLASS = eINSTANCE.getConverterType_ConverterClass();
-
-        /**
-         * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference CONVERTER_TYPE__ATTRIBUTE = eINSTANCE.getConverterType_Attribute();
-
-        /**
-         * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference CONVERTER_TYPE__PROPERTY = eINSTANCE.getConverterType_Property();
-
-        /**
-         * The meta object literal for the '<em><b>Converter Extension</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        EAttribute CONVERTER_TYPE__ID = eINSTANCE.getConverterType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl <em>Default Locale Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultLocaleType()
-         * @generated
-         */
-        EClass DEFAULT_LOCALE_TYPE = eINSTANCE.getDefaultLocaleType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute DEFAULT_LOCALE_TYPE__TEXT_CONTENT = eINSTANCE.getDefaultLocaleType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute DEFAULT_LOCALE_TYPE__ID = eINSTANCE.getDefaultLocaleType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl <em>Default Render Kit Id Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultRenderKitIdType()
-         * @generated
-         */
-        EClass DEFAULT_RENDER_KIT_ID_TYPE = eINSTANCE.getDefaultRenderKitIdType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT = eINSTANCE.getDefaultRenderKitIdType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute DEFAULT_RENDER_KIT_ID_TYPE__ID = eINSTANCE.getDefaultRenderKitIdType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl <em>Default Value Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultValueType()
-         * @generated
-         */
-        EClass DEFAULT_VALUE_TYPE = eINSTANCE.getDefaultValueType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute DEFAULT_VALUE_TYPE__TEXT_CONTENT = eINSTANCE.getDefaultValueType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute DEFAULT_VALUE_TYPE__ID = eINSTANCE.getDefaultValueType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl <em>Description Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDescriptionType()
-         * @generated
-         */
-        EClass DESCRIPTION_TYPE = eINSTANCE.getDescriptionType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute DESCRIPTION_TYPE__TEXT_CONTENT = eINSTANCE.getDescriptionType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Lang</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute DESCRIPTION_TYPE__LANG = eINSTANCE.getDescriptionType_Lang();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute DESCRIPTION_TYPE__ID = eINSTANCE.getDescriptionType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl <em>Display Name Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDisplayNameType()
-         * @generated
-         */
-        EClass DISPLAY_NAME_TYPE = eINSTANCE.getDisplayNameType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute DISPLAY_NAME_TYPE__TEXT_CONTENT = eINSTANCE.getDisplayNameType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Lang</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute DISPLAY_NAME_TYPE__LANG = eINSTANCE.getDisplayNameType_Lang();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute DISPLAY_NAME_TYPE__ID = eINSTANCE.getDisplayNameType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl <em>Document Root</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDocumentRoot()
-         * @generated
-         */
-        EClass DOCUMENT_ROOT = eINSTANCE.getDocumentRoot();
-
-        /**
-         * The meta object literal for the '<em><b>Mixed</b></em>' attribute list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute DOCUMENT_ROOT__MIXED = eINSTANCE.getDocumentRoot_Mixed();
-
-        /**
-         * The meta object literal for the '<em><b>XMLNS Prefix Map</b></em>' map feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__XMLNS_PREFIX_MAP = eINSTANCE.getDocumentRoot_XMLNSPrefixMap();
-
-        /**
-         * The meta object literal for the '<em><b>XSI Schema Location</b></em>' map feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__XSI_SCHEMA_LOCATION = eINSTANCE.getDocumentRoot_XSISchemaLocation();
-
-        /**
-         * The meta object literal for the '<em><b>Action Listener</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__ACTION_LISTENER = eINSTANCE.getDocumentRoot_ActionListener();
-
-        /**
-         * The meta object literal for the '<em><b>Application</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__APPLICATION = eINSTANCE.getDocumentRoot_Application();
-
-        /**
-         * The meta object literal for the '<em><b>Application Factory</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__APPLICATION_FACTORY = eINSTANCE.getDocumentRoot_ApplicationFactory();
-
-        /**
-         * The meta object literal for the '<em><b>Attribute</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__ATTRIBUTE = eINSTANCE.getDocumentRoot_Attribute();
-
-        /**
-         * The meta object literal for the '<em><b>Attribute Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__ATTRIBUTE_CLASS = eINSTANCE.getDocumentRoot_AttributeClass();
-
-        /**
-         * The meta object literal for the '<em><b>Attribute Extension</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__ATTRIBUTE_EXTENSION = eINSTANCE.getDocumentRoot_AttributeExtension();
-
-        /**
-         * The meta object literal for the '<em><b>Attribute Name</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__ATTRIBUTE_NAME = eINSTANCE.getDocumentRoot_AttributeName();
-
-        /**
-         * The meta object literal for the '<em><b>Component</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__COMPONENT = eINSTANCE.getDocumentRoot_Component();
-
-        /**
-         * The meta object literal for the '<em><b>Component Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__COMPONENT_CLASS = eINSTANCE.getDocumentRoot_ComponentClass();
-
-        /**
-         * The meta object literal for the '<em><b>Component Extension</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__COMPONENT_EXTENSION = eINSTANCE.getDocumentRoot_ComponentExtension();
-
-        /**
-         * The meta object literal for the '<em><b>Component Family</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__COMPONENT_FAMILY = eINSTANCE.getDocumentRoot_ComponentFamily();
-
-        /**
-         * The meta object literal for the '<em><b>Component Type</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__COMPONENT_TYPE = eINSTANCE.getDocumentRoot_ComponentType();
-
-        /**
-         * The meta object literal for the '<em><b>Converter</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__CONVERTER = eINSTANCE.getDocumentRoot_Converter();
-
-        /**
-         * The meta object literal for the '<em><b>Converter Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__CONVERTER_CLASS = eINSTANCE.getDocumentRoot_ConverterClass();
-
-        /**
-         * The meta object literal for the '<em><b>Converter For Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__CONVERTER_FOR_CLASS = eINSTANCE.getDocumentRoot_ConverterForClass();
-
-        /**
-         * The meta object literal for the '<em><b>Converter Id</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__CONVERTER_ID = eINSTANCE.getDocumentRoot_ConverterId();
-
-        /**
-         * The meta object literal for the '<em><b>Default Locale</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__DEFAULT_LOCALE = eINSTANCE.getDocumentRoot_DefaultLocale();
-
-        /**
-         * The meta object literal for the '<em><b>Default Render Kit Id</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID = eINSTANCE.getDocumentRoot_DefaultRenderKitId();
-
-        /**
-         * The meta object literal for the '<em><b>Default Value</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__DEFAULT_VALUE = eINSTANCE.getDocumentRoot_DefaultValue();
-
-        /**
-         * The meta object literal for the '<em><b>Description</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__DESCRIPTION = eINSTANCE.getDocumentRoot_Description();
-
-        /**
-         * The meta object literal for the '<em><b>Display Name</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__DISPLAY_NAME = eINSTANCE.getDocumentRoot_DisplayName();
-
-        /**
-         * The meta object literal for the '<em><b>Faces Config</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__FACES_CONFIG = eINSTANCE.getDocumentRoot_FacesConfig();
-
-        /**
-         * The meta object literal for the '<em><b>Faces Context Factory</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__FACES_CONTEXT_FACTORY = eINSTANCE.getDocumentRoot_FacesContextFactory();
-
-        /**
-         * The meta object literal for the '<em><b>Facet</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__FACET = eINSTANCE.getDocumentRoot_Facet();
-
-        /**
-         * The meta object literal for the '<em><b>Facet Extension</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__FACET_EXTENSION = eINSTANCE.getDocumentRoot_FacetExtension();
-
-        /**
-         * The meta object literal for the '<em><b>Facet Name</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__FACET_NAME = eINSTANCE.getDocumentRoot_FacetName();
-
-        /**
-         * The meta object literal for the '<em><b>Factory</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__FACTORY = eINSTANCE.getDocumentRoot_Factory();
-
-        /**
-         * The meta object literal for the '<em><b>From Action</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__FROM_ACTION = eINSTANCE.getDocumentRoot_FromAction();
-
-        /**
-         * The meta object literal for the '<em><b>From Outcome</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__FROM_OUTCOME = eINSTANCE.getDocumentRoot_FromOutcome();
-
-        /**
-         * The meta object literal for the '<em><b>From View Id</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__FROM_VIEW_ID = eINSTANCE.getDocumentRoot_FromViewId();
-
-        /**
-         * The meta object literal for the '<em><b>Icon</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__ICON = eINSTANCE.getDocumentRoot_Icon();
-
-        /**
-         * The meta object literal for the '<em><b>Key</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__KEY = eINSTANCE.getDocumentRoot_Key();
-
-        /**
-         * The meta object literal for the '<em><b>Key Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__KEY_CLASS = eINSTANCE.getDocumentRoot_KeyClass();
-
-        /**
-         * The meta object literal for the '<em><b>Large Icon</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__LARGE_ICON = eINSTANCE.getDocumentRoot_LargeIcon();
-
-        /**
-         * The meta object literal for the '<em><b>Lifecycle</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__LIFECYCLE = eINSTANCE.getDocumentRoot_Lifecycle();
-
-        /**
-         * The meta object literal for the '<em><b>Lifecycle Factory</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__LIFECYCLE_FACTORY = eINSTANCE.getDocumentRoot_LifecycleFactory();
-
-        /**
-         * The meta object literal for the '<em><b>List Entries</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__LIST_ENTRIES = eINSTANCE.getDocumentRoot_ListEntries();
-
-        /**
-         * The meta object literal for the '<em><b>Locale Config</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__LOCALE_CONFIG = eINSTANCE.getDocumentRoot_LocaleConfig();
-
-        /**
-         * The meta object literal for the '<em><b>Managed Bean</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__MANAGED_BEAN = eINSTANCE.getDocumentRoot_ManagedBean();
-
-        /**
-         * The meta object literal for the '<em><b>Managed Bean Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__MANAGED_BEAN_CLASS = eINSTANCE.getDocumentRoot_ManagedBeanClass();
-
-        /**
-         * The meta object literal for the '<em><b>Managed Bean Name</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__MANAGED_BEAN_NAME = eINSTANCE.getDocumentRoot_ManagedBeanName();
-
-        /**
-         * The meta object literal for the '<em><b>Managed Bean Scope</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__MANAGED_BEAN_SCOPE = eINSTANCE.getDocumentRoot_ManagedBeanScope();
-
-        /**
-         * The meta object literal for the '<em><b>Managed Property</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__MANAGED_PROPERTY = eINSTANCE.getDocumentRoot_ManagedProperty();
-
-        /**
-         * The meta object literal for the '<em><b>Map Entries</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__MAP_ENTRIES = eINSTANCE.getDocumentRoot_MapEntries();
-
-        /**
-         * The meta object literal for the '<em><b>Map Entry</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__MAP_ENTRY = eINSTANCE.getDocumentRoot_MapEntry();
-
-        /**
-         * The meta object literal for the '<em><b>Message Bundle</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__MESSAGE_BUNDLE = eINSTANCE.getDocumentRoot_MessageBundle();
-
-        /**
-         * The meta object literal for the '<em><b>Navigation Case</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__NAVIGATION_CASE = eINSTANCE.getDocumentRoot_NavigationCase();
-
-        /**
-         * The meta object literal for the '<em><b>Navigation Handler</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__NAVIGATION_HANDLER = eINSTANCE.getDocumentRoot_NavigationHandler();
-
-        /**
-         * The meta object literal for the '<em><b>Navigation Rule</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__NAVIGATION_RULE = eINSTANCE.getDocumentRoot_NavigationRule();
-
-        /**
-         * The meta object literal for the '<em><b>Null Value</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__NULL_VALUE = eINSTANCE.getDocumentRoot_NullValue();
-
-        /**
-         * The meta object literal for the '<em><b>Phase Listener</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__PHASE_LISTENER = eINSTANCE.getDocumentRoot_PhaseListener();
-
-        /**
-         * The meta object literal for the '<em><b>Property</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__PROPERTY = eINSTANCE.getDocumentRoot_Property();
-
-        /**
-         * The meta object literal for the '<em><b>Property Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__PROPERTY_CLASS = eINSTANCE.getDocumentRoot_PropertyClass();
-
-        /**
-         * The meta object literal for the '<em><b>Property Extension</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__PROPERTY_EXTENSION = eINSTANCE.getDocumentRoot_PropertyExtension();
-
-        /**
-         * The meta object literal for the '<em><b>Property Name</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__PROPERTY_NAME = eINSTANCE.getDocumentRoot_PropertyName();
-
-        /**
-         * The meta object literal for the '<em><b>Property Resolver</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__PROPERTY_RESOLVER = eINSTANCE.getDocumentRoot_PropertyResolver();
-
-        /**
-         * The meta object literal for the '<em><b>Redirect</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__REDIRECT = eINSTANCE.getDocumentRoot_Redirect();
-
-        /**
-         * The meta object literal for the '<em><b>Referenced Bean</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__REFERENCED_BEAN = eINSTANCE.getDocumentRoot_ReferencedBean();
-
-        /**
-         * The meta object literal for the '<em><b>Referenced Bean Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__REFERENCED_BEAN_CLASS = eINSTANCE.getDocumentRoot_ReferencedBeanClass();
-
-        /**
-         * The meta object literal for the '<em><b>Referenced Bean Name</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__REFERENCED_BEAN_NAME = eINSTANCE.getDocumentRoot_ReferencedBeanName();
-
-        /**
-         * The meta object literal for the '<em><b>Renderer</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__RENDERER = eINSTANCE.getDocumentRoot_Renderer();
-
-        /**
-         * The meta object literal for the '<em><b>Renderer Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__RENDERER_CLASS = eINSTANCE.getDocumentRoot_RendererClass();
-
-        /**
-         * The meta object literal for the '<em><b>Renderer Extension</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__RENDERER_EXTENSION = eINSTANCE.getDocumentRoot_RendererExtension();
-
-        /**
-         * The meta object literal for the '<em><b>Renderer Type</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__RENDERER_TYPE = eINSTANCE.getDocumentRoot_RendererType();
-
-        /**
-         * The meta object literal for the '<em><b>Render Kit</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__RENDER_KIT = eINSTANCE.getDocumentRoot_RenderKit();
-
-        /**
-         * The meta object literal for the '<em><b>Render Kit Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__RENDER_KIT_CLASS = eINSTANCE.getDocumentRoot_RenderKitClass();
-
-        /**
-         * The meta object literal for the '<em><b>Render Kit Factory</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__RENDER_KIT_FACTORY = eINSTANCE.getDocumentRoot_RenderKitFactory();
-
-        /**
-         * The meta object literal for the '<em><b>Render Kit Id</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__RENDER_KIT_ID = eINSTANCE.getDocumentRoot_RenderKitId();
-
-        /**
-         * The meta object literal for the '<em><b>Small Icon</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__SMALL_ICON = eINSTANCE.getDocumentRoot_SmallIcon();
-
-        /**
-         * The meta object literal for the '<em><b>State Manager</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__STATE_MANAGER = eINSTANCE.getDocumentRoot_StateManager();
-
-        /**
-         * The meta object literal for the '<em><b>Suggested Value</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__SUGGESTED_VALUE = eINSTANCE.getDocumentRoot_SuggestedValue();
-
-        /**
-         * The meta object literal for the '<em><b>Supported Locale</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__SUPPORTED_LOCALE = eINSTANCE.getDocumentRoot_SupportedLocale();
-
-        /**
-         * The meta object literal for the '<em><b>To View Id</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__TO_VIEW_ID = eINSTANCE.getDocumentRoot_ToViewId();
-
-        /**
-         * The meta object literal for the '<em><b>Validator</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__VALIDATOR = eINSTANCE.getDocumentRoot_Validator();
-
-        /**
-         * The meta object literal for the '<em><b>Validator Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__VALIDATOR_CLASS = eINSTANCE.getDocumentRoot_ValidatorClass();
-
-        /**
-         * The meta object literal for the '<em><b>Validator Id</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__VALIDATOR_ID = eINSTANCE.getDocumentRoot_ValidatorId();
-
-        /**
-         * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__VALUE = eINSTANCE.getDocumentRoot_Value();
-
-        /**
-         * The meta object literal for the '<em><b>Value Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__VALUE_CLASS = eINSTANCE.getDocumentRoot_ValueClass();
-
-        /**
-         * The meta object literal for the '<em><b>Variable Resolver</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__VARIABLE_RESOLVER = eINSTANCE.getDocumentRoot_VariableResolver();
-
-        /**
-         * The meta object literal for the '<em><b>View Handler</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DOCUMENT_ROOT__VIEW_HANDLER = eINSTANCE.getDocumentRoot_ViewHandler();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicAttributeImpl <em>Dynamic Attribute</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicAttributeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDynamicAttribute()
-         * @generated
-         */
-        EClass DYNAMIC_ATTRIBUTE = eINSTANCE.getDynamicAttribute();
-
-        /**
-         * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute DYNAMIC_ATTRIBUTE__NAME = eINSTANCE.getDynamicAttribute_Name();
-
-        /**
-         * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute DYNAMIC_ATTRIBUTE__VALUE = eINSTANCE.getDynamicAttribute_Value();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl <em>Dynamic Element</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDynamicElement()
-         * @generated
-         */
-        EClass DYNAMIC_ELEMENT = eINSTANCE.getDynamicElement();
-
-        /**
-         * The meta object literal for the '<em><b>Child Nodes</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DYNAMIC_ELEMENT__CHILD_NODES = eINSTANCE.getDynamicElement_ChildNodes();
-
-        /**
-         * The meta object literal for the '<em><b>Attributes</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference DYNAMIC_ELEMENT__ATTRIBUTES = eINSTANCE.getDynamicElement_Attributes();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute DYNAMIC_ELEMENT__TEXT_CONTENT = eINSTANCE.getDynamicElement_TextContent();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ELResolverTypeImpl <em>EL Resolver Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ELResolverTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getELResolverType()
-         * @generated
-         */
-        EClass EL_RESOLVER_TYPE = eINSTANCE.getELResolverType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute EL_RESOLVER_TYPE__TEXT_CONTENT = eINSTANCE.getELResolverType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute EL_RESOLVER_TYPE__ID = eINSTANCE.getELResolverType_Id();
-
-        /**
-         * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute DYNAMIC_ELEMENT__NAME = eINSTANCE.getDynamicElement_Name();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl <em>Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesConfigType()
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        EReference FACES_CONFIG_TYPE__APPLICATION = eINSTANCE.getFacesConfigType_Application();
-
-        /**
-         * The meta object literal for the '<em><b>Factory</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        EReference FACES_CONFIG_TYPE__MANAGED_BEAN = eINSTANCE.getFacesConfigType_ManagedBean();
-
-        /**
-         * The meta object literal for the '<em><b>Navigation Rule</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        EReference FACES_CONFIG_TYPE__VALIDATOR = eINSTANCE.getFacesConfigType_Validator();
-
-        /**
-         * The meta object literal for the '<em><b>Faces Config Extension</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        EAttribute FACES_CONFIG_TYPE__ID = eINSTANCE.getFacesConfigType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl <em>Faces Context Factory Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesContextFactoryType()
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        EReference FACTORY_TYPE__APPLICATION_FACTORY = eINSTANCE.getFactoryType_ApplicationFactory();
-
-        /**
-         * The meta object literal for the '<em><b>Faces Context Factory</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-        EReference FACTORY_TYPE__FACES_CONTEXT_FACTORY = eINSTANCE.getFactoryType_FacesContextFactory();
-
-        /**
-         * The meta object literal for the '<em><b>Lifecycle Factory</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-        EReference FACTORY_TYPE__LIFECYCLE_FACTORY = eINSTANCE.getFactoryType_LifecycleFactory();
-
-        /**
-         * The meta object literal for the '<em><b>Render Kit Factory</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-        EReference FACTORY_TYPE__RENDER_KIT_FACTORY = eINSTANCE.getFactoryType_RenderKitFactory();
-
-        /**
-         * The meta object literal for the '<em><b>Factory Extension</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        EAttribute ICON_TYPE__ID = eINSTANCE.getIconType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl <em>Key Class Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getKeyClassType()
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        EAttribute MANAGED_BEAN_TYPE__ID = eINSTANCE.getManagedBeanType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl <em>Managed Property Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedPropertyType()
-         * @generated
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        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
-         */
-        @SuppressWarnings("hiding")
-        EReference MANAGED_PROPERTY_TYPE__PROPERTY_CLASS = eINSTANCE.getManagedPropertyType_PropertyClass();
-
-        /**
-         * The meta object literal for the '<em><b>Map Entries</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference MANAGED_PROPERTY_TYPE__MAP_ENTRIES = eINSTANCE.getManagedPropertyType_MapEntries();
-
-        /**
-         * The meta object literal for the '<em><b>Null Value</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference MANAGED_PROPERTY_TYPE__NULL_VALUE = eINSTANCE.getManagedPropertyType_NullValue();
-
-        /**
-         * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference MANAGED_PROPERTY_TYPE__VALUE = eINSTANCE.getManagedPropertyType_Value();
-
-        /**
-         * The meta object literal for the '<em><b>List Entries</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference MANAGED_PROPERTY_TYPE__LIST_ENTRIES = eINSTANCE.getManagedPropertyType_ListEntries();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute MANAGED_PROPERTY_TYPE__ID = eINSTANCE.getManagedPropertyType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl <em>Map Entries Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMapEntriesType()
-         * @generated
-         */
-        EClass MAP_ENTRIES_TYPE = eINSTANCE.getMapEntriesType();
-
-        /**
-         * The meta object literal for the '<em><b>Key Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference MAP_ENTRIES_TYPE__KEY_CLASS = eINSTANCE.getMapEntriesType_KeyClass();
-
-        /**
-         * The meta object literal for the '<em><b>Value Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference MAP_ENTRIES_TYPE__VALUE_CLASS = eINSTANCE.getMapEntriesType_ValueClass();
-
-        /**
-         * The meta object literal for the '<em><b>Map Entry</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference MAP_ENTRIES_TYPE__MAP_ENTRY = eINSTANCE.getMapEntriesType_MapEntry();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute MAP_ENTRIES_TYPE__ID = eINSTANCE.getMapEntriesType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl <em>Map Entry Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMapEntryType()
-         * @generated
-         */
-        EClass MAP_ENTRY_TYPE = eINSTANCE.getMapEntryType();
-
-        /**
-         * The meta object literal for the '<em><b>Key</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference MAP_ENTRY_TYPE__KEY = eINSTANCE.getMapEntryType_Key();
-
-        /**
-         * The meta object literal for the '<em><b>Null Value</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference MAP_ENTRY_TYPE__NULL_VALUE = eINSTANCE.getMapEntryType_NullValue();
-
-        /**
-         * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference MAP_ENTRY_TYPE__VALUE = eINSTANCE.getMapEntryType_Value();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute MAP_ENTRY_TYPE__ID = eINSTANCE.getMapEntryType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl <em>Message Bundle Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMessageBundleType()
-         * @generated
-         */
-        EClass MESSAGE_BUNDLE_TYPE = eINSTANCE.getMessageBundleType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute MESSAGE_BUNDLE_TYPE__TEXT_CONTENT = eINSTANCE.getMessageBundleType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute MESSAGE_BUNDLE_TYPE__ID = eINSTANCE.getMessageBundleType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl <em>Navigation Case Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationCaseType()
-         * @generated
-         */
-        EClass NAVIGATION_CASE_TYPE = eINSTANCE.getNavigationCaseType();
-
-        /**
-         * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference NAVIGATION_CASE_TYPE__DESCRIPTION = eINSTANCE.getNavigationCaseType_Description();
-
-        /**
-         * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference NAVIGATION_CASE_TYPE__DISPLAY_NAME = eINSTANCE.getNavigationCaseType_DisplayName();
-
-        /**
-         * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference NAVIGATION_CASE_TYPE__ICON = eINSTANCE.getNavigationCaseType_Icon();
-
-        /**
-         * The meta object literal for the '<em><b>From Action</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference NAVIGATION_CASE_TYPE__FROM_ACTION = eINSTANCE.getNavigationCaseType_FromAction();
-
-        /**
-         * The meta object literal for the '<em><b>From Outcome</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference NAVIGATION_CASE_TYPE__FROM_OUTCOME = eINSTANCE.getNavigationCaseType_FromOutcome();
-
-        /**
-         * The meta object literal for the '<em><b>To View Id</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference NAVIGATION_CASE_TYPE__TO_VIEW_ID = eINSTANCE.getNavigationCaseType_ToViewId();
-
-        /**
-         * The meta object literal for the '<em><b>Redirect</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference NAVIGATION_CASE_TYPE__REDIRECT = eINSTANCE.getNavigationCaseType_Redirect();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute NAVIGATION_CASE_TYPE__ID = eINSTANCE.getNavigationCaseType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl <em>Navigation Handler Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationHandlerType()
-         * @generated
-         */
-        EClass NAVIGATION_HANDLER_TYPE = eINSTANCE.getNavigationHandlerType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute NAVIGATION_HANDLER_TYPE__TEXT_CONTENT = eINSTANCE.getNavigationHandlerType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute NAVIGATION_HANDLER_TYPE__ID = eINSTANCE.getNavigationHandlerType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl <em>Navigation Rule Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationRuleType()
-         * @generated
-         */
-        EClass NAVIGATION_RULE_TYPE = eINSTANCE.getNavigationRuleType();
-
-        /**
-         * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference NAVIGATION_RULE_TYPE__DESCRIPTION = eINSTANCE.getNavigationRuleType_Description();
-
-        /**
-         * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference NAVIGATION_RULE_TYPE__DISPLAY_NAME = eINSTANCE.getNavigationRuleType_DisplayName();
-
-        /**
-         * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference NAVIGATION_RULE_TYPE__ICON = eINSTANCE.getNavigationRuleType_Icon();
-
-        /**
-         * The meta object literal for the '<em><b>From View Id</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference NAVIGATION_RULE_TYPE__FROM_VIEW_ID = eINSTANCE.getNavigationRuleType_FromViewId();
-
-        /**
-         * The meta object literal for the '<em><b>Navigation Case</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference NAVIGATION_RULE_TYPE__NAVIGATION_CASE = eINSTANCE.getNavigationRuleType_NavigationCase();
-
-        /**
-         * The meta object literal for the '<em><b>Navigation Rule Extension</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION = eINSTANCE.getNavigationRuleType_NavigationRuleExtension();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute NAVIGATION_RULE_TYPE__ID = eINSTANCE.getNavigationRuleType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NullValueTypeImpl <em>Null Value Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NullValueTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNullValueType()
-         * @generated
-         */
-        EClass NULL_VALUE_TYPE = eINSTANCE.getNullValueType();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute NULL_VALUE_TYPE__ID = eINSTANCE.getNullValueType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl <em>Phase Listener Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPhaseListenerType()
-         * @generated
-         */
-        EClass PHASE_LISTENER_TYPE = eINSTANCE.getPhaseListenerType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute PHASE_LISTENER_TYPE__TEXT_CONTENT = eINSTANCE.getPhaseListenerType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute PHASE_LISTENER_TYPE__ID = eINSTANCE.getPhaseListenerType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl <em>Property Class Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyClassType()
-         * @generated
-         */
-        EClass PROPERTY_CLASS_TYPE = eINSTANCE.getPropertyClassType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute PROPERTY_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getPropertyClassType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute PROPERTY_CLASS_TYPE__ID = eINSTANCE.getPropertyClassType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyExtensionTypeImpl <em>Property Extension Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyExtensionTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyExtensionType()
-         * @generated
-         */
-        EClass PROPERTY_EXTENSION_TYPE = eINSTANCE.getPropertyExtensionType();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl <em>Property Name Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyNameType()
-         * @generated
-         */
-        EClass PROPERTY_NAME_TYPE = eINSTANCE.getPropertyNameType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute PROPERTY_NAME_TYPE__TEXT_CONTENT = eINSTANCE.getPropertyNameType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute PROPERTY_NAME_TYPE__ID = eINSTANCE.getPropertyNameType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl <em>Property Resolver Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyResolverType()
-         * @generated
-         */
-        EClass PROPERTY_RESOLVER_TYPE = eINSTANCE.getPropertyResolverType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute PROPERTY_RESOLVER_TYPE__TEXT_CONTENT = eINSTANCE.getPropertyResolverType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute PROPERTY_RESOLVER_TYPE__ID = eINSTANCE.getPropertyResolverType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl <em>Property Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyType()
-         * @generated
-         */
-        EClass PROPERTY_TYPE = eINSTANCE.getPropertyType();
-
-        /**
-         * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference PROPERTY_TYPE__DESCRIPTION = eINSTANCE.getPropertyType_Description();
-
-        /**
-         * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference PROPERTY_TYPE__DISPLAY_NAME = eINSTANCE.getPropertyType_DisplayName();
-
-        /**
-         * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference PROPERTY_TYPE__ICON = eINSTANCE.getPropertyType_Icon();
-
-        /**
-         * The meta object literal for the '<em><b>Property Name</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference PROPERTY_TYPE__PROPERTY_NAME = eINSTANCE.getPropertyType_PropertyName();
-
-        /**
-         * The meta object literal for the '<em><b>Property Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference PROPERTY_TYPE__PROPERTY_CLASS = eINSTANCE.getPropertyType_PropertyClass();
-
-        /**
-         * The meta object literal for the '<em><b>Default Value</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference PROPERTY_TYPE__DEFAULT_VALUE = eINSTANCE.getPropertyType_DefaultValue();
-
-        /**
-         * The meta object literal for the '<em><b>Suggested Value</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference PROPERTY_TYPE__SUGGESTED_VALUE = eINSTANCE.getPropertyType_SuggestedValue();
-
-        /**
-         * The meta object literal for the '<em><b>Property Extension</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference PROPERTY_TYPE__PROPERTY_EXTENSION = eINSTANCE.getPropertyType_PropertyExtension();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute PROPERTY_TYPE__ID = eINSTANCE.getPropertyType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl <em>Redirect Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRedirectType()
-         * @generated
-         */
-        EClass REDIRECT_TYPE = eINSTANCE.getRedirectType();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute REDIRECT_TYPE__ID = eINSTANCE.getRedirectType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl <em>Referenced Bean Class Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanClassType()
-         * @generated
-         */
-        EClass REFERENCED_BEAN_CLASS_TYPE = eINSTANCE.getReferencedBeanClassType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getReferencedBeanClassType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute REFERENCED_BEAN_CLASS_TYPE__ID = eINSTANCE.getReferencedBeanClassType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl <em>Referenced Bean Name Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanNameType()
-         * @generated
-         */
-        EClass REFERENCED_BEAN_NAME_TYPE = eINSTANCE.getReferencedBeanNameType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT = eINSTANCE.getReferencedBeanNameType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute REFERENCED_BEAN_NAME_TYPE__ID = eINSTANCE.getReferencedBeanNameType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl <em>Referenced Bean Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanType()
-         * @generated
-         */
-        EClass REFERENCED_BEAN_TYPE = eINSTANCE.getReferencedBeanType();
-
-        /**
-         * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference REFERENCED_BEAN_TYPE__DESCRIPTION = eINSTANCE.getReferencedBeanType_Description();
-
-        /**
-         * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference REFERENCED_BEAN_TYPE__DISPLAY_NAME = eINSTANCE.getReferencedBeanType_DisplayName();
-
-        /**
-         * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference REFERENCED_BEAN_TYPE__ICON = eINSTANCE.getReferencedBeanType_Icon();
-
-        /**
-         * The meta object literal for the '<em><b>Referenced Bean Name</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME = eINSTANCE.getReferencedBeanType_ReferencedBeanName();
-
-        /**
-         * The meta object literal for the '<em><b>Referenced Bean Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS = eINSTANCE.getReferencedBeanType_ReferencedBeanClass();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute REFERENCED_BEAN_TYPE__ID = eINSTANCE.getReferencedBeanType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl <em>Renderer Class Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererClassType()
-         * @generated
-         */
-        EClass RENDERER_CLASS_TYPE = eINSTANCE.getRendererClassType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute RENDERER_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getRendererClassType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute RENDERER_CLASS_TYPE__ID = eINSTANCE.getRendererClassType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererExtensionTypeImpl <em>Renderer Extension Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererExtensionTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererExtensionType()
-         * @generated
-         */
-        EClass RENDERER_EXTENSION_TYPE = eINSTANCE.getRendererExtensionType();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl <em>Renderer Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererType()
-         * @generated
-         */
-        EClass RENDERER_TYPE = eINSTANCE.getRendererType();
-
-        /**
-         * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference RENDERER_TYPE__DESCRIPTION = eINSTANCE.getRendererType_Description();
-
-        /**
-         * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference RENDERER_TYPE__DISPLAY_NAME = eINSTANCE.getRendererType_DisplayName();
-
-        /**
-         * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference RENDERER_TYPE__ICON = eINSTANCE.getRendererType_Icon();
-
-        /**
-         * The meta object literal for the '<em><b>Component Family</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference RENDERER_TYPE__COMPONENT_FAMILY = eINSTANCE.getRendererType_ComponentFamily();
-
-        /**
-         * The meta object literal for the '<em><b>Renderer Type</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference RENDERER_TYPE__RENDERER_TYPE = eINSTANCE.getRendererType_RendererType();
-
-        /**
-         * The meta object literal for the '<em><b>Renderer Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference RENDERER_TYPE__RENDERER_CLASS = eINSTANCE.getRendererType_RendererClass();
-
-        /**
-         * The meta object literal for the '<em><b>Facet</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference RENDERER_TYPE__FACET = eINSTANCE.getRendererType_Facet();
-
-        /**
-         * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference RENDERER_TYPE__ATTRIBUTE = eINSTANCE.getRendererType_Attribute();
-
-        /**
-         * The meta object literal for the '<em><b>Renderer Extension</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference RENDERER_TYPE__RENDERER_EXTENSION = eINSTANCE.getRendererType_RendererExtension();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute RENDERER_TYPE__ID = eINSTANCE.getRendererType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl <em>Renderer Type Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererTypeType()
-         * @generated
-         */
-        EClass RENDERER_TYPE_TYPE = eINSTANCE.getRendererTypeType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute RENDERER_TYPE_TYPE__TEXT_CONTENT = eINSTANCE.getRendererTypeType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute RENDERER_TYPE_TYPE__ID = eINSTANCE.getRendererTypeType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl <em>Render Kit Class Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitClassType()
-         * @generated
-         */
-        EClass RENDER_KIT_CLASS_TYPE = eINSTANCE.getRenderKitClassType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute RENDER_KIT_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getRenderKitClassType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute RENDER_KIT_CLASS_TYPE__ID = eINSTANCE.getRenderKitClassType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl <em>Render Kit Factory Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitFactoryType()
-         * @generated
-         */
-        EClass RENDER_KIT_FACTORY_TYPE = eINSTANCE.getRenderKitFactoryType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT = eINSTANCE.getRenderKitFactoryType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute RENDER_KIT_FACTORY_TYPE__ID = eINSTANCE.getRenderKitFactoryType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl <em>Render Kit Id Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitIdType()
-         * @generated
-         */
-        EClass RENDER_KIT_ID_TYPE = eINSTANCE.getRenderKitIdType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute RENDER_KIT_ID_TYPE__TEXT_CONTENT = eINSTANCE.getRenderKitIdType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute RENDER_KIT_ID_TYPE__ID = eINSTANCE.getRenderKitIdType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl <em>Render Kit Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitType()
-         * @generated
-         */
-        EClass RENDER_KIT_TYPE = eINSTANCE.getRenderKitType();
-
-        /**
-         * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference RENDER_KIT_TYPE__DESCRIPTION = eINSTANCE.getRenderKitType_Description();
-
-        /**
-         * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference RENDER_KIT_TYPE__DISPLAY_NAME = eINSTANCE.getRenderKitType_DisplayName();
-
-        /**
-         * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference RENDER_KIT_TYPE__ICON = eINSTANCE.getRenderKitType_Icon();
-
-        /**
-         * The meta object literal for the '<em><b>Render Kit Id</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference RENDER_KIT_TYPE__RENDER_KIT_ID = eINSTANCE.getRenderKitType_RenderKitId();
-
-        /**
-         * The meta object literal for the '<em><b>Render Kit Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference RENDER_KIT_TYPE__RENDER_KIT_CLASS = eINSTANCE.getRenderKitType_RenderKitClass();
-
-        /**
-         * The meta object literal for the '<em><b>Renderer</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference RENDER_KIT_TYPE__RENDERER = eINSTANCE.getRenderKitType_Renderer();
-
-        /**
-         * The meta object literal for the '<em><b>Render Kit Extension</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference RENDER_KIT_TYPE__RENDER_KIT_EXTENSION = eINSTANCE.getRenderKitType_RenderKitExtension();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute RENDER_KIT_TYPE__ID = eINSTANCE.getRenderKitType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl <em>Small Icon Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSmallIconType()
-         * @generated
-         */
-        EClass SMALL_ICON_TYPE = eINSTANCE.getSmallIconType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute SMALL_ICON_TYPE__TEXT_CONTENT = eINSTANCE.getSmallIconType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute SMALL_ICON_TYPE__ID = eINSTANCE.getSmallIconType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl <em>State Manager Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getStateManagerType()
-         * @generated
-         */
-        EClass STATE_MANAGER_TYPE = eINSTANCE.getStateManagerType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute STATE_MANAGER_TYPE__TEXT_CONTENT = eINSTANCE.getStateManagerType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute STATE_MANAGER_TYPE__ID = eINSTANCE.getStateManagerType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl <em>Suggested Value Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSuggestedValueType()
-         * @generated
-         */
-        EClass SUGGESTED_VALUE_TYPE = eINSTANCE.getSuggestedValueType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute SUGGESTED_VALUE_TYPE__TEXT_CONTENT = eINSTANCE.getSuggestedValueType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute SUGGESTED_VALUE_TYPE__ID = eINSTANCE.getSuggestedValueType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl <em>Supported Locale Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSupportedLocaleType()
-         * @generated
-         */
-        EClass SUPPORTED_LOCALE_TYPE = eINSTANCE.getSupportedLocaleType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute SUPPORTED_LOCALE_TYPE__TEXT_CONTENT = eINSTANCE.getSupportedLocaleType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute SUPPORTED_LOCALE_TYPE__ID = eINSTANCE.getSupportedLocaleType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl <em>To View Id Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getToViewIdType()
-         * @generated
-         */
-        EClass TO_VIEW_ID_TYPE = eINSTANCE.getToViewIdType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute TO_VIEW_ID_TYPE__TEXT_CONTENT = eINSTANCE.getToViewIdType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute TO_VIEW_ID_TYPE__ID = eINSTANCE.getToViewIdType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl <em>Validator Class Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorClassType()
-         * @generated
-         */
-        EClass VALIDATOR_CLASS_TYPE = eINSTANCE.getValidatorClassType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute VALIDATOR_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getValidatorClassType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute VALIDATOR_CLASS_TYPE__ID = eINSTANCE.getValidatorClassType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl <em>Validator Id Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorIdType()
-         * @generated
-         */
-        EClass VALIDATOR_ID_TYPE = eINSTANCE.getValidatorIdType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute VALIDATOR_ID_TYPE__TEXT_CONTENT = eINSTANCE.getValidatorIdType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute VALIDATOR_ID_TYPE__ID = eINSTANCE.getValidatorIdType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl <em>Validator Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorType()
-         * @generated
-         */
-        EClass VALIDATOR_TYPE = eINSTANCE.getValidatorType();
-
-        /**
-         * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference VALIDATOR_TYPE__DESCRIPTION = eINSTANCE.getValidatorType_Description();
-
-        /**
-         * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference VALIDATOR_TYPE__DISPLAY_NAME = eINSTANCE.getValidatorType_DisplayName();
-
-        /**
-         * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference VALIDATOR_TYPE__ICON = eINSTANCE.getValidatorType_Icon();
-
-        /**
-         * The meta object literal for the '<em><b>Validator Id</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference VALIDATOR_TYPE__VALIDATOR_ID = eINSTANCE.getValidatorType_ValidatorId();
-
-        /**
-         * The meta object literal for the '<em><b>Validator Class</b></em>' containment reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference VALIDATOR_TYPE__VALIDATOR_CLASS = eINSTANCE.getValidatorType_ValidatorClass();
-
-        /**
-         * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference VALIDATOR_TYPE__ATTRIBUTE = eINSTANCE.getValidatorType_Attribute();
-
-        /**
-         * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference VALIDATOR_TYPE__PROPERTY = eINSTANCE.getValidatorType_Property();
-
-        /**
-         * The meta object literal for the '<em><b>Validator Extension</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference VALIDATOR_TYPE__VALIDATOR_EXTENSION = eINSTANCE.getValidatorType_ValidatorExtension();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute VALIDATOR_TYPE__ID = eINSTANCE.getValidatorType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl <em>Value Class Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValueClassType()
-         * @generated
-         */
-        EClass VALUE_CLASS_TYPE = eINSTANCE.getValueClassType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute VALUE_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getValueClassType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute VALUE_CLASS_TYPE__ID = eINSTANCE.getValueClassType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl <em>Value Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValueType()
-         * @generated
-         */
-        EClass VALUE_TYPE = eINSTANCE.getValueType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute VALUE_TYPE__TEXT_CONTENT = eINSTANCE.getValueType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute VALUE_TYPE__ID = eINSTANCE.getValueType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl <em>Variable Resolver Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getVariableResolverType()
-         * @generated
-         */
-        EClass VARIABLE_RESOLVER_TYPE = eINSTANCE.getVariableResolverType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute VARIABLE_RESOLVER_TYPE__TEXT_CONTENT = eINSTANCE.getVariableResolverType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute VARIABLE_RESOLVER_TYPE__ID = eINSTANCE.getVariableResolverType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl <em>View Handler Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getViewHandlerType()
-         * @generated
-         */
-        EClass VIEW_HANDLER_TYPE = eINSTANCE.getViewHandlerType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute VIEW_HANDLER_TYPE__TEXT_CONTENT = eINSTANCE.getViewHandlerType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute VIEW_HANDLER_TYPE__ID = eINSTANCE.getViewHandlerType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl <em>Resource Bundle Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getResourceBundleType()
-         * @generated
-         */
-        EClass RESOURCE_BUNDLE_TYPE = eINSTANCE.getResourceBundleType();
-
-        /**
-         * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference RESOURCE_BUNDLE_TYPE__DESCRIPTION = eINSTANCE.getResourceBundleType_Description();
-
-        /**
-         * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference RESOURCE_BUNDLE_TYPE__DISPLAY_NAME = eINSTANCE.getResourceBundleType_DisplayName();
-
-        /**
-         * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference RESOURCE_BUNDLE_TYPE__ICON = eINSTANCE.getResourceBundleType_Icon();
-
-        /**
-         * The meta object literal for the '<em><b>Base Name</b></em>' reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference RESOURCE_BUNDLE_TYPE__BASE_NAME = eINSTANCE.getResourceBundleType_BaseName();
-
-        /**
-         * The meta object literal for the '<em><b>Var</b></em>' reference feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference RESOURCE_BUNDLE_TYPE__VAR = eINSTANCE.getResourceBundleType_Var();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute RESOURCE_BUNDLE_TYPE__ID = eINSTANCE.getResourceBundleType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BaseNameTypeImpl <em>Base Name Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.BaseNameTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getBaseNameType()
-         * @generated
-         */
-        EClass BASE_NAME_TYPE = eINSTANCE.getBaseNameType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute BASE_NAME_TYPE__TEXT_CONTENT = eINSTANCE.getBaseNameType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute BASE_NAME_TYPE__ID = eINSTANCE.getBaseNameType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VarTypeImpl <em>Var Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.VarTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getVarType()
-         * @generated
-         */
-        EClass VAR_TYPE = eINSTANCE.getVarType();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute VAR_TYPE__TEXT_CONTENT = eINSTANCE.getVarType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute VAR_TYPE__ID = eINSTANCE.getVarType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitExtensionTypeImpl <em>Render Kit Extension Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitExtensionTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitExtensionType()
-         * @generated
-         */
-        EClass RENDER_KIT_EXTENSION_TYPE = eINSTANCE.getRenderKitExtensionType();
-
-            /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleExtensionTypeImpl <em>Navigation Rule Extension Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleExtensionTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationRuleExtensionType()
-         * @generated
-         */
-        EClass NAVIGATION_RULE_EXTENSION_TYPE = eINSTANCE.getNavigationRuleExtensionType();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorExtensionTypeImpl <em>Validator Extension Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorExtensionTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorExtensionType()
-         * @generated
-         */
-        EClass VALIDATOR_EXTENSION_TYPE = eINSTANCE.getValidatorExtensionType();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigExtensionTypeImpl <em>Extension Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigExtensionTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesConfigExtensionType()
-         * @generated
-         */
-        EClass FACES_CONFIG_EXTENSION_TYPE = eINSTANCE.getFacesConfigExtensionType();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryExtensionTypeImpl <em>Factory Extension Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryExtensionTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFactoryExtensionType()
-         * @generated
-         */
-        EClass FACTORY_EXTENSION_TYPE = eINSTANCE.getFactoryExtensionType();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleExtensionTypeImpl <em>Lifecycle Extension Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleExtensionTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLifecycleExtensionType()
-         * @generated
-         */
-        EClass LIFECYCLE_EXTENSION_TYPE = eINSTANCE.getLifecycleExtensionType();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanExtensionTypeImpl <em>Managed Bean Extension Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanExtensionTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanExtensionType()
-         * @generated
-         */
-        EClass MANAGED_BEAN_EXTENSION_TYPE = eINSTANCE.getManagedBeanExtensionType();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterExtensionTypeImpl <em>Converter Extension Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterExtensionTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterExtensionType()
-         * @generated
-         */
-        EClass CONVERTER_EXTENSION_TYPE = eINSTANCE.getConverterExtensionType();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExtensionTypeImpl <em>Extension Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ExtensionTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getExtensionType()
-         * @generated
-         */
-        EClass EXTENSION_TYPE = eINSTANCE.getExtensionType();
-
-        /**
-         * The meta object literal for the '<em><b>Child Nodes</b></em>' reference list feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EReference EXTENSION_TYPE__CHILD_NODES = eINSTANCE.getExtensionType_ChildNodes();
-
-        /**
-         * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute EXTENSION_TYPE__TEXT_CONTENT = eINSTANCE.getExtensionType_TextContent();
-
-        /**
-         * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @generated
-         */
-        EAttribute EXTENSION_TYPE__ID = eINSTANCE.getExtensionType_Id();
-
-        /**
-         * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationExtensionTypeImpl <em>Application Extension Type</em>}' class.
-         * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationExtensionTypeImpl
-         * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationExtensionType()
-         * @generated
-         */
-        EClass APPLICATION_EXTENSION_TYPE = eINSTANCE.getApplicationExtensionType();
-
-}
-
-} //FacesConfigPackage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigType.java
deleted file mode 100644
index bba784f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigType.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getApplication <em>Application</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getFactory <em>Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getComponent <em>Component</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getConverter <em>Converter</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getManagedBean <em>Managed Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getNavigationRule <em>Navigation Rule</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getReferencedBean <em>Referenced Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getRenderKit <em>Render Kit</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getLifecycle <em>Lifecycle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getValidator <em>Validator</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getFacesConfigExtension <em>Faces Config Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getXmlns <em>Xmlns</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType()
- * @model extendedMetaData="name='faces-config_._type' kind='elementOnly'"
- * @generated
- */
-public interface FacesConfigType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Application</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Application</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Application</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Application()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.ApplicationType" containment="true"
-     *        extendedMetaData="kind='element' name='application' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getApplication();
-
-    /**
-     * Returns the value of the '<em><b>Factory</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Factory</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Factory()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.FactoryType" containment="true"
-     *        extendedMetaData="kind='element' name='factory' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getFactory();
-
-    /**
-     * Returns the value of the '<em><b>Component</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Component</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Component</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Component()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.ComponentType" containment="true"
-     *        extendedMetaData="kind='element' name='component' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getComponent();
-
-    /**
-     * Returns the value of the '<em><b>Converter</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Converter</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Converter</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Converter()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.ConverterType" containment="true"
-     *        extendedMetaData="kind='element' name='converter' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getConverter();
-
-    /**
-     * Returns the value of the '<em><b>Managed Bean</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Managed Bean</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Managed Bean</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_ManagedBean()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType" containment="true"
-     *        extendedMetaData="kind='element' name='managed-bean' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getManagedBean();
-
-    /**
-     * Returns the value of the '<em><b>Navigation Rule</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Navigation Rule</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Navigation Rule</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_NavigationRule()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType" containment="true"
-     *        extendedMetaData="kind='element' name='navigation-rule' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getNavigationRule();
-
-    /**
-     * Returns the value of the '<em><b>Referenced Bean</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Referenced Bean</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Referenced Bean</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_ReferencedBean()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType" containment="true"
-     *        extendedMetaData="kind='element' name='referenced-bean' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getReferencedBean();
-
-    /**
-     * Returns the value of the '<em><b>Render Kit</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Render Kit</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Render Kit</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_RenderKit()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.RenderKitType" containment="true"
-     *        extendedMetaData="kind='element' name='render-kit' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getRenderKit();
-
-    /**
-     * Returns the value of the '<em><b>Lifecycle</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Lifecycle</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Lifecycle</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Lifecycle()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.LifecycleType" containment="true"
-     *        extendedMetaData="kind='element' name='lifecycle' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getLifecycle();
-
-    /**
-     * Returns the value of the '<em><b>Validator</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Validator</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Validator</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Validator()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.ValidatorType" containment="true"
-     *        extendedMetaData="kind='element' name='validator' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getValidator();
-
-    /**
-     * Returns the value of the '<em><b>Faces Config Extension</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Faces Config Extension</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Faces Config Extension</em>' reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_FacesConfigExtension()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType"
-     *        extendedMetaData="kind='element' name='faces-config-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList getFacesConfigExtension();
-
-    /**
-     * Returns the value of the '<em><b>Xmlns</b></em>' attribute.
-     * The default value is <code>"http://java.sun.com/JSF/Configuration"</code>.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Xmlns</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Xmlns</em>' attribute.
-     * @see #isSetXmlns()
-     * @see #unsetXmlns()
-     * @see #setXmlns(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Xmlns()
-     * @model default="http://java.sun.com/JSF/Configuration" unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="kind='attribute' name='xmlns' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getXmlns();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getXmlns <em>Xmlns</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Xmlns</em>' attribute.
-     * @see #isSetXmlns()
-     * @see #unsetXmlns()
-     * @see #getXmlns()
-     * @generated
-     */
-	void setXmlns(String value);
-
-    /**
-     * Unsets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getXmlns <em>Xmlns</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #isSetXmlns()
-     * @see #getXmlns()
-     * @see #setXmlns(String)
-     * @generated
-     */
-	void unsetXmlns();
-
-    /**
-     * Returns whether the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getXmlns <em>Xmlns</em>}' attribute is set.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return whether the value of the '<em>Xmlns</em>' attribute is set.
-     * @see #unsetXmlns()
-     * @see #getXmlns()
-     * @see #setXmlns(String)
-     * @generated
-     */
-	boolean isSetXmlns();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // FacesConfigType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesContextFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesContextFactoryType.java
deleted file mode 100644
index b25a431..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesContextFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Faces Context Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesContextFactoryType()
- * @model extendedMetaData="name='faces-context-factory_._type' kind='simple'"
- * @generated
- */
-public interface FacesContextFactoryType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesContextFactoryType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesContextFactoryType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // FacesContextFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetExtensionType.java
deleted file mode 100644
index 7016d15..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facet Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetExtensionType()
- * @model extendedMetaData="name='facet-extension_._type'"
- * @generated
- */
-public interface FacetExtensionType extends ExtensionType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-} // FacetExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetNameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetNameType.java
deleted file mode 100644
index f56bfa6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetNameType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facet Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetNameType()
- * @model extendedMetaData="name='facet-name_._type' kind='simple'"
- * @generated
- */
-public interface FacetNameType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetNameType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetNameType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // FacetNameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetType.java
deleted file mode 100644
index 1c663a2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetType.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facet Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getFacetName <em>Facet Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getFacetExtension <em>Facet Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetType()
- * @model extendedMetaData="name='facet_._type' kind='elementOnly'"
- * @generated
- */
-public interface FacetType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Description</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetType_Description()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-     *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDescription();
-
-    /**
-     * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Display Name</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetType_DisplayName()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-     *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDisplayName();
-
-    /**
-     * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Icon</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetType_Icon()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-     *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getIcon();
-
-    /**
-     * Returns the value of the '<em><b>Facet Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Facet Name</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Facet Name</em>' containment reference.
-     * @see #setFacetName(FacetNameType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetType_FacetName()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='facet-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	FacetNameType getFacetName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getFacetName <em>Facet Name</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Facet Name</em>' containment reference.
-     * @see #getFacetName()
-     * @generated
-     */
-	void setFacetName(FacetNameType value);
-
-    /**
-     * Returns the value of the '<em><b>Facet Extension</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Facet Extension</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Facet Extension</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetType_FacetExtension()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType" containment="true"
-     *        extendedMetaData="kind='element' name='facet-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getFacetExtension();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // FacetType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FactoryExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FactoryExtensionType.java
deleted file mode 100644
index 03c58c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FactoryExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Factory Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryExtensionType()
- * @model extendedMetaData="name='factory-extension_._type'"
- * @generated
- */
-public interface FactoryExtensionType extends ExtensionType {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-} // FactoryExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FactoryType.java
deleted file mode 100644
index 80bdca5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FactoryType.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getApplicationFactory <em>Application Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getFacesContextFactory <em>Faces Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getLifecycleFactory <em>Lifecycle Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getRenderKitFactory <em>Render Kit Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getFactoryExtension <em>Factory Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType()
- * @model extendedMetaData="name='factory_._type' kind='elementOnly'"
- * @generated
- */
-public interface FactoryType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Application Factory</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Application Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Application Factory</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_ApplicationFactory()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType" containment="true"
-     *        extendedMetaData="kind='element' name='application-factory' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getApplicationFactory();
-
-    /**
-     * Returns the value of the '<em><b>Faces Context Factory</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Faces Context Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Faces Context Factory</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_FacesContextFactory()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType" containment="true"
-     *        extendedMetaData="kind='element' name='faces-context-factory' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getFacesContextFactory();
-
-    /**
-     * Returns the value of the '<em><b>Lifecycle Factory</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Lifecycle Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Lifecycle Factory</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_LifecycleFactory()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType" containment="true"
-     *        extendedMetaData="kind='element' name='lifecycle-factory' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getLifecycleFactory();
-
-    /**
-     * Returns the value of the '<em><b>Render Kit Factory</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Render Kit Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Render Kit Factory</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_RenderKitFactory()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType" containment="true"
-     *        extendedMetaData="kind='element' name='render-kit-factory' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getRenderKitFactory();
-
-    /**
-     * Returns the value of the '<em><b>Factory Extension</b></em>' reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Factory Extension</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Factory Extension</em>' reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_FactoryExtension()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType"
-     *        extendedMetaData="kind='element' name='factory-type' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList getFactoryExtension();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // FactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromActionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromActionType.java
deleted file mode 100644
index 4bb8a75..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromActionType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>From Action Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromActionType()
- * @model extendedMetaData="name='from-action_._type' kind='simple'"
- * @generated
- */
-public interface FromActionType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromActionType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromActionType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // FromActionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromOutcomeType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromOutcomeType.java
deleted file mode 100644
index 5fafeed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromOutcomeType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>From Outcome Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromOutcomeType()
- * @model extendedMetaData="name='from-outcome_._type' kind='simple'"
- * @generated
- */
-public interface FromOutcomeType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromOutcomeType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromOutcomeType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // FromOutcomeType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromViewIdType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromViewIdType.java
deleted file mode 100644
index 7e325c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromViewIdType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>From View Id Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromViewIdType()
- * @model extendedMetaData="name='from-view-id_._type' kind='simple'"
- * @generated
- */
-public interface FromViewIdType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromViewIdType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromViewIdType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // FromViewIdType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/IconType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/IconType.java
deleted file mode 100644
index 1fe0d38..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/IconType.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Icon Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getSmallIcon <em>Small Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getLargeIcon <em>Large Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getLang <em>Lang</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getIconType()
- * @model extendedMetaData="name='icon_._type' kind='empty'"
- * @generated
- */
-public interface IconType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Small Icon</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Small Icon</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Small Icon</em>' containment reference.
-     * @see #setSmallIcon(SmallIconType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getIconType_SmallIcon()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='small-icon' namespace='##targetNamespace'"
-     * @generated
-     */
-	SmallIconType getSmallIcon();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getSmallIcon <em>Small Icon</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Small Icon</em>' containment reference.
-     * @see #getSmallIcon()
-     * @generated
-     */
-	void setSmallIcon(SmallIconType value);
-
-    /**
-     * Returns the value of the '<em><b>Large Icon</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Large Icon</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Large Icon</em>' containment reference.
-     * @see #setLargeIcon(LargeIconType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getIconType_LargeIcon()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='large-icon' namespace='##targetNamespace'"
-     * @generated
-     */
-	LargeIconType getLargeIcon();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getLargeIcon <em>Large Icon</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Large Icon</em>' containment reference.
-     * @see #getLargeIcon()
-     * @generated
-     */
-	void setLargeIcon(LargeIconType value);
-
-    /**
-     * Returns the value of the '<em><b>Lang</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Lang</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Lang</em>' attribute.
-     * @see #setLang(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getIconType_Lang()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Language"
-     *        extendedMetaData="kind='attribute' name='lang' namespace='http://www.w3.org/XML/1998/namespace'"
-     * @generated
-     */
-	String getLang();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getLang <em>Lang</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Lang</em>' attribute.
-     * @see #getLang()
-     * @generated
-     */
-	void setLang(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getIconType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // IconType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/KeyClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/KeyClassType.java
deleted file mode 100644
index da97328..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/KeyClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Key Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getKeyClassType()
- * @model extendedMetaData="name='key-class_._type' kind='simple'"
- * @generated
- */
-public interface KeyClassType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getKeyClassType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getKeyClassType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // KeyClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/KeyType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/KeyType.java
deleted file mode 100644
index 806114c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/KeyType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Key Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getKeyType()
- * @model extendedMetaData="name='key_._type' kind='simple'"
- * @generated
- */
-public interface KeyType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getKeyType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getKeyType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // KeyType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LargeIconType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LargeIconType.java
deleted file mode 100644
index dcc6c75..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LargeIconType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Large Icon Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLargeIconType()
- * @model extendedMetaData="name='large-icon_._type' kind='simple'"
- * @generated
- */
-public interface LargeIconType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLargeIconType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLargeIconType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // LargeIconType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleExtensionType.java
deleted file mode 100644
index 6249588..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Lifecycle Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleExtensionType()
- * @model extendedMetaData="name='lifecycle-extension_._type'"
- * @generated
- */
-public interface LifecycleExtensionType extends ExtensionType {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-} // LifecycleExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleFactoryType.java
deleted file mode 100644
index df6c57c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Lifecycle Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleFactoryType()
- * @model extendedMetaData="name='lifecycle-factory_._type' kind='simple'"
- * @generated
- */
-public interface LifecycleFactoryType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleFactoryType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleFactoryType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // LifecycleFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleType.java
deleted file mode 100644
index 0126ee6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleType.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Lifecycle Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getPhaseListener <em>Phase Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getLifecycleExtension <em>Lifecycle Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleType()
- * @model extendedMetaData="name='lifecycle_._type' kind='elementOnly'"
- * @generated
- */
-public interface LifecycleType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Phase Listener</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Phase Listener</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Phase Listener</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleType_PhaseListener()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType" containment="true"
-     *        extendedMetaData="kind='element' name='phase-listener' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getPhaseListener();
-
-    /**
-     * Returns the value of the '<em><b>Lifecycle Extension</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Lifecycle Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Lifecycle Extension</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleType_LifecycleExtension()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType" containment="true"
-     *        extendedMetaData="kind='element' name='lifecycle-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList getLifecycleExtension();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // LifecycleType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ListEntriesType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ListEntriesType.java
deleted file mode 100644
index 2c65fb8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ListEntriesType.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>List Entries Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getValueClass <em>Value Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getListEntriesType()
- * @model extendedMetaData="name='list-entries_._type' kind='elementOnly'"
- * @generated
- */
-public interface ListEntriesType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Value Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Value Class</em>' containment reference.
-     * @see #setValueClass(ValueClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getListEntriesType_ValueClass()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='value-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	ValueClassType getValueClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getValueClass <em>Value Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Value Class</em>' containment reference.
-     * @see #getValueClass()
-     * @generated
-     */
-	void setValueClass(ValueClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Null Value</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Null Value</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Null Value</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getListEntriesType_NullValue()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.NullValueType" containment="true"
-     *        extendedMetaData="kind='element' name='null-value' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getNullValue();
-
-    /**
-     * Returns the value of the '<em><b>Value</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ValueType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Value</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getListEntriesType_Value()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.ValueType" containment="true"
-     *        extendedMetaData="kind='element' name='value' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getValue();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getListEntriesType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ListEntriesType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LocaleConfigType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LocaleConfigType.java
deleted file mode 100644
index 45f038d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LocaleConfigType.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Locale Config Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getDefaultLocale <em>Default Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getSupportedLocale <em>Supported Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLocaleConfigType()
- * @model extendedMetaData="name='locale-config_._type' kind='elementOnly'"
- * @generated
- */
-public interface LocaleConfigType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Default Locale</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Locale</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Default Locale</em>' containment reference.
-     * @see #setDefaultLocale(DefaultLocaleType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLocaleConfigType_DefaultLocale()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='default-locale' namespace='##targetNamespace'"
-     * @generated
-     */
-	DefaultLocaleType getDefaultLocale();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getDefaultLocale <em>Default Locale</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Default Locale</em>' containment reference.
-     * @see #getDefaultLocale()
-     * @generated
-     */
-	void setDefaultLocale(DefaultLocaleType value);
-
-    /**
-     * Returns the value of the '<em><b>Supported Locale</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Supported Locale</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Supported Locale</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLocaleConfigType_SupportedLocale()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType" containment="true"
-     *        extendedMetaData="kind='element' name='supported-locale' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getSupportedLocale();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLocaleConfigType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // LocaleConfigType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanClassType.java
deleted file mode 100644
index 3d38362..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Managed Bean Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanClassType()
- * @model extendedMetaData="name='managed-bean-class_._type' kind='simple'"
- * @generated
- */
-public interface ManagedBeanClassType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanClassType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanClassType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ManagedBeanClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanExtensionType.java
deleted file mode 100644
index 21e7f12..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Managed Bean Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanExtensionType()
- * @model extendedMetaData="name='managed-bean-extension_._type'"
- * @generated
- */
-public interface ManagedBeanExtensionType extends ExtensionType {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-} // ManagedBeanExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanNameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanNameType.java
deleted file mode 100644
index a845c56..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanNameType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Managed Bean Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanNameType()
- * @model extendedMetaData="name='managed-bean-name_._type' kind='simple'"
- * @generated
- */
-public interface ManagedBeanNameType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanNameType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanNameType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ManagedBeanNameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanScopeType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanScopeType.java
deleted file mode 100644
index f15180c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanScopeType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Managed Bean Scope Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanScopeType()
- * @model extendedMetaData="name='managed-bean-scope_._type' kind='simple'"
- * @generated
- */
-public interface ManagedBeanScopeType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanScopeType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanScopeType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ManagedBeanScopeType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanType.java
deleted file mode 100644
index 81a4b34..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanType.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Managed Bean Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanName <em>Managed Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanClass <em>Managed Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanScope <em>Managed Bean Scope</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedProperty <em>Managed Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getMapEntries <em>Map Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getListEntries <em>List Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanExtension <em>Managed Bean Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType()
- * @model extendedMetaData="name='managed-bean_._type' kind='elementOnly'"
- * @generated
- */
-public interface ManagedBeanType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Description</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_Description()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-     *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDescription();
-
-    /**
-     * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Display Name</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_DisplayName()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-     *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDisplayName();
-
-    /**
-     * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Icon</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_Icon()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-     *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getIcon();
-
-    /**
-     * Returns the value of the '<em><b>Managed Bean Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Managed Bean Name</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Managed Bean Name</em>' containment reference.
-     * @see #setManagedBeanName(ManagedBeanNameType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_ManagedBeanName()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='managed-bean-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	ManagedBeanNameType getManagedBeanName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanName <em>Managed Bean Name</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Managed Bean Name</em>' containment reference.
-     * @see #getManagedBeanName()
-     * @generated
-     */
-	void setManagedBeanName(ManagedBeanNameType value);
-
-    /**
-     * Returns the value of the '<em><b>Managed Bean Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Managed Bean Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Managed Bean Class</em>' containment reference.
-     * @see #setManagedBeanClass(ManagedBeanClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_ManagedBeanClass()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='managed-bean-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	ManagedBeanClassType getManagedBeanClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanClass <em>Managed Bean Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Managed Bean Class</em>' containment reference.
-     * @see #getManagedBeanClass()
-     * @generated
-     */
-	void setManagedBeanClass(ManagedBeanClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Managed Bean Scope</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Managed Bean Scope</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Managed Bean Scope</em>' containment reference.
-     * @see #setManagedBeanScope(ManagedBeanScopeType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_ManagedBeanScope()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='managed-bean-scope' namespace='##targetNamespace'"
-     * @generated
-     */
-	ManagedBeanScopeType getManagedBeanScope();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanScope <em>Managed Bean Scope</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Managed Bean Scope</em>' containment reference.
-     * @see #getManagedBeanScope()
-     * @generated
-     */
-	void setManagedBeanScope(ManagedBeanScopeType value);
-
-    /**
-     * Returns the value of the '<em><b>Managed Property</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Managed Property</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Managed Property</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_ManagedProperty()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType" containment="true"
-     *        extendedMetaData="kind='element' name='managed-property' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getManagedProperty();
-
-    /**
-     * Returns the value of the '<em><b>Map Entries</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Map Entries</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Map Entries</em>' containment reference.
-     * @see #setMapEntries(MapEntriesType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_MapEntries()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='map-entries' namespace='##targetNamespace'"
-     * @generated
-     */
-	MapEntriesType getMapEntries();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getMapEntries <em>Map Entries</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Map Entries</em>' containment reference.
-     * @see #getMapEntries()
-     * @generated
-     */
-	void setMapEntries(MapEntriesType value);
-
-    /**
-     * Returns the value of the '<em><b>List Entries</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>List Entries</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>List Entries</em>' containment reference.
-     * @see #setListEntries(ListEntriesType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_ListEntries()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='list-entries' namespace='##targetNamespace'"
-     * @generated
-     */
-	ListEntriesType getListEntries();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getListEntries <em>List Entries</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>List Entries</em>' containment reference.
-     * @see #getListEntries()
-     * @generated
-     */
-	void setListEntries(ListEntriesType value);
-
-    /**
-     * Returns the value of the '<em><b>Managed Bean Extension</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Managed Bean Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Managed Bean Extension</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_ManagedBeanExtension()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType" containment="true"
-     *        extendedMetaData="kind='element' name='managed-bean-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList getManagedBeanExtension();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ManagedBeanType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedPropertyType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedPropertyType.java
deleted file mode 100644
index 5889de0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedPropertyType.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Managed Property Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyName <em>Property Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyClass <em>Property Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getMapEntries <em>Map Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getListEntries <em>List Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType()
- * @model extendedMetaData="name='managed-property_._type' kind='elementOnly'"
- * @generated
- */
-public interface ManagedPropertyType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Description</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_Description()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-     *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDescription();
-
-    /**
-     * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Display Name</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_DisplayName()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-     *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDisplayName();
-
-    /**
-     * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Icon</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_Icon()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-     *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getIcon();
-
-    /**
-     * Returns the value of the '<em><b>Property Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property Name</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Property Name</em>' containment reference.
-     * @see #setPropertyName(PropertyNameType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_PropertyName()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='property-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	PropertyNameType getPropertyName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyName <em>Property Name</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Property Name</em>' containment reference.
-     * @see #getPropertyName()
-     * @generated
-     */
-	void setPropertyName(PropertyNameType value);
-
-    /**
-     * Returns the value of the '<em><b>Property Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Property Class</em>' containment reference.
-     * @see #setPropertyClass(PropertyClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_PropertyClass()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='property-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	PropertyClassType getPropertyClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyClass <em>Property Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Property Class</em>' containment reference.
-     * @see #getPropertyClass()
-     * @generated
-     */
-	void setPropertyClass(PropertyClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Map Entries</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Map Entries</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Map Entries</em>' containment reference.
-     * @see #setMapEntries(MapEntriesType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_MapEntries()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='map-entries' namespace='##targetNamespace'"
-     * @generated
-     */
-	MapEntriesType getMapEntries();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getMapEntries <em>Map Entries</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Map Entries</em>' containment reference.
-     * @see #getMapEntries()
-     * @generated
-     */
-	void setMapEntries(MapEntriesType value);
-
-    /**
-     * Returns the value of the '<em><b>Null Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Null Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Null Value</em>' containment reference.
-     * @see #setNullValue(NullValueType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_NullValue()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='null-value' namespace='##targetNamespace'"
-     * @generated
-     */
-	NullValueType getNullValue();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getNullValue <em>Null Value</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Null Value</em>' containment reference.
-     * @see #getNullValue()
-     * @generated
-     */
-	void setNullValue(NullValueType value);
-
-    /**
-     * Returns the value of the '<em><b>Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Value</em>' containment reference.
-     * @see #setValue(ValueType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_Value()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='value' namespace='##targetNamespace'"
-     * @generated
-     */
-	ValueType getValue();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getValue <em>Value</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Value</em>' containment reference.
-     * @see #getValue()
-     * @generated
-     */
-	void setValue(ValueType value);
-
-    /**
-     * Returns the value of the '<em><b>List Entries</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>List Entries</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>List Entries</em>' containment reference.
-     * @see #setListEntries(ListEntriesType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_ListEntries()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='list-entries' namespace='##targetNamespace'"
-     * @generated
-     */
-	ListEntriesType getListEntries();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getListEntries <em>List Entries</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>List Entries</em>' containment reference.
-     * @see #getListEntries()
-     * @generated
-     */
-	void setListEntries(ListEntriesType value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ManagedPropertyType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MapEntriesType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MapEntriesType.java
deleted file mode 100644
index 6b22f52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MapEntriesType.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Map Entries Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getKeyClass <em>Key Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getValueClass <em>Value Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getMapEntry <em>Map Entry</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntriesType()
- * @model extendedMetaData="name='map-entries_._type' kind='elementOnly'"
- * @generated
- */
-public interface MapEntriesType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Key Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Key Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Key Class</em>' containment reference.
-     * @see #setKeyClass(KeyClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntriesType_KeyClass()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='key-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	KeyClassType getKeyClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getKeyClass <em>Key Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Key Class</em>' containment reference.
-     * @see #getKeyClass()
-     * @generated
-     */
-	void setKeyClass(KeyClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Value Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Value Class</em>' containment reference.
-     * @see #setValueClass(ValueClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntriesType_ValueClass()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='value-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	ValueClassType getValueClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getValueClass <em>Value Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Value Class</em>' containment reference.
-     * @see #getValueClass()
-     * @generated
-     */
-	void setValueClass(ValueClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Map Entry</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Map Entry</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Map Entry</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntriesType_MapEntry()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.MapEntryType" containment="true"
-     *        extendedMetaData="kind='element' name='map-entry' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getMapEntry();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntriesType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // MapEntriesType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MapEntryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MapEntryType.java
deleted file mode 100644
index d3fa8bf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MapEntryType.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Map Entry Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getKey <em>Key</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntryType()
- * @model extendedMetaData="name='map-entry_._type' kind='empty'"
- * @generated
- */
-public interface MapEntryType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Key</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Key</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Key</em>' containment reference.
-     * @see #setKey(KeyType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntryType_Key()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='key' namespace='##targetNamespace'"
-     * @generated
-     */
-	KeyType getKey();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getKey <em>Key</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Key</em>' containment reference.
-     * @see #getKey()
-     * @generated
-     */
-	void setKey(KeyType value);
-
-    /**
-     * Returns the value of the '<em><b>Null Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Null Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Null Value</em>' containment reference.
-     * @see #setNullValue(NullValueType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntryType_NullValue()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='null-value' namespace='##targetNamespace'"
-     * @generated
-     */
-	NullValueType getNullValue();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getNullValue <em>Null Value</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Null Value</em>' containment reference.
-     * @see #getNullValue()
-     * @generated
-     */
-	void setNullValue(NullValueType value);
-
-    /**
-     * Returns the value of the '<em><b>Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Value</em>' containment reference.
-     * @see #setValue(ValueType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntryType_Value()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='value' namespace='##targetNamespace'"
-     * @generated
-     */
-	ValueType getValue();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getValue <em>Value</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Value</em>' containment reference.
-     * @see #getValue()
-     * @generated
-     */
-	void setValue(ValueType value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntryType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // MapEntryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MessageBundleType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MessageBundleType.java
deleted file mode 100644
index ae1048e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MessageBundleType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Message Bundle Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMessageBundleType()
- * @model extendedMetaData="name='message-bundle_._type' kind='simple'"
- * @generated
- */
-public interface MessageBundleType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMessageBundleType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMessageBundleType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // MessageBundleType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationCaseType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationCaseType.java
deleted file mode 100644
index 9dba0d0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationCaseType.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Navigation Case Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromAction <em>From Action</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromOutcome <em>From Outcome</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getToViewId <em>To View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getRedirect <em>Redirect</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType()
- * @model extendedMetaData="name='navigation-case_._type' kind='elementOnly'"
- * @generated
- */
-public interface NavigationCaseType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Description</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_Description()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-     *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDescription();
-
-    /**
-     * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Display Name</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_DisplayName()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-     *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDisplayName();
-
-    /**
-     * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Icon</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_Icon()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-     *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getIcon();
-
-    /**
-     * Returns the value of the '<em><b>From Action</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>From Action</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>From Action</em>' containment reference.
-     * @see #setFromAction(FromActionType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_FromAction()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='from-action' namespace='##targetNamespace'"
-     * @generated
-     */
-	FromActionType getFromAction();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromAction <em>From Action</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>From Action</em>' containment reference.
-     * @see #getFromAction()
-     * @generated
-     */
-	void setFromAction(FromActionType value);
-
-    /**
-     * Returns the value of the '<em><b>From Outcome</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>From Outcome</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>From Outcome</em>' containment reference.
-     * @see #setFromOutcome(FromOutcomeType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_FromOutcome()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='from-outcome' namespace='##targetNamespace'"
-     * @generated
-     */
-	FromOutcomeType getFromOutcome();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromOutcome <em>From Outcome</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>From Outcome</em>' containment reference.
-     * @see #getFromOutcome()
-     * @generated
-     */
-	void setFromOutcome(FromOutcomeType value);
-
-    /**
-     * Returns the value of the '<em><b>To View Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>To View Id</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>To View Id</em>' containment reference.
-     * @see #setToViewId(ToViewIdType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_ToViewId()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='to-view-id' namespace='##targetNamespace'"
-     * @generated
-     */
-	ToViewIdType getToViewId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getToViewId <em>To View Id</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>To View Id</em>' containment reference.
-     * @see #getToViewId()
-     * @generated
-     */
-	void setToViewId(ToViewIdType value);
-
-    /**
-     * Returns the value of the '<em><b>Redirect</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Redirect</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Redirect</em>' containment reference.
-     * @see #setRedirect(RedirectType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_Redirect()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='redirect' namespace='##targetNamespace'"
-     * @generated
-     */
-	RedirectType getRedirect();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getRedirect <em>Redirect</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Redirect</em>' containment reference.
-     * @see #getRedirect()
-     * @generated
-     */
-	void setRedirect(RedirectType value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // NavigationCaseType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationHandlerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationHandlerType.java
deleted file mode 100644
index 228d5bf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationHandlerType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Navigation Handler Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationHandlerType()
- * @model extendedMetaData="name='navigation-handler_._type' kind='simple'"
- * @generated
- */
-public interface NavigationHandlerType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationHandlerType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationHandlerType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // NavigationHandlerType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationRuleExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationRuleExtensionType.java
deleted file mode 100644
index 02b84da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationRuleExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Navigation Rule Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleExtensionType()
- * @model extendedMetaData="name='navigation-rule-extension_._type'"
- * @generated
- */
-public interface NavigationRuleExtensionType extends ExtensionType {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-} // NavigationRuleExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationRuleType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationRuleType.java
deleted file mode 100644
index d9e5654..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationRuleType.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Navigation Rule Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getFromViewId <em>From View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getNavigationCase <em>Navigation Case</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getNavigationRuleExtension <em>Navigation Rule Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType()
- * @model extendedMetaData="name='navigation-rule_._type' kind='elementOnly'"
- * @generated
- */
-public interface NavigationRuleType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Description</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType_Description()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-     *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDescription();
-
-    /**
-     * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Display Name</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType_DisplayName()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-     *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDisplayName();
-
-    /**
-     * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Icon</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType_Icon()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-     *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getIcon();
-
-    /**
-     * Returns the value of the '<em><b>From View Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>From View Id</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>From View Id</em>' containment reference.
-     * @see #setFromViewId(FromViewIdType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType_FromViewId()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='from-view-id' namespace='##targetNamespace'"
-     * @generated
-     */
-	FromViewIdType getFromViewId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getFromViewId <em>From View Id</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>From View Id</em>' containment reference.
-     * @see #getFromViewId()
-     * @generated
-     */
-	void setFromViewId(FromViewIdType value);
-
-    /**
-     * Returns the value of the '<em><b>Navigation Case</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Navigation Case</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Navigation Case</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType_NavigationCase()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType" containment="true"
-     *        extendedMetaData="kind='element' name='navigation-case' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getNavigationCase();
-
-    /**
-     * Returns the value of the '<em><b>Navigation Rule Extension</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Navigation Rule Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Navigation Rule Extension</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType_NavigationRuleExtension()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType" containment="true"
-     *        extendedMetaData="kind='element' name='navigation-rule-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList getNavigationRuleExtension();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // NavigationRuleType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NullValueType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NullValueType.java
deleted file mode 100644
index 1641bda..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NullValueType.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Null Value Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNullValueType()
- * @model extendedMetaData="name='null-value_._type' kind='empty'"
- * @generated
- */
-public interface NullValueType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNullValueType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // NullValueType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PhaseListenerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PhaseListenerType.java
deleted file mode 100644
index de99f00..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PhaseListenerType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Phase Listener Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPhaseListenerType()
- * @model extendedMetaData="name='phase-listener_._type' kind='simple'"
- * @generated
- */
-public interface PhaseListenerType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPhaseListenerType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPhaseListenerType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // PhaseListenerType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyClassType.java
deleted file mode 100644
index e739b88..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Property Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyClassType()
- * @model extendedMetaData="name='property-class_._type' kind='simple'"
- * @generated
- */
-public interface PropertyClassType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyClassType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyClassType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // PropertyClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyExtensionType.java
deleted file mode 100644
index 59a429c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Property Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyExtensionType()
- * @model extendedMetaData="name='property-extension_._type'"
- * @generated
- */
-public interface PropertyExtensionType extends ExtensionType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-} // PropertyExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyNameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyNameType.java
deleted file mode 100644
index 69fff56..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyNameType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Property Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyNameType()
- * @model extendedMetaData="name='property-name_._type' kind='simple'"
- * @generated
- */
-public interface PropertyNameType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyNameType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyNameType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // PropertyNameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyResolverType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyResolverType.java
deleted file mode 100644
index 4547566..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyResolverType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Property Resolver Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyResolverType()
- * @model extendedMetaData="name='property-resolver_._type' kind='simple'"
- * @generated
- */
-public interface PropertyResolverType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyResolverType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyResolverType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // PropertyResolverType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyType.java
deleted file mode 100644
index 297588e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyType.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Property Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyName <em>Property Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyClass <em>Property Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDefaultValue <em>Default Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getSuggestedValue <em>Suggested Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyExtension <em>Property Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType()
- * @model extendedMetaData="name='property_._type' kind='elementOnly'"
- * @generated
- */
-public interface PropertyType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Description</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_Description()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-     *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDescription();
-
-    /**
-     * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Display Name</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_DisplayName()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-     *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDisplayName();
-
-    /**
-     * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Icon</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_Icon()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-     *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getIcon();
-
-    /**
-     * Returns the value of the '<em><b>Property Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property Name</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Property Name</em>' containment reference.
-     * @see #setPropertyName(PropertyNameType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_PropertyName()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='property-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	PropertyNameType getPropertyName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyName <em>Property Name</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Property Name</em>' containment reference.
-     * @see #getPropertyName()
-     * @generated
-     */
-	void setPropertyName(PropertyNameType value);
-
-    /**
-     * Returns the value of the '<em><b>Property Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Property Class</em>' containment reference.
-     * @see #setPropertyClass(PropertyClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_PropertyClass()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='property-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	PropertyClassType getPropertyClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyClass <em>Property Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Property Class</em>' containment reference.
-     * @see #getPropertyClass()
-     * @generated
-     */
-	void setPropertyClass(PropertyClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Default Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Default Value</em>' containment reference.
-     * @see #setDefaultValue(DefaultValueType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_DefaultValue()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='default-value' namespace='##targetNamespace'"
-     * @generated
-     */
-	DefaultValueType getDefaultValue();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDefaultValue <em>Default Value</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Default Value</em>' containment reference.
-     * @see #getDefaultValue()
-     * @generated
-     */
-	void setDefaultValue(DefaultValueType value);
-
-    /**
-     * Returns the value of the '<em><b>Suggested Value</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Suggested Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Suggested Value</em>' containment reference.
-     * @see #setSuggestedValue(SuggestedValueType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_SuggestedValue()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='suggested-value' namespace='##targetNamespace'"
-     * @generated
-     */
-	SuggestedValueType getSuggestedValue();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getSuggestedValue <em>Suggested Value</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Suggested Value</em>' containment reference.
-     * @see #getSuggestedValue()
-     * @generated
-     */
-	void setSuggestedValue(SuggestedValueType value);
-
-    /**
-     * Returns the value of the '<em><b>Property Extension</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property Extension</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Property Extension</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_PropertyExtension()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType" containment="true"
-     *        extendedMetaData="kind='element' name='property-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getPropertyExtension();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // PropertyType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RedirectType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RedirectType.java
deleted file mode 100644
index 248986b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RedirectType.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Redirect Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRedirectType()
- * @model extendedMetaData="name='redirect_._type' kind='empty'"
- * @generated
- */
-public interface RedirectType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRedirectType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // RedirectType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanClassType.java
deleted file mode 100644
index cd9f458..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Referenced Bean Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanClassType()
- * @model extendedMetaData="name='referenced-bean-class_._type' kind='simple'"
- * @generated
- */
-public interface ReferencedBeanClassType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanClassType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanClassType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ReferencedBeanClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanNameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanNameType.java
deleted file mode 100644
index c31a6e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanNameType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Referenced Bean Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanNameType()
- * @model extendedMetaData="name='referenced-bean-name_._type' kind='simple'"
- * @generated
- */
-public interface ReferencedBeanNameType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanNameType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanNameType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ReferencedBeanNameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanType.java
deleted file mode 100644
index 5754419..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanType.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Referenced Bean Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanName <em>Referenced Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanClass <em>Referenced Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanType()
- * @model extendedMetaData="name='referenced-bean_._type' kind='elementOnly'"
- * @generated
- */
-public interface ReferencedBeanType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Description</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanType_Description()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-     *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDescription();
-
-    /**
-     * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Display Name</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanType_DisplayName()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-     *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDisplayName();
-
-    /**
-     * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Icon</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanType_Icon()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-     *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getIcon();
-
-    /**
-     * Returns the value of the '<em><b>Referenced Bean Name</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Referenced Bean Name</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Referenced Bean Name</em>' containment reference.
-     * @see #setReferencedBeanName(ReferencedBeanNameType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanType_ReferencedBeanName()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='referenced-bean-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	ReferencedBeanNameType getReferencedBeanName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanName <em>Referenced Bean Name</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Referenced Bean Name</em>' containment reference.
-     * @see #getReferencedBeanName()
-     * @generated
-     */
-	void setReferencedBeanName(ReferencedBeanNameType value);
-
-    /**
-     * Returns the value of the '<em><b>Referenced Bean Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Referenced Bean Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Referenced Bean Class</em>' containment reference.
-     * @see #setReferencedBeanClass(ReferencedBeanClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanType_ReferencedBeanClass()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='referenced-bean-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	ReferencedBeanClassType getReferencedBeanClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanClass <em>Referenced Bean Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Referenced Bean Class</em>' containment reference.
-     * @see #getReferencedBeanClass()
-     * @generated
-     */
-	void setReferencedBeanClass(ReferencedBeanClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ReferencedBeanType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitClassType.java
deleted file mode 100644
index 46e5063..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Render Kit Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitClassType()
- * @model extendedMetaData="name='render-kit-class_._type' kind='simple'"
- * @generated
- */
-public interface RenderKitClassType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitClassType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitClassType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // RenderKitClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitExtensionType.java
deleted file mode 100644
index f6b42f8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Render Kit Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitExtensionType()
- * @model extendedMetaData="name='render-kit-extension_._type'"
- * @generated
- */
-public interface RenderKitExtensionType extends ExtensionType {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-} // RenderKitExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitFactoryType.java
deleted file mode 100644
index ef52546..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Render Kit Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitFactoryType()
- * @model extendedMetaData="name='render-kit-factory_._type' kind='simple'"
- * @generated
- */
-public interface RenderKitFactoryType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitFactoryType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitFactoryType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // RenderKitFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitIdType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitIdType.java
deleted file mode 100644
index 042654c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitIdType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Render Kit Id Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitIdType()
- * @model extendedMetaData="name='render-kit-id_._type' kind='simple'"
- * @generated
- */
-public interface RenderKitIdType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitIdType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitIdType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // RenderKitIdType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitType.java
deleted file mode 100644
index b6656d6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitType.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Render Kit Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitId <em>Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitClass <em>Render Kit Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderer <em>Renderer</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitExtension <em>Render Kit Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType()
- * @model extendedMetaData="name='render-kit_._type' kind='elementOnly'"
- * @generated
- */
-public interface RenderKitType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Description</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_Description()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-     *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDescription();
-
-    /**
-     * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Display Name</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_DisplayName()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-     *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDisplayName();
-
-    /**
-     * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Icon</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_Icon()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-     *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getIcon();
-
-    /**
-     * Returns the value of the '<em><b>Render Kit Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Render Kit Id</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Render Kit Id</em>' containment reference.
-     * @see #setRenderKitId(RenderKitIdType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_RenderKitId()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='render-kit-id' namespace='##targetNamespace'"
-     * @generated
-     */
-	RenderKitIdType getRenderKitId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitId <em>Render Kit Id</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Render Kit Id</em>' containment reference.
-     * @see #getRenderKitId()
-     * @generated
-     */
-	void setRenderKitId(RenderKitIdType value);
-
-    /**
-     * Returns the value of the '<em><b>Render Kit Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Render Kit Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Render Kit Class</em>' containment reference.
-     * @see #setRenderKitClass(RenderKitClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_RenderKitClass()
-     * @model containment="true"
-     *        extendedMetaData="kind='element' name='render-kit-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	RenderKitClassType getRenderKitClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitClass <em>Render Kit Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Render Kit Class</em>' containment reference.
-     * @see #getRenderKitClass()
-     * @generated
-     */
-	void setRenderKitClass(RenderKitClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Renderer</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.RendererType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Renderer</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Renderer</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_Renderer()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.RendererType" containment="true"
-     *        extendedMetaData="kind='element' name='renderer' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getRenderer();
-
-    /**
-     * Returns the value of the '<em><b>Render Kit Extension</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Render Kit Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Render Kit Extension</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_RenderKitExtension()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType" containment="true"
-     *        extendedMetaData="kind='element' name='render-kit-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList getRenderKitExtension();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // RenderKitType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererClassType.java
deleted file mode 100644
index f4948e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Renderer Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererClassType()
- * @model extendedMetaData="name='renderer-class_._type' kind='simple'"
- * @generated
- */
-public interface RendererClassType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererClassType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererClassType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // RendererClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererExtensionType.java
deleted file mode 100644
index 7cb1800..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Renderer Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererExtensionType()
- * @model extendedMetaData="name='renderer-extension_._type'"
- * @generated
- */
-public interface RendererExtensionType extends ExtensionType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-} // RendererExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererType.java
deleted file mode 100644
index 38cb43c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererType.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Renderer Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getComponentFamily <em>Component Family</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererType <em>Renderer Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererClass <em>Renderer Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getFacet <em>Facet</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererExtension <em>Renderer Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType()
- * @model extendedMetaData="name='renderer_._type' kind='elementOnly'"
- * @generated
- */
-public interface RendererType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Description</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_Description()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-     *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDescription();
-
-    /**
-     * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Display Name</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_DisplayName()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-     *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDisplayName();
-
-    /**
-     * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Icon</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_Icon()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-     *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getIcon();
-
-    /**
-     * Returns the value of the '<em><b>Component Family</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Component Family</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Component Family</em>' containment reference.
-     * @see #setComponentFamily(ComponentFamilyType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_ComponentFamily()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='component-family' namespace='##targetNamespace'"
-     * @generated
-     */
-	ComponentFamilyType getComponentFamily();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getComponentFamily <em>Component Family</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Component Family</em>' containment reference.
-     * @see #getComponentFamily()
-     * @generated
-     */
-	void setComponentFamily(ComponentFamilyType value);
-
-    /**
-     * Returns the value of the '<em><b>Renderer Type</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Renderer Type</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Renderer Type</em>' containment reference.
-     * @see #setRendererType(RendererTypeType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_RendererType()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='renderer-type' namespace='##targetNamespace'"
-     * @generated
-     */
-	RendererTypeType getRendererType();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererType <em>Renderer Type</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Renderer Type</em>' containment reference.
-     * @see #getRendererType()
-     * @generated
-     */
-	void setRendererType(RendererTypeType value);
-
-    /**
-     * Returns the value of the '<em><b>Renderer Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Renderer Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Renderer Class</em>' containment reference.
-     * @see #setRendererClass(RendererClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_RendererClass()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='renderer-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	RendererClassType getRendererClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererClass <em>Renderer Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Renderer Class</em>' containment reference.
-     * @see #getRendererClass()
-     * @generated
-     */
-	void setRendererClass(RendererClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Facet</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.FacetType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Facet</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Facet</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_Facet()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.FacetType" containment="true"
-     *        extendedMetaData="kind='element' name='facet' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getFacet();
-
-    /**
-     * Returns the value of the '<em><b>Attribute</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Attribute</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_Attribute()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.AttributeType" containment="true"
-     *        extendedMetaData="kind='element' name='attribute' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getAttribute();
-
-    /**
-     * Returns the value of the '<em><b>Renderer Extension</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Renderer Extension</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Renderer Extension</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_RendererExtension()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType" containment="true"
-     *        extendedMetaData="kind='element' name='renderer-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getRendererExtension();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // RendererType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererTypeType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererTypeType.java
deleted file mode 100644
index 94adcc5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererTypeType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Renderer Type Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererTypeType()
- * @model extendedMetaData="name='renderer-type_._type' kind='simple'"
- * @generated
- */
-public interface RendererTypeType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererTypeType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererTypeType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // RendererTypeType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ResourceBundleType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ResourceBundleType.java
deleted file mode 100644
index 749b68f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ResourceBundleType.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Resource Bundle Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getBaseName <em>Base Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getVar <em>Var</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceBundleType()
- * @model extendedMetaData="name='resourceBundle_._type' kind='elementOnly'"
- * @generated
- */
-public interface ResourceBundleType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Description</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceBundleType_Description()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-     *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList getDescription();
-
-    /**
-     * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Display Name</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceBundleType_DisplayName()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-     *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList getDisplayName();
-
-    /**
-     * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Icon</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceBundleType_Icon()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-     *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList getIcon();
-
-    /**
-     * Returns the value of the '<em><b>Base Name</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Base Name</em>' reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Base Name</em>' reference.
-     * @see #setBaseName(BaseNameType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceBundleType_BaseName()
-     * @model extendedMetaData="kind='element' name='base-name' namespace='##targetNamespace'"
-     * @generated
-     */
-    BaseNameType getBaseName();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getBaseName <em>Base Name</em>}' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Base Name</em>' reference.
-     * @see #getBaseName()
-     * @generated
-     */
-    void setBaseName(BaseNameType value);
-
-    /**
-     * Returns the value of the '<em><b>Var</b></em>' reference.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Var</em>' reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Var</em>' reference.
-     * @see #setVar(VarType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceBundleType_Var()
-     * @model extendedMetaData="kind='element' name='var' namespace='##targetNamespace'"
-     * @generated
-     */
-    VarType getVar();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getVar <em>Var</em>}' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Var</em>' reference.
-     * @see #getVar()
-     * @generated
-     */
-    void setVar(VarType value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceBundleType_Id()
-     * @model id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-    String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-    void setId(String value);
-
-} // ResourceBundleType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SmallIconType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SmallIconType.java
deleted file mode 100644
index 02537c9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SmallIconType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Small Icon Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSmallIconType()
- * @model extendedMetaData="name='small-icon_._type' kind='simple'"
- * @generated
- */
-public interface SmallIconType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSmallIconType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSmallIconType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // SmallIconType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/StateManagerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/StateManagerType.java
deleted file mode 100644
index c90f4cc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/StateManagerType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>State Manager Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getStateManagerType()
- * @model extendedMetaData="name='state-manager_._type' kind='simple'"
- * @generated
- */
-public interface StateManagerType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getStateManagerType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getStateManagerType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // StateManagerType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SuggestedValueType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SuggestedValueType.java
deleted file mode 100644
index 755c6fb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SuggestedValueType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Suggested Value Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSuggestedValueType()
- * @model extendedMetaData="name='suggested-value_._type' kind='simple'"
- * @generated
- */
-public interface SuggestedValueType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSuggestedValueType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSuggestedValueType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // SuggestedValueType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SupportedLocaleType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SupportedLocaleType.java
deleted file mode 100644
index ebeeb2a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SupportedLocaleType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Supported Locale Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSupportedLocaleType()
- * @model extendedMetaData="name='supported-locale_._type' kind='simple'"
- * @generated
- */
-public interface SupportedLocaleType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSupportedLocaleType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSupportedLocaleType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // SupportedLocaleType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ToViewIdType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ToViewIdType.java
deleted file mode 100644
index 11756a3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ToViewIdType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>To View Id Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getToViewIdType()
- * @model extendedMetaData="name='to-view-id_._type' kind='simple'"
- * @generated
- */
-public interface ToViewIdType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getToViewIdType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getToViewIdType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ToViewIdType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorClassType.java
deleted file mode 100644
index 2802e71..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Validator Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorClassType()
- * @model extendedMetaData="name='validator-class_._type' kind='simple'"
- * @generated
- */
-public interface ValidatorClassType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorClassType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorClassType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ValidatorClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorExtensionType.java
deleted file mode 100644
index 98c7646..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Validator Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorExtensionType()
- * @model extendedMetaData="name='validator-extension_._type'"
- * @generated
- */
-public interface ValidatorExtensionType extends ExtensionType {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-} // ValidatorExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorIdType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorIdType.java
deleted file mode 100644
index 12cbb9d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorIdType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Validator Id Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorIdType()
- * @model extendedMetaData="name='validator-id_._type' kind='simple'"
- * @generated
- */
-public interface ValidatorIdType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorIdType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorIdType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ValidatorIdType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorType.java
deleted file mode 100644
index 3c63322..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorType.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Validator Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorId <em>Validator Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorClass <em>Validator Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorExtension <em>Validator Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType()
- * @model extendedMetaData="name='validator_._type' kind='elementOnly'"
- * @generated
- */
-public interface ValidatorType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Description</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_Description()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-     *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDescription();
-
-    /**
-     * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Display Name</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_DisplayName()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-     *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getDisplayName();
-
-    /**
-     * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Icon</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_Icon()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-     *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getIcon();
-
-    /**
-     * Returns the value of the '<em><b>Validator Id</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Validator Id</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Validator Id</em>' containment reference.
-     * @see #setValidatorId(ValidatorIdType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_ValidatorId()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='validator-id' namespace='##targetNamespace'"
-     * @generated
-     */
-	ValidatorIdType getValidatorId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorId <em>Validator Id</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Validator Id</em>' containment reference.
-     * @see #getValidatorId()
-     * @generated
-     */
-	void setValidatorId(ValidatorIdType value);
-
-    /**
-     * Returns the value of the '<em><b>Validator Class</b></em>' containment reference.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Validator Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Validator Class</em>' containment reference.
-     * @see #setValidatorClass(ValidatorClassType)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_ValidatorClass()
-     * @model containment="true" required="true"
-     *        extendedMetaData="kind='element' name='validator-class' namespace='##targetNamespace'"
-     * @generated
-     */
-	ValidatorClassType getValidatorClass();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorClass <em>Validator Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Validator Class</em>' containment reference.
-     * @see #getValidatorClass()
-     * @generated
-     */
-	void setValidatorClass(ValidatorClassType value);
-
-    /**
-     * Returns the value of the '<em><b>Attribute</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Attribute</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_Attribute()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.AttributeType" containment="true"
-     *        extendedMetaData="kind='element' name='attribute' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getAttribute();
-
-    /**
-     * Returns the value of the '<em><b>Property</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType}.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Property</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_Property()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.PropertyType" containment="true"
-     *        extendedMetaData="kind='element' name='property' namespace='##targetNamespace'"
-     * @generated
-     */
-	EList getProperty();
-
-    /**
-     * Returns the value of the '<em><b>Validator Extension</b></em>' containment reference list.
-     * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType}.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Validator Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Validator Extension</em>' containment reference list.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_ValidatorExtension()
-     * @model type="org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType" containment="true"
-     *        extendedMetaData="kind='element' name='validator-extension' namespace='##targetNamespace'"
-     * @generated
-     */
-    EList getValidatorExtension();
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ValidatorType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValueClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValueClassType.java
deleted file mode 100644
index a972f2d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValueClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Value Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValueClassType()
- * @model extendedMetaData="name='value-class_._type' kind='simple'"
- * @generated
- */
-public interface ValueClassType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValueClassType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValueClassType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ValueClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValueType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValueType.java
deleted file mode 100644
index c8452aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValueType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Value Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValueType()
- * @model extendedMetaData="name='value_._type' kind='simple'"
- * @generated
- */
-public interface ValueType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValueType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValueType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ValueType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VarType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VarType.java
deleted file mode 100644
index 354057b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VarType.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Var Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.VarType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.VarType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVarType()
- * @model extendedMetaData="name='var_._type' kind='simple'"
- * @generated
- */
-public interface VarType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVarType_TextContent()
-     * @model extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-    String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.VarType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-    void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVarType_Id()
-     * @model id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-    String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.VarType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-    void setId(String value);
-
-} // VarType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VariableResolverType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VariableResolverType.java
deleted file mode 100644
index 2eda6f2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VariableResolverType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Variable Resolver Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVariableResolverType()
- * @model extendedMetaData="name='variable-resolver_._type' kind='simple'"
- * @generated
- */
-public interface VariableResolverType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVariableResolverType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVariableResolverType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // VariableResolverType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ViewHandlerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ViewHandlerType.java
deleted file mode 100644
index 1f127b8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ViewHandlerType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>View Handler Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getViewHandlerType()
- * @model extendedMetaData="name='view-handler_._type' kind='simple'"
- * @generated
- */
-public interface ViewHandlerType extends EObject {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Text Content</em>' attribute.
-     * @see #setTextContent(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getViewHandlerType_TextContent()
-     * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-     *        extendedMetaData="name=':0' kind='simple'"
-     * @generated
-     */
-	String getTextContent();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getTextContent <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Text Content</em>' attribute.
-     * @see #getTextContent()
-     * @generated
-     */
-	void setTextContent(String value);
-
-    /**
-     * Returns the value of the '<em><b>Id</b></em>' attribute.
-     * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-     * @return the value of the '<em>Id</em>' attribute.
-     * @see #setId(String)
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getViewHandlerType_Id()
-     * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-     *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-     * @generated
-     */
-	String getId();
-
-    /**
-     * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getId <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Id</em>' attribute.
-     * @see #getId()
-     * @generated
-     */
-	void setId(String value);
-
-} // ViewHandlerType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ActionListenerTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ActionListenerTypeImpl.java
deleted file mode 100644
index aa93c6e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ActionListenerTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Action Listener Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ActionListenerTypeImpl extends EObjectImpl implements ActionListenerType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ActionListenerTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.ACTION_LISTENER_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ACTION_LISTENER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ACTION_LISTENER_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.ACTION_LISTENER_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.ACTION_LISTENER_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.ACTION_LISTENER_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.ACTION_LISTENER_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.ACTION_LISTENER_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.ACTION_LISTENER_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.ACTION_LISTENER_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.ACTION_LISTENER_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ActionListenerTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationExtensionTypeImpl.java
deleted file mode 100644
index ae261dd..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
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ApplicationExtensionTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.APPLICATION_EXTENSION_TYPE;
-    }
-
-} //ApplicationExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationFactoryTypeImpl.java
deleted file mode 100644
index 18f0992..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationFactoryTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Application Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ApplicationFactoryTypeImpl extends EObjectImpl implements ApplicationFactoryType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ApplicationFactoryTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.APPLICATION_FACTORY_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.APPLICATION_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.APPLICATION_FACTORY_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.APPLICATION_FACTORY_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.APPLICATION_FACTORY_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.APPLICATION_FACTORY_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.APPLICATION_FACTORY_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.APPLICATION_FACTORY_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.APPLICATION_FACTORY_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.APPLICATION_FACTORY_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.APPLICATION_FACTORY_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ApplicationFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationTypeImpl.java
deleted file mode 100644
index d87310a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationTypeImpl.java
+++ /dev/null
@@ -1,628 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ELResolverType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType;
-import org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType;
-import org.eclipse.jst.jsf.facesconfig.emf.StateManagerType;
-import org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType;
-import org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Application Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getActionListener <em>Action Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getDefaultRenderKitId <em>Default Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getMessageBundle <em>Message Bundle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getNavigationHandler <em>Navigation Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getViewHandler <em>View Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getStateManager <em>State Manager</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getPropertyResolver <em>Property Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getVariableResolver <em>Variable Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getLocaleConfig <em>Locale Config</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getELResolver <em>EL Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getResourceBundle <em>Resource Bundle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getApplicationExtension <em>Application Extension</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ApplicationTypeImpl extends EObjectImpl implements ApplicationType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getActionListener() <em>Action Listener</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getActionListener()
-     * @generated
-     * @ordered
-     */
-	protected EList actionListener = null;
-
-    /**
-     * The cached value of the '{@link #getDefaultRenderKitId() <em>Default Render Kit Id</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDefaultRenderKitId()
-     * @generated
-     * @ordered
-     */
-	protected EList defaultRenderKitId = null;
-
-    /**
-     * The cached value of the '{@link #getMessageBundle() <em>Message Bundle</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getMessageBundle()
-     * @generated
-     * @ordered
-     */
-	protected EList messageBundle = null;
-
-    /**
-     * The cached value of the '{@link #getNavigationHandler() <em>Navigation Handler</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getNavigationHandler()
-     * @generated
-     * @ordered
-     */
-	protected EList navigationHandler = null;
-
-    /**
-     * The cached value of the '{@link #getViewHandler() <em>View Handler</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getViewHandler()
-     * @generated
-     * @ordered
-     */
-	protected EList viewHandler = null;
-
-    /**
-     * The cached value of the '{@link #getStateManager() <em>State Manager</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getStateManager()
-     * @generated
-     * @ordered
-     */
-	protected EList stateManager = null;
-
-    /**
-     * The cached value of the '{@link #getPropertyResolver() <em>Property Resolver</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getPropertyResolver()
-     * @generated
-     * @ordered
-     */
-	protected EList propertyResolver = null;
-
-    /**
-     * The cached value of the '{@link #getVariableResolver() <em>Variable Resolver</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getVariableResolver()
-     * @generated
-     * @ordered
-     */
-	protected EList variableResolver = null;
-
-    /**
-     * The cached value of the '{@link #getLocaleConfig() <em>Locale Config</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getLocaleConfig()
-     * @generated
-     * @ordered
-     */
-	protected EList localeConfig = null;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * The cached value of the '{@link #getELResolver() <em>EL Resolver</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getELResolver()
-     * @generated
-     * @ordered
-     */
-    protected EList eLResolver = null;
-
-    /**
-     * The cached value of the '{@link #getResourceBundle() <em>Resource Bundle</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getResourceBundle()
-     * @generated
-     * @ordered
-     */
-    protected EList resourceBundle = null;
-
-    /**
-     * The cached value of the '{@link #getApplicationExtension() <em>Application Extension</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getApplicationExtension()
-     * @generated
-     * @ordered
-     */
-    protected EList applicationExtension = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ApplicationTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.APPLICATION_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getActionListener() {
-        if (actionListener == null) {
-            actionListener = new EObjectContainmentEList(ActionListenerType.class, this, FacesConfigPackage.APPLICATION_TYPE__ACTION_LISTENER);
-        }
-        return actionListener;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDefaultRenderKitId() {
-        if (defaultRenderKitId == null) {
-            defaultRenderKitId = new EObjectContainmentEList(DefaultRenderKitIdType.class, this, FacesConfigPackage.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID);
-        }
-        return defaultRenderKitId;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getMessageBundle() {
-        if (messageBundle == null) {
-            messageBundle = new EObjectContainmentEList(MessageBundleType.class, this, FacesConfigPackage.APPLICATION_TYPE__MESSAGE_BUNDLE);
-        }
-        return messageBundle;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getNavigationHandler() {
-        if (navigationHandler == null) {
-            navigationHandler = new EObjectContainmentEList(NavigationHandlerType.class, this, FacesConfigPackage.APPLICATION_TYPE__NAVIGATION_HANDLER);
-        }
-        return navigationHandler;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getViewHandler() {
-        if (viewHandler == null) {
-            viewHandler = new EObjectContainmentEList(ViewHandlerType.class, this, FacesConfigPackage.APPLICATION_TYPE__VIEW_HANDLER);
-        }
-        return viewHandler;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getStateManager() {
-        if (stateManager == null) {
-            stateManager = new EObjectContainmentEList(StateManagerType.class, this, FacesConfigPackage.APPLICATION_TYPE__STATE_MANAGER);
-        }
-        return stateManager;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getPropertyResolver() {
-        if (propertyResolver == null) {
-            propertyResolver = new EObjectContainmentEList(PropertyResolverType.class, this, FacesConfigPackage.APPLICATION_TYPE__PROPERTY_RESOLVER);
-        }
-        return propertyResolver;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getVariableResolver() {
-        if (variableResolver == null) {
-            variableResolver = new EObjectContainmentEList(VariableResolverType.class, this, FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER);
-        }
-        return variableResolver;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getLocaleConfig() {
-        if (localeConfig == null) {
-            localeConfig = new EObjectContainmentEList(LocaleConfigType.class, this, FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG);
-        }
-        return localeConfig;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.APPLICATION_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getELResolver() {
-        if (eLResolver == null) {
-            eLResolver = new EObjectResolvingEList(ELResolverType.class, this, FacesConfigPackage.APPLICATION_TYPE__EL_RESOLVER);
-        }
-        return eLResolver;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getResourceBundle() {
-        if (resourceBundle == null) {
-            resourceBundle = new EObjectResolvingEList(ResourceBundleType.class, this, FacesConfigPackage.APPLICATION_TYPE__RESOURCE_BUNDLE);
-        }
-        return resourceBundle;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getApplicationExtension() {
-        if (applicationExtension == null) {
-            applicationExtension = new EObjectResolvingEList(ApplicationExtensionType.class, this, FacesConfigPackage.APPLICATION_TYPE__APPLICATION_EXTENSION);
-        }
-        return applicationExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.APPLICATION_TYPE__ACTION_LISTENER:
-                return ((InternalEList)getActionListener()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID:
-                return ((InternalEList)getDefaultRenderKitId()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.APPLICATION_TYPE__MESSAGE_BUNDLE:
-                return ((InternalEList)getMessageBundle()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.APPLICATION_TYPE__NAVIGATION_HANDLER:
-                return ((InternalEList)getNavigationHandler()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.APPLICATION_TYPE__VIEW_HANDLER:
-                return ((InternalEList)getViewHandler()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.APPLICATION_TYPE__STATE_MANAGER:
-                return ((InternalEList)getStateManager()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.APPLICATION_TYPE__PROPERTY_RESOLVER:
-                return ((InternalEList)getPropertyResolver()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER:
-                return ((InternalEList)getVariableResolver()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG:
-                return ((InternalEList)getLocaleConfig()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.APPLICATION_TYPE__ACTION_LISTENER:
-                return getActionListener();
-            case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID:
-                return getDefaultRenderKitId();
-            case FacesConfigPackage.APPLICATION_TYPE__MESSAGE_BUNDLE:
-                return getMessageBundle();
-            case FacesConfigPackage.APPLICATION_TYPE__NAVIGATION_HANDLER:
-                return getNavigationHandler();
-            case FacesConfigPackage.APPLICATION_TYPE__VIEW_HANDLER:
-                return getViewHandler();
-            case FacesConfigPackage.APPLICATION_TYPE__STATE_MANAGER:
-                return getStateManager();
-            case FacesConfigPackage.APPLICATION_TYPE__PROPERTY_RESOLVER:
-                return getPropertyResolver();
-            case FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER:
-                return getVariableResolver();
-            case FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG:
-                return getLocaleConfig();
-            case FacesConfigPackage.APPLICATION_TYPE__ID:
-                return getId();
-            case FacesConfigPackage.APPLICATION_TYPE__EL_RESOLVER:
-                return getELResolver();
-            case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_BUNDLE:
-                return getResourceBundle();
-            case FacesConfigPackage.APPLICATION_TYPE__APPLICATION_EXTENSION:
-                return getApplicationExtension();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.APPLICATION_TYPE__ACTION_LISTENER:
-                getActionListener().clear();
-                getActionListener().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID:
-                getDefaultRenderKitId().clear();
-                getDefaultRenderKitId().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__MESSAGE_BUNDLE:
-                getMessageBundle().clear();
-                getMessageBundle().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__NAVIGATION_HANDLER:
-                getNavigationHandler().clear();
-                getNavigationHandler().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__VIEW_HANDLER:
-                getViewHandler().clear();
-                getViewHandler().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__STATE_MANAGER:
-                getStateManager().clear();
-                getStateManager().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__PROPERTY_RESOLVER:
-                getPropertyResolver().clear();
-                getPropertyResolver().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER:
-                getVariableResolver().clear();
-                getVariableResolver().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG:
-                getLocaleConfig().clear();
-                getLocaleConfig().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__ID:
-                setId((String)newValue);
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__EL_RESOLVER:
-                getELResolver().clear();
-                getELResolver().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_BUNDLE:
-                getResourceBundle().clear();
-                getResourceBundle().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__APPLICATION_EXTENSION:
-                getApplicationExtension().clear();
-                getApplicationExtension().addAll((Collection)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.APPLICATION_TYPE__ACTION_LISTENER:
-                getActionListener().clear();
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID:
-                getDefaultRenderKitId().clear();
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__MESSAGE_BUNDLE:
-                getMessageBundle().clear();
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__NAVIGATION_HANDLER:
-                getNavigationHandler().clear();
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__VIEW_HANDLER:
-                getViewHandler().clear();
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__STATE_MANAGER:
-                getStateManager().clear();
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__PROPERTY_RESOLVER:
-                getPropertyResolver().clear();
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER:
-                getVariableResolver().clear();
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG:
-                getLocaleConfig().clear();
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__EL_RESOLVER:
-                getELResolver().clear();
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_BUNDLE:
-                getResourceBundle().clear();
-                return;
-            case FacesConfigPackage.APPLICATION_TYPE__APPLICATION_EXTENSION:
-                getApplicationExtension().clear();
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.APPLICATION_TYPE__ACTION_LISTENER:
-                return actionListener != null && !actionListener.isEmpty();
-            case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID:
-                return defaultRenderKitId != null && !defaultRenderKitId.isEmpty();
-            case FacesConfigPackage.APPLICATION_TYPE__MESSAGE_BUNDLE:
-                return messageBundle != null && !messageBundle.isEmpty();
-            case FacesConfigPackage.APPLICATION_TYPE__NAVIGATION_HANDLER:
-                return navigationHandler != null && !navigationHandler.isEmpty();
-            case FacesConfigPackage.APPLICATION_TYPE__VIEW_HANDLER:
-                return viewHandler != null && !viewHandler.isEmpty();
-            case FacesConfigPackage.APPLICATION_TYPE__STATE_MANAGER:
-                return stateManager != null && !stateManager.isEmpty();
-            case FacesConfigPackage.APPLICATION_TYPE__PROPERTY_RESOLVER:
-                return propertyResolver != null && !propertyResolver.isEmpty();
-            case FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER:
-                return variableResolver != null && !variableResolver.isEmpty();
-            case FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG:
-                return localeConfig != null && !localeConfig.isEmpty();
-            case FacesConfigPackage.APPLICATION_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-            case FacesConfigPackage.APPLICATION_TYPE__EL_RESOLVER:
-                return eLResolver != null && !eLResolver.isEmpty();
-            case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_BUNDLE:
-                return resourceBundle != null && !resourceBundle.isEmpty();
-            case FacesConfigPackage.APPLICATION_TYPE__APPLICATION_EXTENSION:
-                return applicationExtension != null && !applicationExtension.isEmpty();
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ApplicationTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeClassTypeImpl.java
deleted file mode 100644
index 570b872..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Attribute Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class AttributeClassTypeImpl extends EObjectImpl implements AttributeClassType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected AttributeClassTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.ATTRIBUTE_CLASS_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //AttributeClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeExtensionTypeImpl.java
deleted file mode 100644
index f5fa4fc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeExtensionTypeImpl.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.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
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected AttributeExtensionTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.ATTRIBUTE_EXTENSION_TYPE;
-    }
-
-} //AttributeExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeNameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeNameTypeImpl.java
deleted file mode 100644
index 3a8f646..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeNameTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Attribute Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class AttributeNameTypeImpl extends EObjectImpl implements AttributeNameType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected AttributeNameTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.ATTRIBUTE_NAME_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_NAME_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //AttributeNameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeTypeImpl.java
deleted file mode 100644
index 5aa9a82..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeTypeImpl.java
+++ /dev/null
@@ -1,605 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Attribute Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getAttributeName <em>Attribute Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getAttributeClass <em>Attribute Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getDefaultValue <em>Default Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getSuggestedValue <em>Suggested Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getAttributeExtension <em>Attribute Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class AttributeTypeImpl extends EObjectImpl implements AttributeType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDescription()
-     * @generated
-     * @ordered
-     */
-	protected EList description = null;
-
-    /**
-     * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDisplayName()
-     * @generated
-     * @ordered
-     */
-	protected EList displayName = null;
-
-    /**
-     * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getIcon()
-     * @generated
-     * @ordered
-     */
-	protected EList icon = null;
-
-    /**
-     * The cached value of the '{@link #getAttributeName() <em>Attribute Name</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getAttributeName()
-     * @generated
-     * @ordered
-     */
-	protected AttributeNameType attributeName = null;
-
-    /**
-     * The cached value of the '{@link #getAttributeClass() <em>Attribute Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getAttributeClass()
-     * @generated
-     * @ordered
-     */
-	protected AttributeClassType attributeClass = null;
-
-    /**
-     * The cached value of the '{@link #getDefaultValue() <em>Default Value</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDefaultValue()
-     * @generated
-     * @ordered
-     */
-	protected DefaultValueType defaultValue = null;
-
-    /**
-     * The cached value of the '{@link #getSuggestedValue() <em>Suggested Value</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getSuggestedValue()
-     * @generated
-     * @ordered
-     */
-	protected SuggestedValueType suggestedValue = null;
-
-    /**
-     * The cached value of the '{@link #getAttributeExtension() <em>Attribute Extension</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getAttributeExtension()
-     * @generated
-     * @ordered
-     */
-	protected EList attributeExtension = null;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected AttributeTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.ATTRIBUTE_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDescription() {
-        if (description == null) {
-            description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.ATTRIBUTE_TYPE__DESCRIPTION);
-        }
-        return description;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDisplayName() {
-        if (displayName == null) {
-            displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.ATTRIBUTE_TYPE__DISPLAY_NAME);
-        }
-        return displayName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getIcon() {
-        if (icon == null) {
-            icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.ATTRIBUTE_TYPE__ICON);
-        }
-        return icon;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public AttributeNameType getAttributeName() {
-        return attributeName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetSuggestedValue(SuggestedValueType newSuggestedValue, NotificationChain msgs) {
-        SuggestedValueType oldSuggestedValue = suggestedValue;
-        suggestedValue = newSuggestedValue;
-        if (eNotificationRequired()) {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE, oldSuggestedValue, newSuggestedValue);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setSuggestedValue(SuggestedValueType newSuggestedValue) {
-        if (newSuggestedValue != suggestedValue) {
-            NotificationChain msgs = null;
-            if (suggestedValue != null)
-                msgs = ((InternalEObject)suggestedValue).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE, null, msgs);
-            if (newSuggestedValue != null)
-                msgs = ((InternalEObject)newSuggestedValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE, null, msgs);
-            msgs = basicSetSuggestedValue(newSuggestedValue, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE, newSuggestedValue, newSuggestedValue));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getAttributeExtension() {
-        if (attributeExtension == null) {
-            attributeExtension = new EObjectContainmentEList(AttributeExtensionType.class, this, FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION);
-        }
-        return attributeExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.ATTRIBUTE_TYPE__DESCRIPTION:
-                return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.ATTRIBUTE_TYPE__DISPLAY_NAME:
-                return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ICON:
-                return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME:
-                return basicSetAttributeName(null, msgs);
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS:
-                return basicSetAttributeClass(null, msgs);
-            case FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE:
-                return basicSetDefaultValue(null, msgs);
-            case FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE:
-                return basicSetSuggestedValue(null, msgs);
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION:
-                return ((InternalEList)getAttributeExtension()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.ATTRIBUTE_TYPE__DESCRIPTION:
-                return getDescription();
-            case FacesConfigPackage.ATTRIBUTE_TYPE__DISPLAY_NAME:
-                return getDisplayName();
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ICON:
-                return getIcon();
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME:
-                return getAttributeName();
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS:
-                return getAttributeClass();
-            case FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE:
-                return getDefaultValue();
-            case FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE:
-                return getSuggestedValue();
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION:
-                return getAttributeExtension();
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.ATTRIBUTE_TYPE__DESCRIPTION:
-                getDescription().clear();
-                getDescription().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.ATTRIBUTE_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                getDisplayName().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ICON:
-                getIcon().clear();
-                getIcon().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME:
-                setAttributeName((AttributeNameType)newValue);
-                return;
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS:
-                setAttributeClass((AttributeClassType)newValue);
-                return;
-            case FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE:
-                setDefaultValue((DefaultValueType)newValue);
-                return;
-            case FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE:
-                setSuggestedValue((SuggestedValueType)newValue);
-                return;
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION:
-                getAttributeExtension().clear();
-                getAttributeExtension().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.ATTRIBUTE_TYPE__DESCRIPTION:
-                getDescription().clear();
-                return;
-            case FacesConfigPackage.ATTRIBUTE_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                return;
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ICON:
-                getIcon().clear();
-                return;
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME:
-                setAttributeName((AttributeNameType)null);
-                return;
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS:
-                setAttributeClass((AttributeClassType)null);
-                return;
-            case FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE:
-                setDefaultValue((DefaultValueType)null);
-                return;
-            case FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE:
-                setSuggestedValue((SuggestedValueType)null);
-                return;
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION:
-                getAttributeExtension().clear();
-                return;
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.ATTRIBUTE_TYPE__DESCRIPTION:
-                return description != null && !description.isEmpty();
-            case FacesConfigPackage.ATTRIBUTE_TYPE__DISPLAY_NAME:
-                return displayName != null && !displayName.isEmpty();
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ICON:
-                return icon != null && !icon.isEmpty();
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME:
-                return attributeName != null;
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS:
-                return attributeClass != null;
-            case FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE:
-                return defaultValue != null;
-            case FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE:
-                return suggestedValue != null;
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION:
-                return attributeExtension != null && !attributeExtension.isEmpty();
-            case FacesConfigPackage.ATTRIBUTE_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //AttributeTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BaseNameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BaseNameTypeImpl.java
deleted file mode 100644
index 81306e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BaseNameTypeImpl.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.jsf.facesconfig.emf.BaseNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Base Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BaseNameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BaseNameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class BaseNameTypeImpl extends EObjectImpl implements BaseNameType {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-    protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-    protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected BaseNameTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.BASE_NAME_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.BASE_NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.BASE_NAME_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.BASE_NAME_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.BASE_NAME_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.BASE_NAME_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.BASE_NAME_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.BASE_NAME_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.BASE_NAME_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.BASE_NAME_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.BASE_NAME_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //BaseNameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentClassTypeImpl.java
deleted file mode 100644
index ae23566..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Component Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ComponentClassTypeImpl extends EObjectImpl implements ComponentClassType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ComponentClassTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.COMPONENT_CLASS_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_CLASS_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.COMPONENT_CLASS_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.COMPONENT_CLASS_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.COMPONENT_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.COMPONENT_CLASS_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.COMPONENT_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.COMPONENT_CLASS_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.COMPONENT_CLASS_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.COMPONENT_CLASS_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ComponentClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentExtensionTypeImpl.java
deleted file mode 100644
index 7fffb18..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentExtensionTypeImpl.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.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
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ComponentExtensionTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.COMPONENT_EXTENSION_TYPE;
-    }
-
-} //ComponentExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentFamilyTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentFamilyTypeImpl.java
deleted file mode 100644
index 6f318f0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentFamilyTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Component Family Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ComponentFamilyTypeImpl extends EObjectImpl implements ComponentFamilyType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ComponentFamilyTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.COMPONENT_FAMILY_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_FAMILY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_FAMILY_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.COMPONENT_FAMILY_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.COMPONENT_FAMILY_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.COMPONENT_FAMILY_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.COMPONENT_FAMILY_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.COMPONENT_FAMILY_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.COMPONENT_FAMILY_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.COMPONENT_FAMILY_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.COMPONENT_FAMILY_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ComponentFamilyTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentTypeImpl.java
deleted file mode 100644
index 04fee15..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentTypeImpl.java
+++ /dev/null
@@ -1,582 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Component Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getComponentType <em>Component Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getComponentClass <em>Component Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getFacet <em>Facet</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getComponentExtension <em>Component Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ComponentTypeImpl extends EObjectImpl implements ComponentType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDescription()
-     * @generated
-     * @ordered
-     */
-	protected EList description = null;
-
-    /**
-     * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDisplayName()
-     * @generated
-     * @ordered
-     */
-	protected EList displayName = null;
-
-    /**
-     * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getIcon()
-     * @generated
-     * @ordered
-     */
-	protected EList icon = null;
-
-    /**
-     * The cached value of the '{@link #getComponentType() <em>Component Type</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getComponentType()
-     * @generated
-     * @ordered
-     */
-	protected ComponentTypeType componentType = null;
-
-    /**
-     * The cached value of the '{@link #getComponentClass() <em>Component Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getComponentClass()
-     * @generated
-     * @ordered
-     */
-	protected ComponentClassType componentClass = null;
-
-    /**
-     * The cached value of the '{@link #getFacet() <em>Facet</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getFacet()
-     * @generated
-     * @ordered
-     */
-	protected EList facet = null;
-
-    /**
-     * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getAttribute()
-     * @generated
-     * @ordered
-     */
-	protected EList attribute = null;
-
-    /**
-     * The cached value of the '{@link #getProperty() <em>Property</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getProperty()
-     * @generated
-     * @ordered
-     */
-	protected EList property = null;
-
-    /**
-     * The cached value of the '{@link #getComponentExtension() <em>Component Extension</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getComponentExtension()
-     * @generated
-     * @ordered
-     */
-	protected EList componentExtension = null;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ComponentTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.COMPONENT_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDescription() {
-        if (description == null) {
-            description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.COMPONENT_TYPE__DESCRIPTION);
-        }
-        return description;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDisplayName() {
-        if (displayName == null) {
-            displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.COMPONENT_TYPE__DISPLAY_NAME);
-        }
-        return displayName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getIcon() {
-        if (icon == null) {
-            icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.COMPONENT_TYPE__ICON);
-        }
-        return icon;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ComponentTypeType getComponentType() {
-        return componentType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetComponentClass(ComponentClassType newComponentClass, NotificationChain msgs) {
-        ComponentClassType oldComponentClass = componentClass;
-        componentClass = newComponentClass;
-        if (eNotificationRequired()) {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS, oldComponentClass, newComponentClass);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setComponentClass(ComponentClassType newComponentClass) {
-        if (newComponentClass != componentClass) {
-            NotificationChain msgs = null;
-            if (componentClass != null)
-                msgs = ((InternalEObject)componentClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS, null, msgs);
-            if (newComponentClass != null)
-                msgs = ((InternalEObject)newComponentClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS, null, msgs);
-            msgs = basicSetComponentClass(newComponentClass, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS, newComponentClass, newComponentClass));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getFacet() {
-        if (facet == null) {
-            facet = new EObjectContainmentEList(FacetType.class, this, FacesConfigPackage.COMPONENT_TYPE__FACET);
-        }
-        return facet;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getAttribute() {
-        if (attribute == null) {
-            attribute = new EObjectContainmentEList(AttributeType.class, this, FacesConfigPackage.COMPONENT_TYPE__ATTRIBUTE);
-        }
-        return attribute;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getProperty() {
-        if (property == null) {
-            property = new EObjectContainmentEList(PropertyType.class, this, FacesConfigPackage.COMPONENT_TYPE__PROPERTY);
-        }
-        return property;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getComponentExtension() {
-        if (componentExtension == null) {
-            componentExtension = new EObjectContainmentEList(ComponentExtensionType.class, this, FacesConfigPackage.COMPONENT_TYPE__COMPONENT_EXTENSION);
-        }
-        return componentExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.COMPONENT_TYPE__DESCRIPTION:
-                return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.COMPONENT_TYPE__DISPLAY_NAME:
-                return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.COMPONENT_TYPE__ICON:
-                return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE:
-                return basicSetComponentType(null, msgs);
-            case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS:
-                return basicSetComponentClass(null, msgs);
-            case FacesConfigPackage.COMPONENT_TYPE__FACET:
-                return ((InternalEList)getFacet()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.COMPONENT_TYPE__ATTRIBUTE:
-                return ((InternalEList)getAttribute()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.COMPONENT_TYPE__PROPERTY:
-                return ((InternalEList)getProperty()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_EXTENSION:
-                return ((InternalEList)getComponentExtension()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.COMPONENT_TYPE__DESCRIPTION:
-                return getDescription();
-            case FacesConfigPackage.COMPONENT_TYPE__DISPLAY_NAME:
-                return getDisplayName();
-            case FacesConfigPackage.COMPONENT_TYPE__ICON:
-                return getIcon();
-            case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE:
-                return getComponentType();
-            case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS:
-                return getComponentClass();
-            case FacesConfigPackage.COMPONENT_TYPE__FACET:
-                return getFacet();
-            case FacesConfigPackage.COMPONENT_TYPE__ATTRIBUTE:
-                return getAttribute();
-            case FacesConfigPackage.COMPONENT_TYPE__PROPERTY:
-                return getProperty();
-            case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_EXTENSION:
-                return getComponentExtension();
-            case FacesConfigPackage.COMPONENT_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.COMPONENT_TYPE__DESCRIPTION:
-                getDescription().clear();
-                getDescription().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.COMPONENT_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                getDisplayName().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.COMPONENT_TYPE__ICON:
-                getIcon().clear();
-                getIcon().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE:
-                setComponentType((ComponentTypeType)newValue);
-                return;
-            case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS:
-                setComponentClass((ComponentClassType)newValue);
-                return;
-            case FacesConfigPackage.COMPONENT_TYPE__FACET:
-                getFacet().clear();
-                getFacet().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.COMPONENT_TYPE__ATTRIBUTE:
-                getAttribute().clear();
-                getAttribute().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.COMPONENT_TYPE__PROPERTY:
-                getProperty().clear();
-                getProperty().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_EXTENSION:
-                getComponentExtension().clear();
-                getComponentExtension().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.COMPONENT_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.COMPONENT_TYPE__DESCRIPTION:
-                getDescription().clear();
-                return;
-            case FacesConfigPackage.COMPONENT_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                return;
-            case FacesConfigPackage.COMPONENT_TYPE__ICON:
-                getIcon().clear();
-                return;
-            case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE:
-                setComponentType((ComponentTypeType)null);
-                return;
-            case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS:
-                setComponentClass((ComponentClassType)null);
-                return;
-            case FacesConfigPackage.COMPONENT_TYPE__FACET:
-                getFacet().clear();
-                return;
-            case FacesConfigPackage.COMPONENT_TYPE__ATTRIBUTE:
-                getAttribute().clear();
-                return;
-            case FacesConfigPackage.COMPONENT_TYPE__PROPERTY:
-                getProperty().clear();
-                return;
-            case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_EXTENSION:
-                getComponentExtension().clear();
-                return;
-            case FacesConfigPackage.COMPONENT_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.COMPONENT_TYPE__DESCRIPTION:
-                return description != null && !description.isEmpty();
-            case FacesConfigPackage.COMPONENT_TYPE__DISPLAY_NAME:
-                return displayName != null && !displayName.isEmpty();
-            case FacesConfigPackage.COMPONENT_TYPE__ICON:
-                return icon != null && !icon.isEmpty();
-            case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE:
-                return componentType != null;
-            case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS:
-                return componentClass != null;
-            case FacesConfigPackage.COMPONENT_TYPE__FACET:
-                return facet != null && !facet.isEmpty();
-            case FacesConfigPackage.COMPONENT_TYPE__ATTRIBUTE:
-                return attribute != null && !attribute.isEmpty();
-            case FacesConfigPackage.COMPONENT_TYPE__PROPERTY:
-                return property != null && !property.isEmpty();
-            case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_EXTENSION:
-                return componentExtension != null && !componentExtension.isEmpty();
-            case FacesConfigPackage.COMPONENT_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ComponentTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentTypeTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentTypeTypeImpl.java
deleted file mode 100644
index c9851d3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentTypeTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Component Type Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ComponentTypeTypeImpl extends EObjectImpl implements ComponentTypeType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ComponentTypeTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.COMPONENT_TYPE_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_TYPE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_TYPE_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.COMPONENT_TYPE_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.COMPONENT_TYPE_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.COMPONENT_TYPE_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.COMPONENT_TYPE_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.COMPONENT_TYPE_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.COMPONENT_TYPE_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.COMPONENT_TYPE_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.COMPONENT_TYPE_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ComponentTypeTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterClassTypeImpl.java
deleted file mode 100644
index 3b6bbce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Converter Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ConverterClassTypeImpl extends EObjectImpl implements ConverterClassType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ConverterClassTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.CONVERTER_CLASS_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_CLASS_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.CONVERTER_CLASS_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.CONVERTER_CLASS_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.CONVERTER_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.CONVERTER_CLASS_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.CONVERTER_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.CONVERTER_CLASS_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.CONVERTER_CLASS_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.CONVERTER_CLASS_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ConverterClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterExtensionTypeImpl.java
deleted file mode 100644
index 7195480..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
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ConverterExtensionTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.CONVERTER_EXTENSION_TYPE;
-    }
-
-} //ConverterExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterForClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterForClassTypeImpl.java
deleted file mode 100644
index 446f429..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterForClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Converter For Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ConverterForClassTypeImpl extends EObjectImpl implements ConverterForClassType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ConverterForClassTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.CONVERTER_FOR_CLASS_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ConverterForClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterIdTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterIdTypeImpl.java
deleted file mode 100644
index 68dc44f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterIdTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Converter Id Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ConverterIdTypeImpl extends EObjectImpl implements ConverterIdType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ConverterIdTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.CONVERTER_ID_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_ID_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_ID_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.CONVERTER_ID_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.CONVERTER_ID_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.CONVERTER_ID_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.CONVERTER_ID_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.CONVERTER_ID_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.CONVERTER_ID_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.CONVERTER_ID_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.CONVERTER_ID_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ConverterIdTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterTypeImpl.java
deleted file mode 100644
index d01e887..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterTypeImpl.java
+++ /dev/null
@@ -1,612 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Converter Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getConverterId <em>Converter Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getConverterForClass <em>Converter For Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getConverterClass <em>Converter Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getConverterExtension <em>Converter Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ConverterTypeImpl extends EObjectImpl implements ConverterType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDescription()
-     * @generated
-     * @ordered
-     */
-	protected EList description = null;
-
-    /**
-     * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDisplayName()
-     * @generated
-     * @ordered
-     */
-	protected EList displayName = null;
-
-    /**
-     * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getIcon()
-     * @generated
-     * @ordered
-     */
-	protected EList icon = null;
-
-    /**
-     * The cached value of the '{@link #getConverterId() <em>Converter Id</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getConverterId()
-     * @generated
-     * @ordered
-     */
-	protected ConverterIdType converterId = null;
-
-    /**
-     * The cached value of the '{@link #getConverterForClass() <em>Converter For Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getConverterForClass()
-     * @generated
-     * @ordered
-     */
-	protected ConverterForClassType converterForClass = null;
-
-    /**
-     * The cached value of the '{@link #getConverterClass() <em>Converter Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getConverterClass()
-     * @generated
-     * @ordered
-     */
-	protected ConverterClassType converterClass = null;
-
-    /**
-     * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getAttribute()
-     * @generated
-     * @ordered
-     */
-	protected EList attribute = null;
-
-    /**
-     * The cached value of the '{@link #getProperty() <em>Property</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getProperty()
-     * @generated
-     * @ordered
-     */
-	protected EList property = null;
-
-    /**
-     * The cached value of the '{@link #getConverterExtension() <em>Converter Extension</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getConverterExtension()
-     * @generated
-     * @ordered
-     */
-    protected EList converterExtension = null;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ConverterTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.CONVERTER_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDescription() {
-        if (description == null) {
-            description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.CONVERTER_TYPE__DESCRIPTION);
-        }
-        return description;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDisplayName() {
-        if (displayName == null) {
-            displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.CONVERTER_TYPE__DISPLAY_NAME);
-        }
-        return displayName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getIcon() {
-        if (icon == null) {
-            icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.CONVERTER_TYPE__ICON);
-        }
-        return icon;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ConverterIdType getConverterId() {
-        return converterId;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetConverterForClass(ConverterForClassType newConverterForClass, NotificationChain msgs) {
-        ConverterForClassType oldConverterForClass = converterForClass;
-        converterForClass = newConverterForClass;
-        if (eNotificationRequired()) {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS, oldConverterForClass, newConverterForClass);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setConverterForClass(ConverterForClassType newConverterForClass) {
-        if (newConverterForClass != converterForClass) {
-            NotificationChain msgs = null;
-            if (converterForClass != null)
-                msgs = ((InternalEObject)converterForClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS, null, msgs);
-            if (newConverterForClass != null)
-                msgs = ((InternalEObject)newConverterForClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS, null, msgs);
-            msgs = basicSetConverterForClass(newConverterForClass, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS, newConverterForClass, newConverterForClass));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ConverterClassType getConverterClass() {
-        return converterClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetConverterClass(ConverterClassType newConverterClass, NotificationChain msgs) {
-        ConverterClassType oldConverterClass = converterClass;
-        converterClass = newConverterClass;
-        if (eNotificationRequired()) {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS, oldConverterClass, newConverterClass);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setConverterClass(ConverterClassType newConverterClass) {
-        if (newConverterClass != converterClass) {
-            NotificationChain msgs = null;
-            if (converterClass != null)
-                msgs = ((InternalEObject)converterClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS, null, msgs);
-            if (newConverterClass != null)
-                msgs = ((InternalEObject)newConverterClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS, null, msgs);
-            msgs = basicSetConverterClass(newConverterClass, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS, newConverterClass, newConverterClass));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getAttribute() {
-        if (attribute == null) {
-            attribute = new EObjectContainmentEList(AttributeType.class, this, FacesConfigPackage.CONVERTER_TYPE__ATTRIBUTE);
-        }
-        return attribute;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getProperty() {
-        if (property == null) {
-            property = new EObjectContainmentEList(PropertyType.class, this, FacesConfigPackage.CONVERTER_TYPE__PROPERTY);
-        }
-        return property;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getConverterExtension() {
-        if (converterExtension == null) {
-            converterExtension = new EObjectContainmentEList(ConverterExtensionType.class, this, FacesConfigPackage.CONVERTER_TYPE__CONVERTER_EXTENSION);
-        }
-        return converterExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.CONVERTER_TYPE__DESCRIPTION:
-                return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.CONVERTER_TYPE__DISPLAY_NAME:
-                return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.CONVERTER_TYPE__ICON:
-                return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID:
-                return basicSetConverterId(null, msgs);
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS:
-                return basicSetConverterForClass(null, msgs);
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS:
-                return basicSetConverterClass(null, msgs);
-            case FacesConfigPackage.CONVERTER_TYPE__ATTRIBUTE:
-                return ((InternalEList)getAttribute()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.CONVERTER_TYPE__PROPERTY:
-                return ((InternalEList)getProperty()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_EXTENSION:
-                return ((InternalEList)getConverterExtension()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.CONVERTER_TYPE__DESCRIPTION:
-                return getDescription();
-            case FacesConfigPackage.CONVERTER_TYPE__DISPLAY_NAME:
-                return getDisplayName();
-            case FacesConfigPackage.CONVERTER_TYPE__ICON:
-                return getIcon();
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID:
-                return getConverterId();
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS:
-                return getConverterForClass();
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS:
-                return getConverterClass();
-            case FacesConfigPackage.CONVERTER_TYPE__ATTRIBUTE:
-                return getAttribute();
-            case FacesConfigPackage.CONVERTER_TYPE__PROPERTY:
-                return getProperty();
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_EXTENSION:
-                return getConverterExtension();
-            case FacesConfigPackage.CONVERTER_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.CONVERTER_TYPE__DESCRIPTION:
-                getDescription().clear();
-                getDescription().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.CONVERTER_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                getDisplayName().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.CONVERTER_TYPE__ICON:
-                getIcon().clear();
-                getIcon().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID:
-                setConverterId((ConverterIdType)newValue);
-                return;
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS:
-                setConverterForClass((ConverterForClassType)newValue);
-                return;
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS:
-                setConverterClass((ConverterClassType)newValue);
-                return;
-            case FacesConfigPackage.CONVERTER_TYPE__ATTRIBUTE:
-                getAttribute().clear();
-                getAttribute().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.CONVERTER_TYPE__PROPERTY:
-                getProperty().clear();
-                getProperty().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_EXTENSION:
-                getConverterExtension().clear();
-                getConverterExtension().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.CONVERTER_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.CONVERTER_TYPE__DESCRIPTION:
-                getDescription().clear();
-                return;
-            case FacesConfigPackage.CONVERTER_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                return;
-            case FacesConfigPackage.CONVERTER_TYPE__ICON:
-                getIcon().clear();
-                return;
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID:
-                setConverterId((ConverterIdType)null);
-                return;
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS:
-                setConverterForClass((ConverterForClassType)null);
-                return;
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS:
-                setConverterClass((ConverterClassType)null);
-                return;
-            case FacesConfigPackage.CONVERTER_TYPE__ATTRIBUTE:
-                getAttribute().clear();
-                return;
-            case FacesConfigPackage.CONVERTER_TYPE__PROPERTY:
-                getProperty().clear();
-                return;
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_EXTENSION:
-                getConverterExtension().clear();
-                return;
-            case FacesConfigPackage.CONVERTER_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.CONVERTER_TYPE__DESCRIPTION:
-                return description != null && !description.isEmpty();
-            case FacesConfigPackage.CONVERTER_TYPE__DISPLAY_NAME:
-                return displayName != null && !displayName.isEmpty();
-            case FacesConfigPackage.CONVERTER_TYPE__ICON:
-                return icon != null && !icon.isEmpty();
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID:
-                return converterId != null;
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS:
-                return converterForClass != null;
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS:
-                return converterClass != null;
-            case FacesConfigPackage.CONVERTER_TYPE__ATTRIBUTE:
-                return attribute != null && !attribute.isEmpty();
-            case FacesConfigPackage.CONVERTER_TYPE__PROPERTY:
-                return property != null && !property.isEmpty();
-            case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_EXTENSION:
-                return converterExtension != null && !converterExtension.isEmpty();
-            case FacesConfigPackage.CONVERTER_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ConverterTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultLocaleTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultLocaleTypeImpl.java
deleted file mode 100644
index 97409c0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultLocaleTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Default Locale Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DefaultLocaleTypeImpl extends EObjectImpl implements DefaultLocaleType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected DefaultLocaleTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.DEFAULT_LOCALE_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DEFAULT_LOCALE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DEFAULT_LOCALE_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.DEFAULT_LOCALE_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.DEFAULT_LOCALE_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.DEFAULT_LOCALE_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.DEFAULT_LOCALE_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.DEFAULT_LOCALE_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.DEFAULT_LOCALE_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.DEFAULT_LOCALE_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.DEFAULT_LOCALE_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //DefaultLocaleTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultRenderKitIdTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultRenderKitIdTypeImpl.java
deleted file mode 100644
index 3269529..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultRenderKitIdTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Default Render Kit Id Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DefaultRenderKitIdTypeImpl extends EObjectImpl implements DefaultRenderKitIdType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected DefaultRenderKitIdTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.DEFAULT_RENDER_KIT_ID_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //DefaultRenderKitIdTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultValueTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultValueTypeImpl.java
deleted file mode 100644
index 243d213..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultValueTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Default Value Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DefaultValueTypeImpl extends EObjectImpl implements DefaultValueType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected DefaultValueTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.DEFAULT_VALUE_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DEFAULT_VALUE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DEFAULT_VALUE_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.DEFAULT_VALUE_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.DEFAULT_VALUE_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.DEFAULT_VALUE_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.DEFAULT_VALUE_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.DEFAULT_VALUE_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.DEFAULT_VALUE_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.DEFAULT_VALUE_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.DEFAULT_VALUE_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //DefaultValueTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DescriptionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DescriptionTypeImpl.java
deleted file mode 100644
index 35765f7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DescriptionTypeImpl.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Description Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl#getLang <em>Lang</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DescriptionTypeImpl extends EObjectImpl implements DescriptionType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getLang() <em>Lang</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getLang()
-     * @generated
-     * @ordered
-     */
-	protected static final String LANG_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getLang() <em>Lang</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getLang()
-     * @generated
-     * @ordered
-     */
-	protected String lang = LANG_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected DescriptionTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.DESCRIPTION_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DESCRIPTION_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getLang() {
-        return lang;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setLang(String newLang) {
-        String oldLang = lang;
-        lang = newLang;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DESCRIPTION_TYPE__LANG, oldLang, lang));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DESCRIPTION_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.DESCRIPTION_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.DESCRIPTION_TYPE__LANG:
-                return getLang();
-            case FacesConfigPackage.DESCRIPTION_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.DESCRIPTION_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.DESCRIPTION_TYPE__LANG:
-                setLang((String)newValue);
-                return;
-            case FacesConfigPackage.DESCRIPTION_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.DESCRIPTION_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.DESCRIPTION_TYPE__LANG:
-                setLang(LANG_EDEFAULT);
-                return;
-            case FacesConfigPackage.DESCRIPTION_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.DESCRIPTION_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.DESCRIPTION_TYPE__LANG:
-                return LANG_EDEFAULT == null ? lang != null : !LANG_EDEFAULT.equals(lang);
-            case FacesConfigPackage.DESCRIPTION_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", lang: ");
-        result.append(lang);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //DescriptionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DisplayNameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DisplayNameTypeImpl.java
deleted file mode 100644
index 5dfd498..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DisplayNameTypeImpl.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Display Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl#getLang <em>Lang</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DisplayNameTypeImpl extends EObjectImpl implements DisplayNameType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getLang() <em>Lang</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getLang()
-     * @generated
-     * @ordered
-     */
-	protected static final String LANG_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getLang() <em>Lang</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getLang()
-     * @generated
-     * @ordered
-     */
-	protected String lang = LANG_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected DisplayNameTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.DISPLAY_NAME_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DISPLAY_NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getLang() {
-        return lang;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setLang(String newLang) {
-        String oldLang = lang;
-        lang = newLang;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DISPLAY_NAME_TYPE__LANG, oldLang, lang));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DISPLAY_NAME_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.DISPLAY_NAME_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.DISPLAY_NAME_TYPE__LANG:
-                return getLang();
-            case FacesConfigPackage.DISPLAY_NAME_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.DISPLAY_NAME_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.DISPLAY_NAME_TYPE__LANG:
-                setLang((String)newValue);
-                return;
-            case FacesConfigPackage.DISPLAY_NAME_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.DISPLAY_NAME_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.DISPLAY_NAME_TYPE__LANG:
-                setLang(LANG_EDEFAULT);
-                return;
-            case FacesConfigPackage.DISPLAY_NAME_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.DISPLAY_NAME_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.DISPLAY_NAME_TYPE__LANG:
-                return LANG_EDEFAULT == null ? lang != null : !LANG_EDEFAULT.equals(lang);
-            case FacesConfigPackage.DISPLAY_NAME_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", lang: ");
-        result.append(lang);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //DisplayNameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DocumentRootImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DocumentRootImpl.java
deleted file mode 100644
index ce48b26..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DocumentRootImpl.java
+++ /dev/null
@@ -1,3526 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EMap;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.impl.EStringToStringMapEntryImpl;
-import org.eclipse.emf.ecore.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.EcoreEMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetType;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FromActionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType;
-import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyType;
-import org.eclipse.jst.jsf.facesconfig.emf.LargeIconType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleType;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntryType;
-import org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.RedirectType;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.SmallIconType;
-import org.eclipse.jst.jsf.facesconfig.emf.StateManagerType;
-import org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType;
-import org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType;
-import org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Document Root</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getMixed <em>Mixed</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getXMLNSPrefixMap <em>XMLNS Prefix Map</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getXSISchemaLocation <em>XSI Schema Location</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getActionListener <em>Action Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getApplication <em>Application</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getApplicationFactory <em>Application Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getAttributeClass <em>Attribute Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getAttributeExtension <em>Attribute Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getAttributeName <em>Attribute Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getComponent <em>Component</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getComponentClass <em>Component Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getComponentExtension <em>Component Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getComponentFamily <em>Component Family</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getComponentType <em>Component Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getConverter <em>Converter</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getConverterClass <em>Converter Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getConverterForClass <em>Converter For Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getConverterId <em>Converter Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getDefaultLocale <em>Default Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getDefaultRenderKitId <em>Default Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getDefaultValue <em>Default Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFacesConfig <em>Faces Config</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFacesContextFactory <em>Faces Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFacet <em>Facet</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFacetExtension <em>Facet Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFacetName <em>Facet Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFactory <em>Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFromAction <em>From Action</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFromOutcome <em>From Outcome</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFromViewId <em>From View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getKey <em>Key</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getKeyClass <em>Key Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getLargeIcon <em>Large Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getLifecycle <em>Lifecycle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getLifecycleFactory <em>Lifecycle Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getListEntries <em>List Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getLocaleConfig <em>Locale Config</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getManagedBean <em>Managed Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getManagedBeanClass <em>Managed Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getManagedBeanName <em>Managed Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getManagedBeanScope <em>Managed Bean Scope</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getManagedProperty <em>Managed Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getMapEntries <em>Map Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getMapEntry <em>Map Entry</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getMessageBundle <em>Message Bundle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getNavigationCase <em>Navigation Case</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getNavigationHandler <em>Navigation Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getNavigationRule <em>Navigation Rule</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getPhaseListener <em>Phase Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getPropertyClass <em>Property Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getPropertyExtension <em>Property Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getPropertyName <em>Property Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getPropertyResolver <em>Property Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRedirect <em>Redirect</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getReferencedBean <em>Referenced Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getReferencedBeanClass <em>Referenced Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getReferencedBeanName <em>Referenced Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRenderer <em>Renderer</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRendererClass <em>Renderer Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRendererExtension <em>Renderer Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRendererType <em>Renderer Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRenderKit <em>Render Kit</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRenderKitClass <em>Render Kit Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRenderKitFactory <em>Render Kit Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRenderKitId <em>Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getSmallIcon <em>Small Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getStateManager <em>State Manager</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getSuggestedValue <em>Suggested Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getSupportedLocale <em>Supported Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getToViewId <em>To View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getValidator <em>Validator</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getValidatorClass <em>Validator Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getValidatorId <em>Validator Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getValueClass <em>Value Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getVariableResolver <em>Variable Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getViewHandler <em>View Handler</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DocumentRootImpl extends EObjectImpl implements DocumentRoot {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getMixed() <em>Mixed</em>}' attribute list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getMixed()
-     * @generated
-     * @ordered
-     */
-	protected FeatureMap mixed = null;
-
-    /**
-     * The cached value of the '{@link #getXMLNSPrefixMap() <em>XMLNS Prefix Map</em>}' map.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getXMLNSPrefixMap()
-     * @generated
-     * @ordered
-     */
-	protected EMap xMLNSPrefixMap = null;
-
-    /**
-     * The cached value of the '{@link #getXSISchemaLocation() <em>XSI Schema Location</em>}' map.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getXSISchemaLocation()
-     * @generated
-     * @ordered
-     */
-	protected EMap xSISchemaLocation = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected DocumentRootImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.DOCUMENT_ROOT;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public FeatureMap getMixed() {
-        if (mixed == null) {
-            mixed = new BasicFeatureMap(this, FacesConfigPackage.DOCUMENT_ROOT__MIXED);
-        }
-        return mixed;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EMap getXMLNSPrefixMap() {
-        if (xMLNSPrefixMap == null) {
-            xMLNSPrefixMap = new EcoreEMap(EcorePackage.Literals.ESTRING_TO_STRING_MAP_ENTRY, EStringToStringMapEntryImpl.class, this, FacesConfigPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP);
-        }
-        return xMLNSPrefixMap;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EMap getXSISchemaLocation() {
-        if (xSISchemaLocation == null) {
-            xSISchemaLocation = new EcoreEMap(EcorePackage.Literals.ESTRING_TO_STRING_MAP_ENTRY, EStringToStringMapEntryImpl.class, this, FacesConfigPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION);
-        }
-        return xSISchemaLocation;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ActionListenerType getActionListener() {
-        return (ActionListenerType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__ACTION_LISTENER, true);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetAttributeName(AttributeNameType newAttributeName, NotificationChain msgs) {
-        return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_NAME, newAttributeName, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setAttributeName(AttributeNameType newAttributeName) {
-        ((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_NAME, newAttributeName);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ComponentType getComponent() {
-        return (ComponentType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT, true);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetDefaultRenderKitId(DefaultRenderKitIdType newDefaultRenderKitId, NotificationChain msgs) {
-        return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID, newDefaultRenderKitId, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setDefaultRenderKitId(DefaultRenderKitIdType newDefaultRenderKitId) {
-        ((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID, newDefaultRenderKitId);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public DefaultValueType getDefaultValue() {
-        return (DefaultValueType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_VALUE, true);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetDisplayName(DisplayNameType newDisplayName, NotificationChain msgs) {
-        return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__DISPLAY_NAME, newDisplayName, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setDisplayName(DisplayNameType newDisplayName) {
-        ((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__DISPLAY_NAME, newDisplayName);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public FacesConfigType getFacesConfig() {
-        return (FacesConfigType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONFIG, true);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetFacesConfig(FacesConfigType newFacesConfig, NotificationChain msgs) {
-        return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONFIG, newFacesConfig, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setFacesConfig(FacesConfigType newFacesConfig) {
-        ((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONFIG, newFacesConfig);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public FacesContextFactoryType getFacesContextFactory() {
-        return (FacesContextFactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY, true);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetIcon(IconType newIcon, NotificationChain msgs) {
-        return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__ICON, newIcon, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setIcon(IconType newIcon) {
-        ((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__ICON, newIcon);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public KeyType getKey() {
-        return (KeyType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__KEY, true);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetMessageBundle(MessageBundleType newMessageBundle, NotificationChain msgs) {
-        return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__MESSAGE_BUNDLE, newMessageBundle, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setMessageBundle(MessageBundleType newMessageBundle) {
-        ((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__MESSAGE_BUNDLE, newMessageBundle);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NavigationCaseType getNavigationCase() {
-        return (NavigationCaseType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_CASE, true);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetNullValue(NullValueType newNullValue, NotificationChain msgs) {
-        return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__NULL_VALUE, newNullValue, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setNullValue(NullValueType newNullValue) {
-        ((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__NULL_VALUE, newNullValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public PhaseListenerType getPhaseListener() {
-        return (PhaseListenerType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__PHASE_LISTENER, true);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetRedirect(RedirectType newRedirect, NotificationChain msgs) {
-        return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT, newRedirect, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setRedirect(RedirectType newRedirect) {
-        ((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT, newRedirect);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ReferencedBeanType getReferencedBean() {
-        return (ReferencedBeanType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN, true);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetRenderKitId(RenderKitIdType newRenderKitId, NotificationChain msgs) {
-        return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_ID, newRenderKitId, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setRenderKitId(RenderKitIdType newRenderKitId) {
-        ((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_ID, newRenderKitId);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public SmallIconType getSmallIcon() {
-        return (SmallIconType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__SMALL_ICON, true);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetSmallIcon(SmallIconType newSmallIcon, NotificationChain msgs) {
-        return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__SMALL_ICON, newSmallIcon, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setSmallIcon(SmallIconType newSmallIcon) {
-        ((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__SMALL_ICON, newSmallIcon);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public StateManagerType getStateManager() {
-        return (StateManagerType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__STATE_MANAGER, true);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetSupportedLocale(SupportedLocaleType newSupportedLocale, NotificationChain msgs) {
-        return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__SUPPORTED_LOCALE, newSupportedLocale, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setSupportedLocale(SupportedLocaleType newSupportedLocale) {
-        ((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__SUPPORTED_LOCALE, newSupportedLocale);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ToViewIdType getToViewId() {
-        return (ToViewIdType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__TO_VIEW_ID, true);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetValidator(ValidatorType newValidator, NotificationChain msgs) {
-        return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR, newValidator, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setValidator(ValidatorType newValidator) {
-        ((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR, newValidator);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ValidatorClassType getValidatorClass() {
-        return (ValidatorClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR_CLASS, true);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetVariableResolver(VariableResolverType newVariableResolver, NotificationChain msgs) {
-        return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__VARIABLE_RESOLVER, newVariableResolver, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setVariableResolver(VariableResolverType newVariableResolver) {
-        ((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__VARIABLE_RESOLVER, newVariableResolver);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ViewHandlerType getViewHandler() {
-        return (ViewHandlerType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_HANDLER, true);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetViewHandler(ViewHandlerType newViewHandler, NotificationChain msgs) {
-        return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_HANDLER, newViewHandler, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setViewHandler(ViewHandlerType newViewHandler) {
-        ((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_HANDLER, newViewHandler);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.DOCUMENT_ROOT__MIXED:
-                return ((InternalEList)getMixed()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-                return ((InternalEList)getXMLNSPrefixMap()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-                return ((InternalEList)getXSISchemaLocation()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__ACTION_LISTENER:
-                return basicSetActionListener(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION:
-                return basicSetApplication(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION_FACTORY:
-                return basicSetApplicationFactory(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE:
-                return basicSetAttribute(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_CLASS:
-                return basicSetAttributeClass(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION:
-                return basicSetAttributeExtension(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_NAME:
-                return basicSetAttributeName(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT:
-                return basicSetComponent(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_CLASS:
-                return basicSetComponentClass(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_EXTENSION:
-                return basicSetComponentExtension(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_FAMILY:
-                return basicSetComponentFamily(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_TYPE:
-                return basicSetComponentType(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER:
-                return basicSetConverter(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_CLASS:
-                return basicSetConverterClass(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_FOR_CLASS:
-                return basicSetConverterForClass(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_ID:
-                return basicSetConverterId(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_LOCALE:
-                return basicSetDefaultLocale(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID:
-                return basicSetDefaultRenderKitId(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALUE:
-                return basicSetDefaultValue(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__DESCRIPTION:
-                return basicSetDescription(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__DISPLAY_NAME:
-                return basicSetDisplayName(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONFIG:
-                return basicSetFacesConfig(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY:
-                return basicSetFacesContextFactory(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__FACET:
-                return basicSetFacet(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__FACET_EXTENSION:
-                return basicSetFacetExtension(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__FACET_NAME:
-                return basicSetFacetName(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__FACTORY:
-                return basicSetFactory(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__FROM_ACTION:
-                return basicSetFromAction(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__FROM_OUTCOME:
-                return basicSetFromOutcome(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__FROM_VIEW_ID:
-                return basicSetFromViewId(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__ICON:
-                return basicSetIcon(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__KEY:
-                return basicSetKey(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__KEY_CLASS:
-                return basicSetKeyClass(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__LARGE_ICON:
-                return basicSetLargeIcon(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE:
-                return basicSetLifecycle(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE_FACTORY:
-                return basicSetLifecycleFactory(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__LIST_ENTRIES:
-                return basicSetListEntries(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__LOCALE_CONFIG:
-                return basicSetLocaleConfig(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN:
-                return basicSetManagedBean(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_CLASS:
-                return basicSetManagedBeanClass(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_NAME:
-                return basicSetManagedBeanName(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE:
-                return basicSetManagedBeanScope(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_PROPERTY:
-                return basicSetManagedProperty(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRIES:
-                return basicSetMapEntries(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRY:
-                return basicSetMapEntry(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__MESSAGE_BUNDLE:
-                return basicSetMessageBundle(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_CASE:
-                return basicSetNavigationCase(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_HANDLER:
-                return basicSetNavigationHandler(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_RULE:
-                return basicSetNavigationRule(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__NULL_VALUE:
-                return basicSetNullValue(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__PHASE_LISTENER:
-                return basicSetPhaseListener(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY:
-                return basicSetProperty(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_CLASS:
-                return basicSetPropertyClass(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_EXTENSION:
-                return basicSetPropertyExtension(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_NAME:
-                return basicSetPropertyName(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_RESOLVER:
-                return basicSetPropertyResolver(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT:
-                return basicSetRedirect(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN:
-                return basicSetReferencedBean(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS:
-                return basicSetReferencedBeanClass(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_NAME:
-                return basicSetReferencedBeanName(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDERER:
-                return basicSetRenderer(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_CLASS:
-                return basicSetRendererClass(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_EXTENSION:
-                return basicSetRendererExtension(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_TYPE:
-                return basicSetRendererType(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT:
-                return basicSetRenderKit(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_CLASS:
-                return basicSetRenderKitClass(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_FACTORY:
-                return basicSetRenderKitFactory(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_ID:
-                return basicSetRenderKitId(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__SMALL_ICON:
-                return basicSetSmallIcon(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__STATE_MANAGER:
-                return basicSetStateManager(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__SUGGESTED_VALUE:
-                return basicSetSuggestedValue(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__SUPPORTED_LOCALE:
-                return basicSetSupportedLocale(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__TO_VIEW_ID:
-                return basicSetToViewId(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR:
-                return basicSetValidator(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_CLASS:
-                return basicSetValidatorClass(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_ID:
-                return basicSetValidatorId(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__VALUE:
-                return basicSetValue(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__VALUE_CLASS:
-                return basicSetValueClass(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__VARIABLE_RESOLVER:
-                return basicSetVariableResolver(null, msgs);
-            case FacesConfigPackage.DOCUMENT_ROOT__VIEW_HANDLER:
-                return basicSetViewHandler(null, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.DOCUMENT_ROOT__MIXED:
-                if (coreType) return getMixed();
-                return ((FeatureMap.Internal)getMixed()).getWrapper();
-            case FacesConfigPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-                if (coreType) return getXMLNSPrefixMap();
-                return getXMLNSPrefixMap().map();
-            case FacesConfigPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-                if (coreType) return getXSISchemaLocation();
-                return getXSISchemaLocation().map();
-            case FacesConfigPackage.DOCUMENT_ROOT__ACTION_LISTENER:
-                return getActionListener();
-            case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION:
-                return getApplication();
-            case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION_FACTORY:
-                return getApplicationFactory();
-            case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE:
-                return getAttribute();
-            case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_CLASS:
-                return getAttributeClass();
-            case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION:
-                return getAttributeExtension();
-            case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_NAME:
-                return getAttributeName();
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT:
-                return getComponent();
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_CLASS:
-                return getComponentClass();
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_EXTENSION:
-                return getComponentExtension();
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_FAMILY:
-                return getComponentFamily();
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_TYPE:
-                return getComponentType();
-            case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER:
-                return getConverter();
-            case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_CLASS:
-                return getConverterClass();
-            case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_FOR_CLASS:
-                return getConverterForClass();
-            case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_ID:
-                return getConverterId();
-            case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_LOCALE:
-                return getDefaultLocale();
-            case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID:
-                return getDefaultRenderKitId();
-            case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALUE:
-                return getDefaultValue();
-            case FacesConfigPackage.DOCUMENT_ROOT__DESCRIPTION:
-                return getDescription();
-            case FacesConfigPackage.DOCUMENT_ROOT__DISPLAY_NAME:
-                return getDisplayName();
-            case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONFIG:
-                return getFacesConfig();
-            case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY:
-                return getFacesContextFactory();
-            case FacesConfigPackage.DOCUMENT_ROOT__FACET:
-                return getFacet();
-            case FacesConfigPackage.DOCUMENT_ROOT__FACET_EXTENSION:
-                return getFacetExtension();
-            case FacesConfigPackage.DOCUMENT_ROOT__FACET_NAME:
-                return getFacetName();
-            case FacesConfigPackage.DOCUMENT_ROOT__FACTORY:
-                return getFactory();
-            case FacesConfigPackage.DOCUMENT_ROOT__FROM_ACTION:
-                return getFromAction();
-            case FacesConfigPackage.DOCUMENT_ROOT__FROM_OUTCOME:
-                return getFromOutcome();
-            case FacesConfigPackage.DOCUMENT_ROOT__FROM_VIEW_ID:
-                return getFromViewId();
-            case FacesConfigPackage.DOCUMENT_ROOT__ICON:
-                return getIcon();
-            case FacesConfigPackage.DOCUMENT_ROOT__KEY:
-                return getKey();
-            case FacesConfigPackage.DOCUMENT_ROOT__KEY_CLASS:
-                return getKeyClass();
-            case FacesConfigPackage.DOCUMENT_ROOT__LARGE_ICON:
-                return getLargeIcon();
-            case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE:
-                return getLifecycle();
-            case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE_FACTORY:
-                return getLifecycleFactory();
-            case FacesConfigPackage.DOCUMENT_ROOT__LIST_ENTRIES:
-                return getListEntries();
-            case FacesConfigPackage.DOCUMENT_ROOT__LOCALE_CONFIG:
-                return getLocaleConfig();
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN:
-                return getManagedBean();
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_CLASS:
-                return getManagedBeanClass();
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_NAME:
-                return getManagedBeanName();
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE:
-                return getManagedBeanScope();
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_PROPERTY:
-                return getManagedProperty();
-            case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRIES:
-                return getMapEntries();
-            case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRY:
-                return getMapEntry();
-            case FacesConfigPackage.DOCUMENT_ROOT__MESSAGE_BUNDLE:
-                return getMessageBundle();
-            case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_CASE:
-                return getNavigationCase();
-            case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_HANDLER:
-                return getNavigationHandler();
-            case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_RULE:
-                return getNavigationRule();
-            case FacesConfigPackage.DOCUMENT_ROOT__NULL_VALUE:
-                return getNullValue();
-            case FacesConfigPackage.DOCUMENT_ROOT__PHASE_LISTENER:
-                return getPhaseListener();
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY:
-                return getProperty();
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_CLASS:
-                return getPropertyClass();
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_EXTENSION:
-                return getPropertyExtension();
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_NAME:
-                return getPropertyName();
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_RESOLVER:
-                return getPropertyResolver();
-            case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT:
-                return getRedirect();
-            case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN:
-                return getReferencedBean();
-            case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS:
-                return getReferencedBeanClass();
-            case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_NAME:
-                return getReferencedBeanName();
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDERER:
-                return getRenderer();
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_CLASS:
-                return getRendererClass();
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_EXTENSION:
-                return getRendererExtension();
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_TYPE:
-                return getRendererType();
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT:
-                return getRenderKit();
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_CLASS:
-                return getRenderKitClass();
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_FACTORY:
-                return getRenderKitFactory();
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_ID:
-                return getRenderKitId();
-            case FacesConfigPackage.DOCUMENT_ROOT__SMALL_ICON:
-                return getSmallIcon();
-            case FacesConfigPackage.DOCUMENT_ROOT__STATE_MANAGER:
-                return getStateManager();
-            case FacesConfigPackage.DOCUMENT_ROOT__SUGGESTED_VALUE:
-                return getSuggestedValue();
-            case FacesConfigPackage.DOCUMENT_ROOT__SUPPORTED_LOCALE:
-                return getSupportedLocale();
-            case FacesConfigPackage.DOCUMENT_ROOT__TO_VIEW_ID:
-                return getToViewId();
-            case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR:
-                return getValidator();
-            case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_CLASS:
-                return getValidatorClass();
-            case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_ID:
-                return getValidatorId();
-            case FacesConfigPackage.DOCUMENT_ROOT__VALUE:
-                return getValue();
-            case FacesConfigPackage.DOCUMENT_ROOT__VALUE_CLASS:
-                return getValueClass();
-            case FacesConfigPackage.DOCUMENT_ROOT__VARIABLE_RESOLVER:
-                return getVariableResolver();
-            case FacesConfigPackage.DOCUMENT_ROOT__VIEW_HANDLER:
-                return getViewHandler();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.DOCUMENT_ROOT__MIXED:
-                ((FeatureMap.Internal)getMixed()).set(newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-                ((EStructuralFeature.Setting)getXMLNSPrefixMap()).set(newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-                ((EStructuralFeature.Setting)getXSISchemaLocation()).set(newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__ACTION_LISTENER:
-                setActionListener((ActionListenerType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION:
-                setApplication((ApplicationType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION_FACTORY:
-                setApplicationFactory((ApplicationFactoryType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE:
-                setAttribute((AttributeType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_CLASS:
-                setAttributeClass((AttributeClassType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION:
-                setAttributeExtension((AttributeExtensionType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_NAME:
-                setAttributeName((AttributeNameType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT:
-                setComponent((ComponentType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_CLASS:
-                setComponentClass((ComponentClassType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_EXTENSION:
-                setComponentExtension((ComponentExtensionType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_FAMILY:
-                setComponentFamily((ComponentFamilyType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_TYPE:
-                setComponentType((ComponentTypeType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER:
-                setConverter((ConverterType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_CLASS:
-                setConverterClass((ConverterClassType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_FOR_CLASS:
-                setConverterForClass((ConverterForClassType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_ID:
-                setConverterId((ConverterIdType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_LOCALE:
-                setDefaultLocale((DefaultLocaleType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID:
-                setDefaultRenderKitId((DefaultRenderKitIdType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALUE:
-                setDefaultValue((DefaultValueType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__DESCRIPTION:
-                setDescription((DescriptionType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__DISPLAY_NAME:
-                setDisplayName((DisplayNameType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONFIG:
-                setFacesConfig((FacesConfigType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY:
-                setFacesContextFactory((FacesContextFactoryType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__FACET:
-                setFacet((FacetType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__FACET_EXTENSION:
-                setFacetExtension((FacetExtensionType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__FACET_NAME:
-                setFacetName((FacetNameType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__FACTORY:
-                setFactory((FactoryType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__FROM_ACTION:
-                setFromAction((FromActionType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__FROM_OUTCOME:
-                setFromOutcome((FromOutcomeType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__FROM_VIEW_ID:
-                setFromViewId((FromViewIdType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__ICON:
-                setIcon((IconType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__KEY:
-                setKey((KeyType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__KEY_CLASS:
-                setKeyClass((KeyClassType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__LARGE_ICON:
-                setLargeIcon((LargeIconType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE:
-                setLifecycle((LifecycleType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE_FACTORY:
-                setLifecycleFactory((LifecycleFactoryType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__LIST_ENTRIES:
-                setListEntries((ListEntriesType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__LOCALE_CONFIG:
-                setLocaleConfig((LocaleConfigType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN:
-                setManagedBean((ManagedBeanType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_CLASS:
-                setManagedBeanClass((ManagedBeanClassType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_NAME:
-                setManagedBeanName((ManagedBeanNameType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE:
-                setManagedBeanScope((ManagedBeanScopeType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_PROPERTY:
-                setManagedProperty((ManagedPropertyType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRIES:
-                setMapEntries((MapEntriesType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRY:
-                setMapEntry((MapEntryType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__MESSAGE_BUNDLE:
-                setMessageBundle((MessageBundleType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_CASE:
-                setNavigationCase((NavigationCaseType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_HANDLER:
-                setNavigationHandler((NavigationHandlerType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_RULE:
-                setNavigationRule((NavigationRuleType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__NULL_VALUE:
-                setNullValue((NullValueType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__PHASE_LISTENER:
-                setPhaseListener((PhaseListenerType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY:
-                setProperty((PropertyType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_CLASS:
-                setPropertyClass((PropertyClassType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_EXTENSION:
-                setPropertyExtension((PropertyExtensionType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_NAME:
-                setPropertyName((PropertyNameType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_RESOLVER:
-                setPropertyResolver((PropertyResolverType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT:
-                setRedirect((RedirectType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN:
-                setReferencedBean((ReferencedBeanType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS:
-                setReferencedBeanClass((ReferencedBeanClassType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_NAME:
-                setReferencedBeanName((ReferencedBeanNameType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDERER:
-                setRenderer((RendererType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_CLASS:
-                setRendererClass((RendererClassType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_EXTENSION:
-                setRendererExtension((RendererExtensionType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_TYPE:
-                setRendererType((RendererTypeType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT:
-                setRenderKit((RenderKitType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_CLASS:
-                setRenderKitClass((RenderKitClassType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_FACTORY:
-                setRenderKitFactory((RenderKitFactoryType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_ID:
-                setRenderKitId((RenderKitIdType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__SMALL_ICON:
-                setSmallIcon((SmallIconType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__STATE_MANAGER:
-                setStateManager((StateManagerType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__SUGGESTED_VALUE:
-                setSuggestedValue((SuggestedValueType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__SUPPORTED_LOCALE:
-                setSupportedLocale((SupportedLocaleType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__TO_VIEW_ID:
-                setToViewId((ToViewIdType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR:
-                setValidator((ValidatorType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_CLASS:
-                setValidatorClass((ValidatorClassType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_ID:
-                setValidatorId((ValidatorIdType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__VALUE:
-                setValue((ValueType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__VALUE_CLASS:
-                setValueClass((ValueClassType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__VARIABLE_RESOLVER:
-                setVariableResolver((VariableResolverType)newValue);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__VIEW_HANDLER:
-                setViewHandler((ViewHandlerType)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.DOCUMENT_ROOT__MIXED:
-                getMixed().clear();
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-                getXMLNSPrefixMap().clear();
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-                getXSISchemaLocation().clear();
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__ACTION_LISTENER:
-                setActionListener((ActionListenerType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION:
-                setApplication((ApplicationType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION_FACTORY:
-                setApplicationFactory((ApplicationFactoryType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE:
-                setAttribute((AttributeType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_CLASS:
-                setAttributeClass((AttributeClassType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION:
-                setAttributeExtension((AttributeExtensionType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_NAME:
-                setAttributeName((AttributeNameType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT:
-                setComponent((ComponentType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_CLASS:
-                setComponentClass((ComponentClassType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_EXTENSION:
-                setComponentExtension((ComponentExtensionType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_FAMILY:
-                setComponentFamily((ComponentFamilyType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_TYPE:
-                setComponentType((ComponentTypeType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER:
-                setConverter((ConverterType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_CLASS:
-                setConverterClass((ConverterClassType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_FOR_CLASS:
-                setConverterForClass((ConverterForClassType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_ID:
-                setConverterId((ConverterIdType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_LOCALE:
-                setDefaultLocale((DefaultLocaleType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID:
-                setDefaultRenderKitId((DefaultRenderKitIdType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALUE:
-                setDefaultValue((DefaultValueType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__DESCRIPTION:
-                setDescription((DescriptionType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__DISPLAY_NAME:
-                setDisplayName((DisplayNameType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONFIG:
-                setFacesConfig((FacesConfigType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY:
-                setFacesContextFactory((FacesContextFactoryType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__FACET:
-                setFacet((FacetType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__FACET_EXTENSION:
-                setFacetExtension((FacetExtensionType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__FACET_NAME:
-                setFacetName((FacetNameType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__FACTORY:
-                setFactory((FactoryType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__FROM_ACTION:
-                setFromAction((FromActionType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__FROM_OUTCOME:
-                setFromOutcome((FromOutcomeType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__FROM_VIEW_ID:
-                setFromViewId((FromViewIdType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__ICON:
-                setIcon((IconType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__KEY:
-                setKey((KeyType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__KEY_CLASS:
-                setKeyClass((KeyClassType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__LARGE_ICON:
-                setLargeIcon((LargeIconType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE:
-                setLifecycle((LifecycleType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE_FACTORY:
-                setLifecycleFactory((LifecycleFactoryType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__LIST_ENTRIES:
-                setListEntries((ListEntriesType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__LOCALE_CONFIG:
-                setLocaleConfig((LocaleConfigType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN:
-                setManagedBean((ManagedBeanType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_CLASS:
-                setManagedBeanClass((ManagedBeanClassType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_NAME:
-                setManagedBeanName((ManagedBeanNameType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE:
-                setManagedBeanScope((ManagedBeanScopeType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_PROPERTY:
-                setManagedProperty((ManagedPropertyType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRIES:
-                setMapEntries((MapEntriesType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRY:
-                setMapEntry((MapEntryType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__MESSAGE_BUNDLE:
-                setMessageBundle((MessageBundleType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_CASE:
-                setNavigationCase((NavigationCaseType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_HANDLER:
-                setNavigationHandler((NavigationHandlerType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_RULE:
-                setNavigationRule((NavigationRuleType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__NULL_VALUE:
-                setNullValue((NullValueType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__PHASE_LISTENER:
-                setPhaseListener((PhaseListenerType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY:
-                setProperty((PropertyType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_CLASS:
-                setPropertyClass((PropertyClassType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_EXTENSION:
-                setPropertyExtension((PropertyExtensionType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_NAME:
-                setPropertyName((PropertyNameType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_RESOLVER:
-                setPropertyResolver((PropertyResolverType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT:
-                setRedirect((RedirectType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN:
-                setReferencedBean((ReferencedBeanType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS:
-                setReferencedBeanClass((ReferencedBeanClassType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_NAME:
-                setReferencedBeanName((ReferencedBeanNameType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDERER:
-                setRenderer((RendererType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_CLASS:
-                setRendererClass((RendererClassType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_EXTENSION:
-                setRendererExtension((RendererExtensionType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_TYPE:
-                setRendererType((RendererTypeType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT:
-                setRenderKit((RenderKitType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_CLASS:
-                setRenderKitClass((RenderKitClassType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_FACTORY:
-                setRenderKitFactory((RenderKitFactoryType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_ID:
-                setRenderKitId((RenderKitIdType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__SMALL_ICON:
-                setSmallIcon((SmallIconType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__STATE_MANAGER:
-                setStateManager((StateManagerType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__SUGGESTED_VALUE:
-                setSuggestedValue((SuggestedValueType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__SUPPORTED_LOCALE:
-                setSupportedLocale((SupportedLocaleType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__TO_VIEW_ID:
-                setToViewId((ToViewIdType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR:
-                setValidator((ValidatorType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_CLASS:
-                setValidatorClass((ValidatorClassType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_ID:
-                setValidatorId((ValidatorIdType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__VALUE:
-                setValue((ValueType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__VALUE_CLASS:
-                setValueClass((ValueClassType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__VARIABLE_RESOLVER:
-                setVariableResolver((VariableResolverType)null);
-                return;
-            case FacesConfigPackage.DOCUMENT_ROOT__VIEW_HANDLER:
-                setViewHandler((ViewHandlerType)null);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.DOCUMENT_ROOT__MIXED:
-                return mixed != null && !mixed.isEmpty();
-            case FacesConfigPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-                return xMLNSPrefixMap != null && !xMLNSPrefixMap.isEmpty();
-            case FacesConfigPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-                return xSISchemaLocation != null && !xSISchemaLocation.isEmpty();
-            case FacesConfigPackage.DOCUMENT_ROOT__ACTION_LISTENER:
-                return getActionListener() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION:
-                return getApplication() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION_FACTORY:
-                return getApplicationFactory() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE:
-                return getAttribute() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_CLASS:
-                return getAttributeClass() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION:
-                return getAttributeExtension() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_NAME:
-                return getAttributeName() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT:
-                return getComponent() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_CLASS:
-                return getComponentClass() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_EXTENSION:
-                return getComponentExtension() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_FAMILY:
-                return getComponentFamily() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_TYPE:
-                return getComponentType() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER:
-                return getConverter() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_CLASS:
-                return getConverterClass() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_FOR_CLASS:
-                return getConverterForClass() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_ID:
-                return getConverterId() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_LOCALE:
-                return getDefaultLocale() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID:
-                return getDefaultRenderKitId() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALUE:
-                return getDefaultValue() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__DESCRIPTION:
-                return getDescription() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__DISPLAY_NAME:
-                return getDisplayName() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONFIG:
-                return getFacesConfig() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY:
-                return getFacesContextFactory() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__FACET:
-                return getFacet() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__FACET_EXTENSION:
-                return getFacetExtension() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__FACET_NAME:
-                return getFacetName() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__FACTORY:
-                return getFactory() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__FROM_ACTION:
-                return getFromAction() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__FROM_OUTCOME:
-                return getFromOutcome() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__FROM_VIEW_ID:
-                return getFromViewId() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__ICON:
-                return getIcon() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__KEY:
-                return getKey() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__KEY_CLASS:
-                return getKeyClass() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__LARGE_ICON:
-                return getLargeIcon() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE:
-                return getLifecycle() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE_FACTORY:
-                return getLifecycleFactory() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__LIST_ENTRIES:
-                return getListEntries() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__LOCALE_CONFIG:
-                return getLocaleConfig() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN:
-                return getManagedBean() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_CLASS:
-                return getManagedBeanClass() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_NAME:
-                return getManagedBeanName() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE:
-                return getManagedBeanScope() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_PROPERTY:
-                return getManagedProperty() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRIES:
-                return getMapEntries() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRY:
-                return getMapEntry() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__MESSAGE_BUNDLE:
-                return getMessageBundle() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_CASE:
-                return getNavigationCase() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_HANDLER:
-                return getNavigationHandler() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_RULE:
-                return getNavigationRule() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__NULL_VALUE:
-                return getNullValue() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__PHASE_LISTENER:
-                return getPhaseListener() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY:
-                return getProperty() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_CLASS:
-                return getPropertyClass() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_EXTENSION:
-                return getPropertyExtension() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_NAME:
-                return getPropertyName() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_RESOLVER:
-                return getPropertyResolver() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT:
-                return getRedirect() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN:
-                return getReferencedBean() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS:
-                return getReferencedBeanClass() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_NAME:
-                return getReferencedBeanName() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDERER:
-                return getRenderer() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_CLASS:
-                return getRendererClass() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_EXTENSION:
-                return getRendererExtension() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_TYPE:
-                return getRendererType() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT:
-                return getRenderKit() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_CLASS:
-                return getRenderKitClass() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_FACTORY:
-                return getRenderKitFactory() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_ID:
-                return getRenderKitId() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__SMALL_ICON:
-                return getSmallIcon() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__STATE_MANAGER:
-                return getStateManager() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__SUGGESTED_VALUE:
-                return getSuggestedValue() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__SUPPORTED_LOCALE:
-                return getSupportedLocale() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__TO_VIEW_ID:
-                return getToViewId() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR:
-                return getValidator() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_CLASS:
-                return getValidatorClass() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_ID:
-                return getValidatorId() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__VALUE:
-                return getValue() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__VALUE_CLASS:
-                return getValueClass() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__VARIABLE_RESOLVER:
-                return getVariableResolver() != null;
-            case FacesConfigPackage.DOCUMENT_ROOT__VIEW_HANDLER:
-                return getViewHandler() != null;
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (mixed: ");
-        result.append(mixed);
-        result.append(')');
-        return result.toString();
-    }
-
-} //DocumentRootImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DynamicAttributeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DynamicAttributeImpl.java
deleted file mode 100644
index 3a32acb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DynamicAttributeImpl.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Dynamic Attribute</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicAttributeImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicAttributeImpl#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DynamicAttributeImpl extends EObjectImpl implements DynamicAttribute {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-    protected static final String NAME_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-    protected String name = NAME_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getValue()
-     * @generated
-     * @ordered
-     */
-    protected static final String VALUE_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getValue()
-     * @generated
-     * @ordered
-     */
-    protected String value = VALUE_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected DynamicAttributeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.DYNAMIC_ATTRIBUTE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setName(String newName) {
-        String oldName = name;
-        name = newName;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DYNAMIC_ATTRIBUTE__NAME, oldName, name));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getValue() {
-        return value;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setValue(String newValue) {
-        String oldValue = value;
-        value = newValue;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DYNAMIC_ATTRIBUTE__VALUE, oldValue, value));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.DYNAMIC_ATTRIBUTE__NAME:
-                return getName();
-            case FacesConfigPackage.DYNAMIC_ATTRIBUTE__VALUE:
-                return getValue();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.DYNAMIC_ATTRIBUTE__NAME:
-                setName((String)newValue);
-                return;
-            case FacesConfigPackage.DYNAMIC_ATTRIBUTE__VALUE:
-                setValue((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.DYNAMIC_ATTRIBUTE__NAME:
-                setName(NAME_EDEFAULT);
-                return;
-            case FacesConfigPackage.DYNAMIC_ATTRIBUTE__VALUE:
-                setValue(VALUE_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.DYNAMIC_ATTRIBUTE__NAME:
-                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-            case FacesConfigPackage.DYNAMIC_ATTRIBUTE__VALUE:
-                return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (name: ");
-        result.append(name);
-        result.append(", value: ");
-        result.append(value);
-        result.append(')');
-        return result.toString();
-    }
-
-} //DynamicAttributeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DynamicElementImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DynamicElementImpl.java
deleted file mode 100644
index 97827b6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DynamicElementImpl.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute;
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicElement;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Dynamic Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl#getChildNodes <em>Child Nodes</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl#getAttributes <em>Attributes</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl#getTextContent <em>Text Content</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DynamicElementImpl extends EObjectImpl implements DynamicElement {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getChildNodes() <em>Child Nodes</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getChildNodes()
-     * @generated
-     * @ordered
-     */
-    protected EList childNodes = null;
-
-    /**
-     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-    protected static final String NAME_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getName()
-     * @generated
-     * @ordered
-     */
-    protected String name = NAME_EDEFAULT;
-
-    /**
-     * The cached value of the '{@link #getAttributes() <em>Attributes</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getAttributes()
-     * @generated
-     * @ordered
-     */
-    protected EList attributes = null;
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-    protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-    protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected DynamicElementImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.DYNAMIC_ELEMENT;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getChildNodes() {
-        if (childNodes == null) {
-            childNodes = new EObjectContainmentEList(DynamicElement.class, this, FacesConfigPackage.DYNAMIC_ELEMENT__CHILD_NODES);
-        }
-        return childNodes;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getAttributes() {
-        if (attributes == null) {
-            attributes = new EObjectResolvingEList(DynamicAttribute.class, this, FacesConfigPackage.DYNAMIC_ELEMENT__ATTRIBUTES);
-        }
-        return attributes;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DYNAMIC_ELEMENT__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setName(String newName) {
-        String oldName = name;
-        name = newName;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DYNAMIC_ELEMENT__NAME, oldName, name));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.DYNAMIC_ELEMENT__CHILD_NODES:
-                return ((InternalEList)getChildNodes()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.DYNAMIC_ELEMENT__CHILD_NODES:
-                return getChildNodes();
-            case FacesConfigPackage.DYNAMIC_ELEMENT__NAME:
-                return getName();
-            case FacesConfigPackage.DYNAMIC_ELEMENT__ATTRIBUTES:
-                return getAttributes();
-            case FacesConfigPackage.DYNAMIC_ELEMENT__TEXT_CONTENT:
-                return getTextContent();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.DYNAMIC_ELEMENT__CHILD_NODES:
-                getChildNodes().clear();
-                getChildNodes().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.DYNAMIC_ELEMENT__NAME:
-                setName((String)newValue);
-                return;
-            case FacesConfigPackage.DYNAMIC_ELEMENT__ATTRIBUTES:
-                getAttributes().clear();
-                getAttributes().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.DYNAMIC_ELEMENT__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.DYNAMIC_ELEMENT__CHILD_NODES:
-                getChildNodes().clear();
-                return;
-            case FacesConfigPackage.DYNAMIC_ELEMENT__NAME:
-                setName(NAME_EDEFAULT);
-                return;
-            case FacesConfigPackage.DYNAMIC_ELEMENT__ATTRIBUTES:
-                getAttributes().clear();
-                return;
-            case FacesConfigPackage.DYNAMIC_ELEMENT__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.DYNAMIC_ELEMENT__CHILD_NODES:
-                return childNodes != null && !childNodes.isEmpty();
-            case FacesConfigPackage.DYNAMIC_ELEMENT__NAME:
-                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-            case FacesConfigPackage.DYNAMIC_ELEMENT__ATTRIBUTES:
-                return attributes != null && !attributes.isEmpty();
-            case FacesConfigPackage.DYNAMIC_ELEMENT__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (name: ");
-        result.append(name);
-        result.append(", textContent: ");
-        result.append(textContent);
-        result.append(')');
-        return result.toString();
-    }
-
-} //DynamicElementImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ELResolverTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ELResolverTypeImpl.java
deleted file mode 100644
index fbcd77b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ELResolverTypeImpl.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.jsf.facesconfig.emf.ELResolverType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>EL Resolver Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ELResolverTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ELResolverTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ELResolverTypeImpl extends EObjectImpl implements ELResolverType {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-    protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-    protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ELResolverTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.EL_RESOLVER_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.EL_RESOLVER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.EL_RESOLVER_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.EL_RESOLVER_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.EL_RESOLVER_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.EL_RESOLVER_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.EL_RESOLVER_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.EL_RESOLVER_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.EL_RESOLVER_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.EL_RESOLVER_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.EL_RESOLVER_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ELResolverTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ExtensionTypeImpl.java
deleted file mode 100644
index 7aa18d5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ExtensionTypeImpl.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicElement;
-import org.eclipse.jst.jsf.facesconfig.emf.ExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExtensionTypeImpl#getChildNodes <em>Child Nodes</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExtensionTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExtensionTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class ExtensionTypeImpl extends EObjectImpl implements ExtensionType {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getChildNodes() <em>Child Nodes</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getChildNodes()
-     * @generated
-     * @ordered
-     */
-    protected EList childNodes = null;
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-    protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-    protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ExtensionTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.EXTENSION_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getChildNodes() {
-        if (childNodes == null) {
-            childNodes = new EObjectResolvingEList(DynamicElement.class, this, FacesConfigPackage.EXTENSION_TYPE__CHILD_NODES);
-        }
-        return childNodes;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.EXTENSION_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.EXTENSION_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.EXTENSION_TYPE__CHILD_NODES:
-                return getChildNodes();
-            case FacesConfigPackage.EXTENSION_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.EXTENSION_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.EXTENSION_TYPE__CHILD_NODES:
-                getChildNodes().clear();
-                getChildNodes().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.EXTENSION_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.EXTENSION_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.EXTENSION_TYPE__CHILD_NODES:
-                getChildNodes().clear();
-                return;
-            case FacesConfigPackage.EXTENSION_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.EXTENSION_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.EXTENSION_TYPE__CHILD_NODES:
-                return childNodes != null && !childNodes.isEmpty();
-            case FacesConfigPackage.EXTENSION_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.EXTENSION_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigExtensionTypeImpl.java
deleted file mode 100644
index a8309b7..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
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FacesConfigExtensionTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.FACES_CONFIG_EXTENSION_TYPE;
-    }
-
-} //FacesConfigExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigFactoryImpl.java
deleted file mode 100644
index 19e687a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigFactoryImpl.java
+++ /dev/null
@@ -1,1155 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.emf.ecore.EPackage;
-
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-
-import org.eclipse.jst.jsf.facesconfig.emf.*;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class FacesConfigFactoryImpl extends EFactoryImpl implements FacesConfigFactory {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * Creates the default factory implementation.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static FacesConfigFactory init() {
-        try {
-            FacesConfigFactory theFacesConfigFactory = (FacesConfigFactory)EPackage.Registry.INSTANCE.getEFactory("http://www.eclipse.org/webtools/jsf/schema/facesconfig.xsd"); 
-            if (theFacesConfigFactory != null) {
-                return theFacesConfigFactory;
-            }
-        }
-        catch (Exception exception) {
-            EcorePlugin.INSTANCE.log(exception);
-        }
-        return new FacesConfigFactoryImpl();
-    }
-
-    /**
-     * Creates an instance of the factory.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public FacesConfigFactoryImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EObject create(EClass eClass) {
-        switch (eClass.getClassifierID()) {
-            case FacesConfigPackage.ACTION_LISTENER_TYPE: return createActionListenerType();
-            case FacesConfigPackage.APPLICATION_FACTORY_TYPE: return createApplicationFactoryType();
-            case FacesConfigPackage.APPLICATION_TYPE: return createApplicationType();
-            case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE: return createAttributeClassType();
-            case FacesConfigPackage.ATTRIBUTE_EXTENSION_TYPE: return createAttributeExtensionType();
-            case FacesConfigPackage.ATTRIBUTE_NAME_TYPE: return createAttributeNameType();
-            case FacesConfigPackage.ATTRIBUTE_TYPE: return createAttributeType();
-            case FacesConfigPackage.COMPONENT_CLASS_TYPE: return createComponentClassType();
-            case FacesConfigPackage.COMPONENT_EXTENSION_TYPE: return createComponentExtensionType();
-            case FacesConfigPackage.COMPONENT_FAMILY_TYPE: return createComponentFamilyType();
-            case FacesConfigPackage.COMPONENT_TYPE: return createComponentType();
-            case FacesConfigPackage.COMPONENT_TYPE_TYPE: return createComponentTypeType();
-            case FacesConfigPackage.CONVERTER_CLASS_TYPE: return createConverterClassType();
-            case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE: return createConverterForClassType();
-            case FacesConfigPackage.CONVERTER_ID_TYPE: return createConverterIdType();
-            case FacesConfigPackage.CONVERTER_TYPE: return createConverterType();
-            case FacesConfigPackage.DEFAULT_LOCALE_TYPE: return createDefaultLocaleType();
-            case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE: return createDefaultRenderKitIdType();
-            case FacesConfigPackage.DEFAULT_VALUE_TYPE: return createDefaultValueType();
-            case FacesConfigPackage.DESCRIPTION_TYPE: return createDescriptionType();
-            case FacesConfigPackage.DISPLAY_NAME_TYPE: return createDisplayNameType();
-            case FacesConfigPackage.DOCUMENT_ROOT: return createDocumentRoot();
-            case FacesConfigPackage.DYNAMIC_ATTRIBUTE: return createDynamicAttribute();
-            case FacesConfigPackage.DYNAMIC_ELEMENT: return createDynamicElement();
-            case FacesConfigPackage.FACES_CONFIG_TYPE: return createFacesConfigType();
-            case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE: return createFacesContextFactoryType();
-            case FacesConfigPackage.FACET_EXTENSION_TYPE: return createFacetExtensionType();
-            case FacesConfigPackage.FACET_NAME_TYPE: return createFacetNameType();
-            case FacesConfigPackage.FACET_TYPE: return createFacetType();
-            case FacesConfigPackage.FACTORY_TYPE: return createFactoryType();
-            case FacesConfigPackage.FROM_ACTION_TYPE: return createFromActionType();
-            case FacesConfigPackage.FROM_OUTCOME_TYPE: return createFromOutcomeType();
-            case FacesConfigPackage.FROM_VIEW_ID_TYPE: return createFromViewIdType();
-            case FacesConfigPackage.ICON_TYPE: return createIconType();
-            case FacesConfigPackage.KEY_CLASS_TYPE: return createKeyClassType();
-            case FacesConfigPackage.KEY_TYPE: return createKeyType();
-            case FacesConfigPackage.LARGE_ICON_TYPE: return createLargeIconType();
-            case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE: return createLifecycleFactoryType();
-            case FacesConfigPackage.LIFECYCLE_TYPE: return createLifecycleType();
-            case FacesConfigPackage.LIST_ENTRIES_TYPE: return createListEntriesType();
-            case FacesConfigPackage.LOCALE_CONFIG_TYPE: return createLocaleConfigType();
-            case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE: return createManagedBeanClassType();
-            case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE: return createManagedBeanNameType();
-            case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE: return createManagedBeanScopeType();
-            case FacesConfigPackage.MANAGED_BEAN_TYPE: return createManagedBeanType();
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE: return createManagedPropertyType();
-            case FacesConfigPackage.MAP_ENTRIES_TYPE: return createMapEntriesType();
-            case FacesConfigPackage.MAP_ENTRY_TYPE: return createMapEntryType();
-            case FacesConfigPackage.MESSAGE_BUNDLE_TYPE: return createMessageBundleType();
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE: return createNavigationCaseType();
-            case FacesConfigPackage.NAVIGATION_HANDLER_TYPE: return createNavigationHandlerType();
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE: return createNavigationRuleType();
-            case FacesConfigPackage.NULL_VALUE_TYPE: return createNullValueType();
-            case FacesConfigPackage.PHASE_LISTENER_TYPE: return createPhaseListenerType();
-            case FacesConfigPackage.PROPERTY_CLASS_TYPE: return createPropertyClassType();
-            case FacesConfigPackage.PROPERTY_EXTENSION_TYPE: return createPropertyExtensionType();
-            case FacesConfigPackage.PROPERTY_NAME_TYPE: return createPropertyNameType();
-            case FacesConfigPackage.PROPERTY_RESOLVER_TYPE: return createPropertyResolverType();
-            case FacesConfigPackage.PROPERTY_TYPE: return createPropertyType();
-            case FacesConfigPackage.REDIRECT_TYPE: return createRedirectType();
-            case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE: return createReferencedBeanClassType();
-            case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE: return createReferencedBeanNameType();
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE: return createReferencedBeanType();
-            case FacesConfigPackage.RENDERER_CLASS_TYPE: return createRendererClassType();
-            case FacesConfigPackage.RENDERER_EXTENSION_TYPE: return createRendererExtensionType();
-            case FacesConfigPackage.RENDERER_TYPE: return createRendererType();
-            case FacesConfigPackage.RENDERER_TYPE_TYPE: return createRendererTypeType();
-            case FacesConfigPackage.RENDER_KIT_CLASS_TYPE: return createRenderKitClassType();
-            case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE: return createRenderKitFactoryType();
-            case FacesConfigPackage.RENDER_KIT_ID_TYPE: return createRenderKitIdType();
-            case FacesConfigPackage.RENDER_KIT_TYPE: return createRenderKitType();
-            case FacesConfigPackage.SMALL_ICON_TYPE: return createSmallIconType();
-            case FacesConfigPackage.STATE_MANAGER_TYPE: return createStateManagerType();
-            case FacesConfigPackage.SUGGESTED_VALUE_TYPE: return createSuggestedValueType();
-            case FacesConfigPackage.SUPPORTED_LOCALE_TYPE: return createSupportedLocaleType();
-            case FacesConfigPackage.TO_VIEW_ID_TYPE: return createToViewIdType();
-            case FacesConfigPackage.VALIDATOR_CLASS_TYPE: return createValidatorClassType();
-            case FacesConfigPackage.VALIDATOR_ID_TYPE: return createValidatorIdType();
-            case FacesConfigPackage.VALIDATOR_TYPE: return createValidatorType();
-            case FacesConfigPackage.VALUE_CLASS_TYPE: return createValueClassType();
-            case FacesConfigPackage.VALUE_TYPE: return createValueType();
-            case FacesConfigPackage.VARIABLE_RESOLVER_TYPE: return createVariableResolverType();
-            case FacesConfigPackage.VIEW_HANDLER_TYPE: return createViewHandlerType();
-            case FacesConfigPackage.APPLICATION_EXTENSION_TYPE: return createApplicationExtensionType();
-            case FacesConfigPackage.CONVERTER_EXTENSION_TYPE: return createConverterExtensionType();
-            case FacesConfigPackage.EL_RESOLVER_TYPE: return createELResolverType();
-            case FacesConfigPackage.FACES_CONFIG_EXTENSION_TYPE: return createFacesConfigExtensionType();
-            case FacesConfigPackage.FACTORY_EXTENSION_TYPE: return createFactoryExtensionType();
-            case FacesConfigPackage.LIFECYCLE_EXTENSION_TYPE: return createLifecycleExtensionType();
-            case FacesConfigPackage.MANAGED_BEAN_EXTENSION_TYPE: return createManagedBeanExtensionType();
-            case FacesConfigPackage.NAVIGATION_RULE_EXTENSION_TYPE: return createNavigationRuleExtensionType();
-            case FacesConfigPackage.VALIDATOR_EXTENSION_TYPE: return createValidatorExtensionType();
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE: return createResourceBundleType();
-            case FacesConfigPackage.BASE_NAME_TYPE: return createBaseNameType();
-            case FacesConfigPackage.VAR_TYPE: return createVarType();
-            case FacesConfigPackage.RENDER_KIT_EXTENSION_TYPE: return createRenderKitExtensionType();
-            default:
-                throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
-        }
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ActionListenerType createActionListenerType() {
-        ActionListenerTypeImpl actionListenerType = new ActionListenerTypeImpl();
-        return actionListenerType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ApplicationFactoryType createApplicationFactoryType() {
-        ApplicationFactoryTypeImpl applicationFactoryType = new ApplicationFactoryTypeImpl();
-        return applicationFactoryType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ApplicationType createApplicationType() {
-        ApplicationTypeImpl applicationType = new ApplicationTypeImpl();
-        return applicationType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public AttributeClassType createAttributeClassType() {
-        AttributeClassTypeImpl attributeClassType = new AttributeClassTypeImpl();
-        return attributeClassType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public AttributeExtensionType createAttributeExtensionType() {
-        AttributeExtensionTypeImpl attributeExtensionType = new AttributeExtensionTypeImpl();
-        return attributeExtensionType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public AttributeNameType createAttributeNameType() {
-        AttributeNameTypeImpl attributeNameType = new AttributeNameTypeImpl();
-        return attributeNameType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public AttributeType createAttributeType() {
-        AttributeTypeImpl attributeType = new AttributeTypeImpl();
-        return attributeType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ComponentClassType createComponentClassType() {
-        ComponentClassTypeImpl componentClassType = new ComponentClassTypeImpl();
-        return componentClassType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ComponentExtensionType createComponentExtensionType() {
-        ComponentExtensionTypeImpl componentExtensionType = new ComponentExtensionTypeImpl();
-        return componentExtensionType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ComponentFamilyType createComponentFamilyType() {
-        ComponentFamilyTypeImpl componentFamilyType = new ComponentFamilyTypeImpl();
-        return componentFamilyType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ComponentType createComponentType() {
-        ComponentTypeImpl componentType = new ComponentTypeImpl();
-        return componentType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ComponentTypeType createComponentTypeType() {
-        ComponentTypeTypeImpl componentTypeType = new ComponentTypeTypeImpl();
-        return componentTypeType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ConverterClassType createConverterClassType() {
-        ConverterClassTypeImpl converterClassType = new ConverterClassTypeImpl();
-        return converterClassType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ConverterForClassType createConverterForClassType() {
-        ConverterForClassTypeImpl converterForClassType = new ConverterForClassTypeImpl();
-        return converterForClassType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ConverterIdType createConverterIdType() {
-        ConverterIdTypeImpl converterIdType = new ConverterIdTypeImpl();
-        return converterIdType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ConverterType createConverterType() {
-        ConverterTypeImpl converterType = new ConverterTypeImpl();
-        return converterType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public DefaultLocaleType createDefaultLocaleType() {
-        DefaultLocaleTypeImpl defaultLocaleType = new DefaultLocaleTypeImpl();
-        return defaultLocaleType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public DefaultRenderKitIdType createDefaultRenderKitIdType() {
-        DefaultRenderKitIdTypeImpl defaultRenderKitIdType = new DefaultRenderKitIdTypeImpl();
-        return defaultRenderKitIdType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public DefaultValueType createDefaultValueType() {
-        DefaultValueTypeImpl defaultValueType = new DefaultValueTypeImpl();
-        return defaultValueType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public DescriptionType createDescriptionType() {
-        DescriptionTypeImpl descriptionType = new DescriptionTypeImpl();
-        return descriptionType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public DisplayNameType createDisplayNameType() {
-        DisplayNameTypeImpl displayNameType = new DisplayNameTypeImpl();
-        return displayNameType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public DocumentRoot createDocumentRoot() {
-        DocumentRootImpl documentRoot = new DocumentRootImpl();
-        return documentRoot;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public DynamicAttribute createDynamicAttribute() {
-        DynamicAttributeImpl dynamicAttribute = new DynamicAttributeImpl();
-        return dynamicAttribute;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public DynamicElement createDynamicElement() {
-        DynamicElementImpl dynamicElement = new DynamicElementImpl();
-        return dynamicElement;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ELResolverType createELResolverType() {
-        ELResolverTypeImpl elResolverType = new ELResolverTypeImpl();
-        return elResolverType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public FacesConfigType createFacesConfigType() {
-        FacesConfigTypeImpl facesConfigType = new FacesConfigTypeImpl();
-        return facesConfigType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public FacesContextFactoryType createFacesContextFactoryType() {
-        FacesContextFactoryTypeImpl facesContextFactoryType = new FacesContextFactoryTypeImpl();
-        return facesContextFactoryType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public FacetExtensionType createFacetExtensionType() {
-        FacetExtensionTypeImpl facetExtensionType = new FacetExtensionTypeImpl();
-        return facetExtensionType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public FacetNameType createFacetNameType() {
-        FacetNameTypeImpl facetNameType = new FacetNameTypeImpl();
-        return facetNameType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public FacetType createFacetType() {
-        FacetTypeImpl facetType = new FacetTypeImpl();
-        return facetType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public FactoryType createFactoryType() {
-        FactoryTypeImpl factoryType = new FactoryTypeImpl();
-        return factoryType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public FromActionType createFromActionType() {
-        FromActionTypeImpl fromActionType = new FromActionTypeImpl();
-        return fromActionType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public FromOutcomeType createFromOutcomeType() {
-        FromOutcomeTypeImpl fromOutcomeType = new FromOutcomeTypeImpl();
-        return fromOutcomeType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public FromViewIdType createFromViewIdType() {
-        FromViewIdTypeImpl fromViewIdType = new FromViewIdTypeImpl();
-        return fromViewIdType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public IconType createIconType() {
-        IconTypeImpl iconType = new IconTypeImpl();
-        return iconType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public KeyClassType createKeyClassType() {
-        KeyClassTypeImpl keyClassType = new KeyClassTypeImpl();
-        return keyClassType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public KeyType createKeyType() {
-        KeyTypeImpl keyType = new KeyTypeImpl();
-        return keyType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public LargeIconType createLargeIconType() {
-        LargeIconTypeImpl largeIconType = new LargeIconTypeImpl();
-        return largeIconType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public LifecycleFactoryType createLifecycleFactoryType() {
-        LifecycleFactoryTypeImpl lifecycleFactoryType = new LifecycleFactoryTypeImpl();
-        return lifecycleFactoryType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public LifecycleType createLifecycleType() {
-        LifecycleTypeImpl lifecycleType = new LifecycleTypeImpl();
-        return lifecycleType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ListEntriesType createListEntriesType() {
-        ListEntriesTypeImpl listEntriesType = new ListEntriesTypeImpl();
-        return listEntriesType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public LocaleConfigType createLocaleConfigType() {
-        LocaleConfigTypeImpl localeConfigType = new LocaleConfigTypeImpl();
-        return localeConfigType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ManagedBeanClassType createManagedBeanClassType() {
-        ManagedBeanClassTypeImpl managedBeanClassType = new ManagedBeanClassTypeImpl();
-        return managedBeanClassType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ManagedBeanNameType createManagedBeanNameType() {
-        ManagedBeanNameTypeImpl managedBeanNameType = new ManagedBeanNameTypeImpl();
-        return managedBeanNameType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ManagedBeanScopeType createManagedBeanScopeType() {
-        ManagedBeanScopeTypeImpl managedBeanScopeType = new ManagedBeanScopeTypeImpl();
-        return managedBeanScopeType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ManagedBeanType createManagedBeanType() {
-        ManagedBeanTypeImpl managedBeanType = new ManagedBeanTypeImpl();
-        return managedBeanType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ManagedPropertyType createManagedPropertyType() {
-        ManagedPropertyTypeImpl managedPropertyType = new ManagedPropertyTypeImpl();
-        return managedPropertyType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public MapEntriesType createMapEntriesType() {
-        MapEntriesTypeImpl mapEntriesType = new MapEntriesTypeImpl();
-        return mapEntriesType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public MapEntryType createMapEntryType() {
-        MapEntryTypeImpl mapEntryType = new MapEntryTypeImpl();
-        return mapEntryType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public MessageBundleType createMessageBundleType() {
-        MessageBundleTypeImpl messageBundleType = new MessageBundleTypeImpl();
-        return messageBundleType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NavigationCaseType createNavigationCaseType() {
-        NavigationCaseTypeImpl navigationCaseType = new NavigationCaseTypeImpl();
-        return navigationCaseType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NavigationHandlerType createNavigationHandlerType() {
-        NavigationHandlerTypeImpl navigationHandlerType = new NavigationHandlerTypeImpl();
-        return navigationHandlerType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NavigationRuleType createNavigationRuleType() {
-        NavigationRuleTypeImpl navigationRuleType = new NavigationRuleTypeImpl();
-        return navigationRuleType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NullValueType createNullValueType() {
-        NullValueTypeImpl nullValueType = new NullValueTypeImpl();
-        return nullValueType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public PhaseListenerType createPhaseListenerType() {
-        PhaseListenerTypeImpl phaseListenerType = new PhaseListenerTypeImpl();
-        return phaseListenerType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public PropertyClassType createPropertyClassType() {
-        PropertyClassTypeImpl propertyClassType = new PropertyClassTypeImpl();
-        return propertyClassType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public PropertyExtensionType createPropertyExtensionType() {
-        PropertyExtensionTypeImpl propertyExtensionType = new PropertyExtensionTypeImpl();
-        return propertyExtensionType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public PropertyNameType createPropertyNameType() {
-        PropertyNameTypeImpl propertyNameType = new PropertyNameTypeImpl();
-        return propertyNameType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public PropertyResolverType createPropertyResolverType() {
-        PropertyResolverTypeImpl propertyResolverType = new PropertyResolverTypeImpl();
-        return propertyResolverType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public PropertyType createPropertyType() {
-        PropertyTypeImpl propertyType = new PropertyTypeImpl();
-        return propertyType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public RedirectType createRedirectType() {
-        RedirectTypeImpl redirectType = new RedirectTypeImpl();
-        return redirectType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ReferencedBeanClassType createReferencedBeanClassType() {
-        ReferencedBeanClassTypeImpl referencedBeanClassType = new ReferencedBeanClassTypeImpl();
-        return referencedBeanClassType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ReferencedBeanNameType createReferencedBeanNameType() {
-        ReferencedBeanNameTypeImpl referencedBeanNameType = new ReferencedBeanNameTypeImpl();
-        return referencedBeanNameType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ReferencedBeanType createReferencedBeanType() {
-        ReferencedBeanTypeImpl referencedBeanType = new ReferencedBeanTypeImpl();
-        return referencedBeanType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public RendererClassType createRendererClassType() {
-        RendererClassTypeImpl rendererClassType = new RendererClassTypeImpl();
-        return rendererClassType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public RendererExtensionType createRendererExtensionType() {
-        RendererExtensionTypeImpl rendererExtensionType = new RendererExtensionTypeImpl();
-        return rendererExtensionType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public RendererType createRendererType() {
-        RendererTypeImpl rendererType = new RendererTypeImpl();
-        return rendererType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public RendererTypeType createRendererTypeType() {
-        RendererTypeTypeImpl rendererTypeType = new RendererTypeTypeImpl();
-        return rendererTypeType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public RenderKitClassType createRenderKitClassType() {
-        RenderKitClassTypeImpl renderKitClassType = new RenderKitClassTypeImpl();
-        return renderKitClassType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public RenderKitFactoryType createRenderKitFactoryType() {
-        RenderKitFactoryTypeImpl renderKitFactoryType = new RenderKitFactoryTypeImpl();
-        return renderKitFactoryType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public RenderKitIdType createRenderKitIdType() {
-        RenderKitIdTypeImpl renderKitIdType = new RenderKitIdTypeImpl();
-        return renderKitIdType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public RenderKitType createRenderKitType() {
-        RenderKitTypeImpl renderKitType = new RenderKitTypeImpl();
-        return renderKitType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public SmallIconType createSmallIconType() {
-        SmallIconTypeImpl smallIconType = new SmallIconTypeImpl();
-        return smallIconType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public StateManagerType createStateManagerType() {
-        StateManagerTypeImpl stateManagerType = new StateManagerTypeImpl();
-        return stateManagerType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public SuggestedValueType createSuggestedValueType() {
-        SuggestedValueTypeImpl suggestedValueType = new SuggestedValueTypeImpl();
-        return suggestedValueType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public SupportedLocaleType createSupportedLocaleType() {
-        SupportedLocaleTypeImpl supportedLocaleType = new SupportedLocaleTypeImpl();
-        return supportedLocaleType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ToViewIdType createToViewIdType() {
-        ToViewIdTypeImpl toViewIdType = new ToViewIdTypeImpl();
-        return toViewIdType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ValidatorClassType createValidatorClassType() {
-        ValidatorClassTypeImpl validatorClassType = new ValidatorClassTypeImpl();
-        return validatorClassType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ValidatorIdType createValidatorIdType() {
-        ValidatorIdTypeImpl validatorIdType = new ValidatorIdTypeImpl();
-        return validatorIdType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ValidatorType createValidatorType() {
-        ValidatorTypeImpl validatorType = new ValidatorTypeImpl();
-        return validatorType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ValueClassType createValueClassType() {
-        ValueClassTypeImpl valueClassType = new ValueClassTypeImpl();
-        return valueClassType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ValueType createValueType() {
-        ValueTypeImpl valueType = new ValueTypeImpl();
-        return valueType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public VariableResolverType createVariableResolverType() {
-        VariableResolverTypeImpl variableResolverType = new VariableResolverTypeImpl();
-        return variableResolverType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ViewHandlerType createViewHandlerType() {
-        ViewHandlerTypeImpl viewHandlerType = new ViewHandlerTypeImpl();
-        return viewHandlerType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ApplicationExtensionType createApplicationExtensionType() {
-        ApplicationExtensionTypeImpl applicationExtensionType = new ApplicationExtensionTypeImpl();
-        return applicationExtensionType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ResourceBundleType createResourceBundleType() {
-        ResourceBundleTypeImpl resourceBundleType = new ResourceBundleTypeImpl();
-        return resourceBundleType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public BaseNameType createBaseNameType() {
-        BaseNameTypeImpl baseNameType = new BaseNameTypeImpl();
-        return baseNameType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public VarType createVarType() {
-        VarTypeImpl varType = new VarTypeImpl();
-        return varType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public RenderKitExtensionType createRenderKitExtensionType() {
-        RenderKitExtensionTypeImpl renderKitExtensionType = new RenderKitExtensionTypeImpl();
-        return renderKitExtensionType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NavigationRuleExtensionType createNavigationRuleExtensionType() {
-        NavigationRuleExtensionTypeImpl navigationRuleExtensionType = new NavigationRuleExtensionTypeImpl();
-        return navigationRuleExtensionType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ValidatorExtensionType createValidatorExtensionType() {
-        ValidatorExtensionTypeImpl validatorExtensionType = new ValidatorExtensionTypeImpl();
-        return validatorExtensionType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FacesConfigExtensionType createFacesConfigExtensionType() {
-        FacesConfigExtensionTypeImpl facesConfigExtensionType = new FacesConfigExtensionTypeImpl();
-        return facesConfigExtensionType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public FactoryExtensionType createFactoryExtensionType() {
-        FactoryExtensionTypeImpl factoryExtensionType = new FactoryExtensionTypeImpl();
-        return factoryExtensionType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public LifecycleExtensionType createLifecycleExtensionType() {
-        LifecycleExtensionTypeImpl lifecycleExtensionType = new LifecycleExtensionTypeImpl();
-        return lifecycleExtensionType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ManagedBeanExtensionType createManagedBeanExtensionType() {
-        ManagedBeanExtensionTypeImpl managedBeanExtensionType = new ManagedBeanExtensionTypeImpl();
-        return managedBeanExtensionType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public ConverterExtensionType createConverterExtensionType() {
-        ConverterExtensionTypeImpl converterExtensionType = new ConverterExtensionTypeImpl();
-        return converterExtensionType;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public FacesConfigPackage getFacesConfigPackage() {
-        return (FacesConfigPackage)getEPackage();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 650d82a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigPackageImpl.java
+++ /dev/null
@@ -1,9837 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.emf.ecore.xml.type.XMLTypePackage;
-import org.eclipse.jst.jsf.facesconfig.emf.*;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class FacesConfigPackageImpl extends EPackageImpl implements FacesConfigPackage {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass actionListenerTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass applicationFactoryTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass applicationTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass attributeClassTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass attributeExtensionTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass attributeNameTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass attributeTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass componentClassTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass componentExtensionTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass componentFamilyTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass componentTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass componentTypeTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass converterClassTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass converterForClassTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass converterIdTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass converterTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass defaultLocaleTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass defaultRenderKitIdTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass defaultValueTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass descriptionTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass displayNameTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass documentRootEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass dynamicAttributeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass dynamicElementEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass elResolverTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass facesConfigTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass facesContextFactoryTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass facetExtensionTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass facetNameTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass facetTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass factoryTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass fromActionTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass fromOutcomeTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass fromViewIdTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass iconTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass keyClassTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass keyTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass largeIconTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass lifecycleFactoryTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass lifecycleTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass listEntriesTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass localeConfigTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass managedBeanClassTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass managedBeanNameTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass managedBeanScopeTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass managedBeanTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass managedPropertyTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass mapEntriesTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass mapEntryTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass messageBundleTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass navigationCaseTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass navigationHandlerTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass navigationRuleTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass nullValueTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass phaseListenerTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass propertyClassTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass propertyExtensionTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass propertyNameTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass propertyResolverTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass propertyTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass redirectTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass referencedBeanClassTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass referencedBeanNameTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass referencedBeanTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass rendererClassTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass rendererExtensionTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass rendererTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass rendererTypeTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass renderKitClassTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass renderKitFactoryTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass renderKitIdTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass renderKitTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass smallIconTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass stateManagerTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass suggestedValueTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass supportedLocaleTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass toViewIdTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass validatorClassTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass validatorIdTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass validatorTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass valueClassTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass valueTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass variableResolverTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private EClass viewHandlerTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass resourceBundleTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass baseNameTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass varTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass renderKitExtensionTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass navigationRuleExtensionTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass validatorExtensionTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass facesConfigExtensionTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass factoryExtensionTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass lifecycleExtensionTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass managedBeanExtensionTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass converterExtensionTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass extensionTypeEClass = null;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    private EClass applicationExtensionTypeEClass = null;
-
-    /**
-     * Creates an instance of the model <b>Package</b>, registered with
-     * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-     * package URI value.
-     * <p>Note: the correct way to create the package is via the static
-     * factory method {@link #init init()}, which also performs
-     * initialization of the package, or returns the registered package,
-     * if one already exists.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see org.eclipse.emf.ecore.EPackage.Registry
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#eNS_URI
-     * @see #init()
-     * @generated
-     */
-	private FacesConfigPackageImpl() {
-        super(eNS_URI, FacesConfigFactory.eINSTANCE);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private static boolean isInited = false;
-
-    /**
-     * Creates, registers, and initializes the <b>Package</b> for this
-     * model, and for any others upon which it depends.  Simple
-     * dependencies are satisfied by calling this method on all
-     * dependent packages before doing anything else.  This method drives
-     * initialization for interdependent packages directly, in parallel
-     * with this package, itself.
-     * <p>Of this package and its interdependencies, all packages which
-     * have not yet been registered by their URI values are first created
-     * and registered.  The packages are then initialized in two steps:
-     * meta-model objects for all of the packages are created before any
-     * are initialized, since one package's meta-model objects may refer to
-     * those of another.
-     * <p>Invocation of this method will not affect any packages that have
-     * already been initialized.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #eNS_URI
-     * @see #createPackageContents()
-     * @see #initializePackageContents()
-     * @generated
-     */
-	public static FacesConfigPackage init() {
-        if (isInited) return (FacesConfigPackage)EPackage.Registry.INSTANCE.getEPackage(FacesConfigPackage.eNS_URI);
-
-        // Obtain or create and register package
-        FacesConfigPackageImpl theFacesConfigPackage = (FacesConfigPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof FacesConfigPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new FacesConfigPackageImpl());
-
-        isInited = true;
-
-        // Initialize simple dependencies
-        XMLTypePackage.eINSTANCE.eClass();
-
-        // Create package meta-data objects
-        theFacesConfigPackage.createPackageContents();
-
-        // Initialize created meta-data
-        theFacesConfigPackage.initializePackageContents();
-
-        // Mark meta-data to indicate it can't be changed
-        theFacesConfigPackage.freeze();
-
-        return theFacesConfigPackage;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getActionListenerType() {
-        return actionListenerTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getActionListenerType_TextContent() {
-        return (EAttribute)actionListenerTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getActionListenerType_Id() {
-        return (EAttribute)actionListenerTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getApplicationFactoryType() {
-        return applicationFactoryTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getApplicationFactoryType_TextContent() {
-        return (EAttribute)applicationFactoryTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getApplicationFactoryType_Id() {
-        return (EAttribute)applicationFactoryTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getApplicationType() {
-        return applicationTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getApplicationType_ActionListener() {
-        return (EReference)applicationTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getApplicationType_DefaultRenderKitId() {
-        return (EReference)applicationTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getApplicationType_MessageBundle() {
-        return (EReference)applicationTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getApplicationType_NavigationHandler() {
-        return (EReference)applicationTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getApplicationType_ViewHandler() {
-        return (EReference)applicationTypeEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getApplicationType_StateManager() {
-        return (EReference)applicationTypeEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getApplicationType_PropertyResolver() {
-        return (EReference)applicationTypeEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getApplicationType_VariableResolver() {
-        return (EReference)applicationTypeEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getApplicationType_LocaleConfig() {
-        return (EReference)applicationTypeEClass.getEStructuralFeatures().get(8);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getApplicationType_Id() {
-        return (EAttribute)applicationTypeEClass.getEStructuralFeatures().get(9);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getApplicationType_ELResolver() {
-        return (EReference)applicationTypeEClass.getEStructuralFeatures().get(10);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getApplicationType_ResourceBundle() {
-        return (EReference)applicationTypeEClass.getEStructuralFeatures().get(11);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getApplicationType_ApplicationExtension() {
-        return (EReference)applicationTypeEClass.getEStructuralFeatures().get(12);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getAttributeClassType() {
-        return attributeClassTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getAttributeClassType_TextContent() {
-        return (EAttribute)attributeClassTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getAttributeClassType_Id() {
-        return (EAttribute)attributeClassTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getAttributeExtensionType() {
-        return attributeExtensionTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getAttributeNameType() {
-        return attributeNameTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getAttributeNameType_TextContent() {
-        return (EAttribute)attributeNameTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getAttributeNameType_Id() {
-        return (EAttribute)attributeNameTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getAttributeType() {
-        return attributeTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getAttributeType_Description() {
-        return (EReference)attributeTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getAttributeType_DisplayName() {
-        return (EReference)attributeTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getAttributeType_Icon() {
-        return (EReference)attributeTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getAttributeType_AttributeName() {
-        return (EReference)attributeTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getAttributeType_AttributeClass() {
-        return (EReference)attributeTypeEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getAttributeType_DefaultValue() {
-        return (EReference)attributeTypeEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getAttributeType_SuggestedValue() {
-        return (EReference)attributeTypeEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getAttributeType_AttributeExtension() {
-        return (EReference)attributeTypeEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getAttributeType_Id() {
-        return (EAttribute)attributeTypeEClass.getEStructuralFeatures().get(8);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getComponentClassType() {
-        return componentClassTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getComponentClassType_TextContent() {
-        return (EAttribute)componentClassTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getComponentClassType_Id() {
-        return (EAttribute)componentClassTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getComponentExtensionType() {
-        return componentExtensionTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getComponentFamilyType() {
-        return componentFamilyTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getComponentFamilyType_TextContent() {
-        return (EAttribute)componentFamilyTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getComponentFamilyType_Id() {
-        return (EAttribute)componentFamilyTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getComponentType() {
-        return componentTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getComponentType_Description() {
-        return (EReference)componentTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getComponentType_DisplayName() {
-        return (EReference)componentTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getComponentType_Icon() {
-        return (EReference)componentTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getComponentType_ComponentType() {
-        return (EReference)componentTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getComponentType_ComponentClass() {
-        return (EReference)componentTypeEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getComponentType_Facet() {
-        return (EReference)componentTypeEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getComponentType_Attribute() {
-        return (EReference)componentTypeEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getComponentType_Property() {
-        return (EReference)componentTypeEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getComponentType_ComponentExtension() {
-        return (EReference)componentTypeEClass.getEStructuralFeatures().get(8);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getComponentType_Id() {
-        return (EAttribute)componentTypeEClass.getEStructuralFeatures().get(9);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getComponentTypeType() {
-        return componentTypeTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getComponentTypeType_TextContent() {
-        return (EAttribute)componentTypeTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getComponentTypeType_Id() {
-        return (EAttribute)componentTypeTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getConverterClassType() {
-        return converterClassTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getConverterClassType_TextContent() {
-        return (EAttribute)converterClassTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getConverterClassType_Id() {
-        return (EAttribute)converterClassTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getConverterForClassType() {
-        return converterForClassTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getConverterForClassType_TextContent() {
-        return (EAttribute)converterForClassTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getConverterForClassType_Id() {
-        return (EAttribute)converterForClassTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getConverterIdType() {
-        return converterIdTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getConverterIdType_TextContent() {
-        return (EAttribute)converterIdTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getConverterIdType_Id() {
-        return (EAttribute)converterIdTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getConverterType() {
-        return converterTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getConverterType_Description() {
-        return (EReference)converterTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getConverterType_DisplayName() {
-        return (EReference)converterTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getConverterType_Icon() {
-        return (EReference)converterTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getConverterType_ConverterId() {
-        return (EReference)converterTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getConverterType_ConverterForClass() {
-        return (EReference)converterTypeEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getConverterType_ConverterClass() {
-        return (EReference)converterTypeEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getConverterType_Attribute() {
-        return (EReference)converterTypeEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getConverterType_Property() {
-        return (EReference)converterTypeEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getConverterType_ConverterExtension() {
-        return (EReference)converterTypeEClass.getEStructuralFeatures().get(8);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getConverterType_Id() {
-        return (EAttribute)converterTypeEClass.getEStructuralFeatures().get(9);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getDefaultLocaleType() {
-        return defaultLocaleTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getDefaultLocaleType_TextContent() {
-        return (EAttribute)defaultLocaleTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getDefaultLocaleType_Id() {
-        return (EAttribute)defaultLocaleTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getDefaultRenderKitIdType() {
-        return defaultRenderKitIdTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getDefaultRenderKitIdType_TextContent() {
-        return (EAttribute)defaultRenderKitIdTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getDefaultRenderKitIdType_Id() {
-        return (EAttribute)defaultRenderKitIdTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getDefaultValueType() {
-        return defaultValueTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getDefaultValueType_TextContent() {
-        return (EAttribute)defaultValueTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getDefaultValueType_Id() {
-        return (EAttribute)defaultValueTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getDescriptionType() {
-        return descriptionTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getDescriptionType_TextContent() {
-        return (EAttribute)descriptionTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getDescriptionType_Lang() {
-        return (EAttribute)descriptionTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getDescriptionType_Id() {
-        return (EAttribute)descriptionTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getDisplayNameType() {
-        return displayNameTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getDisplayNameType_TextContent() {
-        return (EAttribute)displayNameTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getDisplayNameType_Lang() {
-        return (EAttribute)displayNameTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getDisplayNameType_Id() {
-        return (EAttribute)displayNameTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getDocumentRoot() {
-        return documentRootEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getDocumentRoot_Mixed() {
-        return (EAttribute)documentRootEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_XMLNSPrefixMap() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_XSISchemaLocation() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ActionListener() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Application() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ApplicationFactory() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Attribute() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_AttributeClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_AttributeExtension() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(8);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_AttributeName() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(9);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Component() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(10);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ComponentClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(11);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ComponentExtension() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(12);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ComponentFamily() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(13);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ComponentType() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(14);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Converter() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(15);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ConverterClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(16);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ConverterForClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(17);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ConverterId() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(18);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_DefaultLocale() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(19);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_DefaultRenderKitId() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(20);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_DefaultValue() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(21);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Description() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(22);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_DisplayName() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(23);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_FacesConfig() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(24);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_FacesContextFactory() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(25);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Facet() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(26);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_FacetExtension() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(27);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_FacetName() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(28);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Factory() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(29);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_FromAction() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(30);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_FromOutcome() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(31);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_FromViewId() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(32);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Icon() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(33);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Key() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(34);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_KeyClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(35);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_LargeIcon() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(36);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Lifecycle() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(37);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_LifecycleFactory() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(38);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ListEntries() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(39);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_LocaleConfig() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(40);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ManagedBean() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(41);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ManagedBeanClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(42);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ManagedBeanName() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(43);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ManagedBeanScope() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(44);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ManagedProperty() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(45);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_MapEntries() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(46);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_MapEntry() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(47);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_MessageBundle() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(48);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_NavigationCase() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(49);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_NavigationHandler() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(50);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_NavigationRule() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(51);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_NullValue() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(52);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_PhaseListener() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(53);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Property() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(54);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_PropertyClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(55);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_PropertyExtension() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(56);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_PropertyName() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(57);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_PropertyResolver() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(58);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Redirect() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(59);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ReferencedBean() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(60);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ReferencedBeanClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(61);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ReferencedBeanName() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(62);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Renderer() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(63);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_RendererClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(64);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_RendererExtension() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(65);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_RendererType() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(66);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_RenderKit() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(67);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_RenderKitClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(68);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_RenderKitFactory() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(69);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_RenderKitId() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(70);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_SmallIcon() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(71);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_StateManager() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(72);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_SuggestedValue() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(73);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_SupportedLocale() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(74);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ToViewId() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(75);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Validator() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(76);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ValidatorClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(77);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ValidatorId() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(78);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_Value() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(79);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ValueClass() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(80);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_VariableResolver() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(81);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getDocumentRoot_ViewHandler() {
-        return (EReference)documentRootEClass.getEStructuralFeatures().get(82);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getDynamicAttribute() {
-        return dynamicAttributeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getDynamicAttribute_Name() {
-        return (EAttribute)dynamicAttributeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getDynamicAttribute_Value() {
-        return (EAttribute)dynamicAttributeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getDynamicElement() {
-        return dynamicElementEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getDynamicElement_ChildNodes() {
-        return (EReference)dynamicElementEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getDynamicElement_Attributes() {
-        return (EReference)dynamicElementEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getDynamicElement_TextContent() {
-        return (EAttribute)dynamicElementEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getELResolverType() {
-        return elResolverTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getELResolverType_TextContent() {
-        return (EAttribute)elResolverTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getELResolverType_Id() {
-        return (EAttribute)elResolverTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getDynamicElement_Name() {
-        return (EAttribute)dynamicElementEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getFacesConfigType() {
-        return facesConfigTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacesConfigType_Application() {
-        return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacesConfigType_Factory() {
-        return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacesConfigType_Component() {
-        return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacesConfigType_Converter() {
-        return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacesConfigType_ManagedBean() {
-        return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacesConfigType_NavigationRule() {
-        return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacesConfigType_ReferencedBean() {
-        return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacesConfigType_RenderKit() {
-        return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacesConfigType_Lifecycle() {
-        return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(8);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacesConfigType_Validator() {
-        return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(9);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFacesConfigType_FacesConfigExtension() {
-        return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(10);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getFacesConfigType_Xmlns() {
-        return (EAttribute)facesConfigTypeEClass.getEStructuralFeatures().get(11);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getFacesConfigType_Id() {
-        return (EAttribute)facesConfigTypeEClass.getEStructuralFeatures().get(12);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getFacesContextFactoryType() {
-        return facesContextFactoryTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getFacesContextFactoryType_TextContent() {
-        return (EAttribute)facesContextFactoryTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getFacesContextFactoryType_Id() {
-        return (EAttribute)facesContextFactoryTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getFacetExtensionType() {
-        return facetExtensionTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getFacetNameType() {
-        return facetNameTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getFacetNameType_TextContent() {
-        return (EAttribute)facetNameTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getFacetNameType_Id() {
-        return (EAttribute)facetNameTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getFacetType() {
-        return facetTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacetType_Description() {
-        return (EReference)facetTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacetType_DisplayName() {
-        return (EReference)facetTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacetType_Icon() {
-        return (EReference)facetTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacetType_FacetName() {
-        return (EReference)facetTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFacetType_FacetExtension() {
-        return (EReference)facetTypeEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getFacetType_Id() {
-        return (EAttribute)facetTypeEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getFactoryType() {
-        return factoryTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFactoryType_ApplicationFactory() {
-        return (EReference)factoryTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFactoryType_FacesContextFactory() {
-        return (EReference)factoryTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFactoryType_LifecycleFactory() {
-        return (EReference)factoryTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getFactoryType_RenderKitFactory() {
-        return (EReference)factoryTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getFactoryType_FactoryExtension() {
-        return (EReference)factoryTypeEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getFactoryType_Id() {
-        return (EAttribute)factoryTypeEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getFromActionType() {
-        return fromActionTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getFromActionType_TextContent() {
-        return (EAttribute)fromActionTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getFromActionType_Id() {
-        return (EAttribute)fromActionTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getFromOutcomeType() {
-        return fromOutcomeTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getFromOutcomeType_TextContent() {
-        return (EAttribute)fromOutcomeTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getFromOutcomeType_Id() {
-        return (EAttribute)fromOutcomeTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getFromViewIdType() {
-        return fromViewIdTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getFromViewIdType_TextContent() {
-        return (EAttribute)fromViewIdTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getFromViewIdType_Id() {
-        return (EAttribute)fromViewIdTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getIconType() {
-        return iconTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getIconType_SmallIcon() {
-        return (EReference)iconTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getIconType_LargeIcon() {
-        return (EReference)iconTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getIconType_Lang() {
-        return (EAttribute)iconTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getIconType_Id() {
-        return (EAttribute)iconTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getKeyClassType() {
-        return keyClassTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getKeyClassType_TextContent() {
-        return (EAttribute)keyClassTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getKeyClassType_Id() {
-        return (EAttribute)keyClassTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getKeyType() {
-        return keyTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getKeyType_TextContent() {
-        return (EAttribute)keyTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getKeyType_Id() {
-        return (EAttribute)keyTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getLargeIconType() {
-        return largeIconTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getLargeIconType_TextContent() {
-        return (EAttribute)largeIconTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getLargeIconType_Id() {
-        return (EAttribute)largeIconTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getLifecycleFactoryType() {
-        return lifecycleFactoryTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getLifecycleFactoryType_TextContent() {
-        return (EAttribute)lifecycleFactoryTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getLifecycleFactoryType_Id() {
-        return (EAttribute)lifecycleFactoryTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getLifecycleType() {
-        return lifecycleTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getLifecycleType_PhaseListener() {
-        return (EReference)lifecycleTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getLifecycleType_LifecycleExtension() {
-        return (EReference)lifecycleTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getLifecycleType_Id() {
-        return (EAttribute)lifecycleTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getListEntriesType() {
-        return listEntriesTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getListEntriesType_ValueClass() {
-        return (EReference)listEntriesTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getListEntriesType_NullValue() {
-        return (EReference)listEntriesTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getListEntriesType_Value() {
-        return (EReference)listEntriesTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getListEntriesType_Id() {
-        return (EAttribute)listEntriesTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getLocaleConfigType() {
-        return localeConfigTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getLocaleConfigType_DefaultLocale() {
-        return (EReference)localeConfigTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getLocaleConfigType_SupportedLocale() {
-        return (EReference)localeConfigTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getLocaleConfigType_Id() {
-        return (EAttribute)localeConfigTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getManagedBeanClassType() {
-        return managedBeanClassTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getManagedBeanClassType_TextContent() {
-        return (EAttribute)managedBeanClassTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getManagedBeanClassType_Id() {
-        return (EAttribute)managedBeanClassTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getManagedBeanNameType() {
-        return managedBeanNameTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getManagedBeanNameType_TextContent() {
-        return (EAttribute)managedBeanNameTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getManagedBeanNameType_Id() {
-        return (EAttribute)managedBeanNameTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getManagedBeanScopeType() {
-        return managedBeanScopeTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getManagedBeanScopeType_TextContent() {
-        return (EAttribute)managedBeanScopeTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getManagedBeanScopeType_Id() {
-        return (EAttribute)managedBeanScopeTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getManagedBeanType() {
-        return managedBeanTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getManagedBeanType_Description() {
-        return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getManagedBeanType_DisplayName() {
-        return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getManagedBeanType_Icon() {
-        return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getManagedBeanType_ManagedBeanName() {
-        return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getManagedBeanType_ManagedBeanClass() {
-        return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getManagedBeanType_ManagedBeanScope() {
-        return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getManagedBeanType_ManagedProperty() {
-        return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getManagedBeanType_MapEntries() {
-        return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getManagedBeanType_ListEntries() {
-        return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(8);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getManagedBeanType_ManagedBeanExtension() {
-        return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(9);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getManagedBeanType_Id() {
-        return (EAttribute)managedBeanTypeEClass.getEStructuralFeatures().get(10);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getManagedPropertyType() {
-        return managedPropertyTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getManagedPropertyType_Description() {
-        return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getManagedPropertyType_DisplayName() {
-        return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getManagedPropertyType_Icon() {
-        return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getManagedPropertyType_PropertyName() {
-        return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getManagedPropertyType_PropertyClass() {
-        return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getManagedPropertyType_MapEntries() {
-        return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getManagedPropertyType_NullValue() {
-        return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getManagedPropertyType_Value() {
-        return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getManagedPropertyType_ListEntries() {
-        return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(8);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getManagedPropertyType_Id() {
-        return (EAttribute)managedPropertyTypeEClass.getEStructuralFeatures().get(9);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getMapEntriesType() {
-        return mapEntriesTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getMapEntriesType_KeyClass() {
-        return (EReference)mapEntriesTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getMapEntriesType_ValueClass() {
-        return (EReference)mapEntriesTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getMapEntriesType_MapEntry() {
-        return (EReference)mapEntriesTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getMapEntriesType_Id() {
-        return (EAttribute)mapEntriesTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getMapEntryType() {
-        return mapEntryTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getMapEntryType_Key() {
-        return (EReference)mapEntryTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getMapEntryType_NullValue() {
-        return (EReference)mapEntryTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getMapEntryType_Value() {
-        return (EReference)mapEntryTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getMapEntryType_Id() {
-        return (EAttribute)mapEntryTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getMessageBundleType() {
-        return messageBundleTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getMessageBundleType_TextContent() {
-        return (EAttribute)messageBundleTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getMessageBundleType_Id() {
-        return (EAttribute)messageBundleTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getNavigationCaseType() {
-        return navigationCaseTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getNavigationCaseType_Description() {
-        return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getNavigationCaseType_DisplayName() {
-        return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getNavigationCaseType_Icon() {
-        return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getNavigationCaseType_FromAction() {
-        return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getNavigationCaseType_FromOutcome() {
-        return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getNavigationCaseType_ToViewId() {
-        return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getNavigationCaseType_Redirect() {
-        return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getNavigationCaseType_Id() {
-        return (EAttribute)navigationCaseTypeEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getNavigationHandlerType() {
-        return navigationHandlerTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getNavigationHandlerType_TextContent() {
-        return (EAttribute)navigationHandlerTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getNavigationHandlerType_Id() {
-        return (EAttribute)navigationHandlerTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getNavigationRuleType() {
-        return navigationRuleTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getNavigationRuleType_Description() {
-        return (EReference)navigationRuleTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getNavigationRuleType_DisplayName() {
-        return (EReference)navigationRuleTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getNavigationRuleType_Icon() {
-        return (EReference)navigationRuleTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getNavigationRuleType_FromViewId() {
-        return (EReference)navigationRuleTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getNavigationRuleType_NavigationCase() {
-        return (EReference)navigationRuleTypeEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getNavigationRuleType_NavigationRuleExtension() {
-        return (EReference)navigationRuleTypeEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getNavigationRuleType_Id() {
-        return (EAttribute)navigationRuleTypeEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getNullValueType() {
-        return nullValueTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getNullValueType_Id() {
-        return (EAttribute)nullValueTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getPhaseListenerType() {
-        return phaseListenerTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getPhaseListenerType_TextContent() {
-        return (EAttribute)phaseListenerTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getPhaseListenerType_Id() {
-        return (EAttribute)phaseListenerTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getPropertyClassType() {
-        return propertyClassTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getPropertyClassType_TextContent() {
-        return (EAttribute)propertyClassTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getPropertyClassType_Id() {
-        return (EAttribute)propertyClassTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getPropertyExtensionType() {
-        return propertyExtensionTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getPropertyNameType() {
-        return propertyNameTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getPropertyNameType_TextContent() {
-        return (EAttribute)propertyNameTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getPropertyNameType_Id() {
-        return (EAttribute)propertyNameTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getPropertyResolverType() {
-        return propertyResolverTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getPropertyResolverType_TextContent() {
-        return (EAttribute)propertyResolverTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getPropertyResolverType_Id() {
-        return (EAttribute)propertyResolverTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getPropertyType() {
-        return propertyTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getPropertyType_Description() {
-        return (EReference)propertyTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getPropertyType_DisplayName() {
-        return (EReference)propertyTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getPropertyType_Icon() {
-        return (EReference)propertyTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getPropertyType_PropertyName() {
-        return (EReference)propertyTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getPropertyType_PropertyClass() {
-        return (EReference)propertyTypeEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getPropertyType_DefaultValue() {
-        return (EReference)propertyTypeEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getPropertyType_SuggestedValue() {
-        return (EReference)propertyTypeEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getPropertyType_PropertyExtension() {
-        return (EReference)propertyTypeEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getPropertyType_Id() {
-        return (EAttribute)propertyTypeEClass.getEStructuralFeatures().get(8);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getRedirectType() {
-        return redirectTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getRedirectType_Id() {
-        return (EAttribute)redirectTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getReferencedBeanClassType() {
-        return referencedBeanClassTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getReferencedBeanClassType_TextContent() {
-        return (EAttribute)referencedBeanClassTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getReferencedBeanClassType_Id() {
-        return (EAttribute)referencedBeanClassTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getReferencedBeanNameType() {
-        return referencedBeanNameTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getReferencedBeanNameType_TextContent() {
-        return (EAttribute)referencedBeanNameTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getReferencedBeanNameType_Id() {
-        return (EAttribute)referencedBeanNameTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getReferencedBeanType() {
-        return referencedBeanTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getReferencedBeanType_Description() {
-        return (EReference)referencedBeanTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getReferencedBeanType_DisplayName() {
-        return (EReference)referencedBeanTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getReferencedBeanType_Icon() {
-        return (EReference)referencedBeanTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getReferencedBeanType_ReferencedBeanName() {
-        return (EReference)referencedBeanTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getReferencedBeanType_ReferencedBeanClass() {
-        return (EReference)referencedBeanTypeEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getReferencedBeanType_Id() {
-        return (EAttribute)referencedBeanTypeEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getRendererClassType() {
-        return rendererClassTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getRendererClassType_TextContent() {
-        return (EAttribute)rendererClassTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getRendererClassType_Id() {
-        return (EAttribute)rendererClassTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getRendererExtensionType() {
-        return rendererExtensionTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getRendererType() {
-        return rendererTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getRendererType_Description() {
-        return (EReference)rendererTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getRendererType_DisplayName() {
-        return (EReference)rendererTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getRendererType_Icon() {
-        return (EReference)rendererTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getRendererType_ComponentFamily() {
-        return (EReference)rendererTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getRendererType_RendererType() {
-        return (EReference)rendererTypeEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getRendererType_RendererClass() {
-        return (EReference)rendererTypeEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getRendererType_Facet() {
-        return (EReference)rendererTypeEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getRendererType_Attribute() {
-        return (EReference)rendererTypeEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getRendererType_RendererExtension() {
-        return (EReference)rendererTypeEClass.getEStructuralFeatures().get(8);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getRendererType_Id() {
-        return (EAttribute)rendererTypeEClass.getEStructuralFeatures().get(9);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getRendererTypeType() {
-        return rendererTypeTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getRendererTypeType_TextContent() {
-        return (EAttribute)rendererTypeTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getRendererTypeType_Id() {
-        return (EAttribute)rendererTypeTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getRenderKitClassType() {
-        return renderKitClassTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getRenderKitClassType_TextContent() {
-        return (EAttribute)renderKitClassTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getRenderKitClassType_Id() {
-        return (EAttribute)renderKitClassTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getRenderKitFactoryType() {
-        return renderKitFactoryTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getRenderKitFactoryType_TextContent() {
-        return (EAttribute)renderKitFactoryTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getRenderKitFactoryType_Id() {
-        return (EAttribute)renderKitFactoryTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getRenderKitIdType() {
-        return renderKitIdTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getRenderKitIdType_TextContent() {
-        return (EAttribute)renderKitIdTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getRenderKitIdType_Id() {
-        return (EAttribute)renderKitIdTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getRenderKitType() {
-        return renderKitTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getRenderKitType_Description() {
-        return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getRenderKitType_DisplayName() {
-        return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getRenderKitType_Icon() {
-        return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getRenderKitType_RenderKitId() {
-        return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getRenderKitType_RenderKitClass() {
-        return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getRenderKitType_Renderer() {
-        return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getRenderKitType_RenderKitExtension() {
-        return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getRenderKitType_Id() {
-        return (EAttribute)renderKitTypeEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getSmallIconType() {
-        return smallIconTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getSmallIconType_TextContent() {
-        return (EAttribute)smallIconTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getSmallIconType_Id() {
-        return (EAttribute)smallIconTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getStateManagerType() {
-        return stateManagerTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getStateManagerType_TextContent() {
-        return (EAttribute)stateManagerTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getStateManagerType_Id() {
-        return (EAttribute)stateManagerTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getSuggestedValueType() {
-        return suggestedValueTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getSuggestedValueType_TextContent() {
-        return (EAttribute)suggestedValueTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getSuggestedValueType_Id() {
-        return (EAttribute)suggestedValueTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getSupportedLocaleType() {
-        return supportedLocaleTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getSupportedLocaleType_TextContent() {
-        return (EAttribute)supportedLocaleTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getSupportedLocaleType_Id() {
-        return (EAttribute)supportedLocaleTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getToViewIdType() {
-        return toViewIdTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getToViewIdType_TextContent() {
-        return (EAttribute)toViewIdTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getToViewIdType_Id() {
-        return (EAttribute)toViewIdTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getValidatorClassType() {
-        return validatorClassTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getValidatorClassType_TextContent() {
-        return (EAttribute)validatorClassTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getValidatorClassType_Id() {
-        return (EAttribute)validatorClassTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getValidatorIdType() {
-        return validatorIdTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getValidatorIdType_TextContent() {
-        return (EAttribute)validatorIdTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getValidatorIdType_Id() {
-        return (EAttribute)validatorIdTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getValidatorType() {
-        return validatorTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getValidatorType_Description() {
-        return (EReference)validatorTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getValidatorType_DisplayName() {
-        return (EReference)validatorTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getValidatorType_Icon() {
-        return (EReference)validatorTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getValidatorType_ValidatorId() {
-        return (EReference)validatorTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getValidatorType_ValidatorClass() {
-        return (EReference)validatorTypeEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getValidatorType_Attribute() {
-        return (EReference)validatorTypeEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EReference getValidatorType_Property() {
-        return (EReference)validatorTypeEClass.getEStructuralFeatures().get(6);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getValidatorType_ValidatorExtension() {
-        return (EReference)validatorTypeEClass.getEStructuralFeatures().get(7);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getValidatorType_Id() {
-        return (EAttribute)validatorTypeEClass.getEStructuralFeatures().get(8);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getValueClassType() {
-        return valueClassTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getValueClassType_TextContent() {
-        return (EAttribute)valueClassTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getValueClassType_Id() {
-        return (EAttribute)valueClassTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getValueType() {
-        return valueTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getValueType_TextContent() {
-        return (EAttribute)valueTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getValueType_Id() {
-        return (EAttribute)valueTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getVariableResolverType() {
-        return variableResolverTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getVariableResolverType_TextContent() {
-        return (EAttribute)variableResolverTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getVariableResolverType_Id() {
-        return (EAttribute)variableResolverTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EClass getViewHandlerType() {
-        return viewHandlerTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getViewHandlerType_TextContent() {
-        return (EAttribute)viewHandlerTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EAttribute getViewHandlerType_Id() {
-        return (EAttribute)viewHandlerTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getResourceBundleType() {
-        return resourceBundleTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getResourceBundleType_Description() {
-        return (EReference)resourceBundleTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getResourceBundleType_DisplayName() {
-        return (EReference)resourceBundleTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getResourceBundleType_Icon() {
-        return (EReference)resourceBundleTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getResourceBundleType_BaseName() {
-        return (EReference)resourceBundleTypeEClass.getEStructuralFeatures().get(3);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getResourceBundleType_Var() {
-        return (EReference)resourceBundleTypeEClass.getEStructuralFeatures().get(4);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getResourceBundleType_Id() {
-        return (EAttribute)resourceBundleTypeEClass.getEStructuralFeatures().get(5);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getBaseNameType() {
-        return baseNameTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getBaseNameType_TextContent() {
-        return (EAttribute)baseNameTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getBaseNameType_Id() {
-        return (EAttribute)baseNameTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getVarType() {
-        return varTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getVarType_TextContent() {
-        return (EAttribute)varTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getVarType_Id() {
-        return (EAttribute)varTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getRenderKitExtensionType() {
-        return renderKitExtensionTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getNavigationRuleExtensionType() {
-        return navigationRuleExtensionTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getValidatorExtensionType() {
-        return validatorExtensionTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFacesConfigExtensionType() {
-        return facesConfigExtensionTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getFactoryExtensionType() {
-        return factoryExtensionTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getLifecycleExtensionType() {
-        return lifecycleExtensionTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getManagedBeanExtensionType() {
-        return managedBeanExtensionTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getConverterExtensionType() {
-        return converterExtensionTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getExtensionType() {
-        return extensionTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EReference getExtensionType_ChildNodes() {
-        return (EReference)extensionTypeEClass.getEStructuralFeatures().get(0);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getExtensionType_TextContent() {
-        return (EAttribute)extensionTypeEClass.getEStructuralFeatures().get(1);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EAttribute getExtensionType_Id() {
-        return (EAttribute)extensionTypeEClass.getEStructuralFeatures().get(2);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EClass getApplicationExtensionType() {
-        return applicationExtensionTypeEClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public FacesConfigFactory getFacesConfigFactory() {
-        return (FacesConfigFactory)getEFactoryInstance();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private boolean isCreated = false;
-
-    /**
-     * Creates the meta-model objects for the package.  This method is
-     * guarded to have no affect on any invocation but its first.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void createPackageContents() {
-        if (isCreated) return;
-        isCreated = true;
-
-        // Create classes and their features
-        actionListenerTypeEClass = createEClass(ACTION_LISTENER_TYPE);
-        createEAttribute(actionListenerTypeEClass, ACTION_LISTENER_TYPE__TEXT_CONTENT);
-        createEAttribute(actionListenerTypeEClass, ACTION_LISTENER_TYPE__ID);
-
-        applicationFactoryTypeEClass = createEClass(APPLICATION_FACTORY_TYPE);
-        createEAttribute(applicationFactoryTypeEClass, APPLICATION_FACTORY_TYPE__TEXT_CONTENT);
-        createEAttribute(applicationFactoryTypeEClass, APPLICATION_FACTORY_TYPE__ID);
-
-        applicationTypeEClass = createEClass(APPLICATION_TYPE);
-        createEReference(applicationTypeEClass, APPLICATION_TYPE__ACTION_LISTENER);
-        createEReference(applicationTypeEClass, APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID);
-        createEReference(applicationTypeEClass, APPLICATION_TYPE__MESSAGE_BUNDLE);
-        createEReference(applicationTypeEClass, APPLICATION_TYPE__NAVIGATION_HANDLER);
-        createEReference(applicationTypeEClass, APPLICATION_TYPE__VIEW_HANDLER);
-        createEReference(applicationTypeEClass, APPLICATION_TYPE__STATE_MANAGER);
-        createEReference(applicationTypeEClass, APPLICATION_TYPE__PROPERTY_RESOLVER);
-        createEReference(applicationTypeEClass, APPLICATION_TYPE__VARIABLE_RESOLVER);
-        createEReference(applicationTypeEClass, APPLICATION_TYPE__LOCALE_CONFIG);
-        createEAttribute(applicationTypeEClass, APPLICATION_TYPE__ID);
-        createEReference(applicationTypeEClass, APPLICATION_TYPE__EL_RESOLVER);
-        createEReference(applicationTypeEClass, APPLICATION_TYPE__RESOURCE_BUNDLE);
-        createEReference(applicationTypeEClass, APPLICATION_TYPE__APPLICATION_EXTENSION);
-
-        attributeClassTypeEClass = createEClass(ATTRIBUTE_CLASS_TYPE);
-        createEAttribute(attributeClassTypeEClass, ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT);
-        createEAttribute(attributeClassTypeEClass, ATTRIBUTE_CLASS_TYPE__ID);
-
-        attributeExtensionTypeEClass = createEClass(ATTRIBUTE_EXTENSION_TYPE);
-
-        attributeNameTypeEClass = createEClass(ATTRIBUTE_NAME_TYPE);
-        createEAttribute(attributeNameTypeEClass, ATTRIBUTE_NAME_TYPE__TEXT_CONTENT);
-        createEAttribute(attributeNameTypeEClass, ATTRIBUTE_NAME_TYPE__ID);
-
-        attributeTypeEClass = createEClass(ATTRIBUTE_TYPE);
-        createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__DESCRIPTION);
-        createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__DISPLAY_NAME);
-        createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__ICON);
-        createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__ATTRIBUTE_NAME);
-        createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__ATTRIBUTE_CLASS);
-        createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__DEFAULT_VALUE);
-        createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__SUGGESTED_VALUE);
-        createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION);
-        createEAttribute(attributeTypeEClass, ATTRIBUTE_TYPE__ID);
-
-        componentClassTypeEClass = createEClass(COMPONENT_CLASS_TYPE);
-        createEAttribute(componentClassTypeEClass, COMPONENT_CLASS_TYPE__TEXT_CONTENT);
-        createEAttribute(componentClassTypeEClass, COMPONENT_CLASS_TYPE__ID);
-
-        componentExtensionTypeEClass = createEClass(COMPONENT_EXTENSION_TYPE);
-
-        componentFamilyTypeEClass = createEClass(COMPONENT_FAMILY_TYPE);
-        createEAttribute(componentFamilyTypeEClass, COMPONENT_FAMILY_TYPE__TEXT_CONTENT);
-        createEAttribute(componentFamilyTypeEClass, COMPONENT_FAMILY_TYPE__ID);
-
-        componentTypeEClass = createEClass(COMPONENT_TYPE);
-        createEReference(componentTypeEClass, COMPONENT_TYPE__DESCRIPTION);
-        createEReference(componentTypeEClass, COMPONENT_TYPE__DISPLAY_NAME);
-        createEReference(componentTypeEClass, COMPONENT_TYPE__ICON);
-        createEReference(componentTypeEClass, COMPONENT_TYPE__COMPONENT_TYPE);
-        createEReference(componentTypeEClass, COMPONENT_TYPE__COMPONENT_CLASS);
-        createEReference(componentTypeEClass, COMPONENT_TYPE__FACET);
-        createEReference(componentTypeEClass, COMPONENT_TYPE__ATTRIBUTE);
-        createEReference(componentTypeEClass, COMPONENT_TYPE__PROPERTY);
-        createEReference(componentTypeEClass, COMPONENT_TYPE__COMPONENT_EXTENSION);
-        createEAttribute(componentTypeEClass, COMPONENT_TYPE__ID);
-
-        componentTypeTypeEClass = createEClass(COMPONENT_TYPE_TYPE);
-        createEAttribute(componentTypeTypeEClass, COMPONENT_TYPE_TYPE__TEXT_CONTENT);
-        createEAttribute(componentTypeTypeEClass, COMPONENT_TYPE_TYPE__ID);
-
-        converterClassTypeEClass = createEClass(CONVERTER_CLASS_TYPE);
-        createEAttribute(converterClassTypeEClass, CONVERTER_CLASS_TYPE__TEXT_CONTENT);
-        createEAttribute(converterClassTypeEClass, CONVERTER_CLASS_TYPE__ID);
-
-        converterForClassTypeEClass = createEClass(CONVERTER_FOR_CLASS_TYPE);
-        createEAttribute(converterForClassTypeEClass, CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT);
-        createEAttribute(converterForClassTypeEClass, CONVERTER_FOR_CLASS_TYPE__ID);
-
-        converterIdTypeEClass = createEClass(CONVERTER_ID_TYPE);
-        createEAttribute(converterIdTypeEClass, CONVERTER_ID_TYPE__TEXT_CONTENT);
-        createEAttribute(converterIdTypeEClass, CONVERTER_ID_TYPE__ID);
-
-        converterTypeEClass = createEClass(CONVERTER_TYPE);
-        createEReference(converterTypeEClass, CONVERTER_TYPE__DESCRIPTION);
-        createEReference(converterTypeEClass, CONVERTER_TYPE__DISPLAY_NAME);
-        createEReference(converterTypeEClass, CONVERTER_TYPE__ICON);
-        createEReference(converterTypeEClass, CONVERTER_TYPE__CONVERTER_ID);
-        createEReference(converterTypeEClass, CONVERTER_TYPE__CONVERTER_FOR_CLASS);
-        createEReference(converterTypeEClass, CONVERTER_TYPE__CONVERTER_CLASS);
-        createEReference(converterTypeEClass, CONVERTER_TYPE__ATTRIBUTE);
-        createEReference(converterTypeEClass, CONVERTER_TYPE__PROPERTY);
-        createEReference(converterTypeEClass, CONVERTER_TYPE__CONVERTER_EXTENSION);
-        createEAttribute(converterTypeEClass, CONVERTER_TYPE__ID);
-
-        defaultLocaleTypeEClass = createEClass(DEFAULT_LOCALE_TYPE);
-        createEAttribute(defaultLocaleTypeEClass, DEFAULT_LOCALE_TYPE__TEXT_CONTENT);
-        createEAttribute(defaultLocaleTypeEClass, DEFAULT_LOCALE_TYPE__ID);
-
-        defaultRenderKitIdTypeEClass = createEClass(DEFAULT_RENDER_KIT_ID_TYPE);
-        createEAttribute(defaultRenderKitIdTypeEClass, DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT);
-        createEAttribute(defaultRenderKitIdTypeEClass, DEFAULT_RENDER_KIT_ID_TYPE__ID);
-
-        defaultValueTypeEClass = createEClass(DEFAULT_VALUE_TYPE);
-        createEAttribute(defaultValueTypeEClass, DEFAULT_VALUE_TYPE__TEXT_CONTENT);
-        createEAttribute(defaultValueTypeEClass, DEFAULT_VALUE_TYPE__ID);
-
-        descriptionTypeEClass = createEClass(DESCRIPTION_TYPE);
-        createEAttribute(descriptionTypeEClass, DESCRIPTION_TYPE__TEXT_CONTENT);
-        createEAttribute(descriptionTypeEClass, DESCRIPTION_TYPE__LANG);
-        createEAttribute(descriptionTypeEClass, DESCRIPTION_TYPE__ID);
-
-        displayNameTypeEClass = createEClass(DISPLAY_NAME_TYPE);
-        createEAttribute(displayNameTypeEClass, DISPLAY_NAME_TYPE__TEXT_CONTENT);
-        createEAttribute(displayNameTypeEClass, DISPLAY_NAME_TYPE__LANG);
-        createEAttribute(displayNameTypeEClass, DISPLAY_NAME_TYPE__ID);
-
-        documentRootEClass = createEClass(DOCUMENT_ROOT);
-        createEAttribute(documentRootEClass, DOCUMENT_ROOT__MIXED);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__XMLNS_PREFIX_MAP);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__XSI_SCHEMA_LOCATION);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__ACTION_LISTENER);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__APPLICATION);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__APPLICATION_FACTORY);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__ATTRIBUTE);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__ATTRIBUTE_CLASS);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__ATTRIBUTE_EXTENSION);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__ATTRIBUTE_NAME);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__COMPONENT);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__COMPONENT_CLASS);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__COMPONENT_EXTENSION);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__COMPONENT_FAMILY);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__COMPONENT_TYPE);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__CONVERTER);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__CONVERTER_CLASS);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__CONVERTER_FOR_CLASS);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__CONVERTER_ID);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__DEFAULT_LOCALE);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__DEFAULT_VALUE);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__DESCRIPTION);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__DISPLAY_NAME);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__FACES_CONFIG);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__FACES_CONTEXT_FACTORY);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__FACET);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__FACET_EXTENSION);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__FACET_NAME);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__FACTORY);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__FROM_ACTION);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__FROM_OUTCOME);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__FROM_VIEW_ID);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__ICON);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__KEY);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__KEY_CLASS);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__LARGE_ICON);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__LIFECYCLE);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__LIFECYCLE_FACTORY);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__LIST_ENTRIES);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__LOCALE_CONFIG);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__MANAGED_BEAN);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__MANAGED_BEAN_CLASS);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__MANAGED_BEAN_NAME);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__MANAGED_BEAN_SCOPE);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__MANAGED_PROPERTY);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__MAP_ENTRIES);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__MAP_ENTRY);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__MESSAGE_BUNDLE);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__NAVIGATION_CASE);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__NAVIGATION_HANDLER);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__NAVIGATION_RULE);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__NULL_VALUE);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__PHASE_LISTENER);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__PROPERTY);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__PROPERTY_CLASS);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__PROPERTY_EXTENSION);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__PROPERTY_NAME);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__PROPERTY_RESOLVER);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__REDIRECT);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__REFERENCED_BEAN);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__REFERENCED_BEAN_CLASS);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__REFERENCED_BEAN_NAME);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__RENDERER);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__RENDERER_CLASS);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__RENDERER_EXTENSION);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__RENDERER_TYPE);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__RENDER_KIT);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__RENDER_KIT_CLASS);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__RENDER_KIT_FACTORY);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__RENDER_KIT_ID);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__SMALL_ICON);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__STATE_MANAGER);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__SUGGESTED_VALUE);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__SUPPORTED_LOCALE);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__TO_VIEW_ID);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__VALIDATOR);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__VALIDATOR_CLASS);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__VALIDATOR_ID);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__VALUE);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__VALUE_CLASS);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__VARIABLE_RESOLVER);
-        createEReference(documentRootEClass, DOCUMENT_ROOT__VIEW_HANDLER);
-
-        dynamicAttributeEClass = createEClass(DYNAMIC_ATTRIBUTE);
-        createEAttribute(dynamicAttributeEClass, DYNAMIC_ATTRIBUTE__NAME);
-        createEAttribute(dynamicAttributeEClass, DYNAMIC_ATTRIBUTE__VALUE);
-
-        dynamicElementEClass = createEClass(DYNAMIC_ELEMENT);
-        createEReference(dynamicElementEClass, DYNAMIC_ELEMENT__CHILD_NODES);
-        createEAttribute(dynamicElementEClass, DYNAMIC_ELEMENT__NAME);
-        createEReference(dynamicElementEClass, DYNAMIC_ELEMENT__ATTRIBUTES);
-        createEAttribute(dynamicElementEClass, DYNAMIC_ELEMENT__TEXT_CONTENT);
-
-        facesConfigTypeEClass = createEClass(FACES_CONFIG_TYPE);
-        createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__APPLICATION);
-        createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__FACTORY);
-        createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__COMPONENT);
-        createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__CONVERTER);
-        createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__MANAGED_BEAN);
-        createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__NAVIGATION_RULE);
-        createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__REFERENCED_BEAN);
-        createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__RENDER_KIT);
-        createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__LIFECYCLE);
-        createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__VALIDATOR);
-        createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION);
-        createEAttribute(facesConfigTypeEClass, FACES_CONFIG_TYPE__XMLNS);
-        createEAttribute(facesConfigTypeEClass, FACES_CONFIG_TYPE__ID);
-
-        facesContextFactoryTypeEClass = createEClass(FACES_CONTEXT_FACTORY_TYPE);
-        createEAttribute(facesContextFactoryTypeEClass, FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT);
-        createEAttribute(facesContextFactoryTypeEClass, FACES_CONTEXT_FACTORY_TYPE__ID);
-
-        facetExtensionTypeEClass = createEClass(FACET_EXTENSION_TYPE);
-
-        facetNameTypeEClass = createEClass(FACET_NAME_TYPE);
-        createEAttribute(facetNameTypeEClass, FACET_NAME_TYPE__TEXT_CONTENT);
-        createEAttribute(facetNameTypeEClass, FACET_NAME_TYPE__ID);
-
-        facetTypeEClass = createEClass(FACET_TYPE);
-        createEReference(facetTypeEClass, FACET_TYPE__DESCRIPTION);
-        createEReference(facetTypeEClass, FACET_TYPE__DISPLAY_NAME);
-        createEReference(facetTypeEClass, FACET_TYPE__ICON);
-        createEReference(facetTypeEClass, FACET_TYPE__FACET_NAME);
-        createEReference(facetTypeEClass, FACET_TYPE__FACET_EXTENSION);
-        createEAttribute(facetTypeEClass, FACET_TYPE__ID);
-
-        factoryTypeEClass = createEClass(FACTORY_TYPE);
-        createEReference(factoryTypeEClass, FACTORY_TYPE__APPLICATION_FACTORY);
-        createEReference(factoryTypeEClass, FACTORY_TYPE__FACES_CONTEXT_FACTORY);
-        createEReference(factoryTypeEClass, FACTORY_TYPE__LIFECYCLE_FACTORY);
-        createEReference(factoryTypeEClass, FACTORY_TYPE__RENDER_KIT_FACTORY);
-        createEReference(factoryTypeEClass, FACTORY_TYPE__FACTORY_EXTENSION);
-        createEAttribute(factoryTypeEClass, FACTORY_TYPE__ID);
-
-        fromActionTypeEClass = createEClass(FROM_ACTION_TYPE);
-        createEAttribute(fromActionTypeEClass, FROM_ACTION_TYPE__TEXT_CONTENT);
-        createEAttribute(fromActionTypeEClass, FROM_ACTION_TYPE__ID);
-
-        fromOutcomeTypeEClass = createEClass(FROM_OUTCOME_TYPE);
-        createEAttribute(fromOutcomeTypeEClass, FROM_OUTCOME_TYPE__TEXT_CONTENT);
-        createEAttribute(fromOutcomeTypeEClass, FROM_OUTCOME_TYPE__ID);
-
-        fromViewIdTypeEClass = createEClass(FROM_VIEW_ID_TYPE);
-        createEAttribute(fromViewIdTypeEClass, FROM_VIEW_ID_TYPE__TEXT_CONTENT);
-        createEAttribute(fromViewIdTypeEClass, FROM_VIEW_ID_TYPE__ID);
-
-        iconTypeEClass = createEClass(ICON_TYPE);
-        createEReference(iconTypeEClass, ICON_TYPE__SMALL_ICON);
-        createEReference(iconTypeEClass, ICON_TYPE__LARGE_ICON);
-        createEAttribute(iconTypeEClass, ICON_TYPE__LANG);
-        createEAttribute(iconTypeEClass, ICON_TYPE__ID);
-
-        keyClassTypeEClass = createEClass(KEY_CLASS_TYPE);
-        createEAttribute(keyClassTypeEClass, KEY_CLASS_TYPE__TEXT_CONTENT);
-        createEAttribute(keyClassTypeEClass, KEY_CLASS_TYPE__ID);
-
-        keyTypeEClass = createEClass(KEY_TYPE);
-        createEAttribute(keyTypeEClass, KEY_TYPE__TEXT_CONTENT);
-        createEAttribute(keyTypeEClass, KEY_TYPE__ID);
-
-        largeIconTypeEClass = createEClass(LARGE_ICON_TYPE);
-        createEAttribute(largeIconTypeEClass, LARGE_ICON_TYPE__TEXT_CONTENT);
-        createEAttribute(largeIconTypeEClass, LARGE_ICON_TYPE__ID);
-
-        lifecycleFactoryTypeEClass = createEClass(LIFECYCLE_FACTORY_TYPE);
-        createEAttribute(lifecycleFactoryTypeEClass, LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT);
-        createEAttribute(lifecycleFactoryTypeEClass, LIFECYCLE_FACTORY_TYPE__ID);
-
-        lifecycleTypeEClass = createEClass(LIFECYCLE_TYPE);
-        createEReference(lifecycleTypeEClass, LIFECYCLE_TYPE__PHASE_LISTENER);
-        createEReference(lifecycleTypeEClass, LIFECYCLE_TYPE__LIFECYCLE_EXTENSION);
-        createEAttribute(lifecycleTypeEClass, LIFECYCLE_TYPE__ID);
-
-        listEntriesTypeEClass = createEClass(LIST_ENTRIES_TYPE);
-        createEReference(listEntriesTypeEClass, LIST_ENTRIES_TYPE__VALUE_CLASS);
-        createEReference(listEntriesTypeEClass, LIST_ENTRIES_TYPE__NULL_VALUE);
-        createEReference(listEntriesTypeEClass, LIST_ENTRIES_TYPE__VALUE);
-        createEAttribute(listEntriesTypeEClass, LIST_ENTRIES_TYPE__ID);
-
-        localeConfigTypeEClass = createEClass(LOCALE_CONFIG_TYPE);
-        createEReference(localeConfigTypeEClass, LOCALE_CONFIG_TYPE__DEFAULT_LOCALE);
-        createEReference(localeConfigTypeEClass, LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE);
-        createEAttribute(localeConfigTypeEClass, LOCALE_CONFIG_TYPE__ID);
-
-        managedBeanClassTypeEClass = createEClass(MANAGED_BEAN_CLASS_TYPE);
-        createEAttribute(managedBeanClassTypeEClass, MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT);
-        createEAttribute(managedBeanClassTypeEClass, MANAGED_BEAN_CLASS_TYPE__ID);
-
-        managedBeanNameTypeEClass = createEClass(MANAGED_BEAN_NAME_TYPE);
-        createEAttribute(managedBeanNameTypeEClass, MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT);
-        createEAttribute(managedBeanNameTypeEClass, MANAGED_BEAN_NAME_TYPE__ID);
-
-        managedBeanScopeTypeEClass = createEClass(MANAGED_BEAN_SCOPE_TYPE);
-        createEAttribute(managedBeanScopeTypeEClass, MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT);
-        createEAttribute(managedBeanScopeTypeEClass, MANAGED_BEAN_SCOPE_TYPE__ID);
-
-        managedBeanTypeEClass = createEClass(MANAGED_BEAN_TYPE);
-        createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__DESCRIPTION);
-        createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__DISPLAY_NAME);
-        createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__ICON);
-        createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME);
-        createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS);
-        createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE);
-        createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__MANAGED_PROPERTY);
-        createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__MAP_ENTRIES);
-        createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__LIST_ENTRIES);
-        createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION);
-        createEAttribute(managedBeanTypeEClass, MANAGED_BEAN_TYPE__ID);
-
-        managedPropertyTypeEClass = createEClass(MANAGED_PROPERTY_TYPE);
-        createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__DESCRIPTION);
-        createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__DISPLAY_NAME);
-        createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__ICON);
-        createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__PROPERTY_NAME);
-        createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__PROPERTY_CLASS);
-        createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__MAP_ENTRIES);
-        createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__NULL_VALUE);
-        createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__VALUE);
-        createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__LIST_ENTRIES);
-        createEAttribute(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__ID);
-
-        mapEntriesTypeEClass = createEClass(MAP_ENTRIES_TYPE);
-        createEReference(mapEntriesTypeEClass, MAP_ENTRIES_TYPE__KEY_CLASS);
-        createEReference(mapEntriesTypeEClass, MAP_ENTRIES_TYPE__VALUE_CLASS);
-        createEReference(mapEntriesTypeEClass, MAP_ENTRIES_TYPE__MAP_ENTRY);
-        createEAttribute(mapEntriesTypeEClass, MAP_ENTRIES_TYPE__ID);
-
-        mapEntryTypeEClass = createEClass(MAP_ENTRY_TYPE);
-        createEReference(mapEntryTypeEClass, MAP_ENTRY_TYPE__KEY);
-        createEReference(mapEntryTypeEClass, MAP_ENTRY_TYPE__NULL_VALUE);
-        createEReference(mapEntryTypeEClass, MAP_ENTRY_TYPE__VALUE);
-        createEAttribute(mapEntryTypeEClass, MAP_ENTRY_TYPE__ID);
-
-        messageBundleTypeEClass = createEClass(MESSAGE_BUNDLE_TYPE);
-        createEAttribute(messageBundleTypeEClass, MESSAGE_BUNDLE_TYPE__TEXT_CONTENT);
-        createEAttribute(messageBundleTypeEClass, MESSAGE_BUNDLE_TYPE__ID);
-
-        navigationCaseTypeEClass = createEClass(NAVIGATION_CASE_TYPE);
-        createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__DESCRIPTION);
-        createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__DISPLAY_NAME);
-        createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__ICON);
-        createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__FROM_ACTION);
-        createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__FROM_OUTCOME);
-        createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__TO_VIEW_ID);
-        createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__REDIRECT);
-        createEAttribute(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__ID);
-
-        navigationHandlerTypeEClass = createEClass(NAVIGATION_HANDLER_TYPE);
-        createEAttribute(navigationHandlerTypeEClass, NAVIGATION_HANDLER_TYPE__TEXT_CONTENT);
-        createEAttribute(navigationHandlerTypeEClass, NAVIGATION_HANDLER_TYPE__ID);
-
-        navigationRuleTypeEClass = createEClass(NAVIGATION_RULE_TYPE);
-        createEReference(navigationRuleTypeEClass, NAVIGATION_RULE_TYPE__DESCRIPTION);
-        createEReference(navigationRuleTypeEClass, NAVIGATION_RULE_TYPE__DISPLAY_NAME);
-        createEReference(navigationRuleTypeEClass, NAVIGATION_RULE_TYPE__ICON);
-        createEReference(navigationRuleTypeEClass, NAVIGATION_RULE_TYPE__FROM_VIEW_ID);
-        createEReference(navigationRuleTypeEClass, NAVIGATION_RULE_TYPE__NAVIGATION_CASE);
-        createEReference(navigationRuleTypeEClass, NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION);
-        createEAttribute(navigationRuleTypeEClass, NAVIGATION_RULE_TYPE__ID);
-
-        nullValueTypeEClass = createEClass(NULL_VALUE_TYPE);
-        createEAttribute(nullValueTypeEClass, NULL_VALUE_TYPE__ID);
-
-        phaseListenerTypeEClass = createEClass(PHASE_LISTENER_TYPE);
-        createEAttribute(phaseListenerTypeEClass, PHASE_LISTENER_TYPE__TEXT_CONTENT);
-        createEAttribute(phaseListenerTypeEClass, PHASE_LISTENER_TYPE__ID);
-
-        propertyClassTypeEClass = createEClass(PROPERTY_CLASS_TYPE);
-        createEAttribute(propertyClassTypeEClass, PROPERTY_CLASS_TYPE__TEXT_CONTENT);
-        createEAttribute(propertyClassTypeEClass, PROPERTY_CLASS_TYPE__ID);
-
-        propertyExtensionTypeEClass = createEClass(PROPERTY_EXTENSION_TYPE);
-
-        propertyNameTypeEClass = createEClass(PROPERTY_NAME_TYPE);
-        createEAttribute(propertyNameTypeEClass, PROPERTY_NAME_TYPE__TEXT_CONTENT);
-        createEAttribute(propertyNameTypeEClass, PROPERTY_NAME_TYPE__ID);
-
-        propertyResolverTypeEClass = createEClass(PROPERTY_RESOLVER_TYPE);
-        createEAttribute(propertyResolverTypeEClass, PROPERTY_RESOLVER_TYPE__TEXT_CONTENT);
-        createEAttribute(propertyResolverTypeEClass, PROPERTY_RESOLVER_TYPE__ID);
-
-        propertyTypeEClass = createEClass(PROPERTY_TYPE);
-        createEReference(propertyTypeEClass, PROPERTY_TYPE__DESCRIPTION);
-        createEReference(propertyTypeEClass, PROPERTY_TYPE__DISPLAY_NAME);
-        createEReference(propertyTypeEClass, PROPERTY_TYPE__ICON);
-        createEReference(propertyTypeEClass, PROPERTY_TYPE__PROPERTY_NAME);
-        createEReference(propertyTypeEClass, PROPERTY_TYPE__PROPERTY_CLASS);
-        createEReference(propertyTypeEClass, PROPERTY_TYPE__DEFAULT_VALUE);
-        createEReference(propertyTypeEClass, PROPERTY_TYPE__SUGGESTED_VALUE);
-        createEReference(propertyTypeEClass, PROPERTY_TYPE__PROPERTY_EXTENSION);
-        createEAttribute(propertyTypeEClass, PROPERTY_TYPE__ID);
-
-        redirectTypeEClass = createEClass(REDIRECT_TYPE);
-        createEAttribute(redirectTypeEClass, REDIRECT_TYPE__ID);
-
-        referencedBeanClassTypeEClass = createEClass(REFERENCED_BEAN_CLASS_TYPE);
-        createEAttribute(referencedBeanClassTypeEClass, REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT);
-        createEAttribute(referencedBeanClassTypeEClass, REFERENCED_BEAN_CLASS_TYPE__ID);
-
-        referencedBeanNameTypeEClass = createEClass(REFERENCED_BEAN_NAME_TYPE);
-        createEAttribute(referencedBeanNameTypeEClass, REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT);
-        createEAttribute(referencedBeanNameTypeEClass, REFERENCED_BEAN_NAME_TYPE__ID);
-
-        referencedBeanTypeEClass = createEClass(REFERENCED_BEAN_TYPE);
-        createEReference(referencedBeanTypeEClass, REFERENCED_BEAN_TYPE__DESCRIPTION);
-        createEReference(referencedBeanTypeEClass, REFERENCED_BEAN_TYPE__DISPLAY_NAME);
-        createEReference(referencedBeanTypeEClass, REFERENCED_BEAN_TYPE__ICON);
-        createEReference(referencedBeanTypeEClass, REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME);
-        createEReference(referencedBeanTypeEClass, REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS);
-        createEAttribute(referencedBeanTypeEClass, REFERENCED_BEAN_TYPE__ID);
-
-        rendererClassTypeEClass = createEClass(RENDERER_CLASS_TYPE);
-        createEAttribute(rendererClassTypeEClass, RENDERER_CLASS_TYPE__TEXT_CONTENT);
-        createEAttribute(rendererClassTypeEClass, RENDERER_CLASS_TYPE__ID);
-
-        rendererExtensionTypeEClass = createEClass(RENDERER_EXTENSION_TYPE);
-
-        rendererTypeEClass = createEClass(RENDERER_TYPE);
-        createEReference(rendererTypeEClass, RENDERER_TYPE__DESCRIPTION);
-        createEReference(rendererTypeEClass, RENDERER_TYPE__DISPLAY_NAME);
-        createEReference(rendererTypeEClass, RENDERER_TYPE__ICON);
-        createEReference(rendererTypeEClass, RENDERER_TYPE__COMPONENT_FAMILY);
-        createEReference(rendererTypeEClass, RENDERER_TYPE__RENDERER_TYPE);
-        createEReference(rendererTypeEClass, RENDERER_TYPE__RENDERER_CLASS);
-        createEReference(rendererTypeEClass, RENDERER_TYPE__FACET);
-        createEReference(rendererTypeEClass, RENDERER_TYPE__ATTRIBUTE);
-        createEReference(rendererTypeEClass, RENDERER_TYPE__RENDERER_EXTENSION);
-        createEAttribute(rendererTypeEClass, RENDERER_TYPE__ID);
-
-        rendererTypeTypeEClass = createEClass(RENDERER_TYPE_TYPE);
-        createEAttribute(rendererTypeTypeEClass, RENDERER_TYPE_TYPE__TEXT_CONTENT);
-        createEAttribute(rendererTypeTypeEClass, RENDERER_TYPE_TYPE__ID);
-
-        renderKitClassTypeEClass = createEClass(RENDER_KIT_CLASS_TYPE);
-        createEAttribute(renderKitClassTypeEClass, RENDER_KIT_CLASS_TYPE__TEXT_CONTENT);
-        createEAttribute(renderKitClassTypeEClass, RENDER_KIT_CLASS_TYPE__ID);
-
-        renderKitFactoryTypeEClass = createEClass(RENDER_KIT_FACTORY_TYPE);
-        createEAttribute(renderKitFactoryTypeEClass, RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT);
-        createEAttribute(renderKitFactoryTypeEClass, RENDER_KIT_FACTORY_TYPE__ID);
-
-        renderKitIdTypeEClass = createEClass(RENDER_KIT_ID_TYPE);
-        createEAttribute(renderKitIdTypeEClass, RENDER_KIT_ID_TYPE__TEXT_CONTENT);
-        createEAttribute(renderKitIdTypeEClass, RENDER_KIT_ID_TYPE__ID);
-
-        renderKitTypeEClass = createEClass(RENDER_KIT_TYPE);
-        createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__DESCRIPTION);
-        createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__DISPLAY_NAME);
-        createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__ICON);
-        createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__RENDER_KIT_ID);
-        createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__RENDER_KIT_CLASS);
-        createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__RENDERER);
-        createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__RENDER_KIT_EXTENSION);
-        createEAttribute(renderKitTypeEClass, RENDER_KIT_TYPE__ID);
-
-        smallIconTypeEClass = createEClass(SMALL_ICON_TYPE);
-        createEAttribute(smallIconTypeEClass, SMALL_ICON_TYPE__TEXT_CONTENT);
-        createEAttribute(smallIconTypeEClass, SMALL_ICON_TYPE__ID);
-
-        stateManagerTypeEClass = createEClass(STATE_MANAGER_TYPE);
-        createEAttribute(stateManagerTypeEClass, STATE_MANAGER_TYPE__TEXT_CONTENT);
-        createEAttribute(stateManagerTypeEClass, STATE_MANAGER_TYPE__ID);
-
-        suggestedValueTypeEClass = createEClass(SUGGESTED_VALUE_TYPE);
-        createEAttribute(suggestedValueTypeEClass, SUGGESTED_VALUE_TYPE__TEXT_CONTENT);
-        createEAttribute(suggestedValueTypeEClass, SUGGESTED_VALUE_TYPE__ID);
-
-        supportedLocaleTypeEClass = createEClass(SUPPORTED_LOCALE_TYPE);
-        createEAttribute(supportedLocaleTypeEClass, SUPPORTED_LOCALE_TYPE__TEXT_CONTENT);
-        createEAttribute(supportedLocaleTypeEClass, SUPPORTED_LOCALE_TYPE__ID);
-
-        toViewIdTypeEClass = createEClass(TO_VIEW_ID_TYPE);
-        createEAttribute(toViewIdTypeEClass, TO_VIEW_ID_TYPE__TEXT_CONTENT);
-        createEAttribute(toViewIdTypeEClass, TO_VIEW_ID_TYPE__ID);
-
-        validatorClassTypeEClass = createEClass(VALIDATOR_CLASS_TYPE);
-        createEAttribute(validatorClassTypeEClass, VALIDATOR_CLASS_TYPE__TEXT_CONTENT);
-        createEAttribute(validatorClassTypeEClass, VALIDATOR_CLASS_TYPE__ID);
-
-        validatorIdTypeEClass = createEClass(VALIDATOR_ID_TYPE);
-        createEAttribute(validatorIdTypeEClass, VALIDATOR_ID_TYPE__TEXT_CONTENT);
-        createEAttribute(validatorIdTypeEClass, VALIDATOR_ID_TYPE__ID);
-
-        validatorTypeEClass = createEClass(VALIDATOR_TYPE);
-        createEReference(validatorTypeEClass, VALIDATOR_TYPE__DESCRIPTION);
-        createEReference(validatorTypeEClass, VALIDATOR_TYPE__DISPLAY_NAME);
-        createEReference(validatorTypeEClass, VALIDATOR_TYPE__ICON);
-        createEReference(validatorTypeEClass, VALIDATOR_TYPE__VALIDATOR_ID);
-        createEReference(validatorTypeEClass, VALIDATOR_TYPE__VALIDATOR_CLASS);
-        createEReference(validatorTypeEClass, VALIDATOR_TYPE__ATTRIBUTE);
-        createEReference(validatorTypeEClass, VALIDATOR_TYPE__PROPERTY);
-        createEReference(validatorTypeEClass, VALIDATOR_TYPE__VALIDATOR_EXTENSION);
-        createEAttribute(validatorTypeEClass, VALIDATOR_TYPE__ID);
-
-        valueClassTypeEClass = createEClass(VALUE_CLASS_TYPE);
-        createEAttribute(valueClassTypeEClass, VALUE_CLASS_TYPE__TEXT_CONTENT);
-        createEAttribute(valueClassTypeEClass, VALUE_CLASS_TYPE__ID);
-
-        valueTypeEClass = createEClass(VALUE_TYPE);
-        createEAttribute(valueTypeEClass, VALUE_TYPE__TEXT_CONTENT);
-        createEAttribute(valueTypeEClass, VALUE_TYPE__ID);
-
-        variableResolverTypeEClass = createEClass(VARIABLE_RESOLVER_TYPE);
-        createEAttribute(variableResolverTypeEClass, VARIABLE_RESOLVER_TYPE__TEXT_CONTENT);
-        createEAttribute(variableResolverTypeEClass, VARIABLE_RESOLVER_TYPE__ID);
-
-        viewHandlerTypeEClass = createEClass(VIEW_HANDLER_TYPE);
-        createEAttribute(viewHandlerTypeEClass, VIEW_HANDLER_TYPE__TEXT_CONTENT);
-        createEAttribute(viewHandlerTypeEClass, VIEW_HANDLER_TYPE__ID);
-
-        extensionTypeEClass = createEClass(EXTENSION_TYPE);
-        createEReference(extensionTypeEClass, EXTENSION_TYPE__CHILD_NODES);
-        createEAttribute(extensionTypeEClass, EXTENSION_TYPE__TEXT_CONTENT);
-        createEAttribute(extensionTypeEClass, EXTENSION_TYPE__ID);
-
-        applicationExtensionTypeEClass = createEClass(APPLICATION_EXTENSION_TYPE);
-
-        converterExtensionTypeEClass = createEClass(CONVERTER_EXTENSION_TYPE);
-
-        elResolverTypeEClass = createEClass(EL_RESOLVER_TYPE);
-        createEAttribute(elResolverTypeEClass, EL_RESOLVER_TYPE__TEXT_CONTENT);
-        createEAttribute(elResolverTypeEClass, EL_RESOLVER_TYPE__ID);
-
-        facesConfigExtensionTypeEClass = createEClass(FACES_CONFIG_EXTENSION_TYPE);
-
-        factoryExtensionTypeEClass = createEClass(FACTORY_EXTENSION_TYPE);
-
-        lifecycleExtensionTypeEClass = createEClass(LIFECYCLE_EXTENSION_TYPE);
-
-        managedBeanExtensionTypeEClass = createEClass(MANAGED_BEAN_EXTENSION_TYPE);
-
-        navigationRuleExtensionTypeEClass = createEClass(NAVIGATION_RULE_EXTENSION_TYPE);
-
-        validatorExtensionTypeEClass = createEClass(VALIDATOR_EXTENSION_TYPE);
-
-        resourceBundleTypeEClass = createEClass(RESOURCE_BUNDLE_TYPE);
-        createEReference(resourceBundleTypeEClass, RESOURCE_BUNDLE_TYPE__DESCRIPTION);
-        createEReference(resourceBundleTypeEClass, RESOURCE_BUNDLE_TYPE__DISPLAY_NAME);
-        createEReference(resourceBundleTypeEClass, RESOURCE_BUNDLE_TYPE__ICON);
-        createEReference(resourceBundleTypeEClass, RESOURCE_BUNDLE_TYPE__BASE_NAME);
-        createEReference(resourceBundleTypeEClass, RESOURCE_BUNDLE_TYPE__VAR);
-        createEAttribute(resourceBundleTypeEClass, RESOURCE_BUNDLE_TYPE__ID);
-
-        baseNameTypeEClass = createEClass(BASE_NAME_TYPE);
-        createEAttribute(baseNameTypeEClass, BASE_NAME_TYPE__TEXT_CONTENT);
-        createEAttribute(baseNameTypeEClass, BASE_NAME_TYPE__ID);
-
-        varTypeEClass = createEClass(VAR_TYPE);
-        createEAttribute(varTypeEClass, VAR_TYPE__TEXT_CONTENT);
-        createEAttribute(varTypeEClass, VAR_TYPE__ID);
-
-        renderKitExtensionTypeEClass = createEClass(RENDER_KIT_EXTENSION_TYPE);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	private boolean isInitialized = false;
-
-    /**
-     * Complete the initialization of the package and its meta-model.  This
-     * method is guarded to have no affect on any invocation but its first.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void initializePackageContents() {
-        if (isInitialized) return;
-        isInitialized = true;
-
-        // Initialize package
-        setName(eNAME);
-        setNsPrefix(eNS_PREFIX);
-        setNsURI(eNS_URI);
-
-        // Obtain other dependent packages
-        XMLTypePackage theXMLTypePackage = (XMLTypePackage)EPackage.Registry.INSTANCE.getEPackage(XMLTypePackage.eNS_URI);
-
-        // Add supertypes to classes
-        attributeExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        componentExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        facetExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        propertyExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        rendererExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        applicationExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        converterExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        facesConfigExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        factoryExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        lifecycleExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        managedBeanExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        navigationRuleExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        validatorExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-        renderKitExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-
-        // Initialize classes and features; add operations and parameters
-        initEClass(actionListenerTypeEClass, ActionListenerType.class, "ActionListenerType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getActionListenerType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ActionListenerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getActionListenerType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ActionListenerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(applicationFactoryTypeEClass, ApplicationFactoryType.class, "ApplicationFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getApplicationFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ApplicationFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getApplicationFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ApplicationFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(applicationTypeEClass, ApplicationType.class, "ApplicationType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getApplicationType_ActionListener(), this.getActionListenerType(), null, "actionListener", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getApplicationType_DefaultRenderKitId(), this.getDefaultRenderKitIdType(), null, "defaultRenderKitId", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getApplicationType_MessageBundle(), this.getMessageBundleType(), null, "messageBundle", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getApplicationType_NavigationHandler(), this.getNavigationHandlerType(), null, "navigationHandler", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getApplicationType_ViewHandler(), this.getViewHandlerType(), null, "viewHandler", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getApplicationType_StateManager(), this.getStateManagerType(), null, "stateManager", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getApplicationType_PropertyResolver(), this.getPropertyResolverType(), null, "propertyResolver", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getApplicationType_VariableResolver(), this.getVariableResolverType(), null, "variableResolver", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getApplicationType_LocaleConfig(), this.getLocaleConfigType(), null, "localeConfig", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getApplicationType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getApplicationType_ELResolver(), this.getELResolverType(), null, "eLResolver", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getApplicationType_ResourceBundle(), this.getResourceBundleType(), null, "resourceBundle", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getApplicationType_ApplicationExtension(), this.getApplicationExtensionType(), null, "applicationExtension", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(attributeClassTypeEClass, AttributeClassType.class, "AttributeClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getAttributeClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, AttributeClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getAttributeClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, AttributeClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(attributeExtensionTypeEClass, AttributeExtensionType.class, "AttributeExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(attributeNameTypeEClass, AttributeNameType.class, "AttributeNameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getAttributeNameType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, AttributeNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getAttributeNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, AttributeNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(attributeTypeEClass, AttributeType.class, "AttributeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getAttributeType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getAttributeType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getAttributeType_Icon(), this.getIconType(), null, "icon", null, 0, -1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getAttributeType_AttributeName(), this.getAttributeNameType(), null, "attributeName", null, 1, 1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getAttributeType_AttributeClass(), this.getAttributeClassType(), null, "attributeClass", null, 1, 1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getAttributeType_DefaultValue(), this.getDefaultValueType(), null, "defaultValue", null, 0, 1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getAttributeType_SuggestedValue(), this.getSuggestedValueType(), null, "suggestedValue", null, 0, 1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getAttributeType_AttributeExtension(), this.getAttributeExtensionType(), null, "attributeExtension", null, 0, -1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getAttributeType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(componentClassTypeEClass, ComponentClassType.class, "ComponentClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getComponentClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ComponentClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getComponentClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ComponentClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(componentExtensionTypeEClass, ComponentExtensionType.class, "ComponentExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(componentFamilyTypeEClass, ComponentFamilyType.class, "ComponentFamilyType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getComponentFamilyType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ComponentFamilyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getComponentFamilyType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ComponentFamilyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(componentTypeEClass, ComponentType.class, "ComponentType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getComponentType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getComponentType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getComponentType_Icon(), this.getIconType(), null, "icon", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getComponentType_ComponentType(), this.getComponentTypeType(), null, "componentType", null, 1, 1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getComponentType_ComponentClass(), this.getComponentClassType(), null, "componentClass", null, 1, 1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getComponentType_Facet(), this.getFacetType(), null, "facet", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getComponentType_Attribute(), this.getAttributeType(), null, "attribute", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getComponentType_Property(), this.getPropertyType(), null, "property", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getComponentType_ComponentExtension(), this.getComponentExtensionType(), null, "componentExtension", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getComponentType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(componentTypeTypeEClass, ComponentTypeType.class, "ComponentTypeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getComponentTypeType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ComponentTypeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getComponentTypeType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ComponentTypeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(converterClassTypeEClass, ConverterClassType.class, "ConverterClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getConverterClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ConverterClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getConverterClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ConverterClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(converterForClassTypeEClass, ConverterForClassType.class, "ConverterForClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getConverterForClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ConverterForClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getConverterForClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ConverterForClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(converterIdTypeEClass, ConverterIdType.class, "ConverterIdType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getConverterIdType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ConverterIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getConverterIdType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ConverterIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(converterTypeEClass, ConverterType.class, "ConverterType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getConverterType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getConverterType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getConverterType_Icon(), this.getIconType(), null, "icon", null, 0, -1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getConverterType_ConverterId(), this.getConverterIdType(), null, "converterId", null, 0, 1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getConverterType_ConverterForClass(), this.getConverterForClassType(), null, "converterForClass", null, 0, 1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getConverterType_ConverterClass(), this.getConverterClassType(), null, "converterClass", null, 1, 1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getConverterType_Attribute(), this.getAttributeType(), null, "attribute", null, 0, -1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getConverterType_Property(), this.getPropertyType(), null, "property", null, 0, -1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getConverterType_ConverterExtension(), this.getConverterExtensionType(), null, "converterExtension", null, 0, -1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getConverterType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(defaultLocaleTypeEClass, DefaultLocaleType.class, "DefaultLocaleType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getDefaultLocaleType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, DefaultLocaleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getDefaultLocaleType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, DefaultLocaleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(defaultRenderKitIdTypeEClass, DefaultRenderKitIdType.class, "DefaultRenderKitIdType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getDefaultRenderKitIdType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, DefaultRenderKitIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getDefaultRenderKitIdType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, DefaultRenderKitIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(defaultValueTypeEClass, DefaultValueType.class, "DefaultValueType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getDefaultValueType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, DefaultValueType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getDefaultValueType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, DefaultValueType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(descriptionTypeEClass, DescriptionType.class, "DescriptionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getDescriptionType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, DescriptionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getDescriptionType_Lang(), theXMLTypePackage.getLanguage(), "lang", null, 0, 1, DescriptionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getDescriptionType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, DescriptionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(displayNameTypeEClass, DisplayNameType.class, "DisplayNameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getDisplayNameType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, DisplayNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getDisplayNameType_Lang(), theXMLTypePackage.getLanguage(), "lang", null, 0, 1, DisplayNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getDisplayNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, DisplayNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(documentRootEClass, DocumentRoot.class, "DocumentRoot", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getDocumentRoot_Mixed(), ecorePackage.getEFeatureMapEntry(), "mixed", null, 0, -1, null, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_XMLNSPrefixMap(), ecorePackage.getEStringToStringMapEntry(), null, "xMLNSPrefixMap", null, 0, -1, null, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_XSISchemaLocation(), ecorePackage.getEStringToStringMapEntry(), null, "xSISchemaLocation", null, 0, -1, null, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ActionListener(), this.getActionListenerType(), null, "actionListener", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_Application(), this.getApplicationType(), null, "application", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ApplicationFactory(), this.getApplicationFactoryType(), null, "applicationFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_Attribute(), this.getAttributeType(), null, "attribute", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_AttributeClass(), this.getAttributeClassType(), null, "attributeClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_AttributeExtension(), this.getAttributeExtensionType(), null, "attributeExtension", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_AttributeName(), this.getAttributeNameType(), null, "attributeName", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_Component(), this.getComponentType(), null, "component", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ComponentClass(), this.getComponentClassType(), null, "componentClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ComponentExtension(), this.getComponentExtensionType(), null, "componentExtension", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ComponentFamily(), this.getComponentFamilyType(), null, "componentFamily", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ComponentType(), this.getComponentTypeType(), null, "componentType", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_Converter(), this.getConverterType(), null, "converter", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ConverterClass(), this.getConverterClassType(), null, "converterClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ConverterForClass(), this.getConverterForClassType(), null, "converterForClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ConverterId(), this.getConverterIdType(), null, "converterId", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_DefaultLocale(), this.getDefaultLocaleType(), null, "defaultLocale", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_DefaultRenderKitId(), this.getDefaultRenderKitIdType(), null, "defaultRenderKitId", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_DefaultValue(), this.getDefaultValueType(), null, "defaultValue", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_Description(), this.getDescriptionType(), null, "description", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_FacesConfig(), this.getFacesConfigType(), null, "facesConfig", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_FacesContextFactory(), this.getFacesContextFactoryType(), null, "facesContextFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_Facet(), this.getFacetType(), null, "facet", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_FacetExtension(), this.getFacetExtensionType(), null, "facetExtension", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_FacetName(), this.getFacetNameType(), null, "facetName", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_Factory(), this.getFactoryType(), null, "factory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_FromAction(), this.getFromActionType(), null, "fromAction", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_FromOutcome(), this.getFromOutcomeType(), null, "fromOutcome", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_FromViewId(), this.getFromViewIdType(), null, "fromViewId", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_Icon(), this.getIconType(), null, "icon", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_Key(), this.getKeyType(), null, "key", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_KeyClass(), this.getKeyClassType(), null, "keyClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_LargeIcon(), this.getLargeIconType(), null, "largeIcon", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_Lifecycle(), this.getLifecycleType(), null, "lifecycle", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_LifecycleFactory(), this.getLifecycleFactoryType(), null, "lifecycleFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ListEntries(), this.getListEntriesType(), null, "listEntries", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_LocaleConfig(), this.getLocaleConfigType(), null, "localeConfig", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ManagedBean(), this.getManagedBeanType(), null, "managedBean", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ManagedBeanClass(), this.getManagedBeanClassType(), null, "managedBeanClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ManagedBeanName(), this.getManagedBeanNameType(), null, "managedBeanName", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ManagedBeanScope(), this.getManagedBeanScopeType(), null, "managedBeanScope", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ManagedProperty(), this.getManagedPropertyType(), null, "managedProperty", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_MapEntries(), this.getMapEntriesType(), null, "mapEntries", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_MapEntry(), this.getMapEntryType(), null, "mapEntry", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_MessageBundle(), this.getMessageBundleType(), null, "messageBundle", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_NavigationCase(), this.getNavigationCaseType(), null, "navigationCase", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_NavigationHandler(), this.getNavigationHandlerType(), null, "navigationHandler", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_NavigationRule(), this.getNavigationRuleType(), null, "navigationRule", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_NullValue(), this.getNullValueType(), null, "nullValue", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_PhaseListener(), this.getPhaseListenerType(), null, "phaseListener", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_Property(), this.getPropertyType(), null, "property", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_PropertyClass(), this.getPropertyClassType(), null, "propertyClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_PropertyExtension(), this.getPropertyExtensionType(), null, "propertyExtension", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_PropertyName(), this.getPropertyNameType(), null, "propertyName", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_PropertyResolver(), this.getPropertyResolverType(), null, "propertyResolver", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_Redirect(), this.getRedirectType(), null, "redirect", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ReferencedBean(), this.getReferencedBeanType(), null, "referencedBean", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ReferencedBeanClass(), this.getReferencedBeanClassType(), null, "referencedBeanClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ReferencedBeanName(), this.getReferencedBeanNameType(), null, "referencedBeanName", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_Renderer(), this.getRendererType(), null, "renderer", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_RendererClass(), this.getRendererClassType(), null, "rendererClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_RendererExtension(), this.getRendererExtensionType(), null, "rendererExtension", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_RendererType(), this.getRendererTypeType(), null, "rendererType", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_RenderKit(), this.getRenderKitType(), null, "renderKit", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_RenderKitClass(), this.getRenderKitClassType(), null, "renderKitClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_RenderKitFactory(), this.getRenderKitFactoryType(), null, "renderKitFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_RenderKitId(), this.getRenderKitIdType(), null, "renderKitId", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_SmallIcon(), this.getSmallIconType(), null, "smallIcon", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_StateManager(), this.getStateManagerType(), null, "stateManager", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_SuggestedValue(), this.getSuggestedValueType(), null, "suggestedValue", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_SupportedLocale(), this.getSupportedLocaleType(), null, "supportedLocale", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ToViewId(), this.getToViewIdType(), null, "toViewId", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_Validator(), this.getValidatorType(), null, "validator", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ValidatorClass(), this.getValidatorClassType(), null, "validatorClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ValidatorId(), this.getValidatorIdType(), null, "validatorId", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_Value(), this.getValueType(), null, "value", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ValueClass(), this.getValueClassType(), null, "valueClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_VariableResolver(), this.getVariableResolverType(), null, "variableResolver", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-        initEReference(getDocumentRoot_ViewHandler(), this.getViewHandlerType(), null, "viewHandler", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-        initEClass(dynamicAttributeEClass, DynamicAttribute.class, "DynamicAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getDynamicAttribute_Name(), ecorePackage.getEString(), "name", null, 0, 1, DynamicAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getDynamicAttribute_Value(), ecorePackage.getEString(), "value", null, 0, 1, DynamicAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(dynamicElementEClass, DynamicElement.class, "DynamicElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getDynamicElement_ChildNodes(), this.getDynamicElement(), null, "childNodes", null, 0, -1, DynamicElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getDynamicElement_Name(), ecorePackage.getEString(), "name", null, 0, 1, DynamicElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getDynamicElement_Attributes(), this.getDynamicAttribute(), null, "attributes", null, 0, -1, DynamicElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getDynamicElement_TextContent(), ecorePackage.getEString(), "textContent", null, 0, 1, DynamicElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(facesConfigTypeEClass, FacesConfigType.class, "FacesConfigType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getFacesConfigType_Application(), this.getApplicationType(), null, "application", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getFacesConfigType_Factory(), this.getFactoryType(), null, "factory", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getFacesConfigType_Component(), this.getComponentType(), null, "component", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getFacesConfigType_Converter(), this.getConverterType(), null, "converter", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getFacesConfigType_ManagedBean(), this.getManagedBeanType(), null, "managedBean", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getFacesConfigType_NavigationRule(), this.getNavigationRuleType(), null, "navigationRule", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getFacesConfigType_ReferencedBean(), this.getReferencedBeanType(), null, "referencedBean", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getFacesConfigType_RenderKit(), this.getRenderKitType(), null, "renderKit", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getFacesConfigType_Lifecycle(), this.getLifecycleType(), null, "lifecycle", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getFacesConfigType_Validator(), this.getValidatorType(), null, "validator", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getFacesConfigType_FacesConfigExtension(), this.getFacesConfigExtensionType(), null, "facesConfigExtension", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getFacesConfigType_Xmlns(), theXMLTypePackage.getString(), "xmlns", "http://java.sun.com/JSF/Configuration", 0, 1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getFacesConfigType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(facesContextFactoryTypeEClass, FacesContextFactoryType.class, "FacesContextFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getFacesContextFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, FacesContextFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getFacesContextFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FacesContextFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(facetExtensionTypeEClass, FacetExtensionType.class, "FacetExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(facetNameTypeEClass, FacetNameType.class, "FacetNameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getFacetNameType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, FacetNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getFacetNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FacetNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(facetTypeEClass, FacetType.class, "FacetType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getFacetType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, FacetType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getFacetType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, FacetType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getFacetType_Icon(), this.getIconType(), null, "icon", null, 0, -1, FacetType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getFacetType_FacetName(), this.getFacetNameType(), null, "facetName", null, 1, 1, FacetType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getFacetType_FacetExtension(), this.getFacetExtensionType(), null, "facetExtension", null, 0, -1, FacetType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getFacetType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FacetType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(factoryTypeEClass, FactoryType.class, "FactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getFactoryType_ApplicationFactory(), this.getApplicationFactoryType(), null, "applicationFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getFactoryType_FacesContextFactory(), this.getFacesContextFactoryType(), null, "facesContextFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getFactoryType_LifecycleFactory(), this.getLifecycleFactoryType(), null, "lifecycleFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getFactoryType_RenderKitFactory(), this.getRenderKitFactoryType(), null, "renderKitFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getFactoryType_FactoryExtension(), this.getFactoryExtensionType(), null, "factoryExtension", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(fromActionTypeEClass, FromActionType.class, "FromActionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getFromActionType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, FromActionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getFromActionType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FromActionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(fromOutcomeTypeEClass, FromOutcomeType.class, "FromOutcomeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getFromOutcomeType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, FromOutcomeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getFromOutcomeType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FromOutcomeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(fromViewIdTypeEClass, FromViewIdType.class, "FromViewIdType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getFromViewIdType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, FromViewIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getFromViewIdType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FromViewIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(iconTypeEClass, IconType.class, "IconType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getIconType_SmallIcon(), this.getSmallIconType(), null, "smallIcon", null, 0, 1, IconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getIconType_LargeIcon(), this.getLargeIconType(), null, "largeIcon", null, 0, 1, IconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getIconType_Lang(), theXMLTypePackage.getLanguage(), "lang", null, 0, 1, IconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getIconType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, IconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(keyClassTypeEClass, KeyClassType.class, "KeyClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getKeyClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, KeyClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getKeyClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, KeyClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(keyTypeEClass, KeyType.class, "KeyType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getKeyType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, KeyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getKeyType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, KeyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(largeIconTypeEClass, LargeIconType.class, "LargeIconType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getLargeIconType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, LargeIconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getLargeIconType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, LargeIconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(lifecycleFactoryTypeEClass, LifecycleFactoryType.class, "LifecycleFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getLifecycleFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, LifecycleFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getLifecycleFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, LifecycleFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(lifecycleTypeEClass, LifecycleType.class, "LifecycleType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getLifecycleType_PhaseListener(), this.getPhaseListenerType(), null, "phaseListener", null, 0, -1, LifecycleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getLifecycleType_LifecycleExtension(), this.getLifecycleExtensionType(), null, "lifecycleExtension", null, 0, -1, LifecycleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getLifecycleType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, LifecycleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(listEntriesTypeEClass, ListEntriesType.class, "ListEntriesType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getListEntriesType_ValueClass(), this.getValueClassType(), null, "valueClass", null, 0, 1, ListEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getListEntriesType_NullValue(), this.getNullValueType(), null, "nullValue", null, 0, -1, ListEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getListEntriesType_Value(), this.getValueType(), null, "value", null, 0, -1, ListEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getListEntriesType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ListEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(localeConfigTypeEClass, LocaleConfigType.class, "LocaleConfigType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getLocaleConfigType_DefaultLocale(), this.getDefaultLocaleType(), null, "defaultLocale", null, 0, 1, LocaleConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getLocaleConfigType_SupportedLocale(), this.getSupportedLocaleType(), null, "supportedLocale", null, 0, -1, LocaleConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getLocaleConfigType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, LocaleConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(managedBeanClassTypeEClass, ManagedBeanClassType.class, "ManagedBeanClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getManagedBeanClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ManagedBeanClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getManagedBeanClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ManagedBeanClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(managedBeanNameTypeEClass, ManagedBeanNameType.class, "ManagedBeanNameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getManagedBeanNameType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ManagedBeanNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getManagedBeanNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ManagedBeanNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(managedBeanScopeTypeEClass, ManagedBeanScopeType.class, "ManagedBeanScopeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getManagedBeanScopeType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ManagedBeanScopeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getManagedBeanScopeType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ManagedBeanScopeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(managedBeanTypeEClass, ManagedBeanType.class, "ManagedBeanType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getManagedBeanType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getManagedBeanType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getManagedBeanType_Icon(), this.getIconType(), null, "icon", null, 0, -1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getManagedBeanType_ManagedBeanName(), this.getManagedBeanNameType(), null, "managedBeanName", null, 1, 1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getManagedBeanType_ManagedBeanClass(), this.getManagedBeanClassType(), null, "managedBeanClass", null, 1, 1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getManagedBeanType_ManagedBeanScope(), this.getManagedBeanScopeType(), null, "managedBeanScope", null, 1, 1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getManagedBeanType_ManagedProperty(), this.getManagedPropertyType(), null, "managedProperty", null, 0, -1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getManagedBeanType_MapEntries(), this.getMapEntriesType(), null, "mapEntries", null, 0, 1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getManagedBeanType_ListEntries(), this.getListEntriesType(), null, "listEntries", null, 0, 1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getManagedBeanType_ManagedBeanExtension(), this.getManagedBeanExtensionType(), null, "managedBeanExtension", null, 0, -1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getManagedBeanType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(managedPropertyTypeEClass, ManagedPropertyType.class, "ManagedPropertyType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getManagedPropertyType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getManagedPropertyType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getManagedPropertyType_Icon(), this.getIconType(), null, "icon", null, 0, -1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getManagedPropertyType_PropertyName(), this.getPropertyNameType(), null, "propertyName", null, 1, 1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getManagedPropertyType_PropertyClass(), this.getPropertyClassType(), null, "propertyClass", null, 0, 1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getManagedPropertyType_MapEntries(), this.getMapEntriesType(), null, "mapEntries", null, 0, 1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getManagedPropertyType_NullValue(), this.getNullValueType(), null, "nullValue", null, 0, 1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getManagedPropertyType_Value(), this.getValueType(), null, "value", null, 0, 1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getManagedPropertyType_ListEntries(), this.getListEntriesType(), null, "listEntries", null, 0, 1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getManagedPropertyType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(mapEntriesTypeEClass, MapEntriesType.class, "MapEntriesType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getMapEntriesType_KeyClass(), this.getKeyClassType(), null, "keyClass", null, 0, 1, MapEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getMapEntriesType_ValueClass(), this.getValueClassType(), null, "valueClass", null, 0, 1, MapEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getMapEntriesType_MapEntry(), this.getMapEntryType(), null, "mapEntry", null, 0, -1, MapEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getMapEntriesType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, MapEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(mapEntryTypeEClass, MapEntryType.class, "MapEntryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getMapEntryType_Key(), this.getKeyType(), null, "key", null, 1, 1, MapEntryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getMapEntryType_NullValue(), this.getNullValueType(), null, "nullValue", null, 0, 1, MapEntryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getMapEntryType_Value(), this.getValueType(), null, "value", null, 0, 1, MapEntryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getMapEntryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, MapEntryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(messageBundleTypeEClass, MessageBundleType.class, "MessageBundleType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getMessageBundleType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, MessageBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getMessageBundleType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, MessageBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(navigationCaseTypeEClass, NavigationCaseType.class, "NavigationCaseType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getNavigationCaseType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getNavigationCaseType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getNavigationCaseType_Icon(), this.getIconType(), null, "icon", null, 0, -1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getNavigationCaseType_FromAction(), this.getFromActionType(), null, "fromAction", null, 0, 1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getNavigationCaseType_FromOutcome(), this.getFromOutcomeType(), null, "fromOutcome", null, 0, 1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getNavigationCaseType_ToViewId(), this.getToViewIdType(), null, "toViewId", null, 1, 1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getNavigationCaseType_Redirect(), this.getRedirectType(), null, "redirect", null, 0, 1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getNavigationCaseType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(navigationHandlerTypeEClass, NavigationHandlerType.class, "NavigationHandlerType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getNavigationHandlerType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, NavigationHandlerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getNavigationHandlerType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, NavigationHandlerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(navigationRuleTypeEClass, NavigationRuleType.class, "NavigationRuleType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getNavigationRuleType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, NavigationRuleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getNavigationRuleType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, NavigationRuleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getNavigationRuleType_Icon(), this.getIconType(), null, "icon", null, 0, -1, NavigationRuleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getNavigationRuleType_FromViewId(), this.getFromViewIdType(), null, "fromViewId", null, 0, 1, NavigationRuleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getNavigationRuleType_NavigationCase(), this.getNavigationCaseType(), null, "navigationCase", null, 0, -1, NavigationRuleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getNavigationRuleType_NavigationRuleExtension(), this.getNavigationRuleExtensionType(), null, "navigationRuleExtension", null, 0, -1, NavigationRuleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getNavigationRuleType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, NavigationRuleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(nullValueTypeEClass, NullValueType.class, "NullValueType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getNullValueType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, NullValueType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(phaseListenerTypeEClass, PhaseListenerType.class, "PhaseListenerType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getPhaseListenerType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, PhaseListenerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getPhaseListenerType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, PhaseListenerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(propertyClassTypeEClass, PropertyClassType.class, "PropertyClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getPropertyClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, PropertyClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getPropertyClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, PropertyClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(propertyExtensionTypeEClass, PropertyExtensionType.class, "PropertyExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(propertyNameTypeEClass, PropertyNameType.class, "PropertyNameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getPropertyNameType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, PropertyNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getPropertyNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, PropertyNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(propertyResolverTypeEClass, PropertyResolverType.class, "PropertyResolverType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getPropertyResolverType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, PropertyResolverType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getPropertyResolverType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, PropertyResolverType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(propertyTypeEClass, PropertyType.class, "PropertyType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getPropertyType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getPropertyType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getPropertyType_Icon(), this.getIconType(), null, "icon", null, 0, -1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getPropertyType_PropertyName(), this.getPropertyNameType(), null, "propertyName", null, 1, 1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getPropertyType_PropertyClass(), this.getPropertyClassType(), null, "propertyClass", null, 1, 1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getPropertyType_DefaultValue(), this.getDefaultValueType(), null, "defaultValue", null, 0, 1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getPropertyType_SuggestedValue(), this.getSuggestedValueType(), null, "suggestedValue", null, 0, 1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getPropertyType_PropertyExtension(), this.getPropertyExtensionType(), null, "propertyExtension", null, 0, -1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getPropertyType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(redirectTypeEClass, RedirectType.class, "RedirectType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getRedirectType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RedirectType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(referencedBeanClassTypeEClass, ReferencedBeanClassType.class, "ReferencedBeanClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getReferencedBeanClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ReferencedBeanClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getReferencedBeanClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ReferencedBeanClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(referencedBeanNameTypeEClass, ReferencedBeanNameType.class, "ReferencedBeanNameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getReferencedBeanNameType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ReferencedBeanNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getReferencedBeanNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ReferencedBeanNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(referencedBeanTypeEClass, ReferencedBeanType.class, "ReferencedBeanType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getReferencedBeanType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, ReferencedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getReferencedBeanType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, ReferencedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getReferencedBeanType_Icon(), this.getIconType(), null, "icon", null, 0, -1, ReferencedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getReferencedBeanType_ReferencedBeanName(), this.getReferencedBeanNameType(), null, "referencedBeanName", null, 1, 1, ReferencedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getReferencedBeanType_ReferencedBeanClass(), this.getReferencedBeanClassType(), null, "referencedBeanClass", null, 1, 1, ReferencedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getReferencedBeanType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ReferencedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(rendererClassTypeEClass, RendererClassType.class, "RendererClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getRendererClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, RendererClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getRendererClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RendererClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(rendererExtensionTypeEClass, RendererExtensionType.class, "RendererExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(rendererTypeEClass, RendererType.class, "RendererType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getRendererType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getRendererType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getRendererType_Icon(), this.getIconType(), null, "icon", null, 0, -1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getRendererType_ComponentFamily(), this.getComponentFamilyType(), null, "componentFamily", null, 1, 1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getRendererType_RendererType(), this.getRendererTypeType(), null, "rendererType", null, 1, 1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getRendererType_RendererClass(), this.getRendererClassType(), null, "rendererClass", null, 1, 1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getRendererType_Facet(), this.getFacetType(), null, "facet", null, 0, -1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getRendererType_Attribute(), this.getAttributeType(), null, "attribute", null, 0, -1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getRendererType_RendererExtension(), this.getRendererExtensionType(), null, "rendererExtension", null, 0, -1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getRendererType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(rendererTypeTypeEClass, RendererTypeType.class, "RendererTypeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getRendererTypeType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, RendererTypeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getRendererTypeType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RendererTypeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(renderKitClassTypeEClass, RenderKitClassType.class, "RenderKitClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getRenderKitClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, RenderKitClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getRenderKitClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RenderKitClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(renderKitFactoryTypeEClass, RenderKitFactoryType.class, "RenderKitFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getRenderKitFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, RenderKitFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getRenderKitFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RenderKitFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(renderKitIdTypeEClass, RenderKitIdType.class, "RenderKitIdType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getRenderKitIdType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, RenderKitIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getRenderKitIdType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RenderKitIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(renderKitTypeEClass, RenderKitType.class, "RenderKitType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getRenderKitType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getRenderKitType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getRenderKitType_Icon(), this.getIconType(), null, "icon", null, 0, -1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getRenderKitType_RenderKitId(), this.getRenderKitIdType(), null, "renderKitId", null, 0, 1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getRenderKitType_RenderKitClass(), this.getRenderKitClassType(), null, "renderKitClass", null, 0, 1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getRenderKitType_Renderer(), this.getRendererType(), null, "renderer", null, 0, -1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getRenderKitType_RenderKitExtension(), this.getRenderKitExtensionType(), null, "renderKitExtension", null, 0, -1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getRenderKitType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(smallIconTypeEClass, SmallIconType.class, "SmallIconType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getSmallIconType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, SmallIconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getSmallIconType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, SmallIconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(stateManagerTypeEClass, StateManagerType.class, "StateManagerType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getStateManagerType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, StateManagerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getStateManagerType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, StateManagerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(suggestedValueTypeEClass, SuggestedValueType.class, "SuggestedValueType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getSuggestedValueType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, SuggestedValueType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getSuggestedValueType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, SuggestedValueType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(supportedLocaleTypeEClass, SupportedLocaleType.class, "SupportedLocaleType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getSupportedLocaleType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, SupportedLocaleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getSupportedLocaleType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, SupportedLocaleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(toViewIdTypeEClass, ToViewIdType.class, "ToViewIdType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getToViewIdType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ToViewIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getToViewIdType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ToViewIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(validatorClassTypeEClass, ValidatorClassType.class, "ValidatorClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getValidatorClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ValidatorClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getValidatorClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ValidatorClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(validatorIdTypeEClass, ValidatorIdType.class, "ValidatorIdType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getValidatorIdType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ValidatorIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getValidatorIdType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ValidatorIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(validatorTypeEClass, ValidatorType.class, "ValidatorType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getValidatorType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getValidatorType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getValidatorType_Icon(), this.getIconType(), null, "icon", null, 0, -1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getValidatorType_ValidatorId(), this.getValidatorIdType(), null, "validatorId", null, 1, 1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getValidatorType_ValidatorClass(), this.getValidatorClassType(), null, "validatorClass", null, 1, 1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getValidatorType_Attribute(), this.getAttributeType(), null, "attribute", null, 0, -1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getValidatorType_Property(), this.getPropertyType(), null, "property", null, 0, -1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getValidatorType_ValidatorExtension(), this.getValidatorExtensionType(), null, "validatorExtension", null, 0, -1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getValidatorType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(valueClassTypeEClass, ValueClassType.class, "ValueClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getValueClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ValueClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getValueClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ValueClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(valueTypeEClass, ValueType.class, "ValueType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getValueType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ValueType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getValueType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ValueType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(variableResolverTypeEClass, VariableResolverType.class, "VariableResolverType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getVariableResolverType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, VariableResolverType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getVariableResolverType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, VariableResolverType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(viewHandlerTypeEClass, ViewHandlerType.class, "ViewHandlerType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getViewHandlerType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ViewHandlerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getViewHandlerType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ViewHandlerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(extensionTypeEClass, ExtensionType.class, "ExtensionType", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getExtensionType_ChildNodes(), this.getDynamicElement(), null, "childNodes", null, 0, -1, ExtensionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getExtensionType_TextContent(), ecorePackage.getEString(), "textContent", null, 0, 1, ExtensionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getExtensionType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ExtensionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(applicationExtensionTypeEClass, ApplicationExtensionType.class, "ApplicationExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(converterExtensionTypeEClass, ConverterExtensionType.class, "ConverterExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(elResolverTypeEClass, ELResolverType.class, "ELResolverType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getELResolverType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ELResolverType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getELResolverType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ELResolverType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(facesConfigExtensionTypeEClass, FacesConfigExtensionType.class, "FacesConfigExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(factoryExtensionTypeEClass, FactoryExtensionType.class, "FactoryExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(lifecycleExtensionTypeEClass, LifecycleExtensionType.class, "LifecycleExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(managedBeanExtensionTypeEClass, ManagedBeanExtensionType.class, "ManagedBeanExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(navigationRuleExtensionTypeEClass, NavigationRuleExtensionType.class, "NavigationRuleExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(validatorExtensionTypeEClass, ValidatorExtensionType.class, "ValidatorExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        initEClass(resourceBundleTypeEClass, ResourceBundleType.class, "ResourceBundleType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEReference(getResourceBundleType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, ResourceBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getResourceBundleType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, ResourceBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getResourceBundleType_Icon(), this.getIconType(), null, "icon", null, 0, -1, ResourceBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getResourceBundleType_BaseName(), this.getBaseNameType(), null, "baseName", null, 0, 1, ResourceBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEReference(getResourceBundleType_Var(), this.getVarType(), null, "var", null, 0, 1, ResourceBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getResourceBundleType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ResourceBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(baseNameTypeEClass, BaseNameType.class, "BaseNameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getBaseNameType_TextContent(), ecorePackage.getEString(), "textContent", null, 0, 1, BaseNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getBaseNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, BaseNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(varTypeEClass, VarType.class, "VarType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-        initEAttribute(getVarType_TextContent(), ecorePackage.getEString(), "textContent", null, 0, 1, VarType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-        initEAttribute(getVarType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, VarType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-        initEClass(renderKitExtensionTypeEClass, RenderKitExtensionType.class, "RenderKitExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-        // Create resource
-        createResource(eNS_URI);
-
-        // Create annotations
-        // http:///org/eclipse/emf/ecore/util/ExtendedMetaData
-        createExtendedMetaDataAnnotations();
-    }
-
-    /**
-     * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected void createExtendedMetaDataAnnotations() {
-        String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData";			
-        addAnnotation
-          (this, 
-           source, 
-           new String[] {
-             "qualified", "false"
-           });		
-        addAnnotation
-          (actionListenerTypeEClass, 
-           source, 
-           new String[] {
-             "name", "action-listener_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getActionListenerType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getActionListenerType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (applicationFactoryTypeEClass, 
-           source, 
-           new String[] {
-             "name", "application-factory_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getApplicationFactoryType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getApplicationFactoryType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (applicationTypeEClass, 
-           source, 
-           new String[] {
-             "name", "application_._type",
-             "kind", "elementOnly"
-           });		
-        addAnnotation
-          (getApplicationType_ActionListener(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "action-listener",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getApplicationType_DefaultRenderKitId(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "default-render-kit-id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getApplicationType_MessageBundle(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "message-bundle",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getApplicationType_NavigationHandler(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "navigation-handler",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getApplicationType_ViewHandler(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "view-handler",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getApplicationType_StateManager(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "state-manager",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getApplicationType_PropertyResolver(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "property-resolver",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getApplicationType_VariableResolver(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "variable-resolver",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getApplicationType_LocaleConfig(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "locale-config",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getApplicationType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getApplicationType_ELResolver(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "el-resolver",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getApplicationType_ResourceBundle(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "resource-bundle",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getApplicationType_ApplicationExtension(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "application-extension",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (applicationExtensionTypeEClass, 
-           source, 
-           new String[] {
-             "name", "application-extension_._type"
-           });		
-        addAnnotation
-          (attributeClassTypeEClass, 
-           source, 
-           new String[] {
-             "name", "attribute-class_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getAttributeClassType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getAttributeClassType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (attributeExtensionTypeEClass, 
-           source, 
-           new String[] {
-             "name", "attribute-extension_._type"
-           });		
-        addAnnotation
-          (attributeNameTypeEClass, 
-           source, 
-           new String[] {
-             "name", "attribute-name_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getAttributeNameType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getAttributeNameType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (attributeTypeEClass, 
-           source, 
-           new String[] {
-             "name", "attribute_._type",
-             "kind", "elementOnly"
-           });		
-        addAnnotation
-          (getAttributeType_Description(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "description",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getAttributeType_DisplayName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "display-name",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getAttributeType_Icon(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "icon",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getAttributeType_AttributeName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "attribute-name",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getAttributeType_AttributeClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "attribute-class",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getAttributeType_DefaultValue(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "default-value",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getAttributeType_SuggestedValue(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "suggested-value",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getAttributeType_AttributeExtension(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "attribute-extension",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getAttributeType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (componentClassTypeEClass, 
-           source, 
-           new String[] {
-             "name", "component-class_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getComponentClassType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getComponentClassType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (componentExtensionTypeEClass, 
-           source, 
-           new String[] {
-             "name", "component-extension_._type"
-           });		
-        addAnnotation
-          (componentFamilyTypeEClass, 
-           source, 
-           new String[] {
-             "name", "component-family_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getComponentFamilyType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getComponentFamilyType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (componentTypeEClass, 
-           source, 
-           new String[] {
-             "name", "component_._type",
-             "kind", "elementOnly"
-           });		
-        addAnnotation
-          (getComponentType_Description(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "description",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getComponentType_DisplayName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "display-name",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getComponentType_Icon(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "icon",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getComponentType_ComponentType(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "component-type",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getComponentType_ComponentClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "component-class",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getComponentType_Facet(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "facet",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getComponentType_Attribute(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "attribute",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getComponentType_Property(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "property",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getComponentType_ComponentExtension(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "component-extension",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getComponentType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (componentTypeTypeEClass, 
-           source, 
-           new String[] {
-             "name", "component-type_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getComponentTypeType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getComponentTypeType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (converterClassTypeEClass, 
-           source, 
-           new String[] {
-             "name", "converter-class_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getConverterClassType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getConverterClassType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (converterForClassTypeEClass, 
-           source, 
-           new String[] {
-             "name", "converter-for-class_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getConverterForClassType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getConverterForClassType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (converterIdTypeEClass, 
-           source, 
-           new String[] {
-             "name", "converter-id_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getConverterIdType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getConverterIdType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (converterTypeEClass, 
-           source, 
-           new String[] {
-             "name", "converter_._type",
-             "kind", "elementOnly"
-           });		
-        addAnnotation
-          (getConverterType_Description(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "description",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getConverterType_DisplayName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "display-name",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getConverterType_Icon(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "icon",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getConverterType_ConverterId(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "converter-id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getConverterType_ConverterForClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "converter-for-class",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getConverterType_ConverterClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "converter-class",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getConverterType_Attribute(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "attribute",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getConverterType_Property(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "property",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getConverterType_ConverterExtension(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "converter-extension",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getConverterType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (converterExtensionTypeEClass, 
-           source, 
-           new String[] {
-             "name", "converter-extension_._type"
-           });		
-        addAnnotation
-          (defaultLocaleTypeEClass, 
-           source, 
-           new String[] {
-             "name", "default-locale_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getDefaultLocaleType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getDefaultLocaleType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (defaultRenderKitIdTypeEClass, 
-           source, 
-           new String[] {
-             "name", "default-render-kit-id_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getDefaultRenderKitIdType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getDefaultRenderKitIdType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (defaultValueTypeEClass, 
-           source, 
-           new String[] {
-             "name", "default-value_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getDefaultValueType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getDefaultValueType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (descriptionTypeEClass, 
-           source, 
-           new String[] {
-             "name", "description_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getDescriptionType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getDescriptionType_Lang(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "lang",
-             "namespace", "http://www.w3.org/XML/1998/namespace"
-           });		
-        addAnnotation
-          (getDescriptionType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (displayNameTypeEClass, 
-           source, 
-           new String[] {
-             "name", "display-name_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getDisplayNameType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getDisplayNameType_Lang(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "lang",
-             "namespace", "http://www.w3.org/XML/1998/namespace"
-           });		
-        addAnnotation
-          (getDisplayNameType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (documentRootEClass, 
-           source, 
-           new String[] {
-             "name", "",
-             "kind", "mixed"
-           });		
-        addAnnotation
-          (getDocumentRoot_Mixed(), 
-           source, 
-           new String[] {
-             "kind", "elementWildcard",
-             "name", ":mixed"
-           });		
-        addAnnotation
-          (getDocumentRoot_XMLNSPrefixMap(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "xmlns:prefix"
-           });		
-        addAnnotation
-          (getDocumentRoot_XSISchemaLocation(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "xsi:schemaLocation"
-           });			
-        addAnnotation
-          (getDocumentRoot_ActionListener(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "action-listener",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_Application(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "application",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_ApplicationFactory(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "application-factory",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_Attribute(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "attribute",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_AttributeClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "attribute-class",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_AttributeExtension(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "attribute-extension",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_AttributeName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "attribute-name",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_Component(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "component",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_ComponentClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "component-class",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_ComponentExtension(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "component-extension",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_ComponentFamily(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "component-family",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_ComponentType(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "component-type",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_Converter(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "converter",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_ConverterClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "converter-class",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_ConverterForClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "converter-for-class",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_ConverterId(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "converter-id",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_DefaultLocale(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "default-locale",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_DefaultRenderKitId(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "default-render-kit-id",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_DefaultValue(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "default-value",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_Description(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "description",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_DisplayName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "display-name",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_FacesConfig(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "faces-config",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_FacesContextFactory(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "faces-context-factory",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_Facet(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "facet",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_FacetExtension(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "facet-extension",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_FacetName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "facet-name",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_Factory(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "factory",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_FromAction(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "from-action",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_FromOutcome(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "from-outcome",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_FromViewId(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "from-view-id",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_Icon(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "icon",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_Key(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "key",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_KeyClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "key-class",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_LargeIcon(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "large-icon",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_Lifecycle(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "lifecycle",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_LifecycleFactory(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "lifecycle-factory",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_ListEntries(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "list-entries",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_LocaleConfig(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "locale-config",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_ManagedBean(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "managed-bean",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_ManagedBeanClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "managed-bean-class",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_ManagedBeanName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "managed-bean-name",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_ManagedBeanScope(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "managed-bean-scope",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_ManagedProperty(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "managed-property",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_MapEntries(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "map-entries",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_MapEntry(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "map-entry",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_MessageBundle(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "message-bundle",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_NavigationCase(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "navigation-case",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_NavigationHandler(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "navigation-handler",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_NavigationRule(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "navigation-rule",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_NullValue(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "null-value",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_PhaseListener(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "phase-listener",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_Property(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "property",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_PropertyClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "property-class",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_PropertyExtension(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "property-extension",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_PropertyName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "property-name",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_PropertyResolver(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "property-resolver",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_Redirect(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "redirect",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_ReferencedBean(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "referenced-bean",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_ReferencedBeanClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "referenced-bean-class",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_ReferencedBeanName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "referenced-bean-name",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_Renderer(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "renderer",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_RendererClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "renderer-class",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_RendererExtension(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "renderer-extension",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_RendererType(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "renderer-type",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_RenderKit(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "render-kit",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_RenderKitClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "render-kit-class",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_RenderKitFactory(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "render-kit-factory",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_RenderKitId(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "render-kit-id",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_SmallIcon(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "small-icon",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_StateManager(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "state-manager",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_SuggestedValue(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "suggested-value",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_SupportedLocale(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "supported-locale",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_ToViewId(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "to-view-id",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_Validator(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "validator",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_ValidatorClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "validator-class",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_ValidatorId(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "validator-id",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_Value(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "value",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_ValueClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "value-class",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_VariableResolver(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "variable-resolver",
-             "namespace", "##targetNamespace"
-           });			
-        addAnnotation
-          (getDocumentRoot_ViewHandler(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "view-handler",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (elResolverTypeEClass, 
-           source, 
-           new String[] {
-             "name", "el-resolver_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getELResolverType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getELResolverType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getExtensionType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getExtensionType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (facesConfigTypeEClass, 
-           source, 
-           new String[] {
-             "name", "faces-config_._type",
-             "kind", "elementOnly"
-           });		
-        addAnnotation
-          (getFacesConfigType_Application(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "application",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFacesConfigType_Factory(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "factory",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFacesConfigType_Component(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "component",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFacesConfigType_Converter(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "converter",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFacesConfigType_ManagedBean(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "managed-bean",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFacesConfigType_NavigationRule(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "navigation-rule",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFacesConfigType_ReferencedBean(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "referenced-bean",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFacesConfigType_RenderKit(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "render-kit",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFacesConfigType_Lifecycle(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "lifecycle",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFacesConfigType_Validator(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "validator",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFacesConfigType_FacesConfigExtension(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "faces-config-extension",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFacesConfigType_Xmlns(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "xmlns",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFacesConfigType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (facesConfigExtensionTypeEClass, 
-           source, 
-           new String[] {
-             "name", "faces-config-extension_._type"
-           });		
-        addAnnotation
-          (facesContextFactoryTypeEClass, 
-           source, 
-           new String[] {
-             "name", "faces-context-factory_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getFacesContextFactoryType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getFacesContextFactoryType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (facetExtensionTypeEClass, 
-           source, 
-           new String[] {
-             "name", "facet-extension_._type"
-           });		
-        addAnnotation
-          (facetNameTypeEClass, 
-           source, 
-           new String[] {
-             "name", "facet-name_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getFacetNameType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getFacetNameType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (facetTypeEClass, 
-           source, 
-           new String[] {
-             "name", "facet_._type",
-             "kind", "elementOnly"
-           });		
-        addAnnotation
-          (getFacetType_Description(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "description",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFacetType_DisplayName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "display-name",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFacetType_Icon(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "icon",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFacetType_FacetName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "facet-name",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFacetType_FacetExtension(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "facet-extension",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFacetType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (factoryTypeEClass, 
-           source, 
-           new String[] {
-             "name", "factory_._type",
-             "kind", "elementOnly"
-           });		
-        addAnnotation
-          (getFactoryType_ApplicationFactory(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "application-factory",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFactoryType_FacesContextFactory(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "faces-context-factory",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFactoryType_LifecycleFactory(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "lifecycle-factory",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFactoryType_RenderKitFactory(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "render-kit-factory",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFactoryType_FactoryExtension(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "factory-type",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getFactoryType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (factoryExtensionTypeEClass, 
-           source, 
-           new String[] {
-             "name", "factory-extension_._type"
-           });		
-        addAnnotation
-          (fromActionTypeEClass, 
-           source, 
-           new String[] {
-             "name", "from-action_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getFromActionType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getFromActionType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (fromOutcomeTypeEClass, 
-           source, 
-           new String[] {
-             "name", "from-outcome_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getFromOutcomeType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getFromOutcomeType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (fromViewIdTypeEClass, 
-           source, 
-           new String[] {
-             "name", "from-view-id_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getFromViewIdType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getFromViewIdType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (iconTypeEClass, 
-           source, 
-           new String[] {
-             "name", "icon_._type",
-             "kind", "empty"
-           });		
-        addAnnotation
-          (getIconType_SmallIcon(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "small-icon",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getIconType_LargeIcon(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "large-icon",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getIconType_Lang(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "lang",
-             "namespace", "http://www.w3.org/XML/1998/namespace"
-           });		
-        addAnnotation
-          (getIconType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (keyClassTypeEClass, 
-           source, 
-           new String[] {
-             "name", "key-class_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getKeyClassType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getKeyClassType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (keyTypeEClass, 
-           source, 
-           new String[] {
-             "name", "key_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getKeyType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getKeyType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (largeIconTypeEClass, 
-           source, 
-           new String[] {
-             "name", "large-icon_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getLargeIconType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getLargeIconType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (lifecycleFactoryTypeEClass, 
-           source, 
-           new String[] {
-             "name", "lifecycle-factory_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getLifecycleFactoryType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getLifecycleFactoryType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (lifecycleTypeEClass, 
-           source, 
-           new String[] {
-             "name", "lifecycle_._type",
-             "kind", "elementOnly"
-           });		
-        addAnnotation
-          (getLifecycleType_PhaseListener(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "phase-listener",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getLifecycleType_LifecycleExtension(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "lifecycle-extension",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getLifecycleType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (lifecycleExtensionTypeEClass, 
-           source, 
-           new String[] {
-             "name", "lifecycle-extension_._type"
-           });		
-        addAnnotation
-          (listEntriesTypeEClass, 
-           source, 
-           new String[] {
-             "name", "list-entries_._type",
-             "kind", "elementOnly"
-           });		
-        addAnnotation
-          (getListEntriesType_ValueClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "value-class",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getListEntriesType_NullValue(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "null-value",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getListEntriesType_Value(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "value",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getListEntriesType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (localeConfigTypeEClass, 
-           source, 
-           new String[] {
-             "name", "locale-config_._type",
-             "kind", "elementOnly"
-           });		
-        addAnnotation
-          (getLocaleConfigType_DefaultLocale(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "default-locale",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getLocaleConfigType_SupportedLocale(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "supported-locale",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getLocaleConfigType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (managedBeanClassTypeEClass, 
-           source, 
-           new String[] {
-             "name", "managed-bean-class_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getManagedBeanClassType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getManagedBeanClassType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (managedBeanNameTypeEClass, 
-           source, 
-           new String[] {
-             "name", "managed-bean-name_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getManagedBeanNameType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getManagedBeanNameType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (managedBeanScopeTypeEClass, 
-           source, 
-           new String[] {
-             "name", "managed-bean-scope_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getManagedBeanScopeType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getManagedBeanScopeType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (managedBeanTypeEClass, 
-           source, 
-           new String[] {
-             "name", "managed-bean_._type",
-             "kind", "elementOnly"
-           });		
-        addAnnotation
-          (getManagedBeanType_Description(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "description",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getManagedBeanType_DisplayName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "display-name",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getManagedBeanType_Icon(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "icon",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getManagedBeanType_ManagedBeanName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "managed-bean-name",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getManagedBeanType_ManagedBeanClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "managed-bean-class",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getManagedBeanType_ManagedBeanScope(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "managed-bean-scope",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getManagedBeanType_ManagedProperty(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "managed-property",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getManagedBeanType_MapEntries(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "map-entries",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getManagedBeanType_ListEntries(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "list-entries",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getManagedBeanType_ManagedBeanExtension(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "managed-bean-extension",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getManagedBeanType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (managedBeanExtensionTypeEClass, 
-           source, 
-           new String[] {
-             "name", "managed-bean-extension_._type"
-           });		
-        addAnnotation
-          (managedPropertyTypeEClass, 
-           source, 
-           new String[] {
-             "name", "managed-property_._type",
-             "kind", "elementOnly"
-           });		
-        addAnnotation
-          (getManagedPropertyType_Description(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "description",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getManagedPropertyType_DisplayName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "display-name",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getManagedPropertyType_Icon(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "icon",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getManagedPropertyType_PropertyName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "property-name",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getManagedPropertyType_PropertyClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "property-class",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getManagedPropertyType_MapEntries(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "map-entries",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getManagedPropertyType_NullValue(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "null-value",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getManagedPropertyType_Value(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "value",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getManagedPropertyType_ListEntries(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "list-entries",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getManagedPropertyType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (mapEntriesTypeEClass, 
-           source, 
-           new String[] {
-             "name", "map-entries_._type",
-             "kind", "elementOnly"
-           });		
-        addAnnotation
-          (getMapEntriesType_KeyClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "key-class",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getMapEntriesType_ValueClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "value-class",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getMapEntriesType_MapEntry(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "map-entry",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getMapEntriesType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (mapEntryTypeEClass, 
-           source, 
-           new String[] {
-             "name", "map-entry_._type",
-             "kind", "empty"
-           });		
-        addAnnotation
-          (getMapEntryType_Key(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "key",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getMapEntryType_NullValue(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "null-value",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getMapEntryType_Value(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "value",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getMapEntryType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (messageBundleTypeEClass, 
-           source, 
-           new String[] {
-             "name", "message-bundle_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getMessageBundleType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getMessageBundleType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (navigationCaseTypeEClass, 
-           source, 
-           new String[] {
-             "name", "navigation-case_._type",
-             "kind", "elementOnly"
-           });		
-        addAnnotation
-          (getNavigationCaseType_Description(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "description",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getNavigationCaseType_DisplayName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "display-name",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getNavigationCaseType_Icon(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "icon",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getNavigationCaseType_FromAction(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "from-action",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getNavigationCaseType_FromOutcome(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "from-outcome",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getNavigationCaseType_ToViewId(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "to-view-id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getNavigationCaseType_Redirect(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "redirect",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getNavigationCaseType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (navigationHandlerTypeEClass, 
-           source, 
-           new String[] {
-             "name", "navigation-handler_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getNavigationHandlerType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getNavigationHandlerType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (navigationRuleTypeEClass, 
-           source, 
-           new String[] {
-             "name", "navigation-rule_._type",
-             "kind", "elementOnly"
-           });		
-        addAnnotation
-          (getNavigationRuleType_Description(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "description",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getNavigationRuleType_DisplayName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "display-name",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getNavigationRuleType_Icon(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "icon",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getNavigationRuleType_FromViewId(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "from-view-id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getNavigationRuleType_NavigationCase(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "navigation-case",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getNavigationRuleType_NavigationRuleExtension(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "navigation-rule-extension",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getNavigationRuleType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (navigationRuleExtensionTypeEClass, 
-           source, 
-           new String[] {
-             "name", "navigation-rule-extension_._type"
-           });		
-        addAnnotation
-          (nullValueTypeEClass, 
-           source, 
-           new String[] {
-             "name", "null-value_._type",
-             "kind", "empty"
-           });		
-        addAnnotation
-          (getNullValueType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (phaseListenerTypeEClass, 
-           source, 
-           new String[] {
-             "name", "phase-listener_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getPhaseListenerType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getPhaseListenerType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (propertyClassTypeEClass, 
-           source, 
-           new String[] {
-             "name", "property-class_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getPropertyClassType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getPropertyClassType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (propertyExtensionTypeEClass, 
-           source, 
-           new String[] {
-             "name", "property-extension_._type"
-           });		
-        addAnnotation
-          (propertyNameTypeEClass, 
-           source, 
-           new String[] {
-             "name", "property-name_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getPropertyNameType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getPropertyNameType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (propertyResolverTypeEClass, 
-           source, 
-           new String[] {
-             "name", "property-resolver_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getPropertyResolverType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getPropertyResolverType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (propertyTypeEClass, 
-           source, 
-           new String[] {
-             "name", "property_._type",
-             "kind", "elementOnly"
-           });		
-        addAnnotation
-          (getPropertyType_Description(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "description",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getPropertyType_DisplayName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "display-name",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getPropertyType_Icon(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "icon",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getPropertyType_PropertyName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "property-name",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getPropertyType_PropertyClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "property-class",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getPropertyType_DefaultValue(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "default-value",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getPropertyType_SuggestedValue(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "suggested-value",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getPropertyType_PropertyExtension(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "property-extension",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getPropertyType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (redirectTypeEClass, 
-           source, 
-           new String[] {
-             "name", "redirect_._type",
-             "kind", "empty"
-           });		
-        addAnnotation
-          (getRedirectType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (referencedBeanClassTypeEClass, 
-           source, 
-           new String[] {
-             "name", "referenced-bean-class_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getReferencedBeanClassType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getReferencedBeanClassType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (referencedBeanNameTypeEClass, 
-           source, 
-           new String[] {
-             "name", "referenced-bean-name_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getReferencedBeanNameType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getReferencedBeanNameType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (referencedBeanTypeEClass, 
-           source, 
-           new String[] {
-             "name", "referenced-bean_._type",
-             "kind", "elementOnly"
-           });		
-        addAnnotation
-          (getReferencedBeanType_Description(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "description",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getReferencedBeanType_DisplayName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "display-name",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getReferencedBeanType_Icon(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "icon",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getReferencedBeanType_ReferencedBeanName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "referenced-bean-name",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getReferencedBeanType_ReferencedBeanClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "referenced-bean-class",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getReferencedBeanType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (rendererClassTypeEClass, 
-           source, 
-           new String[] {
-             "name", "renderer-class_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getRendererClassType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getRendererClassType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (rendererExtensionTypeEClass, 
-           source, 
-           new String[] {
-             "name", "renderer-extension_._type"
-           });		
-        addAnnotation
-          (rendererTypeEClass, 
-           source, 
-           new String[] {
-             "name", "renderer_._type",
-             "kind", "elementOnly"
-           });		
-        addAnnotation
-          (getRendererType_Description(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "description",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getRendererType_DisplayName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "display-name",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getRendererType_Icon(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "icon",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getRendererType_ComponentFamily(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "component-family",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getRendererType_RendererType(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "renderer-type",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getRendererType_RendererClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "renderer-class",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getRendererType_Facet(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "facet",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getRendererType_Attribute(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "attribute",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getRendererType_RendererExtension(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "renderer-extension",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getRendererType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (rendererTypeTypeEClass, 
-           source, 
-           new String[] {
-             "name", "renderer-type_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getRendererTypeType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getRendererTypeType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (renderKitClassTypeEClass, 
-           source, 
-           new String[] {
-             "name", "render-kit-class_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getRenderKitClassType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getRenderKitClassType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (renderKitFactoryTypeEClass, 
-           source, 
-           new String[] {
-             "name", "render-kit-factory_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getRenderKitFactoryType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getRenderKitFactoryType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (renderKitIdTypeEClass, 
-           source, 
-           new String[] {
-             "name", "render-kit-id_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getRenderKitIdType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getRenderKitIdType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (renderKitTypeEClass, 
-           source, 
-           new String[] {
-             "name", "render-kit_._type",
-             "kind", "elementOnly"
-           });		
-        addAnnotation
-          (getRenderKitType_Description(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "description",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getRenderKitType_DisplayName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "display-name",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getRenderKitType_Icon(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "icon",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getRenderKitType_RenderKitId(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "render-kit-id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getRenderKitType_RenderKitClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "render-kit-class",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getRenderKitType_Renderer(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "renderer",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getRenderKitType_RenderKitExtension(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "render-kit-extension",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getRenderKitType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (renderKitExtensionTypeEClass, 
-           source, 
-           new String[] {
-             "name", "render-kit-extension_._type"
-           });		
-        addAnnotation
-          (smallIconTypeEClass, 
-           source, 
-           new String[] {
-             "name", "small-icon_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getSmallIconType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getSmallIconType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (stateManagerTypeEClass, 
-           source, 
-           new String[] {
-             "name", "state-manager_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getStateManagerType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getStateManagerType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (suggestedValueTypeEClass, 
-           source, 
-           new String[] {
-             "name", "suggested-value_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getSuggestedValueType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getSuggestedValueType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (supportedLocaleTypeEClass, 
-           source, 
-           new String[] {
-             "name", "supported-locale_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getSupportedLocaleType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getSupportedLocaleType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (toViewIdTypeEClass, 
-           source, 
-           new String[] {
-             "name", "to-view-id_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getToViewIdType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getToViewIdType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (validatorClassTypeEClass, 
-           source, 
-           new String[] {
-             "name", "validator-class_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getValidatorClassType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getValidatorClassType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (validatorIdTypeEClass, 
-           source, 
-           new String[] {
-             "name", "validator-id_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getValidatorIdType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getValidatorIdType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (validatorTypeEClass, 
-           source, 
-           new String[] {
-             "name", "validator_._type",
-             "kind", "elementOnly"
-           });		
-        addAnnotation
-          (getValidatorType_Description(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "description",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getValidatorType_DisplayName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "display-name",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getValidatorType_Icon(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "icon",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getValidatorType_ValidatorId(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "validator-id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getValidatorType_ValidatorClass(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "validator-class",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getValidatorType_Attribute(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "attribute",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getValidatorType_Property(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "property",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getValidatorType_ValidatorExtension(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "validator-extension",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getValidatorType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (validatorExtensionTypeEClass, 
-           source, 
-           new String[] {
-             "name", "validator-extension_._type"
-           });		
-        addAnnotation
-          (valueClassTypeEClass, 
-           source, 
-           new String[] {
-             "name", "value-class_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getValueClassType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getValueClassType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (valueTypeEClass, 
-           source, 
-           new String[] {
-             "name", "value_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getValueType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getValueType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (variableResolverTypeEClass, 
-           source, 
-           new String[] {
-             "name", "variable-resolver_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getVariableResolverType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getVariableResolverType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (viewHandlerTypeEClass, 
-           source, 
-           new String[] {
-             "name", "view-handler_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getViewHandlerType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getViewHandlerType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (resourceBundleTypeEClass, 
-           source, 
-           new String[] {
-             "name", "resourceBundle_._type",
-             "kind", "elementOnly"
-           });		
-        addAnnotation
-          (getResourceBundleType_Description(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "description",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getResourceBundleType_DisplayName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "display-name",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getResourceBundleType_Icon(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "icon",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getResourceBundleType_BaseName(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "base-name",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getResourceBundleType_Var(), 
-           source, 
-           new String[] {
-             "kind", "element",
-             "name", "var",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (getResourceBundleType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (baseNameTypeEClass, 
-           source, 
-           new String[] {
-             "name", "base-name_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getBaseNameType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getBaseNameType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });		
-        addAnnotation
-          (varTypeEClass, 
-           source, 
-           new String[] {
-             "name", "var_._type",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getVarType_TextContent(), 
-           source, 
-           new String[] {
-             "name", ":0",
-             "kind", "simple"
-           });		
-        addAnnotation
-          (getVarType_Id(), 
-           source, 
-           new String[] {
-             "kind", "attribute",
-             "name", "id",
-             "namespace", "##targetNamespace"
-           });
-    }
-
-} //FacesConfigPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigTypeImpl.java
deleted file mode 100644
index 2b19c98..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigTypeImpl.java
+++ /dev/null
@@ -1,683 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getApplication <em>Application</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getFactory <em>Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getComponent <em>Component</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getConverter <em>Converter</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getManagedBean <em>Managed Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getNavigationRule <em>Navigation Rule</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getReferencedBean <em>Referenced Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getRenderKit <em>Render Kit</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getLifecycle <em>Lifecycle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getValidator <em>Validator</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getFacesConfigExtension <em>Faces Config Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getXmlns <em>Xmlns</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FacesConfigTypeImpl extends EObjectImpl implements FacesConfigType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getApplication() <em>Application</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getApplication()
-     * @generated
-     * @ordered
-     */
-	protected EList application = null;
-
-    /**
-     * The cached value of the '{@link #getFactory() <em>Factory</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getFactory()
-     * @generated
-     * @ordered
-     */
-	protected EList factory = null;
-
-    /**
-     * The cached value of the '{@link #getComponent() <em>Component</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getComponent()
-     * @generated
-     * @ordered
-     */
-	protected EList component = null;
-
-    /**
-     * The cached value of the '{@link #getConverter() <em>Converter</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getConverter()
-     * @generated
-     * @ordered
-     */
-	protected EList converter = null;
-
-    /**
-     * The cached value of the '{@link #getManagedBean() <em>Managed Bean</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getManagedBean()
-     * @generated
-     * @ordered
-     */
-	protected EList managedBean = null;
-
-    /**
-     * The cached value of the '{@link #getNavigationRule() <em>Navigation Rule</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getNavigationRule()
-     * @generated
-     * @ordered
-     */
-	protected EList navigationRule = null;
-
-    /**
-     * The cached value of the '{@link #getReferencedBean() <em>Referenced Bean</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getReferencedBean()
-     * @generated
-     * @ordered
-     */
-	protected EList referencedBean = null;
-
-    /**
-     * The cached value of the '{@link #getRenderKit() <em>Render Kit</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getRenderKit()
-     * @generated
-     * @ordered
-     */
-	protected EList renderKit = null;
-
-    /**
-     * The cached value of the '{@link #getLifecycle() <em>Lifecycle</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getLifecycle()
-     * @generated
-     * @ordered
-     */
-	protected EList lifecycle = null;
-
-    /**
-     * The cached value of the '{@link #getValidator() <em>Validator</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getValidator()
-     * @generated
-     * @ordered
-     */
-	protected EList validator = null;
-
-    /**
-     * The cached value of the '{@link #getFacesConfigExtension() <em>Faces Config Extension</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getFacesConfigExtension()
-     * @generated
-     * @ordered
-     */
-    protected EList facesConfigExtension = null;
-
-    /**
-     * The default value of the '{@link #getXmlns() <em>Xmlns</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getXmlns()
-     * @generated
-     * @ordered
-     */
-	protected static final String XMLNS_EDEFAULT = "http://java.sun.com/JSF/Configuration";
-
-    /**
-     * The cached value of the '{@link #getXmlns() <em>Xmlns</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getXmlns()
-     * @generated
-     * @ordered
-     */
-	protected String xmlns = XMLNS_EDEFAULT;
-
-    /**
-     * This is true if the Xmlns attribute has been set.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-	protected boolean xmlnsESet = false;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected FacesConfigTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.FACES_CONFIG_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getApplication() {
-        if (application == null) {
-            application = new EObjectContainmentEList(ApplicationType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__APPLICATION);
-        }
-        return application;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getFactory() {
-        if (factory == null) {
-            factory = new EObjectContainmentEList(FactoryType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__FACTORY);
-        }
-        return factory;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getComponent() {
-        if (component == null) {
-            component = new EObjectContainmentEList(ComponentType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__COMPONENT);
-        }
-        return component;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getConverter() {
-        if (converter == null) {
-            converter = new EObjectContainmentEList(ConverterType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__CONVERTER);
-        }
-        return converter;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getManagedBean() {
-        if (managedBean == null) {
-            managedBean = new EObjectContainmentEList(ManagedBeanType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__MANAGED_BEAN);
-        }
-        return managedBean;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getNavigationRule() {
-        if (navigationRule == null) {
-            navigationRule = new EObjectContainmentEList(NavigationRuleType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE);
-        }
-        return navigationRule;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getReferencedBean() {
-        if (referencedBean == null) {
-            referencedBean = new EObjectContainmentEList(ReferencedBeanType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__REFERENCED_BEAN);
-        }
-        return referencedBean;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getRenderKit() {
-        if (renderKit == null) {
-            renderKit = new EObjectContainmentEList(RenderKitType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__RENDER_KIT);
-        }
-        return renderKit;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getLifecycle() {
-        if (lifecycle == null) {
-            lifecycle = new EObjectContainmentEList(LifecycleType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__LIFECYCLE);
-        }
-        return lifecycle;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getValidator() {
-        if (validator == null) {
-            validator = new EObjectContainmentEList(ValidatorType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__VALIDATOR);
-        }
-        return validator;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getFacesConfigExtension() {
-        if (facesConfigExtension == null) {
-            facesConfigExtension = new EObjectResolvingEList(FacesConfigExtensionType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION);
-        }
-        return facesConfigExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getXmlns() {
-        return xmlns;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setXmlns(String newXmlns) {
-        String oldXmlns = xmlns;
-        xmlns = newXmlns;
-        boolean oldXmlnsESet = xmlnsESet;
-        xmlnsESet = true;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS, oldXmlns, xmlns, !oldXmlnsESet));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void unsetXmlns() {
-        String oldXmlns = xmlns;
-        boolean oldXmlnsESet = xmlnsESet;
-        xmlns = XMLNS_EDEFAULT;
-        xmlnsESet = false;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.UNSET, FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS, oldXmlns, XMLNS_EDEFAULT, oldXmlnsESet));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public boolean isSetXmlns() {
-        return xmlnsESet;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACES_CONFIG_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.FACES_CONFIG_TYPE__APPLICATION:
-                return ((InternalEList)getApplication()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.FACES_CONFIG_TYPE__FACTORY:
-                return ((InternalEList)getFactory()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.FACES_CONFIG_TYPE__COMPONENT:
-                return ((InternalEList)getComponent()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.FACES_CONFIG_TYPE__CONVERTER:
-                return ((InternalEList)getConverter()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.FACES_CONFIG_TYPE__MANAGED_BEAN:
-                return ((InternalEList)getManagedBean()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE:
-                return ((InternalEList)getNavigationRule()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.FACES_CONFIG_TYPE__REFERENCED_BEAN:
-                return ((InternalEList)getReferencedBean()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.FACES_CONFIG_TYPE__RENDER_KIT:
-                return ((InternalEList)getRenderKit()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.FACES_CONFIG_TYPE__LIFECYCLE:
-                return ((InternalEList)getLifecycle()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.FACES_CONFIG_TYPE__VALIDATOR:
-                return ((InternalEList)getValidator()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.FACES_CONFIG_TYPE__APPLICATION:
-                return getApplication();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__FACTORY:
-                return getFactory();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__COMPONENT:
-                return getComponent();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__CONVERTER:
-                return getConverter();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__MANAGED_BEAN:
-                return getManagedBean();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE:
-                return getNavigationRule();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__REFERENCED_BEAN:
-                return getReferencedBean();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__RENDER_KIT:
-                return getRenderKit();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__LIFECYCLE:
-                return getLifecycle();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__VALIDATOR:
-                return getValidator();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION:
-                return getFacesConfigExtension();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS:
-                return getXmlns();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.FACES_CONFIG_TYPE__APPLICATION:
-                getApplication().clear();
-                getApplication().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__FACTORY:
-                getFactory().clear();
-                getFactory().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__COMPONENT:
-                getComponent().clear();
-                getComponent().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__CONVERTER:
-                getConverter().clear();
-                getConverter().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__MANAGED_BEAN:
-                getManagedBean().clear();
-                getManagedBean().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE:
-                getNavigationRule().clear();
-                getNavigationRule().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__REFERENCED_BEAN:
-                getReferencedBean().clear();
-                getReferencedBean().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__RENDER_KIT:
-                getRenderKit().clear();
-                getRenderKit().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__LIFECYCLE:
-                getLifecycle().clear();
-                getLifecycle().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__VALIDATOR:
-                getValidator().clear();
-                getValidator().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION:
-                getFacesConfigExtension().clear();
-                getFacesConfigExtension().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS:
-                setXmlns((String)newValue);
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.FACES_CONFIG_TYPE__APPLICATION:
-                getApplication().clear();
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__FACTORY:
-                getFactory().clear();
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__COMPONENT:
-                getComponent().clear();
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__CONVERTER:
-                getConverter().clear();
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__MANAGED_BEAN:
-                getManagedBean().clear();
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE:
-                getNavigationRule().clear();
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__REFERENCED_BEAN:
-                getReferencedBean().clear();
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__RENDER_KIT:
-                getRenderKit().clear();
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__LIFECYCLE:
-                getLifecycle().clear();
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__VALIDATOR:
-                getValidator().clear();
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION:
-                getFacesConfigExtension().clear();
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS:
-                unsetXmlns();
-                return;
-            case FacesConfigPackage.FACES_CONFIG_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.FACES_CONFIG_TYPE__APPLICATION:
-                return application != null && !application.isEmpty();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__FACTORY:
-                return factory != null && !factory.isEmpty();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__COMPONENT:
-                return component != null && !component.isEmpty();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__CONVERTER:
-                return converter != null && !converter.isEmpty();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__MANAGED_BEAN:
-                return managedBean != null && !managedBean.isEmpty();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE:
-                return navigationRule != null && !navigationRule.isEmpty();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__REFERENCED_BEAN:
-                return referencedBean != null && !referencedBean.isEmpty();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__RENDER_KIT:
-                return renderKit != null && !renderKit.isEmpty();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__LIFECYCLE:
-                return lifecycle != null && !lifecycle.isEmpty();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__VALIDATOR:
-                return validator != null && !validator.isEmpty();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION:
-                return facesConfigExtension != null && !facesConfigExtension.isEmpty();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS:
-                return isSetXmlns();
-            case FacesConfigPackage.FACES_CONFIG_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (xmlns: ");
-        if (xmlnsESet) result.append(xmlns); else result.append("<unset>");
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //FacesConfigTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesContextFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesContextFactoryTypeImpl.java
deleted file mode 100644
index d99fd16..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesContextFactoryTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Faces Context Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FacesContextFactoryTypeImpl extends EObjectImpl implements FacesContextFactoryType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected FacesContextFactoryTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.FACES_CONTEXT_FACTORY_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //FacesContextFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetExtensionTypeImpl.java
deleted file mode 100644
index 59d690e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetExtensionTypeImpl.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.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
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected FacetExtensionTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.FACET_EXTENSION_TYPE;
-    }
-
-} //FacetExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetNameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetNameTypeImpl.java
deleted file mode 100644
index 49d8fc0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetNameTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetNameType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facet Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetNameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetNameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FacetNameTypeImpl extends EObjectImpl implements FacetNameType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected FacetNameTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.FACET_NAME_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACET_NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACET_NAME_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.FACET_NAME_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.FACET_NAME_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.FACET_NAME_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.FACET_NAME_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.FACET_NAME_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.FACET_NAME_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.FACET_NAME_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.FACET_NAME_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //FacetNameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetTypeImpl.java
deleted file mode 100644
index 2395e39..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetTypeImpl.java
+++ /dev/null
@@ -1,404 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facet Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl#getFacetName <em>Facet Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl#getFacetExtension <em>Facet Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FacetTypeImpl extends EObjectImpl implements FacetType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDescription()
-     * @generated
-     * @ordered
-     */
-	protected EList description = null;
-
-    /**
-     * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDisplayName()
-     * @generated
-     * @ordered
-     */
-	protected EList displayName = null;
-
-    /**
-     * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getIcon()
-     * @generated
-     * @ordered
-     */
-	protected EList icon = null;
-
-    /**
-     * The cached value of the '{@link #getFacetName() <em>Facet Name</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getFacetName()
-     * @generated
-     * @ordered
-     */
-	protected FacetNameType facetName = null;
-
-    /**
-     * The cached value of the '{@link #getFacetExtension() <em>Facet Extension</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getFacetExtension()
-     * @generated
-     * @ordered
-     */
-	protected EList facetExtension = null;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected FacetTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.FACET_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDescription() {
-        if (description == null) {
-            description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.FACET_TYPE__DESCRIPTION);
-        }
-        return description;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDisplayName() {
-        if (displayName == null) {
-            displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.FACET_TYPE__DISPLAY_NAME);
-        }
-        return displayName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getIcon() {
-        if (icon == null) {
-            icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.FACET_TYPE__ICON);
-        }
-        return icon;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public FacetNameType getFacetName() {
-        return facetName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetFacetName(FacetNameType newFacetName, NotificationChain msgs) {
-        FacetNameType oldFacetName = facetName;
-        facetName = newFacetName;
-        if (eNotificationRequired()) {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACET_TYPE__FACET_NAME, oldFacetName, newFacetName);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setFacetName(FacetNameType newFacetName) {
-        if (newFacetName != facetName) {
-            NotificationChain msgs = null;
-            if (facetName != null)
-                msgs = ((InternalEObject)facetName).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.FACET_TYPE__FACET_NAME, null, msgs);
-            if (newFacetName != null)
-                msgs = ((InternalEObject)newFacetName).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.FACET_TYPE__FACET_NAME, null, msgs);
-            msgs = basicSetFacetName(newFacetName, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACET_TYPE__FACET_NAME, newFacetName, newFacetName));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getFacetExtension() {
-        if (facetExtension == null) {
-            facetExtension = new EObjectContainmentEList(FacetExtensionType.class, this, FacesConfigPackage.FACET_TYPE__FACET_EXTENSION);
-        }
-        return facetExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACET_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.FACET_TYPE__DESCRIPTION:
-                return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.FACET_TYPE__DISPLAY_NAME:
-                return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.FACET_TYPE__ICON:
-                return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.FACET_TYPE__FACET_NAME:
-                return basicSetFacetName(null, msgs);
-            case FacesConfigPackage.FACET_TYPE__FACET_EXTENSION:
-                return ((InternalEList)getFacetExtension()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.FACET_TYPE__DESCRIPTION:
-                return getDescription();
-            case FacesConfigPackage.FACET_TYPE__DISPLAY_NAME:
-                return getDisplayName();
-            case FacesConfigPackage.FACET_TYPE__ICON:
-                return getIcon();
-            case FacesConfigPackage.FACET_TYPE__FACET_NAME:
-                return getFacetName();
-            case FacesConfigPackage.FACET_TYPE__FACET_EXTENSION:
-                return getFacetExtension();
-            case FacesConfigPackage.FACET_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.FACET_TYPE__DESCRIPTION:
-                getDescription().clear();
-                getDescription().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.FACET_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                getDisplayName().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.FACET_TYPE__ICON:
-                getIcon().clear();
-                getIcon().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.FACET_TYPE__FACET_NAME:
-                setFacetName((FacetNameType)newValue);
-                return;
-            case FacesConfigPackage.FACET_TYPE__FACET_EXTENSION:
-                getFacetExtension().clear();
-                getFacetExtension().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.FACET_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.FACET_TYPE__DESCRIPTION:
-                getDescription().clear();
-                return;
-            case FacesConfigPackage.FACET_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                return;
-            case FacesConfigPackage.FACET_TYPE__ICON:
-                getIcon().clear();
-                return;
-            case FacesConfigPackage.FACET_TYPE__FACET_NAME:
-                setFacetName((FacetNameType)null);
-                return;
-            case FacesConfigPackage.FACET_TYPE__FACET_EXTENSION:
-                getFacetExtension().clear();
-                return;
-            case FacesConfigPackage.FACET_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.FACET_TYPE__DESCRIPTION:
-                return description != null && !description.isEmpty();
-            case FacesConfigPackage.FACET_TYPE__DISPLAY_NAME:
-                return displayName != null && !displayName.isEmpty();
-            case FacesConfigPackage.FACET_TYPE__ICON:
-                return icon != null && !icon.isEmpty();
-            case FacesConfigPackage.FACET_TYPE__FACET_NAME:
-                return facetName != null;
-            case FacesConfigPackage.FACET_TYPE__FACET_EXTENSION:
-                return facetExtension != null && !facetExtension.isEmpty();
-            case FacesConfigPackage.FACET_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //FacetTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FactoryExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FactoryExtensionTypeImpl.java
deleted file mode 100644
index ee5eb50..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
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected FactoryExtensionTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.FACTORY_EXTENSION_TYPE;
-    }
-
-} //FactoryExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FactoryTypeImpl.java
deleted file mode 100644
index e23c5d5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FactoryTypeImpl.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getApplicationFactory <em>Application Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getFacesContextFactory <em>Faces Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getLifecycleFactory <em>Lifecycle Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getRenderKitFactory <em>Render Kit Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getFactoryExtension <em>Factory Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FactoryTypeImpl extends EObjectImpl implements FactoryType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getApplicationFactory() <em>Application Factory</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getApplicationFactory()
-     * @generated
-     * @ordered
-     */
-	protected EList applicationFactory = null;
-
-    /**
-     * The cached value of the '{@link #getFacesContextFactory() <em>Faces Context Factory</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getFacesContextFactory()
-     * @generated
-     * @ordered
-     */
-	protected EList facesContextFactory = null;
-
-    /**
-     * The cached value of the '{@link #getLifecycleFactory() <em>Lifecycle Factory</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getLifecycleFactory()
-     * @generated
-     * @ordered
-     */
-	protected EList lifecycleFactory = null;
-
-    /**
-     * The cached value of the '{@link #getRenderKitFactory() <em>Render Kit Factory</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getRenderKitFactory()
-     * @generated
-     * @ordered
-     */
-	protected EList renderKitFactory = null;
-
-    /**
-     * The cached value of the '{@link #getFactoryExtension() <em>Factory Extension</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getFactoryExtension()
-     * @generated
-     * @ordered
-     */
-    protected EList factoryExtension = null;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected FactoryTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.FACTORY_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getApplicationFactory() {
-        if (applicationFactory == null) {
-            applicationFactory = new EObjectContainmentEList(ApplicationFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__APPLICATION_FACTORY);
-        }
-        return applicationFactory;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getFacesContextFactory() {
-        if (facesContextFactory == null) {
-            facesContextFactory = new EObjectContainmentEList(FacesContextFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__FACES_CONTEXT_FACTORY);
-        }
-        return facesContextFactory;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getLifecycleFactory() {
-        if (lifecycleFactory == null) {
-            lifecycleFactory = new EObjectContainmentEList(LifecycleFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY);
-        }
-        return lifecycleFactory;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getRenderKitFactory() {
-        if (renderKitFactory == null) {
-            renderKitFactory = new EObjectContainmentEList(RenderKitFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY);
-        }
-        return renderKitFactory;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getFactoryExtension() {
-        if (factoryExtension == null) {
-            factoryExtension = new EObjectResolvingEList(FactoryExtensionType.class, this, FacesConfigPackage.FACTORY_TYPE__FACTORY_EXTENSION);
-        }
-        return factoryExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACTORY_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.FACTORY_TYPE__APPLICATION_FACTORY:
-                return ((InternalEList)getApplicationFactory()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.FACTORY_TYPE__FACES_CONTEXT_FACTORY:
-                return ((InternalEList)getFacesContextFactory()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-                return ((InternalEList)getLifecycleFactory()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-                return ((InternalEList)getRenderKitFactory()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.FACTORY_TYPE__APPLICATION_FACTORY:
-                return getApplicationFactory();
-            case FacesConfigPackage.FACTORY_TYPE__FACES_CONTEXT_FACTORY:
-                return getFacesContextFactory();
-            case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-                return getLifecycleFactory();
-            case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-                return getRenderKitFactory();
-            case FacesConfigPackage.FACTORY_TYPE__FACTORY_EXTENSION:
-                return getFactoryExtension();
-            case FacesConfigPackage.FACTORY_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.FACTORY_TYPE__APPLICATION_FACTORY:
-                getApplicationFactory().clear();
-                getApplicationFactory().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.FACTORY_TYPE__FACES_CONTEXT_FACTORY:
-                getFacesContextFactory().clear();
-                getFacesContextFactory().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-                getLifecycleFactory().clear();
-                getLifecycleFactory().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-                getRenderKitFactory().clear();
-                getRenderKitFactory().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.FACTORY_TYPE__FACTORY_EXTENSION:
-                getFactoryExtension().clear();
-                getFactoryExtension().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.FACTORY_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.FACTORY_TYPE__APPLICATION_FACTORY:
-                getApplicationFactory().clear();
-                return;
-            case FacesConfigPackage.FACTORY_TYPE__FACES_CONTEXT_FACTORY:
-                getFacesContextFactory().clear();
-                return;
-            case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-                getLifecycleFactory().clear();
-                return;
-            case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-                getRenderKitFactory().clear();
-                return;
-            case FacesConfigPackage.FACTORY_TYPE__FACTORY_EXTENSION:
-                getFactoryExtension().clear();
-                return;
-            case FacesConfigPackage.FACTORY_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.FACTORY_TYPE__APPLICATION_FACTORY:
-                return applicationFactory != null && !applicationFactory.isEmpty();
-            case FacesConfigPackage.FACTORY_TYPE__FACES_CONTEXT_FACTORY:
-                return facesContextFactory != null && !facesContextFactory.isEmpty();
-            case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-                return lifecycleFactory != null && !lifecycleFactory.isEmpty();
-            case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-                return renderKitFactory != null && !renderKitFactory.isEmpty();
-            case FacesConfigPackage.FACTORY_TYPE__FACTORY_EXTENSION:
-                return factoryExtension != null && !factoryExtension.isEmpty();
-            case FacesConfigPackage.FACTORY_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //FactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromActionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromActionTypeImpl.java
deleted file mode 100644
index b7bad7f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromActionTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromActionType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>From Action Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromActionTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromActionTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FromActionTypeImpl extends EObjectImpl implements FromActionType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected FromActionTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.FROM_ACTION_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FROM_ACTION_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FROM_ACTION_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.FROM_ACTION_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.FROM_ACTION_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.FROM_ACTION_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.FROM_ACTION_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.FROM_ACTION_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.FROM_ACTION_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.FROM_ACTION_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.FROM_ACTION_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //FromActionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromOutcomeTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromOutcomeTypeImpl.java
deleted file mode 100644
index e20b0fc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromOutcomeTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>From Outcome Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromOutcomeTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromOutcomeTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FromOutcomeTypeImpl extends EObjectImpl implements FromOutcomeType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected FromOutcomeTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.FROM_OUTCOME_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FROM_OUTCOME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FROM_OUTCOME_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.FROM_OUTCOME_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.FROM_OUTCOME_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.FROM_OUTCOME_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.FROM_OUTCOME_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.FROM_OUTCOME_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.FROM_OUTCOME_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.FROM_OUTCOME_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.FROM_OUTCOME_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //FromOutcomeTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromViewIdTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromViewIdTypeImpl.java
deleted file mode 100644
index a7ff78b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromViewIdTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>From View Id Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromViewIdTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromViewIdTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FromViewIdTypeImpl extends EObjectImpl implements FromViewIdType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected FromViewIdTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.FROM_VIEW_ID_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FROM_VIEW_ID_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FROM_VIEW_ID_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.FROM_VIEW_ID_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.FROM_VIEW_ID_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.FROM_VIEW_ID_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.FROM_VIEW_ID_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.FROM_VIEW_ID_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.FROM_VIEW_ID_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.FROM_VIEW_ID_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.FROM_VIEW_ID_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //FromViewIdTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/IconTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/IconTypeImpl.java
deleted file mode 100644
index 33cbbc9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/IconTypeImpl.java
+++ /dev/null
@@ -1,372 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.LargeIconType;
-import org.eclipse.jst.jsf.facesconfig.emf.SmallIconType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Icon Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl#getSmallIcon <em>Small Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl#getLargeIcon <em>Large Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl#getLang <em>Lang</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IconTypeImpl extends EObjectImpl implements IconType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getSmallIcon() <em>Small Icon</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getSmallIcon()
-     * @generated
-     * @ordered
-     */
-	protected SmallIconType smallIcon = null;
-
-    /**
-     * The cached value of the '{@link #getLargeIcon() <em>Large Icon</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getLargeIcon()
-     * @generated
-     * @ordered
-     */
-	protected LargeIconType largeIcon = null;
-
-    /**
-     * The default value of the '{@link #getLang() <em>Lang</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getLang()
-     * @generated
-     * @ordered
-     */
-	protected static final String LANG_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getLang() <em>Lang</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getLang()
-     * @generated
-     * @ordered
-     */
-	protected String lang = LANG_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected IconTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.ICON_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public SmallIconType getSmallIcon() {
-        return smallIcon;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetLargeIcon(LargeIconType newLargeIcon, NotificationChain msgs) {
-        LargeIconType oldLargeIcon = largeIcon;
-        largeIcon = newLargeIcon;
-        if (eNotificationRequired()) {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ICON_TYPE__LARGE_ICON, oldLargeIcon, newLargeIcon);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setLargeIcon(LargeIconType newLargeIcon) {
-        if (newLargeIcon != largeIcon) {
-            NotificationChain msgs = null;
-            if (largeIcon != null)
-                msgs = ((InternalEObject)largeIcon).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ICON_TYPE__LARGE_ICON, null, msgs);
-            if (newLargeIcon != null)
-                msgs = ((InternalEObject)newLargeIcon).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ICON_TYPE__LARGE_ICON, null, msgs);
-            msgs = basicSetLargeIcon(newLargeIcon, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ICON_TYPE__LARGE_ICON, newLargeIcon, newLargeIcon));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getLang() {
-        return lang;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setLang(String newLang) {
-        String oldLang = lang;
-        lang = newLang;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ICON_TYPE__LANG, oldLang, lang));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ICON_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.ICON_TYPE__SMALL_ICON:
-                return basicSetSmallIcon(null, msgs);
-            case FacesConfigPackage.ICON_TYPE__LARGE_ICON:
-                return basicSetLargeIcon(null, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.ICON_TYPE__SMALL_ICON:
-                return getSmallIcon();
-            case FacesConfigPackage.ICON_TYPE__LARGE_ICON:
-                return getLargeIcon();
-            case FacesConfigPackage.ICON_TYPE__LANG:
-                return getLang();
-            case FacesConfigPackage.ICON_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.ICON_TYPE__SMALL_ICON:
-                setSmallIcon((SmallIconType)newValue);
-                return;
-            case FacesConfigPackage.ICON_TYPE__LARGE_ICON:
-                setLargeIcon((LargeIconType)newValue);
-                return;
-            case FacesConfigPackage.ICON_TYPE__LANG:
-                setLang((String)newValue);
-                return;
-            case FacesConfigPackage.ICON_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.ICON_TYPE__SMALL_ICON:
-                setSmallIcon((SmallIconType)null);
-                return;
-            case FacesConfigPackage.ICON_TYPE__LARGE_ICON:
-                setLargeIcon((LargeIconType)null);
-                return;
-            case FacesConfigPackage.ICON_TYPE__LANG:
-                setLang(LANG_EDEFAULT);
-                return;
-            case FacesConfigPackage.ICON_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.ICON_TYPE__SMALL_ICON:
-                return smallIcon != null;
-            case FacesConfigPackage.ICON_TYPE__LARGE_ICON:
-                return largeIcon != null;
-            case FacesConfigPackage.ICON_TYPE__LANG:
-                return LANG_EDEFAULT == null ? lang != null : !LANG_EDEFAULT.equals(lang);
-            case FacesConfigPackage.ICON_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (lang: ");
-        result.append(lang);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //IconTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/KeyClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/KeyClassTypeImpl.java
deleted file mode 100644
index 2c9140a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/KeyClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Key Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class KeyClassTypeImpl extends EObjectImpl implements KeyClassType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected KeyClassTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.KEY_CLASS_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.KEY_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.KEY_CLASS_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.KEY_CLASS_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.KEY_CLASS_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.KEY_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.KEY_CLASS_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.KEY_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.KEY_CLASS_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.KEY_CLASS_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.KEY_CLASS_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //KeyClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/KeyTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/KeyTypeImpl.java
deleted file mode 100644
index 20512ac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/KeyTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Key Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class KeyTypeImpl extends EObjectImpl implements KeyType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected KeyTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.KEY_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.KEY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.KEY_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.KEY_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.KEY_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.KEY_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.KEY_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.KEY_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.KEY_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.KEY_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.KEY_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //KeyTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LargeIconTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LargeIconTypeImpl.java
deleted file mode 100644
index fd083f6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LargeIconTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LargeIconType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Large Icon Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LargeIconTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LargeIconTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class LargeIconTypeImpl extends EObjectImpl implements LargeIconType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected LargeIconTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.LARGE_ICON_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LARGE_ICON_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LARGE_ICON_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.LARGE_ICON_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.LARGE_ICON_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.LARGE_ICON_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.LARGE_ICON_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.LARGE_ICON_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.LARGE_ICON_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.LARGE_ICON_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.LARGE_ICON_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //LargeIconTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleExtensionTypeImpl.java
deleted file mode 100644
index 1bf6c0e..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
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected LifecycleExtensionTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.LIFECYCLE_EXTENSION_TYPE;
-    }
-
-} //LifecycleExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleFactoryTypeImpl.java
deleted file mode 100644
index e20b8a2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleFactoryTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Lifecycle Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class LifecycleFactoryTypeImpl extends EObjectImpl implements LifecycleFactoryType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected LifecycleFactoryTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.LIFECYCLE_FACTORY_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //LifecycleFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleTypeImpl.java
deleted file mode 100644
index 40eb56d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleTypeImpl.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleType;
-import org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Lifecycle Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl#getPhaseListener <em>Phase Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl#getLifecycleExtension <em>Lifecycle Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class LifecycleTypeImpl extends EObjectImpl implements LifecycleType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getPhaseListener() <em>Phase Listener</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getPhaseListener()
-     * @generated
-     * @ordered
-     */
-	protected EList phaseListener = null;
-
-    /**
-     * The cached value of the '{@link #getLifecycleExtension() <em>Lifecycle Extension</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getLifecycleExtension()
-     * @generated
-     * @ordered
-     */
-    protected EList lifecycleExtension = null;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected LifecycleTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.LIFECYCLE_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getPhaseListener() {
-        if (phaseListener == null) {
-            phaseListener = new EObjectContainmentEList(PhaseListenerType.class, this, FacesConfigPackage.LIFECYCLE_TYPE__PHASE_LISTENER);
-        }
-        return phaseListener;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getLifecycleExtension() {
-        if (lifecycleExtension == null) {
-            lifecycleExtension = new EObjectContainmentEList(LifecycleExtensionType.class, this, FacesConfigPackage.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION);
-        }
-        return lifecycleExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LIFECYCLE_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.LIFECYCLE_TYPE__PHASE_LISTENER:
-                return ((InternalEList)getPhaseListener()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION:
-                return ((InternalEList)getLifecycleExtension()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.LIFECYCLE_TYPE__PHASE_LISTENER:
-                return getPhaseListener();
-            case FacesConfigPackage.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION:
-                return getLifecycleExtension();
-            case FacesConfigPackage.LIFECYCLE_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.LIFECYCLE_TYPE__PHASE_LISTENER:
-                getPhaseListener().clear();
-                getPhaseListener().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION:
-                getLifecycleExtension().clear();
-                getLifecycleExtension().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.LIFECYCLE_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.LIFECYCLE_TYPE__PHASE_LISTENER:
-                getPhaseListener().clear();
-                return;
-            case FacesConfigPackage.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION:
-                getLifecycleExtension().clear();
-                return;
-            case FacesConfigPackage.LIFECYCLE_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.LIFECYCLE_TYPE__PHASE_LISTENER:
-                return phaseListener != null && !phaseListener.isEmpty();
-            case FacesConfigPackage.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION:
-                return lifecycleExtension != null && !lifecycleExtension.isEmpty();
-            case FacesConfigPackage.LIFECYCLE_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //LifecycleTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ListEntriesTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ListEntriesTypeImpl.java
deleted file mode 100644
index fd44ca1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ListEntriesTypeImpl.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>List Entries Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl#getValueClass <em>Value Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ListEntriesTypeImpl extends EObjectImpl implements ListEntriesType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getValueClass() <em>Value Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getValueClass()
-     * @generated
-     * @ordered
-     */
-	protected ValueClassType valueClass = null;
-
-    /**
-     * The cached value of the '{@link #getNullValue() <em>Null Value</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getNullValue()
-     * @generated
-     * @ordered
-     */
-	protected EList nullValue = null;
-
-    /**
-     * The cached value of the '{@link #getValue() <em>Value</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getValue()
-     * @generated
-     * @ordered
-     */
-	protected EList value = null;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ListEntriesTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.LIST_ENTRIES_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ValueClassType getValueClass() {
-        return valueClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetValueClass(ValueClassType newValueClass, NotificationChain msgs) {
-        ValueClassType oldValueClass = valueClass;
-        valueClass = newValueClass;
-        if (eNotificationRequired()) {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS, oldValueClass, newValueClass);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setValueClass(ValueClassType newValueClass) {
-        if (newValueClass != valueClass) {
-            NotificationChain msgs = null;
-            if (valueClass != null)
-                msgs = ((InternalEObject)valueClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS, null, msgs);
-            if (newValueClass != null)
-                msgs = ((InternalEObject)newValueClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS, null, msgs);
-            msgs = basicSetValueClass(newValueClass, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS, newValueClass, newValueClass));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getNullValue() {
-        if (nullValue == null) {
-            nullValue = new EObjectContainmentEList(NullValueType.class, this, FacesConfigPackage.LIST_ENTRIES_TYPE__NULL_VALUE);
-        }
-        return nullValue;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getValue() {
-        if (value == null) {
-            value = new EObjectContainmentEList(ValueType.class, this, FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE);
-        }
-        return value;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LIST_ENTRIES_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS:
-                return basicSetValueClass(null, msgs);
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__NULL_VALUE:
-                return ((InternalEList)getNullValue()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE:
-                return ((InternalEList)getValue()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS:
-                return getValueClass();
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__NULL_VALUE:
-                return getNullValue();
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE:
-                return getValue();
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS:
-                setValueClass((ValueClassType)newValue);
-                return;
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__NULL_VALUE:
-                getNullValue().clear();
-                getNullValue().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE:
-                getValue().clear();
-                getValue().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS:
-                setValueClass((ValueClassType)null);
-                return;
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__NULL_VALUE:
-                getNullValue().clear();
-                return;
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE:
-                getValue().clear();
-                return;
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS:
-                return valueClass != null;
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__NULL_VALUE:
-                return nullValue != null && !nullValue.isEmpty();
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE:
-                return value != null && !value.isEmpty();
-            case FacesConfigPackage.LIST_ENTRIES_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ListEntriesTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LocaleConfigTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LocaleConfigTypeImpl.java
deleted file mode 100644
index cfb6e7a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LocaleConfigTypeImpl.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.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Locale Config Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl#getDefaultLocale <em>Default Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl#getSupportedLocale <em>Supported Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class LocaleConfigTypeImpl extends EObjectImpl implements LocaleConfigType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getDefaultLocale() <em>Default Locale</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDefaultLocale()
-     * @generated
-     * @ordered
-     */
-	protected DefaultLocaleType defaultLocale = null;
-
-    /**
-     * The cached value of the '{@link #getSupportedLocale() <em>Supported Locale</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getSupportedLocale()
-     * @generated
-     * @ordered
-     */
-	protected EList supportedLocale = null;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected LocaleConfigTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.LOCALE_CONFIG_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public DefaultLocaleType getDefaultLocale() {
-        return defaultLocale;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetDefaultLocale(DefaultLocaleType newDefaultLocale, NotificationChain msgs) {
-        DefaultLocaleType oldDefaultLocale = defaultLocale;
-        defaultLocale = newDefaultLocale;
-        if (eNotificationRequired()) {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE, oldDefaultLocale, newDefaultLocale);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setDefaultLocale(DefaultLocaleType newDefaultLocale) {
-        if (newDefaultLocale != defaultLocale) {
-            NotificationChain msgs = null;
-            if (defaultLocale != null)
-                msgs = ((InternalEObject)defaultLocale).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE, null, msgs);
-            if (newDefaultLocale != null)
-                msgs = ((InternalEObject)newDefaultLocale).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE, null, msgs);
-            msgs = basicSetDefaultLocale(newDefaultLocale, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE, newDefaultLocale, newDefaultLocale));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getSupportedLocale() {
-        if (supportedLocale == null) {
-            supportedLocale = new EObjectContainmentEList(SupportedLocaleType.class, this, FacesConfigPackage.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE);
-        }
-        return supportedLocale;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LOCALE_CONFIG_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE:
-                return basicSetDefaultLocale(null, msgs);
-            case FacesConfigPackage.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE:
-                return ((InternalEList)getSupportedLocale()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE:
-                return getDefaultLocale();
-            case FacesConfigPackage.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE:
-                return getSupportedLocale();
-            case FacesConfigPackage.LOCALE_CONFIG_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE:
-                setDefaultLocale((DefaultLocaleType)newValue);
-                return;
-            case FacesConfigPackage.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE:
-                getSupportedLocale().clear();
-                getSupportedLocale().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.LOCALE_CONFIG_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE:
-                setDefaultLocale((DefaultLocaleType)null);
-                return;
-            case FacesConfigPackage.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE:
-                getSupportedLocale().clear();
-                return;
-            case FacesConfigPackage.LOCALE_CONFIG_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE:
-                return defaultLocale != null;
-            case FacesConfigPackage.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE:
-                return supportedLocale != null && !supportedLocale.isEmpty();
-            case FacesConfigPackage.LOCALE_CONFIG_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //LocaleConfigTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanClassTypeImpl.java
deleted file mode 100644
index aae37fc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Managed Bean Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ManagedBeanClassTypeImpl extends EObjectImpl implements ManagedBeanClassType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ManagedBeanClassTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.MANAGED_BEAN_CLASS_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ManagedBeanClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanExtensionTypeImpl.java
deleted file mode 100644
index 37e212a..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
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ManagedBeanExtensionTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.MANAGED_BEAN_EXTENSION_TYPE;
-    }
-
-} //ManagedBeanExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanNameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanNameTypeImpl.java
deleted file mode 100644
index 68c8746..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanNameTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Managed Bean Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanNameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanNameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ManagedBeanNameTypeImpl extends EObjectImpl implements ManagedBeanNameType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ManagedBeanNameTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.MANAGED_BEAN_NAME_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ManagedBeanNameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanScopeTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanScopeTypeImpl.java
deleted file mode 100644
index 2762e6a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanScopeTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Managed Bean Scope Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanScopeTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanScopeTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ManagedBeanScopeTypeImpl extends EObjectImpl implements ManagedBeanScopeType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ManagedBeanScopeTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.MANAGED_BEAN_SCOPE_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ManagedBeanScopeTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanTypeImpl.java
deleted file mode 100644
index 1f10d9d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanTypeImpl.java
+++ /dev/null
@@ -1,709 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Managed Bean Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getManagedBeanName <em>Managed Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getManagedBeanClass <em>Managed Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getManagedBeanScope <em>Managed Bean Scope</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getManagedProperty <em>Managed Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getMapEntries <em>Map Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getListEntries <em>List Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getManagedBeanExtension <em>Managed Bean Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ManagedBeanTypeImpl extends EObjectImpl implements ManagedBeanType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDescription()
-     * @generated
-     * @ordered
-     */
-	protected EList description = null;
-
-    /**
-     * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDisplayName()
-     * @generated
-     * @ordered
-     */
-	protected EList displayName = null;
-
-    /**
-     * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getIcon()
-     * @generated
-     * @ordered
-     */
-	protected EList icon = null;
-
-    /**
-     * The cached value of the '{@link #getManagedBeanName() <em>Managed Bean Name</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getManagedBeanName()
-     * @generated
-     * @ordered
-     */
-	protected ManagedBeanNameType managedBeanName = null;
-
-    /**
-     * The cached value of the '{@link #getManagedBeanClass() <em>Managed Bean Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getManagedBeanClass()
-     * @generated
-     * @ordered
-     */
-	protected ManagedBeanClassType managedBeanClass = null;
-
-    /**
-     * The cached value of the '{@link #getManagedBeanScope() <em>Managed Bean Scope</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getManagedBeanScope()
-     * @generated
-     * @ordered
-     */
-	protected ManagedBeanScopeType managedBeanScope = null;
-
-    /**
-     * The cached value of the '{@link #getManagedProperty() <em>Managed Property</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getManagedProperty()
-     * @generated
-     * @ordered
-     */
-	protected EList managedProperty = null;
-
-    /**
-     * The cached value of the '{@link #getMapEntries() <em>Map Entries</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getMapEntries()
-     * @generated
-     * @ordered
-     */
-	protected MapEntriesType mapEntries = null;
-
-    /**
-     * The cached value of the '{@link #getListEntries() <em>List Entries</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getListEntries()
-     * @generated
-     * @ordered
-     */
-	protected ListEntriesType listEntries = null;
-
-    /**
-     * The cached value of the '{@link #getManagedBeanExtension() <em>Managed Bean Extension</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getManagedBeanExtension()
-     * @generated
-     * @ordered
-     */
-    protected EList managedBeanExtension = null;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ManagedBeanTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.MANAGED_BEAN_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDescription() {
-        if (description == null) {
-            description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.MANAGED_BEAN_TYPE__DESCRIPTION);
-        }
-        return description;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDisplayName() {
-        if (displayName == null) {
-            displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.MANAGED_BEAN_TYPE__DISPLAY_NAME);
-        }
-        return displayName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getIcon() {
-        if (icon == null) {
-            icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.MANAGED_BEAN_TYPE__ICON);
-        }
-        return icon;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ManagedBeanNameType getManagedBeanName() {
-        return managedBeanName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetListEntries(ListEntriesType newListEntries, NotificationChain msgs) {
-        ListEntriesType oldListEntries = listEntries;
-        listEntries = newListEntries;
-        if (eNotificationRequired()) {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES, oldListEntries, newListEntries);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setListEntries(ListEntriesType newListEntries) {
-        if (newListEntries != listEntries) {
-            NotificationChain msgs = null;
-            if (listEntries != null)
-                msgs = ((InternalEObject)listEntries).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES, null, msgs);
-            if (newListEntries != null)
-                msgs = ((InternalEObject)newListEntries).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES, null, msgs);
-            msgs = basicSetListEntries(newListEntries, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES, newListEntries, newListEntries));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getManagedBeanExtension() {
-        if (managedBeanExtension == null) {
-            managedBeanExtension = new EObjectContainmentEList(ManagedBeanExtensionType.class, this, FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION);
-        }
-        return managedBeanExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__DESCRIPTION:
-                return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__DISPLAY_NAME:
-                return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__ICON:
-                return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME:
-                return basicSetManagedBeanName(null, msgs);
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS:
-                return basicSetManagedBeanClass(null, msgs);
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE:
-                return basicSetManagedBeanScope(null, msgs);
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_PROPERTY:
-                return ((InternalEList)getManagedProperty()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES:
-                return basicSetMapEntries(null, msgs);
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES:
-                return basicSetListEntries(null, msgs);
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION:
-                return ((InternalEList)getManagedBeanExtension()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__DESCRIPTION:
-                return getDescription();
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__DISPLAY_NAME:
-                return getDisplayName();
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__ICON:
-                return getIcon();
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME:
-                return getManagedBeanName();
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS:
-                return getManagedBeanClass();
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE:
-                return getManagedBeanScope();
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_PROPERTY:
-                return getManagedProperty();
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES:
-                return getMapEntries();
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES:
-                return getListEntries();
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION:
-                return getManagedBeanExtension();
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__DESCRIPTION:
-                getDescription().clear();
-                getDescription().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                getDisplayName().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__ICON:
-                getIcon().clear();
-                getIcon().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME:
-                setManagedBeanName((ManagedBeanNameType)newValue);
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS:
-                setManagedBeanClass((ManagedBeanClassType)newValue);
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE:
-                setManagedBeanScope((ManagedBeanScopeType)newValue);
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_PROPERTY:
-                getManagedProperty().clear();
-                getManagedProperty().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES:
-                setMapEntries((MapEntriesType)newValue);
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES:
-                setListEntries((ListEntriesType)newValue);
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION:
-                getManagedBeanExtension().clear();
-                getManagedBeanExtension().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__DESCRIPTION:
-                getDescription().clear();
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__ICON:
-                getIcon().clear();
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME:
-                setManagedBeanName((ManagedBeanNameType)null);
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS:
-                setManagedBeanClass((ManagedBeanClassType)null);
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE:
-                setManagedBeanScope((ManagedBeanScopeType)null);
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_PROPERTY:
-                getManagedProperty().clear();
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES:
-                setMapEntries((MapEntriesType)null);
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES:
-                setListEntries((ListEntriesType)null);
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION:
-                getManagedBeanExtension().clear();
-                return;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__DESCRIPTION:
-                return description != null && !description.isEmpty();
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__DISPLAY_NAME:
-                return displayName != null && !displayName.isEmpty();
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__ICON:
-                return icon != null && !icon.isEmpty();
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME:
-                return managedBeanName != null;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS:
-                return managedBeanClass != null;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE:
-                return managedBeanScope != null;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_PROPERTY:
-                return managedProperty != null && !managedProperty.isEmpty();
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES:
-                return mapEntries != null;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES:
-                return listEntries != null;
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION:
-                return managedBeanExtension != null && !managedBeanExtension.isEmpty();
-            case FacesConfigPackage.MANAGED_BEAN_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ManagedBeanTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedPropertyTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedPropertyTypeImpl.java
deleted file mode 100644
index 11180b6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedPropertyTypeImpl.java
+++ /dev/null
@@ -1,702 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Managed Property Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getPropertyName <em>Property Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getPropertyClass <em>Property Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getMapEntries <em>Map Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getListEntries <em>List Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ManagedPropertyTypeImpl extends EObjectImpl implements ManagedPropertyType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDescription()
-     * @generated
-     * @ordered
-     */
-	protected EList description = null;
-
-    /**
-     * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDisplayName()
-     * @generated
-     * @ordered
-     */
-	protected EList displayName = null;
-
-    /**
-     * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getIcon()
-     * @generated
-     * @ordered
-     */
-	protected EList icon = null;
-
-    /**
-     * The cached value of the '{@link #getPropertyName() <em>Property Name</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getPropertyName()
-     * @generated
-     * @ordered
-     */
-	protected PropertyNameType propertyName = null;
-
-    /**
-     * The cached value of the '{@link #getPropertyClass() <em>Property Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getPropertyClass()
-     * @generated
-     * @ordered
-     */
-	protected PropertyClassType propertyClass = null;
-
-    /**
-     * The cached value of the '{@link #getMapEntries() <em>Map Entries</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getMapEntries()
-     * @generated
-     * @ordered
-     */
-	protected MapEntriesType mapEntries = null;
-
-    /**
-     * The cached value of the '{@link #getNullValue() <em>Null Value</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getNullValue()
-     * @generated
-     * @ordered
-     */
-	protected NullValueType nullValue = null;
-
-    /**
-     * The cached value of the '{@link #getValue() <em>Value</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getValue()
-     * @generated
-     * @ordered
-     */
-	protected ValueType value = null;
-
-    /**
-     * The cached value of the '{@link #getListEntries() <em>List Entries</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getListEntries()
-     * @generated
-     * @ordered
-     */
-	protected ListEntriesType listEntries = null;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ManagedPropertyTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDescription() {
-        if (description == null) {
-            description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.MANAGED_PROPERTY_TYPE__DESCRIPTION);
-        }
-        return description;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDisplayName() {
-        if (displayName == null) {
-            displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.MANAGED_PROPERTY_TYPE__DISPLAY_NAME);
-        }
-        return displayName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getIcon() {
-        if (icon == null) {
-            icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.MANAGED_PROPERTY_TYPE__ICON);
-        }
-        return icon;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public PropertyNameType getPropertyName() {
-        return propertyName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetListEntries(ListEntriesType newListEntries, NotificationChain msgs) {
-        ListEntriesType oldListEntries = listEntries;
-        listEntries = newListEntries;
-        if (eNotificationRequired()) {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES, oldListEntries, newListEntries);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setListEntries(ListEntriesType newListEntries) {
-        if (newListEntries != listEntries) {
-            NotificationChain msgs = null;
-            if (listEntries != null)
-                msgs = ((InternalEObject)listEntries).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES, null, msgs);
-            if (newListEntries != null)
-                msgs = ((InternalEObject)newListEntries).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES, null, msgs);
-            msgs = basicSetListEntries(newListEntries, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES, newListEntries, newListEntries));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DESCRIPTION:
-                return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DISPLAY_NAME:
-                return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ICON:
-                return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME:
-                return basicSetPropertyName(null, msgs);
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS:
-                return basicSetPropertyClass(null, msgs);
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES:
-                return basicSetMapEntries(null, msgs);
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE:
-                return basicSetNullValue(null, msgs);
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE:
-                return basicSetValue(null, msgs);
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES:
-                return basicSetListEntries(null, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DESCRIPTION:
-                return getDescription();
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DISPLAY_NAME:
-                return getDisplayName();
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ICON:
-                return getIcon();
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME:
-                return getPropertyName();
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS:
-                return getPropertyClass();
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES:
-                return getMapEntries();
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE:
-                return getNullValue();
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE:
-                return getValue();
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES:
-                return getListEntries();
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DESCRIPTION:
-                getDescription().clear();
-                getDescription().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                getDisplayName().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ICON:
-                getIcon().clear();
-                getIcon().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME:
-                setPropertyName((PropertyNameType)newValue);
-                return;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS:
-                setPropertyClass((PropertyClassType)newValue);
-                return;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES:
-                setMapEntries((MapEntriesType)newValue);
-                return;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE:
-                setNullValue((NullValueType)newValue);
-                return;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE:
-                setValue((ValueType)newValue);
-                return;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES:
-                setListEntries((ListEntriesType)newValue);
-                return;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DESCRIPTION:
-                getDescription().clear();
-                return;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                return;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ICON:
-                getIcon().clear();
-                return;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME:
-                setPropertyName((PropertyNameType)null);
-                return;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS:
-                setPropertyClass((PropertyClassType)null);
-                return;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES:
-                setMapEntries((MapEntriesType)null);
-                return;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE:
-                setNullValue((NullValueType)null);
-                return;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE:
-                setValue((ValueType)null);
-                return;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES:
-                setListEntries((ListEntriesType)null);
-                return;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DESCRIPTION:
-                return description != null && !description.isEmpty();
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DISPLAY_NAME:
-                return displayName != null && !displayName.isEmpty();
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ICON:
-                return icon != null && !icon.isEmpty();
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME:
-                return propertyName != null;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS:
-                return propertyClass != null;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES:
-                return mapEntries != null;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE:
-                return nullValue != null;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE:
-                return value != null;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES:
-                return listEntries != null;
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ManagedPropertyTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MapEntriesTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MapEntriesTypeImpl.java
deleted file mode 100644
index 848cfd3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MapEntriesTypeImpl.java
+++ /dev/null
@@ -1,360 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntryType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Map Entries Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl#getKeyClass <em>Key Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl#getValueClass <em>Value Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl#getMapEntry <em>Map Entry</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MapEntriesTypeImpl extends EObjectImpl implements MapEntriesType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getKeyClass() <em>Key Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getKeyClass()
-     * @generated
-     * @ordered
-     */
-	protected KeyClassType keyClass = null;
-
-    /**
-     * The cached value of the '{@link #getValueClass() <em>Value Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getValueClass()
-     * @generated
-     * @ordered
-     */
-	protected ValueClassType valueClass = null;
-
-    /**
-     * The cached value of the '{@link #getMapEntry() <em>Map Entry</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getMapEntry()
-     * @generated
-     * @ordered
-     */
-	protected EList mapEntry = null;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected MapEntriesTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.MAP_ENTRIES_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public KeyClassType getKeyClass() {
-        return keyClass;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetValueClass(ValueClassType newValueClass, NotificationChain msgs) {
-        ValueClassType oldValueClass = valueClass;
-        valueClass = newValueClass;
-        if (eNotificationRequired()) {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS, oldValueClass, newValueClass);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setValueClass(ValueClassType newValueClass) {
-        if (newValueClass != valueClass) {
-            NotificationChain msgs = null;
-            if (valueClass != null)
-                msgs = ((InternalEObject)valueClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS, null, msgs);
-            if (newValueClass != null)
-                msgs = ((InternalEObject)newValueClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS, null, msgs);
-            msgs = basicSetValueClass(newValueClass, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS, newValueClass, newValueClass));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getMapEntry() {
-        if (mapEntry == null) {
-            mapEntry = new EObjectContainmentEList(MapEntryType.class, this, FacesConfigPackage.MAP_ENTRIES_TYPE__MAP_ENTRY);
-        }
-        return mapEntry;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRIES_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS:
-                return basicSetKeyClass(null, msgs);
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS:
-                return basicSetValueClass(null, msgs);
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__MAP_ENTRY:
-                return ((InternalEList)getMapEntry()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS:
-                return getKeyClass();
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS:
-                return getValueClass();
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__MAP_ENTRY:
-                return getMapEntry();
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS:
-                setKeyClass((KeyClassType)newValue);
-                return;
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS:
-                setValueClass((ValueClassType)newValue);
-                return;
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__MAP_ENTRY:
-                getMapEntry().clear();
-                getMapEntry().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS:
-                setKeyClass((KeyClassType)null);
-                return;
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS:
-                setValueClass((ValueClassType)null);
-                return;
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__MAP_ENTRY:
-                getMapEntry().clear();
-                return;
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS:
-                return keyClass != null;
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS:
-                return valueClass != null;
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__MAP_ENTRY:
-                return mapEntry != null && !mapEntry.isEmpty();
-            case FacesConfigPackage.MAP_ENTRIES_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //MapEntriesTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MapEntryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MapEntryTypeImpl.java
deleted file mode 100644
index 41e03e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MapEntryTypeImpl.java
+++ /dev/null
@@ -1,385 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntryType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Map Entry Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl#getKey <em>Key</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MapEntryTypeImpl extends EObjectImpl implements MapEntryType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getKey() <em>Key</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getKey()
-     * @generated
-     * @ordered
-     */
-	protected KeyType key = null;
-
-    /**
-     * The cached value of the '{@link #getNullValue() <em>Null Value</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getNullValue()
-     * @generated
-     * @ordered
-     */
-	protected NullValueType nullValue = null;
-
-    /**
-     * The cached value of the '{@link #getValue() <em>Value</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getValue()
-     * @generated
-     * @ordered
-     */
-	protected ValueType value = null;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected MapEntryTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.MAP_ENTRY_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public KeyType getKey() {
-        return key;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetValue(ValueType newValue, NotificationChain msgs) {
-        ValueType oldValue = value;
-        value = newValue;
-        if (eNotificationRequired()) {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRY_TYPE__VALUE, oldValue, newValue);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setValue(ValueType newValue) {
-        if (newValue != value) {
-            NotificationChain msgs = null;
-            if (value != null)
-                msgs = ((InternalEObject)value).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRY_TYPE__VALUE, null, msgs);
-            if (newValue != null)
-                msgs = ((InternalEObject)newValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRY_TYPE__VALUE, null, msgs);
-            msgs = basicSetValue(newValue, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRY_TYPE__VALUE, newValue, newValue));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRY_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.MAP_ENTRY_TYPE__KEY:
-                return basicSetKey(null, msgs);
-            case FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE:
-                return basicSetNullValue(null, msgs);
-            case FacesConfigPackage.MAP_ENTRY_TYPE__VALUE:
-                return basicSetValue(null, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.MAP_ENTRY_TYPE__KEY:
-                return getKey();
-            case FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE:
-                return getNullValue();
-            case FacesConfigPackage.MAP_ENTRY_TYPE__VALUE:
-                return getValue();
-            case FacesConfigPackage.MAP_ENTRY_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.MAP_ENTRY_TYPE__KEY:
-                setKey((KeyType)newValue);
-                return;
-            case FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE:
-                setNullValue((NullValueType)newValue);
-                return;
-            case FacesConfigPackage.MAP_ENTRY_TYPE__VALUE:
-                setValue((ValueType)newValue);
-                return;
-            case FacesConfigPackage.MAP_ENTRY_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.MAP_ENTRY_TYPE__KEY:
-                setKey((KeyType)null);
-                return;
-            case FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE:
-                setNullValue((NullValueType)null);
-                return;
-            case FacesConfigPackage.MAP_ENTRY_TYPE__VALUE:
-                setValue((ValueType)null);
-                return;
-            case FacesConfigPackage.MAP_ENTRY_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.MAP_ENTRY_TYPE__KEY:
-                return key != null;
-            case FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE:
-                return nullValue != null;
-            case FacesConfigPackage.MAP_ENTRY_TYPE__VALUE:
-                return value != null;
-            case FacesConfigPackage.MAP_ENTRY_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //MapEntryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MessageBundleTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MessageBundleTypeImpl.java
deleted file mode 100644
index 743bdfd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MessageBundleTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Message Bundle Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MessageBundleTypeImpl extends EObjectImpl implements MessageBundleType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected MessageBundleTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.MESSAGE_BUNDLE_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MESSAGE_BUNDLE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MESSAGE_BUNDLE_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //MessageBundleTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationCaseTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationCaseTypeImpl.java
deleted file mode 100644
index e0ab707..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationCaseTypeImpl.java
+++ /dev/null
@@ -1,568 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromActionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.RedirectType;
-import org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Navigation Case Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getFromAction <em>From Action</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getFromOutcome <em>From Outcome</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getToViewId <em>To View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getRedirect <em>Redirect</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class NavigationCaseTypeImpl extends EObjectImpl implements NavigationCaseType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDescription()
-     * @generated
-     * @ordered
-     */
-	protected EList description = null;
-
-    /**
-     * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDisplayName()
-     * @generated
-     * @ordered
-     */
-	protected EList displayName = null;
-
-    /**
-     * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getIcon()
-     * @generated
-     * @ordered
-     */
-	protected EList icon = null;
-
-    /**
-     * The cached value of the '{@link #getFromAction() <em>From Action</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getFromAction()
-     * @generated
-     * @ordered
-     */
-	protected FromActionType fromAction = null;
-
-    /**
-     * The cached value of the '{@link #getFromOutcome() <em>From Outcome</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getFromOutcome()
-     * @generated
-     * @ordered
-     */
-	protected FromOutcomeType fromOutcome = null;
-
-    /**
-     * The cached value of the '{@link #getToViewId() <em>To View Id</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getToViewId()
-     * @generated
-     * @ordered
-     */
-	protected ToViewIdType toViewId = null;
-
-    /**
-     * The cached value of the '{@link #getRedirect() <em>Redirect</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getRedirect()
-     * @generated
-     * @ordered
-     */
-	protected RedirectType redirect = null;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected NavigationCaseTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDescription() {
-        if (description == null) {
-            description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.NAVIGATION_CASE_TYPE__DESCRIPTION);
-        }
-        return description;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDisplayName() {
-        if (displayName == null) {
-            displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.NAVIGATION_CASE_TYPE__DISPLAY_NAME);
-        }
-        return displayName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getIcon() {
-        if (icon == null) {
-            icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.NAVIGATION_CASE_TYPE__ICON);
-        }
-        return icon;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public FromActionType getFromAction() {
-        return fromAction;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetFromOutcome(FromOutcomeType newFromOutcome, NotificationChain msgs) {
-        FromOutcomeType oldFromOutcome = fromOutcome;
-        fromOutcome = newFromOutcome;
-        if (eNotificationRequired()) {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME, oldFromOutcome, newFromOutcome);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setFromOutcome(FromOutcomeType newFromOutcome) {
-        if (newFromOutcome != fromOutcome) {
-            NotificationChain msgs = null;
-            if (fromOutcome != null)
-                msgs = ((InternalEObject)fromOutcome).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME, null, msgs);
-            if (newFromOutcome != null)
-                msgs = ((InternalEObject)newFromOutcome).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME, null, msgs);
-            msgs = basicSetFromOutcome(newFromOutcome, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME, newFromOutcome, newFromOutcome));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ToViewIdType getToViewId() {
-        return toViewId;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetRedirect(RedirectType newRedirect, NotificationChain msgs) {
-        RedirectType oldRedirect = redirect;
-        redirect = newRedirect;
-        if (eNotificationRequired()) {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT, oldRedirect, newRedirect);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setRedirect(RedirectType newRedirect) {
-        if (newRedirect != redirect) {
-            NotificationChain msgs = null;
-            if (redirect != null)
-                msgs = ((InternalEObject)redirect).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT, null, msgs);
-            if (newRedirect != null)
-                msgs = ((InternalEObject)newRedirect).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT, null, msgs);
-            msgs = basicSetRedirect(newRedirect, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT, newRedirect, newRedirect));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__DESCRIPTION:
-                return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__DISPLAY_NAME:
-                return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__ICON:
-                return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION:
-                return basicSetFromAction(null, msgs);
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME:
-                return basicSetFromOutcome(null, msgs);
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID:
-                return basicSetToViewId(null, msgs);
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT:
-                return basicSetRedirect(null, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__DESCRIPTION:
-                return getDescription();
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__DISPLAY_NAME:
-                return getDisplayName();
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__ICON:
-                return getIcon();
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION:
-                return getFromAction();
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME:
-                return getFromOutcome();
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID:
-                return getToViewId();
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT:
-                return getRedirect();
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__DESCRIPTION:
-                getDescription().clear();
-                getDescription().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                getDisplayName().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__ICON:
-                getIcon().clear();
-                getIcon().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION:
-                setFromAction((FromActionType)newValue);
-                return;
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME:
-                setFromOutcome((FromOutcomeType)newValue);
-                return;
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID:
-                setToViewId((ToViewIdType)newValue);
-                return;
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT:
-                setRedirect((RedirectType)newValue);
-                return;
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__DESCRIPTION:
-                getDescription().clear();
-                return;
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                return;
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__ICON:
-                getIcon().clear();
-                return;
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION:
-                setFromAction((FromActionType)null);
-                return;
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME:
-                setFromOutcome((FromOutcomeType)null);
-                return;
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID:
-                setToViewId((ToViewIdType)null);
-                return;
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT:
-                setRedirect((RedirectType)null);
-                return;
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__DESCRIPTION:
-                return description != null && !description.isEmpty();
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__DISPLAY_NAME:
-                return displayName != null && !displayName.isEmpty();
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__ICON:
-                return icon != null && !icon.isEmpty();
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION:
-                return fromAction != null;
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME:
-                return fromOutcome != null;
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID:
-                return toViewId != null;
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT:
-                return redirect != null;
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //NavigationCaseTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationHandlerTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationHandlerTypeImpl.java
deleted file mode 100644
index 4c3b42d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationHandlerTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Navigation Handler Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class NavigationHandlerTypeImpl extends EObjectImpl implements NavigationHandlerType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected NavigationHandlerTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.NAVIGATION_HANDLER_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_HANDLER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_HANDLER_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //NavigationHandlerTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationRuleExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationRuleExtensionTypeImpl.java
deleted file mode 100644
index 3741ac4..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
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected NavigationRuleExtensionTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.NAVIGATION_RULE_EXTENSION_TYPE;
-    }
-
-} //NavigationRuleExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationRuleTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationRuleTypeImpl.java
deleted file mode 100644
index e53b55b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationRuleTypeImpl.java
+++ /dev/null
@@ -1,441 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Navigation Rule Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl#getFromViewId <em>From View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl#getNavigationCase <em>Navigation Case</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl#getNavigationRuleExtension <em>Navigation Rule Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class NavigationRuleTypeImpl extends EObjectImpl implements NavigationRuleType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDescription()
-     * @generated
-     * @ordered
-     */
-	protected EList description = null;
-
-    /**
-     * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDisplayName()
-     * @generated
-     * @ordered
-     */
-	protected EList displayName = null;
-
-    /**
-     * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getIcon()
-     * @generated
-     * @ordered
-     */
-	protected EList icon = null;
-
-    /**
-     * The cached value of the '{@link #getFromViewId() <em>From View Id</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getFromViewId()
-     * @generated
-     * @ordered
-     */
-	protected FromViewIdType fromViewId = null;
-
-    /**
-     * The cached value of the '{@link #getNavigationCase() <em>Navigation Case</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getNavigationCase()
-     * @generated
-     * @ordered
-     */
-	protected EList navigationCase = null;
-
-    /**
-     * The cached value of the '{@link #getNavigationRuleExtension() <em>Navigation Rule Extension</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getNavigationRuleExtension()
-     * @generated
-     * @ordered
-     */
-    protected EList navigationRuleExtension = null;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected NavigationRuleTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDescription() {
-        if (description == null) {
-            description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.NAVIGATION_RULE_TYPE__DESCRIPTION);
-        }
-        return description;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDisplayName() {
-        if (displayName == null) {
-            displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.NAVIGATION_RULE_TYPE__DISPLAY_NAME);
-        }
-        return displayName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getIcon() {
-        if (icon == null) {
-            icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.NAVIGATION_RULE_TYPE__ICON);
-        }
-        return icon;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public FromViewIdType getFromViewId() {
-        return fromViewId;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetFromViewId(FromViewIdType newFromViewId, NotificationChain msgs) {
-        FromViewIdType oldFromViewId = fromViewId;
-        fromViewId = newFromViewId;
-        if (eNotificationRequired()) {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID, oldFromViewId, newFromViewId);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setFromViewId(FromViewIdType newFromViewId) {
-        if (newFromViewId != fromViewId) {
-            NotificationChain msgs = null;
-            if (fromViewId != null)
-                msgs = ((InternalEObject)fromViewId).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID, null, msgs);
-            if (newFromViewId != null)
-                msgs = ((InternalEObject)newFromViewId).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID, null, msgs);
-            msgs = basicSetFromViewId(newFromViewId, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID, newFromViewId, newFromViewId));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getNavigationCase() {
-        if (navigationCase == null) {
-            navigationCase = new EObjectContainmentEList(NavigationCaseType.class, this, FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE);
-        }
-        return navigationCase;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getNavigationRuleExtension() {
-        if (navigationRuleExtension == null) {
-            navigationRuleExtension = new EObjectContainmentEList(NavigationRuleExtensionType.class, this, FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION);
-        }
-        return navigationRuleExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_RULE_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__DESCRIPTION:
-                return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__DISPLAY_NAME:
-                return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__ICON:
-                return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID:
-                return basicSetFromViewId(null, msgs);
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE:
-                return ((InternalEList)getNavigationCase()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION:
-                return ((InternalEList)getNavigationRuleExtension()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__DESCRIPTION:
-                return getDescription();
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__DISPLAY_NAME:
-                return getDisplayName();
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__ICON:
-                return getIcon();
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID:
-                return getFromViewId();
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE:
-                return getNavigationCase();
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION:
-                return getNavigationRuleExtension();
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__DESCRIPTION:
-                getDescription().clear();
-                getDescription().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                getDisplayName().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__ICON:
-                getIcon().clear();
-                getIcon().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID:
-                setFromViewId((FromViewIdType)newValue);
-                return;
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE:
-                getNavigationCase().clear();
-                getNavigationCase().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION:
-                getNavigationRuleExtension().clear();
-                getNavigationRuleExtension().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__DESCRIPTION:
-                getDescription().clear();
-                return;
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                return;
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__ICON:
-                getIcon().clear();
-                return;
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID:
-                setFromViewId((FromViewIdType)null);
-                return;
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE:
-                getNavigationCase().clear();
-                return;
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION:
-                getNavigationRuleExtension().clear();
-                return;
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__DESCRIPTION:
-                return description != null && !description.isEmpty();
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__DISPLAY_NAME:
-                return displayName != null && !displayName.isEmpty();
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__ICON:
-                return icon != null && !icon.isEmpty();
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID:
-                return fromViewId != null;
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE:
-                return navigationCase != null && !navigationCase.isEmpty();
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION:
-                return navigationRuleExtension != null && !navigationRuleExtension.isEmpty();
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //NavigationRuleTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NullValueTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NullValueTypeImpl.java
deleted file mode 100644
index 3923660..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NullValueTypeImpl.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Null Value Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NullValueTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class NullValueTypeImpl extends EObjectImpl implements NullValueType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected NullValueTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.NULL_VALUE_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NULL_VALUE_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.NULL_VALUE_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.NULL_VALUE_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.NULL_VALUE_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.NULL_VALUE_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //NullValueTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PhaseListenerTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PhaseListenerTypeImpl.java
deleted file mode 100644
index b4c8a0d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PhaseListenerTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Phase Listener Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PhaseListenerTypeImpl extends EObjectImpl implements PhaseListenerType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected PhaseListenerTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.PHASE_LISTENER_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PHASE_LISTENER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PHASE_LISTENER_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.PHASE_LISTENER_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.PHASE_LISTENER_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.PHASE_LISTENER_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.PHASE_LISTENER_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.PHASE_LISTENER_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.PHASE_LISTENER_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.PHASE_LISTENER_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.PHASE_LISTENER_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //PhaseListenerTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyClassTypeImpl.java
deleted file mode 100644
index d2ae3fc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Property Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PropertyClassTypeImpl extends EObjectImpl implements PropertyClassType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected PropertyClassTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.PROPERTY_CLASS_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_CLASS_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.PROPERTY_CLASS_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.PROPERTY_CLASS_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.PROPERTY_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.PROPERTY_CLASS_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.PROPERTY_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.PROPERTY_CLASS_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.PROPERTY_CLASS_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.PROPERTY_CLASS_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //PropertyClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyExtensionTypeImpl.java
deleted file mode 100644
index 399d29c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyExtensionTypeImpl.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.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
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected PropertyExtensionTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.PROPERTY_EXTENSION_TYPE;
-    }
-
-} //PropertyExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyNameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyNameTypeImpl.java
deleted file mode 100644
index f6deab3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyNameTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Property Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PropertyNameTypeImpl extends EObjectImpl implements PropertyNameType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected PropertyNameTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.PROPERTY_NAME_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_NAME_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.PROPERTY_NAME_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.PROPERTY_NAME_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.PROPERTY_NAME_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.PROPERTY_NAME_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.PROPERTY_NAME_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.PROPERTY_NAME_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.PROPERTY_NAME_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.PROPERTY_NAME_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //PropertyNameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyResolverTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyResolverTypeImpl.java
deleted file mode 100644
index 30b564f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyResolverTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Property Resolver Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PropertyResolverTypeImpl extends EObjectImpl implements PropertyResolverType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected PropertyResolverTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.PROPERTY_RESOLVER_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_RESOLVER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_RESOLVER_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //PropertyResolverTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyTypeImpl.java
deleted file mode 100644
index 1465100..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyTypeImpl.java
+++ /dev/null
@@ -1,605 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Property Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getPropertyName <em>Property Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getPropertyClass <em>Property Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getDefaultValue <em>Default Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getSuggestedValue <em>Suggested Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getPropertyExtension <em>Property Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PropertyTypeImpl extends EObjectImpl implements PropertyType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDescription()
-     * @generated
-     * @ordered
-     */
-	protected EList description = null;
-
-    /**
-     * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDisplayName()
-     * @generated
-     * @ordered
-     */
-	protected EList displayName = null;
-
-    /**
-     * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getIcon()
-     * @generated
-     * @ordered
-     */
-	protected EList icon = null;
-
-    /**
-     * The cached value of the '{@link #getPropertyName() <em>Property Name</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getPropertyName()
-     * @generated
-     * @ordered
-     */
-	protected PropertyNameType propertyName = null;
-
-    /**
-     * The cached value of the '{@link #getPropertyClass() <em>Property Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getPropertyClass()
-     * @generated
-     * @ordered
-     */
-	protected PropertyClassType propertyClass = null;
-
-    /**
-     * The cached value of the '{@link #getDefaultValue() <em>Default Value</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDefaultValue()
-     * @generated
-     * @ordered
-     */
-	protected DefaultValueType defaultValue = null;
-
-    /**
-     * The cached value of the '{@link #getSuggestedValue() <em>Suggested Value</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getSuggestedValue()
-     * @generated
-     * @ordered
-     */
-	protected SuggestedValueType suggestedValue = null;
-
-    /**
-     * The cached value of the '{@link #getPropertyExtension() <em>Property Extension</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getPropertyExtension()
-     * @generated
-     * @ordered
-     */
-	protected EList propertyExtension = null;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected PropertyTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.PROPERTY_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDescription() {
-        if (description == null) {
-            description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.PROPERTY_TYPE__DESCRIPTION);
-        }
-        return description;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDisplayName() {
-        if (displayName == null) {
-            displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.PROPERTY_TYPE__DISPLAY_NAME);
-        }
-        return displayName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getIcon() {
-        if (icon == null) {
-            icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.PROPERTY_TYPE__ICON);
-        }
-        return icon;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public PropertyNameType getPropertyName() {
-        return propertyName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetSuggestedValue(SuggestedValueType newSuggestedValue, NotificationChain msgs) {
-        SuggestedValueType oldSuggestedValue = suggestedValue;
-        suggestedValue = newSuggestedValue;
-        if (eNotificationRequired()) {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE, oldSuggestedValue, newSuggestedValue);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setSuggestedValue(SuggestedValueType newSuggestedValue) {
-        if (newSuggestedValue != suggestedValue) {
-            NotificationChain msgs = null;
-            if (suggestedValue != null)
-                msgs = ((InternalEObject)suggestedValue).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE, null, msgs);
-            if (newSuggestedValue != null)
-                msgs = ((InternalEObject)newSuggestedValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE, null, msgs);
-            msgs = basicSetSuggestedValue(newSuggestedValue, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE, newSuggestedValue, newSuggestedValue));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getPropertyExtension() {
-        if (propertyExtension == null) {
-            propertyExtension = new EObjectContainmentEList(PropertyExtensionType.class, this, FacesConfigPackage.PROPERTY_TYPE__PROPERTY_EXTENSION);
-        }
-        return propertyExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.PROPERTY_TYPE__DESCRIPTION:
-                return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.PROPERTY_TYPE__DISPLAY_NAME:
-                return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.PROPERTY_TYPE__ICON:
-                return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME:
-                return basicSetPropertyName(null, msgs);
-            case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS:
-                return basicSetPropertyClass(null, msgs);
-            case FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE:
-                return basicSetDefaultValue(null, msgs);
-            case FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE:
-                return basicSetSuggestedValue(null, msgs);
-            case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_EXTENSION:
-                return ((InternalEList)getPropertyExtension()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.PROPERTY_TYPE__DESCRIPTION:
-                return getDescription();
-            case FacesConfigPackage.PROPERTY_TYPE__DISPLAY_NAME:
-                return getDisplayName();
-            case FacesConfigPackage.PROPERTY_TYPE__ICON:
-                return getIcon();
-            case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME:
-                return getPropertyName();
-            case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS:
-                return getPropertyClass();
-            case FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE:
-                return getDefaultValue();
-            case FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE:
-                return getSuggestedValue();
-            case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_EXTENSION:
-                return getPropertyExtension();
-            case FacesConfigPackage.PROPERTY_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.PROPERTY_TYPE__DESCRIPTION:
-                getDescription().clear();
-                getDescription().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.PROPERTY_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                getDisplayName().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.PROPERTY_TYPE__ICON:
-                getIcon().clear();
-                getIcon().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME:
-                setPropertyName((PropertyNameType)newValue);
-                return;
-            case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS:
-                setPropertyClass((PropertyClassType)newValue);
-                return;
-            case FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE:
-                setDefaultValue((DefaultValueType)newValue);
-                return;
-            case FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE:
-                setSuggestedValue((SuggestedValueType)newValue);
-                return;
-            case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_EXTENSION:
-                getPropertyExtension().clear();
-                getPropertyExtension().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.PROPERTY_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.PROPERTY_TYPE__DESCRIPTION:
-                getDescription().clear();
-                return;
-            case FacesConfigPackage.PROPERTY_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                return;
-            case FacesConfigPackage.PROPERTY_TYPE__ICON:
-                getIcon().clear();
-                return;
-            case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME:
-                setPropertyName((PropertyNameType)null);
-                return;
-            case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS:
-                setPropertyClass((PropertyClassType)null);
-                return;
-            case FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE:
-                setDefaultValue((DefaultValueType)null);
-                return;
-            case FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE:
-                setSuggestedValue((SuggestedValueType)null);
-                return;
-            case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_EXTENSION:
-                getPropertyExtension().clear();
-                return;
-            case FacesConfigPackage.PROPERTY_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.PROPERTY_TYPE__DESCRIPTION:
-                return description != null && !description.isEmpty();
-            case FacesConfigPackage.PROPERTY_TYPE__DISPLAY_NAME:
-                return displayName != null && !displayName.isEmpty();
-            case FacesConfigPackage.PROPERTY_TYPE__ICON:
-                return icon != null && !icon.isEmpty();
-            case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME:
-                return propertyName != null;
-            case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS:
-                return propertyClass != null;
-            case FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE:
-                return defaultValue != null;
-            case FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE:
-                return suggestedValue != null;
-            case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_EXTENSION:
-                return propertyExtension != null && !propertyExtension.isEmpty();
-            case FacesConfigPackage.PROPERTY_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //PropertyTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RedirectTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RedirectTypeImpl.java
deleted file mode 100644
index 063db6b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RedirectTypeImpl.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RedirectType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Redirect Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RedirectTypeImpl extends EObjectImpl implements RedirectType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected RedirectTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.REDIRECT_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REDIRECT_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.REDIRECT_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.REDIRECT_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.REDIRECT_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.REDIRECT_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //RedirectTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanClassTypeImpl.java
deleted file mode 100644
index dd851ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Referenced Bean Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ReferencedBeanClassTypeImpl extends EObjectImpl implements ReferencedBeanClassType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ReferencedBeanClassTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.REFERENCED_BEAN_CLASS_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ReferencedBeanClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanNameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanNameTypeImpl.java
deleted file mode 100644
index d24ae6d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanNameTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Referenced Bean Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ReferencedBeanNameTypeImpl extends EObjectImpl implements ReferencedBeanNameType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ReferencedBeanNameTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.REFERENCED_BEAN_NAME_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ReferencedBeanNameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanTypeImpl.java
deleted file mode 100644
index f8e870c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanTypeImpl.java
+++ /dev/null
@@ -1,434 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Referenced Bean Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl#getReferencedBeanName <em>Referenced Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl#getReferencedBeanClass <em>Referenced Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ReferencedBeanTypeImpl extends EObjectImpl implements ReferencedBeanType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDescription()
-     * @generated
-     * @ordered
-     */
-	protected EList description = null;
-
-    /**
-     * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDisplayName()
-     * @generated
-     * @ordered
-     */
-	protected EList displayName = null;
-
-    /**
-     * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getIcon()
-     * @generated
-     * @ordered
-     */
-	protected EList icon = null;
-
-    /**
-     * The cached value of the '{@link #getReferencedBeanName() <em>Referenced Bean Name</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getReferencedBeanName()
-     * @generated
-     * @ordered
-     */
-	protected ReferencedBeanNameType referencedBeanName = null;
-
-    /**
-     * The cached value of the '{@link #getReferencedBeanClass() <em>Referenced Bean Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getReferencedBeanClass()
-     * @generated
-     * @ordered
-     */
-	protected ReferencedBeanClassType referencedBeanClass = null;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ReferencedBeanTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDescription() {
-        if (description == null) {
-            description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.REFERENCED_BEAN_TYPE__DESCRIPTION);
-        }
-        return description;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDisplayName() {
-        if (displayName == null) {
-            displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.REFERENCED_BEAN_TYPE__DISPLAY_NAME);
-        }
-        return displayName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getIcon() {
-        if (icon == null) {
-            icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.REFERENCED_BEAN_TYPE__ICON);
-        }
-        return icon;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ReferencedBeanNameType getReferencedBeanName() {
-        return referencedBeanName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetReferencedBeanClass(ReferencedBeanClassType newReferencedBeanClass, NotificationChain msgs) {
-        ReferencedBeanClassType oldReferencedBeanClass = referencedBeanClass;
-        referencedBeanClass = newReferencedBeanClass;
-        if (eNotificationRequired()) {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS, oldReferencedBeanClass, newReferencedBeanClass);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setReferencedBeanClass(ReferencedBeanClassType newReferencedBeanClass) {
-        if (newReferencedBeanClass != referencedBeanClass) {
-            NotificationChain msgs = null;
-            if (referencedBeanClass != null)
-                msgs = ((InternalEObject)referencedBeanClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS, null, msgs);
-            if (newReferencedBeanClass != null)
-                msgs = ((InternalEObject)newReferencedBeanClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS, null, msgs);
-            msgs = basicSetReferencedBeanClass(newReferencedBeanClass, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS, newReferencedBeanClass, newReferencedBeanClass));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__DESCRIPTION:
-                return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__DISPLAY_NAME:
-                return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__ICON:
-                return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME:
-                return basicSetReferencedBeanName(null, msgs);
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS:
-                return basicSetReferencedBeanClass(null, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__DESCRIPTION:
-                return getDescription();
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__DISPLAY_NAME:
-                return getDisplayName();
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__ICON:
-                return getIcon();
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME:
-                return getReferencedBeanName();
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS:
-                return getReferencedBeanClass();
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__DESCRIPTION:
-                getDescription().clear();
-                getDescription().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                getDisplayName().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__ICON:
-                getIcon().clear();
-                getIcon().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME:
-                setReferencedBeanName((ReferencedBeanNameType)newValue);
-                return;
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS:
-                setReferencedBeanClass((ReferencedBeanClassType)newValue);
-                return;
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__DESCRIPTION:
-                getDescription().clear();
-                return;
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                return;
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__ICON:
-                getIcon().clear();
-                return;
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME:
-                setReferencedBeanName((ReferencedBeanNameType)null);
-                return;
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS:
-                setReferencedBeanClass((ReferencedBeanClassType)null);
-                return;
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__DESCRIPTION:
-                return description != null && !description.isEmpty();
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__DISPLAY_NAME:
-                return displayName != null && !displayName.isEmpty();
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__ICON:
-                return icon != null && !icon.isEmpty();
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME:
-                return referencedBeanName != null;
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS:
-                return referencedBeanClass != null;
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ReferencedBeanTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitClassTypeImpl.java
deleted file mode 100644
index 25df611..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Render Kit Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RenderKitClassTypeImpl extends EObjectImpl implements RenderKitClassType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected RenderKitClassTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.RENDER_KIT_CLASS_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_CLASS_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //RenderKitClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitExtensionTypeImpl.java
deleted file mode 100644
index 8a6fd8b..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
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected RenderKitExtensionTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.RENDER_KIT_EXTENSION_TYPE;
-    }
-
-} //RenderKitExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitFactoryTypeImpl.java
deleted file mode 100644
index ca71db5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitFactoryTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Render Kit Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RenderKitFactoryTypeImpl extends EObjectImpl implements RenderKitFactoryType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected RenderKitFactoryTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.RENDER_KIT_FACTORY_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //RenderKitFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitIdTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitIdTypeImpl.java
deleted file mode 100644
index 5b25b96..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitIdTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Render Kit Id Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RenderKitIdTypeImpl extends EObjectImpl implements RenderKitIdType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected RenderKitIdTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.RENDER_KIT_ID_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_ID_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_ID_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.RENDER_KIT_ID_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.RENDER_KIT_ID_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.RENDER_KIT_ID_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.RENDER_KIT_ID_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //RenderKitIdTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitTypeImpl.java
deleted file mode 100644
index fea37fa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitTypeImpl.java
+++ /dev/null
@@ -1,508 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Render Kit Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getRenderKitId <em>Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getRenderKitClass <em>Render Kit Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getRenderer <em>Renderer</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getRenderKitExtension <em>Render Kit Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RenderKitTypeImpl extends EObjectImpl implements RenderKitType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDescription()
-     * @generated
-     * @ordered
-     */
-	protected EList description = null;
-
-    /**
-     * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDisplayName()
-     * @generated
-     * @ordered
-     */
-	protected EList displayName = null;
-
-    /**
-     * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getIcon()
-     * @generated
-     * @ordered
-     */
-	protected EList icon = null;
-
-    /**
-     * The cached value of the '{@link #getRenderKitId() <em>Render Kit Id</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getRenderKitId()
-     * @generated
-     * @ordered
-     */
-	protected RenderKitIdType renderKitId = null;
-
-    /**
-     * The cached value of the '{@link #getRenderKitClass() <em>Render Kit Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getRenderKitClass()
-     * @generated
-     * @ordered
-     */
-	protected RenderKitClassType renderKitClass = null;
-
-    /**
-     * The cached value of the '{@link #getRenderer() <em>Renderer</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getRenderer()
-     * @generated
-     * @ordered
-     */
-	protected EList renderer = null;
-
-    /**
-     * The cached value of the '{@link #getRenderKitExtension() <em>Render Kit Extension</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getRenderKitExtension()
-     * @generated
-     * @ordered
-     */
-    protected EList renderKitExtension = null;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected RenderKitTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.RENDER_KIT_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDescription() {
-        if (description == null) {
-            description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.RENDER_KIT_TYPE__DESCRIPTION);
-        }
-        return description;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDisplayName() {
-        if (displayName == null) {
-            displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.RENDER_KIT_TYPE__DISPLAY_NAME);
-        }
-        return displayName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getIcon() {
-        if (icon == null) {
-            icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.RENDER_KIT_TYPE__ICON);
-        }
-        return icon;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public RenderKitIdType getRenderKitId() {
-        return renderKitId;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetRenderKitClass(RenderKitClassType newRenderKitClass, NotificationChain msgs) {
-        RenderKitClassType oldRenderKitClass = renderKitClass;
-        renderKitClass = newRenderKitClass;
-        if (eNotificationRequired()) {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS, oldRenderKitClass, newRenderKitClass);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setRenderKitClass(RenderKitClassType newRenderKitClass) {
-        if (newRenderKitClass != renderKitClass) {
-            NotificationChain msgs = null;
-            if (renderKitClass != null)
-                msgs = ((InternalEObject)renderKitClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS, null, msgs);
-            if (newRenderKitClass != null)
-                msgs = ((InternalEObject)newRenderKitClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS, null, msgs);
-            msgs = basicSetRenderKitClass(newRenderKitClass, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS, newRenderKitClass, newRenderKitClass));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getRenderer() {
-        if (renderer == null) {
-            renderer = new EObjectContainmentEList(RendererType.class, this, FacesConfigPackage.RENDER_KIT_TYPE__RENDERER);
-        }
-        return renderer;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getRenderKitExtension() {
-        if (renderKitExtension == null) {
-            renderKitExtension = new EObjectContainmentEList(RenderKitExtensionType.class, this, FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION);
-        }
-        return renderKitExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDER_KIT_TYPE__DESCRIPTION:
-                return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.RENDER_KIT_TYPE__DISPLAY_NAME:
-                return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.RENDER_KIT_TYPE__ICON:
-                return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID:
-                return basicSetRenderKitId(null, msgs);
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS:
-                return basicSetRenderKitClass(null, msgs);
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDERER:
-                return ((InternalEList)getRenderer()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION:
-                return ((InternalEList)getRenderKitExtension()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDER_KIT_TYPE__DESCRIPTION:
-                return getDescription();
-            case FacesConfigPackage.RENDER_KIT_TYPE__DISPLAY_NAME:
-                return getDisplayName();
-            case FacesConfigPackage.RENDER_KIT_TYPE__ICON:
-                return getIcon();
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID:
-                return getRenderKitId();
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS:
-                return getRenderKitClass();
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDERER:
-                return getRenderer();
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION:
-                return getRenderKitExtension();
-            case FacesConfigPackage.RENDER_KIT_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDER_KIT_TYPE__DESCRIPTION:
-                getDescription().clear();
-                getDescription().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.RENDER_KIT_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                getDisplayName().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.RENDER_KIT_TYPE__ICON:
-                getIcon().clear();
-                getIcon().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID:
-                setRenderKitId((RenderKitIdType)newValue);
-                return;
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS:
-                setRenderKitClass((RenderKitClassType)newValue);
-                return;
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDERER:
-                getRenderer().clear();
-                getRenderer().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION:
-                getRenderKitExtension().clear();
-                getRenderKitExtension().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.RENDER_KIT_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDER_KIT_TYPE__DESCRIPTION:
-                getDescription().clear();
-                return;
-            case FacesConfigPackage.RENDER_KIT_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                return;
-            case FacesConfigPackage.RENDER_KIT_TYPE__ICON:
-                getIcon().clear();
-                return;
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID:
-                setRenderKitId((RenderKitIdType)null);
-                return;
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS:
-                setRenderKitClass((RenderKitClassType)null);
-                return;
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDERER:
-                getRenderer().clear();
-                return;
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION:
-                getRenderKitExtension().clear();
-                return;
-            case FacesConfigPackage.RENDER_KIT_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDER_KIT_TYPE__DESCRIPTION:
-                return description != null && !description.isEmpty();
-            case FacesConfigPackage.RENDER_KIT_TYPE__DISPLAY_NAME:
-                return displayName != null && !displayName.isEmpty();
-            case FacesConfigPackage.RENDER_KIT_TYPE__ICON:
-                return icon != null && !icon.isEmpty();
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID:
-                return renderKitId != null;
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS:
-                return renderKitClass != null;
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDERER:
-                return renderer != null && !renderer.isEmpty();
-            case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION:
-                return renderKitExtension != null && !renderKitExtension.isEmpty();
-            case FacesConfigPackage.RENDER_KIT_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //RenderKitTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererClassTypeImpl.java
deleted file mode 100644
index b3949ab..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Renderer Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RendererClassTypeImpl extends EObjectImpl implements RendererClassType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected RendererClassTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.RENDERER_CLASS_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_CLASS_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDERER_CLASS_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.RENDERER_CLASS_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDERER_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.RENDERER_CLASS_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDERER_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.RENDERER_CLASS_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDERER_CLASS_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.RENDERER_CLASS_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //RendererClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererExtensionTypeImpl.java
deleted file mode 100644
index 23ad197..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererExtensionTypeImpl.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.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
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected RendererExtensionTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.RENDERER_EXTENSION_TYPE;
-    }
-
-} //RendererExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererTypeImpl.java
deleted file mode 100644
index 242635d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererTypeImpl.java
+++ /dev/null
@@ -1,612 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Renderer Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getComponentFamily <em>Component Family</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getRendererType <em>Renderer Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getRendererClass <em>Renderer Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getFacet <em>Facet</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getRendererExtension <em>Renderer Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RendererTypeImpl extends EObjectImpl implements RendererType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDescription()
-     * @generated
-     * @ordered
-     */
-	protected EList description = null;
-
-    /**
-     * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDisplayName()
-     * @generated
-     * @ordered
-     */
-	protected EList displayName = null;
-
-    /**
-     * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getIcon()
-     * @generated
-     * @ordered
-     */
-	protected EList icon = null;
-
-    /**
-     * The cached value of the '{@link #getComponentFamily() <em>Component Family</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getComponentFamily()
-     * @generated
-     * @ordered
-     */
-	protected ComponentFamilyType componentFamily = null;
-
-    /**
-     * The cached value of the '{@link #getRendererType() <em>Renderer Type</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getRendererType()
-     * @generated
-     * @ordered
-     */
-	protected RendererTypeType rendererType = null;
-
-    /**
-     * The cached value of the '{@link #getRendererClass() <em>Renderer Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getRendererClass()
-     * @generated
-     * @ordered
-     */
-	protected RendererClassType rendererClass = null;
-
-    /**
-     * The cached value of the '{@link #getFacet() <em>Facet</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getFacet()
-     * @generated
-     * @ordered
-     */
-	protected EList facet = null;
-
-    /**
-     * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getAttribute()
-     * @generated
-     * @ordered
-     */
-	protected EList attribute = null;
-
-    /**
-     * The cached value of the '{@link #getRendererExtension() <em>Renderer Extension</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getRendererExtension()
-     * @generated
-     * @ordered
-     */
-	protected EList rendererExtension = null;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected RendererTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.RENDERER_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDescription() {
-        if (description == null) {
-            description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.RENDERER_TYPE__DESCRIPTION);
-        }
-        return description;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDisplayName() {
-        if (displayName == null) {
-            displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.RENDERER_TYPE__DISPLAY_NAME);
-        }
-        return displayName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getIcon() {
-        if (icon == null) {
-            icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.RENDERER_TYPE__ICON);
-        }
-        return icon;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ComponentFamilyType getComponentFamily() {
-        return componentFamily;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetRendererClass(RendererClassType newRendererClass, NotificationChain msgs) {
-        RendererClassType oldRendererClass = rendererClass;
-        rendererClass = newRendererClass;
-        if (eNotificationRequired()) {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS, oldRendererClass, newRendererClass);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setRendererClass(RendererClassType newRendererClass) {
-        if (newRendererClass != rendererClass) {
-            NotificationChain msgs = null;
-            if (rendererClass != null)
-                msgs = ((InternalEObject)rendererClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS, null, msgs);
-            if (newRendererClass != null)
-                msgs = ((InternalEObject)newRendererClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS, null, msgs);
-            msgs = basicSetRendererClass(newRendererClass, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS, newRendererClass, newRendererClass));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getFacet() {
-        if (facet == null) {
-            facet = new EObjectContainmentEList(FacetType.class, this, FacesConfigPackage.RENDERER_TYPE__FACET);
-        }
-        return facet;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getAttribute() {
-        if (attribute == null) {
-            attribute = new EObjectContainmentEList(AttributeType.class, this, FacesConfigPackage.RENDERER_TYPE__ATTRIBUTE);
-        }
-        return attribute;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getRendererExtension() {
-        if (rendererExtension == null) {
-            rendererExtension = new EObjectContainmentEList(RendererExtensionType.class, this, FacesConfigPackage.RENDERER_TYPE__RENDERER_EXTENSION);
-        }
-        return rendererExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDERER_TYPE__DESCRIPTION:
-                return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.RENDERER_TYPE__DISPLAY_NAME:
-                return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.RENDERER_TYPE__ICON:
-                return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY:
-                return basicSetComponentFamily(null, msgs);
-            case FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE:
-                return basicSetRendererType(null, msgs);
-            case FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS:
-                return basicSetRendererClass(null, msgs);
-            case FacesConfigPackage.RENDERER_TYPE__FACET:
-                return ((InternalEList)getFacet()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.RENDERER_TYPE__ATTRIBUTE:
-                return ((InternalEList)getAttribute()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.RENDERER_TYPE__RENDERER_EXTENSION:
-                return ((InternalEList)getRendererExtension()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDERER_TYPE__DESCRIPTION:
-                return getDescription();
-            case FacesConfigPackage.RENDERER_TYPE__DISPLAY_NAME:
-                return getDisplayName();
-            case FacesConfigPackage.RENDERER_TYPE__ICON:
-                return getIcon();
-            case FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY:
-                return getComponentFamily();
-            case FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE:
-                return getRendererType();
-            case FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS:
-                return getRendererClass();
-            case FacesConfigPackage.RENDERER_TYPE__FACET:
-                return getFacet();
-            case FacesConfigPackage.RENDERER_TYPE__ATTRIBUTE:
-                return getAttribute();
-            case FacesConfigPackage.RENDERER_TYPE__RENDERER_EXTENSION:
-                return getRendererExtension();
-            case FacesConfigPackage.RENDERER_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDERER_TYPE__DESCRIPTION:
-                getDescription().clear();
-                getDescription().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.RENDERER_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                getDisplayName().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.RENDERER_TYPE__ICON:
-                getIcon().clear();
-                getIcon().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY:
-                setComponentFamily((ComponentFamilyType)newValue);
-                return;
-            case FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE:
-                setRendererType((RendererTypeType)newValue);
-                return;
-            case FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS:
-                setRendererClass((RendererClassType)newValue);
-                return;
-            case FacesConfigPackage.RENDERER_TYPE__FACET:
-                getFacet().clear();
-                getFacet().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.RENDERER_TYPE__ATTRIBUTE:
-                getAttribute().clear();
-                getAttribute().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.RENDERER_TYPE__RENDERER_EXTENSION:
-                getRendererExtension().clear();
-                getRendererExtension().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.RENDERER_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDERER_TYPE__DESCRIPTION:
-                getDescription().clear();
-                return;
-            case FacesConfigPackage.RENDERER_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                return;
-            case FacesConfigPackage.RENDERER_TYPE__ICON:
-                getIcon().clear();
-                return;
-            case FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY:
-                setComponentFamily((ComponentFamilyType)null);
-                return;
-            case FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE:
-                setRendererType((RendererTypeType)null);
-                return;
-            case FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS:
-                setRendererClass((RendererClassType)null);
-                return;
-            case FacesConfigPackage.RENDERER_TYPE__FACET:
-                getFacet().clear();
-                return;
-            case FacesConfigPackage.RENDERER_TYPE__ATTRIBUTE:
-                getAttribute().clear();
-                return;
-            case FacesConfigPackage.RENDERER_TYPE__RENDERER_EXTENSION:
-                getRendererExtension().clear();
-                return;
-            case FacesConfigPackage.RENDERER_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDERER_TYPE__DESCRIPTION:
-                return description != null && !description.isEmpty();
-            case FacesConfigPackage.RENDERER_TYPE__DISPLAY_NAME:
-                return displayName != null && !displayName.isEmpty();
-            case FacesConfigPackage.RENDERER_TYPE__ICON:
-                return icon != null && !icon.isEmpty();
-            case FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY:
-                return componentFamily != null;
-            case FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE:
-                return rendererType != null;
-            case FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS:
-                return rendererClass != null;
-            case FacesConfigPackage.RENDERER_TYPE__FACET:
-                return facet != null && !facet.isEmpty();
-            case FacesConfigPackage.RENDERER_TYPE__ATTRIBUTE:
-                return attribute != null && !attribute.isEmpty();
-            case FacesConfigPackage.RENDERER_TYPE__RENDERER_EXTENSION:
-                return rendererExtension != null && !rendererExtension.isEmpty();
-            case FacesConfigPackage.RENDERER_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //RendererTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererTypeTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererTypeTypeImpl.java
deleted file mode 100644
index a42393b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererTypeTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Renderer Type Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RendererTypeTypeImpl extends EObjectImpl implements RendererTypeType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected RendererTypeTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.RENDERER_TYPE_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDERER_TYPE_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.RENDERER_TYPE_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDERER_TYPE_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.RENDERER_TYPE_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDERER_TYPE_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.RENDERER_TYPE_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.RENDERER_TYPE_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.RENDERER_TYPE_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //RendererTypeTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ResourceBundleTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ResourceBundleTypeImpl.java
deleted file mode 100644
index 07c68fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ResourceBundleTypeImpl.java
+++ /dev/null
@@ -1,426 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-
-import org.eclipse.jst.jsf.facesconfig.emf.BaseNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType;
-import org.eclipse.jst.jsf.facesconfig.emf.VarType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Resource Bundle Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl#getBaseName <em>Base Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl#getVar <em>Var</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ResourceBundleTypeImpl extends EObjectImpl implements ResourceBundleType {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getDescription()
-     * @generated
-     * @ordered
-     */
-    protected EList description = null;
-
-    /**
-     * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getDisplayName()
-     * @generated
-     * @ordered
-     */
-    protected EList displayName = null;
-
-    /**
-     * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getIcon()
-     * @generated
-     * @ordered
-     */
-    protected EList icon = null;
-
-    /**
-     * The cached value of the '{@link #getBaseName() <em>Base Name</em>}' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getBaseName()
-     * @generated
-     * @ordered
-     */
-    protected BaseNameType baseName = null;
-
-    /**
-     * The cached value of the '{@link #getVar() <em>Var</em>}' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getVar()
-     * @generated
-     * @ordered
-     */
-    protected VarType var = null;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ResourceBundleTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getDescription() {
-        if (description == null) {
-            description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DESCRIPTION);
-        }
-        return description;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getDisplayName() {
-        if (displayName == null) {
-            displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME);
-        }
-        return displayName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getIcon() {
-        if (icon == null) {
-            icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ICON);
-        }
-        return icon;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public BaseNameType getBaseName() {
-        if (baseName != null && baseName.eIsProxy()) {
-            InternalEObject oldBaseName = (InternalEObject)baseName;
-            baseName = (BaseNameType)eResolveProxy(oldBaseName);
-            if (baseName != oldBaseName) {
-                if (eNotificationRequired())
-                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, FacesConfigPackage.RESOURCE_BUNDLE_TYPE__BASE_NAME, oldBaseName, baseName));
-            }
-        }
-        return baseName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- 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 -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public VarType basicGetVar() {
-        return var;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setVar(VarType newVar) {
-        VarType oldVar = var;
-        var = newVar;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RESOURCE_BUNDLE_TYPE__VAR, oldVar, var));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DESCRIPTION:
-                return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME:
-                return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ICON:
-                return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DESCRIPTION:
-                return getDescription();
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME:
-                return getDisplayName();
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ICON:
-                return getIcon();
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__BASE_NAME:
-                if (resolve) return getBaseName();
-                return basicGetBaseName();
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__VAR:
-                if (resolve) return getVar();
-                return basicGetVar();
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DESCRIPTION:
-                getDescription().clear();
-                getDescription().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                getDisplayName().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ICON:
-                getIcon().clear();
-                getIcon().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__BASE_NAME:
-                setBaseName((BaseNameType)newValue);
-                return;
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__VAR:
-                setVar((VarType)newValue);
-                return;
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DESCRIPTION:
-                getDescription().clear();
-                return;
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                return;
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ICON:
-                getIcon().clear();
-                return;
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__BASE_NAME:
-                setBaseName((BaseNameType)null);
-                return;
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__VAR:
-                setVar((VarType)null);
-                return;
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DESCRIPTION:
-                return description != null && !description.isEmpty();
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME:
-                return displayName != null && !displayName.isEmpty();
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ICON:
-                return icon != null && !icon.isEmpty();
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__BASE_NAME:
-                return baseName != null;
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__VAR:
-                return var != null;
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ResourceBundleTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SmallIconTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SmallIconTypeImpl.java
deleted file mode 100644
index 6b2621e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SmallIconTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SmallIconType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Small Icon Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SmallIconTypeImpl extends EObjectImpl implements SmallIconType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected SmallIconTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.SMALL_ICON_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SMALL_ICON_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SMALL_ICON_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.SMALL_ICON_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.SMALL_ICON_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.SMALL_ICON_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.SMALL_ICON_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.SMALL_ICON_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.SMALL_ICON_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.SMALL_ICON_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.SMALL_ICON_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //SmallIconTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/StateManagerTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/StateManagerTypeImpl.java
deleted file mode 100644
index 0b7d605..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/StateManagerTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.StateManagerType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>State Manager Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class StateManagerTypeImpl extends EObjectImpl implements StateManagerType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected StateManagerTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.STATE_MANAGER_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.STATE_MANAGER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.STATE_MANAGER_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.STATE_MANAGER_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.STATE_MANAGER_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.STATE_MANAGER_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.STATE_MANAGER_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.STATE_MANAGER_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.STATE_MANAGER_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.STATE_MANAGER_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.STATE_MANAGER_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //StateManagerTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SuggestedValueTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SuggestedValueTypeImpl.java
deleted file mode 100644
index ea41fd4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SuggestedValueTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Suggested Value Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SuggestedValueTypeImpl extends EObjectImpl implements SuggestedValueType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected SuggestedValueTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.SUGGESTED_VALUE_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SUGGESTED_VALUE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SUGGESTED_VALUE_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.SUGGESTED_VALUE_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.SUGGESTED_VALUE_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.SUGGESTED_VALUE_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.SUGGESTED_VALUE_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.SUGGESTED_VALUE_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.SUGGESTED_VALUE_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.SUGGESTED_VALUE_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.SUGGESTED_VALUE_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //SuggestedValueTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SupportedLocaleTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SupportedLocaleTypeImpl.java
deleted file mode 100644
index 85fe6be..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SupportedLocaleTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Supported Locale Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SupportedLocaleTypeImpl extends EObjectImpl implements SupportedLocaleType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected SupportedLocaleTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.SUPPORTED_LOCALE_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SUPPORTED_LOCALE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SUPPORTED_LOCALE_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //SupportedLocaleTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ToViewIdTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ToViewIdTypeImpl.java
deleted file mode 100644
index 56e3915..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ToViewIdTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>To View Id Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ToViewIdTypeImpl extends EObjectImpl implements ToViewIdType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ToViewIdTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.TO_VIEW_ID_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.TO_VIEW_ID_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.TO_VIEW_ID_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.TO_VIEW_ID_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.TO_VIEW_ID_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.TO_VIEW_ID_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.TO_VIEW_ID_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.TO_VIEW_ID_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.TO_VIEW_ID_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.TO_VIEW_ID_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.TO_VIEW_ID_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ToViewIdTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorClassTypeImpl.java
deleted file mode 100644
index f378cac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Validator Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ValidatorClassTypeImpl extends EObjectImpl implements ValidatorClassType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ValidatorClassTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.VALIDATOR_CLASS_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_CLASS_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.VALIDATOR_CLASS_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.VALIDATOR_CLASS_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.VALIDATOR_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.VALIDATOR_CLASS_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.VALIDATOR_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.VALIDATOR_CLASS_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.VALIDATOR_CLASS_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.VALIDATOR_CLASS_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ValidatorClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorExtensionTypeImpl.java
deleted file mode 100644
index d5dbc74..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
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected ValidatorExtensionTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.VALIDATOR_EXTENSION_TYPE;
-    }
-
-} //ValidatorExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorIdTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorIdTypeImpl.java
deleted file mode 100644
index 281de13..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorIdTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Validator Id Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ValidatorIdTypeImpl extends EObjectImpl implements ValidatorIdType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ValidatorIdTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.VALIDATOR_ID_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_ID_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_ID_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.VALIDATOR_ID_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.VALIDATOR_ID_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.VALIDATOR_ID_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.VALIDATOR_ID_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.VALIDATOR_ID_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.VALIDATOR_ID_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.VALIDATOR_ID_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.VALIDATOR_ID_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ValidatorIdTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorTypeImpl.java
deleted file mode 100644
index ed7b1e7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorTypeImpl.java
+++ /dev/null
@@ -1,545 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Validator Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getValidatorId <em>Validator Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getValidatorClass <em>Validator Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getValidatorExtension <em>Validator Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ValidatorTypeImpl extends EObjectImpl implements ValidatorType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDescription()
-     * @generated
-     * @ordered
-     */
-	protected EList description = null;
-
-    /**
-     * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getDisplayName()
-     * @generated
-     * @ordered
-     */
-	protected EList displayName = null;
-
-    /**
-     * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getIcon()
-     * @generated
-     * @ordered
-     */
-	protected EList icon = null;
-
-    /**
-     * The cached value of the '{@link #getValidatorId() <em>Validator Id</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getValidatorId()
-     * @generated
-     * @ordered
-     */
-	protected ValidatorIdType validatorId = null;
-
-    /**
-     * The cached value of the '{@link #getValidatorClass() <em>Validator Class</em>}' containment reference.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getValidatorClass()
-     * @generated
-     * @ordered
-     */
-	protected ValidatorClassType validatorClass = null;
-
-    /**
-     * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getAttribute()
-     * @generated
-     * @ordered
-     */
-	protected EList attribute = null;
-
-    /**
-     * The cached value of the '{@link #getProperty() <em>Property</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getProperty()
-     * @generated
-     * @ordered
-     */
-	protected EList property = null;
-
-    /**
-     * The cached value of the '{@link #getValidatorExtension() <em>Validator Extension</em>}' containment reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getValidatorExtension()
-     * @generated
-     * @ordered
-     */
-    protected EList validatorExtension = null;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ValidatorTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.VALIDATOR_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDescription() {
-        if (description == null) {
-            description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.VALIDATOR_TYPE__DESCRIPTION);
-        }
-        return description;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getDisplayName() {
-        if (displayName == null) {
-            displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.VALIDATOR_TYPE__DISPLAY_NAME);
-        }
-        return displayName;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getIcon() {
-        if (icon == null) {
-            icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.VALIDATOR_TYPE__ICON);
-        }
-        return icon;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public ValidatorIdType getValidatorId() {
-        return validatorId;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- 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 -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public NotificationChain basicSetValidatorClass(ValidatorClassType newValidatorClass, NotificationChain msgs) {
-        ValidatorClassType oldValidatorClass = validatorClass;
-        validatorClass = newValidatorClass;
-        if (eNotificationRequired()) {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS, oldValidatorClass, newValidatorClass);
-            if (msgs == null) msgs = notification; else msgs.add(notification);
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setValidatorClass(ValidatorClassType newValidatorClass) {
-        if (newValidatorClass != validatorClass) {
-            NotificationChain msgs = null;
-            if (validatorClass != null)
-                msgs = ((InternalEObject)validatorClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS, null, msgs);
-            if (newValidatorClass != null)
-                msgs = ((InternalEObject)newValidatorClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS, null, msgs);
-            msgs = basicSetValidatorClass(newValidatorClass, msgs);
-            if (msgs != null) msgs.dispatch();
-        }
-        else if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS, newValidatorClass, newValidatorClass));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getAttribute() {
-        if (attribute == null) {
-            attribute = new EObjectContainmentEList(AttributeType.class, this, FacesConfigPackage.VALIDATOR_TYPE__ATTRIBUTE);
-        }
-        return attribute;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public EList getProperty() {
-        if (property == null) {
-            property = new EObjectContainmentEList(PropertyType.class, this, FacesConfigPackage.VALIDATOR_TYPE__PROPERTY);
-        }
-        return property;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public EList getValidatorExtension() {
-        if (validatorExtension == null) {
-            validatorExtension = new EObjectContainmentEList(ValidatorExtensionType.class, this, FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_EXTENSION);
-        }
-        return validatorExtension;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-        switch (featureID) {
-            case FacesConfigPackage.VALIDATOR_TYPE__DESCRIPTION:
-                return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.VALIDATOR_TYPE__DISPLAY_NAME:
-                return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.VALIDATOR_TYPE__ICON:
-                return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID:
-                return basicSetValidatorId(null, msgs);
-            case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS:
-                return basicSetValidatorClass(null, msgs);
-            case FacesConfigPackage.VALIDATOR_TYPE__ATTRIBUTE:
-                return ((InternalEList)getAttribute()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.VALIDATOR_TYPE__PROPERTY:
-                return ((InternalEList)getProperty()).basicRemove(otherEnd, msgs);
-            case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_EXTENSION:
-                return ((InternalEList)getValidatorExtension()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.VALIDATOR_TYPE__DESCRIPTION:
-                return getDescription();
-            case FacesConfigPackage.VALIDATOR_TYPE__DISPLAY_NAME:
-                return getDisplayName();
-            case FacesConfigPackage.VALIDATOR_TYPE__ICON:
-                return getIcon();
-            case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID:
-                return getValidatorId();
-            case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS:
-                return getValidatorClass();
-            case FacesConfigPackage.VALIDATOR_TYPE__ATTRIBUTE:
-                return getAttribute();
-            case FacesConfigPackage.VALIDATOR_TYPE__PROPERTY:
-                return getProperty();
-            case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_EXTENSION:
-                return getValidatorExtension();
-            case FacesConfigPackage.VALIDATOR_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.VALIDATOR_TYPE__DESCRIPTION:
-                getDescription().clear();
-                getDescription().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.VALIDATOR_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                getDisplayName().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.VALIDATOR_TYPE__ICON:
-                getIcon().clear();
-                getIcon().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID:
-                setValidatorId((ValidatorIdType)newValue);
-                return;
-            case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS:
-                setValidatorClass((ValidatorClassType)newValue);
-                return;
-            case FacesConfigPackage.VALIDATOR_TYPE__ATTRIBUTE:
-                getAttribute().clear();
-                getAttribute().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.VALIDATOR_TYPE__PROPERTY:
-                getProperty().clear();
-                getProperty().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_EXTENSION:
-                getValidatorExtension().clear();
-                getValidatorExtension().addAll((Collection)newValue);
-                return;
-            case FacesConfigPackage.VALIDATOR_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.VALIDATOR_TYPE__DESCRIPTION:
-                getDescription().clear();
-                return;
-            case FacesConfigPackage.VALIDATOR_TYPE__DISPLAY_NAME:
-                getDisplayName().clear();
-                return;
-            case FacesConfigPackage.VALIDATOR_TYPE__ICON:
-                getIcon().clear();
-                return;
-            case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID:
-                setValidatorId((ValidatorIdType)null);
-                return;
-            case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS:
-                setValidatorClass((ValidatorClassType)null);
-                return;
-            case FacesConfigPackage.VALIDATOR_TYPE__ATTRIBUTE:
-                getAttribute().clear();
-                return;
-            case FacesConfigPackage.VALIDATOR_TYPE__PROPERTY:
-                getProperty().clear();
-                return;
-            case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_EXTENSION:
-                getValidatorExtension().clear();
-                return;
-            case FacesConfigPackage.VALIDATOR_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.VALIDATOR_TYPE__DESCRIPTION:
-                return description != null && !description.isEmpty();
-            case FacesConfigPackage.VALIDATOR_TYPE__DISPLAY_NAME:
-                return displayName != null && !displayName.isEmpty();
-            case FacesConfigPackage.VALIDATOR_TYPE__ICON:
-                return icon != null && !icon.isEmpty();
-            case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID:
-                return validatorId != null;
-            case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS:
-                return validatorClass != null;
-            case FacesConfigPackage.VALIDATOR_TYPE__ATTRIBUTE:
-                return attribute != null && !attribute.isEmpty();
-            case FacesConfigPackage.VALIDATOR_TYPE__PROPERTY:
-                return property != null && !property.isEmpty();
-            case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_EXTENSION:
-                return validatorExtension != null && !validatorExtension.isEmpty();
-            case FacesConfigPackage.VALIDATOR_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ValidatorTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValueClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValueClassTypeImpl.java
deleted file mode 100644
index 2285d57..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValueClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Value Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ValueClassTypeImpl extends EObjectImpl implements ValueClassType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ValueClassTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.VALUE_CLASS_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALUE_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALUE_CLASS_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.VALUE_CLASS_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.VALUE_CLASS_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.VALUE_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.VALUE_CLASS_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.VALUE_CLASS_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.VALUE_CLASS_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.VALUE_CLASS_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.VALUE_CLASS_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ValueClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValueTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValueTypeImpl.java
deleted file mode 100644
index a155a50..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValueTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Value Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ValueTypeImpl extends EObjectImpl implements ValueType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ValueTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.VALUE_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALUE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALUE_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.VALUE_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.VALUE_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.VALUE_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.VALUE_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.VALUE_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.VALUE_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.VALUE_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.VALUE_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ValueTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VarTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VarTypeImpl.java
deleted file mode 100644
index 4ffed3d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VarTypeImpl.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.VarType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Var Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VarTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VarTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class VarTypeImpl extends EObjectImpl implements VarType {
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-    protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-    protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-    protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected VarTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.VAR_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VAR_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VAR_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.VAR_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.VAR_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.VAR_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.VAR_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.VAR_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.VAR_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.VAR_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.VAR_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //VarTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VariableResolverTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VariableResolverTypeImpl.java
deleted file mode 100644
index 484d941..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VariableResolverTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Variable Resolver Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class VariableResolverTypeImpl extends EObjectImpl implements VariableResolverType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected VariableResolverTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.VARIABLE_RESOLVER_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VARIABLE_RESOLVER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VARIABLE_RESOLVER_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //VariableResolverTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ViewHandlerTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ViewHandlerTypeImpl.java
deleted file mode 100644
index d56647d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ViewHandlerTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>View Handler Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ViewHandlerTypeImpl extends EObjectImpl implements ViewHandlerType {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getTextContent()
-     * @generated
-     * @ordered
-     */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-     * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-     * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @see #getId()
-     * @generated
-     * @ordered
-     */
-	protected String id = ID_EDEFAULT;
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected ViewHandlerTypeImpl() {
-        super();
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected EClass eStaticClass() {
-        return FacesConfigPackage.Literals.VIEW_HANDLER_TYPE;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getTextContent() {
-        return textContent;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setTextContent(String newTextContent) {
-        String oldTextContent = textContent;
-        textContent = newTextContent;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VIEW_HANDLER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String getId() {
-        return id;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public void setId(String newId) {
-        String oldId = id;
-        id = newId;
-        if (eNotificationRequired())
-            eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VIEW_HANDLER_TYPE__ID, oldId, id));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-        switch (featureID) {
-            case FacesConfigPackage.VIEW_HANDLER_TYPE__TEXT_CONTENT:
-                return getTextContent();
-            case FacesConfigPackage.VIEW_HANDLER_TYPE__ID:
-                return getId();
-        }
-        return super.eGet(featureID, resolve, coreType);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-            case FacesConfigPackage.VIEW_HANDLER_TYPE__TEXT_CONTENT:
-                setTextContent((String)newValue);
-                return;
-            case FacesConfigPackage.VIEW_HANDLER_TYPE__ID:
-                setId((String)newValue);
-                return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public void eUnset(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.VIEW_HANDLER_TYPE__TEXT_CONTENT:
-                setTextContent(TEXT_CONTENT_EDEFAULT);
-                return;
-            case FacesConfigPackage.VIEW_HANDLER_TYPE__ID:
-                setId(ID_EDEFAULT);
-                return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public boolean eIsSet(int featureID) {
-        switch (featureID) {
-            case FacesConfigPackage.VIEW_HANDLER_TYPE__TEXT_CONTENT:
-                return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-            case FacesConfigPackage.VIEW_HANDLER_TYPE__ID:
-                return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-        }
-        return super.eIsSet(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public String toString() {
-        if (eIsProxy()) return super.toString();
-
-        StringBuffer result = new StringBuffer(super.toString());
-        result.append(" (textContent: ");
-        result.append(textContent);
-        result.append(", id: ");
-        result.append(id);
-        result.append(')');
-        return result.toString();
-    }
-
-} //ViewHandlerTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/FacesConfigAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/FacesConfigAdapterFactory.java
deleted file mode 100644
index b063887..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/FacesConfigAdapterFactory.java
+++ /dev/null
@@ -1,1764 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.*;
-
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage
- * @generated
- */
-public class FacesConfigAdapterFactory extends AdapterFactoryImpl {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached model package.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected static FacesConfigPackage modelPackage;
-
-    /**
-     * Creates an instance of the adapter factory.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public FacesConfigAdapterFactory() {
-        if (modelPackage == null) {
-            modelPackage = FacesConfigPackage.eINSTANCE;
-        }
-    }
-
-    /**
-     * Returns whether this factory is applicable for the type of the object.
-     * <!-- begin-user-doc -->
-	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-	 * <!-- end-user-doc -->
-     * @return whether this factory is applicable for the type of the object.
-     * @generated
-     */
-	public boolean isFactoryForType(Object object) {
-        if (object == modelPackage) {
-            return true;
-        }
-        if (object instanceof EObject) {
-            return ((EObject)object).eClass().getEPackage() == modelPackage;
-        }
-        return false;
-    }
-
-    /**
-     * The switch the delegates to the <code>createXXX</code> methods.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected FacesConfigSwitch modelSwitch =
-        new FacesConfigSwitch() {
-            public Object caseActionListenerType(ActionListenerType object) {
-                return createActionListenerTypeAdapter();
-            }
-            public Object caseApplicationFactoryType(ApplicationFactoryType object) {
-                return createApplicationFactoryTypeAdapter();
-            }
-            public Object caseApplicationType(ApplicationType object) {
-                return createApplicationTypeAdapter();
-            }
-            public Object caseAttributeClassType(AttributeClassType object) {
-                return createAttributeClassTypeAdapter();
-            }
-            public Object caseAttributeExtensionType(AttributeExtensionType object) {
-                return createAttributeExtensionTypeAdapter();
-            }
-            public Object caseAttributeNameType(AttributeNameType object) {
-                return createAttributeNameTypeAdapter();
-            }
-            public Object caseAttributeType(AttributeType object) {
-                return createAttributeTypeAdapter();
-            }
-            public Object caseComponentClassType(ComponentClassType object) {
-                return createComponentClassTypeAdapter();
-            }
-            public Object caseComponentExtensionType(ComponentExtensionType object) {
-                return createComponentExtensionTypeAdapter();
-            }
-            public Object caseComponentFamilyType(ComponentFamilyType object) {
-                return createComponentFamilyTypeAdapter();
-            }
-            public Object caseComponentType(ComponentType object) {
-                return createComponentTypeAdapter();
-            }
-            public Object caseComponentTypeType(ComponentTypeType object) {
-                return createComponentTypeTypeAdapter();
-            }
-            public Object caseConverterClassType(ConverterClassType object) {
-                return createConverterClassTypeAdapter();
-            }
-            public Object caseConverterForClassType(ConverterForClassType object) {
-                return createConverterForClassTypeAdapter();
-            }
-            public Object caseConverterIdType(ConverterIdType object) {
-                return createConverterIdTypeAdapter();
-            }
-            public Object caseConverterType(ConverterType object) {
-                return createConverterTypeAdapter();
-            }
-            public Object caseDefaultLocaleType(DefaultLocaleType object) {
-                return createDefaultLocaleTypeAdapter();
-            }
-            public Object caseDefaultRenderKitIdType(DefaultRenderKitIdType object) {
-                return createDefaultRenderKitIdTypeAdapter();
-            }
-            public Object caseDefaultValueType(DefaultValueType object) {
-                return createDefaultValueTypeAdapter();
-            }
-            public Object caseDescriptionType(DescriptionType object) {
-                return createDescriptionTypeAdapter();
-            }
-            public Object caseDisplayNameType(DisplayNameType object) {
-                return createDisplayNameTypeAdapter();
-            }
-            public Object caseDocumentRoot(DocumentRoot object) {
-                return createDocumentRootAdapter();
-            }
-            public Object caseDynamicAttribute(DynamicAttribute object) {
-                return createDynamicAttributeAdapter();
-            }
-            public Object caseDynamicElement(DynamicElement object) {
-                return createDynamicElementAdapter();
-            }
-            public Object caseFacesConfigType(FacesConfigType object) {
-                return createFacesConfigTypeAdapter();
-            }
-            public Object caseFacesContextFactoryType(FacesContextFactoryType object) {
-                return createFacesContextFactoryTypeAdapter();
-            }
-            public Object caseFacetExtensionType(FacetExtensionType object) {
-                return createFacetExtensionTypeAdapter();
-            }
-            public Object caseFacetNameType(FacetNameType object) {
-                return createFacetNameTypeAdapter();
-            }
-            public Object caseFacetType(FacetType object) {
-                return createFacetTypeAdapter();
-            }
-            public Object caseFactoryType(FactoryType object) {
-                return createFactoryTypeAdapter();
-            }
-            public Object caseFromActionType(FromActionType object) {
-                return createFromActionTypeAdapter();
-            }
-            public Object caseFromOutcomeType(FromOutcomeType object) {
-                return createFromOutcomeTypeAdapter();
-            }
-            public Object caseFromViewIdType(FromViewIdType object) {
-                return createFromViewIdTypeAdapter();
-            }
-            public Object caseIconType(IconType object) {
-                return createIconTypeAdapter();
-            }
-            public Object caseKeyClassType(KeyClassType object) {
-                return createKeyClassTypeAdapter();
-            }
-            public Object caseKeyType(KeyType object) {
-                return createKeyTypeAdapter();
-            }
-            public Object caseLargeIconType(LargeIconType object) {
-                return createLargeIconTypeAdapter();
-            }
-            public Object caseLifecycleFactoryType(LifecycleFactoryType object) {
-                return createLifecycleFactoryTypeAdapter();
-            }
-            public Object caseLifecycleType(LifecycleType object) {
-                return createLifecycleTypeAdapter();
-            }
-            public Object caseListEntriesType(ListEntriesType object) {
-                return createListEntriesTypeAdapter();
-            }
-            public Object caseLocaleConfigType(LocaleConfigType object) {
-                return createLocaleConfigTypeAdapter();
-            }
-            public Object caseManagedBeanClassType(ManagedBeanClassType object) {
-                return createManagedBeanClassTypeAdapter();
-            }
-            public Object caseManagedBeanNameType(ManagedBeanNameType object) {
-                return createManagedBeanNameTypeAdapter();
-            }
-            public Object caseManagedBeanScopeType(ManagedBeanScopeType object) {
-                return createManagedBeanScopeTypeAdapter();
-            }
-            public Object caseManagedBeanType(ManagedBeanType object) {
-                return createManagedBeanTypeAdapter();
-            }
-            public Object caseManagedPropertyType(ManagedPropertyType object) {
-                return createManagedPropertyTypeAdapter();
-            }
-            public Object caseMapEntriesType(MapEntriesType object) {
-                return createMapEntriesTypeAdapter();
-            }
-            public Object caseMapEntryType(MapEntryType object) {
-                return createMapEntryTypeAdapter();
-            }
-            public Object caseMessageBundleType(MessageBundleType object) {
-                return createMessageBundleTypeAdapter();
-            }
-            public Object caseNavigationCaseType(NavigationCaseType object) {
-                return createNavigationCaseTypeAdapter();
-            }
-            public Object caseNavigationHandlerType(NavigationHandlerType object) {
-                return createNavigationHandlerTypeAdapter();
-            }
-            public Object caseNavigationRuleType(NavigationRuleType object) {
-                return createNavigationRuleTypeAdapter();
-            }
-            public Object caseNullValueType(NullValueType object) {
-                return createNullValueTypeAdapter();
-            }
-            public Object casePhaseListenerType(PhaseListenerType object) {
-                return createPhaseListenerTypeAdapter();
-            }
-            public Object casePropertyClassType(PropertyClassType object) {
-                return createPropertyClassTypeAdapter();
-            }
-            public Object casePropertyExtensionType(PropertyExtensionType object) {
-                return createPropertyExtensionTypeAdapter();
-            }
-            public Object casePropertyNameType(PropertyNameType object) {
-                return createPropertyNameTypeAdapter();
-            }
-            public Object casePropertyResolverType(PropertyResolverType object) {
-                return createPropertyResolverTypeAdapter();
-            }
-            public Object casePropertyType(PropertyType object) {
-                return createPropertyTypeAdapter();
-            }
-            public Object caseRedirectType(RedirectType object) {
-                return createRedirectTypeAdapter();
-            }
-            public Object caseReferencedBeanClassType(ReferencedBeanClassType object) {
-                return createReferencedBeanClassTypeAdapter();
-            }
-            public Object caseReferencedBeanNameType(ReferencedBeanNameType object) {
-                return createReferencedBeanNameTypeAdapter();
-            }
-            public Object caseReferencedBeanType(ReferencedBeanType object) {
-                return createReferencedBeanTypeAdapter();
-            }
-            public Object caseRendererClassType(RendererClassType object) {
-                return createRendererClassTypeAdapter();
-            }
-            public Object caseRendererExtensionType(RendererExtensionType object) {
-                return createRendererExtensionTypeAdapter();
-            }
-            public Object caseRendererType(RendererType object) {
-                return createRendererTypeAdapter();
-            }
-            public Object caseRendererTypeType(RendererTypeType object) {
-                return createRendererTypeTypeAdapter();
-            }
-            public Object caseRenderKitClassType(RenderKitClassType object) {
-                return createRenderKitClassTypeAdapter();
-            }
-            public Object caseRenderKitFactoryType(RenderKitFactoryType object) {
-                return createRenderKitFactoryTypeAdapter();
-            }
-            public Object caseRenderKitIdType(RenderKitIdType object) {
-                return createRenderKitIdTypeAdapter();
-            }
-            public Object caseRenderKitType(RenderKitType object) {
-                return createRenderKitTypeAdapter();
-            }
-            public Object caseSmallIconType(SmallIconType object) {
-                return createSmallIconTypeAdapter();
-            }
-            public Object caseStateManagerType(StateManagerType object) {
-                return createStateManagerTypeAdapter();
-            }
-            public Object caseSuggestedValueType(SuggestedValueType object) {
-                return createSuggestedValueTypeAdapter();
-            }
-            public Object caseSupportedLocaleType(SupportedLocaleType object) {
-                return createSupportedLocaleTypeAdapter();
-            }
-            public Object caseToViewIdType(ToViewIdType object) {
-                return createToViewIdTypeAdapter();
-            }
-            public Object caseValidatorClassType(ValidatorClassType object) {
-                return createValidatorClassTypeAdapter();
-            }
-            public Object caseValidatorIdType(ValidatorIdType object) {
-                return createValidatorIdTypeAdapter();
-            }
-            public Object caseValidatorType(ValidatorType object) {
-                return createValidatorTypeAdapter();
-            }
-            public Object caseValueClassType(ValueClassType object) {
-                return createValueClassTypeAdapter();
-            }
-            public Object caseValueType(ValueType object) {
-                return createValueTypeAdapter();
-            }
-            public Object caseVariableResolverType(VariableResolverType object) {
-                return createVariableResolverTypeAdapter();
-            }
-            public Object caseViewHandlerType(ViewHandlerType object) {
-                return createViewHandlerTypeAdapter();
-            }
-            public Object caseExtensionType(ExtensionType object) {
-                return createExtensionTypeAdapter();
-            }
-            public Object caseApplicationExtensionType(ApplicationExtensionType object) {
-                return createApplicationExtensionTypeAdapter();
-            }
-            public Object caseConverterExtensionType(ConverterExtensionType object) {
-                return createConverterExtensionTypeAdapter();
-            }
-            public Object caseELResolverType(ELResolverType object) {
-                return createELResolverTypeAdapter();
-            }
-            public Object caseFacesConfigExtensionType(FacesConfigExtensionType object) {
-                return createFacesConfigExtensionTypeAdapter();
-            }
-            public Object caseFactoryExtensionType(FactoryExtensionType object) {
-                return createFactoryExtensionTypeAdapter();
-            }
-            public Object caseLifecycleExtensionType(LifecycleExtensionType object) {
-                return createLifecycleExtensionTypeAdapter();
-            }
-            public Object caseManagedBeanExtensionType(ManagedBeanExtensionType object) {
-                return createManagedBeanExtensionTypeAdapter();
-            }
-            public Object caseNavigationRuleExtensionType(NavigationRuleExtensionType object) {
-                return createNavigationRuleExtensionTypeAdapter();
-            }
-            public Object caseValidatorExtensionType(ValidatorExtensionType object) {
-                return createValidatorExtensionTypeAdapter();
-            }
-            public Object caseResourceBundleType(ResourceBundleType object) {
-                return createResourceBundleTypeAdapter();
-            }
-            public Object caseBaseNameType(BaseNameType object) {
-                return createBaseNameTypeAdapter();
-            }
-            public Object caseVarType(VarType object) {
-                return createVarTypeAdapter();
-            }
-            public Object caseRenderKitExtensionType(RenderKitExtensionType object) {
-                return createRenderKitExtensionTypeAdapter();
-            }
-            public Object defaultCase(EObject object) {
-                return createEObjectAdapter();
-            }
-        };
-
-    /**
-     * Creates an adapter for the <code>target</code>.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @param target the object to adapt.
-     * @return the adapter for the <code>target</code>.
-     * @generated
-     */
-	public Adapter createAdapter(Notifier target) {
-        return (Adapter)modelSwitch.doSwitch((EObject)target);
-    }
-
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType <em>Action Listener Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType
-     * @generated
-     */
-	public Adapter createActionListenerTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType <em>Application Factory Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType
-     * @generated
-     */
-	public Adapter createApplicationFactoryTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType <em>Application Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType
-     * @generated
-     */
-	public Adapter createApplicationTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType <em>Attribute Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType
-     * @generated
-     */
-	public Adapter createAttributeClassTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType <em>Attribute Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType
-     * @generated
-     */
-	public Adapter createAttributeExtensionTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType <em>Attribute Name Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType
-     * @generated
-     */
-	public Adapter createAttributeNameTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType <em>Attribute Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType
-     * @generated
-     */
-	public Adapter createAttributeTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType <em>Component Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType
-     * @generated
-     */
-	public Adapter createComponentClassTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType <em>Component Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType
-     * @generated
-     */
-	public Adapter createComponentExtensionTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType <em>Component Family Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType
-     * @generated
-     */
-	public Adapter createComponentFamilyTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType <em>Component Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType
-     * @generated
-     */
-	public Adapter createComponentTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType <em>Component Type Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType
-     * @generated
-     */
-	public Adapter createComponentTypeTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType <em>Converter Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType
-     * @generated
-     */
-	public Adapter createConverterClassTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType <em>Converter For Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType
-     * @generated
-     */
-	public Adapter createConverterForClassTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType <em>Converter Id Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType
-     * @generated
-     */
-	public Adapter createConverterIdTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType <em>Converter Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType
-     * @generated
-     */
-	public Adapter createConverterTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType <em>Default Locale Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType
-     * @generated
-     */
-	public Adapter createDefaultLocaleTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType <em>Default Render Kit Id Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType
-     * @generated
-     */
-	public Adapter createDefaultRenderKitIdTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType <em>Default Value Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType
-     * @generated
-     */
-	public Adapter createDefaultValueTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType <em>Description Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DescriptionType
-     * @generated
-     */
-	public Adapter createDescriptionTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType <em>Display Name Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType
-     * @generated
-     */
-	public Adapter createDisplayNameTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot <em>Document Root</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot
-     * @generated
-     */
-	public Adapter createDocumentRootAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute <em>Dynamic Attribute</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute
-     * @generated
-     */
-    public Adapter createDynamicAttributeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement <em>Dynamic Element</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicElement
-     * @generated
-     */
-    public Adapter createDynamicElementAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType <em>EL Resolver Type</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ELResolverType
-     * @generated
-     */
-    public Adapter createELResolverTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType <em>Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType
-     * @generated
-     */
-	public Adapter createFacesConfigTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType <em>Faces Context Factory Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType
-     * @generated
-     */
-	public Adapter createFacesContextFactoryTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType <em>Facet Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType
-     * @generated
-     */
-	public Adapter createFacetExtensionTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType <em>Facet Name Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacetNameType
-     * @generated
-     */
-	public Adapter createFacetNameTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType <em>Facet Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType
-     * @generated
-     */
-	public Adapter createFacetTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType <em>Factory Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType
-     * @generated
-     */
-	public Adapter createFactoryTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType <em>From Action Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FromActionType
-     * @generated
-     */
-	public Adapter createFromActionTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType <em>From Outcome Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType
-     * @generated
-     */
-	public Adapter createFromOutcomeTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType <em>From View Id Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType
-     * @generated
-     */
-	public Adapter createFromViewIdTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType <em>Icon Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.IconType
-     * @generated
-     */
-	public Adapter createIconTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType <em>Key Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.KeyClassType
-     * @generated
-     */
-	public Adapter createKeyClassTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType <em>Key Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.KeyType
-     * @generated
-     */
-	public Adapter createKeyTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType <em>Large Icon Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.LargeIconType
-     * @generated
-     */
-	public Adapter createLargeIconTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType <em>Lifecycle Factory Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType
-     * @generated
-     */
-	public Adapter createLifecycleFactoryTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType <em>Lifecycle Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleType
-     * @generated
-     */
-	public Adapter createLifecycleTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType <em>List Entries Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType
-     * @generated
-     */
-	public Adapter createListEntriesTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType <em>Locale Config Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType
-     * @generated
-     */
-	public Adapter createLocaleConfigTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType <em>Managed Bean Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType
-     * @generated
-     */
-	public Adapter createManagedBeanClassTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType <em>Managed Bean Name Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType
-     * @generated
-     */
-	public Adapter createManagedBeanNameTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType <em>Managed Bean Scope Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType
-     * @generated
-     */
-	public Adapter createManagedBeanScopeTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType <em>Managed Bean Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType
-     * @generated
-     */
-	public Adapter createManagedBeanTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType <em>Managed Property Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType
-     * @generated
-     */
-	public Adapter createManagedPropertyTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType <em>Map Entries Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType
-     * @generated
-     */
-	public Adapter createMapEntriesTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType <em>Map Entry Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntryType
-     * @generated
-     */
-	public Adapter createMapEntryTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType <em>Message Bundle Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType
-     * @generated
-     */
-	public Adapter createMessageBundleTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType <em>Navigation Case Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType
-     * @generated
-     */
-	public Adapter createNavigationCaseTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType <em>Navigation Handler Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType
-     * @generated
-     */
-	public Adapter createNavigationHandlerTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType <em>Navigation Rule Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType
-     * @generated
-     */
-	public Adapter createNavigationRuleTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType <em>Null Value Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NullValueType
-     * @generated
-     */
-	public Adapter createNullValueTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType <em>Phase Listener Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType
-     * @generated
-     */
-	public Adapter createPhaseListenerTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType <em>Property Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType
-     * @generated
-     */
-	public Adapter createPropertyClassTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType <em>Property Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType
-     * @generated
-     */
-	public Adapter createPropertyExtensionTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType <em>Property Name Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType
-     * @generated
-     */
-	public Adapter createPropertyNameTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType <em>Property Resolver Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType
-     * @generated
-     */
-	public Adapter createPropertyResolverTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType <em>Property Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType
-     * @generated
-     */
-	public Adapter createPropertyTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType <em>Redirect Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectType
-     * @generated
-     */
-	public Adapter createRedirectTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType <em>Referenced Bean Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType
-     * @generated
-     */
-	public Adapter createReferencedBeanClassTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType <em>Referenced Bean Name Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType
-     * @generated
-     */
-	public Adapter createReferencedBeanNameTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType <em>Referenced Bean Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType
-     * @generated
-     */
-	public Adapter createReferencedBeanTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType <em>Renderer Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RendererClassType
-     * @generated
-     */
-	public Adapter createRendererClassTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType <em>Renderer Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType
-     * @generated
-     */
-	public Adapter createRendererExtensionTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType <em>Renderer Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType
-     * @generated
-     */
-	public Adapter createRendererTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType <em>Renderer Type Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType
-     * @generated
-     */
-	public Adapter createRendererTypeTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType <em>Render Kit Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType
-     * @generated
-     */
-	public Adapter createRenderKitClassTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType <em>Render Kit Factory Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType
-     * @generated
-     */
-	public Adapter createRenderKitFactoryTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType <em>Render Kit Id Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType
-     * @generated
-     */
-	public Adapter createRenderKitIdTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType <em>Render Kit Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType
-     * @generated
-     */
-	public Adapter createRenderKitTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType <em>Small Icon Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.SmallIconType
-     * @generated
-     */
-	public Adapter createSmallIconTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType <em>State Manager Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.StateManagerType
-     * @generated
-     */
-	public Adapter createStateManagerTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType <em>Suggested Value Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType
-     * @generated
-     */
-	public Adapter createSuggestedValueTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType <em>Supported Locale Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType
-     * @generated
-     */
-	public Adapter createSupportedLocaleTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType <em>To View Id Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType
-     * @generated
-     */
-	public Adapter createToViewIdTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType <em>Validator Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType
-     * @generated
-     */
-	public Adapter createValidatorClassTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType <em>Validator Id Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType
-     * @generated
-     */
-	public Adapter createValidatorIdTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType <em>Validator Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType
-     * @generated
-     */
-	public Adapter createValidatorTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType <em>Value Class Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValueClassType
-     * @generated
-     */
-	public Adapter createValueClassTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType <em>Value Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValueType
-     * @generated
-     */
-	public Adapter createValueTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType <em>Variable Resolver Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType
-     * @generated
-     */
-	public Adapter createVariableResolverTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType <em>View Handler Type</em>}'.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType
-     * @generated
-     */
-	public Adapter createViewHandlerTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType <em>Resource Bundle Type</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType
-     * @generated
-     */
-    public Adapter createResourceBundleTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType <em>Base Name Type</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.BaseNameType
-     * @generated
-     */
-    public Adapter createBaseNameTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.VarType <em>Var Type</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.VarType
-     * @generated
-     */
-    public Adapter createVarTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType <em>Render Kit Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType
-     * @generated
-     */
-    public Adapter createRenderKitExtensionTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType <em>Navigation Rule Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType
-     * @generated
-     */
-    public Adapter createNavigationRuleExtensionTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType <em>Validator Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType
-     * @generated
-     */
-    public Adapter createValidatorExtensionTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType <em>Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType
-     * @generated
-     */
-    public Adapter createFacesConfigExtensionTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType <em>Factory Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType
-     * @generated
-     */
-    public Adapter createFactoryExtensionTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType <em>Lifecycle Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType
-     * @generated
-     */
-    public Adapter createLifecycleExtensionTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType <em>Managed Bean Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType
-     * @generated
-     */
-    public Adapter createManagedBeanExtensionTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType <em>Converter Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType
-     * @generated
-     */
-    public Adapter createConverterExtensionTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType <em>Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ExtensionType
-     * @generated
-     */
-    public Adapter createExtensionTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType <em>Application Extension Type</em>}'.
-     * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType
-     * @generated
-     */
-    public Adapter createApplicationExtensionTypeAdapter() {
-        return null;
-    }
-
-    /**
-     * Creates a new adapter for the default case.
-     * <!-- begin-user-doc -->
-	 * This default implementation returns null.
-	 * <!-- end-user-doc -->
-     * @return the new adapter.
-     * @generated
-     */
-	public Adapter createEObjectAdapter() {
-        return null;
-    }
-
-} //FacesConfigAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/FacesConfigSwitch.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/FacesConfigSwitch.java
deleted file mode 100644
index ee17b20..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/FacesConfigSwitch.java
+++ /dev/null
@@ -1,2170 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.*;
-
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage
- * @generated
- */
-public class FacesConfigSwitch {
-    /**
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others";
-
-    /**
-     * The cached model package
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	protected static FacesConfigPackage modelPackage;
-
-    /**
-     * Creates an instance of the switch.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated
-     */
-	public FacesConfigSwitch() {
-        if (modelPackage == null) {
-            modelPackage = FacesConfigPackage.eINSTANCE;
-        }
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-	public Object doSwitch(EObject theEObject) {
-        return doSwitch(theEObject.eClass(), theEObject);
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-     * @generated
-     */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
-        if (theEClass.eContainer() == modelPackage) {
-            return doSwitch(theEClass.getClassifierID(), theEObject);
-        }
-        List eSuperTypes = theEClass.getESuperTypes();
-        return
-            eSuperTypes.isEmpty() ?
-                defaultCase(theEObject) :
-                doSwitch((EClass)eSuperTypes.get(0), theEObject);
-    }
-
-    /**
-     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-     * <!-- begin-user-doc -->
-	 * <!-- 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.ACTION_LISTENER_TYPE: {
-                ActionListenerType actionListenerType = (ActionListenerType)theEObject;
-                Object result = caseActionListenerType(actionListenerType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.APPLICATION_FACTORY_TYPE: {
-                ApplicationFactoryType applicationFactoryType = (ApplicationFactoryType)theEObject;
-                Object result = caseApplicationFactoryType(applicationFactoryType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.APPLICATION_TYPE: {
-                ApplicationType applicationType = (ApplicationType)theEObject;
-                Object result = caseApplicationType(applicationType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE: {
-                AttributeClassType attributeClassType = (AttributeClassType)theEObject;
-                Object result = caseAttributeClassType(attributeClassType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.ATTRIBUTE_EXTENSION_TYPE: {
-                AttributeExtensionType attributeExtensionType = (AttributeExtensionType)theEObject;
-                Object result = caseAttributeExtensionType(attributeExtensionType);
-                if (result == null) result = caseExtensionType(attributeExtensionType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.ATTRIBUTE_NAME_TYPE: {
-                AttributeNameType attributeNameType = (AttributeNameType)theEObject;
-                Object result = caseAttributeNameType(attributeNameType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.ATTRIBUTE_TYPE: {
-                AttributeType attributeType = (AttributeType)theEObject;
-                Object result = caseAttributeType(attributeType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.COMPONENT_CLASS_TYPE: {
-                ComponentClassType componentClassType = (ComponentClassType)theEObject;
-                Object result = caseComponentClassType(componentClassType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.COMPONENT_EXTENSION_TYPE: {
-                ComponentExtensionType componentExtensionType = (ComponentExtensionType)theEObject;
-                Object result = caseComponentExtensionType(componentExtensionType);
-                if (result == null) result = caseExtensionType(componentExtensionType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.COMPONENT_FAMILY_TYPE: {
-                ComponentFamilyType componentFamilyType = (ComponentFamilyType)theEObject;
-                Object result = caseComponentFamilyType(componentFamilyType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.COMPONENT_TYPE: {
-                ComponentType componentType = (ComponentType)theEObject;
-                Object result = caseComponentType(componentType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.COMPONENT_TYPE_TYPE: {
-                ComponentTypeType componentTypeType = (ComponentTypeType)theEObject;
-                Object result = caseComponentTypeType(componentTypeType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.CONVERTER_CLASS_TYPE: {
-                ConverterClassType converterClassType = (ConverterClassType)theEObject;
-                Object result = caseConverterClassType(converterClassType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE: {
-                ConverterForClassType converterForClassType = (ConverterForClassType)theEObject;
-                Object result = caseConverterForClassType(converterForClassType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.CONVERTER_ID_TYPE: {
-                ConverterIdType converterIdType = (ConverterIdType)theEObject;
-                Object result = caseConverterIdType(converterIdType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.CONVERTER_TYPE: {
-                ConverterType converterType = (ConverterType)theEObject;
-                Object result = caseConverterType(converterType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.DEFAULT_LOCALE_TYPE: {
-                DefaultLocaleType defaultLocaleType = (DefaultLocaleType)theEObject;
-                Object result = caseDefaultLocaleType(defaultLocaleType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE: {
-                DefaultRenderKitIdType defaultRenderKitIdType = (DefaultRenderKitIdType)theEObject;
-                Object result = caseDefaultRenderKitIdType(defaultRenderKitIdType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.DEFAULT_VALUE_TYPE: {
-                DefaultValueType defaultValueType = (DefaultValueType)theEObject;
-                Object result = caseDefaultValueType(defaultValueType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.DESCRIPTION_TYPE: {
-                DescriptionType descriptionType = (DescriptionType)theEObject;
-                Object result = caseDescriptionType(descriptionType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.DISPLAY_NAME_TYPE: {
-                DisplayNameType displayNameType = (DisplayNameType)theEObject;
-                Object result = caseDisplayNameType(displayNameType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.DOCUMENT_ROOT: {
-                DocumentRoot documentRoot = (DocumentRoot)theEObject;
-                Object result = caseDocumentRoot(documentRoot);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.DYNAMIC_ATTRIBUTE: {
-                DynamicAttribute dynamicAttribute = (DynamicAttribute)theEObject;
-                Object result = caseDynamicAttribute(dynamicAttribute);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.DYNAMIC_ELEMENT: {
-                DynamicElement dynamicElement = (DynamicElement)theEObject;
-                Object result = caseDynamicElement(dynamicElement);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.FACES_CONFIG_TYPE: {
-                FacesConfigType facesConfigType = (FacesConfigType)theEObject;
-                Object result = caseFacesConfigType(facesConfigType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE: {
-                FacesContextFactoryType facesContextFactoryType = (FacesContextFactoryType)theEObject;
-                Object result = caseFacesContextFactoryType(facesContextFactoryType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.FACET_EXTENSION_TYPE: {
-                FacetExtensionType facetExtensionType = (FacetExtensionType)theEObject;
-                Object result = caseFacetExtensionType(facetExtensionType);
-                if (result == null) result = caseExtensionType(facetExtensionType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.FACET_NAME_TYPE: {
-                FacetNameType facetNameType = (FacetNameType)theEObject;
-                Object result = caseFacetNameType(facetNameType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.FACET_TYPE: {
-                FacetType facetType = (FacetType)theEObject;
-                Object result = caseFacetType(facetType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.FACTORY_TYPE: {
-                FactoryType factoryType = (FactoryType)theEObject;
-                Object result = caseFactoryType(factoryType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.FROM_ACTION_TYPE: {
-                FromActionType fromActionType = (FromActionType)theEObject;
-                Object result = caseFromActionType(fromActionType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.FROM_OUTCOME_TYPE: {
-                FromOutcomeType fromOutcomeType = (FromOutcomeType)theEObject;
-                Object result = caseFromOutcomeType(fromOutcomeType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.FROM_VIEW_ID_TYPE: {
-                FromViewIdType fromViewIdType = (FromViewIdType)theEObject;
-                Object result = caseFromViewIdType(fromViewIdType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.ICON_TYPE: {
-                IconType iconType = (IconType)theEObject;
-                Object result = caseIconType(iconType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.KEY_CLASS_TYPE: {
-                KeyClassType keyClassType = (KeyClassType)theEObject;
-                Object result = caseKeyClassType(keyClassType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.KEY_TYPE: {
-                KeyType keyType = (KeyType)theEObject;
-                Object result = caseKeyType(keyType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.LARGE_ICON_TYPE: {
-                LargeIconType largeIconType = (LargeIconType)theEObject;
-                Object result = caseLargeIconType(largeIconType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE: {
-                LifecycleFactoryType lifecycleFactoryType = (LifecycleFactoryType)theEObject;
-                Object result = caseLifecycleFactoryType(lifecycleFactoryType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.LIFECYCLE_TYPE: {
-                LifecycleType lifecycleType = (LifecycleType)theEObject;
-                Object result = caseLifecycleType(lifecycleType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.LIST_ENTRIES_TYPE: {
-                ListEntriesType listEntriesType = (ListEntriesType)theEObject;
-                Object result = caseListEntriesType(listEntriesType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.LOCALE_CONFIG_TYPE: {
-                LocaleConfigType localeConfigType = (LocaleConfigType)theEObject;
-                Object result = caseLocaleConfigType(localeConfigType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE: {
-                ManagedBeanClassType managedBeanClassType = (ManagedBeanClassType)theEObject;
-                Object result = caseManagedBeanClassType(managedBeanClassType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE: {
-                ManagedBeanNameType managedBeanNameType = (ManagedBeanNameType)theEObject;
-                Object result = caseManagedBeanNameType(managedBeanNameType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE: {
-                ManagedBeanScopeType managedBeanScopeType = (ManagedBeanScopeType)theEObject;
-                Object result = caseManagedBeanScopeType(managedBeanScopeType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.MANAGED_BEAN_TYPE: {
-                ManagedBeanType managedBeanType = (ManagedBeanType)theEObject;
-                Object result = caseManagedBeanType(managedBeanType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.MANAGED_PROPERTY_TYPE: {
-                ManagedPropertyType managedPropertyType = (ManagedPropertyType)theEObject;
-                Object result = caseManagedPropertyType(managedPropertyType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.MAP_ENTRIES_TYPE: {
-                MapEntriesType mapEntriesType = (MapEntriesType)theEObject;
-                Object result = caseMapEntriesType(mapEntriesType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.MAP_ENTRY_TYPE: {
-                MapEntryType mapEntryType = (MapEntryType)theEObject;
-                Object result = caseMapEntryType(mapEntryType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.MESSAGE_BUNDLE_TYPE: {
-                MessageBundleType messageBundleType = (MessageBundleType)theEObject;
-                Object result = caseMessageBundleType(messageBundleType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.NAVIGATION_CASE_TYPE: {
-                NavigationCaseType navigationCaseType = (NavigationCaseType)theEObject;
-                Object result = caseNavigationCaseType(navigationCaseType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.NAVIGATION_HANDLER_TYPE: {
-                NavigationHandlerType navigationHandlerType = (NavigationHandlerType)theEObject;
-                Object result = caseNavigationHandlerType(navigationHandlerType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.NAVIGATION_RULE_TYPE: {
-                NavigationRuleType navigationRuleType = (NavigationRuleType)theEObject;
-                Object result = caseNavigationRuleType(navigationRuleType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.NULL_VALUE_TYPE: {
-                NullValueType nullValueType = (NullValueType)theEObject;
-                Object result = caseNullValueType(nullValueType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.PHASE_LISTENER_TYPE: {
-                PhaseListenerType phaseListenerType = (PhaseListenerType)theEObject;
-                Object result = casePhaseListenerType(phaseListenerType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.PROPERTY_CLASS_TYPE: {
-                PropertyClassType propertyClassType = (PropertyClassType)theEObject;
-                Object result = casePropertyClassType(propertyClassType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.PROPERTY_EXTENSION_TYPE: {
-                PropertyExtensionType propertyExtensionType = (PropertyExtensionType)theEObject;
-                Object result = casePropertyExtensionType(propertyExtensionType);
-                if (result == null) result = caseExtensionType(propertyExtensionType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.PROPERTY_NAME_TYPE: {
-                PropertyNameType propertyNameType = (PropertyNameType)theEObject;
-                Object result = casePropertyNameType(propertyNameType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.PROPERTY_RESOLVER_TYPE: {
-                PropertyResolverType propertyResolverType = (PropertyResolverType)theEObject;
-                Object result = casePropertyResolverType(propertyResolverType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.PROPERTY_TYPE: {
-                PropertyType propertyType = (PropertyType)theEObject;
-                Object result = casePropertyType(propertyType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.REDIRECT_TYPE: {
-                RedirectType redirectType = (RedirectType)theEObject;
-                Object result = caseRedirectType(redirectType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE: {
-                ReferencedBeanClassType referencedBeanClassType = (ReferencedBeanClassType)theEObject;
-                Object result = caseReferencedBeanClassType(referencedBeanClassType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE: {
-                ReferencedBeanNameType referencedBeanNameType = (ReferencedBeanNameType)theEObject;
-                Object result = caseReferencedBeanNameType(referencedBeanNameType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.REFERENCED_BEAN_TYPE: {
-                ReferencedBeanType referencedBeanType = (ReferencedBeanType)theEObject;
-                Object result = caseReferencedBeanType(referencedBeanType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.RENDERER_CLASS_TYPE: {
-                RendererClassType rendererClassType = (RendererClassType)theEObject;
-                Object result = caseRendererClassType(rendererClassType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.RENDERER_EXTENSION_TYPE: {
-                RendererExtensionType rendererExtensionType = (RendererExtensionType)theEObject;
-                Object result = caseRendererExtensionType(rendererExtensionType);
-                if (result == null) result = caseExtensionType(rendererExtensionType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.RENDERER_TYPE: {
-                RendererType rendererType = (RendererType)theEObject;
-                Object result = caseRendererType(rendererType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.RENDERER_TYPE_TYPE: {
-                RendererTypeType rendererTypeType = (RendererTypeType)theEObject;
-                Object result = caseRendererTypeType(rendererTypeType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.RENDER_KIT_CLASS_TYPE: {
-                RenderKitClassType renderKitClassType = (RenderKitClassType)theEObject;
-                Object result = caseRenderKitClassType(renderKitClassType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE: {
-                RenderKitFactoryType renderKitFactoryType = (RenderKitFactoryType)theEObject;
-                Object result = caseRenderKitFactoryType(renderKitFactoryType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.RENDER_KIT_ID_TYPE: {
-                RenderKitIdType renderKitIdType = (RenderKitIdType)theEObject;
-                Object result = caseRenderKitIdType(renderKitIdType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.RENDER_KIT_TYPE: {
-                RenderKitType renderKitType = (RenderKitType)theEObject;
-                Object result = caseRenderKitType(renderKitType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.SMALL_ICON_TYPE: {
-                SmallIconType smallIconType = (SmallIconType)theEObject;
-                Object result = caseSmallIconType(smallIconType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.STATE_MANAGER_TYPE: {
-                StateManagerType stateManagerType = (StateManagerType)theEObject;
-                Object result = caseStateManagerType(stateManagerType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.SUGGESTED_VALUE_TYPE: {
-                SuggestedValueType suggestedValueType = (SuggestedValueType)theEObject;
-                Object result = caseSuggestedValueType(suggestedValueType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.SUPPORTED_LOCALE_TYPE: {
-                SupportedLocaleType supportedLocaleType = (SupportedLocaleType)theEObject;
-                Object result = caseSupportedLocaleType(supportedLocaleType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.TO_VIEW_ID_TYPE: {
-                ToViewIdType toViewIdType = (ToViewIdType)theEObject;
-                Object result = caseToViewIdType(toViewIdType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.VALIDATOR_CLASS_TYPE: {
-                ValidatorClassType validatorClassType = (ValidatorClassType)theEObject;
-                Object result = caseValidatorClassType(validatorClassType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.VALIDATOR_ID_TYPE: {
-                ValidatorIdType validatorIdType = (ValidatorIdType)theEObject;
-                Object result = caseValidatorIdType(validatorIdType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.VALIDATOR_TYPE: {
-                ValidatorType validatorType = (ValidatorType)theEObject;
-                Object result = caseValidatorType(validatorType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.VALUE_CLASS_TYPE: {
-                ValueClassType valueClassType = (ValueClassType)theEObject;
-                Object result = caseValueClassType(valueClassType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.VALUE_TYPE: {
-                ValueType valueType = (ValueType)theEObject;
-                Object result = caseValueType(valueType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.VARIABLE_RESOLVER_TYPE: {
-                VariableResolverType variableResolverType = (VariableResolverType)theEObject;
-                Object result = caseVariableResolverType(variableResolverType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.VIEW_HANDLER_TYPE: {
-                ViewHandlerType viewHandlerType = (ViewHandlerType)theEObject;
-                Object result = caseViewHandlerType(viewHandlerType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.EXTENSION_TYPE: {
-                ExtensionType extensionType = (ExtensionType)theEObject;
-                Object result = caseExtensionType(extensionType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.APPLICATION_EXTENSION_TYPE: {
-                ApplicationExtensionType applicationExtensionType = (ApplicationExtensionType)theEObject;
-                Object result = caseApplicationExtensionType(applicationExtensionType);
-                if (result == null) result = caseExtensionType(applicationExtensionType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.CONVERTER_EXTENSION_TYPE: {
-                ConverterExtensionType converterExtensionType = (ConverterExtensionType)theEObject;
-                Object result = caseConverterExtensionType(converterExtensionType);
-                if (result == null) result = caseExtensionType(converterExtensionType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.EL_RESOLVER_TYPE: {
-                ELResolverType elResolverType = (ELResolverType)theEObject;
-                Object result = caseELResolverType(elResolverType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.FACES_CONFIG_EXTENSION_TYPE: {
-                FacesConfigExtensionType facesConfigExtensionType = (FacesConfigExtensionType)theEObject;
-                Object result = caseFacesConfigExtensionType(facesConfigExtensionType);
-                if (result == null) result = caseExtensionType(facesConfigExtensionType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.FACTORY_EXTENSION_TYPE: {
-                FactoryExtensionType factoryExtensionType = (FactoryExtensionType)theEObject;
-                Object result = caseFactoryExtensionType(factoryExtensionType);
-                if (result == null) result = caseExtensionType(factoryExtensionType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.LIFECYCLE_EXTENSION_TYPE: {
-                LifecycleExtensionType lifecycleExtensionType = (LifecycleExtensionType)theEObject;
-                Object result = caseLifecycleExtensionType(lifecycleExtensionType);
-                if (result == null) result = caseExtensionType(lifecycleExtensionType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.MANAGED_BEAN_EXTENSION_TYPE: {
-                ManagedBeanExtensionType managedBeanExtensionType = (ManagedBeanExtensionType)theEObject;
-                Object result = caseManagedBeanExtensionType(managedBeanExtensionType);
-                if (result == null) result = caseExtensionType(managedBeanExtensionType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.NAVIGATION_RULE_EXTENSION_TYPE: {
-                NavigationRuleExtensionType navigationRuleExtensionType = (NavigationRuleExtensionType)theEObject;
-                Object result = caseNavigationRuleExtensionType(navigationRuleExtensionType);
-                if (result == null) result = caseExtensionType(navigationRuleExtensionType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.VALIDATOR_EXTENSION_TYPE: {
-                ValidatorExtensionType validatorExtensionType = (ValidatorExtensionType)theEObject;
-                Object result = caseValidatorExtensionType(validatorExtensionType);
-                if (result == null) result = caseExtensionType(validatorExtensionType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.RESOURCE_BUNDLE_TYPE: {
-                ResourceBundleType resourceBundleType = (ResourceBundleType)theEObject;
-                Object result = caseResourceBundleType(resourceBundleType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.BASE_NAME_TYPE: {
-                BaseNameType baseNameType = (BaseNameType)theEObject;
-                Object result = caseBaseNameType(baseNameType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.VAR_TYPE: {
-                VarType varType = (VarType)theEObject;
-                Object result = caseVarType(varType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            case FacesConfigPackage.RENDER_KIT_EXTENSION_TYPE: {
-                RenderKitExtensionType renderKitExtensionType = (RenderKitExtensionType)theEObject;
-                Object result = caseRenderKitExtensionType(renderKitExtensionType);
-                if (result == null) result = caseExtensionType(renderKitExtensionType);
-                if (result == null) result = defaultCase(theEObject);
-                return result;
-            }
-            default: return defaultCase(theEObject);
-        }
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Action Listener Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Action Listener Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseActionListenerType(ActionListenerType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Application Factory Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Application Factory Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseApplicationFactoryType(ApplicationFactoryType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Application Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Application Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseApplicationType(ApplicationType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Attribute Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Attribute Class Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseAttributeClassType(AttributeClassType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Attribute Extension Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Attribute Extension Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseAttributeExtensionType(AttributeExtensionType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Attribute Name Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Attribute Name Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseAttributeNameType(AttributeNameType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Attribute Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Attribute Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseAttributeType(AttributeType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Component Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Component Class Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseComponentClassType(ComponentClassType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Component Extension Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Component Extension Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseComponentExtensionType(ComponentExtensionType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Component Family Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Component Family Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseComponentFamilyType(ComponentFamilyType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Component Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Component Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseComponentType(ComponentType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Component Type Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Component Type Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseComponentTypeType(ComponentTypeType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Converter Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Converter Class Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseConverterClassType(ConverterClassType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Converter For Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Converter For Class Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseConverterForClassType(ConverterForClassType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Converter Id Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Converter Id Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseConverterIdType(ConverterIdType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Converter Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Converter Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseConverterType(ConverterType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Default Locale Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Default Locale Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseDefaultLocaleType(DefaultLocaleType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Default Render Kit Id Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Default Render Kit Id Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseDefaultRenderKitIdType(DefaultRenderKitIdType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Default Value Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Default Value Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseDefaultValueType(DefaultValueType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Description Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Description Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseDescriptionType(DescriptionType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Display Name Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Display Name Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseDisplayNameType(DisplayNameType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Document Root</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Document Root</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseDocumentRoot(DocumentRoot object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Dynamic Attribute</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Dynamic Attribute</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseDynamicAttribute(DynamicAttribute object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Dynamic Element</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Dynamic Element</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseDynamicElement(DynamicElement object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>EL Resolver Type</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>EL Resolver Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseELResolverType(ELResolverType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseFacesConfigType(FacesConfigType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Faces Context Factory Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Faces Context Factory Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseFacesContextFactoryType(FacesContextFactoryType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Facet Extension Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Facet Extension Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseFacetExtensionType(FacetExtensionType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Facet Name Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Facet Name Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseFacetNameType(FacetNameType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Facet Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Facet Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseFacetType(FacetType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Factory Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Factory Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseFactoryType(FactoryType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>From Action Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>From Action Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseFromActionType(FromActionType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>From Outcome Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>From Outcome Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseFromOutcomeType(FromOutcomeType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>From View Id Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>From View Id Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseFromViewIdType(FromViewIdType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Icon Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Icon Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseIconType(IconType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Key Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Key Class Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseKeyClassType(KeyClassType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Key Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Key Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseKeyType(KeyType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Large Icon Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Large Icon Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseLargeIconType(LargeIconType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Lifecycle Factory Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Lifecycle Factory Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseLifecycleFactoryType(LifecycleFactoryType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Lifecycle Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Lifecycle Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseLifecycleType(LifecycleType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>List Entries Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>List Entries Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseListEntriesType(ListEntriesType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Locale Config Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Locale Config Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseLocaleConfigType(LocaleConfigType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Managed Bean Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Managed Bean Class Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseManagedBeanClassType(ManagedBeanClassType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Managed Bean Name Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Managed Bean Name Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseManagedBeanNameType(ManagedBeanNameType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Managed Bean Scope Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Managed Bean Scope Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseManagedBeanScopeType(ManagedBeanScopeType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Managed Bean Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Managed Bean Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseManagedBeanType(ManagedBeanType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Managed Property Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Managed Property Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseManagedPropertyType(ManagedPropertyType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Map Entries Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Map Entries Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseMapEntriesType(MapEntriesType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Map Entry Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Map Entry Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseMapEntryType(MapEntryType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Message Bundle Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Message Bundle Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseMessageBundleType(MessageBundleType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Navigation Case Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Navigation Case Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseNavigationCaseType(NavigationCaseType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Navigation Handler Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Navigation Handler Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseNavigationHandlerType(NavigationHandlerType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Navigation Rule Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Navigation Rule Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseNavigationRuleType(NavigationRuleType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Null Value Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Null Value Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseNullValueType(NullValueType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Phase Listener Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Phase Listener Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object casePhaseListenerType(PhaseListenerType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Property Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Property Class Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object casePropertyClassType(PropertyClassType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Property Extension Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Property Extension Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object casePropertyExtensionType(PropertyExtensionType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Property Name Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Property Name Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object casePropertyNameType(PropertyNameType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Property Resolver Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Property Resolver Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object casePropertyResolverType(PropertyResolverType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Property Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Property Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object casePropertyType(PropertyType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Redirect Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Redirect Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseRedirectType(RedirectType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Referenced Bean Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Referenced Bean Class Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseReferencedBeanClassType(ReferencedBeanClassType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Referenced Bean Name Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Referenced Bean Name Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseReferencedBeanNameType(ReferencedBeanNameType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Referenced Bean Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Referenced Bean Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseReferencedBeanType(ReferencedBeanType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Renderer Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Renderer Class Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseRendererClassType(RendererClassType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Renderer Extension Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Renderer Extension Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseRendererExtensionType(RendererExtensionType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Renderer Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Renderer Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseRendererType(RendererType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Renderer Type Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Renderer Type Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseRendererTypeType(RendererTypeType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Render Kit Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Render Kit Class Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseRenderKitClassType(RenderKitClassType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Render Kit Factory Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Render Kit Factory Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseRenderKitFactoryType(RenderKitFactoryType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Render Kit Id Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Render Kit Id Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseRenderKitIdType(RenderKitIdType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Render Kit Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Render Kit Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseRenderKitType(RenderKitType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Small Icon Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Small Icon Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseSmallIconType(SmallIconType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>State Manager Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>State Manager Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseStateManagerType(StateManagerType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Suggested Value Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Suggested Value Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseSuggestedValueType(SuggestedValueType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Supported Locale Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Supported Locale Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseSupportedLocaleType(SupportedLocaleType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>To View Id Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>To View Id Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseToViewIdType(ToViewIdType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Validator Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Validator Class Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseValidatorClassType(ValidatorClassType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Validator Id Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Validator Id Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseValidatorIdType(ValidatorIdType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Validator Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Validator Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseValidatorType(ValidatorType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Value Class Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Value Class Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseValueClassType(ValueClassType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Value Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Value Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseValueType(ValueType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Variable Resolver Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Variable Resolver Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseVariableResolverType(VariableResolverType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>View Handler Type</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>View Handler Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-	public Object caseViewHandlerType(ViewHandlerType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Resource Bundle Type</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Resource Bundle Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseResourceBundleType(ResourceBundleType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Base Name Type</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Base Name Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseBaseNameType(BaseNameType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Var Type</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Var Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseVarType(VarType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Render Kit Extension Type</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Render Kit Extension Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseRenderKitExtensionType(RenderKitExtensionType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Navigation Rule Extension Type</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Navigation Rule Extension Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseNavigationRuleExtensionType(NavigationRuleExtensionType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Validator Extension Type</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Validator Extension Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseValidatorExtensionType(ValidatorExtensionType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Extension Type</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Extension Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseFacesConfigExtensionType(FacesConfigExtensionType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Factory Extension Type</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Factory Extension Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseFactoryExtensionType(FactoryExtensionType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Lifecycle Extension Type</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Lifecycle Extension Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseLifecycleExtensionType(LifecycleExtensionType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Managed Bean Extension Type</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Managed Bean Extension Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseManagedBeanExtensionType(ManagedBeanExtensionType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Converter Extension Type</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Converter Extension Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseConverterExtensionType(ConverterExtensionType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Extension Type</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Extension Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseExtensionType(ExtensionType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>Application Extension Type</em>'.
-     * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>Application Extension Type</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-     * @generated
-     */
-    public Object caseApplicationExtensionType(ApplicationExtensionType object) {
-        return null;
-    }
-
-    /**
-     * Returns the result of interpretting the object as an instance of '<em>EObject</em>'.
-     * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch, but this is the last case anyway.
-	 * <!-- end-user-doc -->
-     * @param object the target of the switch.
-     * @return the result of interpretting the object as an instance of '<em>EObject</em>'.
-     * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-     * @generated
-     */
-	public Object defaultCase(EObject object) {
-        return null;
-    }
-
-} //FacesConfigSwitch
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/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 bfa8077..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/Logger.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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$
-
-	public static final int OK = IStatus.OK; // 0
-	public static final int INFO = IStatus.INFO; // 1
-	public static final int WARNING = IStatus.WARNING; // 2
-	public static final int ERROR = IStatus.ERROR; // 4
-
-	public static final int OK_DEBUG = 200 + OK;
-	public static final int INFO_DEBUG = 200 + INFO;
-	public static final int WARNING_DEBUG = 200 + WARNING;
-	public 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
-	 */
-	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;
-	}
-
-	public static void log(int level, String message) {
-		_log(level, message, null);
-	}
-
-	public static void log(int level, String message, Throwable exception) {
-		_log(level, message, exception);
-	}
-	
-	public static void log(Object source, String message) {
-		doLog(source, message, null);
-	}
-
-	public static void log(Object source, String message, Throwable throwable) {
-		doLog(source, message, throwable);
-	}
-
-	public static void log(Object source, Throwable throwable) {
-		doLog(source, null, throwable);
-	}
-	
-	public static void log(String message) {
-		doLog(message, null);
-	}
-	
-	private static void doLog(String message, Throwable exception) {
-		_log(ERROR, message, exception);
-	}
-	
-	private static void doLog(Object source, String message, Throwable exception) {
-		_log(ERROR, getMessageFor(source, message), exception);
-	}
-	
-	private static final String getMessageFor(Object source, String message) {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append(source);
-		if (message != null) {
-			buffer.append(": ");
-			buffer.append(message);
-		}
-		return buffer.toString();
-	}
-
-	public static void logException(String message, Throwable exception) {
-		_log(ERROR, message, exception);
-	}
-
-	public static void logException(Throwable exception) {
-		_log(ERROR, exception.getMessage(), exception);
-	}
-
-	public static void traceException(String category, String message, Throwable exception) {
-		_trace(category, message, exception);
-	}
-
-	public static void traceException(String category, Throwable exception) {
-		_trace(category, exception.getMessage(), exception);
-	}
-
-	public static void trace(String category, String message) {
-		_trace(category, message, null);
-	}
-
-	private static Plugin getFacesPlugin() {
-		return FacesConfigPlugin.getPlugin();
-	}
-
-	public static Plugin getPlugin() {
-
-		if (fPlugin == null) {
-			fPlugin = getFacesPlugin();
-		}
-		return fPlugin;
-	}
-
-	public 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);
-		}
-	}
-	
-	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 746a08f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/nls/Messages.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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;
-
-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
-	}
-
-	public static String Source_UI_;
-	public static String FaceConfigEditor_Title;
-	public static String Overview_Page_Title;
-	public static String Application_Page_Title;
-	public static String Factory_Page_Title;
-	public static String Component_Page_Title;
-	public static String Converter_Page_Title;
-	public static String ManagedBean_Page_Title;
-	public static String NavigationRule_Page_Title;
-	public static String ReferencedBean_Page_Title;
-	public static String RenderKit_Page_Title;
-	public static String Lifecycle_Page_Title;
-	public static String Validator_Page_Title;
-	public static String MANAGEDBEAN_MAIN_SEC_TITLE;
-	public static String MANAGEDBEAN_MAIN_SEC_DESC;
-	public static String Invalid_Config_File;
-	public static String OPEN_TO_FACESCONFIG_SOURCE_PAGE_MENU_LABEL;
-	public static String _UI_CreateChild_text;
-	public static String _UI_CreateChild_text2;
-	public static String _UI_CreateChild_tooltip;
-	public static String _UI_CreateChild_description;
-	public static String _UI_CreateSibling_description;
-	public static String _UI_PropertyDescriptor_description;
-	public static String _UI_ActionListenerType_type;
-	public static String _UI_ApplicationFactoryType_type;
-	public static String _UI_ApplicationType_type;
-	public static String _UI_AttributeExtensionType_type;
-	public static String _UI_AttributeNameType_type;
-	public static String _UI_AttributeType_type;
-	public static String _UI_ComponentClassType_type;
-	public static String _UI_ComponentExtensionType_type;
-	public static String _UI_ComponentType_type;
-	public static String _UI_ComponentTypeType_type;
-	public static String _UI_ConverterType_type;
-	public static String _UI_DefaultLocaleType_type;
-	public static String _UI_DescriptionType_type;
-	public static String _UI_DisplayNameType_type;
-	public static String _UI_DocumentRoot_type;
-	public static String _UI_FacesConfigType_type;
-	public static String _UI_FacesContextFactoryType_type;
-	public static String _UI_FactoryType_type;
-	public static String _UI_IconType_type;
-	public static String _UI_LifecycleFactoryType_type;
-	public static String _UI_LifecycleType_type;
-	public static String _UI_ListEntriesType_type;
-	public static String _UI_LocaleConfigType_type;
-	public static String _UI_ManagedBeanType_type;
-	public static String _UI_ManagedPropertyType_type;
-	public static String _UI_MapEntriesType_type;
-	public static String _UI_MapEntryType_type;
-	public static String _UI_MessageBundleType_type;
-	public static String _UI_NavigationCaseType_type;
-	public static String _UI_NavigationHandlerType_type;
-	public static String _UI_NavigationRuleType_type;
-	public static String _UI_NullValueType_type;
-	public static String _UI_PhaseListenerType_type;
-	public static String _UI_PropertyExtensionType_type;
-	public static String _UI_PropertyResolverType_type;
-	public static String _UI_PropertyType_type;
-	public static String _UI_RedirectType_type;
-	public static String _UI_ReferencedBeanType_type;
-	public static String _UI_RendererExtensionType_type;
-	public static String _UI_RendererType_type;
-	public static String _UI_RenderKitFactoryType_type;
-	public static String _UI_RenderKitType_type;
-	public static String _UI_StateManagerType_type;
-	public static String _UI_SupportedComponentClassType_type;
-	public static String _UI_SupportedComponentTypeType_type;
-	public static String _UI_SupportedLocaleType_type;
-	public static String _UI_ValidatorType_type;
-	public static String _UI_ValueType_type;
-	public static String _UI_VariableResolverType_type;
-	public static String _UI_ViewHandlerType_type;
-	public static String _UI_Unknown_type;
-	public static String _UI_ActionListenerType_value_feature;
-	public static String _UI_ActionListenerType_id_feature;
-	public static String _UI_ApplicationFactoryType_value_feature;
-	public static String _UI_ApplicationFactoryType_id_feature;
-	public static String _UI_ApplicationType_actionListener_feature;
-	public static String _UI_ApplicationType_messageBundle_feature;
-	public static String _UI_ApplicationType_navigationHandler_feature;
-	public static String _UI_ApplicationType_viewHandler_feature;
-	public static String _UI_ApplicationType_stateManager_feature;
-	public static String _UI_ApplicationType_propertyResolver_feature;
-	public static String _UI_ApplicationType_variableResolver_feature;
-	public static String _UI_ApplicationType_localeConfig_feature;
-	public static String _UI_ApplicationType_id_feature;
-	public static String _UI_AttributeExtensionType_mixed_feature;
-	public static String _UI_AttributeExtensionType_group_feature;
-	public static String _UI_AttributeExtensionType_any_feature;
-	public static String _UI_AttributeExtensionType_id_feature;
-	public static String _UI_AttributeNameType_value_feature;
-	public static String _UI_AttributeNameType_id_feature;
-	public static String _UI_AttributeType_description_feature;
-	public static String _UI_AttributeType_displayName_feature;
-	public static String _UI_AttributeType_icon_feature;
-	public static String _UI_AttributeType_attributeName_feature;
-	public static String _UI_AttributeType_attributeExtension_feature;
-	public static String _UI_AttributeType_attributeClass_feature;
-	public static String _UI_AttributeType_defaultValue_feature;
-	public static String _UI_AttributeType_id_feature;
-	public static String _UI_AttributeType_suggestedValue_feature;
-	public static String _UI_ComponentClassType_value_feature;
-	public static String _UI_ComponentClassType_id_feature;
-	public static String _UI_ComponentExtensionType_mixed_feature;
-	public static String _UI_ComponentExtensionType_group_feature;
-	public static String _UI_ComponentExtensionType_any_feature;
-	public static String _UI_ComponentExtensionType_id_feature;
-	public static String _UI_ComponentType_description_feature;
-	public static String _UI_ComponentType_displayName_feature;
-	public static String _UI_ComponentType_icon_feature;
-	public static String _UI_ComponentType_componentType_feature;
-	public static String _UI_ComponentType_componentClass_feature;
-	public static String _UI_ComponentType_attribute_feature;
-	public static String _UI_ComponentType_property_feature;
-	public static String _UI_ComponentType_componentExtension_feature;
-	public static String _UI_ComponentType_id_feature;
-	public static String _UI_ComponentTypeType_value_feature;
-	public static String _UI_ComponentTypeType_id_feature;
-	public static String _UI_ConverterType_description_feature;
-	public static String _UI_ConverterType_displayName_feature;
-	public static String _UI_ConverterType_icon_feature;
-	public static String _UI_ConverterType_attribute_feature;
-	public static String _UI_ConverterType_property_feature;
-	public static String _UI_ConverterType_converterClass_feature;
-	public static String _UI_ConverterType_converterForClass_feature;
-	public static String _UI_ConverterType_converterId_feature;
-	public static String _UI_ConverterType_id_feature;
-	public static String _UI_DefaultLocaleType_value_feature;
-	public static String _UI_DefaultLocaleType_id_feature;
-	public static String _UI_DescriptionType_value_feature;
-	public static String _UI_DescriptionType_id_feature;
-	public static String _UI_DescriptionType_lang_feature;
-	public static String _UI_DisplayNameType_value_feature;
-	public static String _UI_DisplayNameType_id_feature;
-	public static String _UI_DisplayNameType_lang_feature;
-	public static String _UI_DocumentRoot_mixed_feature;
-	public static String _UI_DocumentRoot_xMLNSPrefixMap_feature;
-	public static String _UI_DocumentRoot_xSISchemaLocation_feature;
-	public static String _UI_DocumentRoot_actionListener_feature;
-	public static String _UI_DocumentRoot_application_feature;
-	public static String _UI_DocumentRoot_applicationFactory_feature;
-	public static String _UI_DocumentRoot_attribute_feature;
-	public static String _UI_DocumentRoot_attributeExtension_feature;
-	public static String _UI_DocumentRoot_attributeName_feature;
-	public static String _UI_DocumentRoot_component_feature;
-	public static String _UI_DocumentRoot_componentClass_feature;
-	public static String _UI_DocumentRoot_componentExtension_feature;
-	public static String _UI_DocumentRoot_componentType_feature;
-	public static String _UI_DocumentRoot_converter_feature;
-	public static String _UI_DocumentRoot_defaultLocale_feature;
-	public static String _UI_DocumentRoot_description_feature;
-	public static String _UI_DocumentRoot_displayName_feature;
-	public static String _UI_DocumentRoot_facesConfig_feature;
-	public static String _UI_DocumentRoot_facesContextFactory_feature;
-	public static String _UI_DocumentRoot_factory_feature;
-	public static String _UI_DocumentRoot_icon_feature;
-	public static String _UI_DocumentRoot_lifecycle_feature;
-	public static String _UI_DocumentRoot_lifecycleFactory_feature;
-	public static String _UI_DocumentRoot_listEntries_feature;
-	public static String _UI_DocumentRoot_localeConfig_feature;
-	public static String _UI_DocumentRoot_managedBean_feature;
-	public static String _UI_DocumentRoot_managedProperty_feature;
-	public static String _UI_DocumentRoot_mapEntries_feature;
-	public static String _UI_DocumentRoot_mapEntry_feature;
-	public static String _UI_DocumentRoot_messageBundle_feature;
-	public static String _UI_DocumentRoot_navigationCase_feature;
-	public static String _UI_DocumentRoot_navigationHandler_feature;
-	public static String _UI_DocumentRoot_navigationRule_feature;
-	public static String _UI_DocumentRoot_nullValue_feature;
-	public static String _UI_DocumentRoot_phaseListener_feature;
-	public static String _UI_DocumentRoot_property_feature;
-	public static String _UI_DocumentRoot_propertyExtension_feature;
-	public static String _UI_DocumentRoot_propertyResolver_feature;
-	public static String _UI_DocumentRoot_redirect_feature;
-	public static String _UI_DocumentRoot_referencedBean_feature;
-	public static String _UI_DocumentRoot_renderer_feature;
-	public static String _UI_DocumentRoot_rendererExtension_feature;
-	public static String _UI_DocumentRoot_renderKit_feature;
-	public static String _UI_DocumentRoot_renderKitFactory_feature;
-	public static String _UI_DocumentRoot_stateManager_feature;
-	public static String _UI_DocumentRoot_supportedComponentClass_feature;
-	public static String _UI_DocumentRoot_supportedComponentType_feature;
-	public static String _UI_DocumentRoot_supportedLocale_feature;
-	public static String _UI_DocumentRoot_validator_feature;
-	public static String _UI_DocumentRoot_value_feature;
-	public static String _UI_DocumentRoot_variableResolver_feature;
-	public static String _UI_DocumentRoot_viewHandler_feature;
-	public static String _UI_FacesConfigType_application_feature;
-	public static String _UI_FacesConfigType_factory_feature;
-	public static String _UI_FacesConfigType_component_feature;
-	public static String _UI_FacesConfigType_converter_feature;
-	public static String _UI_FacesConfigType_managedBean_feature;
-	public static String _UI_FacesConfigType_navigationRule_feature;
-	public static String _UI_FacesConfigType_referencedBean_feature;
-	public static String _UI_FacesConfigType_renderKit_feature;
-	public static String _UI_FacesConfigType_lifecycle_feature;
-	public static String _UI_FacesConfigType_validator_feature;
-	public static String _UI_FacesConfigType_id_feature;
-	public static String _UI_FacesConfigType_xmlns00000_feature;
-	public static String _UI_FacesContextFactoryType_value_feature;
-	public static String _UI_FacesContextFactoryType_id_feature;
-	public static String _UI_FactoryType_applicationFactory_feature;
-	public static String _UI_FactoryType_facesContextFactory_feature;
-	public static String _UI_FactoryType_lifecycleFactory_feature;
-	public static String _UI_FactoryType_renderKitFactory_feature;
-	public static String _UI_FactoryType_id_feature;
-	public static String _UI_IconType_id_feature;
-	public static String _UI_IconType_lang_feature;
-	public static String _UI_IconType_largeIcon_feature;
-	public static String _UI_IconType_smallIcon_feature;
-	public static String _UI_LifecycleFactoryType_value_feature;
-	public static String _UI_LifecycleFactoryType_id_feature;
-	public static String _UI_LifecycleType_phaseListener_feature;
-	public static String _UI_LifecycleType_id_feature;
-	public static String _UI_ListEntriesType_nullValue_feature;
-	public static String _UI_ListEntriesType_value_feature;
-	public static String _UI_ListEntriesType_id_feature;
-	public static String _UI_ListEntriesType_valueClass_feature;
-	public static String _UI_LocaleConfigType_defaultLocale_feature;
-	public static String _UI_LocaleConfigType_supportedLocale_feature;
-	public static String _UI_LocaleConfigType_id_feature;
-	public static String _UI_ManagedBeanType_description_feature;
-	public static String _UI_ManagedBeanType_displayName_feature;
-	public static String _UI_ManagedBeanType_icon_feature;
-	public static String _UI_ManagedBeanType_managedProperty_feature;
-	public static String _UI_ManagedBeanType_mapEntries_feature;
-	public static String _UI_ManagedBeanType_listEntries_feature;
-	public static String _UI_ManagedBeanType_id_feature;
-	public static String _UI_ManagedBeanType_managedBeanClass_feature;
-	public static String _UI_ManagedBeanType_managedBeanName_feature;
-	public static String _UI_ManagedBeanType_managedBeanScope_feature;
-	public static String _UI_ManagedPropertyType_description_feature;
-	public static String _UI_ManagedPropertyType_displayName_feature;
-	public static String _UI_ManagedPropertyType_icon_feature;
-	public static String _UI_ManagedPropertyType_mapEntries_feature;
-	public static String _UI_ManagedPropertyType_listEntries_feature;
-	public static String _UI_ManagedPropertyType_id_feature;
-	public static String _UI_ManagedPropertyType_nullValue_feature;
-	public static String _UI_ManagedPropertyType_propertyClass_feature;
-	public static String _UI_ManagedPropertyType_propertyName_feature;
-	public static String _UI_ManagedPropertyType_value_feature;
-	public static String _UI_MapEntriesType_mapEntry_feature;
-	public static String _UI_MapEntriesType_id_feature;
-	public static String _UI_MapEntriesType_keyClass_feature;
-	public static String _UI_MapEntriesType_valueClass_feature;
-	public static String _UI_MapEntryType_id_feature;
-	public static String _UI_MapEntryType_key_feature;
-	public static String _UI_MapEntryType_nullValue_feature;
-	public static String _UI_MapEntryType_value_feature;
-	public static String _UI_MessageBundleType_value_feature;
-	public static String _UI_MessageBundleType_id_feature;
-	public static String _UI_NavigationCaseType_description_feature;
-	public static String _UI_NavigationCaseType_displayName_feature;
-	public static String _UI_NavigationCaseType_icon_feature;
-	public static String _UI_NavigationCaseType_redirect_feature;
-	public static String _UI_NavigationCaseType_fromAction_feature;
-	public static String _UI_NavigationCaseType_fromOutcome_feature;
-	public static String _UI_NavigationCaseType_id_feature;
-	public static String _UI_NavigationCaseType_toViewId_feature;
-	public static String _UI_NavigationHandlerType_value_feature;
-	public static String _UI_NavigationHandlerType_id_feature;
-	public static String _UI_NavigationRuleType_description_feature;
-	public static String _UI_NavigationRuleType_displayName_feature;
-	public static String _UI_NavigationRuleType_icon_feature;
-	public static String _UI_NavigationRuleType_navigationCase_feature;
-	public static String _UI_NavigationRuleType_fromViewId_feature;
-	public static String _UI_NavigationRuleType_id_feature;
-	public static String _UI_NullValueType_id_feature;
-	public static String _UI_PhaseListenerType_value_feature;
-	public static String _UI_PhaseListenerType_id_feature;
-	public static String _UI_PropertyExtensionType_mixed_feature;
-	public static String _UI_PropertyExtensionType_group_feature;
-	public static String _UI_PropertyExtensionType_any_feature;
-	public static String _UI_PropertyExtensionType_id_feature;
-	public static String _UI_PropertyResolverType_value_feature;
-	public static String _UI_PropertyResolverType_id_feature;
-	public static String _UI_PropertyType_description_feature;
-	public static String _UI_PropertyType_displayName_feature;
-	public static String _UI_PropertyType_icon_feature;
-	public static String _UI_PropertyType_propertyExtension_feature;
-	public static String _UI_PropertyType_defaultValue_feature;
-	public static String _UI_PropertyType_id_feature;
-	public static String _UI_PropertyType_propertyClass_feature;
-	public static String _UI_PropertyType_propertyName_feature;
-	public static String _UI_PropertyType_suggestedValue_feature;
-	public static String _UI_RedirectType_id_feature;
-	public static String _UI_ReferencedBeanType_description_feature;
-	public static String _UI_ReferencedBeanType_displayName_feature;
-	public static String _UI_ReferencedBeanType_icon_feature;
-	public static String _UI_ReferencedBeanType_id_feature;
-	public static String _UI_ReferencedBeanType_referencedBeanClass_feature;
-	public static String _UI_ReferencedBeanType_referencedBeanName_feature;
-	public static String _UI_RendererExtensionType_mixed_feature;
-	public static String _UI_RendererExtensionType_group_feature;
-	public static String _UI_RendererExtensionType_any_feature;
-	public static String _UI_RendererExtensionType_id_feature;
-	public static String _UI_RendererType_description_feature;
-	public static String _UI_RendererType_displayName_feature;
-	public static String _UI_RendererType_icon_feature;
-	public static String _UI_RendererType_attribute_feature;
-	public static String _UI_RendererType_supportedComponentType_feature;
-	public static String _UI_RendererType_supportedComponentClass_feature;
-	public static String _UI_RendererType_rendererExtension_feature;
-	public static String _UI_RendererType_id_feature;
-	public static String _UI_RendererType_rendererClass_feature;
-	public static String _UI_RendererType_rendererType_feature;
-	public static String _UI_RenderKitFactoryType_value_feature;
-	public static String _UI_RenderKitFactoryType_id_feature;
-	public static String _UI_RenderKitType_description_feature;
-	public static String _UI_RenderKitType_displayName_feature;
-	public static String _UI_RenderKitType_icon_feature;
-	public static String _UI_RenderKitType_renderer_feature;
-	public static String _UI_RenderKitType_id_feature;
-	public static String _UI_RenderKitType_renderKitClass_feature;
-	public static String _UI_RenderKitType_renderKitId_feature;
-	public static String _UI_StateManagerType_value_feature;
-	public static String _UI_StateManagerType_id_feature;
-	public static String _UI_SupportedComponentClassType_componentClass_feature;
-	public static String _UI_SupportedComponentClassType_attributeName_feature;
-	public static String _UI_SupportedComponentClassType_id_feature;
-	public static String _UI_SupportedComponentTypeType_componentType_feature;
-	public static String _UI_SupportedComponentTypeType_attributeName_feature;
-	public static String _UI_SupportedComponentTypeType_id_feature;
-	public static String _UI_SupportedLocaleType_value_feature;
-	public static String _UI_SupportedLocaleType_id_feature;
-	public static String _UI_ValidatorType_description_feature;
-	public static String _UI_ValidatorType_displayName_feature;
-	public static String _UI_ValidatorType_icon_feature;
-	public static String _UI_ValidatorType_attribute_feature;
-	public static String _UI_ValidatorType_property_feature;
-	public static String _UI_ValidatorType_id_feature;
-	public static String _UI_ValidatorType_validatorClass_feature;
-	public static String _UI_ValidatorType_validatorId_feature;
-	public static String _UI_ValueType_value_feature;
-	public static String _UI_ValueType_id_feature;
-	public static String _UI_VariableResolverType_value_feature;
-	public static String _UI_VariableResolverType_id_feature;
-	public static String _UI_ViewHandlerType_value_feature;
-	public static String _UI_ViewHandlerType_id_feature;
-	public static String _UI_Unknown_feature;
-	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 265d0a7..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, 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
-###############################################################################
-#/***************************************************************************************************
-# * Copyright (c) 2005, 2006 IBM Corporation and others. 
-# * All rights reserved. This program and the accompanying materials 
-# * are made available under the terms of the Eclipse Public License v1.0
-# * which accompanies this distribution, and is available at
-# * http://www.eclipse.org/legal/epl-v10.html
-# * 
-# * Contributors: 
-# *   IBM Corporation - initial API and implementation
-# **************************************************************************************************/
-Source_UI_ = XML Source
-FaceConfigEditor_Title=Faces Configuration File Editor
-
-Overview_Page_Title=Overview
-Application_Page_Title=Application
-Factory_Page_Title=Factory
-Component_Page_Title=Components
-Converter_Page_Title=Converter
-ManagedBean_Page_Title=Managed Beans
-NavigationRule_Page_Title=Navigation Rules
-ReferencedBean_Page_Title=Referenced Beans
-RenderKit_Page_Title=RenderKits
-Lifecycle_Page_Title=Lifecycle
-Validator_Page_Title=Validator
-
-MANAGEDBEAN_MAIN_SEC_TITLE=Managed Beans
-MANAGEDBEAN_MAIN_SEC_DESC=The following Managed Beans are defined for this config file
-Invalid_Config_File = The Faces Configuration File editor cannot open the file because it is not a valid Faces configuration file.  The XML editor will be opened.
-OPEN_TO_FACESCONFIG_SOURCE_PAGE_MENU_LABEL=Faces Configuration File Editor Source Page
-
-_UI_CreateChild_text = {0}
-_UI_CreateChild_text2 = {1} {0}
-_UI_CreateChild_tooltip = Create New {0} Under {1} Feature
-_UI_CreateChild_description = Create a new child of type {0} for the {1} feature of the selected {2}.
-_UI_CreateSibling_description = Create a new sibling of type {0} for the selected {2}, under the {1} feature of their parent.
-
-_UI_PropertyDescriptor_description = The {0} of the {1}
-
-_UI_ActionListenerType_type = Action Listener Type
-_UI_ApplicationFactoryType_type = Application Factory Type
-_UI_ApplicationType_type = Application Type
-_UI_AttributeExtensionType_type = Attribute Extension Type
-_UI_AttributeNameType_type = Attribute Name Type
-_UI_AttributeType_type = Attribute Type
-_UI_ComponentClassType_type = Component Class Type
-_UI_ComponentExtensionType_type = Component Extension Type
-_UI_ComponentType_type = Component Type
-_UI_ComponentTypeType_type = Component Type Type
-_UI_ConverterType_type = Converter Type
-_UI_DefaultLocaleType_type = Default Locale Type
-_UI_DescriptionType_type = Description Type
-_UI_DisplayNameType_type = Display Name Type
-_UI_DocumentRoot_type = Document Root
-_UI_FacesConfigType_type = Type
-_UI_FacesContextFactoryType_type = Faces Context Factory Type
-_UI_FactoryType_type = Factory Type
-_UI_IconType_type = Icon Type
-_UI_LifecycleFactoryType_type = Lifecycle Factory Type
-_UI_LifecycleType_type = Lifecycle Type
-_UI_ListEntriesType_type = List Entries Type
-_UI_LocaleConfigType_type = Locale Config Type
-_UI_ManagedBeanType_type = Managed Bean Type
-_UI_ManagedPropertyType_type = Managed Property Type
-_UI_MapEntriesType_type = Map Entries Type
-_UI_MapEntryType_type = Map Entry Type
-_UI_MessageBundleType_type = Message Bundle Type
-_UI_NavigationCaseType_type = Navigation Case Type
-_UI_NavigationHandlerType_type = Navigation Handler Type
-_UI_NavigationRuleType_type = Navigation Rule Type
-_UI_NullValueType_type = Null Value Type
-_UI_PhaseListenerType_type = Phase Listener Type
-_UI_PropertyExtensionType_type = Property Extension Type
-_UI_PropertyResolverType_type = Property Resolver Type
-_UI_PropertyType_type = Property Type
-_UI_RedirectType_type = Redirect Type
-_UI_ReferencedBeanType_type = Referenced Bean Type
-_UI_RendererExtensionType_type = Renderer Extension Type
-_UI_RendererType_type = Renderer Type
-_UI_RenderKitFactoryType_type = Render Kit Factory Type
-_UI_RenderKitType_type = Render Kit Type
-_UI_StateManagerType_type = State Manager Type
-_UI_SupportedComponentClassType_type = Supported Component Class Type
-_UI_SupportedComponentTypeType_type = Supported Component Type Type
-_UI_SupportedLocaleType_type = Supported Locale Type
-_UI_ValidatorType_type = Validator Type
-_UI_ValueType_type = Value Type
-_UI_VariableResolverType_type = Variable Resolver Type
-_UI_ViewHandlerType_type = View Handler Type
-_UI_Unknown_type = Object
-
-_UI_ActionListenerType_value_feature = Value
-_UI_ActionListenerType_id_feature = Id
-_UI_ApplicationFactoryType_value_feature = Value
-_UI_ApplicationFactoryType_id_feature = Id
-_UI_ApplicationType_actionListener_feature = Action Listener
-_UI_ApplicationType_messageBundle_feature = Message Bundle
-_UI_ApplicationType_navigationHandler_feature = Navigation Handler
-_UI_ApplicationType_viewHandler_feature = View Handler
-_UI_ApplicationType_stateManager_feature = State Manager
-_UI_ApplicationType_propertyResolver_feature = Property Resolver
-_UI_ApplicationType_variableResolver_feature = Variable Resolver
-_UI_ApplicationType_localeConfig_feature = Locale Config
-_UI_ApplicationType_id_feature = Id
-_UI_AttributeExtensionType_mixed_feature = Mixed
-_UI_AttributeExtensionType_group_feature = Group
-_UI_AttributeExtensionType_any_feature = Any
-_UI_AttributeExtensionType_id_feature = Id
-_UI_AttributeNameType_value_feature = Value
-_UI_AttributeNameType_id_feature = Id
-_UI_AttributeType_description_feature = Description
-_UI_AttributeType_displayName_feature = Display Name
-_UI_AttributeType_icon_feature = Icon
-_UI_AttributeType_attributeName_feature = Attribute Name
-_UI_AttributeType_attributeExtension_feature = Attribute Extension
-_UI_AttributeType_attributeClass_feature = Attribute Class
-_UI_AttributeType_defaultValue_feature = Default Value
-_UI_AttributeType_id_feature = Id
-_UI_AttributeType_suggestedValue_feature = Suggested Value
-_UI_ComponentClassType_value_feature = Value
-_UI_ComponentClassType_id_feature = Id
-_UI_ComponentExtensionType_mixed_feature = Mixed
-_UI_ComponentExtensionType_group_feature = Group
-_UI_ComponentExtensionType_any_feature = Any
-_UI_ComponentExtensionType_id_feature = Id
-_UI_ComponentType_description_feature = Description
-_UI_ComponentType_displayName_feature = Display Name
-_UI_ComponentType_icon_feature = Icon
-_UI_ComponentType_componentType_feature = Component Type
-_UI_ComponentType_componentClass_feature = Component Class
-_UI_ComponentType_attribute_feature = Attribute
-_UI_ComponentType_property_feature = Property
-_UI_ComponentType_componentExtension_feature = Component Extension
-_UI_ComponentType_id_feature = Id
-_UI_ComponentTypeType_value_feature = Value
-_UI_ComponentTypeType_id_feature = Id
-_UI_ConverterType_description_feature = Description
-_UI_ConverterType_displayName_feature = Display Name
-_UI_ConverterType_icon_feature = Icon
-_UI_ConverterType_attribute_feature = Attribute
-_UI_ConverterType_property_feature = Property
-_UI_ConverterType_converterClass_feature = Converter Class
-_UI_ConverterType_converterForClass_feature = Converter For Class
-_UI_ConverterType_converterId_feature = Converter Id
-_UI_ConverterType_id_feature = Id
-_UI_DefaultLocaleType_value_feature = Value
-_UI_DefaultLocaleType_id_feature = Id
-_UI_DescriptionType_value_feature = Value
-_UI_DescriptionType_id_feature = Id
-_UI_DescriptionType_lang_feature = Lang
-_UI_DisplayNameType_value_feature = Value
-_UI_DisplayNameType_id_feature = Id
-_UI_DisplayNameType_lang_feature = Lang
-_UI_DocumentRoot_mixed_feature = Mixed
-_UI_DocumentRoot_xMLNSPrefixMap_feature = XMLNS Prefix Map
-_UI_DocumentRoot_xSISchemaLocation_feature = XSI Schema Location
-_UI_DocumentRoot_actionListener_feature = Action Listener
-_UI_DocumentRoot_application_feature = Application
-_UI_DocumentRoot_applicationFactory_feature = Application Factory
-_UI_DocumentRoot_attribute_feature = Attribute
-_UI_DocumentRoot_attributeExtension_feature = Attribute Extension
-_UI_DocumentRoot_attributeName_feature = Attribute Name
-_UI_DocumentRoot_component_feature = Component
-_UI_DocumentRoot_componentClass_feature = Component Class
-_UI_DocumentRoot_componentExtension_feature = Component Extension
-_UI_DocumentRoot_componentType_feature = Component Type
-_UI_DocumentRoot_converter_feature = Converter
-_UI_DocumentRoot_defaultLocale_feature = Default Locale
-_UI_DocumentRoot_description_feature = Description
-_UI_DocumentRoot_displayName_feature = Display Name
-_UI_DocumentRoot_facesConfig_feature = Faces Config
-_UI_DocumentRoot_facesContextFactory_feature = Faces Context Factory
-_UI_DocumentRoot_factory_feature = Factory
-_UI_DocumentRoot_icon_feature = Icon
-_UI_DocumentRoot_lifecycle_feature = Lifecycle
-_UI_DocumentRoot_lifecycleFactory_feature = Lifecycle Factory
-_UI_DocumentRoot_listEntries_feature = List Entries
-_UI_DocumentRoot_localeConfig_feature = Locale Config
-_UI_DocumentRoot_managedBean_feature = Managed Bean
-_UI_DocumentRoot_managedProperty_feature = Managed Property
-_UI_DocumentRoot_mapEntries_feature = Map Entries
-_UI_DocumentRoot_mapEntry_feature = Map Entry
-_UI_DocumentRoot_messageBundle_feature = Message Bundle
-_UI_DocumentRoot_navigationCase_feature = Navigation Case
-_UI_DocumentRoot_navigationHandler_feature = Navigation Handler
-_UI_DocumentRoot_navigationRule_feature = Navigation Rule
-_UI_DocumentRoot_nullValue_feature = Null Value
-_UI_DocumentRoot_phaseListener_feature = Phase Listener
-_UI_DocumentRoot_property_feature = Property
-_UI_DocumentRoot_propertyExtension_feature = Property Extension
-_UI_DocumentRoot_propertyResolver_feature = Property Resolver
-_UI_DocumentRoot_redirect_feature = Redirect
-_UI_DocumentRoot_referencedBean_feature = Referenced Bean
-_UI_DocumentRoot_renderer_feature = Renderer
-_UI_DocumentRoot_rendererExtension_feature = Renderer Extension
-_UI_DocumentRoot_renderKit_feature = Render Kit
-_UI_DocumentRoot_renderKitFactory_feature = Render Kit Factory
-_UI_DocumentRoot_stateManager_feature = State Manager
-_UI_DocumentRoot_supportedComponentClass_feature = Supported Component Class
-_UI_DocumentRoot_supportedComponentType_feature = Supported Component Type
-_UI_DocumentRoot_supportedLocale_feature = Supported Locale
-_UI_DocumentRoot_validator_feature = Validator
-_UI_DocumentRoot_value_feature = Value
-_UI_DocumentRoot_variableResolver_feature = Variable Resolver
-_UI_DocumentRoot_viewHandler_feature = View Handler
-_UI_FacesConfigType_application_feature = Application
-_UI_FacesConfigType_factory_feature = Factory
-_UI_FacesConfigType_component_feature = Component
-_UI_FacesConfigType_converter_feature = Converter
-_UI_FacesConfigType_managedBean_feature = Managed Bean
-_UI_FacesConfigType_navigationRule_feature = Navigation Rule
-_UI_FacesConfigType_referencedBean_feature = Referenced Bean
-_UI_FacesConfigType_renderKit_feature = Render Kit
-_UI_FacesConfigType_lifecycle_feature = Lifecycle
-_UI_FacesConfigType_validator_feature = Validator
-_UI_FacesConfigType_id_feature = Id
-_UI_FacesConfigType_xmlns00000_feature = Xmlns00000
-_UI_FacesContextFactoryType_value_feature = Value
-_UI_FacesContextFactoryType_id_feature = Id
-_UI_FactoryType_applicationFactory_feature = Application Factory
-_UI_FactoryType_facesContextFactory_feature = Faces Context Factory
-_UI_FactoryType_lifecycleFactory_feature = Lifecycle Factory
-_UI_FactoryType_renderKitFactory_feature = Render Kit Factory
-_UI_FactoryType_id_feature = Id
-_UI_IconType_id_feature = Id
-_UI_IconType_lang_feature = Lang
-_UI_IconType_largeIcon_feature = Large Icon
-_UI_IconType_smallIcon_feature = Small Icon
-_UI_LifecycleFactoryType_value_feature = Value
-_UI_LifecycleFactoryType_id_feature = Id
-_UI_LifecycleType_phaseListener_feature = Phase Listener
-_UI_LifecycleType_id_feature = Id
-_UI_ListEntriesType_nullValue_feature = Null Value
-_UI_ListEntriesType_value_feature = Value
-_UI_ListEntriesType_id_feature = Id
-_UI_ListEntriesType_valueClass_feature = Value Class
-_UI_LocaleConfigType_defaultLocale_feature = Default Locale
-_UI_LocaleConfigType_supportedLocale_feature = Supported Locale
-_UI_LocaleConfigType_id_feature = Id
-_UI_ManagedBeanType_description_feature = Description
-_UI_ManagedBeanType_displayName_feature = Display Name
-_UI_ManagedBeanType_icon_feature = Icon
-_UI_ManagedBeanType_managedProperty_feature = Managed Property
-_UI_ManagedBeanType_mapEntries_feature = Map Entries
-_UI_ManagedBeanType_listEntries_feature = List Entries
-_UI_ManagedBeanType_id_feature = Id
-_UI_ManagedBeanType_managedBeanClass_feature = Managed Bean Class
-_UI_ManagedBeanType_managedBeanName_feature = Managed Bean Name
-_UI_ManagedBeanType_managedBeanScope_feature = Managed Bean Scope
-_UI_ManagedPropertyType_description_feature = Description
-_UI_ManagedPropertyType_displayName_feature = Display Name
-_UI_ManagedPropertyType_icon_feature = Icon
-_UI_ManagedPropertyType_mapEntries_feature = Map Entries
-_UI_ManagedPropertyType_listEntries_feature = List Entries
-_UI_ManagedPropertyType_id_feature = Id
-_UI_ManagedPropertyType_nullValue_feature = Null Value
-_UI_ManagedPropertyType_propertyClass_feature = Property Class
-_UI_ManagedPropertyType_propertyName_feature = Property Name
-_UI_ManagedPropertyType_value_feature = Value
-_UI_MapEntriesType_mapEntry_feature = Map Entry
-_UI_MapEntriesType_id_feature = Id
-_UI_MapEntriesType_keyClass_feature = Key Class
-_UI_MapEntriesType_valueClass_feature = Value Class
-_UI_MapEntryType_id_feature = Id
-_UI_MapEntryType_key_feature = Key
-_UI_MapEntryType_nullValue_feature = Null Value
-_UI_MapEntryType_value_feature = Value
-_UI_MessageBundleType_value_feature = Value
-_UI_MessageBundleType_id_feature = Id
-_UI_NavigationCaseType_description_feature = Description
-_UI_NavigationCaseType_displayName_feature = Display Name
-_UI_NavigationCaseType_icon_feature = Icon
-_UI_NavigationCaseType_redirect_feature = Redirect
-_UI_NavigationCaseType_fromAction_feature = From Action
-_UI_NavigationCaseType_fromOutcome_feature = From Outcome
-_UI_NavigationCaseType_id_feature = Id
-_UI_NavigationCaseType_toViewId_feature = To View Id
-_UI_NavigationHandlerType_value_feature = Value
-_UI_NavigationHandlerType_id_feature = Id
-_UI_NavigationRuleType_description_feature = Description
-_UI_NavigationRuleType_displayName_feature = Display Name
-_UI_NavigationRuleType_icon_feature = Icon
-_UI_NavigationRuleType_navigationCase_feature = Navigation Case
-_UI_NavigationRuleType_fromViewId_feature = From View Id
-_UI_NavigationRuleType_id_feature = Id
-_UI_NullValueType_id_feature = Id
-_UI_PhaseListenerType_value_feature = Value
-_UI_PhaseListenerType_id_feature = Id
-_UI_PropertyExtensionType_mixed_feature = Mixed
-_UI_PropertyExtensionType_group_feature = Group
-_UI_PropertyExtensionType_any_feature = Any
-_UI_PropertyExtensionType_id_feature = Id
-_UI_PropertyResolverType_value_feature = Value
-_UI_PropertyResolverType_id_feature = Id
-_UI_PropertyType_description_feature = Description
-_UI_PropertyType_displayName_feature = Display Name
-_UI_PropertyType_icon_feature = Icon
-_UI_PropertyType_propertyExtension_feature = Property Extension
-_UI_PropertyType_defaultValue_feature = Default Value
-_UI_PropertyType_id_feature = Id
-_UI_PropertyType_propertyClass_feature = Property Class
-_UI_PropertyType_propertyName_feature = Property Name
-_UI_PropertyType_suggestedValue_feature = Suggested Value
-_UI_RedirectType_id_feature = Id
-_UI_ReferencedBeanType_description_feature = Description
-_UI_ReferencedBeanType_displayName_feature = Display Name
-_UI_ReferencedBeanType_icon_feature = Icon
-_UI_ReferencedBeanType_id_feature = Id
-_UI_ReferencedBeanType_referencedBeanClass_feature = Referenced Bean Class
-_UI_ReferencedBeanType_referencedBeanName_feature = Referenced Bean Name
-_UI_RendererExtensionType_mixed_feature = Mixed
-_UI_RendererExtensionType_group_feature = Group
-_UI_RendererExtensionType_any_feature = Any
-_UI_RendererExtensionType_id_feature = Id
-_UI_RendererType_description_feature = Description
-_UI_RendererType_displayName_feature = Display Name
-_UI_RendererType_icon_feature = Icon
-_UI_RendererType_attribute_feature = Attribute
-_UI_RendererType_supportedComponentType_feature = Supported Component Type
-_UI_RendererType_supportedComponentClass_feature = Supported Component Class
-_UI_RendererType_rendererExtension_feature = Renderer Extension
-_UI_RendererType_id_feature = Id
-_UI_RendererType_rendererClass_feature = Renderer Class
-_UI_RendererType_rendererType_feature = Renderer Type
-_UI_RenderKitFactoryType_value_feature = Value
-_UI_RenderKitFactoryType_id_feature = Id
-_UI_RenderKitType_description_feature = Description
-_UI_RenderKitType_displayName_feature = Display Name
-_UI_RenderKitType_icon_feature = Icon
-_UI_RenderKitType_renderer_feature = Renderer
-_UI_RenderKitType_id_feature = Id
-_UI_RenderKitType_renderKitClass_feature = Render Kit Class
-_UI_RenderKitType_renderKitId_feature = Render Kit Id
-_UI_StateManagerType_value_feature = Value
-_UI_StateManagerType_id_feature = Id
-_UI_SupportedComponentClassType_componentClass_feature = Component Class
-_UI_SupportedComponentClassType_attributeName_feature = Attribute Name
-_UI_SupportedComponentClassType_id_feature = Id
-_UI_SupportedComponentTypeType_componentType_feature = Component Type
-_UI_SupportedComponentTypeType_attributeName_feature = Attribute Name
-_UI_SupportedComponentTypeType_id_feature = Id
-_UI_SupportedLocaleType_value_feature = Value
-_UI_SupportedLocaleType_id_feature = Id
-_UI_ValidatorType_description_feature = Description
-_UI_ValidatorType_displayName_feature = Display Name
-_UI_ValidatorType_icon_feature = Icon
-_UI_ValidatorType_attribute_feature = Attribute
-_UI_ValidatorType_property_feature = Property
-_UI_ValidatorType_id_feature = Id
-_UI_ValidatorType_validatorClass_feature = Validator Class
-_UI_ValidatorType_validatorId_feature = Validator Id
-_UI_ValueType_value_feature = Value
-_UI_ValueType_id_feature = Id
-_UI_VariableResolverType_value_feature = Value
-_UI_VariableResolverType_id_feature = Id
-_UI_ViewHandlerType_value_feature = Value
-_UI_ViewHandlerType_id_feature = Id
-_UI_Unknown_feature = Unspecified
-
-scValidation_duplicate_definition=Duplicate {0} {1}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ActionListenerTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ActionListenerTranslator.java
deleted file mode 100644
index 51bdd31..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ActionListenerTranslator.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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 {
-	public ActionListenerTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);//$NON-NLS-1$
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new 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 98592b0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationExtensionTranslator.java
+++ /dev/null
@@ -1,21 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-public class ApplicationExtensionTranslator extends ExtensionTypeTranslator {
-
-    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 f9dd580..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationFactoryTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class ApplicationFactoryTranslator extends Translator {
-	/**
-	 * @param domNameAndPath 
-	 * @param aFeature 
-	 */
-	public ApplicationFactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (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 b1f409e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationTranslator.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 - 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 {
-	public ApplicationTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);//$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-				new ActionListenerTranslator("action-listener", facesPackage.getApplicationType_ActionListener()), //$NON-NLS-1$
-				new DefaultRenderKitIdTranslator("default-render-kit-id", facesPackage.getApplicationType_DefaultRenderKitId()), //$NON-NLS-1$
-				new MessageBundleTranslator("message-bundle", facesPackage.getApplicationType_MessageBundle()), //$NON-NLS-1$
-				new NavigationHandlerTranslator("navigation-handler", facesPackage.getApplicationType_NavigationHandler()), //$NON-NLS-1$
-				new ViewHandlerTranslator("view-handler", facesPackage.getApplicationType_ViewHandler()), //$NON-NLS-1$
-				new StateManagerTranslator("state-manager", facesPackage.getApplicationType_StateManager()), //$NON-NLS-1$
-				new PropertyResolverTranslator("property-resolver", facesPackage.getApplicationType_PropertyResolver()), //$NON-NLS-1$
-				new VariableResolverTranslator("variable-resolver", facesPackage.getApplicationType_VariableResolver()), //$NON-NLS-1$
-				new LocaleConfigTranslator("locale-config", facesPackage.getApplicationType_LocaleConfig()), //$NON-NLS-1$
-                new ELResolverTypeTranslator("el-resolver", facesPackage.getApplicationType_ELResolver()),
-                new ResourceBundleTranslator("resource-bundle", facesPackage.getApplicationType_ResourceBundle()),
-                new ApplicationExtensionTranslator("application-extension", facesPackage.getApplicationType_ApplicationExtension()),
-				new Translator("id", facesPackage.getApplicationType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeClassTranslator.java
deleted file mode 100644
index 3674af8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeClassTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class AttributeClassTranslator extends Translator {
-
-	public AttributeClassTranslator(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 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 8820643..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeExtensionTranslator.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which 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 {
-	public AttributeExtensionTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);//$NON-NLS-1$
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeNameTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeNameTranslator.java
deleted file mode 100644
index 920ec61..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeNameTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class AttributeNameTranslator extends Translator {
-
-	public AttributeNameTranslator(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 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 73353d4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeTranslator.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 AttributeTranslator extends Translator {
-
-	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 4bc43b0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BaseNameTranslator.java
+++ /dev/null
@@ -1,32 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-public class BaseNameTranslator extends Translator {
-
-    public BaseNameTranslator(String domNameAndPath, EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-
-    public Translator[] getChildren()
-    {
-        FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-
-        return new Translator[] {
-            new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getBaseNameType_TextContent()),
-            new Translator("id", facesPackage.getBaseNameType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-        };
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentClassTranslator.java
deleted file mode 100644
index 03c6717..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentClassTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class ComponentClassTranslator extends Translator {
-
-	public ComponentClassTranslator(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 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 aa9c049..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentExtensionTranslator.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which 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 {
-	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 b9b893c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentFamilyTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class ComponentFamilyTranslator extends Translator {
-
-	public ComponentFamilyTranslator(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 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 ab9a4c9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentTranslator.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 ComponentTranslator extends Translator {
-	public ComponentTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);//$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getComponentType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getComponentType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getComponentType_Icon()), //$NON-NLS-1$
-			new ComponentTypeTranslator("component-type", facesPackage.getComponentType_ComponentType()), //$NON-NLS-1$
-			new ComponentClassTranslator("component-class", facesPackage.getComponentType_ComponentClass()), //$NON-NLS-1$
-			new FacetTranslator("facet", facesPackage.getComponentType_Facet()), //$NON-NLS-1$
-			new AttributeTranslator("attribute", facesPackage.getComponentType_Attribute()), //$NON-NLS-1$
-			new PropertyTranslator("property", facesPackage.getComponentType_Property()), //$NON-NLS-1$
-			new ComponentExtensionTranslator("component-extension", facesPackage.getComponentType_ComponentExtension()),//ComponentExtensionTranslator("component-extension", facesPackage.getComponentType_ComponentExtension()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getComponentType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentTypeTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentTypeTranslator.java
deleted file mode 100644
index e3fc73c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentTypeTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class ComponentTypeTranslator extends Translator {
-
-	public ComponentTypeTranslator(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 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 addd797..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterClassTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class ConverterClassTranslator extends Translator {
-
-	public ConverterClassTranslator(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 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 4cdf304..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterExtensionTranslator.java
+++ /dev/null
@@ -1,22 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-public class ConverterExtensionTranslator extends ExtensionTypeTranslator 
-{
-    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 6be272d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterForClassTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class ConverterForClassTranslator extends Translator {
-
-	public ConverterForClassTranslator(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 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 6c72e1b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterIdTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class ConverterIdTranslator extends Translator {
-
-	public ConverterIdTranslator(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 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 69a728b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterTranslator.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 ConverterTranslator extends Translator {
-	public ConverterTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature); //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getConverterType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getConverterType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getConverterType_Icon()), //$NON-NLS-1$
-			new ConverterIdTranslator("converter-id", facesPackage.getConverterType_ConverterId()), //$NON-NLS-1$
-			new ConverterForClassTranslator("converter-for-class", facesPackage.getConverterType_ConverterForClass()), //$NON-NLS-1$
-			new ConverterClassTranslator("converter-class", facesPackage.getConverterType_ConverterClass()), //$NON-NLS-1$
-			new AttributeTranslator("attribute", facesPackage.getConverterType_Attribute()), //$NON-NLS-1$
-			new PropertyTranslator("property", facesPackage.getConverterType_Property()), //$NON-NLS-1$
-            new ConverterExtensionTranslator("converter-extension", facesPackage.getConverterType_ConverterExtension()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getConverterType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultLocaleTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultLocaleTranslator.java
deleted file mode 100644
index 54be3eb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultLocaleTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class DefaultLocaleTranslator extends Translator {
-
-	public DefaultLocaleTranslator(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 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 595fcf0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultRenderKitIdTranslator.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
- *   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 {
-	public DefaultRenderKitIdTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature); //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getDefaultRenderKitIdType_TextContent()),
-			new Translator("id", facesPackage.getDefaultRenderKitIdType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultValueTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultValueTranslator.java
deleted file mode 100644
index 4b63e7f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultValueTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class DefaultValueTranslator extends Translator {
-
-	public DefaultValueTranslator(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 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 23bf481..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DescriptionTranslator.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
- *   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 {
-	public DescriptionTranslator(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 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 2d913b9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DisplayNameTranslator.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 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 {
-
-	public DisplayNameTranslator(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 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 686a418..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DynamicElementTranslator.java
+++ /dev/null
@@ -1,497 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute;
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicElement;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.ReadAheadHelper;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-import org.eclipse.wst.common.internal.emf.resource.TranslatorPath;
-import org.eclipse.wst.common.internal.emf.resource.VariableTranslatorFactory;
-import org.w3c.dom.Attr;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-class DynamicElementTranslator extends Translator implements IAnyTranslator
-{
-    public boolean isManagedByParent() {
-        return false;
-    }
-
-    protected Translator[] getChildren() 
-    {
-        FacesConfigPackage facesConfigPackage = FacesConfigPackage.eINSTANCE;
-
-        return new Translator[]
-        {
-            new DynamicElementTranslator("*", facesConfigPackage.getDynamicElement_ChildNodes()),
-            new Translator(TEXT_ATTRIBUTE_VALUE, facesConfigPackage.getDynamicElement_TextContent())
-            {
-                public Object getMOFValue(EObject object)
-                {
-                    // TODO: this is a bit of a hack.  The problem is
-                    // that for some reason, if this translator returns
-                    // null, then EMF2DOMAdapterImpl.updateDOMSubtree will
-                    // remove the containing DynamicElement node completely.
-                    // Returning an non-null empty value seems to work
-                    // around this for now.
-                    Object value = super.getMOFValue(object);
-                    return value != null ? value : "";
-                }
-            }
-        };
-    }
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public DynamicElementTranslator(String domNameAndPath,
-            EStructuralFeature feature) 
-    {
-        super(domNameAndPath, feature);
-    }
-    public boolean isMapFor(String domName) {
-        return true;
-    }
-    
-    public EObject createEMFObject(String nodeName, String readAheadName) {
-        // tag name is based on the name property
-        DynamicElement element = FacesConfigFactory.eINSTANCE.createDynamicElement();
-        element.setName(nodeName);
-        return element;
-    }
-
-    public String getDOMName(Object value) {
-        // tag name is based on the name property
-        if (value instanceof DynamicElement)
-        {
-            return ((DynamicElement)value).getName();
-        }
-        return "";
-    }
-
-    public Translator[] getDynamicAttributeTranslators(Node element) {
-        NamedNodeMap attributeMap = element.getAttributes();
-        List attributes = new ArrayList(attributeMap.getLength());
-        for (int i = 0; i < attributeMap.getLength(); i++)
-        {
-            Attr attr = (Attr) attributeMap.item(i);
-            attributes.add(
-                    new DynamicAttributeTranslator(attr.getNodeName(),
-                            FacesConfigPackage.eINSTANCE.getDynamicElement_Attributes()));
-        }
-        
-        return (Translator[]) attributes.toArray(new Translator[0]);
-    }
-    
-    public Translator[] getDynamicAttributeTranslators(DynamicElement element) {
-        List attributes = element.getAttributes();
-        Translator[] translators = new Translator[attributes.size()];
-        int i = 0;
-        for (Iterator it = attributes.iterator(); it.hasNext();)
-        {
-            DynamicAttribute attribute = (DynamicAttribute) it.next();
-            translators[i++] = new DynamicAttributeTranslator(attribute.getName(),
-                    FacesConfigPackage.eINSTANCE.getDynamicElement_Attributes());
-        }
-        return translators;
-    }
-
-    private static class DynamicAttributeTranslator extends Translator
-    {
-
-        /**
-         * @param domNameAndPath
-         * @param feature
-         */
-        public DynamicAttributeTranslator(String domNameAndPath, EStructuralFeature feature) 
-        {
-            // the "*" is a place holder.  The dom path gets ignored in
-            // this translator.  It's a handy one because it is invalid
-            // tag name data so if it gets transmitted to the model
-            // we will get an exception
-            super(domNameAndPath, feature, DOM_ATTRIBUTE);
-        }
-        
-        public boolean isMapFor(String domName) {
-            return super.isMapFor(domName);
-        }
-        
-        public EObject createEMFObject(String nodeName, String readAheadName) {
-            // attribute name is based on the name property
-            DynamicAttribute attribute = FacesConfigFactory.eINSTANCE.createDynamicAttribute();
-            attribute.setName(nodeName);
-            return attribute;
-        }
-        
-        protected Translator[] getChildren() {
-            return new Translator[0];
-        }
-
-        public void addReadAheadHelper(ReadAheadHelper helper) {
-            // TODO Auto-generated method stub
-            super.addReadAheadHelper(helper);
-        }
-
-        public EObject basicGetDependencyObject(EObject parent) {
-            // TODO Auto-generated method stub
-            return super.basicGetDependencyObject(parent);
-        }
-
-        public void clearList(EObject mofObject) {
-            // TODO Auto-generated method stub
-            super.clearList(mofObject);
-        }
-
-        public Object convertStringToValue(String strValue, EObject owner) {
-            // TODO Auto-generated method stub
-            return super.convertStringToValue(strValue, owner);
-        }
-
-        public Object convertStringToValue(String nodeName,
-                String readAheadName, String value, Notifier owner) {
-            // TODO Auto-generated method stub
-            return super.convertStringToValue(nodeName, readAheadName, value, owner);
-        }
-
-        public String convertValueToString(Object value, EObject owner) {
-            // TODO Auto-generated method stub
-            return super.convertValueToString(value, owner);
-        }
-
-        public boolean equals(Object object) {
-            // TODO Auto-generated method stub
-            return super.equals(object);
-        }
-
-        public String extractStringValue(EObject emfObject) {
-            // TODO Auto-generated method stub
-            return super.extractStringValue(emfObject);
-        }
-
-        public boolean featureExists(EObject emfObject) {
-            // TODO Auto-generated method stub
-            return super.featureExists(emfObject);
-        }
-
-        public Translator findChild(String tagName, Object target, int versionID) {
-            // TODO Auto-generated method stub
-            return super.findChild(tagName, target, versionID);
-        }
-
-        public Translator[] getChildren(Object target, int versionID) {
-            // TODO Auto-generated method stub
-            return super.getChildren(target, versionID);
-        }
-
-        public EStructuralFeature getDependencyFeature() {
-            // TODO Auto-generated method stub
-            return super.getDependencyFeature();
-        }
-
-        public String[] getDOMNames() {
-            // TODO Auto-generated method stub
-            return super.getDOMNames();
-        }
-
-        public String getDOMPath() {
-            // TODO Auto-generated method stub
-            return super.getDOMPath();
-        }
-
-        public EStructuralFeature getFeature() {
-            // TODO Auto-generated method stub
-            return super.getFeature();
-        }
-
-        public List getMOFChildren(EObject mofObject) {
-            // TODO Auto-generated method stub
-            return super.getMOFChildren(mofObject);
-        }
-
-        public Object getMOFValue(EObject mofObject) {
-            if (mofObject instanceof DynamicElement)
-            {
-                EList attributes = ((DynamicElement)mofObject).getAttributes();
-                
-                for (final Iterator it = attributes.iterator(); it.hasNext();)
-                {
-                    DynamicAttribute attribute = (DynamicAttribute) it.next();
-                    if (fDOMNames[0].equals(attribute.getName()))
-                    {
-                        return attribute.getValue();
-                    }
-                }
-            }
-            
-            return null;
-        }
-
-        public String getNameSpace() {
-            // TODO Auto-generated method stub
-            return super.getNameSpace();
-        }
-
-        public ReadAheadHelper getReadAheadHelper(String parentName) {
-            // TODO Auto-generated method stub
-            return super.getReadAheadHelper(parentName);
-        }
-
-        public TranslatorPath[] getTranslatorPaths() {
-            // TODO Auto-generated method stub
-            return super.getTranslatorPaths();
-        }
-
-        public Translator[] getVariableChildren(Notifier target, int version) {
-            // TODO Auto-generated method stub
-            return super.getVariableChildren(target, version);
-        }
-
-        public VariableTranslatorFactory getVariableTranslatorFactory() {
-            // TODO Auto-generated method stub
-            return super.getVariableTranslatorFactory();
-        }
-
-        public boolean hasDOMPath() {
-            // TODO Auto-generated method stub
-            return super.hasDOMPath();
-        }
-
-        public boolean hasReadAheadNames() {
-            // TODO Auto-generated method stub
-            return super.hasReadAheadNames();
-        }
-
-        protected void initializeDOMNameAndPath(String domNameAndPathArg) {
-            // TODO Auto-generated method stub
-            super.initializeDOMNameAndPath(domNameAndPathArg);
-        }
-
-        public boolean isBooleanFeature() {
-            // TODO Auto-generated method stub
-            return super.isBooleanFeature();
-        }
-
-        public boolean isBooleanUppercase() {
-            // TODO Auto-generated method stub
-            return super.isBooleanUppercase();
-        }
-
-        public boolean isCDATAContent() {
-            // TODO Auto-generated method stub
-            return super.isCDATAContent();
-        }
-
-        public boolean isComment() {
-            // TODO Auto-generated method stub
-            return super.isComment();
-        }
-
-        public boolean isDataType() {
-            // TODO Auto-generated method stub
-            return super.isDataType();
-        }
-
-        public boolean isDependencyChild() {
-            // TODO Auto-generated method stub
-            return super.isDependencyChild();
-        }
-
-        public boolean isDependencyParent() {
-            // TODO Auto-generated method stub
-            return super.isDependencyParent();
-        }
-
-        public boolean isDOMAttribute() {
-            // TODO Auto-generated method stub
-            return super.isDOMAttribute();
-        }
-
-        public boolean isDOMTextValue() {
-            // TODO Auto-generated method stub
-            return super.isDOMTextValue();
-        }
-
-        public boolean isEmptyContentSignificant() {
-            // TODO Auto-generated method stub
-            return super.isEmptyContentSignificant();
-        }
-
-        public boolean isEmptyTag() {
-            // TODO Auto-generated method stub
-            return super.isEmptyTag();
-        }
-
-        public boolean isEnumFeature() {
-            // TODO Auto-generated method stub
-            return super.isEnumFeature();
-        }
-
-        public boolean isEnumWithHyphens() {
-            // TODO Auto-generated method stub
-            return super.isEnumWithHyphens();
-        }
-
-        public boolean isIDMap() {
-            // TODO Auto-generated method stub
-            return super.isIDMap();
-        }
-
-        public boolean isLinkMap() {
-            // TODO Auto-generated method stub
-            return super.isLinkMap();
-        }
-
-        public boolean isManagedByParent() {
-            // TODO Auto-generated method stub
-            return super.isManagedByParent();
-        }
-
-        public boolean isMapFor(Object feature, Object oldValue, Object newValue) {
-            // TODO Auto-generated method stub
-            return super.isMapFor(feature, 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 c42499c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ELResolverTypeTranslator.java
+++ /dev/null
@@ -1,33 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-public class ELResolverTypeTranslator extends Translator {
-    public ELResolverTypeTranslator(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 Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getPropertyResolverType_TextContent()),
-            new Translator("id", facesPackage.getPropertyResolverType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-        };
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ExtensionTypeTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ExtensionTypeTranslator.java
deleted file mode 100644
index 9e1f0b5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ExtensionTypeTranslator.java
+++ /dev/null
@@ -1,32 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-public abstract class ExtensionTypeTranslator extends Translator 
-{
-    public ExtensionTypeTranslator(String domNameAndPath, EStructuralFeature aFeature) 
-    {
-        super(domNameAndPath, aFeature);
-    }
-    
-    public Translator[] getChildren() {
-        
-        FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-        return new Translator[] {
-              new Translator("id", facesPackage.getExtensionType_Id(), DOM_ATTRIBUTE), //$NON-NLS-1$
-              new DynamicElementTranslator("*", facesPackage.getExtensionType_ChildNodes())
-        };
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesConfigExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesConfigExtensionTranslator.java
deleted file mode 100644
index 7b6419e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesConfigExtensionTranslator.java
+++ /dev/null
@@ -1,21 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-public class FacesConfigExtensionTranslator extends ExtensionTypeTranslator {
-
-    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 d24bef9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesConfigTranslator.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 - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-import org.eclipse.wst.common.internal.emf.resource.RootTranslator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class FacesConfigTranslator extends RootTranslator {
-	
-	public static FacesConfigTranslator INSTANCE = new FacesConfigTranslator();
-
-    public FacesConfigTranslator() {
-		super("faces-config", FacesConfigPackage.eINSTANCE.getFacesConfigType()); //$NON-NLS-1$
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-				new ApplicationTranslator("application", facesPackage.getFacesConfigType_Application()), //$NON-NLS-1$
-				new FactoryTranslator("factory", facesPackage.getFacesConfigType_Factory()), //$NON-NLS-1$
-				new ComponentTranslator("component", facesPackage.getFacesConfigType_Component()), //$NON-NLS-1$
-				new ConverterTranslator("converter", facesPackage.getFacesConfigType_Converter()), //$NON-NLS-1$
-				new ManagedBeanTranslator("managed-bean", facesPackage.getFacesConfigType_ManagedBean()), //$NON-NLS-1$
-				new NavigationRuleTranslator("navigation-rule", facesPackage.getFacesConfigType_NavigationRule()), //$NON-NLS-1$
-				new ReferencedBeanTranslator("referenced-bean", facesPackage.getFacesConfigType_ReferencedBean()), //$NON-NLS-1$
-				new RenderKitTranslator("render-kit", facesPackage.getFacesConfigType_RenderKit()), //$NON-NLS-1$
-				new LifecycleTranslator("lifecycle", facesPackage.getFacesConfigType_Lifecycle()), //$NON-NLS-1$
-				new ValidatorTranslator("validator", facesPackage.getFacesConfigType_Validator()), //$NON-NLS-1$
-                new FacesConfigExtensionTranslator("faces-config-extension", facesPackage.getFacesConfigType_FacesConfigExtension()), //$NON_NLS-1$
-				new Translator("xmlns", facesPackage.getFacesConfigType_Xmlns(), DOM_ATTRIBUTE), //$NON-NLS-1$
-				new Translator("id", facesPackage.getFacesConfigType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesContextFactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesContextFactoryTranslator.java
deleted file mode 100644
index 32ba41e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesContextFactoryTranslator.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 FacesContextFactoryTranslator extends Translator {
-
-	public FacesContextFactoryTranslator(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 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 5199804..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetExtensionTranslator.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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 {
-	public FacetExtensionTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature); //$NON-NLS-1$
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetNameTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetNameTranslator.java
deleted file mode 100644
index 27b2aa1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetNameTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class FacetNameTranslator extends Translator {
-
-	public FacetNameTranslator(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 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 b1dd5f3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetTranslator.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 xnjiang, itrimble
- *
- */
-public class FacetTranslator extends Translator {
-
-	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 4b8ab83..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FactoryExtensionTranslator.java
+++ /dev/null
@@ -1,21 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-public class FactoryExtensionTranslator extends ExtensionTypeTranslator {
-
-    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 0dca7e6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FactoryTranslator.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 Eric Bordeau, itrimble
- */
-public class FactoryTranslator extends Translator {
-
-	public FactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new ApplicationFactoryTranslator("application-factory", facesPackage.getFactoryType_ApplicationFactory()), //$NON-NLS-1$
-			new FacesContextFactoryTranslator("faces-context-factory", facesPackage.getFactoryType_FacesContextFactory()), //$NON-NLS-1$
-			new LifecycleFactoryTranslator("lifecycle-factory", facesPackage.getFactoryType_LifecycleFactory()), //$NON-NLS-1$
-			new RenderKitFactoryTranslator("render-kit-factory", facesPackage.getFactoryType_RenderKitFactory()), //$NON-NLS-1$
-            new FactoryExtensionTranslator("factory-extension", facesPackage.getFactoryType_FactoryExtension()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromActionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromActionTranslator.java
deleted file mode 100644
index 0e8296e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromActionTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class FromActionTranslator extends Translator {
-
-	public FromActionTranslator(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 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 3a8799b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromOutcomeTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class FromOutcomeTranslator extends Translator {
-
-	public FromOutcomeTranslator(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 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 75ba470..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromViewIdTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class FromViewIdTranslator extends Translator {
-
-	public FromViewIdTranslator(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 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 5591d3a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/IAnyTranslator.java
+++ /dev/null
@@ -1,45 +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
- *******************************************************************************/
-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
-     * 
-     * @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 62b468a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/IconTranslator.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 - 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 {
-
-	public IconTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new SmallIconTranslator("small-icon", facesPackage.getIconType_SmallIcon()), //$NON-NLS-1$
-			new LargeIconTranslator("large-icon", facesPackage.getIconType_LargeIcon()), //$NON-NLS-1$
-			new Translator("xml:lang", facesPackage.getIconType_Lang(), DOM_ATTRIBUTE), //$NON-NLS-1$
-			new Translator("id", facesPackage.getIconType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/KeyClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/KeyClassTranslator.java
deleted file mode 100644
index 6a17832..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/KeyClassTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class KeyClassTranslator extends Translator {
-
-	public KeyClassTranslator(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 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 ed79167..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/KeyTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class KeyTranslator extends Translator {
-
-	public KeyTranslator(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 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 97245bb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LargeIconTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class LargeIconTranslator extends Translator {
-
-	public LargeIconTranslator(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 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 306e3dd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleExtensionTranslator.java
+++ /dev/null
@@ -1,21 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-public class LifecycleExtensionTranslator extends ExtensionTypeTranslator {
-
-    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 5626273..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleFactoryTranslator.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
- *   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 {
-
-	public LifecycleFactoryTranslator(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 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 d35878a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleTranslator.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
- *   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 {
-
-	public LifecycleTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new PhaseListenerTranslator("phase-listener", facesPackage.getLifecycleType_PhaseListener()), //$NON-NLS-1$
-            new LifecycleExtensionTranslator("lifecycle-extension",facesPackage.getLifecycleType_LifecycleExtension()),
-			new Translator("id", facesPackage.getLifecycleType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ListEntriesTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ListEntriesTranslator.java
deleted file mode 100644
index d978bb1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ListEntriesTranslator.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 - 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 {
-
-	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 f779f21..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LocaleConfigTranslator.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 - 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 {
-
-	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 19ab4db..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanClassTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class ManagedBeanClassTranslator extends Translator {
-
-	public ManagedBeanClassTranslator(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 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 d354614..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanExtensionTranslator.java
+++ /dev/null
@@ -1,21 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-public class ManagedBeanExtensionTranslator extends ExtensionTypeTranslator {
-
-    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 358a9bb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanNameTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class ManagedBeanNameTranslator extends Translator {
-
-	public ManagedBeanNameTranslator(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 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 0e23a0e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanScopeTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class ManagedBeanScopeTranslator extends Translator {
-
-	public ManagedBeanScopeTranslator(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 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 d729ae7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanTranslator.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 ManagedBeanTranslator extends Translator {
-
-	public ManagedBeanTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getManagedBeanType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getManagedBeanType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getManagedBeanType_Icon()), //$NON-NLS-1$
-			new ManagedBeanNameTranslator("managed-bean-name", facesPackage.getManagedBeanType_ManagedBeanName()), //$NON-NLS-1$
-			new ManagedBeanClassTranslator("managed-bean-class", facesPackage.getManagedBeanType_ManagedBeanClass()), //$NON-NLS-1$
-			new ManagedBeanScopeTranslator("managed-bean-scope", facesPackage.getManagedBeanType_ManagedBeanScope()), //$NON-NLS-1$
-			new ManagedPropertyTranslator("managed-property", facesPackage.getManagedBeanType_ManagedProperty()), //$NON-NLS-1$
-			new MapEntriesTranslator("map-entries", facesPackage.getManagedBeanType_MapEntries()), //$NON-NLS-1$
-			new ListEntriesTranslator("list-entries", facesPackage.getManagedBeanType_ListEntries()), //$NON-NLS-1$
-            new ManagedBeanExtensionTranslator("managed-bean-extension", facesPackage.getManagedBeanType_ManagedBeanExtension()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getManagedBeanType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedPropertyTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedPropertyTranslator.java
deleted file mode 100644
index 16728e0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedPropertyTranslator.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 ManagedPropertyTranslator extends Translator {
-
-	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 869388d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MapEntriesTranslator.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 - 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 {
-
-	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 20cf05e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MapEntryTranslator.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 - 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 {
-
-	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 3d128ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MessageBundleTranslator.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
- *   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 {
-
-	public MessageBundleTranslator(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 Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getMessageBundleType_TextContent()),
-			new Translator("id", facesPackage.getMessageBundleType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationCaseTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationCaseTranslator.java
deleted file mode 100644
index e3fb19d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationCaseTranslator.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 NavigationCaseTranslator extends Translator {
-
-	public NavigationCaseTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getNavigationCaseType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getNavigationCaseType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getNavigationCaseType_Icon()), //$NON-NLS-1$
-			new FromActionTranslator("from-action", facesPackage.getNavigationCaseType_FromAction()), //$NON-NLS-1$
-			new FromOutcomeTranslator("from-outcome", facesPackage.getNavigationCaseType_FromOutcome()), //$NON-NLS-1$
-			new ToViewIdTranslator("to-view-id", facesPackage.getNavigationCaseType_ToViewId()), //$NON-NLS-1$
-			new RedirectTranslator("redirect", facesPackage.getNavigationCaseType_Redirect()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getNavigationCaseType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationHandlerTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationHandlerTranslator.java
deleted file mode 100644
index 9c563dc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationHandlerTranslator.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
- *   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 {
-
-	public NavigationHandlerTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);//$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new 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 660aa4c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationRuleExtensionTranslator.java
+++ /dev/null
@@ -1,22 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-public class NavigationRuleExtensionTranslator extends ExtensionTypeTranslator {
-
-    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 1b817be..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationRuleTranslator.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class NavigationRuleTranslator extends Translator {
-
-	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 1003681..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NullValueTranslator.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.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 {
-
-	public NullValueTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, EMPTY_TAG|END_TAG_NO_INDENT);
-	}
-
-	public boolean isSetMOFValue(EObject emfObject) {
-		return feature != null && emfObject.eIsSet(feature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator("id", facesPackage.getNullValueType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PhaseListenerTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PhaseListenerTranslator.java
deleted file mode 100644
index 716c174..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PhaseListenerTranslator.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
- *   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 {
-
-	public PhaseListenerTranslator(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 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 fde7f64..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyClassTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class PropertyClassTranslator extends Translator {
-
-	public PropertyClassTranslator(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 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 b063d8a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyExtensionTranslator.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which 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 {
-
-	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 36dc64e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyNameTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class PropertyNameTranslator extends Translator {
-
-	public PropertyNameTranslator(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 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 bfe0a93..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyResolverTranslator.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
- *   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 {
-
-	public PropertyResolverTranslator(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 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 fd113b1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyTranslator.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 PropertyTranslator extends Translator {
-
-	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 449bf10..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RedirectTranslator.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class RedirectTranslator extends Translator {
-
-	public RedirectTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, EMPTY_TAG|END_TAG_NO_INDENT);
-	}
-
-	public boolean isSetMOFValue(EObject emfObject) {
-		return feature != null && emfObject.eIsSet(feature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator("id", facesPackage.getRedirectType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanClassTranslator.java
deleted file mode 100644
index e0da5c4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanClassTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class ReferencedBeanClassTranslator extends Translator {
-
-	public ReferencedBeanClassTranslator(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 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 9c0d738..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanNameTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class ReferencedBeanNameTranslator extends Translator {
-
-	public ReferencedBeanNameTranslator(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 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 6f3c165..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanTranslator.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 ReferencedBeanTranslator extends Translator {
-
-	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 a22f5d8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitClassTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class RenderKitClassTranslator extends Translator {
-
-	public RenderKitClassTranslator(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 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 3d86bf4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitExtensionTranslator.java
+++ /dev/null
@@ -1,22 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-public class RenderKitExtensionTranslator extends ExtensionTypeTranslator {
-
-    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 0e74343..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitFactoryTranslator.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
- *   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 {
-
-	public RenderKitFactoryTranslator(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 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 c9185a7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitIdTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class RenderKitIdTranslator extends Translator {
-
-	public RenderKitIdTranslator(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 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 09969cd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitTranslator.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 RenderKitTranslator extends Translator {
-
-	public RenderKitTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-				new DescriptionTranslator("description", facesPackage.getRenderKitType_Description()), //$NON-NLS-1$
-				new DisplayNameTranslator("display-name", facesPackage.getRenderKitType_DisplayName()), //$NON-NLS-1$
-				new IconTranslator("icon", facesPackage.getRenderKitType_Icon()), //$NON-NLS-1$
-				new RenderKitIdTranslator("render-kit-id", facesPackage.getRenderKitType_RenderKitId()), //$NON-NLS-1$
-				new RenderKitClassTranslator("render-kit-class", facesPackage.getRenderKitType_RenderKitClass()), //$NON-NLS-1$
-				new RendererTranslator("renderer", facesPackage.getRenderKitType_Renderer()), //$NON-NLS-1$
-                new RenderKitExtensionTranslator("render-kit-extension", facesPackage.getRenderKitType_RenderKitExtension()), //$NON-NLS-1$
-				new Translator("id", facesPackage.getRenderKitType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererClassTranslator.java
deleted file mode 100644
index 5d947e6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererClassTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class RendererClassTranslator extends Translator {
-
-	public RendererClassTranslator(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 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 420d33b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererExtensionTranslator.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which 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 {
-
-	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 26e2f5c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererTranslator.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 RendererTranslator extends Translator {
-
-	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 9c7cfd8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererTypeTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class RendererTypeTranslator extends Translator {
-
-	public RendererTypeTranslator(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 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 7dba0c0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ResourceBundleTranslator.java
+++ /dev/null
@@ -1,37 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-public class ResourceBundleTranslator extends Translator {
-
-    public ResourceBundleTranslator(String domNameAndPath,
-            EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-
-    protected Translator[] getChildren() {
-        
-        FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-        return new Translator[] {
-            new DescriptionTranslator("description", facesPackage.getResourceBundleType_Description()), //$NON-NLS-1$
-            new DisplayNameTranslator("display-name", facesPackage.getResourceBundleType_DisplayName()), //$NON-NLS-1$
-            new IconTranslator("icon", facesPackage.getResourceBundleType_Icon()), //$NON-NLS-1$
-            new BaseNameTranslator("base-name", facesPackage.getResourceBundleType_BaseName()), //$NON-NLS-1$
-            new VarTranslator("var", facesPackage.getResourceBundleType_Var()), //$NON-NLS-1$
-            new Translator("id", facesPackage.getResourceBundleType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-        };
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SkipUnknownChildrenTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SkipUnknownChildrenTranslator.java
deleted file mode 100644
index 79c4b6e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SkipUnknownChildrenTranslator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * SkipUnknownChildrenTranslator has been implemented to temporarily allow
- * processing of application configuration resource files containing extension
- * elements (those defined with a content type of "ANY"); it essentially skips
- * all processing of child elements for which no child Translator has been
- * defined. This is not intended as a long-term solution.
- * 
- * @author Ian Trimble - Oracle
- */
-public class SkipUnknownChildrenTranslator extends Translator {
-
-	/**
-	 * Creates an instance.
-	 * 
-	 * @param domNameAndPath DOM name and path for which this Translator is
-	 * to be used.
-	 * @param aFeature EStructuralFeature instance for which this Translator is
-	 * to be used (may be null).
-	 */
-	public SkipUnknownChildrenTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#findChild(java.lang.String, java.lang.Object, int)
-	 */
-	public Translator findChild(String tagName, Object target, int versionID) {
-		Translator childTranslator = super.findChild(tagName, target, versionID);
-		if (childTranslator == null) {
-			childTranslator = new SkipUnknownChildrenTranslator(tagName, (EStructuralFeature)null);
-		}
-		return childTranslator;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SmallIconTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SmallIconTranslator.java
deleted file mode 100644
index e4cba86..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SmallIconTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class SmallIconTranslator extends Translator {
-
-	public SmallIconTranslator(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 Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getSmallIconType_TextContent()),
-			new Translator("id", facesPackage.getSmallIconType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/StateManagerTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/StateManagerTranslator.java
deleted file mode 100644
index ddcc3b4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/StateManagerTranslator.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
- *   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 {
-
-	public StateManagerTranslator(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 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 3cfdbe7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SuggestedValueTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class SuggestedValueTranslator extends Translator {
-
-	public SuggestedValueTranslator(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 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 3cb59aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SupportedLocaleTranslator.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
- *   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 {
-
-	public SupportedLocaleTranslator(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 Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getSupportedLocaleType_TextContent()),
-			new Translator("id", facesPackage.getSupportedLocaleType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ToViewIdTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ToViewIdTranslator.java
deleted file mode 100644
index 38180f7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ToViewIdTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class ToViewIdTranslator extends Translator {
-
-	public ToViewIdTranslator(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 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 ff0d4db..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorClassTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class ValidatorClassTranslator extends Translator {
-
-	public ValidatorClassTranslator(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 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 95933a0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorExtensionTranslator.java
+++ /dev/null
@@ -1,21 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-public class ValidatorExtensionTranslator extends ExtensionTypeTranslator 
-{
-    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 88df447..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorIdTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class ValidatorIdTranslator extends Translator {
-
-	public ValidatorIdTranslator(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 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 50907aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorTranslator.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 ValidatorTranslator extends Translator {
-	
-	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 a0e1cae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValueClassTranslator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class ValueClassTranslator extends Translator {
-
-	public ValueClassTranslator(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 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 af6a6d2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValueTranslator.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
- *   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 {
-
-	public ValueTranslator(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 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 307e600..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/VarTranslator.java
+++ /dev/null
@@ -1,31 +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
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-public class VarTranslator extends Translator {
-    public VarTranslator(String domNameAndPath, EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-
-    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 107a8c4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/VariableResolverTranslator.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
- *   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 {
-
-	public VariableResolverTranslator(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 Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getVariableResolverType_TextContent()),
-			new Translator("id", facesPackage.getVariableResolverType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ViewHandlerTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ViewHandlerTranslator.java
deleted file mode 100644
index db6c61f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ViewHandlerTranslator.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
- *   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 {
-
-	public ViewHandlerTranslator(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 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/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 2d0a9f3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigArtifactEdit.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.wst.common.componentcore.ArtifactEdit;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-import org.eclipse.wst.xml.core.internal.emf2xml.EMF2DOMSSERenderer;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-
-
-/**
- * The artifact edit for the JSF Application Configuration (faces-config) model
- * 
- * May be used but not extended by clients.
- */
-public final class FacesConfigArtifactEdit extends ArtifactEdit {
-	private String sFileName = null;
-	private FacesConfigType facesConfig = null;
-	private URI facesConfigURI = URI.createURI(IFacesConfigConstants.FACES_CONFIG_URI);
-	private boolean bRegistered = false;
-
-	/**
-	 * @param aProject
-	 * @param toAccessAsReadOnly
-	 * @throws IllegalArgumentException
-	 */
-	public FacesConfigArtifactEdit(IProject aProject, boolean toAccessAsReadOnly) throws IllegalArgumentException {
-		super(aProject, toAccessAsReadOnly);
-	}
-
-	/**
-	 * @param aProject
-	 * @param sConfigFile
-	 * @return the faces config artifact for the file config file sConfig in project aProject.
-	 * Opened only for read access (no write)
-	 */
-	public static FacesConfigArtifactEdit getFacesConfigArtifactEditForRead(IProject aProject, String sConfigFile) {
-		FacesConfigArtifactEdit artifactEdit = null;
-		try {
-			artifactEdit = new FacesConfigArtifactEdit(aProject, true);
-			if (artifactEdit != null) {
-				artifactEdit.setFilename(sConfigFile);
-			}
-		} catch (IllegalArgumentException iae) {
-            // suppress illegal argument exception
-            FacesConfigPlugin.write(iae);
-		}
-		return artifactEdit;
-	}
-	/**
-	 * @param aProject
-	 * @return the default artifact edit
-     * @deprecated Use getFacesConfigArtifactEditForRead(IProject, String) instead. This
-     * method is dangerous because the caller is assuming that the "default"
-     * model exists and knows nothing about where it is coming from.
-	 */
-	public static FacesConfigArtifactEdit getFacesConfigArtifactEditForRead(IProject aProject) {
-		return getFacesConfigArtifactEditForRead(aProject, null);
-	}
-
-    /**
-     * @param aProject
-     * @param sConfigFile
-     * @return the faces config artifact for the file config file sConfig in project aProject.
-     * Opened for both write and read access
-     */	
-	public static FacesConfigArtifactEdit getFacesConfigArtifactEditForWrite(IProject aProject, String sConfigFile) {
-		FacesConfigArtifactEdit artifactEdit = null;
-		try {
-			artifactEdit = new FacesConfigArtifactEdit(aProject, false);
-			if (artifactEdit != null) {
-				artifactEdit.setFilename(sConfigFile);
-			}
-		} catch (IllegalArgumentException iae) {
-            // suppress illegal argument exception
-            FacesConfigPlugin.write(iae);
-		}
-		return artifactEdit;
-	}
-
-	/**
-	 * @param aProject
-	 * @return the default artifact edit for read
-     * @deprecated Use getFacesConfigArtifactEditForWrite(IProject, String) 
-     * instead. This method is dangerous because the caller is assuming that
-     * the "default" model exists and knows nothing about where it is coming
-     * from.
-	 */
-	public static FacesConfigArtifactEdit getFacesConfigArtifactEditForWrite(IProject aProject) {
-		return getFacesConfigArtifactEditForWrite(aProject, null);
-	}
-
-	/**
-	 * @return the root model object for this artifact edit model
-	 */
-	public FacesConfigType getFacesConfig() {
-		if (facesConfig == null) {
-			// TODO: XN - does not seem a good way to check whether the resource has been registered each time.
-			// The following comment is from StrutsArchfactEdit:
-			// This is a hack to ensure that our Resource.Factory is used to
-			// create
-			// the Resource. It's the same hack used by JaxRPCMapArtifactEdit.
-			// The problem is that there is no way to register a Resource.Factory
-			// by, say, content type.
-			// The best we can do is register by last file segment, which isn't
-			// strictly correct.
-			// Plus, there's no way to deregister.
-			if (sFileName != null) {
-				if (!bRegistered) {
-				//if (FacesConfigResourceFactory.getRegisteredFactory(URI.createURI(sFileName)) == null) {
-					FacesConfigResourceFactory.register(sFileName);
-					bRegistered = true;
-				}
-			}
-			facesConfig = (FacesConfigType)getDeploymentDescriptorRoot(); 
-		}
-		return facesConfig;
-	}
-	
-	/**
-	 * @return the uri pointing to the source of this faces config artifact
-	 */
-	public URI getFacesConfigURI() {
-		return facesConfigURI;
-	}
-
-	/**
-	 * @return the model root
-	 */
-	public EObject getDeploymentDescriptorRoot() {
-		List contents = getDeploymentDescriptorResource().getContents();
-		if (contents.size() > 0)
-			return (EObject) contents.get(0);
-		return null;
-		// TODO: XN 
-		//addFacesConfigIfNecessary((IFacesConfigResource)getDeploymentDescriptorResource());
-		//return (EObject) contents.get(0);
-	}
-
-	/**
-	 * @return the EMF resource retrieved for this artifact's uri
-	 */
-	public Resource getDeploymentDescriptorResource() {
-		if (sFileName != null) {
-			facesConfigURI = URI.createURI(sFileName);
-		} else {// default is "WEB-INF/faces-config.xml"
-			facesConfigURI = URI.createURI(IFacesConfigConstants.FACES_CONFIG_URI);
-		}
-		return getArtifactEditModel().getResource(facesConfigURI);
-	}
-
-	/**
-	 * Sets an instance's filename, used to create a URI and load a model.
-	 * 
-	 * @param filename This instance's filename.
-	 */
-	public void setFilename(String filename) {
-		sFileName = filename;
-	}
-
-	// TODO: appears to be dead
-//	protected void addFacesConfigIfNecessary(TranslatorResource aResource) {
-//		//TO: XN - See how to create one if the config file does not exist
-//		/*if (aResource != null) {
-//		    if(aResource.getContents() == null || aResource.getContents().isEmpty()) {
-//		        FacesConfigType facesConfigNew = WebapplicationFactory.eINSTANCE.createWebApp();
-//				aResource.getContents().add(facesConfigNew);
-//				aResource.setModified(true);
-//		    } 
-//		    FacesConfigType facesConfig = (FacesConfigType)aResource.getContents().get(0);
-//			URI moduleURI = getArtifactEditModel().getModuleURI();
-//			try {
-//				facesConfig.setDisplayName(StructureEdit.getDeployedName(moduleURI));
-//			} catch (UnresolveableURIException e) {
-//				//Ignore
-//			}
-//			aResource.setID(facesConfig, J2EEConstants.WEBAPP_ID);
-//	
-//			try{
-//				aResource.saveIfNecessary();
-//			}catch(Exception e){
-//				e.printStackTrace();
-//			}
-//		}*/
-//	}
-
-	/**
-	 * @return the DOM model for the Struts config. file.
-	 */
-	public IDOMModel getIDOMModel() {
-		// Modeled after SourceNestedEditorPage.getXMLModelFromResource().
-		// TODO - XN This is a little hackish because it depends on the resource's
-		// renderer being an EMF2DOMSedRenderer (which it is, but that could
-		// change).
-		IFacesConfigResource resource = (IFacesConfigResource)getDeploymentDescriptorResource();
-		if (resource != null) {
-			EMF2DOMSSERenderer renderer = (EMF2DOMSSERenderer) resource.getRenderer();
-			return renderer.getXMLModel();
-		}
-		return null;
-	}
-
-	/**
-	 * @return the IFile used to load the model or null if none.
-	 */
-	public IFile getFile() {
-		IVirtualResource resource = getComponent().getRootFolder().findMember(facesConfigURI.toString());
-		if ((resource != null) && (resource.getType() == IVirtualResource.FILE))
-			return ((IVirtualFile) resource).getUnderlyingFile();
-		return null;
-	}
-    
-    /**
-     * @return true if the underlying model has been disposed
-     */
-    public boolean isDisposed()
-    {
-        return getArtifactEditModel().isDisposed();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigChangeEvent.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigChangeEvent.java
deleted file mode 100644
index ecbc42e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigChangeEvent.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-/**
- * This class should NOT be referenced or extended by clients.
- * 
- * @author xnjiang
- *
- */
-final class FacesConfigChangeEvent implements IFacesConfigChangeEvent {
-
-	private boolean bManagedBeandChanged = true;
-	private boolean bNavigationRuleChanged = true;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.facesconfig.IFacesConfigChangeEvent#isManagedBeanChanged()
-	 */
-	public boolean isManagedBeanChanged() {
-		return bManagedBeandChanged;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.facesconfig.IFacesConfigChangeEvent#isNavigationRuleChanged()
-	 */
-	public boolean isNavigationRuleChanged() {
-		return bNavigationRuleChanged;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigResourceFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigResourceFactory.java
deleted file mode 100644
index a3b39a7..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 by should NOT be extended by clients
- * 
- * @author xjiang
- *
- */
-public final class FacesConfigResourceFactory extends TranslatorResourceFactory 
-{
-    /**
-     * @return a faces config resource factory for use with faces-config
-     * files contained in JARs
-     */
-    public static FacesConfigResourceFactory createResourceFactoryForJar()
-    {
-        return new FacesConfigResourceFactory(EMF2DOMRendererFactory.INSTANCE);
-    }
-    
-	/**
-	 * Construct a faces resource factory.
-	 * 
-	 * @param rendererFactory 
-	 */
-	protected FacesConfigResourceFactory(RendererFactory rendererFactory) {
-		super(rendererFactory);
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.TranslatorResourceFactory#createResource(org.eclipse.emf.common.util.URI)
-	 */
-	protected TranslatorResource createResource(URI uri, Renderer aRenderer) {
-		return new FacesConfigResourceImpl(uri, aRenderer);
-	}
-	
-	/**
-	 * Method registerDtds.
-	 */
-	public static void registerDtds() {
-	    // TODO: should we be registering dtd/xsd here?
-	    // how does MyEntityResolver in the resource affect this (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=154439)
-	}
-
-	/**
-	 * register using the default renderer factory.
-	 * @see #registerWith(String, FacesRendererFactory)
-	 */
-	public static void register() {
-		register((String)null);
-	}
-
-	/**
-	 * Register the sFileName with the default renderer factory
-	 * @param sFileName
-	 */
-	public static void register(String sFileName) {
-		registerWith(sFileName, FacesRendererFactory.INSTANCE);
-	}
-
-	/**
-	 * Register myself with the Resource.Factory.Registry
-	 * @param sFileName 
-	 * @param aRendererFactory 
-	 */
-	private static void registerWith(String sFileName, FacesRendererFactory aRendererFactory) {
-		if (sFileName != null) {
-			WTPResourceFactoryRegistry.INSTANCE.registerLastFileSegment(sFileName, new FacesConfigResourceFactory(FacesRendererFactory.INSTANCE)); //$NON-NLS-1$
-		} else {
-			WTPResourceFactoryRegistry.INSTANCE.registerLastFileSegment("faces-config.xml", new FacesConfigResourceFactory(FacesRendererFactory.INSTANCE)); //$NON-NLS-1$
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigResourceImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigResourceImpl.java
deleted file mode 100644
index cb331b4..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.
- * 
- * This class is 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
-	 */
-	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 physicalLocation = uriResolver.resolvePhysicalLocation(baseLocation, publicId, systemId);
-			return new InputSource(physicalLocation);
-		}
-
-	}
-	
-	private EntityResolver entityResolver = null;
-	
-	/**
-	 * @param aRenderer
-	 */
-	public FacesConfigResourceImpl(Renderer aRenderer) {
-		super(aRenderer);
-	}
-	/**
-	 * @param uri
-	 * @param aRenderer
-	 */
-	public FacesConfigResourceImpl(URI uri, Renderer aRenderer) {
-		super(uri, aRenderer);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.TranslatorResource#getDoctype()
-	 */
-	public String getDoctype() {
-		return null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.TranslatorResource#getRootTranslator()
-	 */
-	public Translator getRootTranslator() {
-		return FacesConfigTranslator.INSTANCE; 
-
-	}
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.emf.facesconfig.xml.FacesConfigResource#getFacesConfig()
-     */
-    public FacesConfigType getFacesConfig() {
-		return (FacesConfigType) getRootObject();
-    }
-    
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.TranslatorResourceImpl#getDefaultPublicId()
-	 */
-	protected String getDefaultPublicId() {
-		return "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"; //$NON-NLS-1$
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.TranslatorResourceImpl#getDefaultSystemId()
-	 */
-	protected String getDefaultSystemId() {
-		return "http://java.sun.com/dtd/web-facesconfig_1_0.dtd"; //$NON-NLS-1$
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.TranslatorResourceImpl#getDefaultVersionID()
-	 */
-	protected int getDefaultVersionID() {
-		return 0;
-	}
-	public EntityResolver getEntityResolver() {
-		if (entityResolver == null) {
-			String baseLocation = getURI().toString();
-			entityResolver = new MyEntityResolver(baseLocation);
-		}
-		return entityResolver;
-	}
-	public void setURI(URI arg0) {
-		super.setURI(arg0);
-		entityResolver = null;
-	}
-} //FacesConfigResourceFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigRestartServerResourceDeltaVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigRestartServerResourceDeltaVisitor.java
deleted file mode 100644
index 73d46bb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigRestartServerResourceDeltaVisitor.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-
-/**
- * This class is NOT intended for external use.
- * 
- * @version $Id$
- */
-final class FacesConfigRestartServerResourceDeltaVisitor implements IResourceDeltaVisitor {
-
-	/** Set of IProjects. */
-	private Set components = new HashSet();
-
-	/**
-	 * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
-	 */
-	public boolean visit(IResourceDelta delta) throws CoreException {
-
-		if (shouldCheckForRestartProject()) {
-			int kind = delta.getKind();
-			if ((kind == IResourceDelta.ADDED)
-					|| (kind == IResourceDelta.REMOVED)
-					|| ((kind == IResourceDelta.CHANGED) && ((delta.getFlags() & (IResourceDelta.CONTENT
-							| IResourceDelta.TYPE | IResourceDelta.SYNC | IResourceDelta.REPLACED)) != 0))) {
-				primCheckForRestartComponent(delta.getResource());
-			}
-		}
-
-		// Done.
-		return true;
-	}
-
-	private boolean shouldCheckForRestartProject() {
-		//TODO: XN: we don't have preference page for this?
-		//return FacesconfigPlugin.getPlugin().getFacesPreferences().getRestart();
-		return true;
-	}
-
-	private void primCheckForRestartComponent(IResource resource) {
-		if (resource.getType() == IResource.FILE) {
-			IFile file = (IFile) resource;
-			if (FacesConfigUtil.isFacesConfigFile(file)) {
-				IVirtualComponent component = ComponentUtilities.findComponent(file);
-				if (component != null) {
-					components.add(component);
-				}
-			}
-				
-		}
-	}
-
-	/**
-	 * @return the components
-	 */
-	public Collection getComponents() {
-		return components;
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigUtil.java
deleted file mode 100644
index e2422d3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigUtil.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.IContentType;
-
-/**
- * Utility class for faces-config model management
- * 
- * This class is NOT intended for external use.
- * 
- */
-final class FacesConfigUtil {
-
-	/** Must match the id specified in plugin.xml. */
-	public static final String FACES_CONFIG_CONTENT_TYPE_ID = "org.eclipse.jst.jsf.facesconfig.facesConfigFile";
-
-	/**
-	 * Returns true iff the specified file seems to be a Faces configuration
-	 * file. Always returns false if the file is in a non-Faces project.
-	 * 
-	 * @param file
-	 *            the IFile to check
-	 * @return true iff the specified file seems to be a Faces configuration
-	 *         file.
-	 */
-	public static boolean isFacesConfigFile(IFile file) {
-		return isFacesConfigFile(file, true);
-	}
-
-	/**
-	 * Returns true iff the specified file seems to be a Faces configuration
-	 * file. If ignoreNonFacesProject is true, always returns false if the file
-	 * is in a non-Faces project.
-	 * 
-	 * @param file
-	 *            the IFile to check
-	 * @param ignoreNonFacesProject
-	 * @return true iff the specified file seems to be a Faces configuration
-	 *         file.
-	 */
-	public static boolean isFacesConfigFile(IFile file, boolean ignoreNonFacesProject) {
-		
-		// Bail if it's not a .xml file.
-		if (!"xml".equalsIgnoreCase(file.getFileExtension()))
-			return false;
-
-		// Bail if we can't determine the project. This shouldn't be possible
-		// here, but...
-		IProject project = file.getProject();
-		if (project == null)
-			return false;
-
-		// If requested, bail if the project isn't a Faces project.
-		// TODO: XN - temporarily disabled the following two lines to get rid 
-		// of the dependency on jsf.util
-		//if (ignoreNonFacesProject && !JsfProjectUtil.isJsfProject(project))
-			//return false;
-
-		try {
-			IContentDescription contentDescription = file.getContentDescription();
-			if (contentDescription != null) {
-				IContentType contentType = contentDescription.getContentType();
-				if (contentType != null)
-					return FACES_CONFIG_CONTENT_TYPE_ID.equals(contentType.getId());
-			}
-		} catch (CoreException ignored) {
-			// Empty block intended.
-		}
-
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesRendererFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesRendererFactory.java
deleted file mode 100644
index b2d9e4a..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, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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 enternally.
- * 
- * The custom render factory for the Faces Config model EMF2DOM translations.
- * A singleton factory.
- */
-final class FacesRendererFactory extends EMF2DOMSSERendererFactory 
-{
-    /**
-     * The singleton factory instance.
-     */
-    @SuppressWarnings("hiding")
-    public static  FacesRendererFactory INSTANCE = new FacesRendererFactory();
-    
-    private FacesRendererFactory() {
-        super();
-    }
-
-    /**
-     * @see org.eclipse.wst.common.internal.emf.resource.RendererFactory#createRenderer()
-     */
-    public Renderer createRenderer() {
-        return new MyRenderer();
-    }
-
-    private static class MyRenderer extends EMF2DOMSSERenderer
-    {
-
-        protected EMF2DOMAdapter createRootDOMAdapter() 
-        {
-            return new MyEMF2DOMAdapterRoot(getResource(), document, this, getResource().getRootTranslator());
-        }
-    }
-    
-    /**
-     * Customized adapter that lets us inject arbitrary DOM children
-     * into for ANY elements
-     */
-    private static class MyEMF2DOMAdapterRoot extends EMF2DOMSSEAdapter
-    {
-
-        /**
-         * @param object
-         * @param node
-         * @param renderer
-         * @param translator
-         */
-        public MyEMF2DOMAdapterRoot(org.eclipse.emf.common.notify.Notifier object, Node node,
-                EMF2DOMRenderer renderer, Translator translator) {
-            super(object, node, renderer, translator);
-        }
-
-        /**
-         * @param node
-         * @param renderer
-         * @param translator
-         */
-        public MyEMF2DOMAdapterRoot(Node node, EMF2DOMRenderer renderer,
-                Translator translator) {
-            super(node, renderer, translator);
-        }
-
-        /**
-         * @param resource
-         * @param document
-         * @param renderer
-         * @param translator
-         */
-        public MyEMF2DOMAdapterRoot(TranslatorResource resource, Document document,
-                EMF2DOMRenderer renderer, Translator translator) {
-            super(resource, document, renderer, translator);
-        }
-
-        protected void initChildTranslators() {
-            // if this is an ANY translator, then we have prepend the list after
-            // initialization with any dynamic attribute translators
-            super.initChildTranslators();
-            
-            if (fTranslator instanceof IAnyTranslator)
-            {
-                final Translator[] dynamicAttrs =
-                    ((IAnyTranslator)fTranslator)
-                         .getDynamicAttributeTranslators(fNode);
-                
-                // avoid an array copy if not necessary
-                if (dynamicAttrs.length > 0)
-                {
-                    final Translator[] allTranslators =
-                        new Translator[childTranslators.length+dynamicAttrs.length];
-                    // prepend the dynamic attributes so they are queried first
-                    System.arraycopy(dynamicAttrs, 0, allTranslators, 0, dynamicAttrs.length);
-                    System.arraycopy(childTranslators, 0, allTranslators, dynamicAttrs.length, childTranslators.length);
-                    childTranslators = allTranslators;
-                }
-            }
-        }
-
-        protected Translator[] getChildTranslators() 
-        {
-            Translator[] translators = super.getChildTranslators();
-            // TODO: I'm thinking there must be a more efficient way to do this
-            if (fTranslator instanceof  IAnyTranslator)
-            {
-               EObject eObj = getEObject();
-               
-               if (eObj instanceof DynamicElement)
-               {
-                   List newArrayList = new ArrayList();
-                   Translator[] dynamicTranslators = 
-                       ((IAnyTranslator)fTranslator).getDynamicAttributeTranslators((DynamicElement)eObj);
-                   
-                   // loop through the dynamic translators and add any to the list
-                   // that aren't already there
-                   for (int i = 0; i < dynamicTranslators.length; i++)
-                   {
-                       Translator translator = dynamicTranslators[i];
-                       
-                       for (int j = 0; j < translators.length; j++)
-                       {
-                           final Translator testTranslator = translators[j];
-                           
-                           if (testTranslator.isDOMAttribute()
-                               // TODO: not fond of passing null, but the arg is ignored anyway (for now)
-                               && testTranslator.getDOMName(null).equals(translator.getDOMName(null)))
-                           {
-                               // null indicates found
-                               translator = null;
-                               break;
-                           }
-                        }
-                       
-                        // if not found, add to list
-                        if (translator != null)
-                        {
-                            newArrayList.add(translator);
-                        }
-                    }
-                   
-                    if (newArrayList.size() > 0)
-                    {
-                        newArrayList.addAll(Arrays.asList(translators));
-                        translators = (Translator[]) newArrayList.toArray(translators);
-                    }
-                }
-            }
-            
-            return translators;
-        }
-
-        protected List getDOMChildren(Node node, Translator map) 
-        {
-            if (map instanceof IAnyTranslator)
-            {
-                List children = new ArrayList();
-                
-                for (int i = 0; i < node.getChildNodes().getLength(); i++)
-                {
-                    Node child = node.getChildNodes().item(i);
-                    if (child.getNodeType() == Node.ELEMENT_NODE)
-                    {
-                        children.add(child);
-                    }
-                }
-                return children;
-            }
-            return super.getDOMChildren(node, map);
-        }
-        /**
-         * Create an adapter for a child DOM node
-         * 
-         * @param mofObject
-         *            org.w3c.dom.Node The node to create the adapter for.
-         */
-        protected EMF2DOMAdapter primCreateAdapter(EObject mofObject, Translator childMap) {
-            // TODO: this may only be necessary when childMap is an IAnyTranslator...
-            Element newNode = createNewNode(mofObject, childMap);
-            return new MyEMF2DOMAdapterRoot(mofObject, newNode, fRenderer, childMap);
-        }
-
-        /**
-         * Create an adapter for a child DOM node
-         * 
-         * @param node
-         *            org.w3c.dom.Node The node to create the adapter for.
-         */
-        protected EMF2DOMAdapter primCreateAdapter(Node node, Translator childMap) {
-            return new MyEMF2DOMAdapterRoot(node, fRenderer, childMap);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesResourceChangeListener.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesResourceChangeListener.java
deleted file mode 100644
index 3ef5323..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesResourceChangeListener.java
+++ /dev/null
@@ -1,361 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-import java.util.LinkedList;
-import java.util.ListIterator;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.IResourceVisitor;
-import org.eclipse.core.resources.ISaveContext;
-import org.eclipse.core.resources.ISaveParticipant;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.internal.Logger;
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-
-/**
- * This class is responsible for the following:
- * <ol>
- * <li>Ensure that the Struts nature is added to any project to which a Struts
- * config. file is added.</li>
- * <li>Ensure that the Struts nature is added to any project to which a diagram
- * file is added.</li>
- * <li>Restart project(s) if/as apporopriate when a Struts config. file is
- * modified.
- * </ol>
- * It arguably should be multiple classes, but the things it does are closely
- * related and splitting it up would result in duplicate work as well as
- * multiple delta traversals.
- * 
- * This class is not intended for external use. 
- * Should NOT be referenced or extended externally.
- */
-final class FacesResourceChangeListener implements IResourceChangeListener,
-		IResourceDeltaVisitor, ISaveParticipant, IResourceVisitor {
-
-	/** The singleton instance. */
-	private static FacesResourceChangeListener listener;
-	private static boolean restartInProgress = false;
-	private LinkedList facesConfigChangeListeners = new LinkedList();
-	
-	private static IPreferenceStore preferenceStore = null;
-
-	private static final QualifiedName EDITOR_KEY = new QualifiedName(
-			"org.eclipse.ui.internal.registry.ResourceEditorRegistry", "EditorProperty");//$NON-NLS-2$//$NON-NLS-1$
-
-	/** Start up the singleton instance. */
-	public static void startup() {
-
-		// Bail if we're already started.
-		if (listener != null)
-			return;
-
-		// Create the singleton instance.
-		listener = new FacesResourceChangeListener();
-
-		// Register as resource change listener.
-		ResourcesPlugin.getWorkspace().addResourceChangeListener(
-				listener,
-				IResourceChangeEvent.PRE_BUILD + IResourceChangeEvent.POST_BUILD);
-	}
-
-	/** Shutdown the singleton instance. */
-	public static void shutdown() {
-
-		// Bail if we're not started.
-		if (listener == null)
-			return;
-
-		// Deregister as save participant.
-		ResourcesPlugin.getWorkspace().removeSaveParticipant(FacesConfigPlugin.getPlugin());
-
-		// Deregister as resource change listener.
-		ResourcesPlugin.getWorkspace().removeResourceChangeListener(listener);
-
-		// Dereference the singleton instance.
-		listener = null;
-	}
-
-	/**
-	 * Only this class can create instances.
-	 */
-	private FacesResourceChangeListener() {
-        // no local instantiation
-	}
-
-	/**
-	 * Process a resource change event. This should be invoked only from the
-	 * workbench.
-	 * 
-	 * @see IResourceChangeListener#resourceChanged(IResourceChangeEvent)
-	 */
-	public void resourceChanged(IResourceChangeEvent event) {
-
-		IResourceDelta delta = event.getDelta();
-		if (delta != null) {
-			FacesConfigChangeEvent facesConfigChangeEvent = new FacesConfigChangeEvent();
-			fireFacesConfigChangeEvent(facesConfigChangeEvent);
-
-			try {
-				delta.accept(this);
-			} catch (CoreException ignored) {
-				Logger.log(this, ignored);
-			}
-		}
-
-		// Restart projects, if necessary.
-		if ((delta != null) && (event.getType() == IResourceChangeEvent.POST_BUILD)) {
-			FacesConfigRestartServerResourceDeltaVisitor visitor = new FacesConfigRestartServerResourceDeltaVisitor();
-			try {
-				delta.accept(visitor);
-			} catch (CoreException ignored) {
-				Logger.log(this, ignored);
-			}
-			//restartComponents(visitor.getComponents());
-		}
-	}
-
-	/**
-	 * Visit a resource delta. This should be invoked only from the
-	 * IResourceDelta.accept() method invoked above.
-	 * 
-	 * @see IResourceDeltaVisitor#visit(IResourceDelta)
-	 */
-	public boolean visit(IResourceDelta delta) throws CoreException {
-
-		// Check for and handle it if it's a Struts config. file.
-		checkForFacesConfigFile(delta);
-
-		// Done.
-		return true;
-	}
-
-	private void checkForFacesConfigFile(IResourceDelta delta) {
-		boolean isAdded = delta.getKind() == IResourceDelta.ADDED;
-		if (isAdded
-				|| ((delta.getKind() == IResourceDelta.CHANGED) && ((delta.getFlags() & (IResourceDelta.CONTENT
-						| IResourceDelta.TYPE | IResourceDelta.SYNC | IResourceDelta.REPLACED)) != 0))) {
-			checkForFacesConfigFile(delta.getResource(), !isAdded);
-		}
-	}
-
-	private void checkForFacesConfigFile(IResource resource, boolean ignoreNonFacesProjects) {
-		if (resource.getType() == IResource.FILE) {
-
-			// See if the file is a Struts config. file.
-			// If the file was just added, we check the file regardless of
-			// whether or not it is in a Struts project.
-			// Otherwise, a file in a non-Struts project is considered to not be
-			// a Struts config. file.
-			IFile file = (IFile) resource;
-			if (FacesConfigUtil.isFacesConfigFile(file, ignoreNonFacesProjects)) {
-
-				// Ensure that the project has the Struts nature.
-				// TODO:
-				// StrutsNatureRuntime.ensureProjectHasStrutsNature(file.getProject());
-				IVirtualComponent component = ComponentUtilities.findComponent(file);
-				if (component != null) {
-					restartServerIfNecessary(component);
-					// Try to register the SCFE as the default editor.
-					setRegistration(file);
-				}
-			} else {
-				// Try to unregister the SCFE as the default editor.
-				unsetRegistration(file);
-			}
-		}
-	}
-
-	/**
-	 * Look to see if the persisted resource level property keyed by EDITOR_KEY
-	 * has ben set yet. If not then set it to the SCFE.
-	 * 
-	 * @param file
-	 *            The FCF
-	 */
-	private void setRegistration(IFile file) {
-		String editorID = null;
-		try {
-			editorID = file.getPersistentProperty(EDITOR_KEY);
-		} catch (CoreException e) {
-            // suppress core exception
-		}
-		if (editorID == null) {
-			try {
-				file.setPersistentProperty(EDITOR_KEY, FacesConfigPlugin.FACES_CONFIG_EDITOR_ID);
-			} catch (CoreException e) {
-				Logger.log(file, "Failed to set the vcurrent editor to SCFE", e);
-			}
-		}
-	}
-
-	private void unsetRegistration(IFile file) {
-		// If the default editor for this file is not the Struts config. editor,
-		// then we're done.
-		IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
-		IEditorDescriptor userEditor = registry.getDefaultEditor(file.getFullPath().toString());
-		if ((userEditor == null)
-				|| !FacesConfigPlugin.FACES_CONFIG_EDITOR_ID.equals(userEditor.getId())) {
-			traceFiner(file, "Not unsetting: Default already not Faces config. editor");
-			return;
-		}
-
-		// Make the Struts config. editor the default.
-		traceFiner(file, "Unsetting.");
-		IEditorDescriptor[] editors = registry.getEditors(file.getFullPath().toString());
-		if (editors.length > 1) {
-			registry.setDefaultEditor(file.getFullPath().toString(), editors[1].getId());
-		}
-	}
-
-	//private boolean isRestarting = false;
-	//private Collection restartableComponents = new HashSet();
-
-/*	private void restartComponents(Collection components) {
-		restartableComponents.addAll(components);
-		if (!isRestarting) {
-			isRestarting = true;
-			try {
-				while (!restartableComponents.isEmpty()) {
-					IVirtualComponent component = (IVirtualComponent) restartableComponents.iterator().next();
-					try {
-						ServerRestartUtil.restartComponent(component, true);
-					} finally {
-						restartableComponents.remove(component);
-					}
-				}
-			} finally {
-				isRestarting = false;
-			}
-
-		}
-	}
-
-*/	private void traceFiner(IFile file, String message) {
-		String fileName = file.getProjectRelativePath().toString();
-		Logger.trace("FacesconfigPlugin", this, fileName + ": " + message);
-	}
-
-	/** @see ISaveParticipant#doneSaving(ISaveContext) */
-	public void doneSaving(ISaveContext context) {
-        // nothing to do
-	}
-
-	/** @see ISaveParticipant#prepareToSave(ISaveContext) */
-	public void prepareToSave(ISaveContext context) throws CoreException {
-        // nothing to do
-	}
-
-	/** @see ISaveParticipant#rollback(ISaveContext) */
-	public void rollback(ISaveContext context) {
-	    // nothing to do
-	}
-
-	/** @see ISaveParticipant#saving(ISaveContext) */
-	public void saving(ISaveContext context) throws CoreException {
-		context.needDelta();
-	}
-
-	/**
-	 * Visit a resource. This should be invoked only from the
-	 * IResource.accept(IResourceVisitor) invocation, above.
-	 * 
-	 * @see IResourceVisitor#visit(IResource)
-	 */
-	public boolean visit(IResource resource) {
-
-		// Check for and handle a Struts config. file.
-		checkForFacesConfigFile(resource, true);
-
-		// Continue.
-		return true;
-	}
-
-	private void restartServerIfNecessary(IVirtualComponent component) {
-		if(!restartInProgress) {
-			// check against preference about whether to automatically restart
-			boolean restart = false;
-			if (FacesResourceChangeListener.preferenceStore != null) {
-				restart = FacesResourceChangeListener.preferenceStore.getBoolean(IFacesconfigPreferences.PREFSKEY_SERVER_RESTART);
-			}
-			if(restart) {
-				restartInProgress = true;
-				// we'll ask that just the containing EAR is restarted, but it may cycle the whole server if running on Portal
-
-				//ServerRestartUtil.restartComponent(component, true);
-				restartInProgress = false;
-			}
-		}
-	}
-
-	/**
-	 * @return Returns the listener.
-	 */
-	public static FacesResourceChangeListener getFacesResourceChangeListener() {
-		if (listener == null) {
-			listener = new FacesResourceChangeListener();
-			// Register as resource change listener.
-			ResourcesPlugin.getWorkspace().addResourceChangeListener(listener, IResourceChangeEvent.PRE_BUILD);
-		}
-		return listener;
-	}
-	
-	/**
-	 * Adds a change listener to the list of listeners that will be notified
-	 * when a change is fired.
-	 * 
-	 * @param facesConfigChangeListener
-	 */
-	public void addFacesConfigChangeListener(IFacesConfigChangeListener facesConfigChangeListener) {
-		facesConfigChangeListeners.add(facesConfigChangeListener);
-	}
-	/**
-	 * Removes the listener from the list.
-	 * 
-	 * @param facesConfigChangeListener
-	 */
-	public void removeFacesConfigChangeListener(IFacesConfigChangeListener facesConfigChangeListener) {
-		facesConfigChangeListeners.remove(facesConfigChangeListener);
-	}
-	
-	private void fireFacesConfigChangeEvent(IFacesConfigChangeEvent event) {
-		LinkedList localCopy;
-		synchronized( this ) {
-			localCopy = (LinkedList)facesConfigChangeListeners.clone();
-		}
-		for ( ListIterator iter = localCopy.listIterator(); iter.hasNext(); ) {
-			IFacesConfigChangeListener facesConfigChangeListener = (IFacesConfigChangeListener)iter.next();
-			facesConfigChangeListener.resourceChanged(event);
-		}
-	}
-
-	/** 
-	 * Set the internally used preference store to preferenceStore
-	 * 
-	 * @param preferenceStore
-	 */
-	public static void setPreferenceStore(IPreferenceStore preferenceStore) {
-		FacesResourceChangeListener.preferenceStore = preferenceStore;
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigChangeEvent.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigChangeEvent.java
deleted file mode 100644
index 5764ee8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigChangeEvent.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-/**
- * Not intended for external use.
- * 
- * @author xnjiang
- *
- */
-/*package*/ interface IFacesConfigChangeEvent {
-
-	/**
-	 * @return true if a managed bean has changed
-	 */
-	public boolean isManagedBeanChanged();
-	/**
-	 * @return true if a navigation rule has changed
-	 */
-	public boolean isNavigationRuleChanged();
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigChangeListener.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigChangeListener.java
deleted file mode 100644
index 393e61b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigChangeListener.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-
-/**
- * Not intended for external use.
- * 
- * @author xnjiang
- *
- */
-/*package*/interface IFacesConfigChangeListener {
-
-	/**
-	 * @param event
-	 */
-	public void resourceChanged(IFacesConfigChangeEvent event);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigConstants.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigConstants.java
deleted file mode 100644
index 017bd29..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigConstants.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-/**
- * Not intended for external use.
- * 
- * Common constants
- */
-/*package*/ interface IFacesConfigConstants {
-	/**
-	 * the relative URI for the default faces config file.
-	 */
-	final String FACES_CONFIG_URI		= 	"WEB-INF/faces-config.xml"; //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigResource.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigResource.java
deleted file mode 100644
index f2f1cce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigResource.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.wst.common.internal.emf.resource.TranslatorResource;
-
-
-/**
- * Should not be used or extended by clients.
- * 
- * @author gjohnsto
- * @version $Id$
- */
-/*package*/ interface IFacesConfigResource extends TranslatorResource {
-	
-	/**
-	 * @return the root faces config object
-	 */
-	public FacesConfigType getFacesConfig();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesconfigPreferences.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesconfigPreferences.java
deleted file mode 100644
index 78c4222..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesconfigPreferences.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-/**
- * Should NOT be used or extended by clients.
- * 
- * constants for JSF preferences pages
- *
- * @author spaxton
- */
-/*package*/ interface IFacesconfigPreferences {
-	
-	/**
-	 * Preference for whether or not to restart the server
-	 */
-	String PREFSKEY_SERVER_RESTART = "jsf.project.restart"; //$NON-NLS-1$
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_actionListener_ActionListenerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_actionListener_ActionListenerType.gif
deleted file mode 100644
index decea7b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_actionListener_ActionListenerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_defaultRenderKitId_DefaultRenderKitIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_defaultRenderKitId_DefaultRenderKitIdType.gif
deleted file mode 100644
index b806b6d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_defaultRenderKitId_DefaultRenderKitIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_localeConfig_LocaleConfigType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_localeConfig_LocaleConfigType.gif
deleted file mode 100644
index 9b0e092..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_localeConfig_LocaleConfigType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_messageBundle_MessageBundleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_messageBundle_MessageBundleType.gif
deleted file mode 100644
index 65e5a9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_messageBundle_MessageBundleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_navigationHandler_NavigationHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_navigationHandler_NavigationHandlerType.gif
deleted file mode 100644
index 5bbeb62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_navigationHandler_NavigationHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_propertyResolver_PropertyResolverType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_propertyResolver_PropertyResolverType.gif
deleted file mode 100644
index 0b5f0b5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_propertyResolver_PropertyResolverType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_stateManager_StateManagerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_stateManager_StateManagerType.gif
deleted file mode 100644
index 9ef55d2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_stateManager_StateManagerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_variableResolver_VariableResolverType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_variableResolver_VariableResolverType.gif
deleted file mode 100644
index d7dcab4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_variableResolver_VariableResolverType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_viewHandler_ViewHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_viewHandler_ViewHandlerType.gif
deleted file mode 100644
index 89171a9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_viewHandler_ViewHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeExtension_AttributeExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeExtension_AttributeExtensionType.gif
deleted file mode 100644
index b067e51..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeExtension_AttributeExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeName_AttributeNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeName_AttributeNameType.gif
deleted file mode 100644
index f420604..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeName_AttributeNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_description_DescriptionType.gif
deleted file mode 100644
index 92d407e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_displayName_DisplayNameType.gif
deleted file mode 100644
index 09b5568..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_icon_IconType.gif
deleted file mode 100644
index de6e628..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_attribute_AttributeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_attribute_AttributeType.gif
deleted file mode 100644
index 086cf80..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_attribute_AttributeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentClass_ComponentClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentClass_ComponentClassType.gif
deleted file mode 100644
index 4bbe527..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentClass_ComponentClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentExtension_ComponentExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentExtension_ComponentExtensionType.gif
deleted file mode 100644
index 1b6026a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentExtension_ComponentExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentType_ComponentTypeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentType_ComponentTypeType.gif
deleted file mode 100644
index 803d12d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentType_ComponentTypeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_description_DescriptionType.gif
deleted file mode 100644
index 4154e57..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_displayName_DisplayNameType.gif
deleted file mode 100644
index 6cb8e23..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_facet_FacetType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_facet_FacetType.gif
deleted file mode 100644
index f91a995..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_facet_FacetType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_icon_IconType.gif
deleted file mode 100644
index b24124a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_property_PropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_property_PropertyType.gif
deleted file mode 100644
index 3a05916..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_property_PropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_attribute_AttributeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_attribute_AttributeType.gif
deleted file mode 100644
index f4fa5b5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_attribute_AttributeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterExtension_ConverterExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterExtension_ConverterExtensionType.gif
deleted file mode 100644
index d544289..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterExtension_ConverterExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_description_DescriptionType.gif
deleted file mode 100644
index 43703db..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_displayName_DisplayNameType.gif
deleted file mode 100644
index e7c430b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_icon_IconType.gif
deleted file mode 100644
index 265ce22..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_property_PropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_property_PropertyType.gif
deleted file mode 100644
index 3fbe2cd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_property_PropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_actionListener_ActionListenerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_actionListener_ActionListenerType.gif
deleted file mode 100644
index 9dd025a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_actionListener_ActionListenerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_applicationFactory_ApplicationFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_applicationFactory_ApplicationFactoryType.gif
deleted file mode 100644
index 1c7362a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_applicationFactory_ApplicationFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_application_ApplicationType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_application_ApplicationType.gif
deleted file mode 100644
index 29e698e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_application_ApplicationType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeExtension_AttributeExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeExtension_AttributeExtensionType.gif
deleted file mode 100644
index af07ba1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeExtension_AttributeExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeName_AttributeNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeName_AttributeNameType.gif
deleted file mode 100644
index 5d5000a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeName_AttributeNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attribute_AttributeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attribute_AttributeType.gif
deleted file mode 100644
index 5d9762d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attribute_AttributeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentClass_ComponentClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentClass_ComponentClassType.gif
deleted file mode 100644
index 0a7b807..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentClass_ComponentClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentExtension_ComponentExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentExtension_ComponentExtensionType.gif
deleted file mode 100644
index 62bda1f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentExtension_ComponentExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentType_ComponentTypeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentType_ComponentTypeType.gif
deleted file mode 100644
index b25c629..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentType_ComponentTypeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_component_ComponentType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_component_ComponentType.gif
deleted file mode 100644
index d70b2d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_component_ComponentType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converter_ConverterType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converter_ConverterType.gif
deleted file mode 100644
index 0855183..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converter_ConverterType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultLocale_DefaultLocaleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultLocale_DefaultLocaleType.gif
deleted file mode 100644
index a1fa94e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultLocale_DefaultLocaleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_description_DescriptionType.gif
deleted file mode 100644
index 1c7362a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_displayName_DisplayNameType.gif
deleted file mode 100644
index 1d2f734..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facesConfig_FacesConfigType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facesConfig_FacesConfigType.gif
deleted file mode 100644
index 61b0302..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facesConfig_FacesConfigType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facesContextFactory_FacesContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facesContextFactory_FacesContextFactoryType.gif
deleted file mode 100644
index 182638d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facesContextFactory_FacesContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_factory_FactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_factory_FactoryType.gif
deleted file mode 100644
index 983575c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_factory_FactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_icon_IconType.gif
deleted file mode 100644
index c05a418..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_lifecycleFactory_LifecycleFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_lifecycleFactory_LifecycleFactoryType.gif
deleted file mode 100644
index 5599390..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_lifecycleFactory_LifecycleFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_lifecycle_LifecycleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_lifecycle_LifecycleType.gif
deleted file mode 100644
index 908375c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_lifecycle_LifecycleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_listEntries_ListEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_listEntries_ListEntriesType.gif
deleted file mode 100644
index d9a9d8d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_listEntries_ListEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_localeConfig_LocaleConfigType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_localeConfig_LocaleConfigType.gif
deleted file mode 100644
index 55f49ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_localeConfig_LocaleConfigType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBean_ManagedBeanType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBean_ManagedBeanType.gif
deleted file mode 100644
index fc34e45..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBean_ManagedBeanType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedProperty_ManagedPropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedProperty_ManagedPropertyType.gif
deleted file mode 100644
index 963a72b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedProperty_ManagedPropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_mapEntries_MapEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_mapEntries_MapEntriesType.gif
deleted file mode 100644
index 0a7b807..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_mapEntries_MapEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_mapEntry_MapEntryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_mapEntry_MapEntryType.gif
deleted file mode 100644
index 1c7362a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_mapEntry_MapEntryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_messageBundle_MessageBundleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_messageBundle_MessageBundleType.gif
deleted file mode 100644
index 4ce1821..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_messageBundle_MessageBundleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationCase_NavigationCaseType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationCase_NavigationCaseType.gif
deleted file mode 100644
index 61b0302..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationCase_NavigationCaseType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationHandler_NavigationHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationHandler_NavigationHandlerType.gif
deleted file mode 100644
index 0996300..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationHandler_NavigationHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationRule_NavigationRuleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationRule_NavigationRuleType.gif
deleted file mode 100644
index 64cd1b0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationRule_NavigationRuleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_nullValue_NullValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_nullValue_NullValueType.gif
deleted file mode 100644
index 3d308aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_nullValue_NullValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_phaseListener_PhaseListenerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_phaseListener_PhaseListenerType.gif
deleted file mode 100644
index 464e623..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_phaseListener_PhaseListenerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyExtension_PropertyExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyExtension_PropertyExtensionType.gif
deleted file mode 100644
index 182638d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyExtension_PropertyExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyResolver_PropertyResolverType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyResolver_PropertyResolverType.gif
deleted file mode 100644
index af07ba1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyResolver_PropertyResolverType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_property_PropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_property_PropertyType.gif
deleted file mode 100644
index 448138d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_property_PropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_redirect_RedirectType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_redirect_RedirectType.gif
deleted file mode 100644
index 55f49ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_redirect_RedirectType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_referencedBean_ReferencedBeanType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_referencedBean_ReferencedBeanType.gif
deleted file mode 100644
index 3d308aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_referencedBean_ReferencedBeanType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKitFactory_RenderKitFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKitFactory_RenderKitFactoryType.gif
deleted file mode 100644
index 3d308aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKitFactory_RenderKitFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKit_RenderKitType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKit_RenderKitType.gif
deleted file mode 100644
index 75a50e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKit_RenderKitType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_rendererExtension_RendererExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_rendererExtension_RendererExtensionType.gif
deleted file mode 100644
index 983575c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_rendererExtension_RendererExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderer_RendererType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderer_RendererType.gif
deleted file mode 100644
index e178517..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderer_RendererType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_stateManager_StateManagerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_stateManager_StateManagerType.gif
deleted file mode 100644
index eef1935..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_stateManager_StateManagerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_supportedLocale_SupportedLocaleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_supportedLocale_SupportedLocaleType.gif
deleted file mode 100644
index 4ce1821..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_supportedLocale_SupportedLocaleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_validator_ValidatorType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_validator_ValidatorType.gif
deleted file mode 100644
index fc34e45..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_validator_ValidatorType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_value_ValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_value_ValueType.gif
deleted file mode 100644
index 411e41c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_value_ValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_variableResolver_VariableResolverType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_variableResolver_VariableResolverType.gif
deleted file mode 100644
index 210e156..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_variableResolver_VariableResolverType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_viewHandler_ViewHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_viewHandler_ViewHandlerType.gif
deleted file mode 100644
index 84df4c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_viewHandler_ViewHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDynamicElement_childNodes_DynamicElement.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDynamicElement_childNodes_DynamicElement.gif
deleted file mode 100644
index 3744cee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDynamicElement_childNodes_DynamicElement.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_application_ApplicationType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_application_ApplicationType.gif
deleted file mode 100644
index 28ed761..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_application_ApplicationType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_component_ComponentType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_component_ComponentType.gif
deleted file mode 100644
index 07b82ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_component_ComponentType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_converter_ConverterType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_converter_ConverterType.gif
deleted file mode 100644
index b4db3ff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_converter_ConverterType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_factory_FactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_factory_FactoryType.gif
deleted file mode 100644
index ca61c9e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_factory_FactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_lifecycle_LifecycleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_lifecycle_LifecycleType.gif
deleted file mode 100644
index b93b3d2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_lifecycle_LifecycleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_managedBean_ManagedBeanType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_managedBean_ManagedBeanType.gif
deleted file mode 100644
index f2b0a1e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_managedBean_ManagedBeanType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_navigationRule_NavigationRuleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_navigationRule_NavigationRuleType.gif
deleted file mode 100644
index 7431442..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_navigationRule_NavigationRuleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_referencedBean_ReferencedBeanType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_referencedBean_ReferencedBeanType.gif
deleted file mode 100644
index 149a215..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_referencedBean_ReferencedBeanType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_renderKit_RenderKitType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_renderKit_RenderKitType.gif
deleted file mode 100644
index 8cd9cfa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_renderKit_RenderKitType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_validator_ValidatorType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_validator_ValidatorType.gif
deleted file mode 100644
index f2b0a1e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_validator_ValidatorType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_description_DescriptionType.gif
deleted file mode 100644
index 66a097b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_displayName_DisplayNameType.gif
deleted file mode 100644
index dd919f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_facetExtension_FacetExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_facetExtension_FacetExtensionType.gif
deleted file mode 100644
index b021070..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_facetExtension_FacetExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_facetName_FacetNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_facetName_FacetNameType.gif
deleted file mode 100644
index ff4cc72..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_facetName_FacetNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_icon_IconType.gif
deleted file mode 100644
index df2b32d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_applicationFactory_ApplicationFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_applicationFactory_ApplicationFactoryType.gif
deleted file mode 100644
index d4a978d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_applicationFactory_ApplicationFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_facesContextFactory_FacesContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_facesContextFactory_FacesContextFactoryType.gif
deleted file mode 100644
index 5173b2d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_facesContextFactory_FacesContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_lifecycleFactory_LifecycleFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_lifecycleFactory_LifecycleFactoryType.gif
deleted file mode 100644
index 7cc18f1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_lifecycleFactory_LifecycleFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_renderKitFactory_RenderKitFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_renderKitFactory_RenderKitFactoryType.gif
deleted file mode 100644
index 3dac10e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_renderKitFactory_RenderKitFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLifecycleType_lifecycleExtension_LifecycleExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLifecycleType_lifecycleExtension_LifecycleExtensionType.gif
deleted file mode 100644
index 79a0b58..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLifecycleType_lifecycleExtension_LifecycleExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLifecycleType_phaseListener_PhaseListenerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLifecycleType_phaseListener_PhaseListenerType.gif
deleted file mode 100644
index f11ad89..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLifecycleType_phaseListener_PhaseListenerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_nullValue_NullValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_nullValue_NullValueType.gif
deleted file mode 100644
index 205071f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_nullValue_NullValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_value_ValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_value_ValueType.gif
deleted file mode 100644
index a9aaa51..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_value_ValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLocaleConfigType_defaultLocale_DefaultLocaleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLocaleConfigType_defaultLocale_DefaultLocaleType.gif
deleted file mode 100644
index d5f8c8d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLocaleConfigType_defaultLocale_DefaultLocaleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLocaleConfigType_supportedLocale_SupportedLocaleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLocaleConfigType_supportedLocale_SupportedLocaleType.gif
deleted file mode 100644
index 3e4fc3f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLocaleConfigType_supportedLocale_SupportedLocaleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_description_DescriptionType.gif
deleted file mode 100644
index b913037..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_displayName_DisplayNameType.gif
deleted file mode 100644
index 23c1e15..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_icon_IconType.gif
deleted file mode 100644
index 46c6860..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_listEntries_ListEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_listEntries_ListEntriesType.gif
deleted file mode 100644
index 3a9f24e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_listEntries_ListEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanExtension_ManagedBeanExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanExtension_ManagedBeanExtensionType.gif
deleted file mode 100644
index 10a1ab5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanExtension_ManagedBeanExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedProperty_ManagedPropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedProperty_ManagedPropertyType.gif
deleted file mode 100644
index f11830c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedProperty_ManagedPropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_mapEntries_MapEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_mapEntries_MapEntriesType.gif
deleted file mode 100644
index 5e689e6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_mapEntries_MapEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_description_DescriptionType.gif
deleted file mode 100644
index e66386f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_displayName_DisplayNameType.gif
deleted file mode 100644
index c2b071b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_icon_IconType.gif
deleted file mode 100644
index 60aa17e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_listEntries_ListEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_listEntries_ListEntriesType.gif
deleted file mode 100644
index 223e215..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_listEntries_ListEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_mapEntries_MapEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_mapEntries_MapEntriesType.gif
deleted file mode 100644
index db04142..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_mapEntries_MapEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntriesType_mapEntry_MapEntryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntriesType_mapEntry_MapEntryType.gif
deleted file mode 100644
index 2a3bcb3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntriesType_mapEntry_MapEntryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_description_DescriptionType.gif
deleted file mode 100644
index 1dd58e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_displayName_DisplayNameType.gif
deleted file mode 100644
index 424142e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_icon_IconType.gif
deleted file mode 100644
index 0f107c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_redirect_RedirectType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_redirect_RedirectType.gif
deleted file mode 100644
index a46fda5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_redirect_RedirectType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_description_DescriptionType.gif
deleted file mode 100644
index fbba57a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_displayName_DisplayNameType.gif
deleted file mode 100644
index ae6f7b7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_icon_IconType.gif
deleted file mode 100644
index fbae759..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_navigationCase_NavigationCaseType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_navigationCase_NavigationCaseType.gif
deleted file mode 100644
index 34611db..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_navigationCase_NavigationCaseType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_navigationRuleExtension_NavigationRuleExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_navigationRuleExtension_NavigationRuleExtensionType.gif
deleted file mode 100644
index b0e719a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_navigationRuleExtension_NavigationRuleExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_description_DescriptionType.gif
deleted file mode 100644
index 527759b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_displayName_DisplayNameType.gif
deleted file mode 100644
index c7bd777..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_icon_IconType.gif
deleted file mode 100644
index ee73faa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_propertyExtension_PropertyExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_propertyExtension_PropertyExtensionType.gif
deleted file mode 100644
index f9f81a4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_propertyExtension_PropertyExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_description_DescriptionType.gif
deleted file mode 100644
index fe734c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_displayName_DisplayNameType.gif
deleted file mode 100644
index 8d3a8e0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_icon_IconType.gif
deleted file mode 100644
index b1bf686..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_description_DescriptionType.gif
deleted file mode 100644
index 2b77e50..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_displayName_DisplayNameType.gif
deleted file mode 100644
index 9f85940..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_icon_IconType.gif
deleted file mode 100644
index fe7b106..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderKitExtension_RenderKitExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderKitExtension_RenderKitExtensionType.gif
deleted file mode 100644
index dbd19ed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderKitExtension_RenderKitExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderer_RendererType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderer_RendererType.gif
deleted file mode 100644
index d749f03..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderer_RendererType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_attribute_AttributeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_attribute_AttributeType.gif
deleted file mode 100644
index 3be3f93..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_attribute_AttributeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_description_DescriptionType.gif
deleted file mode 100644
index 66a097b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_displayName_DisplayNameType.gif
deleted file mode 100644
index dd919f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_facet_FacetType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_facet_FacetType.gif
deleted file mode 100644
index 0091f17..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_facet_FacetType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_icon_IconType.gif
deleted file mode 100644
index df2b32d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_rendererExtension_RendererExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_rendererExtension_RendererExtensionType.gif
deleted file mode 100644
index b021070..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_rendererExtension_RendererExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_description_DescriptionType.gif
deleted file mode 100644
index 66a097b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_displayName_DisplayNameType.gif
deleted file mode 100644
index dd919f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_icon_IconType.gif
deleted file mode 100644
index df2b32d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_attribute_AttributeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_attribute_AttributeType.gif
deleted file mode 100644
index 647a6ff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_attribute_AttributeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_description_DescriptionType.gif
deleted file mode 100644
index b913037..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_displayName_DisplayNameType.gif
deleted file mode 100644
index 23c1e15..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_icon_IconType.gif
deleted file mode 100644
index 46c6860..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_property_PropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_property_PropertyType.gif
deleted file mode 100644
index 1808567..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_property_PropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_validatorExtension_ValidatorExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_validatorExtension_ValidatorExtensionType.gif
deleted file mode 100644
index 10a1ab5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_validatorExtension_ValidatorExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ActionListenerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ActionListenerType.gif
deleted file mode 100644
index d3dc5a9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ActionListenerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationExtensionType.gif
deleted file mode 100644
index 7c2aaac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationFactoryType.gif
deleted file mode 100644
index 53500da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationType.gif
deleted file mode 100644
index ed87474..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeClassType.gif
deleted file mode 100644
index 498364f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeExtensionType.gif
deleted file mode 100644
index c00aedf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeNameType.gif
deleted file mode 100644
index cb1755a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeType.gif
deleted file mode 100644
index 338fb8d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BaseNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BaseNameType.gif
deleted file mode 100644
index d3dc5a9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BaseNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentClassType.gif
deleted file mode 100644
index afb82ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentExtensionType.gif
deleted file mode 100644
index 33a997a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentFamilyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentFamilyType.gif
deleted file mode 100644
index caf2804..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentFamilyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentType.gif
deleted file mode 100644
index 5a9bc75..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentTypeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentTypeType.gif
deleted file mode 100644
index 8a5c70c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentTypeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterClassType.gif
deleted file mode 100644
index 7bac4fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterExtensionType.gif
deleted file mode 100644
index a26660e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterForClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterForClassType.gif
deleted file mode 100644
index a3908bc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterForClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterIdType.gif
deleted file mode 100644
index 89ad5da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterType.gif
deleted file mode 100644
index 7c2aaac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultLocaleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultLocaleType.gif
deleted file mode 100644
index 98b351f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultLocaleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultRenderKitIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultRenderKitIdType.gif
deleted file mode 100644
index cdd3b76..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultRenderKitIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultValueType.gif
deleted file mode 100644
index 89ad5da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DescriptionType.gif
deleted file mode 100644
index 53500da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DisplayNameType.gif
deleted file mode 100644
index ea58a65..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DocumentRoot.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DocumentRoot.gif
deleted file mode 100644
index 739ebbf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DocumentRoot.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DynamicAttribute.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DynamicAttribute.gif
deleted file mode 100644
index 420eee1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DynamicAttribute.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DynamicElement.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DynamicElement.gif
deleted file mode 100644
index 90d10f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DynamicElement.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ELResolverType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ELResolverType.gif
deleted file mode 100644
index 7b7c428..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ELResolverType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfigExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfigExtensionType.gif
deleted file mode 100644
index 35ef84e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfigExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfigType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfigType.gif
deleted file mode 100644
index c4a8af4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfigType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ActionListener.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ActionListener.gif
deleted file mode 100644
index 67b2d33..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ActionListener.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Application.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Application.gif
deleted file mode 100644
index 57e5b1e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Application.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Component.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Component.gif
deleted file mode 100644
index 347a8ff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Component.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Converter.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Converter.gif
deleted file mode 100644
index 16466ed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Converter.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Factory.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Factory.gif
deleted file mode 100644
index 955d5e8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Factory.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_LifeCycle.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_LifeCycle.gif
deleted file mode 100644
index 2c15d64..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_LifeCycle.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_LocaleConfig.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_LocaleConfig.gif
deleted file mode 100644
index 596f68b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_LocaleConfig.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ManagedBean.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ManagedBean.gif
deleted file mode 100644
index 6cdef7b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ManagedBean.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_MessageBundle.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_MessageBundle.gif
deleted file mode 100644
index 8f40ee1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_MessageBundle.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_NavigationHandler.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_NavigationHandler.gif
deleted file mode 100644
index 0e242c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_NavigationHandler.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Pageflow16.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Pageflow16.gif
deleted file mode 100644
index 5ea67da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Pageflow16.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_PhaseListener.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_PhaseListener.gif
deleted file mode 100644
index e9e7238..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_PhaseListener.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Plugin.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Plugin.gif
deleted file mode 100644
index 5ea67da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Plugin.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_PropertyResolver.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_PropertyResolver.gif
deleted file mode 100644
index 39064d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_PropertyResolver.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_RenderKit.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_RenderKit.gif
deleted file mode 100644
index 30ba00d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_RenderKit.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_StateManager.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_StateManager.gif
deleted file mode 100644
index bf3102c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_StateManager.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Validator.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Validator.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Validator.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_VariableResolver.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_VariableResolver.gif
deleted file mode 100644
index 642b874..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_VariableResolver.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ViewHandler.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ViewHandler.gif
deleted file mode 100644
index 4834c83..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ViewHandler.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesContextFactoryType.gif
deleted file mode 100644
index 420eee1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetExtensionType.gif
deleted file mode 100644
index 83afb9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetNameType.gif
deleted file mode 100644
index 98b351f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetType.gif
deleted file mode 100644
index 136e3b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FactoryExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FactoryExtensionType.gif
deleted file mode 100644
index 90d10f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FactoryExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FactoryType.gif
deleted file mode 100644
index 83afb9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromActionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromActionType.gif
deleted file mode 100644
index b3643da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromActionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromOutcomeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromOutcomeType.gif
deleted file mode 100644
index a26660e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromOutcomeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromViewIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromViewIdType.gif
deleted file mode 100644
index 48e3cf2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromViewIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/IconType.gif
deleted file mode 100644
index 106881e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/KeyClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/KeyClassType.gif
deleted file mode 100644
index 35ef84e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/KeyClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/KeyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/KeyType.gif
deleted file mode 100644
index 136e3b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/KeyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LargeIconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LargeIconType.gif
deleted file mode 100644
index 33a997a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LargeIconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleExtensionType.gif
deleted file mode 100644
index 05dc74a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleFactoryType.gif
deleted file mode 100644
index 7bac4fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleType.gif
deleted file mode 100644
index 90d10f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ListEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ListEntriesType.gif
deleted file mode 100644
index 48e3cf2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ListEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LocaleConfigType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LocaleConfigType.gif
deleted file mode 100644
index 30f0c48..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LocaleConfigType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanClassType.gif
deleted file mode 100644
index 05dc74a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanExtensionType.gif
deleted file mode 100644
index 8a5c70c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanNameType.gif
deleted file mode 100644
index 5a9bc75..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanScopeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanScopeType.gif
deleted file mode 100644
index 83afb9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanScopeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanType.gif
deleted file mode 100644
index 5915591..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedPropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedPropertyType.gif
deleted file mode 100644
index 14af8aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedPropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MapEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MapEntriesType.gif
deleted file mode 100644
index afb82ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MapEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MapEntryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MapEntryType.gif
deleted file mode 100644
index 53500da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MapEntryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MessageBundleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MessageBundleType.gif
deleted file mode 100644
index 89ad5da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MessageBundleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationCaseType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationCaseType.gif
deleted file mode 100644
index c4a8af4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationCaseType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationHandlerType.gif
deleted file mode 100644
index 94c953e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationRuleExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationRuleExtensionType.gif
deleted file mode 100644
index c673a52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationRuleExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationRuleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationRuleType.gif
deleted file mode 100644
index db7414e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationRuleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NullValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NullValueType.gif
deleted file mode 100644
index c673a52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NullValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PhaseListenerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PhaseListenerType.gif
deleted file mode 100644
index 7b7c428..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PhaseListenerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyClassType.gif
deleted file mode 100644
index caf2804..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyExtensionType.gif
deleted file mode 100644
index 420eee1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyNameType.gif
deleted file mode 100644
index 83afb9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyResolverType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyResolverType.gif
deleted file mode 100644
index c00aedf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyResolverType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyType.gif
deleted file mode 100644
index e4b530e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RedirectType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RedirectType.gif
deleted file mode 100644
index 30f0c48..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RedirectType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanClassType.gif
deleted file mode 100644
index 45731fe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanNameType.gif
deleted file mode 100644
index e4bc22d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanType.gif
deleted file mode 100644
index c673a52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitClassType.gif
deleted file mode 100644
index 2124f3e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitExtensionType.gif
deleted file mode 100644
index 7b7c428..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitFactoryType.gif
deleted file mode 100644
index c673a52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitIdType.gif
deleted file mode 100644
index 7c2aaac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitType.gif
deleted file mode 100644
index 9041598..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererClassType.gif
deleted file mode 100644
index 35ef84e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererExtensionType.gif
deleted file mode 100644
index 83afb9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererType.gif
deleted file mode 100644
index 136e3b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererTypeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererTypeType.gif
deleted file mode 100644
index e4b530e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererTypeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ResourceBundleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ResourceBundleType.gif
deleted file mode 100644
index 136e3b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ResourceBundleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SmallIconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SmallIconType.gif
deleted file mode 100644
index b1f8afa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SmallIconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/StateManagerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/StateManagerType.gif
deleted file mode 100644
index e4bc22d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/StateManagerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SuggestedValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SuggestedValueType.gif
deleted file mode 100644
index db7414e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SuggestedValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SupportedLocaleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SupportedLocaleType.gif
deleted file mode 100644
index 89ad5da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SupportedLocaleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ToViewIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ToViewIdType.gif
deleted file mode 100644
index e4bc22d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ToViewIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorClassType.gif
deleted file mode 100644
index 05dc74a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorExtensionType.gif
deleted file mode 100644
index 8a5c70c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorIdType.gif
deleted file mode 100644
index d92f34c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorType.gif
deleted file mode 100644
index 5915591..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValueClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValueClassType.gif
deleted file mode 100644
index d3dc5a9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValueClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValueType.gif
deleted file mode 100644
index badaab0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VarType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VarType.gif
deleted file mode 100644
index 136e3b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VarType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VariableResolverType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VariableResolverType.gif
deleted file mode 100644
index a3908bc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VariableResolverType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ViewHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ViewHandlerType.gif
deleted file mode 100644
index 2b69256..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ViewHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/FacesConfig.ecore b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/FacesConfig.ecore
deleted file mode 100644
index 2cc5942..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/FacesConfig.ecore
+++ /dev/null
@@ -1,3793 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="facesconfig"
-    nsURI="http://www.eclipse.org/webtools/jsf/schema/facesconfig.xsd" nsPrefix="facesconfig">
-  <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-    <details key="documentation" value="&#xD;&#xA;   See http://www.w3.org/XML/1998/namespace.html and&#xD;&#xA;   http://www.w3.org/TR/REC-xml for information about this namespace.&#xD;&#xA;&#xD;&#xA;    This schema document describes the XML namespace, in a form&#xD;&#xA;    suitable for import by other schema documents.  &#xD;&#xA;&#xD;&#xA;    Note that local names in this namespace are intended to be defined&#xD;&#xA;    only by the World Wide Web Consortium or its subgroups.  The&#xD;&#xA;    following names are currently defined in this namespace and should&#xD;&#xA;    not be used with conflicting semantics by any Working Group,&#xD;&#xA;    specification, or document instance:&#xD;&#xA;&#xD;&#xA;    base (as an attribute name): denotes an attribute whose value&#xD;&#xA;         provides a URI to be used as the base for interpreting any&#xD;&#xA;         relative URIs in the scope of the element on which it&#xD;&#xA;         appears; its value is inherited.  This name is reserved&#xD;&#xA;         by virtue of its definition in the XML Base specification.&#xD;&#xA;&#xD;&#xA;    id   (as an attribute name): denotes an attribute whose value&#xD;&#xA;         should be interpreted as if declared to be of type ID.&#xD;&#xA;         The xml:id specification is not yet a W3C Recommendation,&#xD;&#xA;         but this attribute is included here to facilitate experimentation&#xD;&#xA;         with the mechanisms it proposes.  Note that it is _not_ included&#xD;&#xA;         in the specialAttrs attribute group.&#xD;&#xA;&#xD;&#xA;    lang (as an attribute name): denotes an attribute whose value&#xD;&#xA;         is a language code for the natural language of the content of&#xD;&#xA;         any element; its value is inherited.  This name is reserved&#xD;&#xA;         by virtue of its definition in the XML specification.&#xD;&#xA;  &#xD;&#xA;    space (as an attribute name): denotes an attribute whose&#xD;&#xA;         value is a keyword indicating what whitespace processing&#xD;&#xA;         discipline is intended for the content of the element; its&#xD;&#xA;         value is inherited.  This name is reserved by virtue of its&#xD;&#xA;         definition in the XML specification.&#xD;&#xA;&#xD;&#xA;    Father (in any context at all): denotes Jon Bosak, the chair of &#xD;&#xA;         the original XML Working Group.  This name is reserved by &#xD;&#xA;         the following decision of the W3C XML Plenary and &#xD;&#xA;         XML Coordination groups:&#xD;&#xA;&#xD;&#xA;             In appreciation for his vision, leadership and dedication&#xD;&#xA;             the W3C XML Plenary on this 10th day of February, 2000&#xD;&#xA;             reserves for Jon Bosak in perpetuity the XML name&#xD;&#xA;             xml:Father&#xD;&#xA;  &#xD;&#xA;This schema defines attributes and an attribute group&#xD;&#xA;        suitable for use by&#xD;&#xA;        schemas wishing to allow xml:base, xml:lang, xml:space or xml:id&#xD;&#xA;        attributes on elements they define.&#xD;&#xA;&#xD;&#xA;        To enable this, such a schema must import this schema&#xD;&#xA;        for the XML namespace, e.g. as follows:&#xD;&#xA;        &amp;lt;schema . . .&amp;gt;&#xD;&#xA;         . . .&#xD;&#xA;         &amp;lt;import namespace=&quot;http://www.w3.org/XML/1998/namespace&quot;&#xD;&#xA;                    schemaLocation=&quot;http://www.w3.org/2001/xml.xsd&quot;/&amp;gt;&#xD;&#xA;&#xD;&#xA;        Subsequently, qualified reference to any of the attributes&#xD;&#xA;        or the group defined below will have the desired effect, e.g.&#xD;&#xA;&#xD;&#xA;        &amp;lt;type . . .&amp;gt;&#xD;&#xA;         . . .&#xD;&#xA;         &amp;lt;attributeGroup ref=&quot;xml:specialAttrs&quot;/&amp;gt;&#xD;&#xA; &#xD;&#xA;         will define a type which will schema-validate an instance&#xD;&#xA;         element with any of those attributes&#xD;&#xA;In keeping with the XML Schema WG's standard versioning&#xD;&#xA;   policy, this schema document will persist at&#xD;&#xA;   http://www.w3.org/2005/08/xml.xsd.&#xD;&#xA;   At the date of issue it can also be found at&#xD;&#xA;   http://www.w3.org/2001/xml.xsd.&#xD;&#xA;   The schema document at that URI may however change in the future,&#xD;&#xA;   in order to remain compatible with the latest version of XML Schema&#xD;&#xA;   itself, or with the XML namespace itself.  In other words, if the XML&#xD;&#xA;   Schema or XML namespaces change, the version of this document at&#xD;&#xA;   http://www.w3.org/2001/xml.xsd will change&#xD;&#xA;   accordingly; the version at&#xD;&#xA;   http://www.w3.org/2005/08/xml.xsd will not change.&#xD;&#xA;  "/>
-  </eAnnotations>
-  <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-    <details key="qualified" value="false"/>
-  </eAnnotations>
-  <eClassifiers xsi:type="ecore:EClass" name="ActionListenerType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="action-listener_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ApplicationFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="application-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ApplicationType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="application_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="actionListener" upperBound="-1"
-        eType="#//ActionListenerType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="action-listener"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultRenderKitId" upperBound="-1"
-        eType="#//DefaultRenderKitIdType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-render-kit-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="messageBundle" upperBound="-1"
-        eType="#//MessageBundleType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="message-bundle"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="navigationHandler" upperBound="-1"
-        eType="#//NavigationHandlerType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="navigation-handler"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="viewHandler" upperBound="-1"
-        eType="#//ViewHandlerType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="view-handler"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="stateManager" upperBound="-1"
-        eType="#//StateManagerType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="state-manager"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyResolver" upperBound="-1"
-        eType="#//PropertyResolverType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-resolver"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="variableResolver" upperBound="-1"
-        eType="#//VariableResolverType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="variable-resolver"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="localeConfig" upperBound="-1"
-        eType="#//LocaleConfigType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="locale-config"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="eLResolver" upperBound="-1"
-        eType="#//ELResolverType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="el-resolver"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="resourceBundle" upperBound="-1"
-        eType="#//ResourceBundleType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="resource-bundle"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="applicationExtension" upperBound="-1"
-        eType="#//ApplicationExtensionType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="application-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ApplicationExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="application-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="AttributeClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="attribute-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="AttributeExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="attribute-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="AttributeNameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="attribute-name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="AttributeType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="attribute_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributeName" lowerBound="1"
-        eType="#//AttributeNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributeClass" lowerBound="1"
-        eType="#//AttributeClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultValue" eType="#//DefaultValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="suggestedValue" eType="#//SuggestedValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="suggested-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributeExtension" upperBound="-1"
-        eType="#//AttributeExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ComponentClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="component-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ComponentExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="component-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ComponentFamilyType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="component-family_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ComponentType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="component_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentType" lowerBound="1"
-        eType="#//ComponentTypeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentClass" lowerBound="1"
-        eType="#//ComponentClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facet" upperBound="-1"
-        eType="#//FacetType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="facet"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attribute" upperBound="-1"
-        eType="#//AttributeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="property" upperBound="-1"
-        eType="#//PropertyType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentExtension" upperBound="-1"
-        eType="#//ComponentExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ComponentTypeType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="component-type_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ConverterClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="converter-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ConverterForClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="converter-for-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ConverterIdType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="converter-id_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ConverterType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="converter_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterId" eType="#//ConverterIdType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterForClass" eType="#//ConverterForClassType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-for-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterClass" lowerBound="1"
-        eType="#//ConverterClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attribute" upperBound="-1"
-        eType="#//AttributeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="property" upperBound="-1"
-        eType="#//PropertyType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterExtension" upperBound="-1"
-        eType="#//ConverterExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ConverterExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="converter-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DefaultLocaleType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="default-locale_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DefaultRenderKitIdType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="default-render-kit-id_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DefaultValueType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="default-value_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DescriptionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="description_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lang" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Language">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="lang"/>
-        <details key="namespace" value="http://www.w3.org/XML/1998/namespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DisplayNameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="display-name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lang" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Language">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="lang"/>
-        <details key="namespace" value="http://www.w3.org/XML/1998/namespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DocumentRoot">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value=""/>
-      <details key="kind" value="mixed"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="mixed" unique="false" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="elementWildcard"/>
-        <details key="name" value=":mixed"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="xMLNSPrefixMap" unique="false"
-        upperBound="-1" eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EStringToStringMapEntry"
-        transient="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="xmlns:prefix"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="xSISchemaLocation" unique="false"
-        upperBound="-1" eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EStringToStringMapEntry"
-        transient="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="xsi:schemaLocation"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="actionListener" upperBound="-2"
-        eType="#//ActionListenerType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=" ==================== Subordinate&#xD;&#xA;                Elements ============================       The&#xD;&#xA;                &quot;action-listener&quot; element contains the fully&#xD;&#xA;                qualified class name     of the concrete ActionListener&#xD;&#xA;                implementation class that will be called     during the&#xD;&#xA;                Invoke Application phase of the request processing&#xD;&#xA;                lifecycle.     It must be of type &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="action-listener"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="application" upperBound="-2"
-        eType="#//ApplicationType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=" ==================== Definition Elements&#xD;&#xA;                =============================       The&#xD;&#xA;                &quot;application&quot; element provides a mechanism to&#xD;&#xA;                define the various     per-application-singleton&#xD;&#xA;                implementation classes for a particular web&#xD;&#xA;                application that is utilizing JavaServer Faces.  For&#xD;&#xA;                nested elements     that are not specified, the JSF&#xD;&#xA;                implementation must provide a suitable     default. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="application"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="applicationFactory" upperBound="-2"
-        eType="#//ApplicationFactoryType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;application-factory&quot;&#xD;&#xA;                element contains the fully qualified class     name of&#xD;&#xA;                the concrete ApplicationFactory implementation class&#xD;&#xA;                that     will be called when&#xD;&#xA;                FactoryFinder.getFactory(APPLICATION_FACTORY) is&#xD;&#xA;                called. It must be of type &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="application-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attribute" upperBound="-2"
-        eType="#//AttributeType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;attribute&quot; element&#xD;&#xA;                represents a named, typed, value associated with     the&#xD;&#xA;                parent UIComponent via the generic attributes mechanism.&#xD;&#xA;                Attribute names must be unique within the scope of the&#xD;&#xA;                parent (or related)     component. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributeClass" upperBound="-2"
-        eType="#//AttributeClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;attribute-class&quot; element represents the Java type of the value&#xA;    associated with this attribute name.  It must be of type &quot;ClassName&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributeExtension" upperBound="-2"
-        eType="#//AttributeExtensionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      Extension element for attribute.&#xD;&#xA;                May contain implementation     specific content. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributeName" upperBound="-2"
-        eType="#//AttributeNameType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;attribute-name&quot;&#xD;&#xA;                element represents the name under which the&#xD;&#xA;                corresponding value will be stored, in the generic&#xD;&#xA;                attributes of the     UIComponent we are related to. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="component" upperBound="-2"
-        eType="#//ComponentType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;component&quot; element&#xD;&#xA;                represents a concrete UIComponent implementation&#xD;&#xA;                class that should be registered under the specified type&#xD;&#xA;                identifier,     along with its associated properties and&#xD;&#xA;                attributes.  Component types must     be unique within&#xD;&#xA;                the entire web application.      Nested&#xD;&#xA;                &quot;attribute&quot; elements identify generic&#xD;&#xA;                attributes that are recognized     by the implementation&#xD;&#xA;                logic of this component.  Nested &quot;property&quot;&#xD;&#xA;                elements     identify JavaBeans properties of the&#xD;&#xA;                component class that may be exposed     for manipulation&#xD;&#xA;                via tools. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentClass" upperBound="-2"
-        eType="#//ComponentClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;component-class&quot;&#xD;&#xA;                element represents the fully qualified class name     of&#xD;&#xA;                a concrete UIComponent implementation class.  It must be&#xD;&#xA;                of     type &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentExtension" upperBound="-2"
-        eType="#//ComponentExtensionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      Extension element for component.&#xD;&#xA;                May contain implementation     specific content. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentFamily" upperBound="-2"
-        eType="#//ComponentFamilyType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;component-family&quot; element represents the component family for&#xA;    which the Renderer represented by the parent &quot;renderer&quot; element will be&#xA;    used."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-family"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentType" upperBound="-2"
-        eType="#//ComponentTypeType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;component-type&quot;&#xD;&#xA;                element represents the name under which the&#xD;&#xA;                corresponding UIComponent class should be registered. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converter" upperBound="-2"
-        eType="#//ConverterType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;converter&quot; element&#xD;&#xA;                represents a concrete Converter implementation     class&#xD;&#xA;                that should be registered under the specified converter&#xD;&#xA;                identifier.     Converter identifiers must be unique&#xD;&#xA;                within the entire web application.      Nested&#xD;&#xA;                &quot;attribute&quot; elements identify generic&#xD;&#xA;                attributes that may be     configured on the&#xD;&#xA;                corresponding UIComponent in order to affect the&#xD;&#xA;                operation of the Converter.  Nested &quot;property&quot;&#xD;&#xA;                elements identify JavaBeans     properties of the&#xD;&#xA;                Converter implementation class that may be configured&#xD;&#xA;                to affect the operation of the Converter. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterClass" upperBound="-2"
-        eType="#//ConverterClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;converter-class&quot; element represents the fully qualified class name&#xA;    of a concrete Converter implementation class.  It must be of&#xA;    type &quot;ClassName&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterForClass" upperBound="-2"
-        eType="#//ConverterForClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;converter-for-class&quot; element represents the fully qualified class name&#xA;    for which a Converter class will be registered.  It must be of&#xA;    type &quot;ClassName&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-for-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterId" upperBound="-2"
-        eType="#//ConverterIdType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;converter-id&quot; element represents the identifier under which the&#xA;    corresponding Converter class should be registered."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultLocale" upperBound="-2"
-        eType="#//DefaultLocaleType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      The &quot;default-locale&quot;&#xD;&#xA;                element declares the default locale for this&#xD;&#xA;                application instance.  It must be specified as&#xD;&#xA;                :language:[_:country:[_:variant:]] without the colons,&#xD;&#xA;                for example      &quot;ja_JP_SJIS&quot;.  The separators&#xD;&#xA;                between the segments may be '-' or&#xD;&#xA;                '_'. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-locale"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultRenderKitId" upperBound="-2"
-        eType="#//DefaultRenderKitIdType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;default-render-kit-id&quot; element allows the application to define&#xA;    a renderkit to be used other than the standard one. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-render-kit-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultValue" upperBound="-2"
-        eType="#//DefaultValueType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;default-value&quot; contains the value for the property or attribute&#xA;    in which this element resides.  This value differs from the&#xA;    &quot;suggested-value&quot; in that the property or attribute must take the&#xA;    value, whereas in &quot;suggested-value&quot; taking the value is optional."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-2"
-        eType="#//DescriptionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;description&quot; element&#xD;&#xA;                contains a textual description of the element     it is&#xD;&#xA;                nested in, optionally flagged with a language code using&#xD;&#xA;                the     &quot;xml:lang&quot; attribute. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-2"
-        eType="#//DisplayNameType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;display-name&quot; element&#xD;&#xA;                is a short descriptive name describing the     entity&#xD;&#xA;                associated with the element it is nested in, intended to&#xD;&#xA;                be     displayed by tools, and optionally flagged with a&#xD;&#xA;                language code using     the &quot;xml:lang&quot;&#xD;&#xA;                attribute. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facesConfig" upperBound="-2"
-        eType="#//FacesConfigType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=" ==================== Top Level Elements&#xD;&#xA;                ==============================       The&#xD;&#xA;                &quot;faces-config&quot; element is the root of the&#xD;&#xA;                configuration information     hierarchy, and contains&#xD;&#xA;                nested elements for all of the other configuration&#xD;&#xA;                settings. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="faces-config"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facesContextFactory" upperBound="-2"
-        eType="#//FacesContextFactoryType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The&#xD;&#xA;                &quot;faces-context-factory&quot; element contains the&#xD;&#xA;                fully qualified     class name of the concrete&#xD;&#xA;                FacesContextFactory implementation class     that will&#xD;&#xA;                be called when&#xD;&#xA;                FactoryFinder.getFactory(FACES_CONTEXT_FACTORY) is&#xD;&#xA;                called. It must     be of type &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="faces-context-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facet" upperBound="-2"
-        eType="#//FacetType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="   Define the name and other design-time information for a facet that is&#xA;   associated with a renderer or a component."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="facet"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facetExtension" upperBound="-2"
-        eType="#//FacetExtensionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    Extension element for facet.  May contain implementation&#xA;    specific content."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="facet-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facetName" upperBound="-2"
-        eType="#//FacetNameType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;facet-name&quot; element represents the facet name under which a&#xA;    UIComponent will be added to its parent.  It must be of type&#xA;    &quot;Identifier&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="facet-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="factory" upperBound="-2"
-        eType="#//FactoryType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;factory&quot; element&#xD;&#xA;                provides a mechanism to define the various     Factories&#xD;&#xA;                that comprise parts of the implementation of JavaServer&#xD;&#xA;                Faces.  For nested elements that are not specified, the&#xD;&#xA;                JSF     implementation must provide a suitable default. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="fromAction" upperBound="-2"
-        eType="#//FromActionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;from-action&quot; element contains an action reference expression&#xA;    that must have been executed (by the default ActionListener for handling&#xA;    application level events) in order to select this navigation rule.  If&#xA;    not specified, this rule will be relevant no matter which action reference&#xA;    was executed (or if no action reference was executed).&#xA;&#xA;    This value must be of type &quot;Action&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="from-action"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="fromOutcome" upperBound="-2"
-        eType="#//FromOutcomeType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;from-outcome&quot; element contains a logical outcome string returned&#xA;    by the execution of an application action method selected via an&#xA;    &quot;actionRef&quot; property (or a literal value specified by an &quot;action&quot;&#xA;    property) of a UICommand component.  If specified, this rule will be&#xA;    relevant only if the outcome value matches this element's value.  If&#xA;    not specified, this rule will be relevant no matter what the outcome&#xA;    value was."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="from-outcome"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="fromViewId" upperBound="-2"
-        eType="#//FromViewIdType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;from-view-id&quot; element contains the view identifier of the view&#xA;    for which the containing navigation rule is relevant.  If no&#xA;    &quot;from-view&quot; element is specified, this rule applies to navigation&#xA;    decisions on all views.  If this element is not specified, a value&#xA;    of &quot;*&quot; is assumed, meaning that this navigation rule applies to all&#xA;    views.&#xA;&#xA;    This value must be of type &quot;ViewIdPattern&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="from-view-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-2" eType="#//IconType"
-        volatile="true" transient="true" derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;icon&quot; element&#xD;&#xA;                contains &quot;small-icon&quot; and&#xD;&#xA;                &quot;large-icon&quot; elements that     specify the&#xD;&#xA;                resoruce paths for small and large GIF or JPG icon&#xD;&#xA;                images     used to represent the parent element in a GUI&#xD;&#xA;                tool. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="key" upperBound="-2" eType="#//KeyType"
-        volatile="true" transient="true" derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;key&quot; element is the String representation of a map key that&#xA;    will be stored in a managed property of type java.util.Map.  "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="key"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="keyClass" upperBound="-2"
-        eType="#//KeyClassType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;key-class&quot; element defines the Java type to which each &quot;key&quot;&#xA;    element in a set of &quot;map-entry&quot; elements will be converted to.  It&#xA;    must be of type &quot;ClassName&quot;.  If omitted, &quot;java.lang.String&quot;&#xA;    is assumed."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="key-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="largeIcon" upperBound="-2"
-        eType="#//LargeIconType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;large-icon&quot; element contains the resource path to a large (32x32)&#xA;    icon image.  The image may be in either GIF or JPG format."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="large-icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="lifecycle" upperBound="-2"
-        eType="#//LifecycleType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;lifecycle&quot; element&#xD;&#xA;                provides a mechanism to specify     modifications to the&#xD;&#xA;                behaviour of the default Lifecycle     implementation&#xD;&#xA;                for this web application. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="lifecycle"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="lifecycleFactory" upperBound="-2"
-        eType="#//LifecycleFactoryType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;lifecycle-factory&quot;&#xD;&#xA;                element contains the fully qualified class name     of&#xD;&#xA;                the concrete LifecycleFactory implementation class that&#xD;&#xA;                will be called     when&#xD;&#xA;                FactoryFinder.getFactory(LIFECYCLE_FACTORY) is called.&#xD;&#xA;                It must be      of type &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="lifecycle-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="listEntries" upperBound="-2"
-        eType="#//ListEntriesType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;list-entries&quot; element&#xD;&#xA;                represents a set of initialization     elements for a&#xD;&#xA;                managed property that is a java.util.List or an&#xD;&#xA;                array.  In the former case, the &quot;value-class&quot;&#xD;&#xA;                element can optionally     be used to declare the Java&#xD;&#xA;                type to which each value should be     converted before&#xD;&#xA;                adding it to the Collection. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="list-entries"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="localeConfig" upperBound="-2"
-        eType="#//LocaleConfigType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      The &quot;locale-config&quot;&#xD;&#xA;                element allows the app developer to declare the&#xD;&#xA;                supported locales for this application.   "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="locale-config"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBean" upperBound="-2"
-        eType="#//ManagedBeanType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;managed-bean&quot; element&#xD;&#xA;                represents a JavaBean, of a particular class,     that&#xD;&#xA;                will be dynamically instantiated at runtime (by the&#xD;&#xA;                default     VariableResolver implementation) if it is&#xD;&#xA;                referenced as the first element     of a value reference&#xD;&#xA;                expression, and no corresponding bean can be&#xD;&#xA;                identified in any scope.  In addition to the creation of&#xD;&#xA;                the managed bean,     and the optional storing of it&#xD;&#xA;                into the specified scope, the nested&#xD;&#xA;                managed-property elements can be used to initialize the&#xD;&#xA;                contents of     settable JavaBeans properties of the&#xD;&#xA;                created instance. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBeanClass" upperBound="-2"
-        eType="#//ManagedBeanClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;managed-bean-class&quot; element represents the fully qualified class&#xA;    name of the Java class that will be used to instantiate a new instance&#xA;    if creation of the specified managed bean is requested.  It must be of&#xA;    type &quot;ClassName&quot;.&#xA;&#xA;    The specified class must conform to standard JavaBeans conventions.&#xA;    In particular, it must have a public zero-arguments constructor, and&#xA;    zero or more public property setters."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBeanName" upperBound="-2"
-        eType="#//ManagedBeanNameType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;managed-bean-name&quot; element represents the attribute name under&#xA;    which a managed bean will be searched for, as well as stored (unless&#xA;    the &quot;managed-bean-scope&quot; value is &quot;none&quot;).  It must be of type&#xA;    &quot;Identifier&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBeanScope" upperBound="-2"
-        eType="#//ManagedBeanScopeType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;managed-bean-scope&quot; element represents the scope into which a newly&#xA;    created instance of the specified managed bean will be stored (unless&#xA;    the value is &quot;none&quot;).  It must be of type &quot;ScopeOrNone&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean-scope"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedProperty" upperBound="-2"
-        eType="#//ManagedPropertyType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;managed-property&quot;&#xD;&#xA;                element represents an individual property of a&#xD;&#xA;                managed bean that will be configured to the specified&#xD;&#xA;                value (or value set)     if the corresponding managed&#xD;&#xA;                bean is automatically created. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-property"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mapEntries" upperBound="-2"
-        eType="#//MapEntriesType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;map-entries' element&#xD;&#xA;                represents a set of key-entry pairs that     will be&#xD;&#xA;                added to the computed value of a managed property of&#xD;&#xA;                type     java.util.Map.  In addition, the Java class&#xD;&#xA;                types of the key and entry     values may be optionally&#xD;&#xA;                declared. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="map-entries"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mapEntry" upperBound="-2"
-        eType="#//MapEntryType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;map-entry&quot; element&#xD;&#xA;                reprsents a single key-entry pair that     will be added&#xD;&#xA;                to the computed value of a managed property of type&#xD;&#xA;                java.util.Map. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="map-entry"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="messageBundle" upperBound="-2"
-        eType="#//MessageBundleType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The base name of a resource bundle&#xD;&#xA;                representing the message resources     for this&#xD;&#xA;                application.  See the JavaDocs for the&#xD;&#xA;                &quot;java.util.ResourceBundle&quot;     class for more&#xD;&#xA;                information on the syntax of resource bundle names. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="message-bundle"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="navigationCase" upperBound="-2"
-        eType="#//NavigationCaseType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;navigation-case&quot;&#xD;&#xA;                element describes a particular combination of&#xD;&#xA;                conditions that must match for this case to be executed,&#xD;&#xA;                and the     view id of the component tree that should be&#xD;&#xA;                selected next. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="navigation-case"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="navigationHandler" upperBound="-2"
-        eType="#//NavigationHandlerType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;navigation-handler&quot;&#xD;&#xA;                element contains the fully qualified class name     of&#xD;&#xA;                the concrete NavigationHandler implementation class that&#xD;&#xA;                will be called     during the Invoke Application phase&#xD;&#xA;                of the request processing lifecycle,     if the default&#xD;&#xA;                ActionListener (provided by the JSF implementation) is&#xD;&#xA;                used.     It must be of type &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="navigation-handler"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="navigationRule" upperBound="-2"
-        eType="#//NavigationRuleType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;navigation-rule&quot;&#xD;&#xA;                element represents an individual decision rule     that&#xD;&#xA;                will be utilized by the default NavigationHandler&#xD;&#xA;                implementation to make decisions on what view should be&#xD;&#xA;                displayed     next, based on the view id being&#xD;&#xA;                processed. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="navigation-rule"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="nullValue" upperBound="-2"
-        eType="#//NullValueType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;null-value&quot; element&#xD;&#xA;                indicates that the managed property in which we     are&#xD;&#xA;                nested will be explicitly set to null if our managed&#xD;&#xA;                bean is     automatically created.  This is different&#xD;&#xA;                from omitting the managed     property element entirely,&#xD;&#xA;                which will cause no property setter to be     called for&#xD;&#xA;                this property.      The &quot;null-value&quot; element&#xD;&#xA;                can only be used when the associated&#xD;&#xA;                &quot;property-class&quot; identifies a Java class, not&#xD;&#xA;                a Java primitive. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="null-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="phaseListener" upperBound="-2"
-        eType="#//PhaseListenerType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=" The &quot;phase-listener&quot; element&#xD;&#xA;                contains the fully qualified class name of the concrete&#xD;&#xA;                PhaseListener implementation class that will be&#xD;&#xA;                registered on the Lifecycle. It must be of type&#xD;&#xA;                &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="phase-listener"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="property" upperBound="-2"
-        eType="#//PropertyType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;property&quot; element&#xD;&#xA;                represents a JavaBean property of the Java class&#xD;&#xA;                represented by our parent element.      Property names&#xD;&#xA;                must be unique within the scope of the Java class&#xD;&#xA;                that is represented by the parent element, and must&#xD;&#xA;                correspond to     property names that will be recognized&#xD;&#xA;                when performing introspection     against that class via&#xD;&#xA;                java.beans.Introspector. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyClass" upperBound="-2"
-        eType="#//PropertyClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;property-class&quot; element represents the Java type of the value&#xA;    associated with this property name.  It must be of type &quot;JavaType&quot;.&#xA;    If not specified, it can be inferred from existing classes; however,&#xA;    this element should be specified if the configuration file is going&#xA;    to be the source for generating the corresponding classes."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyExtension" upperBound="-2"
-        eType="#//PropertyExtensionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      Extension element for property.&#xD;&#xA;                May contain implementation     specific content. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyName" upperBound="-2"
-        eType="#//PropertyNameType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;property-name&quot; element represents the JavaBeans property name&#xA;    under which the corresponding value may be stored."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyResolver" upperBound="-2"
-        eType="#//PropertyResolverType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;property-resolver&quot;&#xD;&#xA;                element contains the fully qualified class name     of&#xD;&#xA;                the concrete PropertyResolver implementation class that&#xD;&#xA;                will be used     during the processing of value&#xD;&#xA;                reference expressions.     It must be of type&#xD;&#xA;                &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-resolver"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="redirect" upperBound="-2"
-        eType="#//RedirectType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;redirect&quot; element&#xD;&#xA;                indicates that navigation to the specified&#xD;&#xA;                &quot;to-view-id&quot; should be accomplished by&#xD;&#xA;                performing an HTTP redirect     rather than the usual&#xD;&#xA;                ViewHandler mechanisms. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="redirect"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referencedBean" upperBound="-2"
-        eType="#//ReferencedBeanType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;referenced-bean&quot;&#xD;&#xA;                element represents at design time the promise     that a&#xD;&#xA;                Java object of the specified type will exist at runtime&#xD;&#xA;                in some     scope, under the specified key.  This can be&#xD;&#xA;                used by design time tools     to construct user&#xD;&#xA;                interface dialogs based on the properties of the&#xD;&#xA;                specified class.  The presence or absence of a&#xD;&#xA;                referenced bean     element has no impact on the&#xD;&#xA;                JavaServer Faces runtime environment     inside a web&#xD;&#xA;                application. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="referenced-bean"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referencedBeanClass" upperBound="-2"
-        eType="#//ReferencedBeanClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;referenced-bean-class&quot; element represents the fully qualified class&#xA;    name of the Java class (either abstract or concrete) or Java interface&#xA;    implemented by the corresponding referenced bean.  It must be of type&#xA;    &quot;ClassName&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="referenced-bean-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referencedBeanName" upperBound="-2"
-        eType="#//ReferencedBeanNameType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;referenced-bean-name&quot; element represents the attribute name under&#xA;    which the corresponding referenced bean may be assumed to be stored,&#xA;    in one of the scopes defined by the &quot;Scope&quot; type.  It must be of type&#xA;    &quot;Identifier&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="referenced-bean-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderer" upperBound="-2"
-        eType="#//RendererType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;renderer&quot; element&#xD;&#xA;                represents a concrete Renderer implementation     class&#xD;&#xA;                that should be registered under the specified type&#xD;&#xA;                identifier,     in the RenderKit associated with the&#xD;&#xA;                parent render-kit element.  Renderer     types must be&#xD;&#xA;                unique within the RenderKit associated with the parent&#xD;&#xA;                &quot;render-kit&quot; element.      Nested&#xD;&#xA;                &quot;attribute&quot; elements identify generic&#xD;&#xA;                component attributes that     are recognized by this&#xD;&#xA;                renderer.  Nested &quot;supported-component-type&quot;&#xD;&#xA;                and     &quot;supported-component-class&quot; elements&#xD;&#xA;                identify supported component classes,     by their type&#xD;&#xA;                identifiers or the implementation class name,&#xD;&#xA;                respectively,     that are supported by this Renderer. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rendererClass" upperBound="-2"
-        eType="#//RendererClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;renderer-class&quot; element represents the fully qualified class name&#xA;    of a concrete Renderer implementation class.  It must be of&#xA;    type &quot;ClassName&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rendererExtension" upperBound="-2"
-        eType="#//RendererExtensionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      Extension element for renderer.&#xD;&#xA;                May contain implementation     specific content. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rendererType" upperBound="-2"
-        eType="#//RendererTypeType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;renderer-type&quot; element represents a renderer type identifier for the&#xA;    Renderer represented by the parent &quot;renderer&quot; element."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer-type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKit" upperBound="-2"
-        eType="#//RenderKitType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;render-kit&quot; element&#xD;&#xA;                represents a concrete RenderKit implementation     that&#xD;&#xA;                should be registered under the specified render-kit-id.&#xD;&#xA;                If no     render-kit-id is specified, the identifier of&#xD;&#xA;                the default RenderKit&#xD;&#xA;                (RenderKitFactory.DEFAULT_RENDER_KIT) is assumed. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKitClass" upperBound="-2"
-        eType="#//RenderKitClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;render-kit-class&quot; element represents the fully qualified class name&#xA;    of a concrete RenderKit implementation class.  It must be of&#xA;    type &quot;ClassName&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKitFactory" upperBound="-2"
-        eType="#//RenderKitFactoryType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;render-kit-factory&quot;&#xD;&#xA;                element contains the fully qualified class name     of&#xD;&#xA;                the concrete RenderKitFactory implementation class that&#xD;&#xA;                will be called     when&#xD;&#xA;                FactoryFinder.getFactory(RENDER_KIT_FACTORY) is called.&#xD;&#xA;                It must be      of type &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKitId" upperBound="-2"
-        eType="#//RenderKitIdType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;render-kit-id&quot; element represents an identifier for the&#xA;    RenderKit represented by the parent &quot;render-kit&quot; element."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="smallIcon" upperBound="-2"
-        eType="#//SmallIconType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;small-icon&quot; element contains the resource path to a small (16x16)&#xA;    icon image.  The image may be in either GIF or JPG format."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="small-icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="stateManager" upperBound="-2"
-        eType="#//StateManagerType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      The &quot;state-manager&quot;&#xD;&#xA;                element contains the fully qualified class name     of&#xD;&#xA;                the concrete StateManager implementation class that will&#xD;&#xA;                be called     during the Restore View and Render&#xD;&#xA;                Response phases of the request     processing lifecycle.&#xD;&#xA;                The faces implementation must provide a     default&#xD;&#xA;                implementation of this class "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="state-manager"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="suggestedValue" upperBound="-2"
-        eType="#//SuggestedValueType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;suggested-value&quot; contains the value for the property or&#xA;    attribute in which this element resides.  This value is advisory&#xA;    only and is intended for tools to use when populating pallettes."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="suggested-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="supportedLocale" upperBound="-2"
-        eType="#//SupportedLocaleType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      The &quot;supported-locale&quot;&#xD;&#xA;                element allows authors to declare which      locales are&#xD;&#xA;                supported in this application instance.       It must be&#xD;&#xA;                specified as :language:[_:country:[_:variant:]] without&#xD;&#xA;                the colons, for example &quot;ja_JP_SJIS&quot;.  The&#xD;&#xA;                separators between the      segments may be&#xD;&#xA;                '-' or '_'. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="supported-locale"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="toViewId" upperBound="-2"
-        eType="#//ToViewIdType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;to-view&quot; element contains the view identifier of the next view&#xA;    that should be displayed if this navigation rule is matched.  It&#xA;    must be of type &quot;ViewId&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="to-view-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validator" upperBound="-2"
-        eType="#//ValidatorType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;validator&quot; element&#xD;&#xA;                represents a concrete Validator implementation     class&#xD;&#xA;                that should be registered under the specified validator&#xD;&#xA;                identifier.     Validator identifiers must be unique&#xD;&#xA;                within the entire web application.      Nested&#xD;&#xA;                &quot;attribute&quot; elements identify generic&#xD;&#xA;                attributes that may be     configured on the&#xD;&#xA;                corresponding UIComponent in order to affect the&#xD;&#xA;                operation of the Validator.  Nested &quot;property&quot;&#xD;&#xA;                elements identify JavaBeans     properties of the&#xD;&#xA;                Validator implementation class that may be configured&#xD;&#xA;                to affect the operation of the Validator. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validatorClass" upperBound="-2"
-        eType="#//ValidatorClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;validator-class&quot; element represents the fully qualified class name&#xA;    of a concrete Validator implementation class.  It must be of&#xA;    type &quot;ClassName&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validatorId" upperBound="-2"
-        eType="#//ValidatorIdType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;validator-id&quot; element represents the identifier under which the&#xA;    corresponding Validator class should be registered."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="value" upperBound="-2"
-        eType="#//ValueType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;value&quot; element is the&#xD;&#xA;                String representation of a literal     value to which a&#xD;&#xA;                scalar managed property will be set, or a value&#xD;&#xA;                reference expression (&quot;#{...}&quot;) that will be&#xD;&#xA;                used to calculate the     required value.  It will be&#xD;&#xA;                converted as specified for the actual     property type. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="valueClass" upperBound="-2"
-        eType="#//ValueClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;value-class&quot; element defines the Java type to which each&#xA;    &quot;value&quot; element's value will be converted to, prior to adding it to&#xA;    the &quot;list-entries&quot; list for a managed property that is a&#xA;    java.util.List, or a &quot;map-entries&quot; map for a managed property that&#xA;    is a java.util.Map.  It must be of type &quot;ClassName&quot;.  If omitted,&#xA;    &quot;java.lang.String&quot; is assumed."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="variableResolver" upperBound="-2"
-        eType="#//VariableResolverType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;variable-resolver&quot;&#xD;&#xA;                element contains the fully qualified class name     of&#xD;&#xA;                the concrete VariableResolver implementation class that&#xD;&#xA;                will be used     during the processing of value&#xD;&#xA;                reference expressions.     It must be of type&#xD;&#xA;                &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="variable-resolver"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="viewHandler" upperBound="-2"
-        eType="#//ViewHandlerType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      The &quot;view-handler&quot;&#xD;&#xA;                element contains the fully qualified class name     of&#xD;&#xA;                the concrete ViewHandler implementation class that will&#xD;&#xA;                be called     during the Restore View and Render&#xD;&#xA;                Response phases of the request     processing lifecycle.&#xD;&#xA;                The faces implementation must provide a     default&#xD;&#xA;                implementation of this class "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="view-handler"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DynamicAttribute">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DynamicElement">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="childNodes" upperBound="-1"
-        eType="#//DynamicElement" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributes" upperBound="-1"
-        eType="#//DynamicAttribute"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ELResolverType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="el-resolver_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ExtensionType" abstract="true">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="childNodes" upperBound="-1"
-        eType="#//DynamicElement"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FacesConfigType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="faces-config_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="application" upperBound="-1"
-        eType="#//ApplicationType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="application"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="factory" upperBound="-1"
-        eType="#//FactoryType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="component" upperBound="-1"
-        eType="#//ComponentType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converter" upperBound="-1"
-        eType="#//ConverterType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBean" upperBound="-1"
-        eType="#//ManagedBeanType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="navigationRule" upperBound="-1"
-        eType="#//NavigationRuleType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="navigation-rule"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referencedBean" upperBound="-1"
-        eType="#//ReferencedBeanType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="referenced-bean"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKit" upperBound="-1"
-        eType="#//RenderKitType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="lifecycle" upperBound="-1"
-        eType="#//LifecycleType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="lifecycle"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validator" upperBound="-1"
-        eType="#//ValidatorType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facesConfigExtension" upperBound="-1"
-        eType="#//FacesConfigExtensionType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="faces-config-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="xmlns" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        defaultValueLiteral="http://java.sun.com/JSF/Configuration" unsettable="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="xmlns"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FacesConfigExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="faces-config-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FacesContextFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="faces-context-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FacetExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facet-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FacetNameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facet-name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FacetType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facet_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facetName" lowerBound="1"
-        eType="#//FacetNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="facet-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facetExtension" upperBound="-1"
-        eType="#//FacetExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="facet-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="factory_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="applicationFactory" upperBound="-1"
-        eType="#//ApplicationFactoryType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="application-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facesContextFactory" upperBound="-1"
-        eType="#//FacesContextFactoryType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="faces-context-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="lifecycleFactory" upperBound="-1"
-        eType="#//LifecycleFactoryType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="lifecycle-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKitFactory" upperBound="-1"
-        eType="#//RenderKitFactoryType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="factoryExtension" upperBound="-1"
-        eType="#//FactoryExtensionType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="factory-type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FactoryExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="factory-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FromActionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="from-action_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FromOutcomeType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="from-outcome_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FromViewIdType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="from-view-id_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IconType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="icon_._type"/>
-      <details key="kind" value="empty"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="smallIcon" eType="#//SmallIconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="small-icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="largeIcon" eType="#//LargeIconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="large-icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lang" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Language">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="lang"/>
-        <details key="namespace" value="http://www.w3.org/XML/1998/namespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="KeyClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="key-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="KeyType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="key_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="LargeIconType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="large-icon_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="LifecycleFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="lifecycle-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="LifecycleType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="lifecycle_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="phaseListener" upperBound="-1"
-        eType="#//PhaseListenerType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="phase-listener"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="lifecycleExtension" upperBound="-1"
-        eType="#//LifecycleExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="lifecycle-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="LifecycleExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="lifecycle-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ListEntriesType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="list-entries_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="valueClass" eType="#//ValueClassType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="nullValue" upperBound="-1"
-        eType="#//NullValueType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="null-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="value" upperBound="-1"
-        eType="#//ValueType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="LocaleConfigType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="locale-config_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultLocale" eType="#//DefaultLocaleType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-locale"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="supportedLocale" upperBound="-1"
-        eType="#//SupportedLocaleType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="supported-locale"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ManagedBeanClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="managed-bean-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ManagedBeanNameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="managed-bean-name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ManagedBeanScopeType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="managed-bean-scope_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ManagedBeanType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="managed-bean_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBeanName" lowerBound="1"
-        eType="#//ManagedBeanNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBeanClass" lowerBound="1"
-        eType="#//ManagedBeanClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBeanScope" lowerBound="1"
-        eType="#//ManagedBeanScopeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean-scope"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedProperty" upperBound="-1"
-        eType="#//ManagedPropertyType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-property"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mapEntries" eType="#//MapEntriesType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="map-entries"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="listEntries" eType="#//ListEntriesType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="list-entries"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBeanExtension" upperBound="-1"
-        eType="#//ManagedBeanExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ManagedBeanExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="managed-bean-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ManagedPropertyType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="managed-property_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyName" lowerBound="1"
-        eType="#//PropertyNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyClass" eType="#//PropertyClassType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mapEntries" eType="#//MapEntriesType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="map-entries"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="nullValue" eType="#//NullValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="null-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="value" eType="#//ValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="listEntries" eType="#//ListEntriesType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="list-entries"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MapEntriesType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="map-entries_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="keyClass" eType="#//KeyClassType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="key-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="valueClass" eType="#//ValueClassType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mapEntry" upperBound="-1"
-        eType="#//MapEntryType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="map-entry"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MapEntryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="map-entry_._type"/>
-      <details key="kind" value="empty"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="key" lowerBound="1" eType="#//KeyType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="key"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="nullValue" eType="#//NullValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="null-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="value" eType="#//ValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MessageBundleType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="message-bundle_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NavigationCaseType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="navigation-case_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="fromAction" eType="#//FromActionType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="from-action"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="fromOutcome" eType="#//FromOutcomeType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="from-outcome"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="toViewId" lowerBound="1"
-        eType="#//ToViewIdType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="to-view-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="redirect" eType="#//RedirectType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="redirect"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NavigationHandlerType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="navigation-handler_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NavigationRuleType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="navigation-rule_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="fromViewId" eType="#//FromViewIdType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="from-view-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="navigationCase" upperBound="-1"
-        eType="#//NavigationCaseType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="navigation-case"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="navigationRuleExtension"
-        upperBound="-1" eType="#//NavigationRuleExtensionType" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="navigation-rule-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NavigationRuleExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="navigation-rule-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NullValueType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="null-value_._type"/>
-      <details key="kind" value="empty"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PhaseListenerType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="phase-listener_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PropertyClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="property-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PropertyExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="property-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PropertyNameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="property-name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PropertyResolverType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="property-resolver_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PropertyType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="property_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyName" lowerBound="1"
-        eType="#//PropertyNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyClass" lowerBound="1"
-        eType="#//PropertyClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultValue" eType="#//DefaultValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="suggestedValue" eType="#//SuggestedValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="suggested-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyExtension" upperBound="-1"
-        eType="#//PropertyExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RedirectType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="redirect_._type"/>
-      <details key="kind" value="empty"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ReferencedBeanClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="referenced-bean-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ReferencedBeanNameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="referenced-bean-name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ReferencedBeanType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="referenced-bean_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referencedBeanName" lowerBound="1"
-        eType="#//ReferencedBeanNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="referenced-bean-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referencedBeanClass" lowerBound="1"
-        eType="#//ReferencedBeanClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="referenced-bean-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RendererClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="renderer-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RendererExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="renderer-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RendererType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="renderer_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentFamily" lowerBound="1"
-        eType="#//ComponentFamilyType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-family"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rendererType" lowerBound="1"
-        eType="#//RendererTypeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer-type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rendererClass" lowerBound="1"
-        eType="#//RendererClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facet" upperBound="-1"
-        eType="#//FacetType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="facet"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attribute" upperBound="-1"
-        eType="#//AttributeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rendererExtension" upperBound="-1"
-        eType="#//RendererExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RendererTypeType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="renderer-type_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RenderKitClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="render-kit-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RenderKitFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="render-kit-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RenderKitIdType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="render-kit-id_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RenderKitType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="render-kit_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKitId" eType="#//RenderKitIdType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKitClass" eType="#//RenderKitClassType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderer" upperBound="-1"
-        eType="#//RendererType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKitExtension" upperBound="-1"
-        eType="#//RenderKitExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RenderKitExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="render-kit-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SmallIconType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="small-icon_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="StateManagerType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="state-manager_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SuggestedValueType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="suggested-value_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SupportedLocaleType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="supported-locale_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ToViewIdType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="to-view-id_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ValidatorClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="validator-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ValidatorIdType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="validator-id_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ValidatorType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="validator_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validatorId" lowerBound="1"
-        eType="#//ValidatorIdType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validatorClass" lowerBound="1"
-        eType="#//ValidatorClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attribute" upperBound="-1"
-        eType="#//AttributeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="property" upperBound="-1"
-        eType="#//PropertyType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validatorExtension" upperBound="-1"
-        eType="#//ValidatorExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ValidatorExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="validator-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ValueClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="value-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ValueType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="value_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="VariableResolverType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="variable-resolver_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ViewHandlerType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="view-handler_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ResourceBundleType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="resourceBundle_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="baseName" eType="#//BaseNameType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="base-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="var" eType="#//VarType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="var"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="BaseNameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="base-name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="VarType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="var_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/facesConfig.genmodel b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/facesConfig.genmodel
deleted file mode 100644
index aece538..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/facesConfig.genmodel
+++ /dev/null
@@ -1,576 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright (c) 2005, 2006 IBM Corporation and others"
-    modelDirectory="/org.eclipse.jst.jsf.facesconfig/facesconfig" editDirectory="/org.eclipse.jst.jsf.facesconfig/facesconfig"
-    editorDirectory="/org.eclipse.jst.jsf.facesconfig.editor/src" modelPluginID="org.eclipse.jst.jsf.facesconfig"
-    templateDirectory="org.eclipse.jst.jsf.facesconfig/model/templates" dynamicTemplates="true"
-    redirection="" modelName="FacesConfig" modelPluginClass="" editPluginClass="org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin"
-    editorPluginClass="org.eclipse.jst.jsf.facesconfig.emf.presentation.FacesConfigEditorPlugin"
-    rootImplementsInterface="" featureMapWrapperInterface="" featureMapWrapperInternalInterface=""
-    featureMapWrapperClass="" testSuiteClass="org.eclipse.jst.jsf.facesconfig.emf.tests.FacesConfigAllTests"
-    booleanFlagsField="">
-  <foreignModel>../../../com.ibm.etools.jsf/facesConfig.xsd</foreignModel>
-  <genPackages prefix="FacesConfig" basePackage="org.eclipse.jst.jsf" disposableProviderFactory="true"
-      interfacePackageSuffix="emf" metaDataPackageSuffix="emf" classPackageSuffix="emf.impl"
-      utilityPackageSuffix="emf.util" providerPackageSuffix="edit.provider" presentationPackageSuffix="emf.presentation"
-      testsPackageSuffix="emf.tests" ecorePackage="FacesConfig.ecore#/">
-    <genClasses ecoreClass="FacesConfig.ecore#//ActionListenerType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ActionListenerType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ActionListenerType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ApplicationFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ApplicationFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ApplicationFactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ApplicationType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/actionListener"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/defaultRenderKitId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/messageBundle"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/navigationHandler"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/viewHandler"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/stateManager"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/propertyResolver"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/variableResolver"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/localeConfig"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ApplicationType/id"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/eLResolver"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/resourceBundle"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/applicationExtension"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//AttributeClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//AttributeClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//AttributeClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//AttributeExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//AttributeNameType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//AttributeNameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//AttributeNameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//AttributeType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/attributeName"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/attributeClass"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/defaultValue"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/suggestedValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/attributeExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//AttributeType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ComponentClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ComponentClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ComponentClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ComponentExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//ComponentFamilyType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ComponentFamilyType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ComponentFamilyType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ComponentType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/componentType"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/componentClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/facet"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/attribute"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/property"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/componentExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ComponentType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ComponentTypeType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ComponentTypeType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ComponentTypeType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ConverterClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ConverterClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ConverterClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ConverterForClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ConverterForClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ConverterForClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ConverterIdType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ConverterIdType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ConverterIdType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ConverterType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/icon"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/converterId"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/converterForClass"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/converterClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/attribute"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/property"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/converterExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ConverterType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DefaultLocaleType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DefaultLocaleType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DefaultLocaleType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DefaultRenderKitIdType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DefaultRenderKitIdType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DefaultRenderKitIdType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DefaultValueType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DefaultValueType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DefaultValueType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DescriptionType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DescriptionType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DescriptionType/lang"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DescriptionType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DisplayNameType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DisplayNameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DisplayNameType/lang"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DisplayNameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DocumentRoot">
-      <genFeatures property="None" children="true" createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DocumentRoot/mixed"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/xMLNSPrefixMap"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/xSISchemaLocation"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/actionListener"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/application"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/applicationFactory"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/attribute"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/attributeClass"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/attributeExtension"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/attributeName"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/component"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/componentClass"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/componentExtension"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/componentFamily"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/componentType"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/converter"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/converterClass"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/converterForClass"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/converterId"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/defaultLocale"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/defaultRenderKitId"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/defaultValue"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/description"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/displayName"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/facesConfig"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/facesContextFactory"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/facet"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/facetExtension"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/facetName"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/factory"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/fromAction"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/fromOutcome"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/fromViewId"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/icon"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/key"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/keyClass"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/largeIcon"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/lifecycle"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/lifecycleFactory"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/listEntries"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/localeConfig"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/managedBean"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/managedBeanClass"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/managedBeanName"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/managedBeanScope"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/managedProperty"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/mapEntries"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/mapEntry"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/messageBundle"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/navigationCase"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/navigationHandler"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/navigationRule"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/nullValue"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/phaseListener"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/property"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/propertyClass"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/propertyExtension"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/propertyName"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/propertyResolver"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/redirect"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/referencedBean"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/referencedBeanClass"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/referencedBeanName"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/renderer"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/rendererClass"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/rendererExtension"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/rendererType"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/renderKit"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/renderKitClass"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/renderKitFactory"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/renderKitId"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/smallIcon"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/stateManager"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/suggestedValue"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/supportedLocale"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/toViewId"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/validator"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/validatorClass"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/validatorId"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/value"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/valueClass"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/variableResolver"/>
-      <genFeatures property="None" notify="false" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/viewHandler"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DynamicAttribute">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DynamicAttribute/name"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DynamicAttribute/value"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DynamicElement">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DynamicElement/childNodes"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DynamicElement/name"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DynamicElement/attributes"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DynamicElement/textContent"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FacesConfigType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/application"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/factory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/component"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/converter"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/managedBean"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/navigationRule"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/referencedBean"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/renderKit"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/lifecycle"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/validator"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/facesConfigExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacesConfigType/xmlns"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacesConfigType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FacesContextFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacesContextFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacesContextFactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FacetExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//FacetNameType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacetNameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacetNameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FacetType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacetType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacetType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacetType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacetType/facetName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacetType/facetExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacetType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FactoryType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/applicationFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/facesContextFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/lifecycleFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/renderKitFactory"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/factoryExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FromActionType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FromActionType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FromActionType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FromOutcomeType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FromOutcomeType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FromOutcomeType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FromViewIdType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FromViewIdType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FromViewIdType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//IconType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//IconType/smallIcon"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//IconType/largeIcon"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//IconType/lang"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//IconType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//KeyClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//KeyClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//KeyClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//KeyType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//KeyType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//KeyType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//LargeIconType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//LargeIconType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//LargeIconType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//LifecycleFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//LifecycleFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//LifecycleFactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//LifecycleType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//LifecycleType/phaseListener"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//LifecycleType/lifecycleExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//LifecycleType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ListEntriesType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ListEntriesType/valueClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ListEntriesType/nullValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ListEntriesType/value"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ListEntriesType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//LocaleConfigType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//LocaleConfigType/defaultLocale"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//LocaleConfigType/supportedLocale"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//LocaleConfigType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ManagedBeanClassType" labelFeature="#//facesconfig/ManagedBeanClassType/textContent">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ManagedBeanNameType" labelFeature="#//facesconfig/ManagedBeanNameType/textContent">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanNameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanNameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ManagedBeanScopeType" labelFeature="#//facesconfig/ManagedBeanScopeType/textContent">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanScopeType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanScopeType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ManagedBeanType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/icon"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/managedBeanName"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/managedBeanClass"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/managedBeanScope"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/managedProperty"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/mapEntries"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/listEntries"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/managedBeanExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ManagedPropertyType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/icon"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/propertyName"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/propertyClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/mapEntries"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/nullValue"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/value"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/listEntries"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedPropertyType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//MapEntriesType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//MapEntriesType/keyClass"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//MapEntriesType/valueClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//MapEntriesType/mapEntry"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//MapEntriesType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//MapEntryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//MapEntryType/key"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//MapEntryType/nullValue"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//MapEntryType/value"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//MapEntryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//MessageBundleType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//MessageBundleType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//MessageBundleType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//NavigationCaseType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/icon"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/fromAction"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/fromOutcome"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/toViewId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/redirect"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//NavigationCaseType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//NavigationHandlerType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//NavigationHandlerType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//NavigationHandlerType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//NavigationRuleType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationRuleType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationRuleType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationRuleType/icon"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationRuleType/fromViewId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationRuleType/navigationCase"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationRuleType/navigationRuleExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//NavigationRuleType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//NullValueType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//NullValueType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//PhaseListenerType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PhaseListenerType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PhaseListenerType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//PropertyClassType" labelFeature="#//facesconfig/PropertyClassType/textContent">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PropertyClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PropertyClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//PropertyExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//PropertyNameType" labelFeature="#//facesconfig/PropertyNameType/textContent">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PropertyNameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PropertyNameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//PropertyResolverType" labelFeature="#//facesconfig/PropertyResolverType/textContent">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PropertyResolverType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PropertyResolverType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//PropertyType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/icon"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/propertyName"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/propertyClass"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/defaultValue"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/suggestedValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/propertyExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PropertyType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RedirectType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RedirectType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ReferencedBeanClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ReferencedBeanClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ReferencedBeanClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ReferencedBeanNameType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ReferencedBeanNameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ReferencedBeanNameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ReferencedBeanType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ReferencedBeanType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ReferencedBeanType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ReferencedBeanType/icon"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ReferencedBeanType/referencedBeanName"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ReferencedBeanType/referencedBeanClass"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ReferencedBeanType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RendererClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RendererClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RendererClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RendererExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//RendererType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/icon"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/componentFamily"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/rendererType"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/rendererClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/facet"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/attribute"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/rendererExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RendererType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RendererTypeType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RendererTypeType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RendererTypeType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RenderKitClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RenderKitClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RenderKitClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RenderKitFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RenderKitFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RenderKitFactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RenderKitIdType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RenderKitIdType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RenderKitIdType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RenderKitType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/icon"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/renderKitId"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/renderKitClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/renderer"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/renderKitExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RenderKitType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//SmallIconType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SmallIconType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SmallIconType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//StateManagerType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//StateManagerType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//StateManagerType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//SuggestedValueType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SuggestedValueType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SuggestedValueType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//SupportedLocaleType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SupportedLocaleType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SupportedLocaleType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ToViewIdType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ToViewIdType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ToViewIdType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ValidatorClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValidatorClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValidatorClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ValidatorIdType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValidatorIdType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValidatorIdType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ValidatorType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/icon"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/validatorId"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/validatorClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/attribute"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/property"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/validatorExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValidatorType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ValueClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValueClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValueClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ValueType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValueType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValueType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//VariableResolverType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//VariableResolverType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//VariableResolverType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ViewHandlerType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ViewHandlerType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ViewHandlerType/id"/>
-    </genClasses>
-    <genClasses image="false" ecoreClass="FacesConfig.ecore#//ExtensionType">
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ExtensionType/childNodes"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ExtensionType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ExtensionType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ApplicationExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//ConverterExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//ELResolverType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ELResolverType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ELResolverType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FacesConfigExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//FactoryExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//LifecycleExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//ManagedBeanExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//NavigationRuleExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//RenderKitExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//ValidatorExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//ResourceBundleType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ResourceBundleType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ResourceBundleType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ResourceBundleType/icon"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ResourceBundleType/baseName"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ResourceBundleType/var"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ResourceBundleType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//BaseNameType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//BaseNameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//BaseNameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//VarType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//VarType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//VarType/id"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/templates/Header.javajetinc b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/templates/Header.javajetinc
deleted file mode 100644
index 8612b81..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/templates/Header.javajetinc
+++ /dev/null
@@ -1,11 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/plugin.properties
deleted file mode 100644
index ba4d9e7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/plugin.properties
+++ /dev/null
@@ -1,555 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-###############################################################################
-plugin.name = JavaServer Faces Tools - FacesConfig Model
-plugin.provider=Eclipse.org
-
-################
-# Content Type #
-################
-
-facesconfig.name = Faces Configuration File
-
-###########
-# Editors #
-###########
-
-facesconfig.editor.name = Faces Configuration File Editor
-OVERVIEW_PAGE_NAME = Overview
-APPLICATION_PAGE_NAME = Application
-FACTORY_PAGE_NAME = Factory
-COMPONENT_PAGE_NAME = Component
-CONVERTER_PAGE_NAME = Converter
-MANAGEDBEAN_PAGE_NAME = Managed Bean
-NAVIGATIONRULE_PAGE_NAME = Navigation Rule
-REFERENCEDBEAN_PAGE_NAME = Referenced Bean
-RENDERKIT_PAGE_NAME = RederKit
-LIFECYCLE_PAGE_NAME = Lifecycle
-VALIDATOR_PAGE_NAME = Validator
-SOURCE_PAGE_NAME = Source
-
-
-facesValidation.name = Faces Configuration File Validator
-# ====================================================================
-
-_UI_CreateChild_text = {0}
-_UI_CreateChild_text2 = {1} {0}
-_UI_CreateChild_text3 = {1}
-_UI_CreateChild_tooltip = Create New {0} Under {1} Feature
-_UI_CreateChild_description = Create a new child of type {0} for the {1} feature of the selected {2}.
-_UI_CreateSibling_description = Create a new sibling of type {0} for the selected {2}, under the {1} feature of their parent.
-
-_UI_PropertyDescriptor_description = The {0} of the {1}
-
-_UI_ActionListenerType_type = Action Listener Type
-_UI_ApplicationFactoryType_type = Application Factory Type
-_UI_ApplicationType_type = Application Type
-_UI_AttributeClassType_type = Attribute Class Type
-_UI_AttributeExtensionType_type = Attribute Extension Type
-_UI_AttributeNameType_type = Attribute Name Type
-_UI_AttributeType_type = Attribute Type
-_UI_ComponentClassType_type = Component Class Type
-_UI_ComponentExtensionType_type = Component Extension Type
-_UI_ComponentFamilyType_type = Component Family Type
-_UI_ComponentType_type = Component
-_UI_ComponentTypeType_type = Component Type Type
-_UI_ConverterClassType_type = Converter Class Type
-_UI_ConverterForClassType_type = Converter For Class Type
-_UI_ConverterIdType_type = Converter Id Type
-_UI_ConverterType_type = Converter
-_UI_DefaultLocaleType_type = Default Locale Type
-_UI_DefaultRenderKitIdType_type = Default Render Kit Id Type
-_UI_DefaultValueType_type = Default Value Type
-_UI_DescriptionType_type = Description Type
-_UI_DisplayNameType_type = Display Name Type
-_UI_DocumentRoot_type = Document Root
-_UI_FacesConfigType_type = Type
-_UI_FacesContextFactoryType_type = Faces Context Factory Type
-_UI_FacetExtensionType_type = Facet Extension Type
-_UI_FacetNameType_type = Facet Name Type
-_UI_FacetType_type = Facet Type
-_UI_FactoryType_type = Factory Type
-_UI_FromActionType_type = From Action Type
-_UI_FromOutcomeType_type = From Outcome Type
-_UI_FromViewIdType_type = From View Id Type
-_UI_IconType_type = Icon Type
-_UI_KeyClassType_type = Key Class Type
-_UI_KeyType_type = Key Type
-_UI_LargeIconType_type = Large Icon Type
-_UI_LifecycleFactoryType_type = Lifecycle Factory Type
-_UI_LifecycleType_type = Lifecycle Type
-_UI_ListEntriesType_type = List Entries Type
-_UI_LocaleConfigType_type = Locale Config Type
-_UI_ManagedBeanClassType_type = Managed Bean Class Type
-_UI_ManagedBeanNameType_type = Managed Bean Name Type
-_UI_ManagedBeanScopeType_type = Managed Bean Scope Type
-_UI_ManagedBeanType_type = Managed Bean Type
-_UI_ManagedPropertyType_type = Managed Property Type
-_UI_MapEntriesType_type = Map Entries Type
-_UI_MapEntryType_type = Map Entry Type
-_UI_MessageBundleType_type = Message Bundle Type
-_UI_NavigationCaseType_type = Navigation Case Type
-_UI_NavigationHandlerType_type = Navigation Handler Type
-_UI_NavigationRuleType_type = Navigation Rule Type
-_UI_NullValueType_type = Null Value Type
-_UI_PhaseListenerType_type = Phase Listener Type
-_UI_PropertyClassType_type = Property Class Type
-_UI_PropertyExtensionType_type = Property Extension Type
-_UI_PropertyNameType_type = Property Name Type
-_UI_PropertyResolverType_type = Property Resolver Type
-_UI_PropertyType_type = Property Type
-_UI_RedirectType_type = Redirect Type
-_UI_ReferencedBeanClassType_type = Referenced Bean Class Type
-_UI_ReferencedBeanNameType_type = Referenced Bean Name Type
-_UI_ReferencedBeanType_type = Referenced Bean Type
-_UI_RendererClassType_type = Renderer Class Type
-_UI_RendererExtensionType_type = Renderer Extension Type
-_UI_RendererType_type = Renderer Type
-_UI_RendererTypeType_type = Renderer Type Type
-_UI_RenderKitClassType_type = Render Kit Class Type
-_UI_RenderKitFactoryType_type = Render Kit Factory Type
-_UI_RenderKitIdType_type = Render Kit Id Type
-_UI_RenderKitType_type = Render Kit
-_UI_SmallIconType_type = Small Icon Type
-_UI_StateManagerType_type = State Manager Type
-_UI_SuggestedValueType_type = Suggested Value Type
-_UI_SupportedLocaleType_type = Supported Locale Type
-_UI_ToViewIdType_type = To View Id Type
-_UI_ValidatorClassType_type = Validator Class Type
-_UI_ValidatorIdType_type = Validator Id Type
-_UI_ValidatorType_type = Validator
-_UI_ValueClassType_type = Value Class Type
-_UI_ValueType_type = Value Type
-_UI_VariableResolverType_type = Variable Resolver Type
-_UI_ViewHandlerType_type = View Handler Type
-_UI_Unknown_type = Object
-
-_UI_Unknown_datatype= Value
-
-_UI_ActionListenerType_textContent_feature = Text Content
-_UI_ActionListenerType_id_feature = Id
-_UI_ApplicationFactoryType_textContent_feature = Text Content
-_UI_ApplicationFactoryType_id_feature = Id
-_UI_ApplicationType_actionListener_feature = Action Listener
-_UI_ApplicationType_defaultRenderKitId_feature = Default Render Kit Id
-_UI_ApplicationType_messageBundle_feature = Message Bundle
-_UI_ApplicationType_navigationHandler_feature = Navigation Handler
-_UI_ApplicationType_viewHandler_feature = View Handler
-_UI_ApplicationType_stateManager_feature = State Manager
-_UI_ApplicationType_propertyResolver_feature = Property Resolver
-_UI_ApplicationType_variableResolver_feature = Variable Resolver
-_UI_ApplicationType_localeConfig_feature = Locale Config
-_UI_ApplicationType_id_feature = Id
-_UI_AttributeClassType_textContent_feature = Text Content
-_UI_AttributeClassType_id_feature = Id
-_UI_AttributeExtensionType_mixed_feature = Mixed
-_UI_AttributeExtensionType_group_feature = Group
-_UI_AttributeExtensionType_any_feature = Any
-_UI_AttributeExtensionType_id_feature = Id
-_UI_AttributeNameType_textContent_feature = Text Content
-_UI_AttributeNameType_id_feature = Id
-_UI_AttributeType_description_feature = Description
-_UI_AttributeType_displayName_feature = Display Name
-_UI_AttributeType_icon_feature = Icon
-_UI_AttributeType_attributeName_feature = Attribute Name
-_UI_AttributeType_attributeClass_feature = Attribute Class
-_UI_AttributeType_defaultValue_feature = Default Value
-_UI_AttributeType_suggestedValue_feature = Suggested Value
-_UI_AttributeType_attributeExtension_feature = Attribute Extension
-_UI_AttributeType_id_feature = Id
-_UI_ComponentClassType_textContent_feature = Text Content
-_UI_ComponentClassType_id_feature = Id
-_UI_ComponentExtensionType_mixed_feature = Mixed
-_UI_ComponentExtensionType_group_feature = Group
-_UI_ComponentExtensionType_any_feature = Any
-_UI_ComponentExtensionType_id_feature = Id
-_UI_ComponentFamilyType_textContent_feature = Text Content
-_UI_ComponentFamilyType_id_feature = Id
-_UI_ComponentType_description_feature = Description
-_UI_ComponentType_displayName_feature = Display Name
-_UI_ComponentType_icon_feature = Icon
-_UI_ComponentType_componentType_feature = Component Type
-_UI_ComponentType_componentClass_feature = Component Class
-_UI_ComponentType_facet_feature = Facet
-_UI_ComponentType_attribute_feature = Attribute
-_UI_ComponentType_property_feature = Property
-_UI_ComponentType_componentExtension_feature = Component Extension
-_UI_ComponentType_id_feature = Id
-_UI_ComponentTypeType_textContent_feature = Text Content
-_UI_ComponentTypeType_id_feature = Id
-_UI_ConverterClassType_textContent_feature = Text Content
-_UI_ConverterClassType_id_feature = Id
-_UI_ConverterForClassType_textContent_feature = Text Content
-_UI_ConverterForClassType_id_feature = Id
-_UI_ConverterIdType_textContent_feature = Text Content
-_UI_ConverterIdType_id_feature = Id
-_UI_ConverterType_description_feature = Description
-_UI_ConverterType_displayName_feature = Display Name
-_UI_ConverterType_icon_feature = Icon
-_UI_ConverterType_converterId_feature = Converter Id
-_UI_ConverterType_converterForClass_feature = Converter For Class
-_UI_ConverterType_converterClass_feature = Converter Class
-_UI_ConverterType_attribute_feature = Attribute
-_UI_ConverterType_property_feature = Property
-_UI_ConverterType_id_feature = Id
-_UI_DefaultLocaleType_textContent_feature = Text Content
-_UI_DefaultLocaleType_id_feature = Id
-_UI_DefaultRenderKitIdType_textContent_feature = Text Content
-_UI_DefaultRenderKitIdType_id_feature = Id
-_UI_DefaultValueType_textContent_feature = Text Content
-_UI_DefaultValueType_id_feature = Id
-_UI_DescriptionType_textContent_feature = Text Content
-_UI_DescriptionType_lang_feature = Lang
-_UI_DescriptionType_id_feature = Id
-_UI_DisplayNameType_textContent_feature = Text Content
-_UI_DisplayNameType_lang_feature = Lang
-_UI_DisplayNameType_id_feature = Id
-_UI_DocumentRoot_mixed_feature = Mixed
-_UI_DocumentRoot_xMLNSPrefixMap_feature = XMLNS Prefix Map
-_UI_DocumentRoot_xSISchemaLocation_feature = XSI Schema Location
-_UI_DocumentRoot_actionListener_feature = Action Listener
-_UI_DocumentRoot_application_feature = Application
-_UI_DocumentRoot_applicationFactory_feature = Application Factory
-_UI_DocumentRoot_attribute_feature = Attribute
-_UI_DocumentRoot_attributeClass_feature = Attribute Class
-_UI_DocumentRoot_attributeExtension_feature = Attribute Extension
-_UI_DocumentRoot_attributeName_feature = Attribute Name
-_UI_DocumentRoot_component_feature = Component
-_UI_DocumentRoot_componentClass_feature = Component Class
-_UI_DocumentRoot_componentExtension_feature = Component Extension
-_UI_DocumentRoot_componentFamily_feature = Component Family
-_UI_DocumentRoot_componentType_feature = Component Type
-_UI_DocumentRoot_converter_feature = Converter
-_UI_DocumentRoot_converterClass_feature = Converter Class
-_UI_DocumentRoot_converterForClass_feature = Converter For Class
-_UI_DocumentRoot_converterId_feature = Converter Id
-_UI_DocumentRoot_defaultLocale_feature = Default Locale
-_UI_DocumentRoot_defaultRenderKitId_feature = Default Render Kit Id
-_UI_DocumentRoot_defaultValue_feature = Default Value
-_UI_DocumentRoot_description_feature = Description
-_UI_DocumentRoot_displayName_feature = Display Name
-_UI_DocumentRoot_facesConfig_feature = Faces Config
-_UI_DocumentRoot_facesContextFactory_feature = Faces Context Factory
-_UI_DocumentRoot_facet_feature = Facet
-_UI_DocumentRoot_facetExtension_feature = Facet Extension
-_UI_DocumentRoot_facetName_feature = Facet Name
-_UI_DocumentRoot_factory_feature = Factory
-_UI_DocumentRoot_fromAction_feature = From Action
-_UI_DocumentRoot_fromOutcome_feature = From Outcome
-_UI_DocumentRoot_fromViewId_feature = From View Id
-_UI_DocumentRoot_icon_feature = Icon
-_UI_DocumentRoot_key_feature = Key
-_UI_DocumentRoot_keyClass_feature = Key Class
-_UI_DocumentRoot_largeIcon_feature = Large Icon
-_UI_DocumentRoot_lifecycle_feature = Lifecycle
-_UI_DocumentRoot_lifecycleFactory_feature = Lifecycle Factory
-_UI_DocumentRoot_listEntries_feature = List Entries
-_UI_DocumentRoot_localeConfig_feature = Locale Config
-_UI_DocumentRoot_managedBean_feature = Managed Bean
-_UI_DocumentRoot_managedBeanClass_feature = Managed Bean Class
-_UI_DocumentRoot_managedBeanName_feature = Managed Bean Name
-_UI_DocumentRoot_managedBeanScope_feature = Managed Bean Scope
-_UI_DocumentRoot_managedProperty_feature = Managed Property
-_UI_DocumentRoot_mapEntries_feature = Map Entries
-_UI_DocumentRoot_mapEntry_feature = Map Entry
-_UI_DocumentRoot_messageBundle_feature = Message Bundle
-_UI_DocumentRoot_navigationCase_feature = Navigation Case
-_UI_DocumentRoot_navigationHandler_feature = Navigation Handler
-_UI_DocumentRoot_navigationRule_feature = Navigation Rule
-_UI_DocumentRoot_nullValue_feature = Null Value
-_UI_DocumentRoot_phaseListener_feature = Phase Listener
-_UI_DocumentRoot_property_feature = Property
-_UI_DocumentRoot_propertyClass_feature = Property Class
-_UI_DocumentRoot_propertyExtension_feature = Property Extension
-_UI_DocumentRoot_propertyName_feature = Property Name
-_UI_DocumentRoot_propertyResolver_feature = Property Resolver
-_UI_DocumentRoot_redirect_feature = Redirect
-_UI_DocumentRoot_referencedBean_feature = Referenced Bean
-_UI_DocumentRoot_referencedBeanClass_feature = Referenced Bean Class
-_UI_DocumentRoot_referencedBeanName_feature = Referenced Bean Name
-_UI_DocumentRoot_renderer_feature = Renderer
-_UI_DocumentRoot_rendererClass_feature = Renderer Class
-_UI_DocumentRoot_rendererExtension_feature = Renderer Extension
-_UI_DocumentRoot_rendererType_feature = Renderer Type
-_UI_DocumentRoot_renderKit_feature = Render Kit
-_UI_DocumentRoot_renderKitClass_feature = Render Kit Class
-_UI_DocumentRoot_renderKitFactory_feature = Render Kit Factory
-_UI_DocumentRoot_renderKitId_feature = Render Kit Id
-_UI_DocumentRoot_smallIcon_feature = Small Icon
-_UI_DocumentRoot_stateManager_feature = State Manager
-_UI_DocumentRoot_suggestedValue_feature = Suggested Value
-_UI_DocumentRoot_supportedLocale_feature = Supported Locale
-_UI_DocumentRoot_toViewId_feature = To View Id
-_UI_DocumentRoot_validator_feature = Validator
-_UI_DocumentRoot_validatorClass_feature = Validator Class
-_UI_DocumentRoot_validatorId_feature = Validator Id
-_UI_DocumentRoot_value_feature = Value
-_UI_DocumentRoot_valueClass_feature = Value Class
-_UI_DocumentRoot_variableResolver_feature = Variable Resolver
-_UI_DocumentRoot_viewHandler_feature = View Handler
-_UI_FacesConfigType_application_feature = Application
-_UI_FacesConfigType_factory_feature = Factory
-_UI_FacesConfigType_component_feature = Component
-_UI_FacesConfigType_converter_feature = Converter
-_UI_FacesConfigType_managedBean_feature = Managed Bean
-_UI_FacesConfigType_navigationRule_feature = Navigation Rule
-_UI_FacesConfigType_referencedBean_feature = Referenced Bean
-_UI_FacesConfigType_renderKit_feature = Render Kit
-_UI_FacesConfigType_lifecycle_feature = Lifecycle
-_UI_FacesConfigType_validator_feature = Validator
-_UI_FacesConfigType_xmlns_feature = Xmlns
-_UI_FacesConfigType_id_feature = Id
-_UI_FacesContextFactoryType_textContent_feature = Text Content
-_UI_FacesContextFactoryType_id_feature = Id
-_UI_FacetExtensionType_mixed_feature = Mixed
-_UI_FacetExtensionType_group_feature = Group
-_UI_FacetExtensionType_any_feature = Any
-_UI_FacetExtensionType_id_feature = Id
-_UI_FacetNameType_textContent_feature = Text Content
-_UI_FacetNameType_id_feature = Id
-_UI_FacetType_description_feature = Description
-_UI_FacetType_displayName_feature = Display Name
-_UI_FacetType_icon_feature = Icon
-_UI_FacetType_facetName_feature = Facet Name
-_UI_FacetType_facetExtension_feature = Facet Extension
-_UI_FacetType_id_feature = Id
-_UI_FactoryType_applicationFactory_feature = Application Factory
-_UI_FactoryType_facesContextFactory_feature = Faces Context Factory
-_UI_FactoryType_lifecycleFactory_feature = Lifecycle Factory
-_UI_FactoryType_renderKitFactory_feature = Render Kit Factory
-_UI_FactoryType_id_feature = Id
-_UI_FromActionType_textContent_feature = Text Content
-_UI_FromActionType_id_feature = Id
-_UI_FromOutcomeType_textContent_feature = Text Content
-_UI_FromOutcomeType_id_feature = Id
-_UI_FromViewIdType_textContent_feature = Text Content
-_UI_FromViewIdType_id_feature = Id
-_UI_IconType_smallIcon_feature = Small Icon
-_UI_IconType_largeIcon_feature = Large Icon
-_UI_IconType_lang_feature = Lang
-_UI_IconType_id_feature = Id
-_UI_KeyClassType_textContent_feature = Text Content
-_UI_KeyClassType_id_feature = Id
-_UI_KeyType_textContent_feature = Text Content
-_UI_KeyType_id_feature = Id
-_UI_LargeIconType_textContent_feature = Text Content
-_UI_LargeIconType_id_feature = Id
-_UI_LifecycleFactoryType_textContent_feature = Text Content
-_UI_LifecycleFactoryType_id_feature = Id
-_UI_LifecycleType_phaseListener_feature = Phase Listener
-_UI_LifecycleType_id_feature = Id
-_UI_ListEntriesType_valueClass_feature = Value Class
-_UI_ListEntriesType_nullValue_feature = Null Value
-_UI_ListEntriesType_value_feature = Value
-_UI_ListEntriesType_id_feature = Id
-_UI_LocaleConfigType_defaultLocale_feature = Default Locale
-_UI_LocaleConfigType_supportedLocale_feature = Supported Locale
-_UI_LocaleConfigType_id_feature = Id
-_UI_ManagedBeanClassType_textContent_feature = Text Content
-_UI_ManagedBeanClassType_id_feature = Id
-_UI_ManagedBeanNameType_textContent_feature = Text Content
-_UI_ManagedBeanNameType_id_feature = Id
-_UI_ManagedBeanScopeType_textContent_feature = Text Content
-_UI_ManagedBeanScopeType_id_feature = Id
-_UI_ManagedBeanType_description_feature = Description
-_UI_ManagedBeanType_displayName_feature = Display Name
-_UI_ManagedBeanType_icon_feature = Icon
-_UI_ManagedBeanType_managedBeanName_feature = Managed Bean Name
-_UI_ManagedBeanType_managedBeanClass_feature = Managed Bean Class
-_UI_ManagedBeanType_managedBeanScope_feature = Managed Bean Scope
-_UI_ManagedBeanType_managedProperty_feature = Managed Property
-_UI_ManagedBeanType_mapEntries_feature = Map Entries
-_UI_ManagedBeanType_listEntries_feature = List Entries
-_UI_ManagedBeanType_id_feature = Id
-_UI_ManagedPropertyType_description_feature = Description
-_UI_ManagedPropertyType_displayName_feature = Display Name
-_UI_ManagedPropertyType_icon_feature = Icon
-_UI_ManagedPropertyType_propertyName_feature = Property Name
-_UI_ManagedPropertyType_propertyClass_feature = Property Class
-_UI_ManagedPropertyType_mapEntries_feature = Map Entries
-_UI_ManagedPropertyType_nullValue_feature = Null Value
-_UI_ManagedPropertyType_value_feature = Value
-_UI_ManagedPropertyType_listEntries_feature = List Entries
-_UI_ManagedPropertyType_id_feature = Id
-_UI_MapEntriesType_keyClass_feature = Key Class
-_UI_MapEntriesType_valueClass_feature = Value Class
-_UI_MapEntriesType_mapEntry_feature = Map Entry
-_UI_MapEntriesType_id_feature = Id
-_UI_MapEntryType_key_feature = Key
-_UI_MapEntryType_nullValue_feature = Null Value
-_UI_MapEntryType_value_feature = Value
-_UI_MapEntryType_id_feature = Id
-_UI_MessageBundleType_textContent_feature = Text Content
-_UI_MessageBundleType_id_feature = Id
-_UI_NavigationCaseType_description_feature = Description
-_UI_NavigationCaseType_displayName_feature = Display Name
-_UI_NavigationCaseType_icon_feature = Icon
-_UI_NavigationCaseType_fromAction_feature = From Action
-_UI_NavigationCaseType_fromOutcome_feature = From Outcome
-_UI_NavigationCaseType_toViewId_feature = To View Id
-_UI_NavigationCaseType_redirect_feature = Redirect
-_UI_NavigationCaseType_id_feature = Id
-_UI_NavigationHandlerType_textContent_feature = Text Content
-_UI_NavigationHandlerType_id_feature = Id
-_UI_NavigationRuleType_description_feature = Description
-_UI_NavigationRuleType_displayName_feature = Display Name
-_UI_NavigationRuleType_icon_feature = Icon
-_UI_NavigationRuleType_fromViewId_feature = From View Id
-_UI_NavigationRuleType_navigationCase_feature = Navigation Case
-_UI_NavigationRuleType_id_feature = Id
-_UI_NullValueType_id_feature = Id
-_UI_PhaseListenerType_textContent_feature = Text Content
-_UI_PhaseListenerType_id_feature = Id
-_UI_PropertyClassType_textContent_feature = Text Content
-_UI_PropertyClassType_id_feature = Id
-_UI_PropertyExtensionType_mixed_feature = Mixed
-_UI_PropertyExtensionType_group_feature = Group
-_UI_PropertyExtensionType_any_feature = Any
-_UI_PropertyExtensionType_id_feature = Id
-_UI_PropertyNameType_textContent_feature = Text Content
-_UI_PropertyNameType_id_feature = Id
-_UI_PropertyResolverType_textContent_feature = Text Content
-_UI_PropertyResolverType_id_feature = Id
-_UI_PropertyType_description_feature = Description
-_UI_PropertyType_displayName_feature = Display Name
-_UI_PropertyType_icon_feature = Icon
-_UI_PropertyType_propertyName_feature = Property Name
-_UI_PropertyType_propertyClass_feature = Property Class
-_UI_PropertyType_defaultValue_feature = Default Value
-_UI_PropertyType_suggestedValue_feature = Suggested Value
-_UI_PropertyType_propertyExtension_feature = Property Extension
-_UI_PropertyType_id_feature = Id
-_UI_RedirectType_id_feature = Id
-_UI_ReferencedBeanClassType_textContent_feature = Text Content
-_UI_ReferencedBeanClassType_id_feature = Id
-_UI_ReferencedBeanNameType_textContent_feature = Text Content
-_UI_ReferencedBeanNameType_id_feature = Id
-_UI_ReferencedBeanType_description_feature = Description
-_UI_ReferencedBeanType_displayName_feature = Display Name
-_UI_ReferencedBeanType_icon_feature = Icon
-_UI_ReferencedBeanType_referencedBeanName_feature = Referenced Bean Name
-_UI_ReferencedBeanType_referencedBeanClass_feature = Referenced Bean Class
-_UI_ReferencedBeanType_id_feature = Id
-_UI_RendererClassType_textContent_feature = Text Content
-_UI_RendererClassType_id_feature = Id
-_UI_RendererExtensionType_mixed_feature = Mixed
-_UI_RendererExtensionType_group_feature = Group
-_UI_RendererExtensionType_any_feature = Any
-_UI_RendererExtensionType_id_feature = Id
-_UI_RendererType_description_feature = Description
-_UI_RendererType_displayName_feature = Display Name
-_UI_RendererType_icon_feature = Icon
-_UI_RendererType_componentFamily_feature = Component Family
-_UI_RendererType_rendererType_feature = Renderer Type
-_UI_RendererType_rendererClass_feature = Renderer Class
-_UI_RendererType_facet_feature = Facet
-_UI_RendererType_attribute_feature = Attribute
-_UI_RendererType_rendererExtension_feature = Renderer Extension
-_UI_RendererType_id_feature = Id
-_UI_RendererTypeType_textContent_feature = Text Content
-_UI_RendererTypeType_id_feature = Id
-_UI_RenderKitClassType_textContent_feature = Text Content
-_UI_RenderKitClassType_id_feature = Id
-_UI_RenderKitFactoryType_textContent_feature = Text Content
-_UI_RenderKitFactoryType_id_feature = Id
-_UI_RenderKitIdType_textContent_feature = Text Content
-_UI_RenderKitIdType_id_feature = Id
-_UI_RenderKitType_description_feature = Description
-_UI_RenderKitType_displayName_feature = Display Name
-_UI_RenderKitType_icon_feature = Icon
-_UI_RenderKitType_renderKitId_feature = Render Kit Id
-_UI_RenderKitType_renderKitClass_feature = Render Kit Class
-_UI_RenderKitType_renderer_feature = Renderer
-_UI_RenderKitType_id_feature = Id
-_UI_SmallIconType_textContent_feature = Text Content
-_UI_SmallIconType_id_feature = Id
-_UI_StateManagerType_textContent_feature = Text Content
-_UI_StateManagerType_id_feature = Id
-_UI_SuggestedValueType_textContent_feature = Text Content
-_UI_SuggestedValueType_id_feature = Id
-_UI_SupportedLocaleType_textContent_feature = Text Content
-_UI_SupportedLocaleType_id_feature = Id
-_UI_ToViewIdType_textContent_feature = Text Content
-_UI_ToViewIdType_id_feature = Id
-_UI_ValidatorClassType_textContent_feature = Text Content
-_UI_ValidatorClassType_id_feature = Id
-pluginName = FacesConfig Model
-providerName = www.example.org
-_UI_DynamicElement_type = Dynamic Element
-_UI_ExtensionType_type = Extension Type
-_UI_DynamicElement_childNodes_feature = Child Nodes
-_UI_DynamicElement_attributes_feature = Attributes
-_UI_DynamicElement_name_feature = Name
-_UI_ValidatorIdType_textContent_feature = Text Content
-_UI_ValidatorIdType_id_feature = Id
-_UI_ValidatorType_description_feature = Description
-_UI_ValidatorType_displayName_feature = Display Name
-_UI_ValidatorType_icon_feature = Icon
-_UI_ValidatorType_validatorId_feature = Validator Id
-_UI_ValidatorType_validatorClass_feature = Validator Class
-_UI_ValidatorType_attribute_feature = Attribute
-_UI_ValidatorType_property_feature = Property
-_UI_ValidatorType_id_feature = Id
-_UI_ValueClassType_textContent_feature = Text Content
-_UI_ValueClassType_id_feature = Id
-_UI_ValueType_textContent_feature = Text Content
-_UI_ValueType_id_feature = Id
-_UI_VariableResolverType_textContent_feature = Text Content
-_UI_VariableResolverType_id_feature = Id
-_UI_ViewHandlerType_textContent_feature = Text Content
-_UI_ViewHandlerType_id_feature = Id
-_UI_ExtensionType_childNodes_feature = Child Nodes
-_UI_ExtensionType_textContent_feature = Text Content
-_UI_XMLTypeDocumentRoot_comment_feature = Comment
-_UI_XMLTypeDocumentRoot_text_feature = Text
-_UI_XMLTypeDocumentRoot_cDATA_feature = CDATA
-_UI_Unknown_feature = Unspecified
-
-_UI_DynamicAttribute_type = Dynamic Attribute
-_UI_DynamicAttribute_name_feature = Name
-_UI_DynamicAttribute_value_feature = Value
-_UI_DynamicElement_textContent_feature = Text Content
-_UI_ExtensionType_id_feature = Id
-_UI_ELResolverType_type = EL Resolver Type
-_UI_ResourceBundleType_type = Resource Bundle Type
-_UI_BaseNameType_type = Base Name Type
-_UI_VarType_type = Var Type
-_UI_ApplicationType_elResolver_feature = El Resolver
-_UI_ApplicationType_resourceBundle_feature = Resource Bundle
-_UI_ELResolverType_textContent_feature = Text Content
-_UI_ELResolverType_id_feature = Id
-_UI_ResourceBundleType_description_feature = Description
-_UI_ResourceBundleType_displayName_feature = Display Name
-_UI_ResourceBundleType_icon_feature = Icon
-_UI_ResourceBundleType_baseName_feature = Base Name
-_UI_ResourceBundleType_var_feature = Var
-_UI_ResourceBundleType_id_feature = Id
-_UI_BaseNameType_textContent_feature = Text Content
-_UI_BaseNameType_id_feature = Id
-_UI_VarType_textContent_feature = Text Content
-_UI_VarType_id_feature = Id
-_UI_ApplicationType_eLResolver_feature = EL Resolver
-_UI_ApplicationExtensionType_type = Application Extension Type
-_UI_ApplicationType_applicationExtension_feature = Application Extension
-_UI_ConverterExtensionType_type = Converter Extension Type
-_UI_FacesConfigExtensionType_type = Extension Type
-_UI_FactoryExtensionType_type = Factory Extension Type
-_UI_LifecycleExtensionType_type = Lifecycle Extension Type
-_UI_ManagedBeanExtensionType_type = Managed Bean Extension Type
-_UI_NavigationRuleExtensionType_type = Navigation Rule Extension Type
-_UI_ValidatorExtensionType_type = Validator Extension Type
-_UI_ConverterType_converterExtension_feature = Converter Extension
-_UI_FacesConfigType_facesConfigExtension_feature = Faces Config Extension
-_UI_FactoryType_factoryExtension_feature = Factory Extension
-_UI_LifecycleType_lifecycleExtension_feature = Lifecycle Extension
-_UI_ManagedBeanType_managedBeanExtension_feature = Managed Bean Extension
-_UI_NavigationRuleType_navigationRuleExtension_feature = Navigation Rule Extension
-_UI_ValidatorType_validatorExtension_feature = Validator Extension
-_UI_RenderKitExtensionType_type = Render Kit Extension Type
-_UI_RenderKitType_renderKitExtension_feature = Render Kit Extension
-_UI_XMLTypeDocumentRoot_processingInstruction_feature = Processing Instruction
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/plugin.xml
deleted file mode 100644
index 1df31cf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/plugin.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   <extension 
-      point="org.eclipse.core.runtime.contentTypes"> 
-      <content-type  
-         id="facesConfigFile" 
-         name="%facesconfig.name" 
-         base-type="org.eclipse.core.runtime.xml" 
-         file-extensions="xml"
-         priority="high"> 
-         <describer 
-            class="org.eclipse.core.runtime.content.XMLRootElementContentDescriber"> 
-            <parameter name="element" value="faces-config" /> 
-         </describer> 
-      </content-type> 
-   </extension>
-  <extension point="org.eclipse.emf.edit.itemProviderAdapterFactories">
-    <factory 
-       uri = "http://www.eclipse.org/webtools/jsf/schema/facesconfig.xsd" 
-       class = "org.eclipse.jst.jsf.facesconfig.edit.provider.FacesConfigItemProviderAdapterFactory" 
-       supportedTypes = 
-         "org.eclipse.emf.edit.provider.IEditingDomainItemProvider
-          org.eclipse.emf.edit.provider.IStructuredItemContentProvider
-          org.eclipse.emf.edit.provider.ITreeItemContentProvider
-          org.eclipse.emf.edit.provider.IItemLabelProvider
-          org.eclipse.emf.edit.provider.IItemPropertySource" />
-  </extension>
-
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.classpath b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.cvsignore b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.project b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.project
deleted file mode 100644
index 4246d9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.standard.tagsupport</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index ecfb123..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 16:04:06 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 04e932e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-#Tue Apr 10 09:31:38 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/META-INF/MANIFEST.MF
deleted file mode 100644
index a2e1054..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.0.1.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,1.1.0)",
- org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,2.4.0)"
-Eclipse-LazyStart: true
-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 04d4782..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 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>
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 2125fe7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/build.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               metadata/,\
-               plugin.properties,\
-               about.html
-javacSource=1.5
-javacTarget=1.5
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 0a7ae08..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core.xml
+++ /dev/null
@@ -1,353 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-	xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore"  
-	xmlns:cnst="http://org.eclipse.jst.jsf.core/constraints.ecore" 
-	id="http://java.sun.com/jsf/core"
-	type="tagFile">
-
-	<entity id="actionListener" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<entity id="type">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.JavaClassType
-				</value>
-			</trait>
-			<trait id="valid-interfaces">
-				<value>javax.faces.event.ActionListener</value>
-			</trait>		
-		</entity>
-	</entity>
-	<entity id="attribute" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-	</entity>	
-	<entity id="convertDateTime" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<entity id="dateStyle">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>default</item>
-					<item>short</item>
-					<item>medium</item>
-					<item>long</item>
-					<item>full</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>default</value>
-			</trait>
-		</entity>
-		<entity id="timeStyle">			
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>default</item>
-					<item>short</item>
-					<item>medium</item>
-					<item>long</item>
-					<item>full</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>default</value>
-			</trait>
-		</entity>
-		<entity id="type">			
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>date</item>
-					<item>time</item>
-					<item>both</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>both</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="convertNumber" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<entity id="groupingUsed">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>true</value>
-			</trait>
-		</entity>
-		<entity id="integerOnly">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>false</value>
-			</trait>
-		</entity>
-		<entity id="maxFractionDigits">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-		</entity>
-		<entity id="maxIntegerDigits">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-		</entity>
-		<entity id="minFractionDigits">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-		</entity>
-		<entity id="minIntegerDigits">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-		</entity>
-		<entity id="type">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>number</item>
-					<item>currency</item>
-					<item>percentage</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>number</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="converter" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<entity id="converterId">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.FacesConfigConverterIDType
-				</value>
-			</trait>
-			<trait id="config-type">
-				<value>javax.faces.convert.Converter</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="loadBundle" 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>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="var">
-			<trait id="contributes-value-binding">
-				<value>true</value>
-			</trait>
-			<trait id="value-binding-scope">
-				<value>request</value>
-			</trait>
-			<trait id="value-binding-symbol-factory">
-				<value>org.eclipse.jst.jsf.designtime.core.loadBundle</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="param" type="tag"><include-entity-group id="common-core-attributes"/></entity>
-	<entity id="selectItem" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<entity id="itemDisabled">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>false</value>
-			</trait>
-		</entity>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value>javax.faces.model.SelectItem</value>
-			</trait>				
-		</entity>
-	</entity>
-	<entity id="selectItems" type="tag">	
-		<include-entity-group id="common-core-attributes"/>
-	</entity>
-	<entity id="subview" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<entity id="rendered">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="validateDoubleRange" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<entity id="maximum">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.DoubleType
-				</value>
-			</trait>
-		</entity>
-		<entity id="minimum">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.DoubleType
-				</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="validateLength" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<entity id="maximum">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.LongType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>			
-		</entity>
-		<entity id="minimum">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.LongType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>	
-		</entity>
-	</entity>
-	<entity id="validateLongRange" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<entity id="maximum">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.LongType
-				</value>
-			</trait>
-		</entity>
-		<entity id="minimum">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.LongType
-				</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="validator" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<entity id="validatorId">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.FacesConfigValidatorIDType
-				</value>
-			</trait>
-			<trait id="config-type">
-				<value>javax.faces.validator.Validator</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="valueChangeListener" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<entity id="type">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.JavaClassType
-				</value>
-			</trait>
-			<trait id="valid-interfaces">
-				<value>javax.faces.event.ValueChangeListener</value>
-			</trait>			
-		</entity>
-	</entity>
-	<entity id="verbatim" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<entity id="escape">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>false</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="view" type="tag"><include-entity-group id="common-core-attributes"/></entity>
-
-	<entityGroup id="common-core-attributes" type="tag">
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.ComponentBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value>javax.faces.component.UIComponent</value>
-			</trait>				
-		</entity>			
-		<entity id="id">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.ComponentIDType
-				</value>
-			</trait>
-		</entity>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-		</entity>
-	</entityGroup>
-</md:metadatamodel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html.properties
deleted file mode 100644
index d96dce0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html.properties
+++ /dev/null
@@ -1,42 +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
-###############################################################################
-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.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)
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 e963c13..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html.xml
+++ /dev/null
@@ -1,683 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-	xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore"
-	xmlns:cnst="http://org.eclipse.jst.jsf.core/constraints.ecore"  
-	id="http://java.sun.com/jsf/html"
-	type="tagFile">
-	
-	<entity id="commandButton" type="tag">	
-		<include-entity-group id="common-attributes"/>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-						<tagId>
-							<uri>http://java.sun.com/jsf/html</uri>
-							<name>form</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="type">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>		
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>button</item>
-					<item>reset</item>
-					<item>submit</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>submit</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="commandLink" type="tag">		
-		<include-entity-group id="common-attributes"/>
-		<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="common-attributes"/>
-				<entity id="var">
-			<trait id="contributes-value-binding">
-				<value>true</value>
-			</trait>
-			<trait id="value-binding-scope">
-				<value>request</value>
-			</trait>
-			<trait id="value-binding-symbol-factory">
-				<value>org.eclipse.jst.jsf.designtime.core.loadBundle</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="form" type="tag"><include-entity-group id="common-attributes"/></entity>
-	<entity id="graphicImage" type="tag">
-		<include-entity-group id="common-attributes"/>
-	</entity>
-	<entity id="inputHidden" type="tag">
-		<include-entity-group id="common-attributes"/>
-				<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value>true</value>
-			</trait>			
-		</entity>
-	</entity>
-	<entity id="inputSecret" type="tag">
-		<include-entity-group id="common-attributes"/>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value>true</value>
-			</trait>
-		</entity>	
-	</entity>
-	<entity id="inputText" type="tag">
-		<include-entity-group id="common-attributes"/>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value>true</value>
-			</trait>
-		</entity>	
-	</entity>
-	<entity id="inputTextarea" type="tag">
-		<include-entity-group id="common-attributes"/>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value>true</value>
-			</trait>
-		</entity>	
-	</entity>
-	<entity id="message" type="tag"><include-entity-group id="common-attributes"/></entity>
-	<entity id="messages" type="tag">
-		<include-entity-group id="common-attributes"/>
-		<entity id="layout">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>list</item>
-					<item>table</item>
-				</value>
-			</trait>
-			<trait id="displayed-values">	
-				<value xsi:type="mdt:ListOfValues">							
-					<item>%messages.layout.displayed-values.list</item>		
-					<item>%messages.layout.displayed-values.table</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>list</value>
-			</trait>				
-		</entity>	
-	</entity>
-	<entity id="outputFormat" type="tag"><include-entity-group id="common-attributes"/></entity>
-	<entity id="outputLabel" type="tag"><include-entity-group id="common-attributes"/></entity>
-	<entity id="outputLink" type="tag"><include-entity-group id="common-attributes"/></entity>
-	<entity id="outputText" type="tag"><include-entity-group id="common-attributes"/></entity>
-	<entity id="panelGrid" type="tag"><include-entity-group id="common-attributes"/></entity>
-	<entity id="panelGroup" type="tag"><include-entity-group id="common-attributes"/></entity>
-	<entity id="selectBooleanCheckbox" type="tag">
-		<include-entity-group id="common-attributes"/>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value>true</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="selectManyCheckbox" type="tag">
-		<include-entity-group id="common-attributes"/>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="layout">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>pageDirection</item>
-					<item>lineDirection</item>
-				</value>
-			</trait>
-			<trait id="displayed-values">				
-				<value xsi:type="mdt:ListOfValues">
-					<item>%selectManyCheckbox.layout.displayed-values.pageDirection</item>		
-					<item>%selectManyCheckbox.layout.displayed-values.lineDirection</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>lineDirection</value>
-			</trait>				
-		</entity>		
-	</entity>
-	<entity id="selectManyListbox" type="tag">
-		<include-entity-group id="common-attributes"/>
-		<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>
-	<entity id="selectManyMenu" type="tag">
-		<include-entity-group id="common-attributes"/>
-		<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>
-	<entity id="selectOneListbox" type="tag">
-		<include-entity-group id="common-attributes"/>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value>true</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="selectOneMenu" type="tag">
-		<include-entity-group id="common-attributes"/>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value>true</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="selectOneRadio" type="tag">
-		<include-entity-group id="common-attributes"/>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value>true</value>
-			</trait>
-		</entity>	
-		<entity id="layout">
-			<include-entity-group>common-attributes</include-entity-group>
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>pageDirection</item>
-					<item>lineDirection</item>
-				</value>
-			</trait>
-			<trait id="displayed-values">		
-				<value xsi:type="mdt:ListOfValues">		
-					<item>%selectOneRadio.layout.displayed-values.pageDirection</item>		
-					<item>%selectOneRadio.layout.displayed-values.lineDirection</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>lineDirection</value>
-			</trait>				
-		</entity>			
-	</entity>
-	<entity id="column" type="tag"><include-entity-group id="common-attributes"/></entity>
-	<entityGroup id="common-attributes">
-		<!-- This group will be refactored -->
-		<entity id="action">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ActionType</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value>java.lang.String</value>
-			</trait>				
-		</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="binding">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ComponentBindingType</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value>javax.faces.component.UIComponent</value>
-			</trait>					
-		</entity>		
-		<entity id="border">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-		</entity>
-		<entity id="cellpadding">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-		</entity>
-		<entity id="cellspacing">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-		</entity>
-		<entity id="cols">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-		</entity>
-		<entity id="converter">			
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.FacesConfigConverterIDType</value>
-			</trait>			
-			<trait id="config-type">
-				<value>javax.faces.convert.Converter</value>
-			</trait>				
-		</entity>
-		<entity id="escape">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="default-value">
-				<value>true</value>
-			</trait>			
-		</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="frame">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>none</item>
-					<item>above</item>
-					<item>below</item>
-					<item>hsides</item>
-					<item>vsides</item>
-					<item>lhs</item>
-					<item>rhs</item>			
-					<item>box</item>
-					<item>border</item>	
-				</value>
-			</trait>
-			<trait id="displayed-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>%any.frame.displayed-values.none</item>
-					<item>%any.frame.displayed-values.above</item>
-					<item>%any.frame.displayed-values.below</item>
-					<item>%any.frame.displayed-values.hsides</item>
-					<item>%any.frame.displayed-values.vsides</item>
-					<item>%any.frame.displayed-values.lhs</item>
-					<item>%any.frame.displayed-values.rhs</item>			
-					<item>%any.frame.displayed-values.box</item>
-					<item>%any.frame.displayed-values.border</item>		
-				</value>	
-			</trait>
-			<trait id="default-value">
-				<value>none</value>
-			</trait>			
-		</entity>
-		<entity id="globalOnly">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="default-value">
-				<value>false</value>
-			</trait>			
-		</entity>
-		<entity id="height">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-			</trait>
-		</entity>
-		<entity id="id">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-			</trait>
-		</entity>
-		<entity id="immediate">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-		</entity>
-		<entity id="ismap">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-		</entity>
-		<entity id="maxlength">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-		</entity>
-		<entity id="readonly">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-		</entity>
-		<entity id="redisplay">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-		</entity>
-		<entity id="rendered">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</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="rules">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>none</item>
-					<item>groups</item>
-					<item>rows</item>
-					<item>cols</item>
-					<item>all</item>
-				</value>
-			</trait>
-			<trait id="displayed-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>%any.rules.displayed-values.none</item>
-					<item>%any.rules.displayed-values.groups</item>
-					<item>%any.rules.displayed-values.rows</item>
-					<item>%any.rules.displayed-values.cols</item>
-					<item>%any.rules.displayed-values.all</item>	
-				</value>	
-			</trait>
-			<trait id="default-value">
-				<value>none</value>
-			</trait>			
-		</entity>
-		<entity id="shape">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>default</item>
-					<item>rect</item>
-					<item>circle</item>
-					<item>poly</item>	
-				</value>			
-			</trait>
-			<trait id="displayed-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>%any.shape.displayed-values.default</item>
-					<item>%any.shape.displayed-values.rect</item>
-					<item>%any.shape.displayed-values.circle</item>
-					<item>%any.shape.displayed-values.poly</item>		
-				</value>		
-			</trait>
-			<trait id="default-value">
-				<value>default</value>
-			</trait>		
-		</entity>
-		<entity id="showDetail">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="default-value">
-				<value>true</value>
-			</trait>				
-		</entity>
-		<entity id="showSummary">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="default-value">
-				<value>false</value>
-			</trait>
-		</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="tabindex">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-			<trait id="valid-maximum"><value>32767</value></trait>
-		</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="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="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="dir">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>ltr</item>
-					<item>rtl</item>
-				</value>
-			</trait>
-			<trait id="displayed-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>%any.dir.displayed-values.ltr</item>
-					<item>%any.dir.displayed-values.rtl</item>
-				</value>
-			</trait>			
-		</entity>
-		<entity id="width">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-			</trait>
-		</entity>
-	</entityGroup>
-</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 5c6686a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/symbolInfoMetadata.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-	xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore"  
-	id="http://java.sun.com/jsf/core"
-	type="tagFile">
-	
-
-	<entity id="view" type="tag">
-		<entity id="locale">
-			<trait id="sets-locale">
-				<value>true</value>
-			</trait>
-		</entity>
-	</entity>
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/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 8f62de9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/plugin.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-   <extension
-         point="org.eclipse.jst.jsf.common.standardMetaDataFiles">
-      <standardMetaDataFile
-            location="/metadata/jsf_html.xml"
-            uri="http://java.sun.com/jsf/html"/>
-      <standardMetaDataFile
-            location="/metadata/jsf_core.xml"
-            uri="http://java.sun.com/jsf/core"/>
-      <standardMetaDataFile
-            location="/metadata/symbolInfoMetadata.xml"
-            uri="http://java.sun.com/jsf/core"/>
-   </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 8246949..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, 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
- *******************************************************************************/
-package org.eclipse.jst.jsf.standard.tagsupport;
-
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class StandardTagSupportPlugin extends AbstractUIPlugin {
-
-	/**
-	 * the plugin id
-	 */
-	public static final String PLUGIN_ID = "org.eclipse.jst.jsf.standard.tagsupport";
-
-	// The shared instance
-	private static StandardTagSupportPlugin plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public StandardTagSupportPlugin() {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static StandardTagSupportPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.classpath b/jsf/plugins/org.eclipse.jst.jsf.ui/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.cvsignore b/jsf/plugins/org.eclipse.jst.jsf.ui/.cvsignore
deleted file mode 100644
index 117a1fe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.cvsignore
+++ /dev/null
@@ -1,5 +0,0 @@
-bin
-@dot*
-temp.folder
-build.xml
-javaCompiler...args
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.project b/jsf/plugins/org.eclipse.jst.jsf.ui/.project
deleted file mode 100644
index 45f845d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index c8e6e65..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Sun May 27 16:04:34 EDT 2007
-eclipse.preferences.version=1
-encoding//src/org/eclipse/jst/jsf/ui/internal/messages.properties=8859_1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 123186c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,77 +0,0 @@
-#Tue Apr 10 09:49:41 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.jdt.ui.prefs b/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 39df095..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Tue Apr 10 09:49:42 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index f66d5bd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,33 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %plugin.name
-Bundle-SymbolicName: org.eclipse.jst.jsf.ui; singleton:=true
-Bundle-Version: 1.0.1.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.ui.internal.JSFUiPlugin
-Bundle-Vendor: %plugin.provider
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.jst.jsf.core;bundle-version="[1.0.0,1.1.0)",
- org.eclipse.wst.common.project.facet.ui;bundle-version="[1.1.0,1.3.0)",
- org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jdt.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.j2ee;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.common.frameworks.ui;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jst.jsf.common;bundle-version="[1.0.0,1.1.0)",
- org.eclipse.jface.text;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.jsp.core;bundle-version="[1.1.0,1.3.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.xml.ui;bundle-version="[1.0.100,1.1.0)",
- org.eclipse.wst.sse.ui;bundle-version="[1.0.101,1.1.0)",
- org.eclipse.emf.ecore;bundle-version="[2.2.0,2.4.0)",
- org.eclipse.jst.jsp.ui;bundle-version="[1.1.0,1.3.0)",
- org.eclipse.ui.forms
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.jst.jsf.ui.internal;x-friends:="org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.ui.internal.classpath;x-friends:="org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.ui.internal.contentassist;x-internal:=true,
- org.eclipse.jst.jsf.ui.internal.contentassist.el;x-internal:=true,
- org.eclipse.jst.jsf.ui.internal.jsflibraryconfig;x-internal:=true,
- org.eclipse.jst.jsf.ui.internal.project.facet;x-friends:="org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.ui.internal.validation;x-internal:=true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/about.html b/jsf/plugins/org.eclipse.jst.jsf.ui/about.html
deleted file mode 100644
index 04d4782..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 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>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/build.properties b/jsf/plugins/org.eclipse.jst.jsf.ui/build.properties
deleted file mode 100644
index 8d7f590..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/build.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               icons/,\
-               plugin.properties,\
-               about.html
-javacSource=1.5
-javacTarget=1.5
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/attr_val.gif b/jsf/plugins/org.eclipse.jst.jsf.ui/icons/attr_val.gif
deleted file mode 100644
index d4cb425..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/attr_val.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/full/wizban/addlibrary_wiz.gif b/jsf/plugins/org.eclipse.jst.jsf.ui/icons/full/wizban/addlibrary_wiz.gif
deleted file mode 100644
index 128c9d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/full/wizban/addlibrary_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_l_obj.gif b/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_l_obj.gif
deleted file mode 100644
index 6cb185c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_l_obj.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_obj.gif b/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_obj.gif
deleted file mode 100644
index 2fa1d77..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_obj.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/library_obj.gif b/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/library_obj.gif
deleted file mode 100644
index cb55e33..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/library_obj.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.properties
deleted file mode 100644
index b3c2077..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 Oracle Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-plugin.name=JavaServer Faces Tools - UI
-plugin.provider=Eclipse.org
-
-jsf.library.reference=JSF Library References
-jsf.library.wizard.name=JSF Library
-
-preferencepage.jsflibraries.name=Libraries
-preferencepage.jsfvalidation.name=Validation
-preferencepage.jsf.name=JavaServer Faces Tools
-
-newwizard.jsf.category.name=JavaServer Faces
-newwizard.jsflibrary.name=JSF Library
-newwizard.jsflibrary.description=Create a new JSF Library
-classpathContainerPage.name.0 = JSF Libraries
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.xml
deleted file mode 100644
index aa03746..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.xml
+++ /dev/null
@@ -1,91 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-  <!-- JSF Project Facet --> 
-  <extension
-        point="org.eclipse.ui.preferencePages">
-     <page
-           category="org.eclipse.wst.sse.ui.internal.provisional.preferences/org.eclipse.jst.jsf.ui.JSFRootPage"
-           class="org.eclipse.jst.jsf.ui.internal.classpath.JSFLibrariesPreferencePage"
-           id="org.eclipse.jst.jsf.ui.jsfLibraryPage"
-           name="%preferencepage.jsflibraries.name"/>
-     <page
-           category="org.eclipse.wst.sse.ui.internal.provisional.preferences/org.eclipse.jst.jsf.ui.JSFRootPage"
-           class="org.eclipse.jst.jsf.ui.internal.validation.JSFValidationPreferencePage"
-           id="org.eclipse.jst.jsf.ui.JSFValidationPage"
-           name="%preferencepage.jsfvalidation.name"/>
-     <page
-           category="org.eclipse.wst.sse.ui.internal.provisional.preferences"
-           class="org.eclipse.jst.jsf.ui.internal.preferences.EmptyRootPreferencePage"
-           id="org.eclipse.jst.jsf.ui.JSFRootPage"
-           name="%preferencepage.jsf.name">
-     </page>
-  </extension>
-  <extension
-        point="org.eclipse.ui.newWizards">
-     <category
-           id="org.eclipse.jst.jsf.ui.jsfcategory"
-           name="%newwizard.jsf.category.name"/>
-     <wizard
-           canFinishEarly="false"
-           category="org.eclipse.jst.jsf.ui.jsfcategory"
-           class="org.eclipse.jst.jsf.ui.internal.classpath.JSFLibraryWizard"
-           hasPages="true"
-           icon="icons/obj16/library_obj.gif"
-           id="org.eclipse.jst.jsf.ui.jsfLibraryWizard"
-           name="%newwizard.jsflibrary.name"
-           preferredPerspectives="org.eclipse.jst.j2ee.J2EEPerspective">
-        <description>
-           %newwizard.jsflibrary.description
-        </description>
-     </wizard>
-  </extension>
-  <extension 
-        point="org.eclipse.wst.common.project.facet.ui.wizardPages">
-     <wizard-pages action="jst.jsf.v11.install">
-        <page class="org.eclipse.jst.jsf.ui.internal.project.facet.JSFFacetInstallPage"/>
-     </wizard-pages>
-     <wizard-pages action="jst.jsf.v12.install">
-        <page class="org.eclipse.jst.jsf.ui.internal.project.facet.JSFFacetInstallPage"/>
-     </wizard-pages>
-  </extension>  
-  
-  <extension point="org.eclipse.wst.sse.ui.editorConfiguration"> 
-	<sourceViewerConfiguration
-            class="org.eclipse.jst.jsp.ui.StructuredTextViewerConfigurationJSP"
-            target="org.eclipse.jst.jsp.core.jspsource"/>
-                <provisionalConfiguration 
-                        type="contentassistprocessor" 
-                        class="org.eclipse.jst.jsf.ui.internal.contentassist.el.JSFELContentAssistProcessor" 
-                        target="org.eclipse.jst.jsp.SCRIPT.JSP_EL2" /> 
-				<provisionalConfiguration 
-                        type="contentassistprocessor" 
-                        class="org.eclipse.jst.jsf.ui.internal.contentassist.JSFContentAssistProcessor" 
-                        target="org.eclipse.jst.jsp.JSP_DEFAULT,org.eclipse.jst.jsp.JSP_DIRECTIVE" />                         
-    </extension> 
-    <extension point="org.eclipse.wst.sse.ui.sourcevalidation">
-		<validator
-			scope="total"
-			class="org.eclipse.jst.jsf.validation.internal.JSPSemanticsValidator"
-			id="org.eclipse.jst.jsf.validation.JSFAttributeValueValidator">
-			<contentTypeIdentifier
-				id="org.eclipse.jst.jsp.core.jspsource">
-				<partitionType id="org.eclipse.jst.jsp.DEFAULT_JSP">
-				</partitionType>
-				<partitionType id="org.eclipse.jst.jsp.JSP_DIRECTIVE">
-				</partitionType>
-				<partitionType id="org.eclipse.jst.jsp.SCRIPT.JSP_EL2">
-				</partitionType>
-			</contentTypeIdentifier>
-		</validator>
-	</extension>
-    <extension
-          point="org.eclipse.jdt.ui.classpathContainerPage">
-       <classpathContainerPage
-             class="org.eclipse.jst.jsf.ui.internal.classpath.JSFLibraryContainerWizardPage"
-             id="org.eclipse.jst.jsf.core.internal.jsflibrarycontainer"
-             name="%classpathContainerPage.name.0">
-       </classpathContainerPage>
-    </extension>
-    
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/JSFUiPlugin.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/JSFUiPlugin.java
deleted file mode 100644
index 8b043ad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/JSFUiPlugin.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *    Ian Trimble - added logging methods
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.ui.internal;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * JSF UI plugin.
- * 
- * @author Gerry Kessler - Oracle, Ian Trimble - Oracle
- */
-public class JSFUiPlugin extends AbstractUIPlugin {
-
-	/**
-	 * The plugin id
-	 */
-	public static final String PLUGIN_ID = "org.eclipse.jst.jsf.ui"; //$NON-NLS-1$
-	//The shared instance.
-	private static JSFUiPlugin plugin;
-    private static ResourceBundle   _resourceBundle;
-    
-	/**
-	 * The constructor.
-	 */
-	public JSFUiPlugin() {
-		plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 * @return the default plugin instance
-	 */
-	public static JSFUiPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given
-	 * plug-in relative path.
-	 *
-	 * @param path the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		path = "icons/" + path; //$NON-NLS-1$
-		return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.jst.jsf.ui", path); //$NON-NLS-1$
-	}
-
-    /**
-     * Returns the string from the plugin's resource bundle, or 'key' if not
-     * found.
-     * @param key the key used to look up the string
-     * @return the resource string if one is found matching key or key is returned if it is not
-     */
-    public static String getResourceString(String key) {
-        ResourceBundle bundle = getDefault().getResourceBundle();
-        try {
-            return (bundle != null) ? bundle.getString(key) : key;
-        } catch (MissingResourceException e) {
-            return key;
-        }
-    }
-    
-    /**
-     * @return the resource bundle
-     */
-    public ResourceBundle getResourceBundle()
-    {
-        return _resourceBundle;
-    }
-    
-	/**
-	 * @return the plugin id
-	 */
-	public String getPluginID() {
-		return PLUGIN_ID;
-	}
-
-	/**
-	 * Logs using the default ILog implementation provided by getLog().
-	 * 
-	 * @param severity Severity (IStatus constant) of log entry
-	 * @param message Human-readable message describing log entry
-	 * @param ex Throwable instance (can be null)
-	 */
-	public static void log(int severity, String message, Throwable ex) {
-		getDefault().getLog().log(new Status(severity, PLUGIN_ID, IStatus.OK, message, ex));
-	}
-
-	/**
-	 * Logs using the default ILog implementation provided by getLog().
-	 * 
-	 * @param severity Severity (IStatus constant) of log entry
-	 * @param message Human-readable message describing log entry
-	 */
-	public static void log(int severity, String message) {
-		log(severity, message, null);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/Messages.java
deleted file mode 100644
index 147df36..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/Messages.java
+++ /dev/null
@@ -1,379 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *    Ian Trimble - changed to work correctly with org.eclipse.osgi.util.NLS
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.ui.internal;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler.
- * 
- * @author Gerry Kessler - Oracle, Ian Trimble - Oracle
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.ui.internal.messages"; //$NON-NLS-1$
-
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFFacetInstallPage_JSFLibraryLabel0;
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_title;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_description;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_JSFImplLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_Add1;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_Add2;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_DeployJarsLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_JSFConfigLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_JSFServletNameLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_JSFServletClassNameLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_JSFURLMappingLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_PatternDialogTitle;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_PatternDialogDesc;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_Remove;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_PatternEmptyMsg;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_PatternSpecifiedMsg;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_ErrorNoWebAppDataModel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_DEFAULT_IMPL_DESC;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_DefinedJSFLibraries;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_IMPL_DESC;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_MISSING_DESC;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_New;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_Edit;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_Remove;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_CannotRemovePluginProvidedTitle;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_CannotRemovePluginProvidedMessage;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_MakeDefault;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_Description;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_CannotModifyPluginProvidedTitle;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_CannotModifyPluginProvidedMessage;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_Add;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_AddAll;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_ComponentLibrary;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_DeployButtonLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_DeployJAR;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_ImplementationLibrary;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_NewComponentLibrary;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_NewImplButtonTooltip;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_NewImplementationLibrary;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_NullProject;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_Remove;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_RemoveAll;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_ServerSuppliedButtonLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_ServerSuppliedButtonTooltip;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_TH_Deploy;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_TH_LibraryName;
-
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_PageName;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_Title;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_Description;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_WarningNoJSFFacet;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_JSFLibraries;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_Add;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_Edit;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_ErrorInitializing;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_ImplAlreadyPresent;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_SelectOneImpl;
-    /**
-     * see messages.properties
-     */    
-	public static String JSFLibraryContainerWizardPage_V1Registry_Warning_DialogTitle;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_V1Registry_Warning_DialogText;
-    /**
-     * see messages.properties
-     */
-    public static String JSFLibraryContainerWizardPage_EditLibrary_DescriptionText;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryPropertyPage_No_JSF_Facet_Installed;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryPropertyPage_No_JSF_Implementation_Lib_Selected;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_DESCRIPTION;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_IMPLS_ONLY_DESC;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_CreateImplementation;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_CreateJSFLibrary;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_EditJSFLibrary;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_JSFLibrary;
-    /**
-     * see messages.properties
-     */
-    public static String JSFLibraryWizard_JSFLibraryWizard_DontShowThisAgain_CheckBoxLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_LibraryName;
-    /**
-     * see messages.properties
-     */
-    public static String JSFLibraryWizard_V1JSFLibrary_DialogMessage;
-    /**
-     * see messages.properties
-     */
-    public static String JSFLibraryWizard_V1JSFLibrary_DialogTitle;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_VersionSupported;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_LibraryJars;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_IsJSFImplementation;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_DeployJars;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_Add;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_Remove;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_ExtJarFileDialogTitle;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_ValidateNoJars;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_ValidateNoLibraryName;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_ValidateExistingLibraryName;
-
-    /**
-     * Title set on the el validation preference panel
-     */
-    public static String JSFValidationPreferencePage_ELPrefPanel_Title;
-    /**
-     * Title set on the checkbox that enables/disables build validation for EL
-     */
-    public static String JSFValidationPreferencePage_ELPrefPanel_BuildValidationCheckBoxTitle;
-    /**
-     * Title set on the checkbox that enables/disables incremental (as you type)
-     * validation for EL
-     */
-    public static String JSFValidationPreferencePage_ELPrefPanel_IncrementalValidationCheckBoxTitle;
-
-    /**
-     * see messages.properties
-     */
-    public static String JSFLibraryEditControl_ImplVersion_UNKNOWN;
-
-    /**
-     * see messages.properties
-     */
-    public static String JSFPreferences_RootPage_Description;
-    
-    static {
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibrariesPreferencePage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibrariesPreferencePage.java
deleted file mode 100644
index 772939f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibrariesPreferencePage.java
+++ /dev/null
@@ -1,411 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.IWorkbenchWizard;
-
-/**
- * Provides a preference page for JSF Libraries.
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFLibrariesPreferencePage extends PreferencePage implements IWorkbenchPreferencePage{
-	private static final String IMPL_DESC = Messages.JSFLibrariesPreferencePage_IMPL_DESC;
-	private static final String DEFAULT_IMPL_DESC = Messages.JSFLibrariesPreferencePage_DEFAULT_IMPL_DESC;
-	private static final String MISSING = Messages.JSFLibrariesPreferencePage_MISSING_DESC;
-	
-	private IWorkbench wb;
-
-	private TreeViewer tv;
-	private TreeViewerAdapter tvAdapter;
-	private TreeLabelProvider tvLabelProvider;
-	
-	private Composite btnComp;
-
-	private Button btnNew;
-	private Button btnEdit;
-	private Button btnDelete;
-	private Button btnMakeDefaultImpl;
-	
-	protected Control createContents(Composite parent) {
-		Composite c = new Composite(parent, SWT.NONE);
-		c.setLayout(new GridLayout(2, false)); 
-		c.setLayoutData(new GridData(GridData.FILL_BOTH));				
-		
-		Label lblLibs = new Label(c, SWT.NONE);
-		lblLibs.setText(Messages.JSFLibrariesPreferencePage_DefinedJSFLibraries);
-		GridData gd1 = new GridData();
-		gd1.horizontalSpan = 2;
-		lblLibs.setLayoutData(gd1);
-		
-		tv = new TreeViewer(c, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
-		tvAdapter = new TreeViewerAdapter();
-		tvLabelProvider = new TreeLabelProvider();
-		tv.setContentProvider(tvAdapter);
-		tv.setLabelProvider(tvLabelProvider);
-		tv.addSelectionChangedListener(tvAdapter);
-		tv.addDoubleClickListener(tvAdapter);
-		tv.setComparator(tvAdapter);
-		tv.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
-		tv.setInput(getJSFLibraries());
-		
-		createButtons(c);
-		
-		return c;
-	}
-
-	private void createButtons(Composite c){		
-		btnComp = new Composite(c, SWT.NONE);
-		GridLayout gl1 = new GridLayout(1, false);
-		gl1.marginHeight = 0;
-		gl1.marginWidth = 0;
-		btnComp.setLayout(gl1);
-		btnComp.setLayoutData(new GridData(GridData.END | GridData.VERTICAL_ALIGN_FILL));
-		
-		btnNew = new Button(btnComp, SWT.NONE);
-		btnNew.setText(Messages.JSFLibrariesPreferencePage_New);
-		btnNew.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING));
-		btnNew.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e) {
-				openJSFLibraryEditDialog(null);
-			}
-		});
-		
-		btnEdit = new Button(btnComp, SWT.NONE);
-		btnEdit.setText(Messages.JSFLibrariesPreferencePage_Edit);
-		btnEdit.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING));
-		btnEdit.setEnabled(false);
-		btnEdit.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e) {
-				TreeItem[] element = tv.getTree().getSelection();
-				if (element != null){
-					openJSFLibraryEditDialog(element[0]);
-				}
-
-			}
-		});
-		
-		btnDelete = new Button(btnComp, SWT.NONE);
-		btnDelete.setText(Messages.JSFLibrariesPreferencePage_Remove);
-		btnDelete.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING));
-		btnDelete.setEnabled(false);
-		btnDelete.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e) {
-				boolean modified = false;
-				if (tv.getSelection() instanceof StructuredSelection){
-					StructuredSelection objs = (StructuredSelection)tv.getSelection();
-					if (objs != null){
-						Iterator it = objs.iterator();
-						while (it.hasNext()){
-							JSFLibrary lib = (JSFLibrary)it.next();
-							if (lib instanceof PluginProvidedJSFLibrary)
-								MessageDialog.openInformation(
-										getShell(),
-										Messages.JSFLibrariesPreferencePage_CannotRemovePluginProvidedTitle,
-										Messages.JSFLibrariesPreferencePage_CannotRemovePluginProvidedMessage);
-	
-							else {
-								JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().removeJSFLibrary(lib);
-								modified = true;
-							}
-						}
-						if (modified){
-							JSFLibraryRegistryUtil.getInstance().saveJSFLibraryRegistry();
-							tv.refresh();
-						}
-					}
-				}
-			}
-		});
-		
-		btnMakeDefaultImpl = new Button(btnComp, SWT.NONE);
-		btnMakeDefaultImpl.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_END));
-		btnMakeDefaultImpl.setText(Messages.JSFLibrariesPreferencePage_MakeDefault);
-		btnMakeDefaultImpl.setVisible(false);
-		btnMakeDefaultImpl.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (tv.getSelection() instanceof StructuredSelection){
-					StructuredSelection objs = (StructuredSelection)tv.getSelection();
-					if (objs != null){
-						if (objs.getFirstElement() instanceof JSFLibrary){
-							 JSFLibrary lib = (JSFLibrary)objs.getFirstElement();
-							 JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().setDefaultImplementation(lib);							 							
-						 }
-						 JSFLibraryRegistryUtil.getInstance().saveJSFLibraryRegistry();
-						 tv.refresh();
-					}
-				}
-			}
-		});
-		
-	}
-	private Object getJSFLibraries() {
-		return JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getAllJSFLibraries();
-	}
-
-	public void init(IWorkbench workbench) {
-		wb = workbench;
-		setDescription(Messages.JSFLibrariesPreferencePage_Description);
-		noDefaultAndApplyButton();
-	}
-	
-	/**
-	 * Getter created only for JUnit tests.  Should not be used otherwise.
-	 * @return the TreeViewer of JSF Libraries
-	 */
-	public Viewer getLibraryViewer(){
-		return tv;
-	}
-	
-	private class TreeViewerAdapter extends ViewerComparator implements ITreeContentProvider, ISelectionChangedListener, IDoubleClickListener {
-		private final Object[] NO_ELEMENTS= new Object[0];
-
-		// ------- ITreeContentProvider Interface ------------
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			// will never happen
-		}
-
-		public void dispose() {
-            // do nothing
-		}
-
-		public Object[] getElements(Object obj) {
-			return ((List)getJSFLibraries()).toArray();
-		}
-		
-		public Object[] getChildren(Object element) {
-			if (element instanceof JSFLibrary) {
-				return ((JSFLibrary)element).getArchiveFiles().toArray();
-			}
-			return NO_ELEMENTS;
-		}
-
-		public Object getParent(Object element) {
-//			if (elements instanceof JSFLibrary) {
-//				return tvAdapter.getParent(tv.getTree().class, element);
-//			}
-			return null;//fParentElement;
-		}
-
-		public boolean hasChildren(Object element) {
-			if (element instanceof JSFLibrary) {
-				return true;
-			}
-			return false;
-		}		
-
-		// ------- ISelectionChangedListener Interface ------------
-
-		public void selectionChanged(SelectionChangedEvent event) {
-			doListSelected(event);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
-		 */
-		public void doubleClick(DoubleClickEvent event) {
-			doDoubleClick(event);
-		}		
-		
-		public int compare(Viewer viewer, Object e1, Object e2) {
-			if (e1 instanceof JSFLibrary && e2 instanceof JSFLibrary){
-				JSFLibrary lib1 = (JSFLibrary)e1;
-				JSFLibrary lib2 = (JSFLibrary)e2;
-				
-				return getComparator().compare(lib1.getLabel(), lib2.getLabel());
-			}
-			return super.compare(viewer, e1, e2);
-		}
-		
-		
-	}
-
-	/**
-	 * Respond to a list selection event
-	 * 
-	 * @param event
-	 */
-	protected void doListSelected(SelectionChangedEvent event) {
-		updateButtonState();
-	}
-
-	/**
-	 * Respond to a double click event by opening the edit dialog
-	 * @param event
-	 */
-	protected void doDoubleClick(DoubleClickEvent event) {
-		openJSFLibraryEditDialog(tv.getTree().getSelection()[0]);
-	}
-	
-	private void updateButtonState() {
-		btnEdit.setEnabled(tv.getTree().getSelectionCount() == 1);	
-		if (tv.getTree().getSelectionCount() == 1 && tv.getTree().getSelection()[0].getData() instanceof JSFLibrary){	
-			btnDelete.setEnabled(true);
-			btnMakeDefaultImpl.setVisible(false);
-			JSFLibrary lib = (JSFLibrary)tv.getTree().getSelection()[0].getData();
-			btnMakeDefaultImpl.setVisible(lib.isImplementation());
-		} else {
-			btnDelete.setEnabled(false);
-			btnMakeDefaultImpl.setVisible(false);
-		}
-	}
-	
-	private void openJSFLibraryEditDialog(Object element) {
-		if (isPluginProvidedJSFLibrary(element)){
-			MessageDialog.openInformation(
-					getShell(),
-					Messages.JSFLibrariesPreferencePage_CannotModifyPluginProvidedTitle,
-					Messages.JSFLibrariesPreferencePage_CannotModifyPluginProvidedMessage);
-			return;
-		}
-		IWorkbenchWizard wizard = new JSFLibraryWizard();
-		wizard.init(wb, getStructuredElement(element));
-		WizardDialog dialog = new WizardDialog(wb.getActiveWorkbenchWindow().getShell(), wizard);
-		int ret = dialog.open();
-		if (ret == Window.OK){
-			tv.refresh();
-		}
-	}
-	
-	private IStructuredSelection getStructuredElement(Object element) {
-		if (element instanceof TreeItem){
-			Object item = ((TreeItem)element).getData();
-			if (item instanceof ArchiveFile){
-				JSFLibrary parent = ((ArchiveFile)item).getJSFLibrary();
-				return new StructuredSelection(parent);
-			} else if (item instanceof JSFLibrary) {
-				return new StructuredSelection(item);
-			}
-		}
-		return null;
-	}
-
-	private boolean isPluginProvidedJSFLibrary(Object treeElement){
-		if (treeElement instanceof TreeItem){
-			Object item = ((TreeItem)treeElement).getData();
-			if (item instanceof PluginProvidedJSFLibrary){
-				return true;
-			} else if (item instanceof ArchiveFile) {
-				return (((ArchiveFile)item).getJSFLibrary() instanceof PluginProvidedJSFLibrary);
-			}
-		}
-		return false;
-	}
-
-	private class TreeLabelProvider implements ILabelProvider {
-		Image libImg;
-		Image jarImg;
-
-		TreeLabelProvider(){
-			if (jarImg == null){
-				ImageDescriptor jarImgDesc = JSFUiPlugin.getImageDescriptor("obj16/jar_obj.gif"); //$NON-NLS-1$
-				jarImg = jarImgDesc.createImage();
-			}
-			if (libImg == null){
-				ImageDescriptor libImgDesc = JSFUiPlugin.getImageDescriptor("obj16/library_obj.gif"); //$NON-NLS-1$
-				libImg = libImgDesc.createImage();
-			}
-		}
-		
-		public Image getImage(Object element) {
-			if (element instanceof JSFLibrary)
-            {
-				return libImg;
-            }
-			return jarImg;
-		}
-
-		public String getText(Object element) {
-			StringBuffer labelBuf = new StringBuffer();
-			if (element instanceof JSFLibrary) {
-				JSFLibrary lib = (JSFLibrary)element;
-				labelBuf.append(lib.getLabel());
-				if (lib.isImplementation()) {
-					if (lib == JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getDefaultImplementation()) {
-						labelBuf.append(DEFAULT_IMPL_DESC);
-					} else {
-						labelBuf.append(IMPL_DESC);
-					}
-				}
-			}
-			if (element instanceof ArchiveFile) {
-				ArchiveFile jar = (ArchiveFile)element;
-				labelBuf.append(jar.getName());
-				if (!jar.exists())
-					labelBuf.append(MISSING);
-				labelBuf.append(" - ").append(((ArchiveFile)element).getSourceLocation()); //$NON-NLS-1$
-			}
-			return labelBuf.toString();
-		}
-
-		public void addListener(ILabelProviderListener listener) {
-            // no listeners supported
-		}
-
-		public void dispose() {
-			if (libImg != null){
-				libImg.dispose();
-			}			
-			if (jarImg != null){
-				jarImg.dispose();
-			}		
-		}
-
-		public boolean isLabelProperty(Object element, String property) {
-			return false;
-		}
-
-		public void removeListener(ILabelProviderListener listener) {
-            // no listeners supported
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryContainerWizardPage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryContainerWizardPage.java
deleted file mode 100644
index fdbe74d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryContainerWizardPage.java
+++ /dev/null
@@ -1,581 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.ui.wizards.IClasspathContainerPage;
-import org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension;
-import org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension2;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryConfigurationHelper;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWizard;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Provides a classpath container wizard page for JSF Libraries.
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFLibraryContainerWizardPage extends WizardPage implements
-		IClasspathContainerPage, IClasspathContainerPageExtension, IClasspathContainerPageExtension2{
-
-	private CheckboxTableViewer lv;
-	private JSFLibrariesTableViewerAdapter lvAdapter;
-	private JSFLibrariesListLabelProvider lvLabelProvider;
-	
-	private boolean isJSFProject = false;
-	private IClasspathEntry containerEntry;
-	private IClasspathEntry[] currentEntries;
-	private Map _currentLibs;
-	private JSFLibrary currentLib;
-	
-	private boolean   _projectHaveV1JSFLibraries; // = false;
-	private IProject  _iproject;
-
-	private static final String IMPL_DESC = Messages.JSFLibrariesPreferencePage_IMPL_DESC;
-	
-	/**
-	 * Zero arg constructor
-	 */
-	public JSFLibraryContainerWizardPage(){
-        super(Messages.JSFLibraryContainerWizardPage_PageName);        
-        setTitle(Messages.JSFLibraryContainerWizardPage_Title);
-        setDescription(Messages.JSFLibraryContainerWizardPage_Description);
-        // TODO: Replace with a custom image.
-        setImageDescriptor( JSFUiPlugin.getImageDescriptor("full/wizban/addlibrary_wiz.gif")); //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension#initialize(org.eclipse.jdt.core.IJavaProject, org.eclipse.jdt.core.IClasspathEntry[])
-	 */
-	public void initialize(IJavaProject project, IClasspathEntry[] currentEntries_) {
-		this.currentEntries = currentEntries_;
-
-        _iproject = project.getProject();
-        this.isJSFProject = JSFAppConfigUtils.isValidJSFProject(_iproject);
-        if (this.isJSFProject)
-		{
-			_projectHaveV1JSFLibraries = 
-			    JSFLibraryRegistryUtil.doesProjectHaveV1JSFLibraries(_iproject);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.ui.wizards.IClasspathContainerPage#finish()
-	 */
-	public boolean finish() {
-	    boolean finish = true;
-	    if (_projectHaveV1JSFLibraries)
-	    {
-	        // if the user doesn't want to confirm, back off on the change
-	        // and let them decide if they want to hit cancel
-	        finish = WarningMessageDialog.
-	            openConfirm(getShell()
-	                        , Messages.JSFLibraryContainerWizardPage_V1Registry_Warning_DialogTitle
-	                        , Messages.JSFLibraryContainerWizardPage_V1Registry_Warning_DialogText);
-	        
-	        if (finish)
-	        {
-	            JSFLibraryRegistryUtil.removeV1JSFLibraryProperty(Collections.singletonList(_iproject));
-	        }
-	    }
-		return finish;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension2#getNewContainers()
-	 */
-	public IClasspathEntry[] getNewContainers() {
-		IPath cp = new Path(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID);
-		List res = new ArrayList();
-		Object[] items = lv.getCheckedElements();
-		for (int i=0;i<items.length;i++){
-			JSFLibrary jsfLib = (JSFLibrary)items[i];
-			if (getSelectedJSFLibariesForProject().get(jsfLib.getID()) == null){
-				IPath path = cp.append(new Path(jsfLib.getID()));
-				IClasspathEntry entry = JavaCore.newContainerEntry(path);
-				// need to update wtp dependency in j2ee mod dependency ui
-				res.add(entry);
-			}
-		}
-		return (IClasspathEntry[])res.toArray(new IClasspathEntry[]{});
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		if (!isJSFProject) {
-			return false;
-		}
-		if (isEditReference() && ! selectionHasChanged())
-			return false;
-		
-		return isValid();
-	}
-
-	private boolean isValid() {		
-		return isCheckedItems() && getErrorMessage() == null;
-	}
-
-	//to be used to know whether the selected library has changed when in "edit" mode
-	private boolean selectionHasChanged() {
-		JSFLibrary lib = getCurrentLibrarySelection();
-		if (lib == null)
-			return false;
-		
-		return (getJSFLibraryForEdit(containerEntry) != lib) ;
-
-	}
-
-	private JSFLibrary getCurrentLibrarySelection() {
-		JSFLibrary lib = null;
-		StructuredSelection ssel = (StructuredSelection)lv.getSelection();
-		if (ssel != null && !ssel.isEmpty()){
-			lib = (JSFLibrary)ssel.getFirstElement();
-		}
-		return lib;
-	}
-
-	private boolean isCheckedItems() {		
-		return lv.getCheckedElements().length > 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.ui.wizards.IClasspathContainerPage#getSelection()
-	 */
-	public IClasspathEntry getSelection() {
-		IClasspathEntry entry = null;
-		if (isEditReference()){
-			if (lv.getCheckedElements().length == 0)
-				return containerEntry;
-						
-			JSFLibrary lib = (JSFLibrary)lv.getCheckedElements()[0];
-			if (lib != null){
-				if (lib == getJSFLibraryForEdit(containerEntry))
-				{
-					return containerEntry;
-				}
-                IPath path = new Path(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID).append(new Path(lib.getID()));
-                entry = JavaCore.newContainerEntry(path, containerEntry.getAccessRules(), containerEntry.getExtraAttributes(),containerEntry.isExported());
-			}			
-		}
-		return entry;
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.ui.wizards.IClasspathContainerPage#setSelection(org.eclipse.jdt.core.IClasspathEntry)
-	 */
-	public void setSelection(IClasspathEntry containerEntry) {
-		//this is signalling that this is an "edit"
-		this.containerEntry = containerEntry;
-	}
-
-	public void createControl(Composite parent) {
-		//Build UI to display JSF Lib components from registry
-		Composite c = new Composite(parent, SWT.NONE);
-		c.setLayout(new GridLayout(2, false));
-		c.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		//disable wizard if this is not a valid JSF project
-		if (!isJSFProject){
-			Label warning = new Label(c , SWT.NONE);
-			warning.setText(Messages.JSFLibraryContainerWizardPage_WarningNoJSFFacet);
-			setControl(c);			
-			return;
-		}
-
-		Label lblViewer = new Label(c, SWT.NONE);
-		lblViewer.setText(Messages.JSFLibraryContainerWizardPage_JSFLibraries);
-		GridData gd1 = new GridData(GridData.BEGINNING);
-		gd1.horizontalSpan = 2;
-		lblViewer.setLayoutData(gd1);
-
-		lv = createTableViewer(c);
-		lv.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		lvAdapter = new JSFLibrariesTableViewerAdapter();
-		lvLabelProvider = new JSFLibrariesListLabelProvider();
-		lv.setContentProvider(lvAdapter);
-		lv.setLabelProvider(lvLabelProvider);
-		lv.addSelectionChangedListener(lvAdapter);
-		lv.addDoubleClickListener(lvAdapter);
-		lv.setComparator(lvAdapter);
-		
-		Composite buttons = new Composite(c, SWT.NONE);
-		buttons.setLayout(new GridLayout(1, false));
-		buttons.setLayoutData(new GridData(GridData.FILL_VERTICAL));
-		
-		final Button addButton = new Button(buttons, SWT.NONE);
-		addButton.setText(Messages.JSFLibraryContainerWizardPage_Add);
-		addButton.setLayoutData(new GridData(GridData.END | GridData.VERTICAL_ALIGN_BEGINNING));
-		addButton.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e){
-				openJSFLibraryWizard(null);				
-			}
-		});
-		
-		final Button editButton = new Button(buttons, SWT.NONE);
-		editButton.setText(Messages.JSFLibraryContainerWizardPage_Edit);
-		editButton.setLayoutData(new GridData(GridData.END | GridData.VERTICAL_ALIGN_BEGINNING));
-		editButton.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e){
-				StructuredSelection sel = (StructuredSelection)lv.getSelection();
-				if ((sel == null || sel.isEmpty()) && containerEntry != null){
-					JSFLibrary jsfLib = getJSFLibraryForEdit(containerEntry);
-					sel = new StructuredSelection(jsfLib);
-				}
-				openJSFLibraryWizard(sel);				
-			}
-
-		});
-		editButton.setVisible(false);
-		lv.addSelectionChangedListener(new ISelectionChangedListener(){
-			public void selectionChanged(SelectionChangedEvent event) {
-				setEditButton(event.getSelection());
-			}
-
-			private void setEditButton(final ISelection selection) {
-				IStructuredSelection sel = (IStructuredSelection)selection;
-				editButton.setVisible(sel.size()==1);		
-				if (sel.size() == 1){					
-					JSFLibrary lib = (JSFLibrary)sel.getFirstElement();
-					boolean pp = lib instanceof PluginProvidedJSFLibrary;
-					editButton.setEnabled(! pp);
-					if (isEditReference()){
-						lv.setAllChecked(false);
-						lv.setChecked(lib, true);
-					}
-				}
-				
-			}			
-		});
-		setControl(c);
-		
-		if (isEditReference()){
-			JSFLibrary lib = getJSFLibraryForEdit(containerEntry);
-			lv.setInput(getAllUnselectedJSFLibrariesExceptReferencedLib(lib));	
-			selectAndCheckCurrentLib(lib);
-			setDescription(Messages.JSFLibraryContainerWizardPage_EditLibrary_DescriptionText);
-		} 
-		else {
-			lv.setInput(getAllJSFLibraries());		
-			lv.setCheckedElements(getSelectedJSFLibariesForProject().values().toArray(new Object[0]));
-		}
-	}
-
-	private void selectAndCheckCurrentLib(final JSFLibrary lib) {
-		if (lib != null){
-			StructuredSelection ssel = new StructuredSelection(lib);	
-			lv.setSelection(ssel);
-			lv.setChecked(lib, true);
-		}
-	}
-
-	private Object getAllUnselectedJSFLibrariesExceptReferencedLib(JSFLibrary referenceLib) {
-		List allLibs = getAllJSFLibraries();
-		Collection selLibs = getSelectedJSFLibariesForProject().values();
-		for (Iterator it=selLibs.iterator();it.hasNext();){
-			JSFLibrary aLib = (JSFLibrary)it.next();
-			int i= allLibs.indexOf(aLib);
-			//remove from allLibs unless it is the selected reference
-			if (i >= 0 && ((referenceLib == null) || (aLib != null && ! aLib.getID().equals(referenceLib.getID())))){
-				allLibs.remove(i);
-			}
-		}
-		return allLibs;
-	}
-
-	private List getJSFLibraryEntries(IClasspathEntry[] entries) {
-		List jsfLibs = new ArrayList();
-		for (int i=0;i<entries.length;i++){
-			IClasspathEntry entry = entries[i];
-			if (JSFLibraryConfigurationHelper.isJSFLibraryContainer(entry)){
-				JSFLibrary lib = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry(). getJSFLibraryByID(getLibraryId(entry));
-				if (lib != null){
-					jsfLibs.add(lib);
-				}
-			}
-		}
-		
-		return jsfLibs;
-	}
-
-	private String getLibraryId(IClasspathEntry entry) {
-		return entry.getPath().segment(1);
-	}
-
-	private void openJSFLibraryWizard(IStructuredSelection element){
-		IWorkbenchWizard wizard = new JSFLibraryWizard();
-		IWorkbench wb = PlatformUI.getWorkbench();
-		wizard.init(wb, element);
-		WizardDialog dialog = new WizardDialog(wb.getActiveWorkbenchWindow().getShell(), wizard);
-		int ret = dialog.open();
-		if (ret == Window.OK){
-			//FIXME: select returned object
-			if (containerEntry == null){
-				lv.setInput(getAllJSFLibraries());				
-			}
-			else {
-				lv.setInput(getAllUnselectedJSFLibrariesExceptReferencedLib(getJSFLibraryForEdit(containerEntry)));
-				lv.refresh(true);
-			}
-			lv.refresh();
-		}
-	}
-	
-	private CheckboxTableViewer createTableViewer(Composite parent) {
-		Table table= new Table(parent, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-		table.setFont(parent.getFont());
-		CheckboxTableViewer tableViewer= new CheckboxTableViewer(table);
-		tableViewer.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent e) {
-				if (! isEditReference()){
-					//ensure that existing CP entries cannot be unchecked
-					if (getSelectedJSFLibariesForProject().get(((JSFLibrary)e.getElement()).getID()) != null){
-						if (containerEntry == null)
-							e.getCheckable().setChecked(e.getElement(), true);
-						else
-							lv.setAllChecked(true);
-					}
-				}
-				else {
-					//select only one
-					lv.setAllChecked(false);
-					lv.setChecked(e.getElement(), true);
-					if (isEditReference())
-						lv.setSelection(new StructuredSelection(e.getElement()));
-				}
-				validate();				
-			}
-		});
-		return tableViewer;
-	}
-
-	private Map getSelectedJSFLibariesForProject(){
-		if (_currentLibs == null){
-			List allLibs = getAllJSFLibraries();
-			List curLibs = getJSFLibraryEntries(currentEntries);
-			_currentLibs = new HashMap(curLibs.size());
-			for (Iterator it=curLibs.iterator();it.hasNext();){
-				JSFLibrary lib = (JSFLibrary)it.next();
-				int index = getIndex(allLibs, lib);
-				if (index >=0)
-					_currentLibs.put(lib.getID(), allLibs.get(index));
-			}
-					
-		}
-		return _currentLibs;
-	}
-	
-	private List getAllJSFLibraries() {
-		List allLibs = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getAllJSFLibraries();
-
-		return allLibs;
-	}
-
-
-	private JSFLibrary getJSFLibraryForEdit(
-			IClasspathEntry containerEntry_) {
-		if (currentLib == null){
-			String id = getLibraryId(containerEntry_);
-			currentLib = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getJSFLibraryByID(id);	
-		}
-		return currentLib;
-
-	}
-	
-	private int getIndex(List libs, JSFLibrary lib) {
-		for (int i=0;i<libs.size();i++){
-			if (lib.getID().equals(((JSFLibrary)libs.get(i)).getID()))
-				return i;
-		}
-		return -1;
-	}
-
-	private class JSFLibrariesTableViewerAdapter extends ViewerComparator implements IStructuredContentProvider, ISelectionChangedListener, IDoubleClickListener {
-
-		private Object input;
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			input = newInput;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-            // do nothing
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {		
-			return ((List)input).toArray();
-		}		
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-		 */
-		public void selectionChanged(SelectionChangedEvent event) {
-			if (isEditReference()){
-				setPageComplete(isPageComplete());
-			}
-			
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
-		 */
-		public void doubleClick(DoubleClickEvent event) {
-			doDoubleClick(event);
-		}
-		
-		public int compare(Viewer viewer, Object e1, Object e2) {
-			JSFLibrary lib1 = (JSFLibrary)e1;
-			JSFLibrary lib2 = (JSFLibrary)e2;
-			
-			//sort first by in selection already and then by name
-			boolean lib1Sel = getSelectedJSFLibariesForProject().get(lib1.getID())!=null;
-			boolean lib2Sel = getSelectedJSFLibariesForProject().get(lib2.getID())!= null;
-			
-			if ((lib1Sel && lib2Sel) || (!lib1Sel && !lib2Sel) ){
-				return getComparator().compare(lib1.getLabel(), lib2.getLabel());
-			}
-			else if (lib1Sel)
-				return -1;
-			else
-				return 1;
-		}
-	}
-	
-	private class JSFLibrariesListLabelProvider implements ILabelProvider{		
-		Image libImg;
-		public Image getImage(Object element) {
-			if (libImg == null){
-				ImageDescriptor libImgDesc = JSFUiPlugin.getImageDescriptor("obj16/library_obj.gif"); //$NON-NLS-1$
-				libImg = libImgDesc.createImage();
-			}
-			return libImg;
-		}
-
-		public String getText(Object element) {
-			if (element instanceof JSFLibrary) {
-				JSFLibrary lib = (JSFLibrary)element;
-				if (lib.isImplementation()) {
-					return lib.getLabel() + " " + IMPL_DESC; //$NON-NLS-1$
-				}
-                return lib.getLabel();
-			}
-			return null;
-		}
-
-		public void dispose() {
-			if (libImg != null)
-				libImg.dispose();
-		}
-
-		public void addListener(ILabelProviderListener listener) {		
-            // no listener support
-		}
-
-		public boolean isLabelProperty(Object element, String property) {
-			return false;
-		}
-
-		public void removeListener(ILabelProviderListener listener) {
-            // no listener support
-		}
-	}
-	
-	private void validate() {
-		setErrorMessage(null);
-		int implChosenCount = implSelectedCount();
-		if (implChosenCount>1){
-			setErrorMessage(Messages.JSFLibraryContainerWizardPage_ImplAlreadyPresent);
-		}
-        setPageComplete(isPageComplete());
-	}
-
-
-	private boolean isEditReference() {
-		return (containerEntry != null);		
-	}
-
-	private int implSelectedCount() {
-		int count = 0;
-		for (int i=0;i<lv.getCheckedElements().length;i++){
-			JSFLibrary lib = (JSFLibrary)lv.getCheckedElements()[i];
-			if (lib.isImplementation())
-				count++;
-		}
-		return count;
-	}
-
-	private void doDoubleClick(DoubleClickEvent event) {
-		StructuredSelection ssel = (StructuredSelection)event.getSelection();
-		if (ssel != null && 
-				(! ((JSFLibrary)ssel.getFirstElement() instanceof PluginProvidedJSFLibrary)))
-			openJSFLibraryWizard((IStructuredSelection)event.getSelection());
-	}
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryEditControl.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryEditControl.java
deleted file mode 100644
index e751dd9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryEditControl.java
+++ /dev/null
@@ -1,499 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Common control for adding JSF library instances
- */
-public class JSFLibraryEditControl extends Composite implements ModifyListener, SelectionListener {
-	private static final String MISSING = Messages.JSFLibrariesPreferencePage_MISSING_DESC;
-	private Text txtName;
-	private Label lblName;
-	private CCombo cboVersions;
-	private Label lblVersions;
-	private Button chkDeploy;
-	private Button chkImpl;
-	private Composite btnBar;
-	private Button btnAdd;
-	private Button btnRemove;
-	private TableViewer jars;
-	
-	private boolean initing = false;
-
-	private JSFLibrary workingCopyLibrary;
-	
-	private String validationMsg;
-	private Set _listeners;
-	private int _isNew = -1;//use isNew() method.. not this variable directly
-
-	/**
-	 * @param workingCopyLibrary  working copy of the JSF library
-	 * @param parent parent SWT control
-	 */
-	public JSFLibraryEditControl(JSFLibrary workingCopyLibrary, Composite parent){
-		super(parent, SWT.NONE);
-		this.workingCopyLibrary = workingCopyLibrary;
-		_listeners = new HashSet(1);
-		createControl(parent);
-	}
-	
-	/**
-	 * @param listener
-	 */
-	public void addValidationListener(JSFLibraryValidationListener listener){
-		removeValidationListener(listener);
-		_listeners.add(listener);
-	}
-	
-	/**
-	 * @param listener
-	 */
-	public void removeValidationListener(JSFLibraryValidationListener listener){
-		_listeners.remove(listener);
-	}
-	
-	/**
-	 * @param parent
-	 */
-	public void createControl(Composite parent) {
-		initing = true;
-
-//		this = new Composite(parent, SWT.NONE);
-		this.setLayout(new GridLayout(2, false));
-		this.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		lblName = new Label(this, SWT.NONE);
-		lblName.setText(Messages.JSFLibraryWizard_LibraryName);
-		lblName.setLayoutData(new GridData(GridData.BEGINNING));
-
-		txtName = new Text(this, SWT.BORDER);
-		txtName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		txtName.addModifyListener(this);
-
-		lblVersions = new Label(this, SWT.NONE);
-		lblVersions.setText(Messages.JSFLibraryWizard_VersionSupported);
-
-		cboVersions = new CCombo(this, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER);
-		cboVersions.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		cboVersions.addModifyListener(this);
-
-		Group jarsComp = new Group(this, SWT.NONE);
-		jarsComp.setText(Messages.JSFLibraryWizard_LibraryJars);
-		GridLayout gl1 = new GridLayout(2, false);
-		jarsComp.setLayout(gl1);
-		GridData gd2 = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.FILL_VERTICAL);
-		gd2.horizontalSpan = 2;
-		jarsComp.setLayoutData(gd2);
-
-		createJarsViewer(jarsComp);
-
-		createButtons(jarsComp);
-
-		chkImpl = new Button(this, SWT.CHECK);
-		chkImpl.setText(Messages.JSFLibraryWizard_IsJSFImplementation);
-		GridData gd3 = new GridData();
-		gd3.horizontalSpan = 2;
-		chkImpl.setLayoutData(gd3);
-		chkImpl.addSelectionListener(this);
-
-		chkDeploy = new Button(this, SWT.CHECK);
-		chkDeploy.setText(Messages.JSFLibraryWizard_DeployJars);
-		GridData gd4 = new GridData();
-		gd4.horizontalSpan = 2;
-		chkDeploy.setLayoutData(gd4);
-//		chkDeploy.addSelectionListener(this);
-		chkDeploy.setVisible(false);
-
-		loadVersions();
-
-		if (!isNew()) {
-			txtName.setText(workingCopyLibrary.getName());
-			if (workingCopyLibrary.getJSFVersion().getName().equals(JSFVersion.UNKNOWN_LITERAL.getName())) {
-				cboVersions.setText(Messages.JSFLibraryEditControl_ImplVersion_UNKNOWN);
-			} else {
-				cboVersions.setText(workingCopyLibrary.getJSFVersion().getName());
-			}
-			chkDeploy.setSelection(workingCopyLibrary.isDeployed());
-			chkImpl.setSelection(workingCopyLibrary.isImplementation());
-		}
-		jars.setInput(workingCopyLibrary);
-
-		initing = false;
-
-		txtName.setFocus();
-	}
-
-	private void createJarsViewer(Group jarsComp) {
-		jars = new TableViewer(jarsComp, SWT.BORDER | SWT.MULTI);
-		jars.setContentProvider(new IStructuredContentProvider() {
-			public Object[] getElements(Object inputElement) {
-				if (inputElement instanceof JSFLibrary)
-					return ((JSFLibrary) inputElement).getArchiveFiles()
-							.toArray();
-				return new Object[0];
-			}
-
-			public void dispose() {
-                // do nothing
-			}
-
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-				// won't happen
-			}
-		});
-		jars.setLabelProvider(new ILabelProvider() {
-			private Image jarImg = null;
-			public Image getImage(Object element) {
-				if (jarImg == null){
-					ImageDescriptor desc = JSFUiPlugin.getImageDescriptor("obj16/jar_obj.gif"); //$NON-NLS-1$
-					jarImg = desc.createImage();
-				}
-				return jarImg;
-			}
-
-			public String getText(Object element) {
-				StringBuffer labelBuf = new StringBuffer();
-				if (element instanceof ArchiveFile) {
-					ArchiveFile archive = (ArchiveFile) element;
-					labelBuf.append(archive.getName());	
-					if (!archive.exists())
-						labelBuf.append(MISSING); 
-					labelBuf.append(" - ").append(archive.getPath()); //$NON-NLS-1$
-				}
-				return labelBuf.toString();
-			}
-
-			public void addListener(ILabelProviderListener listener) {
-                // no listeners supported
-			}
-
-			public void dispose() {
-				if (jarImg != null)
-					jarImg.dispose();
-			}
-
-			public boolean isLabelProperty(Object element, String property) {
-				return false;
-			}
-
-			public void removeListener(ILabelProviderListener listener) {
-                // no listeners supported
-			}
-		});
-
-		jars.addSelectionChangedListener(new ISelectionChangedListener(){
-			public void selectionChanged(SelectionChangedEvent event){
-				updateButtons();
-			}
-		});
-		
-		GridData gd = new GridData(GridData.FILL_BOTH);
-//		gd.widthHint = convertWidthInCharsToPixels(30);
-//		gd.heightHint = convertHeightInCharsToPixels(10);
-		jars.getControl().setLayoutData(gd);
-	}
-
-	private void updateButtons() {
-		btnRemove.setEnabled(!((StructuredSelection)jars.getSelection()).isEmpty());
-		// getButton(IDialogConstants.OK_ID).setEnabled(modified);
-	}
-
-	private void createButtons(Composite c) {
-		btnBar = new Composite(c, SWT.NONE);
-		GridLayout gl = new GridLayout(1, false);
-		gl.marginHeight = 0;
-		gl.marginTop = 0;
-		gl.marginWidth = 0;
-		btnBar.setLayout(gl);
-		btnBar.setLayoutData(new GridData(GridData.END));
-
-		btnAdd = new Button(btnBar, SWT.NONE);
-		btnAdd.setText(Messages.JSFLibraryWizard_Add);
-		btnAdd.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		btnAdd.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				String cur = null;
-				String[] chosenJars = openExtJarFileDialog(cur);
-				if (chosenJars != null) {
-					for (int i = 0; i < chosenJars.length; i++) {
-						String jar = chosenJars[i];
-						if (!workingCopyLibrary.containsArchiveFile(jar)) {
-							ArchiveFile archive = JSFLibraryRegistryFactory.eINSTANCE
-								.createArchiveFile();
-							archive.setSourceLocation(jar);
-							archive.setRelativeDestLocation("WEB-INF/lib"); //$NON-NLS-1$
-							workingCopyLibrary.getArchiveFiles().add(archive);
-						}
-					}
-					jars.refresh();
-					validate();
-				}
-			}
-		});
-
-		btnRemove = new Button(btnBar, SWT.NONE);
-		btnRemove.setEnabled(false);
-		btnRemove.setText(Messages.JSFLibraryWizard_Remove);
-		btnRemove.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		btnRemove.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (jars.getSelection() instanceof StructuredSelection){
-					StructuredSelection objs = (StructuredSelection)jars.getSelection();
-					if (objs != null){
-						Iterator it = objs.iterator();
-						 while (it.hasNext()){
-							 Object obj = it.next();
-							 ArchiveFile jar = (ArchiveFile)obj;
-							 workingCopyLibrary.getArchiveFiles().remove(jar);							 
-						 }
-					}
-					jars.refresh();
-					validate();
-				}
-			}
-		});
-	}
-
-	private void loadVersions() {
-		cboVersions.removeAll();
-		Iterator it = JSFVersion.VALUES.iterator();
-		while (it.hasNext()) {
-			JSFVersion ver = (JSFVersion) it.next();
-			if (ver.getName().equals(JSFVersion.UNKNOWN_LITERAL.getName())) {
-				cboVersions.add(Messages.JSFLibraryEditControl_ImplVersion_UNKNOWN);
-			} else {
-				cboVersions.add(ver.getName());
-			}
-		}
-	}
-
-	private String[] openExtJarFileDialog(String existing) {
-		String title = Messages.JSFLibraryWizard_ExtJarFileDialogTitle;
-
-		FileDialog dialog = new FileDialog(getShell(),
-				existing == null ? SWT.MULTI : SWT.SINGLE);
-		dialog.setText(title);
-		dialog.setFilterExtensions(new String[] { "*.jar;*.zip" }); //$NON-NLS-1$
-		// FIXME: remember and use last path chosen??
-		String filterPath = ResourcesPlugin.getWorkspace().getRoot()
-				.getFullPath().toString();
-		dialog.setFilterPath(filterPath);
-		// if (existing != null) {
-		// dialog.setFileName(existing.getPath().lastSegment());
-		// }
-
-		String res = dialog.open();
-		if (res == null) {
-			return null;
-		}
-		String[] fileNames = dialog.getFileNames();
-		String[] elems = new String[fileNames.length];
-		IPath file = new Path(res);
-		IPath apath = file.removeLastSegments(1);
-		for (int i = 0; i < fileNames.length; i++) {
-			elems[i] = apath.append(fileNames[i]).toString();
-		}
-		return elems;
-	}	
-
-	public void modifyText(ModifyEvent e) {
-		validate();
-		updateButtons();	
-	}
-
-	private void fireValidateEvent(final JSFLibraryValidationEvent jSFLibraryValidationEvent) {
-		new Runnable(){
-			public void run() {
-				for (Iterator it=_listeners.iterator();it.hasNext();){
-					JSFLibraryValidationListener listener = (JSFLibraryValidationListener)it.next();
-					listener.notifyValidation(jSFLibraryValidationEvent);
-				}
-			}
-		}.run();
-	}
-
-
-	public void widgetSelected(SelectionEvent e) {
-		validate();
-		updateButtons();
-	}
-
-	public void widgetDefaultSelected(SelectionEvent e) {
-        // no handling for default selection
-	}
-
-	private void validate() {
-		if (initing)
-			return;
-		validationMsg = null;
-//		setPageComplete(true);
-		if (!validateName() || !validateJars() || !validateVersion()) {
-//			setPageComplete(false);
-		}
-		fireValidateEvent(new JSFLibraryValidationEvent(validationMsg));
-	}
-	
-	private boolean validateJars() {
-		if (workingCopyLibrary.getArchiveFiles().isEmpty()) {
-			validationMsg = Messages.JSFLibraryWizard_ValidateNoJars;
-			return false;
-		}
-		return true;
-	}
-	
-	private boolean validateVersion() {
-		//FIXME: why isn't selection indesx correct???
-	//	if (cboVersions.getSelectionIndex() < 0) {
-	//		setErrorMessage("Choose the maximum JSF version supported if known.");
-	//		return false;
-	//	}
-		return true;
-	}
-	
-	private boolean validateName() {
-		if (txtName.getText() == null
-				|| txtName.getText().trim().equals("")) { //$NON-NLS-1$
-			validationMsg = Messages.JSFLibraryWizard_ValidateNoLibraryName;
-			return false;
-		}
-		String aName = txtName.getText().trim();
-		if (isNew() || (!isNew() && !getCurrentLibraryName().equals(aName))) {
-			if (isNameInRegistry(JSFLibraryRegistryUtil.getInstance()
-					.getJSFLibraryRegistry().getAllJSFLibraries(), aName)) {
-				validationMsg = Messages.JSFLibraryWizard_ValidateExistingLibraryName;
-				return false;
-			}
-		}
-		return true;
-	}
-	
-	private boolean isNew() {
-		if (_isNew == -1){
-			_isNew = workingCopyLibrary.getName() == null ? 1 : 0;
-		}
-		return _isNew == 1;
-	}
-
-	private String getCurrentLibraryName() {
-		return workingCopyLibrary.getName();		
-	}
-
-	private boolean isNameInRegistry(Collection c, String name) {
-		Iterator it = c.iterator();
-		while (it.hasNext()) {
-			JSFLibrary lib = (JSFLibrary) it.next();
-			if (lib.getName().equals(name)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @return the trimmed name of the user input for jsf library name
-	 */
-	public String getJSFLibraryName() {		
-		return txtName.getText().trim();
-	}
-
-
-	/**
-	 * @return the value of the user input for the isDeployed checkbox
-	 */
-	public boolean getIsDeployed() {		
-		return chkDeploy.getSelection();
-	}
-
-
-	/**
-	 * @return the value of the user input for the isJSFImplementation checkbox
-	 */
-	public boolean getIsImplementation() {
-		return chkImpl.getSelection();
-	}
-
-	/**
-	 * @return the jsf version selected in the version dropping
-	 */
-	public JSFVersion getJSFVersion() {
-		if (cboVersions.getSelectionIndex() >= 0) {
-			JSFVersion ver = (JSFVersion) JSFVersion.VALUES.get(cboVersions
-					.getSelectionIndex());
-			return ver;
-		}
-		return JSFVersion.UNKNOWN_LITERAL;
-	}
-
-	/**
-	 * @param implsOnly
-	 */
-	public void setImplOnly(boolean implsOnly) {
-		if (implsOnly){
-			chkImpl.setSelection(true);
-			chkImpl.setEnabled(false);
-		}
-	}
-	
-	/**
-	 * @param nonImplsOnly
-	 */
-	public void setNonImplOnly(boolean nonImplsOnly) {
-		if (nonImplsOnly){
-			chkImpl.setSelection(false);
-			chkImpl.setEnabled(false);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryValidationEvent.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryValidationEvent.java
deleted file mode 100644
index a869d0a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryValidationEvent.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * Validation event used by JSFLibraryControl to notify containers of updates
- *
- */
-public class JSFLibraryValidationEvent {
-	private String msg;
-	private int severity;
-	
-	/**
-	 * Constructor
-	 * @param msg
-	 * @param severity - IStatus int value
-	 */
-	public JSFLibraryValidationEvent(String msg, int severity) {
-		this.msg = msg;
-		this.severity = severity;
-	}
-	
-	/**
-	 * Constructs event with severity of IStatus.ERROR
-	 * @param msg
-	 */
-	public JSFLibraryValidationEvent(String msg) {
-		this(msg, IStatus.ERROR);
-	}
-	
-	/**
-	 * @return validation message
-	 */
-	public String getMessage(){
-		return msg;
-	}
-	
-	/**
-	 * @return IStatus int value
-	 */
-	public int getSeverity(){
-		return severity;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryValidationListener.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryValidationListener.java
deleted file mode 100644
index dbd6b01..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryValidationListener.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-/**
- * Listeners of  {@link JSFLibraryValidationEvent}s should implement
- *
- */
-public interface JSFLibraryValidationListener {
-	/**
-	 * Callback 
-	 * @param e
-	 */
-	public void notifyValidation(JSFLibraryValidationEvent e);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryWizard.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryWizard.java
deleted file mode 100644
index bfab216..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryWizard.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * Dialog for creating or editing a JSF Library or Implementation.
- * <br>
- * If the selection passed in init is not null then the item will be edit mode.
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFLibraryWizard extends Wizard implements INewWizard {
-
-	/**
-	 * Implementation libaries to be included
-	 */
-	public static int IMPLS = 1;
-	/**
-	 * Non-Implementation libaries to be included
-	 */
-	public static int NONIMPLS = 2;
-	
-	private JSFLibraryEditControl jsfLibraryEditControl;
-	
-	private boolean isNew = false;
-	private boolean modified = false;
-
-	private JSFLibrary curLibrary;
-	private JSFLibrary workingCopyLibrary;
-
-	private JSFLibraryWizardPage page;
-
-	private static final String DESCRIPTION = Messages.JSFLibraryWizard_DESCRIPTION;
-	private static final String IMPLS_ONLY_DESC = Messages.JSFLibraryWizard_IMPLS_ONLY_DESC;
-
-	private boolean _impls;	
-	private boolean _nonimpls;
-	
-    private List<IProject>        _projectsWithV1JSFLibraries = new ArrayList<IProject>();
-	
-	/**
-	 * Constructor
-	 * see IMPLS
-	 * see NONIMPLS
-	 * @param libTypes 
-	 */
-	public JSFLibraryWizard(int libTypes) {
-		super();
-		if ((libTypes & IMPLS) == IMPLS)
-			_impls = true;
-
-		if ((libTypes & NONIMPLS) == NONIMPLS)
-			_nonimpls = true;
-	}
-
-	
-	/**
-	 * Constructor.   List will include all JSF Libraries.
-	 */
-	public JSFLibraryWizard() {
-		super();
-		_impls = true;
-		_nonimpls = true;
-	}
-
-	private boolean isImplsOnly(){
-		if (_impls && ! _nonimpls)
-			return true;
-		return false;		
-	}
-	
-	private boolean isNonImplsOnly(){
-		if (_nonimpls && ! _impls)
-			return true;
-		return false;		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) 
-	{
-	    initV1LibrariesList();
-	    
-		if (selection != null
-				&& selection.getFirstElement() instanceof JSFLibrary) {
-			curLibrary = (JSFLibrary) selection.getFirstElement();
-			workingCopyLibrary = curLibrary.getWorkingCopy();
-		} else {
-			isNew = true;
-			workingCopyLibrary = JSFLibraryRegistryFactory.eINSTANCE.createJSFLibrary();
-		}
-		if (isImplsOnly()) {
-			setWindowTitle(Messages.JSFLibraryWizard_CreateImplementation);
-		} else {
-			setWindowTitle(isNew ? Messages.JSFLibraryWizard_CreateJSFLibrary : Messages.JSFLibraryWizard_EditJSFLibrary);
-		}
-	}
-
-	private void initV1LibrariesList()
-	{
-        final IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
-        
-        // loop through the workspace and look for projects that are still using the V1 way
-        // of doing JSF libraries
-        for (int i = 0; i < projects.length; i++)
-        {
-            final IProject project = projects[i];
-            if (JSFLibraryRegistryUtil.doesProjectHaveV1JSFLibraries(project))
-            {
-                _projectsWithV1JSFLibraries.add(project);
-            }
-        }
-    }
-
-	/**
-	 * Updates the JSF Library instance with the values from the working copy and 
-	 * persists the registry.
-	 * 
-	 * If editing a library reference, referencing java models will be updated.
-	 *  
-	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
-	 */
-	public boolean performFinish() 
-	{
-	    // on init, if we detected any projects with old library
-	    // refs, we need to warn the user
-	    if (!isNew &&  // can ignore new libraries, since old projects can't possibly have dependencies on them
-	            _projectsWithV1JSFLibraries.size() > 0)
-	    {
-	        String  projectNames = ""; //$NON-NLS-1$
-	        for (Iterator<IProject> it = _projectsWithV1JSFLibraries.iterator(); it.hasNext();)
-	        {
-	            IProject project = it.next();
-	            projectNames += project.getName() + ","; //$NON-NLS-1$
-	        }
-	        // trim trailing comma
-	        if (projectNames.length() > 0)
-	        {
-	            projectNames = projectNames.substring(0, projectNames.length()-1);
-	        }
-	        
-	        final String messageText = MessageFormat.format(Messages.JSFLibraryWizard_V1JSFLibrary_DialogMessage,
-	                                        new Object[] {projectNames});
-	        MessageDialogWithToggle dialog = 
-	            WarningMessageDialogWithToggle.openOkCancelConfirm
-	                (getShell(), Messages.JSFLibraryWizard_V1JSFLibrary_DialogTitle, messageText, Messages.JSFLibraryWizard_JSFLibraryWizard_DontShowThisAgain_CheckBoxLabel, false, null, null);
-	        if (dialog.getReturnCode() != IDialogConstants.OK_ID)
-	        {
-	            // abort if the user doesn't really want to commit this change
-	            return false;
-	        }
-
-	        // if user accepted and asked not be warned again, clear the 
-	        // the project properties.
-	        if (dialog.getToggleState())
-            {
-	            JSFLibraryRegistryUtil.removeV1JSFLibraryProperty(_projectsWithV1JSFLibraries);
-            }
-	    }
-	    
-		final String name = jsfLibraryEditControl.getJSFLibraryName();
-		final boolean isDeployed = jsfLibraryEditControl.getIsDeployed();
-		final boolean isImplementation = jsfLibraryEditControl.getIsImplementation();
-		final JSFVersion version = jsfLibraryEditControl.getJSFVersion();
-		
-		workingCopyLibrary.setName(name);
-		workingCopyLibrary.setDeployed(isDeployed);
-		workingCopyLibrary.setImplementation(isImplementation);
-		workingCopyLibrary.setJSFVersion(version);
-		
-		final String originalID = curLibrary != null ? curLibrary.getID() :workingCopyLibrary.getID();
-		
-		if (isNew){
-			JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().addJSFLibrary(workingCopyLibrary);
-		}
-		else {
-			curLibrary.updateValues(workingCopyLibrary);
-			try {
-				JSFLibraryRegistryUtil.rebindClasspathContainerEntries(originalID, workingCopyLibrary.getID(), false, null);
-			} catch (JavaModelException e) {
-				JSFUiPlugin.log(IStatus.ERROR, "Exception while updating JSF Library containers", e); //$NON-NLS-1$
-			}
-		}
-		JSFLibraryRegistryUtil.getInstance().saveJSFLibraryRegistry();
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		page = new JSFLibraryWizardPage(Messages.JSFLibraryWizard_JSFLibrary);
-		super.addPage(page);
-		page.setWizard(this);
-	}
-
-	/**
-	 * @return the JSFLibrary being modified by this wizard
-	 */
-	public JSFLibrary getJSFLibrary() {
-		return workingCopyLibrary;
-	}
-
-	private class JSFLibraryWizardPage extends WizardPage {
-
-		/**
-		 * @param pageName
-		 */
-		protected JSFLibraryWizardPage(String pageName) {
-			super(pageName);
-			setDescription(isImplsOnly() ? IMPLS_ONLY_DESC : DESCRIPTION);
-			setTitle(Messages.JSFLibraryWizard_JSFLibrary);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-		 */
-		public boolean isPageComplete() {
-			if (modified == false) {
-				return false;
-			}
-			return super.isPageComplete();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-		 */
-		public void createControl(Composite parent) {
-			initializeDialogUnits(parent);
-
-			jsfLibraryEditControl = new JSFLibraryEditControl(workingCopyLibrary, parent);
-			jsfLibraryEditControl.setImplOnly(isImplsOnly());
-			jsfLibraryEditControl.setNonImplOnly(isNonImplsOnly());
-			jsfLibraryEditControl.setLayout(new GridLayout(2, false));
-			jsfLibraryEditControl.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-			jsfLibraryEditControl.addValidationListener(new JSFLibraryValidationListener(){
-				public void notifyValidation(JSFLibraryValidationEvent e) {
-					setErrorMessage(e.getMessage());
-					modified = true;
-					setPageComplete(getErrorMessage()==null);
-				}				
-			});
-
-			setControl(jsfLibraryEditControl);
-			setPageComplete(false);
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryWizardPage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryWizardPage.java
deleted file mode 100644
index f2209f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryWizardPage.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Dialog for creating or editing a JSF Library or Implementation.
- * <br>
- * If the selection passed in init is not null then the item will be edit mode.
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFLibraryWizardPage extends WizardPage {
-
-	private boolean modified = false;
-	private JSFLibrary workingCopyLibrary;
-
-	private static final String DESCRIPTION = Messages.JSFLibraryWizard_DESCRIPTION;
-
-	/**
-	 * Constructor
-	 */
-	public JSFLibraryWizardPage(){
-		super("JSFLibrary"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @return JSF Library working copy 
-	 */
-	public JSFLibrary getJSFLibrary() {
-		return workingCopyLibrary;
-	}
-
-	/**
-	 * Constructor
-	 * @param pageName
-	 */
-	public JSFLibraryWizardPage(String pageName) {
-		super(pageName);
-		setDescription(DESCRIPTION);//implsOnly ? IMPLS_ONLY_DESC : 
-		setTitle(Messages.JSFLibraryWizard_JSFLibrary);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		if (modified == false) {
-			return false;
-		}
-		return super.isPageComplete();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		initializeDialogUnits(parent);
-
-		JSFLibraryEditControl editControl = new JSFLibraryEditControl(workingCopyLibrary, parent);		
-		editControl.addValidationListener(new JSFLibraryValidationListener(){
-			public void notifyValidation(JSFLibraryValidationEvent e) {
-				setErrorMessage(e.getMessage());
-				modified = true;
-				setPageComplete(getErrorMessage()==null);					
-			}			
-		});
-		setControl(editControl);
-		setPageComplete(false);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/WarningMessageDialog.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/WarningMessageDialog.java
deleted file mode 100644
index ad3b136..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/WarningMessageDialog.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleAdapter;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Customized warning dialog for JSF Library Upgrade warnings.
- * 
- * @author cbateman
- *
- */
-class WarningMessageDialog extends MessageDialog 
-{
-    private Text    _messageLabel;
-    
-    /**
-     * @param parent
-     * @param title
-     * @param message
-     * @return true if the user hit OK
-     * 
-     * Overriden to set the default button to CANCEL and use this dialog.
-     */
-    public static boolean openConfirm(Shell parent, String title, String message) {
-        MessageDialog dialog = new WarningMessageDialog(parent, title, null, // accept
-                // the
-                // default
-                // window
-                // icon
-                message, QUESTION, new String[] { IDialogConstants.OK_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 1); // CANCEL is the
-        // default
-        return dialog.open() == 0;
-    }
-    
-    WarningMessageDialog(Shell parentShell, String dialogTitle,
-            Image dialogTitleImage, String dialogMessage, int dialogImageType,
-            String[] dialogButtonLabels, int defaultIndex) {
-        super(parentShell, dialogTitle, dialogTitleImage, dialogMessage,
-                dialogImageType, dialogButtonLabels, defaultIndex);
-    }
-
-    @Override
-    protected Control createMessageArea(Composite composite) 
-    {
-        // create composite
-        // create image
-        Image image = getImage();
-        if (image != null) {
-            imageLabel = new Label(composite, SWT.NULL);
-            image.setBackground(imageLabel.getBackground());
-            imageLabel.setImage(image);
-            addAccessibleListeners(imageLabel, image);
-            GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.BEGINNING)
-                    .applyTo(imageLabel);
-        }
-        // create message
-        if (message != null) {
-            _messageLabel = new Text(composite, getMessageLabelStyle()|SWT.READ_ONLY);
-            _messageLabel.setText(message);
-            GridDataFactory
-                    .fillDefaults()
-                    .align(SWT.FILL, SWT.BEGINNING)
-                    .grab(true, false)
-                    .hint(
-                            convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH),
-                            SWT.DEFAULT).applyTo(_messageLabel);
-        }
-        return composite;   
-    }
-    
-    /**
-     * NOTE: copied from IconAndMessageDialog
-     * Add an accessible listener to the label if it can be inferred from the
-     * image.
-     * 
-     * @param label
-     * @param image
-     */
-    private void addAccessibleListeners(Label label, final Image image) {
-        label.getAccessible().addAccessibleListener(new AccessibleAdapter() {
-            public void getName(AccessibleEvent event) {
-                final String accessibleMessage = getAccessibleMessageFor(image);
-                if (accessibleMessage == null) {
-                    return;
-                }
-                event.result = accessibleMessage;
-            }
-        });
-    }
-    
-    /**
-     * NOTE: copied from IconAndMessageDialog
-     * @param image
-     * @return an accesible string
-     */
-    private String getAccessibleMessageFor(Image image) {
-        if (image.equals(getErrorImage())) {
-            return JFaceResources.getString("error");//$NON-NLS-1$
-        }
-
-        if (image.equals(getWarningImage())) {
-            return JFaceResources.getString("warning");//$NON-NLS-1$
-        }
-
-        if (image.equals(getInfoImage())) {
-            return JFaceResources.getString("info");//$NON-NLS-1$
-        }
-
-        if (image.equals(getQuestionImage())) {
-            return JFaceResources.getString("question"); //$NON-NLS-1$
-        }
-
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/WarningMessageDialogWithToggle.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/WarningMessageDialogWithToggle.java
deleted file mode 100644
index 834889d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/WarningMessageDialogWithToggle.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleAdapter;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Customized warning dialog for JSF Library Upgrade warnings.
- * 
- * @author cbateman
- *
- */
-class WarningMessageDialogWithToggle extends MessageDialogWithToggle 
-{
-    private Text    _messageLabel;
-
-    /**
-     * @param parent
-     * @param title
-     * @param message
-     * @param toggleMessage
-     * @param toggleState
-     * @param store
-     * @param key
-     * @return the dialog.
-     * 
-     * Overriden to make default button CANCEL and use this dialog
-     */
-    public static MessageDialogWithToggle openOkCancelConfirm(Shell parent,
-            String title, String message, String toggleMessage,
-            boolean toggleState, IPreferenceStore store, String key) {
-        MessageDialogWithToggle dialog = new WarningMessageDialogWithToggle(parent,
-                title, null, // accept the default window icon
-                message, QUESTION, new String[] { IDialogConstants.OK_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 1, // CANCEL is the default
-                toggleMessage, toggleState);
-        dialog.open();
-        return dialog;
-    }
-    
-    WarningMessageDialogWithToggle(Shell parentShell, String dialogTitle,
-            Image image, String message, int dialogImageType,
-            String[] dialogButtonLabels, int defaultIndex,
-            String toggleMessage, boolean toggleState) {
-        super(parentShell, dialogTitle, image, message, dialogImageType,
-                dialogButtonLabels, defaultIndex, toggleMessage, toggleState);
-    }
-
-    @Override
-    protected Control createMessageArea(Composite composite) 
-    {
-        // create composite
-        // create image
-        Image image = getImage();
-        if (image != null) {
-            imageLabel = new Label(composite, SWT.NULL);
-            image.setBackground(imageLabel.getBackground());
-            imageLabel.setImage(image);
-            addAccessibleListeners(imageLabel, image);
-            GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.BEGINNING)
-                    .applyTo(imageLabel);
-        }
-        // create message
-        if (message != null) {
-            _messageLabel = new Text(composite, getMessageLabelStyle()|SWT.READ_ONLY);
-            _messageLabel.setText(message);
-            GridDataFactory
-                    .fillDefaults()
-                    .align(SWT.FILL, SWT.BEGINNING)
-                    .grab(true, false)
-                    .hint(
-                            convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH),
-                            SWT.DEFAULT).applyTo(_messageLabel);
-        }
-        return composite;   
-    }
-    
-    /**
-     * NOTE: copied from IconAndMessageDialog
-     * Add an accessible listener to the label if it can be inferred from the
-     * image.
-     * 
-     * @param label
-     * @param image
-     */
-    private void addAccessibleListeners(Label label, final Image image) {
-        label.getAccessible().addAccessibleListener(new AccessibleAdapter() {
-            public void getName(AccessibleEvent event) {
-                final String accessibleMessage = getAccessibleMessageFor(image);
-                if (accessibleMessage == null) {
-                    return;
-                }
-                event.result = accessibleMessage;
-            }
-        });
-    }
-    
-    /**
-     * NOTE: copied from IconAndMessageDialog
-     * @param image
-     * @return an accesible string
-     */
-    private String getAccessibleMessageFor(Image image) {
-        if (image.equals(getErrorImage())) {
-            return JFaceResources.getString("error");//$NON-NLS-1$
-        }
-
-        if (image.equals(getWarningImage())) {
-            return JFaceResources.getString("warning");//$NON-NLS-1$
-        }
-
-        if (image.equals(getInfoImage())) {
-            return JFaceResources.getString("info");//$NON-NLS-1$
-        }
-
-        if (image.equals(getQuestionImage())) {
-            return JFaceResources.getString("question"); //$NON-NLS-1$
-        }
-
-        return null;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/contentassist/JSFContentAssistProcessor.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/contentassist/JSFContentAssistProcessor.java
deleted file mode 100644
index 625bf5a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/contentassist/JSFContentAssistProcessor.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.ui.internal.contentassist;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.jface.text.contentassist.IContextInformationValidator;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.metadataprocessors.MetaDataEnabledProcessingFactory;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.sse.ui.internal.contentassist.CustomCompletionProposal;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
-import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-import org.eclipse.wst.xml.ui.internal.contentassist.XMLRelevanceConstants;
-import org.eclipse.wst.xml.ui.internal.taginfo.MarkupTagInfoProvider;
-import org.osgi.framework.Bundle;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * The content assist processor for non-EL attribute values.
- * 
- * @author Gerry Kessler - Oracle
- * 
- */
-public class JSFContentAssistProcessor implements IContentAssistProcessor {
-	private ITextRegionContextResolver resolver;
-	private ITaglibContextResolver tlResolver;
-	private String defaultAdditionalInfo;
-
-	private String defaultIconPath = "/icons/attr_val.gif"; //$NON-NLS-1$
-	
-	private ImageDescriptor defaultAttrValImgDesc;
-	
-	private MarkupTagInfoProvider fInfoProvider;
-
-	/**
-	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeCompletionProposals(org.eclipse.jface.text.ITextViewer,
-	 *      int)
-	 */
-	public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer,
-			int documentPosition) {
-		List proposals = new ArrayList();
-		IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE
-				.getContext(viewer, documentPosition);
-
-		if (context != null) {
-			resolver = IStructuredDocumentContextResolverFactory.INSTANCE
-					.getTextRegionResolver(context);
-
-			if (resolver != null) {
-				final String regionType = resolver.getRegionType();
-
-				if (regionType != null
-						&& regionType.equals(DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE)) {
-					
-					tlResolver = IStructuredDocumentContextResolverFactory.INSTANCE
-							.getTaglibContextResolver(context);
-
-					if (tlResolver != null) {
-						
-						Attr attr = getAttribute(context);
-						if (attr != null) {
-							Node tagElement = attr.getOwnerElement();
-							if (tagElement != null) {
-								String uri = tlResolver.getTagURIForNodeName(tagElement);
-								if (uri != null) {									
-									proposals = createProposals(context, uri, tagElement, attr);
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-
-		return (ICompletionProposal[]) proposals
-				.toArray(new ICompletionProposal[0]);
-	}
-
-	private String getDefaultAdditionalInfo(Node tagElement, Attr attr) {
-		if (defaultAdditionalInfo == null){
-			CMElementDeclaration elementNode = getCMElementDeclaration(tagElement);
-			if (elementNode != null){
-				CMAttributeDeclaration attrNode = getCMAttributeDeclaration(elementNode, attr);
-				if (attrNode != null)
-					defaultAdditionalInfo = getInfoProvider().getInfo(attrNode);
-			}
-		}
-		return defaultAdditionalInfo;
-	}
-	
-	private CMElementDeclaration getCMElementDeclaration(Node node) {
-		CMElementDeclaration result = null;
-		if (node.getNodeType() == Node.ELEMENT_NODE) {
-			ModelQuery modelQuery = ModelQueryUtil.getModelQuery(node.getOwnerDocument());
-			if (modelQuery != null)
-				result = modelQuery.getCMElementDeclaration((Element) node);
-		}
-		return result;
-	}
-
-	private CMAttributeDeclaration getCMAttributeDeclaration(CMElementDeclaration tagElement, Attr attr) {
-		CMNamedNodeMap attrs = tagElement.getAttributes();
-		for (Iterator it = attrs.iterator();it.hasNext();){
-			CMAttributeDeclaration CMAttr = (CMAttributeDeclaration)it.next();
-			if (CMAttr.getAttrName().equals(attr.getName()))
-				return CMAttr;
-		}
-		return null;
-	}
-	
-	private MarkupTagInfoProvider getInfoProvider() {
-		if (fInfoProvider == null) {
-			fInfoProvider = new MarkupTagInfoProvider();
-		}
-		return fInfoProvider;
-	}
-	
-	private List createProposals(IStructuredDocumentContext context, String uri, Node tagElement, Attr attr) {
-		List ret = new ArrayList();
-		List processors = MetaDataEnabledProcessingFactory.getInstance()
-						.getAttributeValueRuntimeTypeFeatureProcessors(
-								IPossibleValues.class, context, uri,
-								tagElement.getLocalName(), attr.getLocalName());
-		
-		if (processors != null) {
-			for (int i = 0; i < processors.size(); i++) {
-				IPossibleValues p = (IPossibleValues) processors.get(i);
-				ret.addAll(createProposals(p, tagElement, attr));
-			}
-		}
-		return ret;
-	}
-
-	private List createProposals(IPossibleValues p, Node tagElement, Attr attr) {
-		List ret = new ArrayList();
-		defaultAdditionalInfo = null;
-		Iterator it = p.getPossibleValues().iterator();
-		while (it.hasNext()) {
-			IPossibleValue val = (IPossibleValue) it.next();
-			if (val != null){ //just in case...
-				ICompletionProposal proposal = new CustomCompletionProposal(
-						val.getValue(), 		//replacement text
-						getReplacementOffset(), //replacementOffset
-						getReplacementLength(), //replacementLength
-						getCursorPosition(val), //cursor pos
-						getImage(val), 			//image
-						val.getDisplayValue(), 	//display value
-						null, 					//IContextInformation
-						getAdditionalInfo(val,tagElement,attr), //addditional info
-						XMLRelevanceConstants.R_JSP_ATTRIBUTE_VALUE,	//relevance
-						true);					//updateReplace
-	
-				ret.add(proposal);
-			}
-		}
-		return ret;
-	}
-
-
-	private String getAdditionalInfo(IPossibleValue val, Node tagElement, Attr attr) {
-		if (val.getAdditionalInformation() != null)
-			return val.getAdditionalInformation();
-		
-		return 	getDefaultAdditionalInfo(tagElement, attr);
-	}
-
-	private int getReplacementLength() {
-		return resolver.getRegionText().length() - 2;
-	}
-
-	private int getCursorPosition(IPossibleValue val) {
-		//Something changed in 1.5RC2 CustomCompletionProposal 
-		//it appears that the cursor position is now relative to where it is currently
-		//rather than relative to document
-		
-		//return getReplacementOffset() + val.getValue().length();
-		return val.getValue().length();
-	}
-
-	private int getReplacementOffset() {
-		return resolver.getStartOffset() + 1;
-	}
-
-	private Image getImage(IPossibleValue val) {
-		ImageDescriptor icon = val.getIcon();		
-		if (icon == null || icon.equals("")){ //$NON-NLS-1$
-			return getDefaultAttributeValueImage();
-		}
-		
-		return getOrCreateImage(icon);		
-	}
-
-	private Image getOrCreateImage(ImageDescriptor icon) {
-		if (icon == null)
-			return null;
-			
-		Image img = JSFUiPlugin.getDefault().getImageRegistry().get(icon.toString());
-		if (img == null){
-			try {
-				img = icon.createImage();
-				JSFUiPlugin.getDefault().getImageRegistry().put(icon.toString(), img);
-			} catch (RuntimeException e) {
-                // empty block; C.B: handle exception?
-			}
-		}
-		return img;
-	}
-
-	private Image getDefaultAttributeValueImage() {
-		if (defaultAttrValImgDesc == null){
-			Bundle bundle = Platform.getBundle(JSFUiPlugin.PLUGIN_ID);
-			URL url= FileLocator.find(bundle,new Path(defaultIconPath ), null);
-			defaultAttrValImgDesc = ImageDescriptor.createFromURL(url);
-		}
-		return getOrCreateImage(defaultAttrValImgDesc);
-	}
-
-	private Attr getAttribute(IStructuredDocumentContext context) {
-		final IDOMContextResolver domResolver = IStructuredDocumentContextResolverFactory.INSTANCE
-				.getDOMContextResolver(context);
-
-		if (domResolver != null) {
-			final Node curNode = domResolver.getNode();
-
-			if (curNode instanceof Attr) {
-				return (Attr) curNode;
-			}
-		}
-		return null;
-
-	}
-
-	public IContextInformation[] computeContextInformation(ITextViewer viewer,
-			int offset) {
-		// no context info
-		return null;
-	}
-
-	public char[] getCompletionProposalAutoActivationCharacters() {
-		// auto activate when user hits a '.'
-		return new char[] { '.' };
-	}
-
-	public char[] getContextInformationAutoActivationCharacters() {
-		// no auto-activation for context info
-		return null;
-	}
-
-	public String getErrorMessage() {
-		// don't flag errors
-		return null;
-	}
-
-	public IContextInformationValidator getContextInformationValidator() {
-		// don't validate context information
-		return null;
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/contentassist/el/JSFELContentAssistProcessor.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/contentassist/el/JSFELContentAssistProcessor.java
deleted file mode 100644
index c398843..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/contentassist/el/JSFELContentAssistProcessor.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.ui.internal.contentassist.el;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.jface.text.contentassist.IContextInformationValidator;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.core.internal.contentassist.el.ContentAssistParser;
-import org.eclipse.jst.jsf.core.internal.contentassist.el.ContentAssistStrategy;
-import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-import org.eclipse.wst.xml.ui.internal.contentassist.ProposalComparator;
-
-/**
- * The content assist processor for JSF EL partitions on attribute values.
- * 
- * @author cbateman
- *
- */
-public class JSFELContentAssistProcessor implements IContentAssistProcessor 
-{
-	/**
-	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeCompletionProposals(org.eclipse.jface.text.ITextViewer, int)
-	 */
-	public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer,
-			int documentPosition) 
-	{
-		final List  proposals = new ArrayList();
-		final IStructuredDocumentContext context = 
-			IStructuredDocumentContextFactory.INSTANCE.getContext(viewer, documentPosition);
-		
-		if (context != null)
-		{
-			ITextRegionContextResolver  resolver = 
-				IStructuredDocumentContextResolverFactory.INSTANCE.getTextRegionResolver(context);
-			
-			if (resolver != null)
-			{
-				final String regionType = resolver.getRegionType();
-				
-				if (regionType != null
-						&& resolver.matchesRelative(new String[] {DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE}))
-				{
-					
-					String elText = null;
-					
-					// if we are in the EL content, then get the current region text
-					if (DOMJSPRegionContexts.JSP_VBL_CONTENT.equals(regionType))
-					{
-						elText = resolver.getRegionText().trim();
-					}
-					// otherwise, we may be at the end of a content region but at
-					// the beginning of a closing brace so check to see if the previous
-					// region was a VBL_CONTENT
-					// TODO: this search algorithm may need improvement
-					else if (regionType.equals(DOMJSPRegionContexts.JSP_VBL_CLOSE))
-					{
-						IStructuredDocumentContext previousContext = 
-							resolver.getPreviousContext();
-						
-						ITextRegionContextResolver prevResolver =
-							IStructuredDocumentContextResolverFactory.INSTANCE.getTextRegionResolver(previousContext);
-						
-						if (prevResolver != null)
-						{
-                            if (DOMJSPRegionContexts.JSP_VBL_CONTENT.equals(prevResolver.getRegionType()))
-                            {
-    							resolver = prevResolver;
-    							elText = prevResolver.getRegionText().trim();
-                            }
-                            else if (DOMJSPRegionContexts.JSP_VBL_OPEN.equals(prevResolver.getRegionType()))
-                            {
-                                elText = ""; //$NON-NLS-1$
-                            }
-						}
-					}
-					
-                    
-					final ContentAssistStrategy strategy = 
-                        ContentAssistParser.getPrefix(documentPosition - resolver.getStartOffset() + 1, elText);
-                    
-					if (strategy != null)
-						proposals.addAll(strategy.getProposals(context));
-				}
-			}
-		}
-		
-        Collections.sort(proposals, new ProposalComparator());
-		return (ICompletionProposal[]) proposals.toArray(new ICompletionProposal[0]);
-	}
-
-
-	public IContextInformation[] computeContextInformation(ITextViewer viewer,
-			int offset) {
-		// no context info
-		return null;
-	}
-
-	public char[] getCompletionProposalAutoActivationCharacters() {
-		// auto activate when user hits a '.'
-		return new char[] {'.'};
-	}
-
-	public char[] getContextInformationAutoActivationCharacters() {
-		// no auto-activation for context info
-		return null;
-	}
-
-	public String getErrorMessage() {
-		// don't flag errors
-		return null;
-	}
-
-	public IContextInformationValidator getContextInformationValidator() {
-		// don't validate context information
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/IJSFImplLibraryCreationListener.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/IJSFImplLibraryCreationListener.java
deleted file mode 100644
index 85fc288..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/IJSFImplLibraryCreationListener.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Justin Chen - development check in
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.jsflibraryconfig;
-
-/**
- * Listener interface when a new JSF implementation library is created.
- * 
- * @author Justin Chen - Oracle
- *
- */
-public interface IJSFImplLibraryCreationListener extends java.util.EventListener {
-	/**
-	 * Ok button is pressed in JSF Library dialog.
-	 * 
-	 * @param event
-	 */
-	public void okClicked(JSFImplLibraryCreationEvent event);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFImplLibraryCreationEvent.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFImplLibraryCreationEvent.java
deleted file mode 100644
index df3b0f1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFImplLibraryCreationEvent.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Justin Chen - development check in
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.jsflibraryconfig;
-
-import java.util.EventObject;
-
-/**
- * JSF Implementation library creation event.
- * 
- * @author Justin Chen - Oracle
- *
- */
-public class JSFImplLibraryCreationEvent extends EventObject {
-
-	private static final long serialVersionUID = 6390319185522362453L;
-	private boolean isLibCreated; 
-	
-	/**
-	 * @param source
-	 * @param okClicked
-	 */
-	public JSFImplLibraryCreationEvent(Object source, boolean okClicked) {
-		super(source);
-		this.isLibCreated = okClicked;
-	}
-
-	/**
-	 * Ok button pressed.
-	 * 
-	 * @return boolean
-	 */
-	public boolean isLibraryCreated() {
-		return isLibCreated;
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControl.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControl.java
deleted file mode 100644
index 26386cd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControl.java
+++ /dev/null
@@ -1,1000 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Justin Chen
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.jsflibraryconfig;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.EventObject;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryConfigModel;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryConfiglModelSource;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties;
-import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.jst.jsf.ui.internal.classpath.JSFLibraryWizard;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelSynchHelper;
-
-/**
- * A custom control used in wizard and property pages.
- * 
- * @author Justin Chen
- */
-public class JSFLibraryConfigControl extends Composite { 
-	private static final String IMPL_DESC = Messages.JSFLibrariesPreferencePage_IMPL_DESC;
-	private static final String DEFAULT_IMPL_DESC = Messages.JSFLibrariesPreferencePage_DEFAULT_IMPL_DESC;
-	private static final String MISSING = Messages.JSFLibrariesPreferencePage_MISSING_DESC;
-
-	final private int COLUMN_DEPLOY = 0;
-	final private int COLUMN_LIB_NAME = 1;
-
-	private JSFLibraryConfigModel workingCopyModel = null;
-	
-	private Button btnServerSupplied;
-	private Button btnUserSupplied;
-	private ComboViewer cvImplLib;
-	private CheckboxTableViewer ctvSelCompLib;
-	private Button btnDeployJars;
-	private TreeViewer tvCompLib;
-	private TreeViewerAdapter tvAdapter;
-	private TreeLabelProvider tvLabelProvider;
-	private Combo comboImplLib;
-	private Button btnAddAll;
-	private Button btnRemoveAll;
-	
-	private Vector newJSFLibCreatedListeners = new Vector();
-	private Set _changeListeners;
-	private boolean _initing;
-	private IDataModel model;	
-
-	/**
-	 * @param listener
-	 */
-	public void addOkClickedListener(IJSFImplLibraryCreationListener listener) {
-		newJSFLibCreatedListeners.addElement(listener);
-	}
-	/**
-	 * @param listener
-	 */
-	public void removeOkClickedListener(IJSFImplLibraryCreationListener listener) {
-		newJSFLibCreatedListeners.removeElement(listener);
-	}
-	
-	/**
-	 * @param listener
-	 */
-	public void addChangeListener(JSFLibraryConfigControlChangeListener listener){
-		getChangeListeners().add(listener);
-	}
-	
-	/**
-	 * @param listener
-	 */
-	public void removeChangeListener(JSFLibraryConfigControlChangeListener listener){
-		if (getChangeListeners().contains(listener))
-			getChangeListeners().remove(listener);
-	}
-	
-	private Set getChangeListeners() {
-		if (_changeListeners == null){
-			_changeListeners = new HashSet();
-		}
-		return _changeListeners;
-	}
-	
-	private void fireChangedEvent(final EventObject e){
-		if (_initing) return;
-		SafeRunnable.run(new ISafeRunnable(){
-			public void handleException(Throwable exception) {
-			    // TODO: should we perhaps do something here?
-			    JSFUiPlugin.log(IStatus.ERROR, exception.getLocalizedMessage());
-			}
-			public void run() throws Exception {
-				for (Iterator it=getChangeListeners().iterator();it.hasNext();){
-					((JSFLibraryConfigControlChangeListener)it.next()).changed(new JSFLibraryConfigControlChangeEvent(e));
-				}
-			}
-		});
-	}
-	
-	/**
-	 * Create the composite
-	 * @param parent
-	 * @param style
-	 */	
-	public JSFLibraryConfigControl(Composite parent, int style) {
-		super(parent, style);
-		_initing = true;
-		createControls();
-	}	
-	
-	/**
-	 * set control values from provided model.
-	 * 
-	 * @param source
-	 */
-	public void loadControlValuesFromModel(JSFLibraryConfiglModelSource source) {
-		if (source != null) {
-			// never read persistentModel = source;
-			workingCopyModel = JSFLibraryConfigModel.JSFLibraryConfigModelFactory.createInstance(source);
-			initializeControlValues();
-			_initing = false;
-		} else {
-			JSFUiPlugin.log(IStatus.ERROR, Messages.JSFLibraryConfigControl_NullProject);
-		}
-		
-	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.swt.widgets.Widget#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-	}
-	
-	/**
-	 * Return current selected JSF Implementation Library.
-	 * Otherwise, return null.
-	 *  
-	 * @return JSFLibraryInternalReference
-	 */
-	public JSFLibraryInternalReference getSelectedJSFLibImplementation() {
-		return workingCopyModel.getCurrentJSFImplementationLibrarySelection();
-	}
-	 
-	/**
-	 * Return a list of selected JSF Component Libraries.
-	 * Otherwise, return an empty list.
-	 * 
-	 * @return a list of selected JSF Component Libraries
-	*/
-	public List getSelectedJSFLibComponents() {
-		return workingCopyModel.getCurrentJSFComponentLibrarySelection();
-	}
-	
-	/**
-	 * 
-	 * @return JSFLibraryConfigModelAdapter
-	 */
-	public JSFLibraryConfigModel getWorkingModel() {
-		return workingCopyModel;
-	}
-	
-	private void initializeControlValues() {
-		loadJSFImplList();
-		
-		btnDeployJars.setSelection(false);
-		JSFLibraryInternalReference savedImplLib = workingCopyModel.getSavedJSFImplementationLibrary();
-		if ( savedImplLib != null ) {
-			/*
-			 * Get the input for the control to set selection.
-			 */
-			JSFLibraryInternalReference selected = JSFLibraryRegistryUtil.getInstance().getJSFLibraryReferencebyID(savedImplLib.getID());
-			if (selected != null) {
-				btnDeployJars.setSelection(selected.isCheckedToBeDeployed());			
-				cvImplLib.setSelection(new StructuredSelection(selected), true);
-			}
-		} else {
-			JSFLibraryInternalReference dftJSFImplLib = JSFLibraryRegistryUtil.getInstance().getDefaultJSFImplementationLibrary();
-			if (dftJSFImplLib != null) {			
-				btnDeployJars.setSelection(dftJSFImplLib.isCheckedToBeDeployed());	
-				cvImplLib.setSelection(new StructuredSelection(dftJSFImplLib), true);				
-			}
-			else 
-				btnDeployJars.setEnabled(false);
-		}
-		
-		loadJSFCompList();
-
-		JSFLibraryInternalReference savedCompLib = null; 
-		JSFLibraryInternalReference selected = null;
-		//Iterator it = persistentModel.getJSFComponentLibraries().iterator();
-		Iterator it = workingCopyModel.getJSFComponentLibraries().iterator();
-		while (it.hasNext()) {
-			savedCompLib = (JSFLibraryInternalReference) it.next();
-			selected = JSFLibraryRegistryUtil.getInstance().getJSFLibraryReferencebyID(savedCompLib.getID());
-			if (selected != null) {
-				ctvSelCompLib.setChecked(selected, selected.isCheckedToBeDeployed());
-			}
-		}
-
-		setCompListModelProperty();
-		
-		initializeImplementationType();
-		
-		redraw();
-	}
-	
-	private void initializeImplementationType() {
-		IMPLEMENTATION_TYPE implType = workingCopyModel.getImplementationType();
-		if (implType == IMPLEMENTATION_TYPE.SERVER_SUPPLIED) {
-			btnServerSupplied.setSelection(true);
-			btnUserSupplied.setSelection(false);
-			enableUserSupplied(false);
-		} else if (implType == IMPLEMENTATION_TYPE.CLIENT_SUPPLIED) {
-			btnServerSupplied.setSelection(false);
-			btnUserSupplied.setSelection(true);
-			enableUserSupplied(true);
-		} else {
-			enableUserSupplied(false);
-		}	
-		model.setProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE_PROPERTY_NAME, implType);
-	}
-	private void loadJSFImplList() {
-		cvImplLib.setInput(workingCopyModel.getJSFImplementationLibraries());
-	}
-	
-	private void loadJSFCompList() {
-		tvCompLib.setInput(workingCopyModel.getJSFComponentLibraries());
-		ctvSelCompLib.setInput(workingCopyModel.getJSFComponentLibraries());		
-	}
-	
-	private JSFLibraryInternalReference getCurrentSelectedJSFImplLib() {
-		JSFLibraryInternalReference selJSFImpl = null;
-		StructuredSelection objs = (StructuredSelection)cvImplLib.getSelection();
-		if (objs != null){
-			if (objs.getFirstElement() instanceof JSFLibraryInternalReference){
-				selJSFImpl = (JSFLibraryInternalReference)objs.getFirstElement();
-			}
-		}
-		return selJSFImpl;		
-	}
-
-	private void createImplLibControls(Composite parent) {
-		final Composite cmpImpls = new Composite(parent, SWT.NONE);
-		final GridLayout gridLayoutImpls = new GridLayout();
-		gridLayoutImpls.numColumns = 4;
-		gridLayoutImpls.marginLeft = 0;
-		gridLayoutImpls.marginTop = 0;
-		gridLayoutImpls.marginBottom = 0;
-		
-		cmpImpls.setLayout(gridLayoutImpls);
-		GridData gdCmpImpls = new GridData();
-		gdCmpImpls.horizontalAlignment = SWT.FILL;
-		gdCmpImpls.grabExcessHorizontalSpace = true;
-		cmpImpls.setLayoutData(gdCmpImpls);
-
-		btnServerSupplied = new Button(cmpImpls, SWT.RADIO);
-		btnServerSupplied.setToolTipText(Messages.JSFLibraryConfigControl_ServerSuppliedButtonTooltip);
-		GridData gdSS = new GridData();
-		gdSS.horizontalAlignment = SWT.BEGINNING;
-		btnServerSupplied.setLayoutData(gdSS);
-		
-		btnServerSupplied.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e) {
-				setServerSuppliedLibrarySelection(e);
-			}			
-		});
-		
-		Label lblServerSupplied = new Label(cmpImpls, SWT.NONE);
-		lblServerSupplied.setText(Messages.JSFLibraryConfigControl_ServerSuppliedButtonLabel);
-		GridData lblSS = new GridData();
-		lblSS.grabExcessHorizontalSpace = true;
-		lblServerSupplied.setLayoutData(lblSS);
-		lblServerSupplied.addMouseListener(new MouseAdapter(){
-			public void mouseUp(MouseEvent e) {
-				btnServerSupplied.setSelection(true);
-				setServerSuppliedLibrarySelection(e);				
-			}			
-		});
-		
-		
-		Label lblSpacer1 = new Label(cmpImpls, SWT.NONE);
-		GridData gdSpc1 = new GridData();
-		gdSpc1.horizontalAlignment = SWT.END;
-		gdSpc1.horizontalSpan = 2;
-		lblSpacer1.setLayoutData(gdSpc1);
-		
-		btnUserSupplied = new Button(cmpImpls, SWT.RADIO);
-		btnUserSupplied.setLayoutData(new GridData());
-		btnUserSupplied.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e) {
-				setUserSuppliedLibrarySelection(e);
-			}			
-		});
-		
-		this.addOkClickedListener(new IJSFImplLibraryCreationListener() {
-			public void okClicked(JSFImplLibraryCreationEvent event) {				
-				if (! btnUserSupplied.getSelection()  && event.isLibraryCreated()) {
-					btnServerSupplied.setSelection(false);
-					setUserSuppliedLibrarySelection(event);
-				}				
-			}			
-		});
-			
-		cvImplLib = new ComboViewer(cmpImpls, SWT.READ_ONLY);
-		cvImplLib.setLabelProvider(new ImplLibCVListLabelProvider());
-		cvImplLib.setContentProvider(new ImplLibCVContentProvider());
-		comboImplLib = cvImplLib.getCombo();
-		GridData gd_cvImplLib = new GridData();
-		gd_cvImplLib.horizontalAlignment = SWT.FILL;
-		gd_cvImplLib.grabExcessHorizontalSpace = true;
-		comboImplLib.setLayoutData(gd_cvImplLib);
-		cvImplLib.addSelectionChangedListener(
-			new ISelectionChangedListener() {
-				public void selectionChanged(SelectionChangedEvent event) {
-					StructuredSelection ss = (StructuredSelection) event.getSelection();
-					JSFLibraryInternalReference crtSelImplLib = (JSFLibraryInternalReference) ss.getFirstElement();
-					if (crtSelImplLib != null) btnDeployJars.setEnabled(true);
-					crtSelImplLib.setToBeDeployed(btnDeployJars.getSelection());
-					workingCopyModel.setCurrentJSFImplementationLibrarySelection(crtSelImplLib);
-					model.setProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION, crtSelImplLib);
-					fireChangedEvent(event);
-				}
-			}
-		);
-			
-		btnDeployJars = new Button(cmpImpls, SWT.CHECK);
-		GridData gdDeploy = new GridData();
-		btnDeployJars.setLayoutData(gdDeploy);
-		btnDeployJars.setText(Messages.JSFLibraryConfigControl_DeployButtonLabel);
-		btnDeployJars.setToolTipText(Messages.JSFLibraryConfigControl_DeployJAR);
-		btnDeployJars.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (! _initing){
-					JSFLibraryInternalReference jsflib = getCurrentSelectedJSFImplLib();
-					if (jsflib != null)
-						jsflib.setToBeDeployed(btnDeployJars.getSelection());
-					workingCopyModel.setCurrentJSFImplementationLibrarySelection(jsflib);//why r we doing this here???
-	//				model.setProperty(IJSFFacetInstallDataModelProperties.DEPLOY_IMPLEMENTATION, btnDeployJars.getSelection());
-					fireChangedEvent(e);
-				}
-			}
-		}
-		);
-		
-		final Button btnNewImpl = new Button(cmpImpls, SWT.NONE); //compTest,
-		GridData gdNew = new GridData();
-		gdNew.horizontalAlignment = SWT.END;
-		btnNewImpl.setLayoutData(gdNew);
-		btnNewImpl.setText(Messages.JSFLibraryConfigControl_NewImplementationLibrary);	
-		btnNewImpl.setToolTipText(Messages.JSFLibraryConfigControl_NewImplButtonTooltip);
-		btnNewImpl.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				JSFLibraryWizard wizard = new JSFLibraryWizard(JSFLibraryWizard.IMPLS);
-				IWorkbench wb = PlatformUI.getWorkbench();
-				wizard.init(wb, null);
-				WizardDialog dialog = new WizardDialog(wb
-						.getActiveWorkbenchWindow().getShell(), wizard);
-				int ret = dialog.open();
-				if (ret == Window.OK) {	
-					JSFLibraryInternalReference lib = new JSFLibraryInternalReference(wizard.getJSFLibrary(), true, true);
-					JSFLibraryRegistryUtil.getInstance().addJSFLibrary(lib);
-					workingCopyModel.getJSFImplementationLibraries().add(lib);
-					workingCopyModel.setCurrentJSFImplementationLibrarySelection(lib);
-					
-					loadJSFImplList();
-					btnDeployJars.setSelection(true);
-					cvImplLib.setSelection(new StructuredSelection(lib), true);
-					
-				}
-				// notify listeners that a JSF implementation is created.
-				JSFImplLibraryCreationEvent event = new JSFImplLibraryCreationEvent(this, (ret == Window.OK));
-				int size = newJSFLibCreatedListeners.size();
-				for (int i = 0; i < size; i++) {
-					IJSFImplLibraryCreationListener listener = 
-						(IJSFImplLibraryCreationListener) newJSFLibCreatedListeners.elementAt(i);
-					listener.okClicked(event);
-				}
-			}
-		});		
-	}
-	
-	private void setServerSuppliedLibrarySelection(final EventObject e) {
-		btnUserSupplied.setSelection(false);
-		model.setProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE_PROPERTY_NAME, IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE.SERVER_SUPPLIED);
-		enableUserSupplied(false);
-		fireChangedEvent(e);
-		
-	}
-	
-	private void setUserSuppliedLibrarySelection(final EventObject e) {
-		btnUserSupplied.setSelection(true);
-		model.setProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE_PROPERTY_NAME, IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE.CLIENT_SUPPLIED);
-		enableUserSupplied(true);	
-		fireChangedEvent(e);
-	}
-	
-	private void enableUserSupplied(boolean enabled) {
-		cvImplLib.getCombo().setEnabled(enabled);
-		btnDeployJars.setEnabled(enabled);		
-	}
-	
-	private void createCompLibControls(Composite parent) {
-		final Composite cmpCompLibs = new Composite(parent, SWT.NONE);
-		final GridLayout gridLayoutCompLibs = new GridLayout();
-		gridLayoutCompLibs.numColumns = 4;
-		gridLayoutCompLibs.marginLeft = 0;
-		gridLayoutCompLibs.marginRight = 0;
-		gridLayoutCompLibs.marginWidth = 0;
-		cmpCompLibs.setLayout(gridLayoutCompLibs);
-		GridData gdComp = new GridData();
-		gdComp.horizontalAlignment = SWT.FILL;
-		gdComp.grabExcessHorizontalSpace = true;
-		cmpCompLibs.setLayoutData(gdComp);
-		
-		
-		final Label lblCompLib = new Label(cmpCompLibs, SWT.NONE);
-		final GridData gd_lbl_complib = new GridData(GridData.FILL, GridData.CENTER, false, false, 4, 1);
-		lblCompLib.setLayoutData(gd_lbl_complib);
-		lblCompLib.setText(Messages.JSFLibraryConfigControl_ComponentLibrary);
-				
-		tvCompLib = new TreeViewer(cmpCompLibs, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
-		tvAdapter = new TreeViewerAdapter();
-		tvLabelProvider = new TreeLabelProvider();
-		tvCompLib.setContentProvider(tvAdapter);
-		tvCompLib.setLabelProvider(tvLabelProvider);
-		tvCompLib.addDoubleClickListener(new IDoubleClickListener(){
-			public void doubleClick(DoubleClickEvent event) {
-				resetComponentLibSelection((StructuredSelection)event.getSelection(), 
-						tvCompLib, 
-						ctvSelCompLib, 
-						true);	
-				fireChangedEvent(event);
-			}			
-		});
-		tvCompLib.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
-		tvCompLib.addFilter(new TreeViewerFilter());		
-		
-		final Composite composite_buttons = new Composite(cmpCompLibs, SWT.NONE);
-		composite_buttons.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-		composite_buttons.setLayout(new GridLayout());
-
-		final Composite composite_Single = new Composite(composite_buttons, SWT.None);
-		composite_Single.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		final GridLayout gl_Single = new GridLayout();
-		gl_Single.marginHeight = 4;
-		composite_Single.setLayout(gl_Single);
-		
-		final Button btnAdd = new Button(composite_Single, SWT.NONE);
-		btnAdd.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-		btnAdd.setText(Messages.JSFLibraryConfigControl_Add);
-		btnAdd.setEnabled(false);
-
-		final Button btnRemove = new Button(composite_Single, SWT.NONE);
-		btnRemove.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-		btnRemove.setText(Messages.JSFLibraryConfigControl_Remove);
-		btnRemove.setEnabled(false);
-		
-		final Composite composite_All = new Composite(composite_buttons, SWT.None);
-		composite_All.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		final GridLayout gl_All = new GridLayout();
-		gl_Single.marginHeight = 4;
-		composite_All.setLayout(gl_All);
-		
-		btnAddAll = new Button(composite_All, SWT.NONE);
-		btnAddAll.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-		btnAddAll.setText(Messages.JSFLibraryConfigControl_AddAll);
-
-		btnRemoveAll = new Button(composite_All, SWT.NONE);
-		btnRemoveAll.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-		btnRemoveAll.setText(Messages.JSFLibraryConfigControl_RemoveAll);
-
-		final Composite composite_New = new Composite(composite_buttons, SWT.None);
-		composite_New.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		final GridLayout gl_New = new GridLayout();
-		gl_Single.marginHeight = 4;
-		composite_New.setLayout(gl_New);
-		
-		final Button btnNewCompLib = new Button(composite_New, SWT.NONE);
-		btnNewCompLib.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false));
-		btnNewCompLib.setText(Messages.JSFLibraryConfigControl_NewComponentLibrary);		
-		btnNewCompLib.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				JSFLibraryWizard wizard = new JSFLibraryWizard(JSFLibraryWizard.NONIMPLS);				
-				IWorkbench wb = PlatformUI.getWorkbench();
-				wizard.init(wb, null);
-				WizardDialog dialog = new WizardDialog(wb
-						.getActiveWorkbenchWindow().getShell(), wizard);						
-				int ret = dialog.open();
-				if (ret == Window.OK) {
-					JSFLibraryInternalReference lib = new JSFLibraryInternalReference(
-							wizard.getJSFLibrary(), 
-							true, 
-							true);
-					JSFLibraryRegistryUtil.getInstance().addJSFLibrary(lib);					
-					workingCopyModel.getJSFComponentLibraries().add(lib);
-					
-					loadJSFCompList();
-					setCompListModelProperty();
-					ctvSelCompLib.setChecked(lib, true);
-				}
-			}
-		});	
-
-		ctvSelCompLib = CheckboxTableViewer.newCheckList(cmpCompLibs, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER);
-		ctvSelCompLib.addFilter(new CheckedTableViewerFilter());
-		final Table table = ctvSelCompLib.getTable();
-		table.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));		
-		table.setHeaderVisible(true);
-		final TableColumn tcDeploy = new TableColumn(table, SWT.LEFT);
-		tcDeploy.setWidth(50);
-		tcDeploy.setText(Messages.JSFLibraryConfigControl_TH_Deploy);
-		tcDeploy.setToolTipText(Messages.JSFLibraryConfigControl_DeployJAR);
-		final TableColumn tcLibName = new TableColumn(table, SWT.LEFT);
-		tcLibName.setWidth(150);
-		tcLibName.setText(Messages.JSFLibraryConfigControl_TH_LibraryName);
-		
-		//ctvSelCompLib.setCellModifier(new CellModifierCTVSelCompLib());
-		ctvSelCompLib.setSorter(new SelectedCompLibCTVSorter());
-		ctvSelCompLib.setLabelProvider(new SelectedCompLibCTVLabelProvider());
-		ctvSelCompLib.setContentProvider(new CompLibCTVContentProvider());
-		ctvSelCompLib.addDoubleClickListener(new IDoubleClickListener(){
-			public void doubleClick(DoubleClickEvent event) {
-				resetComponentLibSelection((StructuredSelection)event.getSelection(), 
-						tvCompLib, 
-						ctvSelCompLib, 
-						false);	
-				fireChangedEvent(event);
-			}			
-		});
-		ctvSelCompLib.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				JSFLibraryInternalReference changedItem = (JSFLibraryInternalReference) event.getElement();
-				boolean isChecked4Deploy = event.getChecked();
-				
-				List list = workingCopyModel.getJSFComponentLibraries();
-				Iterator it = list.iterator();
-				JSFLibraryInternalReference crtjsflib = null;
-				while (it.hasNext()) {
-					crtjsflib = (JSFLibraryInternalReference) it.next();
-					if (crtjsflib.getID().equals(changedItem.getID())) {
-						crtjsflib.setToBeDeployed(isChecked4Deploy);
-						fireChangedEvent(event);
-						break;
-					}
-				}
-			}
-		});
-		
-		btnAdd.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				resetComponentLibSelection((StructuredSelection)tvCompLib.getSelection(), 
-						tvCompLib, 
-						ctvSelCompLib, 
-						true);	
-				fireChangedEvent(e);
-			}
-		});
-		
-		btnAddAll.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				resetCompontLibSelectionAll(tvCompLib, ctvSelCompLib, true);
-				fireChangedEvent(e);
-			}
-		});		
-		btnRemove.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				resetComponentLibSelection((StructuredSelection)ctvSelCompLib.getSelection(), 
-						tvCompLib, 
-						ctvSelCompLib, 
-						false);	
-				fireChangedEvent(e);
-			}
-		});
-		
-		btnRemoveAll.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				resetCompontLibSelectionAll(tvCompLib, ctvSelCompLib, false);
-				fireChangedEvent(e);
-			}
-		});
-		
-		tvCompLib.addSelectionChangedListener(new ISelectionChangedListener(){
-			public void selectionChanged(SelectionChangedEvent event) {
-				StructuredSelection sel= (StructuredSelection)event.getSelection();
-				btnAdd.setEnabled(!sel.isEmpty() && sel.getFirstElement() instanceof JSFLibraryInternalReference);
-				btnAddAll.setEnabled(tvCompLib.getTree().getItemCount() > 0);
-			}			
-		});
-		
-		ctvSelCompLib.addSelectionChangedListener(new ISelectionChangedListener(){
-			public void selectionChanged(SelectionChangedEvent event) {
-				StructuredSelection sel= (StructuredSelection)event.getSelection();
-				btnRemove.setEnabled(!sel.isEmpty());
-				btnRemoveAll.setEnabled(ctvSelCompLib.getTable().getItemCount() > 0);
-			}			
-		});
-		
-	}
-	private void createControls() {
-		setRedraw(true);
-		final GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 1;
-		gridLayout.marginLeft = 0;
-		gridLayout.marginRight = 0;
-		gridLayout.marginWidth = 0;
-		gridLayout.marginTop = 0;
-		this.setLayout(gridLayout);
-		
-		createImplLibControls(this);
-		createSeparator(this);
-		createCompLibControls(this);
-		
-
-
-
-	}
-
-	private void createSeparator(Composite parent) {
-		final Label lblSeparator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL );
-		GridData gd_lbl_spacer = new GridData();
-		gd_lbl_spacer.horizontalAlignment = SWT.FILL;
-		lblSeparator.setLayoutData(gd_lbl_spacer);
-		lblSeparator.setAlignment(SWT.CENTER);
-	}
-	
-	/*
-	 * Event handling helper methods
-	 */	
-	
-	// Set selected item to the given state on model and update viewers.  
-	private void resetComponentLibSelection(StructuredSelection item, 
-			TreeViewer srcViewer, 
-			CheckboxTableViewer destViewer,
-			boolean state) {
-		if (item != null && !item.isEmpty()) {
-			List selected = new ArrayList(item.size());
-			for (Iterator sel=item.iterator();sel.hasNext();){
-				JSFLibraryInternalReference jsfLibDctr = (JSFLibraryInternalReference)sel.next();
-				selected.add(jsfLibDctr);
-				List list = workingCopyModel.getJSFComponentLibraries();
-				Iterator it = list.iterator();
-				JSFLibraryInternalReference crtjsfLibDctr = null;
-				while(it.hasNext()) {
-					crtjsfLibDctr = (JSFLibraryInternalReference)it.next();
-					if (crtjsfLibDctr.getID().equals(jsfLibDctr.getID())) {
-						crtjsfLibDctr.setToBeDeployed(state);
-						crtjsfLibDctr.setSelected(state);
-					}
-				}					
-			}
-						
-			loadJSFCompList();
-			
-			srcViewer.refresh();
-			destViewer.refresh();	
-			for (Iterator it=selected.iterator();it.hasNext();){
-				destViewer.setChecked(it.next(), state);
-			}
-			
-			setCompListModelProperty();
-		}		
-	}
-	
-	// Reset all component library from given state to model and update viewers.   
-	private void resetCompontLibSelectionAll(TreeViewer srcViewer, 
-			CheckboxTableViewer destViewer, 
-			boolean state) {
-
-			List list = workingCopyModel.getJSFComponentLibraries();
-			Iterator it = list.iterator();
-			JSFLibraryInternalReference jsfLibDctr;
-			while(it.hasNext()) {
-				jsfLibDctr = (JSFLibraryInternalReference)it.next();
-				jsfLibDctr.setSelected(state);
-				jsfLibDctr.setToBeDeployed(state);
-			}				
-			
-			loadJSFCompList();
-
-			srcViewer.refresh();
-			destViewer.refresh();
-			destViewer.setAllChecked(state);		
-			
-			btnAddAll.setEnabled(! state);
-			btnRemoveAll.setEnabled(state);
-			
-			setCompListModelProperty();
-	}
-	
-	//synchHelper is not able to track changes to data elements in tableviewer... manual set of property
-	private void setCompListModelProperty() {		
-		TableItem[] tableItems = ctvSelCompLib.getTable().getItems();
-		List compLibs = new ArrayList(tableItems.length);
-		for (int i=0;i<tableItems.length;i++){
-			compLibs.add(tableItems[i].getData());
-		}
-		JSFLibraryInternalReference[] libs = (JSFLibraryInternalReference[])compLibs.toArray(new JSFLibraryInternalReference[0]);		
-		model.setProperty(IJSFFacetInstallDataModelProperties.COMPONENT_LIBRARIES, libs);		
-	}
-	
-
-	/**
-	 * Configure the JSFLibraryConfigControl elements to used the containers synchHelper
-	 * @param synchHelper
-	 */
-	public void setSynchHelper(DataModelSynchHelper synchHelper) {	
-		model = synchHelper.getDataModel();
-		synchHelper.synchCombo(cvImplLib.getCombo(), IJSFFacetInstallDataModelProperties.IMPLEMENTATION_LIBRARIES, null);
-		synchHelper.synchCheckbox(btnDeployJars, IJSFFacetInstallDataModelProperties.DEPLOY_IMPLEMENTATION, null);
-		//not using synch helper for IMPLEMENTATION_TYPE
-//		synchHelper.synchCheckBoxTableViewer(ctvSelCompLib, IJSFFacetInstallDataModelProperties.COMPONENT_LIBRARIES, new Control[]{hiddenList});
-	}
-
-	/**
-	 * 	Inner Classes for filtering.
-	 *
-	 */
-	class CheckedTableViewerFilter extends ViewerFilter {
-		public boolean select(Viewer viewer, Object parentElement, Object element) {
-			if (element instanceof JSFLibraryInternalReference) {
-				return ((JSFLibraryInternalReference)element).isSelected();
-			}
-			return false;
-		}
-	}
-	class TreeViewerFilter extends ViewerFilter {
-
-		public boolean select(Viewer viewer, Object parentElement, Object element) {
-			if (element instanceof JSFLibraryInternalReference) {
-				return !((JSFLibraryInternalReference)element).isSelected();
-			}
-			return true;
-		}
-	}
-
-	class CompLibCTVContentProvider implements IStructuredContentProvider {
-		private List jsfComplLibs = new ArrayList(0);
-		
-		public Object[] getElements(Object inputElement) {						
-			return jsfComplLibs.toArray();
-		}
-		public void dispose() {
-            // do nothing
-		}
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			if (newInput == null) {
-				jsfComplLibs = Collections.EMPTY_LIST;
-			} else {
-				jsfComplLibs = (List)newInput;
-			}
-		}
-	}
-	class ImplLibCVContentProvider implements IStructuredContentProvider {
-		private List jsfImplLibs = new ArrayList(0);
-		
-		public Object[] getElements(Object inputElement) {
-			return jsfImplLibs.toArray();
-		}
-		public void dispose() {
-            // do nothing
-		}
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			if (newInput == null) {
-				jsfImplLibs = Collections.EMPTY_LIST;
-			} else {
-				jsfImplLibs = (List)newInput;
-			}
-		}
-	}
-	
-	// Label Provider
-	class SelectedCompLibCTVLabelProvider extends LabelProvider implements ITableLabelProvider {
-		public String getColumnText(Object element, int columnIndex) {
-			if (element instanceof JSFLibraryInternalReference){
-				
-			    switch(columnIndex) {
-			    case COLUMN_DEPLOY:
-			    	return " ";	  //$NON-NLS-1$
-			    case COLUMN_LIB_NAME:
-			    	return ((JSFLibraryInternalReference)element).getLabel();
-			    }				
-			}			
-		    return ""; //$NON-NLS-1$
-			
-		}
-		public Image getColumnImage(Object element, int columnIndex) {
-			return null;
-		}
-	}
-	class ImplLibCVListLabelProvider extends LabelProvider {
-		private JSFLibrary defaultImpl = null;
-		
-		public String getText(Object element) {
-			if (element instanceof JSFLibraryInternalReference){
-				StringBuffer labelBuf = new StringBuffer(((JSFLibraryInternalReference)element).getLabel());
-				JSFLibrary lib = ((JSFLibraryInternalReference)element).getLibrary();
-				if (getDefaultImpl()!= null && lib != null && lib.getID().equals(getDefaultImpl().getID()))
-					labelBuf.append(" ").append(JSFLibraryRegistry.DEFAULT_IMPL_LABEL); //$NON-NLS-1$
-				return labelBuf.toString() ;
-			}
-			return null;
-		}
-		private JSFLibrary getDefaultImpl() {
-			if (defaultImpl == null){
-				JSFLibraryRegistry jsflibreg = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry();
-				defaultImpl = jsflibreg.getDefaultImplementation();
-			}
-			return defaultImpl;
-		}
-		public Image getImage(Object element) {
-			return null;
-		}
-	}
-	
-	// Sorter
-	class SelectedCompLibCTVSorter extends ViewerSorter {
-		public int compare(Viewer viewer, Object e1, Object e2) {
-			if (e1 instanceof JSFLibraryInternalReference && 
-					e2 instanceof JSFLibraryInternalReference) {
-			JSFLibraryInternalReference item1 = (JSFLibraryInternalReference)e1;
-			JSFLibraryInternalReference item2 = (JSFLibraryInternalReference)e2;			
-			return item1.getLabel().compareToIgnoreCase(item2.getLabel());
-			}
-			return 0;
-		}
-	}
-	
-	/*
-	 * Content provider Adapter for TreeViewer
-	 */
-	private class TreeViewerAdapter implements ITreeContentProvider {
-		private final Object[] NO_ELEMENTS= new Object[0];
-
-		// ------- ITreeContentProvider Interface ------------
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			// will never happen
-		}
-
-		public void dispose() {
-            // do nothing
-		}
-
-		public Object[] getElements(Object obj) {
-			return workingCopyModel.getJSFComponentLibraries().toArray();
-		}
-		
-		public Object[] getChildren(Object element) {
-			if (element instanceof JSFLibraryInternalReference) {
-				return ((JSFLibraryInternalReference)element).getArchiveFiles().toArray();				
-			}
-			return NO_ELEMENTS;
-		}
-
-		public Object getParent(Object element) {
-			return null;
-		}
-
-		public boolean hasChildren(Object element) {
-			if (element instanceof JSFLibraryInternalReference) {
-				return true;
-			}
-			return false;
-		}		
-		
-	}
-	
-	private class TreeLabelProvider implements ILabelProvider {
-		Image libImg;
-		Image jarImg;
-
-		TreeLabelProvider(){
-			if (jarImg == null){
-				ImageDescriptor jarImgDesc = JSFUiPlugin.getImageDescriptor("obj16/jar_obj.gif"); //$NON-NLS-1$
-				jarImg = jarImgDesc.createImage();
-			}
-			if (libImg == null){
-				ImageDescriptor libImgDesc = JSFUiPlugin.getImageDescriptor("obj16/library_obj.gif"); //$NON-NLS-1$
-				libImg = libImgDesc.createImage();
-			}
-		}
-		
-		public Image getImage(Object element) {
-			if (element instanceof JSFLibraryInternalReference)
-            {
-			    return libImg;
-            }
-			return jarImg;
-		}
-
-		public String getText(Object element) {
-			StringBuffer labelBuf = new StringBuffer();
-			if (element instanceof JSFLibraryInternalReference) {
-				JSFLibraryInternalReference libWrapper = (JSFLibraryInternalReference)element;
-				JSFLibrary lib = libWrapper.getLibrary();
-				labelBuf.append(lib.getLabel());
-				if (lib.isImplementation()) {
-					labelBuf.append(" "); //$NON-NLS-1$
-					if (lib == JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getDefaultImplementation()) {
-						labelBuf.append(DEFAULT_IMPL_DESC); 
-					} else {
-						labelBuf.append(IMPL_DESC); 
-					}
-				}
-			}
-			if (element instanceof ArchiveFile) {
-				ArchiveFile jar = (ArchiveFile)element;
-				labelBuf.append(jar.getName());
-				if (!jar.exists())
-					labelBuf.append(MISSING);
-				labelBuf.append(" - ").append(((ArchiveFile)element).getSourceLocation()); //$NON-NLS-1$
-			}
-			return labelBuf.toString();
-		}
-
-		public void addListener(ILabelProviderListener listener) {
-            // not handling listeners
-		}
-
-		public void dispose() {
-			if (libImg != null){
-				libImg.dispose();
-			}			
-			if (jarImg != null){
-				jarImg.dispose();
-			}		
-		}
-
-		public boolean isLabelProperty(Object element, String property) {
-			return false;
-		}
-
-		public void removeListener(ILabelProviderListener listener) {
-            // not handling listeners
-		}
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControlChangeEvent.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControlChangeEvent.java
deleted file mode 100644
index 1611218..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControlChangeEvent.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.jsflibraryconfig;
-
-import java.util.EventObject;
-
-/**
- * Event that something has changed in the JSFLibraryConfigControl
- *
- */
-public class JSFLibraryConfigControlChangeEvent {
-	private EventObject event;
-
-	/**
-	 * Constructor
-	 * @param ev
-	 */
-	public JSFLibraryConfigControlChangeEvent(EventObject ev){
-		this.event = ev;
-	}
-
-	/**
-	 * @return java.util.EventObject
-	 */
-	public EventObject getEvent(){
-		return event;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControlChangeListener.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControlChangeListener.java
deleted file mode 100644
index 945f9ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControlChangeListener.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.jsflibraryconfig;
-
-
-/**
- * Interface to be implemented to listen to changes in the JSFLibraryConfigControl object
- *
- */
-public interface JSFLibraryConfigControlChangeListener {
-	/**
-	 * Callback method
-	 * @param e
-	 */
-	public void changed(JSFLibraryConfigControlChangeEvent e);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/messages.properties
deleted file mode 100644
index e43aca1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/messages.properties
+++ /dev/null
@@ -1,109 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-#    Ian Trimble - change key names for use with org.eclipse.osgi.util.NLS
-###############################################################################
-JSFFacetInstallPage_title=JSF Capabilities
-JSFFacetInstallPage_description=Add JSF capabilities to this Web Project
-JSFFacetInstallPage_JSFImplLabel=JSF &Implementation:
-JSFFacetInstallPage_Add1=A&dd...
-JSFFacetInstallPage_Add2=&Add...
-JSFFacetInstallPage_DeployJarsLabel=&Deploy jars to WEB-INF/lib
-JSFFacetInstallPage_JSFConfigLabel=JSF &Configuration File:
-JSFFacetInstallPage_JSFServletNameLabel=JSF &Servlet Name:
-JSFFacetInstallPage_JSFServletClassNameLabel=JSF Servlet C&lassname:
-JSFFacetInstallPage_JSFURLMappingLabel=&URL Mapping Patterns:
-JSFFacetInstallPage_JSFLibraryLabel0=JSF Libraries:
-JSFFacetInstallPage_PatternDialogTitle=Specify URL Pattern
-JSFFacetInstallPage_PatternDialogDesc=URL Pattern
-JSFFacetInstallPage_Remove=&Remove
-JSFFacetInstallPage_PatternEmptyMsg=Pattern must not be empty
-JSFFacetInstallPage_PatternSpecifiedMsg=Pattern is already specified
-JSFFacetInstallPage_ErrorNoWebAppDataModel=Unable to locate WebApp datamodel
-
-JSFLibrariesPreferencePage_DefinedJSFLibraries=Defined JSF Libraries:
-JSFLibrariesPreferencePage_DEFAULT_IMPL_DESC=[implementation - default]
-JSFLibrariesPreferencePage_New=New...
-JSFLibrariesPreferencePage_Edit=Edit...
-JSFLibrariesPreferencePage_Remove=Remove
-JSFLibrariesPreferencePage_CannotRemovePluginProvidedTitle=Cannot Remove
-JSFLibrariesPreferencePage_CannotRemovePluginProvidedMessage=Plugin provided libraries cannot be removed from the registry
-JSFLibrariesPreferencePage_MakeDefault=Make Default
-JSFLibrariesPreferencePage_MISSING_DESC=[missing]
-JSFLibrariesPreferencePage_Description=JSF Libraries contain jars with JSF components and tag libraries.   Some JSF Libraries can be specially marked as implementations so that the WebApp can be executed.
-JSFLibrariesPreferencePage_IMPL_DESC=[implementation]
-JSFLibrariesPreferencePage_CannotModifyPluginProvidedTitle=Cannot Modify
-JSFLibraryPropertyPage_No_JSF_Implementation_Lib_Selected=No JSF implementation library selected.
-JSFLibrariesPreferencePage_CannotModifyPluginProvidedMessage=Plugin provided libraries cannot be edited
-
-JSFLibraryContainerWizardPage_PageName=Add JSF Library
-JSFLibraryContainerWizardPage_Title=JSF Library
-JSFLibraryContainerWizardPage_Description=Select JavaServer Face Libraries to add to the classpath
-JSFLibraryContainerWizardPage_WarningNoJSFFacet=JavaServer Face Libraries can only be configured for Dynamic Web projects with the JSF facet installed.
-JSFLibraryContainerWizardPage_JSFLibraries=JSF Libraries:
-JSFLibraryContainerWizardPage_Add=Add...
-JSFLibraryContainerWizardPage_V1Registry_Warning_DialogTitle=Backward compatibility issue
-JSFLibraryWizard_JSFLibraryWizard_DontShowThisAgain_CheckBoxLabel=Do not show this message again (affects all listed projects)
-JSFLibraryContainerWizardPage_V1Registry_Warning_DialogText=This project is currently configured for use with an obsolete version of JSF libraries. \
-Changing JSF library settings on this project may break backward compatibility with older versions of JSF tools.\
-\n\nSee http://wiki.eclipse.org/index.php/JSF_Library_Migration for more information.
-JSFLibraryContainerWizardPage_EditLibrary_DescriptionText=Select JSF Library for this reference to use.  Choose 'Edit...' to modify contents of the selected library.
-JSFLibraryContainerWizardPage_Edit=Edit...
-JSFLibraryContainerWizardPage_ImplAlreadyPresent=An implementation has already been chosen.  Please remove before adding different one
-JSFLibraryContainerWizardPage_ErrorInitializing=Error during initialization
-JSFLibraryContainerWizardPage_SelectOneImpl=Choose only one implementation
-
-JSFLibraryWizard_DESCRIPTION=Create a library of jars that make up a JSF component library.
-JSFLibraryWizard_IMPLS_ONLY_DESC=Create a library of jars that make up a JSF implementation library.
-JSFLibraryWizard_CreateImplementation=Create JSF Implementation Library
-JSFLibraryWizard_CreateJSFLibrary=Create JSF Library
-JSFLibraryWizard_EditJSFLibrary=Edit JSF Library
-JSFLibraryWizard_JSFLibrary=JSF Library
-JSFLibraryWizard_LibraryName=Library &Name:
-JSFLibraryWizard_VersionSupported=&Version Supported:
-JSFLibraryWizard_LibraryJars=Library &Jars
-JSFLibraryWizard_IsJSFImplementation=Is JSF &Implementation
-JSFLibraryWizard_DeployJars=&Deploy Jars
-JSFLibraryWizard_Add=&Add...
-JSFLibraryWizard_Remove=&Remove
-JSFLibraryWizard_ExtJarFileDialogTitle=Browse for Jars/Zips
-JSFLibraryWizard_ValidateNoJars=The library must contain at least one jar.
-JSFLibraryWizard_ValidateNoLibraryName=A library name must be supplied.
-JSFLibraryWizard_ValidateExistingLibraryName=A library or implementation by this name already exists.
-JSFLibraryWizard_V1JSFLibrary_DialogMessage=The projects listed below contain JSF library references that are\
-obsolete and may not be automatically updated by this change. To fix this issue, you need to update these\
-these projects.\
-\n\nSee http://wiki.eclipse.org/index.php/JSF_Library_Migration for more information. \n\nProjects: {0}
-JSFLibraryWizard_V1JSFLibrary_DialogTitle=Backward compatibility issue
-
-JSFLibraryConfigControl_ImplementationLibrary=Implementation Library
-JSFLibraryPropertyPage_No_JSF_Facet_Installed=JSF Facet not installed.
-JSFLibraryConfigControl_NewImplementationLibrary=New...
-JSFLibraryConfigControl_ServerSuppliedButtonTooltip=Chosen server adapter must supply the JSF Implementation jars.
-JSFLibraryConfigControl_ServerSuppliedButtonLabel=Server Supplied JSF Implementation
-JSFLibraryConfigControl_NewImplButtonTooltip=Create new user supplied implementation library
-JSFLibraryConfigControl_DeployJAR=Deploy jars to WEB-INF/lib
-JSFLibraryConfigControl_ComponentLibrary=Component Libraries
-JSFLibraryConfigControl_DeployButtonLabel=Deploy
-JSFLibraryConfigControl_Add=\ \ >  
-JSFLibraryConfigControl_Remove=\ \ <  
-JSFLibraryConfigControl_AddAll=\ \ >>  
-JSFLibraryConfigControl_RemoveAll=\ \ <<  
-JSFLibraryConfigControl_NewComponentLibrary=New...
-JSFLibraryConfigControl_TH_Deploy=Deploy
-JSFLibraryConfigControl_NullProject=No project specified.
-JSFLibraryConfigControl_TH_LibraryName=Library Name
-
-JSFValidationPreferencePage_ELPrefPanel_Title=Expression Language (EL) Validation
-JSFValidationPreferencePage_ELPrefPanel_BuildValidationCheckBoxTitle=Validate EL on &Build/Run Validation
-JSFValidationPreferencePage_ELPrefPanel_IncrementalValidationCheckBoxTitle= Validate EL as &you type (may be slow on some pages)
-
-JSFLibraryEditControl_ImplVersion_UNKNOWN=UNKNOWN
-
-JSFPreferences_RootPage_Description=Expand the tree to edit preferences for a specific feature.
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/preferences/EmptyRootPreferencePage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/preferences/EmptyRootPreferencePage.java
deleted file mode 100644
index d269dd2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/preferences/EmptyRootPreferencePage.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     Oracle - adapted for JSF tooling
- *     
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.preferences;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-/**
- * The empty pref page used as the root of all other JSF feature preference pages
- * under the Web&XML top-level pref page
- * 
- * @author cbateman
- *
- */
-public class EmptyRootPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
-
-    private Composite createComposite(Composite parent, int numColumns) {
-        noDefaultAndApplyButton();
-        
-        Composite composite = new Composite(parent, SWT.NULL);
-
-        // GridLayout
-        GridLayout layout = new GridLayout();
-        layout.numColumns = numColumns;
-        composite.setLayout(layout);
-
-        // GridData
-        GridData data = new GridData(GridData.FILL);
-        data.horizontalIndent = 0;
-        data.verticalAlignment = GridData.FILL;
-        data.horizontalAlignment = GridData.FILL;
-        composite.setLayoutData(data);
-
-        return composite;
-    }
-
-    protected Control createContents(Composite parent) {
-        Composite composite = createScrolledComposite(parent);
-
-        String description = Messages.JSFPreferences_RootPage_Description;
-        Text text = new Text(composite, SWT.READ_ONLY);
-        // some themes on GTK have different background colors for Text and Labels
-        text.setBackground(composite.getBackground());
-        text.setText(description);
-
-        setSize(composite);
-        return composite;
-    }
-
-    private Composite createScrolledComposite(Composite parent) {
-        // create scrollbars for this parent when needed
-        final ScrolledComposite sc1 = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
-        sc1.setLayoutData(new GridData(GridData.FILL_BOTH));
-        Composite composite = createComposite(sc1, 1);
-        sc1.setContent(composite);
-
-        // not calling setSize for composite will result in a blank composite,
-        // so calling it here initially
-        // setSize actually needs to be called after all controls are created,
-        // so scrolledComposite
-        // has correct minSize
-        setSize(composite);
-        return composite;
-    }
-
-    public void init(IWorkbench workbench) {
-        // do  nothing
-    }
-
-    private void setSize(Composite composite) {
-        if (composite != null) {
-            // Note: The font is set here in anticipation that the class inheriting
-            //       this base class may add widgets to the dialog.   setSize
-            //       is assumed to be called just before we go live.
-            applyDialogFont(composite);
-            Point minSize = composite.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-            composite.setSize(minSize);
-            // set scrollbar composite's min size so page is expandable but
-            // has scrollbars when needed
-            if (composite.getParent() instanceof ScrolledComposite) {
-                ScrolledComposite sc1 = (ScrolledComposite) composite.getParent();
-                sc1.setMinSize(minSize);
-                sc1.setExpandHorizontal(true);
-                sc1.setExpandVertical(true);
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/project/facet/JSFFacetInstallPage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/project/facet/JSFFacetInstallPage.java
deleted file mode 100644
index 48a7ea7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/project/facet/JSFFacetInstallPage.java
+++ /dev/null
@@ -1,610 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.project.facet;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.DialogSettings;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryConfigDialogSettingData;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryConfiglModelSource;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference;
-import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.jst.jsf.ui.internal.jsflibraryconfig.IJSFImplLibraryCreationListener;
-import org.eclipse.jst.jsf.ui.internal.jsflibraryconfig.JSFImplLibraryCreationEvent;
-import org.eclipse.jst.jsf.ui.internal.jsflibraryconfig.JSFLibraryConfigControl;
-import org.eclipse.jst.jsf.ui.internal.jsflibraryconfig.JSFLibraryConfigControlChangeEvent;
-import org.eclipse.jst.jsf.ui.internal.jsflibraryconfig.JSFLibraryConfigControlChangeListener;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.ui.IFacetWizardPage;
-import org.eclipse.wst.common.project.facet.ui.IWizardContext;
-
-/**
- * JSF Facet installation wizard page.
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFFacetInstallPage extends DataModelWizardPage implements
-		IJSFFacetInstallDataModelProperties, IFacetWizardPage {
-	// UI
-	private Label lblJSFImpl;
-	private Label lblJSFConfig;
-	private Text txtJSFConfig;
-	private Label lblJSFServletName;
-	private Text txtJSFServletName;
-	private Label lblJSFServletClassName;
-	private Text txtJSFServletClassName;	
-	private Label lblJSFServletURLPatterns;
-	private List lstJSFServletURLPatterns;
-	private Button btnAddPattern;
-	private Button btnRemovePattern;
-
-	private IDialogSettings dialogSettings;
-	private IDataModel webAppDataModel;
-	private static final String SETTINGS_ROOT = JSFUiPlugin.PLUGIN_ID
-			+ ".jsfFacetInstall"; //$NON-NLS-1$
-	private static final String SETTINGS_CONFIG = "configPath"; //$NON-NLS-1$
-	private static final String SETTINGS_SERVLET = "servletName"; //$NON-NLS-1$
-	private static final String SETTINGS_SERVLET_CLASSNAME = "servletClassname"; //$NON-NLS-1$
-	private static final String SETTINGS_URL_MAPPINGS = "urlMappings"; //$NON-NLS-1$
-	private static final String SETTINGS_URL_PATTERN = "pattern"; //$NON-NLS-1$
-	private static final String SETTINGS_DEPLOY_IMPL = "deployImplementation"; //$NON-NLS-1$
-	private static final String SETTINGS_IMPL_TYPE = "deployImplType";//$NON-NLS-1$
-	private static final String SETTINGS_COMPLIB = "selectedComponent"; //$NON-NLS-1$
-	private static final String SETTINGS_COMPLIB_SELECT_DEPLOY = "selectdeploycomplib"; //$NON-NLS-1$
-
-	private static final String SEPARATOR = ":"; //$NON-NLS-1$
-	
-	//Part of temporary fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=190304
-	private static final String DEFAULT_TO_CLIENT = "initialDefaultToClientSupplied";
-	private static final String DEFAULT_TO_SERVER = "initialDefaultToServerSupplied";
-
-
-	private JSFLibraryConfigControl jsfLibCfgComp = null;
-	// private String projectName = null;
-	private Composite composite = null;
-
-	/**
-	 * Zero argument constructor
-	 */
-	public JSFFacetInstallPage() {
-		// FIXME: following WebFacetInstallPage pattern which will be fixed at somepoint
-		super(DataModelFactory.createDataModel(new AbstractDataModelProvider() {/*
-																				 * do
-																				 * nothing
-																				 */
-		}), "jsf.facet.install.page"); //$NON-NLS-1$
-		setTitle(Messages.JSFFacetInstallPage_title);
-		setDescription(Messages.JSFFacetInstallPage_description);
-		dialogSettings = JSFUiPlugin.getDefault().getDialogSettings();
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage#createTopLevelComposite(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Composite createTopLevelComposite(final Composite parent) {
-		initializeDialogUnits(parent);
-		composite = new Composite(parent, SWT.NONE);
-		final GridLayout jsfCompositeLayout = new GridLayout(3, false);
-		jsfCompositeLayout.marginTop = 0;
-		jsfCompositeLayout.marginBottom = 0;
-		jsfCompositeLayout.marginRight = 0;
-		jsfCompositeLayout.marginLeft = 0;
-		composite.setLayout(jsfCompositeLayout);
-
-		lblJSFImpl = new Label(composite, SWT.None);
-		GridData gdLbl = new GridData();
-		gdLbl.verticalIndent = 5;
-		gdLbl.verticalAlignment = SWT.BEGINNING;
-		lblJSFImpl.setLayoutData(gdLbl);
-		lblJSFImpl.setText(Messages.JSFFacetInstallPage_JSFLibraryLabel0);
-		
-		jsfLibCfgComp = new JSFLibraryConfigControl(composite, SWT.NONE);
-		jsfLibCfgComp
-				.addOkClickedListener(new IJSFImplLibraryCreationListener() {
-					public void okClicked(JSFImplLibraryCreationEvent event) {
-						if (event.isLibraryCreated()) {
-							validatePage();
-						}
-					}
-				});
-		
-		jsfLibCfgComp.addChangeListener( new JSFLibraryConfigControlChangeListener(){
-
-			public void changed(JSFLibraryConfigControlChangeEvent e) {
-				validatePage();				
-			}
-			
-		});
-		GridData gd_comp = new GridData();
-		gd_comp.horizontalSpan = 2;
-		gd_comp.grabExcessHorizontalSpace = true;
-		gd_comp.grabExcessVerticalSpace = true;
-		gd_comp.horizontalAlignment = SWT.FILL;
-		jsfLibCfgComp.setLayoutData(gd_comp);
-
-		lblJSFConfig = new Label(composite, SWT.NONE);
-		lblJSFConfig.setText(Messages.JSFFacetInstallPage_JSFConfigLabel);
-		lblJSFConfig.setLayoutData(new GridData(GridData.BEGINNING));
-
-		txtJSFConfig = new Text(composite, SWT.BORDER);
-		GridData gd1 = new GridData(GridData.FILL_HORIZONTAL);
-		gd1.horizontalSpan = 2;
-		txtJSFConfig.setLayoutData(gd1);
-
-		lblJSFServletName = new Label(composite, SWT.NONE);
-		lblJSFServletName
-				.setText(Messages.JSFFacetInstallPage_JSFServletNameLabel);
-		lblJSFServletName.setLayoutData(new GridData(GridData.BEGINNING));
-
-		txtJSFServletName = new Text(composite, SWT.BORDER);
-		GridData gd2 = new GridData(GridData.FILL_HORIZONTAL);
-		gd2.horizontalSpan = 2;
-		txtJSFServletName.setLayoutData(gd2);
-
-		lblJSFServletClassName = new Label(composite, SWT.NONE);
-		lblJSFServletClassName
-				.setText(Messages.JSFFacetInstallPage_JSFServletClassNameLabel);
-		lblJSFServletClassName.setLayoutData(new GridData(GridData.BEGINNING));
-
-		txtJSFServletClassName = new Text(composite, SWT.BORDER);
-		GridData gd2c = new GridData(GridData.FILL_HORIZONTAL);
-		gd2c.horizontalSpan = 2;
-		txtJSFServletClassName.setLayoutData(gd2c);
-		
-		lblJSFServletURLPatterns = new Label(composite, SWT.NULL);
-		lblJSFServletURLPatterns
-				.setText(Messages.JSFFacetInstallPage_JSFURLMappingLabel);
-		lblJSFServletURLPatterns.setLayoutData(new GridData(GridData.BEGINNING
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		lstJSFServletURLPatterns = new List(composite, SWT.BORDER);
-		GridData gd3 = new GridData(GridData.FILL_HORIZONTAL);
-		gd3.heightHint = convertHeightInCharsToPixels(5);
-		lstJSFServletURLPatterns.setLayoutData(gd3);
-		lstJSFServletURLPatterns.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				btnRemovePattern.setEnabled(lstJSFServletURLPatterns
-						.getSelectionCount() > 0);
-			}
-		});
-
-		Composite btnComposite = new Composite(composite, SWT.NONE);
-		GridLayout gl = new GridLayout(1, false);
-		// gl.marginBottom = 0;
-		// gl.marginTop = 0;
-		// gl.marginRight = 0;
-		gl.marginLeft = 0;
-		btnComposite.setLayout(gl);
-		btnComposite.setLayoutData(new GridData(GridData.END
-				| GridData.VERTICAL_ALIGN_FILL));
-
-		btnAddPattern = new Button(btnComposite, SWT.NONE);
-		btnAddPattern.setText(Messages.JSFFacetInstallPage_Add2);
-		btnAddPattern.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		btnAddPattern.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				InputDialog dialog = new InputDialog(getShell(),
-						Messages.JSFFacetInstallPage_PatternDialogTitle,
-						Messages.JSFFacetInstallPage_PatternDialogDesc, null,
-						new IInputValidator() {
-
-							public String isValid(String newText) {
-								return isValidPattern(newText);
-							}
-
-						});
-				dialog.open();
-				if (dialog.getReturnCode() == Window.OK) {
-					addItemToList(dialog.getValue(), true);
-				}
-			}
-		});
-
-		btnRemovePattern = new Button(btnComposite, SWT.NONE);
-		btnRemovePattern.setText(Messages.JSFFacetInstallPage_Remove);
-		btnRemovePattern.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		btnRemovePattern.setEnabled(false);
-		btnRemovePattern.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				removeItemFromList(lstJSFServletURLPatterns.getSelection());
-				btnRemovePattern.setEnabled(false);
-			}
-		});
-
-		addModificationListeners();
-
-		this.getContainer().getShell().pack();
-
-		return composite;
-	}
-
-	private void initializeValues() {
-		IDialogSettings root = dialogSettings.getSection(SETTINGS_ROOT);
-
-		initJSFCfgCtrlValues(root);
-
-		String conf = null;
-		if (root != null)
-			conf = root.get(SETTINGS_CONFIG);
-		if (conf == null || conf.equals("")) { //$NON-NLS-1$
-			conf = (String) model
-					.getDefaultProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH);
-		}
-		txtJSFConfig.setText(conf);
-
-		String servletName = null;
-		if (root != null)
-			servletName = root.get(SETTINGS_SERVLET);
-		if (servletName == null || servletName.equals("")) { //$NON-NLS-1$
-			servletName = (String) model
-					.getDefaultProperty(IJSFFacetInstallDataModelProperties.SERVLET_NAME);
-		}
-		txtJSFServletName.setText(servletName);
-
-		String servletClassname = null;
-		if (root != null)
-			servletClassname = root.get(SETTINGS_SERVLET_CLASSNAME);
-		if (servletClassname == null || servletClassname.equals("")) { //$NON-NLS-1$
-			servletClassname = (String) model
-					.getDefaultProperty(IJSFFacetInstallDataModelProperties.SERVLET_CLASSNAME);
-		}
-		txtJSFServletClassName.setText(servletClassname);
-
-		loadURLMappingPatterns(root);
-	}
-
-	private void initJSFCfgCtrlValues(IDialogSettings root) {
-		IMPLEMENTATION_TYPE implType = IMPLEMENTATION_TYPE.UNKNOWN;
-		String deployImpl = null;
-		
-		if (root != null) {
-			implType = IMPLEMENTATION_TYPE.getValue(root.get(SETTINGS_IMPL_TYPE));
-			deployImpl = root.get(SETTINGS_DEPLOY_IMPL);
-			
-		}
-				
-		//Part of temporary fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=190304
-		if (implType == IMPLEMENTATION_TYPE.UNKNOWN) {			
-			// if the impl type is still unknown, check if the product provided a default
-			IPreferenceStore prefs = JSFUiPlugin.getDefault().getPreferenceStore();
-			if(prefs.getBoolean(DEFAULT_TO_CLIENT)) {			
-				implType = IMPLEMENTATION_TYPE.CLIENT_SUPPLIED;
-			}
-			else if(prefs.getBoolean(DEFAULT_TO_SERVER)) {	
-				implType = IMPLEMENTATION_TYPE.SERVER_SUPPLIED;
-			}
-		}
-
-		if (deployImpl == null || deployImpl.equals("")) { //$NON-NLS-1$
-			deployImpl = ((Boolean) model
-					.getDefaultProperty(IJSFFacetInstallDataModelProperties.DEPLOY_IMPLEMENTATION))
-					.toString();
-		}
-
-		IDialogSettings complibs = null;
-		if (root != null) {
-			complibs = root.getSection(SETTINGS_COMPLIB);
-		}
-
-		String[] selection = null;
-		if (complibs != null) {
-			selection = complibs.getArray(SETTINGS_COMPLIB_SELECT_DEPLOY);
-		}
-
-		JSFLibraryConfiglModelSource source = new JSFLibraryConfigDialogSettingData(implType,
-				Boolean.valueOf(deployImpl).booleanValue(), selection);
-		jsfLibCfgComp.loadControlValuesFromModel(source);
-	}
-
-	
-	private void saveSettings() {
-		DialogSettings root = new DialogSettings(SETTINGS_ROOT);
-		dialogSettings.addSection(root);
-
-		root.put(SETTINGS_IMPL_TYPE, getJSFImplType());
-		root.put(SETTINGS_DEPLOY_IMPL, String.valueOf(getDeployJSFImpl()));
-		root.put(SETTINGS_CONFIG, getJSFConfig());
-		root.put(SETTINGS_SERVLET, getJSFServletName());
-		root.put(SETTINGS_SERVLET_CLASSNAME, getJSFServletClassname());
-		DialogSettings mappings = new DialogSettings(SETTINGS_URL_MAPPINGS);
-		root.addSection(mappings);
-		mappings.put(SETTINGS_URL_PATTERN, getJSFPatterns());
-
-		DialogSettings complibs = new DialogSettings(SETTINGS_COMPLIB);
-		root.addSection(complibs);
-		complibs.put(SETTINGS_COMPLIB_SELECT_DEPLOY, getCompLibSelections());
-	}
-
-	private String getJSFImplType() {
-		return IMPLEMENTATION_TYPE.getStringValue((IMPLEMENTATION_TYPE)model.getProperty(IMPLEMENTATION_TYPE_PROPERTY_NAME));
-	}
-
-	private boolean getDeployJSFImpl() {
-		if (jsfLibCfgComp.getSelectedJSFLibImplementation() == null) {
-			return false;
-		}
-		return jsfLibCfgComp.getSelectedJSFLibImplementation()
-				.isCheckedToBeDeployed();
-	}
-
-	private String getJSFConfig() {
-		return txtJSFConfig.getText().trim();
-	}
-
-	private String getJSFServletName() {
-		return txtJSFServletName.getText().trim();
-	}
-
-	private String getJSFServletClassname() {
-		return txtJSFServletClassName.getText().trim();
-	}
-	
-	private String[] getJSFPatterns() {
-		return lstJSFServletURLPatterns.getItems();
-	}
-
-	private String[] getCompLibSelections() {
-		/*
-		 * Iterate thru the selected component libraries and return selected
-		 * component libraries and their deployment flags in a string array.
-		 */
-		JSFLibraryInternalReference complib = null;
-		String str = null;
-		ArrayList al = new ArrayList();
-
-		java.util.List list = jsfLibCfgComp.getSelectedJSFLibComponents();
-		Iterator it = list.iterator();
-		while (it.hasNext()) {
-			complib = (JSFLibraryInternalReference) it.next();
-			str = complib.getID() + SEPARATOR + complib.isCheckedToBeDeployed();
-			al.add(str);
-		}
-
-		return (String[]) al.toArray(new String[al.size()]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.project.facet.ui.IFacetWizardPage#setConfig(java.lang.Object)
-	 */
-	public void setConfig(Object config) {
-		model.removeListener(this);
-		synchHelper.dispose();
-
-		model = (IDataModel) config;
-		model.addListener(this);
-		synchHelper = initializeSynchHelper(model);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.project.facet.ui.IFacetWizardPage#transferStateToConfig()
-	 */
-	public void transferStateToConfig() {
-		saveSettings(); // convenient place for this. don't want to save if user
-						// cancelled.
-		// do nothing else now. being handled by synchHelper
-		// config.setProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION,
-		// getJSFImpl());
-//		model
-//				.setStringProperty(
-//						IJSFFacetInstallDataModelProperties.CONFIG_PATH,
-//						getJSFConfig());
-//		model.setStringProperty(
-//				IJSFFacetInstallDataModelProperties.SERVLET_NAME,
-//				getJSFServletName());
-		// config.setProperty(IJSFFacetInstallDataModelProperties.SERVLET_URL_PATTERNS,
-		// getJSFPatterns());
-
-//		java.util.List implLibs = new ArrayList();
-//		implLibs.add(jsfLibCfgComp.getSelectedJSFLibImplementation());
-//		java.util.List compLibs = jsfLibCfgComp.getSelectedJSFLibComponents();
-//		model.setProperty(
-//				IJSFFacetInstallDataModelProperties.IMPLEMENTATION_LIBRARIES,
-//				implLibs);
-//		model.setProperty(
-//				IJSFFacetInstallDataModelProperties.COMPONENT_LIBRARIES,
-//				compLibs);
-	}
-
-	private void addModificationListeners() {
-		 jsfLibCfgComp.setSynchHelper(synchHelper);		 
-		 synchHelper.synchText(txtJSFConfig, CONFIG_PATH, null);
-		 synchHelper.synchText(txtJSFServletName, SERVLET_NAME, null);
-		 synchHelper.synchText(txtJSFServletClassName, SERVLET_CLASSNAME, null);
-		 synchHelper.synchList(lstJSFServletURLPatterns, SERVLET_URL_PATTERNS, null);
-		 
-		// synchHelper.synchCheckbox(chkDeployImpl, DEPLOY_IMPLEMENTATION,
-		// null);
-	}
-
-	private String isValidPattern(String value) {
-		if (value == null || value.trim().equals("")) //$NON-NLS-1$
-			return Messages.JSFFacetInstallPage_PatternEmptyMsg;
-		if (lstJSFServletURLPatterns.indexOf(value) >= 0)
-			return Messages.JSFFacetInstallPage_PatternSpecifiedMsg;
-
-		return null;
-	}
-
-	private void loadURLMappingPatterns(IDialogSettings root) {
-		lstJSFServletURLPatterns.removeAll();
-		IDialogSettings mappings = null;
-		if (root != null)
-			mappings = root.getSection(SETTINGS_URL_MAPPINGS);
-		String[] patterns = null;
-		if (mappings != null)
-			patterns = mappings.getArray(SETTINGS_URL_PATTERN);
-
-		if (patterns == null || patterns.length == 0) {
-			patterns = (String[]) model
-					.getDefaultProperty(IJSFFacetInstallDataModelProperties.SERVLET_URL_PATTERNS);
-		}
-		for (int i = 0; i < patterns.length; i++) {
-			addItemToList(patterns[i], false);
-		}
-	}
-
-	private void addItemToList(String pattern, boolean selectMe) {
-		lstJSFServletURLPatterns.add(pattern == null ? "" : pattern); //$NON-NLS-1$
-		if (pattern == null && selectMe)
-			lstJSFServletURLPatterns.setSelection(lstJSFServletURLPatterns
-					.getItemCount() - 1);
-		// When 119321 is fixed - remove code below
-		updateModelForURLPattern();
-	}
-
-	private void removeItemFromList(String[] selection) {
-		for (int i = 0; i < selection.length; i++) {
-			String sel = selection[i];
-			lstJSFServletURLPatterns.remove(sel);
-		}
-		// When 119321 is fixed - remove code below
-		updateModelForURLPattern();
-	}
-
-	private void updateModelForURLPattern() {
-		model.setProperty(
-				IJSFFacetInstallDataModelProperties.SERVLET_URL_PATTERNS,
-				lstJSFServletURLPatterns.getItems());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage#getValidationPropertyNames()
-	 */
-	protected String[] getValidationPropertyNames() {
-		return new String[] { IMPLEMENTATION_TYPE_PROPERTY_NAME, IMPLEMENTATION, DEPLOY_IMPLEMENTATION,
-				CONFIG_PATH, SERVLET_NAME, SERVLET_CLASSNAME, COMPONENT_LIBRARIES };
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.project.facet.ui.IFacetWizardPage#setWizardContext(org.eclipse.wst.common.project.facet.ui.IWizardContext)
-	 */
-	public void setWizardContext(IWizardContext context) {
-		// hook into web datamodel if new project wizard.
-		Iterator it = context.getSelectedProjectFacets().iterator();
-		IProjectFacetVersion webFacetVersion = null;
-		while (it.hasNext()) {
-			// find Web facet
-			IProjectFacetVersion pfv = (IProjectFacetVersion) it.next();
-			if (pfv.getProjectFacet().getId().equals("jst.web")) { //$NON-NLS-1$
-				webFacetVersion = pfv;
-				break;
-			}
-		}
-		if (webFacetVersion != null) {
-			try {
-				webAppDataModel = (IDataModel) context.getConfig(
-						webFacetVersion, IFacetedProject.Action.Type.INSTALL,
-						context.getProjectName());
-				if (webAppDataModel != null) {
-					webAppDataModel.addListener(this);
-				}
-			} catch (CoreException e) {
-				JSFUiPlugin.log(IStatus.ERROR,
-						Messages.JSFFacetInstallPage_ErrorNoWebAppDataModel, e);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage#propertyChanged(org.eclipse.wst.common.frameworks.datamodel.DataModelEvent)
-	 */
-	public void propertyChanged(DataModelEvent event) {
-		if (webAppDataModel != null) {
-			String propertyName = event.getPropertyName();
-			if (propertyName
-					.equals(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER)) {
-				model.setStringProperty(WEBCONTENT_DIR, event.getProperty()
-						.toString());
-			}
-		}
-		super.propertyChanged(event);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage#dispose()
-	 */
-	public void dispose() {
-		if (webAppDataModel != null)
-			webAppDataModel.removeListener(this);
-		
-		jsfLibCfgComp.dispose();
-		super.dispose();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage#restoreDefaultSettings()
-	 */
-	protected void restoreDefaultSettings() {
-		initializeValues();
-
-		checkToCompletePage(jsfLibCfgComp);
-	}
-
-	/*
-	 * To force a JSF facet install page configuration to be performed    
-	 * when the JSF facet is selected but no JSF implementation library exists.
-	 */
-	private void checkToCompletePage(Composite control) {
-		boolean enableFinish = false;
-		IMPLEMENTATION_TYPE implType = (IMPLEMENTATION_TYPE)model.getProperty(IMPLEMENTATION_TYPE_PROPERTY_NAME);
-		if (implType == IMPLEMENTATION_TYPE.SERVER_SUPPLIED)
-			enableFinish = true;
-		else if (implType == IMPLEMENTATION_TYPE.CLIENT_SUPPLIED && 
-				control != null && control instanceof JSFLibraryConfigControl) {
-			enableFinish = (((JSFLibraryConfigControl)control).getSelectedJSFLibImplementation() != null);
-		} //else must be unknown type and requires user interaction
-		setPageComplete(enableFinish);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage#showValidationErrorsOnEnter()
-	 */
-	protected boolean showValidationErrorsOnEnter() {
-		return true;
-	}
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ELPrefPanel.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ELPrefPanel.java
deleted file mode 100644
index 261413c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ELPrefPanel.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.jst.jsf.validation.internal.ELValidationPreferences;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
-
-/**
- * Creates and manages a panel for configuring 
- * 
- * @author cbateman
- */
-/*package*/ class ELPrefPanel 
-{
-    /* view */
-    private final Group                                 _container;
-    private final Button                                _chkBuildValidation;
-    private final Button                                _chkIncrementalValidation;
-    private final ProblemSeveritiesConfigurationBlock   _problemSeverities;
-    
-    /* model */
-    private ELValidationPreferences  _prefs;
-    
-    /**
-     * Allocates new container in parent.
-     * @param parent
-     * @param container 
-     * @param prefs 
-     */
-    public ELPrefPanel(Composite parent, IWorkbenchPreferenceContainer container, ELValidationPreferences prefs)
-    {
-        _prefs = prefs;
-
-        _container = new Group(parent, SWT.NONE);
-        _container.setText(Messages.JSFValidationPreferencePage_ELPrefPanel_Title);
-        RowLayout rowLayout = new RowLayout(SWT.VERTICAL);
-        rowLayout.marginTop = 5;
-        rowLayout.marginLeft = 5; 
-        _container.setLayout(rowLayout);
-
-        _chkBuildValidation = new Button(_container, SWT.CHECK);
-        _chkBuildValidation.setText(Messages.JSFValidationPreferencePage_ELPrefPanel_BuildValidationCheckBoxTitle);
-        _chkBuildValidation.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e) 
-            {
-                _prefs.setEnableBuildValidation(_chkBuildValidation.getSelection());
-                refresh();
-            }
-        });
-        
-        _chkIncrementalValidation = new Button(_container, SWT.CHECK);
-        _chkIncrementalValidation.setText(Messages.JSFValidationPreferencePage_ELPrefPanel_IncrementalValidationCheckBoxTitle);
-        _chkIncrementalValidation.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e) 
-            {
-                _prefs.setEnableIncrementalValidation(_chkIncrementalValidation.getSelection());
-                refresh();
-            }
-        });
-
-        new Label(_container, SWT.NONE);
-        
-        _problemSeverities = new ProblemSeveritiesConfigurationBlock(prefs, null, container);
-        _problemSeverities.createContents(_container);
-    }
-    
-    /**
-     * @return the top-level container managed by this panel
-     */
-    public Control getControl()
-    {
-        return _container;
-    }
-    
-    
-    /**
-     * Refreshes the UI from the model
-     */
-    public void refresh()
-    {
-        _chkBuildValidation.setSelection(_prefs.isEnableBuildValidation());
-        _chkIncrementalValidation.
-            setSelection(_prefs.isEnableIncrementalValidation());
-        _problemSeverities.updateControls();
-    }
-
-    /**
-     * 
-     */
-    public void processChanges() {
-        _problemSeverities.performOk();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/JSFValidationPreferencePage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/JSFValidationPreferencePage.java
deleted file mode 100644
index a003a58..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/JSFValidationPreferencePage.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.validation.internal.ValidationPreferences;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
-
-/**
- * Workbench preference page for configuring JSF validation
- * 
- * @author cbateman
- *
- */
-public class JSFValidationPreferencePage extends PreferencePage implements
-        IWorkbenchPreferencePage 
-{
-    private final ValidationPreferences     _prefs;
-    
-    private ELPrefPanel                     _elPrefPanel;
-    
-    /**
-     * Constructor
-     */
-    public JSFValidationPreferencePage()
-    {
-        super(/* TODO: title*/);
-        _prefs = new ValidationPreferences(getPreferenceStore());
-        _prefs.load();
-    }
-    
-    protected Control createContents(Composite parent) 
-    {
-        _elPrefPanel = new ELPrefPanel(parent, (IWorkbenchPreferenceContainer) getContainer(), _prefs.getElPrefs());
-        _elPrefPanel.refresh();
-        return _elPrefPanel.getControl();
-    }
-
-    public void init(IWorkbench workbench) 
-    {
-        // do nothing
-    }
-
-    protected void performApply() 
-    {
-        // process changes before committing to pref store
-        _elPrefPanel.processChanges();
-        _prefs.commit(getPreferenceStore());
-    }
-
-    protected void performDefaults() 
-    {
-        _prefs.setDefaults();
-        _elPrefPanel.refresh();
-        super.performDefaults();
-    }
-
-    public boolean performOk() 
-    {
-        performApply();
-        return true;
-    }
-
-    protected IPreferenceStore doGetPreferenceStore() 
-    {
-        // load the validation pref store
-        return JSFCorePlugin.getDefault().getPreferenceStore();
-    }
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/OptionsConfigurationBlock.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/OptionsConfigurationBlock.java
deleted file mode 100644
index f26a660..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/OptionsConfigurationBlock.java
+++ /dev/null
@@ -1,979 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Cameron Bateman/Oracle - adapted for use in JSF validation tooling
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.IdentityHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ProjectScope;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.preferences.DefaultScope;
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.validation.internal.ELValidationPreferences.Severity;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Link;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.forms.events.ExpansionAdapter;
-import org.eclipse.ui.forms.events.ExpansionEvent;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
-import org.eclipse.ui.preferences.IWorkingCopyManager;
-import org.eclipse.ui.preferences.WorkingCopyManager;
-import org.osgi.service.prefs.BackingStoreException;
-
-/**
- * Abstract options configuration block providing a general implementation for setting up
- * an options configuration page.
- * 
- * @since 2.1
- */
-abstract class OptionsConfigurationBlock 
-{
-    /**
-     * The preference model to be used
-     */
-    protected final IJSFPreferenceModel     _prefs;
-    
-    static final class Key 
-    {
-        private String fQualifier;
-        private String fKey;
-        
-        Key(String qualifier, String key) {
-            fQualifier= qualifier;
-            fKey= key;
-        }
-        
-        /**
-         * @return the key name
-         */
-        public String getName() {
-            return fKey;
-        }
-        
-//        private IEclipsePreferences getNode(IScopeContext context, IWorkingCopyManager manager) {
-//            IEclipsePreferences node= context.getNode(fQualifier);
-//            if (manager != null) {
-//                return manager.getWorkingCopy(node);
-//            }
-//            return node;
-//            
-//        }
-        
-        /**
-         * @param prefModel
-         * @param context
-         * @param manager
-         * @return the value stored for the key
-         */
-        public Object getStoredValue(IJSFPreferenceModel prefModel, IScopeContext context, IWorkingCopyManager manager)
-        {
-            return prefModel.getStoredValueByKey(context, fKey);
-        }
-        
-        /**
-         * @param prefModel
-         * @param context
-         * @param manager
-         * @return the stored value in prefModel under context for
-         * this key
-         */
-        public Object getCurValue(IJSFPreferenceModel prefModel, IScopeContext context, IWorkingCopyManager manager) {
-            //return getNode(context, manager).get(fKey, null);
-            return prefModel.getValueByKey(context, fKey);
-        }
-        
-        /**
-         * @param prefModel
-         * @param lookupOrder
-         * @param ignoreTopScope
-         * @param manager
-         * @return the stored value in the prefModelunder context
-         * using the list of lookupOrder for precedence of scopes
-         * in which to look.  Return first found based on order in lookupOrder
-         */
-        public Object getCurValue(IJSFPreferenceModel prefModel, IScopeContext[] lookupOrder, boolean ignoreTopScope, IWorkingCopyManager manager) {
-            for (int i= ignoreTopScope ? 1 : 0; i < lookupOrder.length; i++) {
-                Object value= getCurValue(prefModel, lookupOrder[i], manager);
-                if (value != null) {
-                    return value;
-                }
-            }
-            return null;
-        }
-        
-        /**
-         * Set the stored value
-         * @param prefModel 
-         * @param context
-         * @param value
-         * @param manager
-         * @return the old value or null if none
-         */
-        public Object setCurValue(IJSFPreferenceModel prefModel, IScopeContext context, Object value, IWorkingCopyManager manager) {
-            return prefModel.setValueByKey(context, fKey, value);
-//            if (value != null) {
-//                getNode(context, manager).put(fKey, value);
-//            } else {
-//                getNode(context, manager).remove(fKey);
-//            }
-        }
-            
-        /* (non-Javadoc)
-         * @see java.lang.Object#toString()
-         */
-        public String toString() {
-            return fQualifier + '/' + fKey;
-        }
-
-        /**
-         * @return the plugin qualifier
-         */
-        public String getQualifier() {
-            return fQualifier;
-        }
-
-    }
-    
-
-    static class ControlData {
-        private Key fKey;
-        private String[] fValues;
-        
-        ControlData(Key key, String[] values) {
-            fKey= key;
-            fValues= values;
-        }
-        
-        Key getKey() {
-            return fKey;
-        }
-        
-        String getValue(boolean selection) {
-            int index= selection ? 0 : 1;
-            return fValues[index];
-        }
-        
-        String getValue(int index) {
-            return fValues[index];
-        }       
-        
-        int getSelection(String value) {
-            if (value != null) {
-                for (int i= 0; i < fValues.length; i++) {
-                    if (value.equals(fValues[i])) {
-                        return i;
-                    }
-                }
-            }
-            return fValues.length -1; // assume the last option is the least severe
-        }
-    }
-    
-    private static final String REBUILD_COUNT_KEY= "preferences_build_requested"; //$NON-NLS-1$
-    
-    private static final String SETTINGS_EXPANDED= "expanded"; //$NON-NLS-1$
-
-    private final ArrayList fCheckBoxes;
-    private final ArrayList fComboBoxes;
-    private final ArrayList fTextBoxes;
-    private final HashMap fLabels;
-    private final ArrayList fExpandedComposites;
-    
-    private SelectionListener fSelectionListener;
-    private ModifyListener fTextModifyListener;
-
-    // TODO: protected IStatusChangeListener fContext;
-    private final IProject fProject; // project or null
-    private final Key[] fAllKeys;
-    
-    private IScopeContext[] fLookupOrder;
-    
-    private Shell fShell;
-
-    private final IWorkingCopyManager fManager;
-    private IWorkbenchPreferenceContainer fContainer;
-
-    private Map fDisabledProjectSettings; // null when project specific settings are turned off
-    
-    private int fRebuildCount; /// used to prevent multiple dialogs that ask for a rebuild
-    
-    OptionsConfigurationBlock(/*IStatusChangeListener context,*/IJSFPreferenceModel prefs, IProject project, Key[] allKeys, IWorkbenchPreferenceContainer container) {
-        //fContext= context;
-        fProject= project;
-        fAllKeys= allKeys;
-        fContainer= container;
-        _prefs = prefs;
-        
-        if (container == null) {
-            fManager= new WorkingCopyManager();
-        } else {
-            fManager= container.getWorkingCopyManager();
-        }
-        
-        if (fProject != null) {
-            fLookupOrder= new IScopeContext[] {
-                new ProjectScope(fProject),
-                new InstanceScope(),
-                new DefaultScope()
-            };
-        } else {
-            fLookupOrder= new IScopeContext[] {
-                new InstanceScope(),
-                new DefaultScope()
-            };
-        }
-        
-        testIfOptionsComplete(allKeys);
-        if (fProject == null || hasProjectSpecificOptions(fProject)) {
-            fDisabledProjectSettings= null;
-        } else {
-            fDisabledProjectSettings= new IdentityHashMap();
-            for (int i= 0; i < allKeys.length; i++) {
-                Key curr= allKeys[i];
-                fDisabledProjectSettings.put(curr, curr.getCurValue(_prefs, fLookupOrder, false, fManager));
-            }
-        }
-        
-        fCheckBoxes= new ArrayList();
-        fComboBoxes= new ArrayList();
-        fTextBoxes= new ArrayList(2);
-        fLabels= new HashMap();
-        fExpandedComposites= new ArrayList();
-        
-        fRebuildCount= getRebuildCount();
-    }   
-    
-    /**
-     * @return the preference container
-     */
-    protected final IWorkbenchPreferenceContainer getPreferenceContainer() {
-        return fContainer;
-    }
-    
-    /**
-     * @param plugin
-     * @param key
-     * @return construct a new Key based on the on the plugin id and
-     * preference key
-     */
-    protected static Key getKey(String plugin, String key) {
-        return new Key(plugin, key);
-    }
-    
-    /**
-     * @param key
-     * @return construct a new Key for a JSF core plugin preference
-     */
-    protected final static Key getJSFCoreKey(String key) {
-        return getKey(JSFCorePlugin.PLUGIN_ID, key);
-    }
-    
-    private void testIfOptionsComplete(Key[] allKeys) {
-        for (int i= 0; i < allKeys.length; i++) {
-            if (allKeys[i].getCurValue(_prefs, fLookupOrder, false, fManager) == null) {
-                JSFUiPlugin.log(IStatus.ERROR, "preference option missing: " + allKeys[i] + " (" + this.getClass().getName() +')');  //$NON-NLS-1$//$NON-NLS-2$
-            }
-        }
-    }
-    
-    private int getRebuildCount() {
-        return fManager.getWorkingCopy(new DefaultScope().getNode(JavaUI.ID_PLUGIN)).getInt(REBUILD_COUNT_KEY, 0);
-    }
-    
-    private void incrementRebuildCount() {
-        fRebuildCount++;
-        fManager.getWorkingCopy(new DefaultScope().getNode(JavaUI.ID_PLUGIN)).putInt(REBUILD_COUNT_KEY, fRebuildCount);
-    }
-    
-//    public void selectOption(String key, String qualifier) {
-//        for (int i= 0; i < fAllKeys.length; i++) {
-//            Key curr= fAllKeys[i];
-//            if (curr.getName().equals(key) && curr.getQualifier().equals(qualifier)) {
-//                selectOption(curr);
-//            }
-//        }
-//    }
-//    
-//    public void selectOption(Key key) {
-//        Control control= findControl(key);
-//        if (control != null) {
-//            if (!fExpandedComposites.isEmpty()) {
-//                ExpandableComposite expandable= getParentExpandableComposite(control);
-//                if (expandable != null) {
-//                    for (int i= 0; i < fExpandedComposites.size(); i++) {
-//                        ExpandableComposite curr= (ExpandableComposite) fExpandedComposites.get(i);
-//                        curr.setExpanded(curr == expandable);
-//                    }
-//                    expandedStateChanged(expandable);
-//                }
-//            }
-//            control.setFocus();
-//        }
-//    }
-    
-    
-    /**
-     * @param project
-     * @return true if there are project specific overrides in the 
-     * preferences for 'project'
-     */
-    public final boolean hasProjectSpecificOptions(IProject project) {
-        if (project != null) {
-            IScopeContext projectContext= new ProjectScope(project);
-            Key[] allKeys= fAllKeys;
-            for (int i= 0; i < allKeys.length; i++) {
-                if (allKeys[i].getCurValue(_prefs, projectContext, fManager) != null) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }   
-            
-    /**
-     * @return the shell hosting the UI
-     */
-    protected Shell getShell() {
-        return fShell;
-    }
-    
-    /**
-     * Set the shell hosting the UI.
-     * @param shell
-     */
-    protected void setShell(Shell shell) {
-        fShell= shell;
-    }   
-    
-    /**
-     * @param parent
-     * @return the parent of the UI control to be created
-     */
-    protected abstract Control createContents(Composite parent);
-    
-//    protected Button addCheckBox(Composite parent, String label, Key key, String[] values, int indent) {
-//        ControlData data= new ControlData(key, values);
-//        
-//        GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-//        gd.horizontalSpan= 3;
-//        gd.horizontalIndent= indent;
-//        
-//        Button checkBox= new Button(parent, SWT.CHECK);
-//        checkBox.setFont(JFaceResources.getDialogFont());
-//        checkBox.setText(label);
-//        checkBox.setData(data);
-//        checkBox.setLayoutData(gd);
-//        checkBox.addSelectionListener(getSelectionListener());
-//        
-//        makeScrollableCompositeAware(checkBox);
-//        
-//        String currValue= getValue(key);
-//        checkBox.setSelection(data.getSelection(currValue) == 0);
-//        
-//        fCheckBoxes.add(checkBox);
-//        
-//        return checkBox;
-//    }
-    
-    /**
-     * @param parent
-     * @param label
-     * @param key
-     * @param values
-     * @param indent
-     * @param widthHint
-     * @param listener
-     * @return a check box styled button with a related link
-     */
-    protected Button addCheckBoxWithLink(Composite parent, String label, Key key, String[] values, int indent, int widthHint, SelectionListener listener) {
-        ControlData data= new ControlData(key, values);
-        
-        GridData gd= new GridData(GridData.FILL, GridData.FILL, true, false);
-        gd.horizontalSpan= 3;
-        gd.horizontalIndent= indent;
-        
-        Composite composite= new Composite(parent, SWT.NONE);
-        GridLayout layout= new GridLayout();
-        layout.marginHeight= 0;
-        layout.marginWidth= 0;
-        layout.numColumns= 2;
-        composite.setLayout(layout);
-        composite.setLayoutData(gd);
-        
-        Button checkBox= new Button(composite, SWT.CHECK);
-        checkBox.setFont(JFaceResources.getDialogFont());
-        checkBox.setData(data);
-        checkBox.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, false, false));
-        checkBox.addSelectionListener(getSelectionListener());
-        
-        gd= new GridData(GridData.FILL, GridData.CENTER, true, false);
-        gd.widthHint= widthHint;
-        
-        Link link= new Link(composite, SWT.NONE);
-        link.setText(label);
-        link.setLayoutData(gd);
-        if (listener != null) {
-            link.addSelectionListener(listener);
-        }
-        
-        makeScrollableCompositeAware(link);
-        makeScrollableCompositeAware(checkBox);
-        
-        String currValue= getValue(key);
-        checkBox.setSelection(data.getSelection(currValue) == 0);
-        
-        fCheckBoxes.add(checkBox);
-        
-        return checkBox;
-    }
-    
-    /**
-     * @param parent
-     * @param label
-     * @param key
-     * @param values
-     * @param valueLabels
-     * @param indent
-     * @return a Combo box added to parent with the label and key
-     */
-    protected Combo addComboBox(Composite parent, String label, Key key, String[] values, String[] valueLabels, int indent) {
-        GridData gd= new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1);
-        gd.horizontalIndent= indent;
-                
-        Label labelControl= new Label(parent, SWT.LEFT);
-        labelControl.setFont(JFaceResources.getDialogFont());
-        
-        labelControl.setText(label);
-        labelControl.setLayoutData(gd);
-                
-        Combo comboBox= newComboControl(parent, key, values, valueLabels);
-        comboBox.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-
-        fLabels.put(comboBox, labelControl);
-        
-        return comboBox;
-    }
-    
-    Combo addInversedComboBox(Composite parent, String label, Key key, String[] values, String[] valueLabels, int indent) {
-        GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-        gd.horizontalIndent= indent;
-        gd.horizontalSpan= 3;
-        
-        Composite composite= new Composite(parent, SWT.NONE);
-        GridLayout layout= new GridLayout();
-        layout.marginHeight= 0;
-        layout.marginWidth= 0;
-        layout.numColumns= 2;
-        composite.setLayout(layout);
-        composite.setLayoutData(gd);
-        
-        Combo comboBox= newComboControl(composite, key, values, valueLabels);
-        comboBox.setFont(JFaceResources.getDialogFont());
-        comboBox.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-        
-        Label labelControl= new Label(composite, SWT.LEFT | SWT.WRAP);
-        labelControl.setText(label);
-        labelControl.setLayoutData(new GridData());
-        
-        fLabels.put(comboBox, labelControl);
-        return comboBox;
-    }
-    
-    Combo newComboControl(Composite composite, Key key, String[] values, String[] valueLabels) {
-        ControlData data= new ControlData(key, values);
-        
-        Combo comboBox= new Combo(composite, SWT.READ_ONLY);
-        comboBox.setItems(valueLabels);
-        comboBox.setData(data);
-        comboBox.addSelectionListener(getSelectionListener());
-        comboBox.setFont(JFaceResources.getDialogFont());
-            
-        makeScrollableCompositeAware(comboBox);
-        
-        String currValue= getValue(key);    
-        comboBox.select(data.getSelection(currValue));
-        
-        fComboBoxes.add(comboBox);
-        return comboBox;
-    }
-
-    Text addTextField(Composite parent, String label, Key key, int indent, int widthHint) {   
-        Label labelControl= new Label(parent, SWT.WRAP);
-        labelControl.setText(label);
-        labelControl.setFont(JFaceResources.getDialogFont());
-        labelControl.setLayoutData(new GridData());
-                
-        Text textBox= new Text(parent, SWT.BORDER | SWT.SINGLE);
-        textBox.setData(key);
-        textBox.setLayoutData(new GridData());
-        
-        makeScrollableCompositeAware(textBox);
-        
-        fLabels.put(textBox, labelControl);
-        
-        String currValue= getValue(key);    
-        if (currValue != null) {
-            textBox.setText(currValue);
-        }
-        textBox.addModifyListener(getTextModifyListener());
-
-        GridData data= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        if (widthHint != 0) {
-            data.widthHint= widthHint;
-        }
-        data.horizontalIndent= indent;
-        data.horizontalSpan= 2;
-        textBox.setLayoutData(data);
-
-        fTextBoxes.add(textBox);
-        return textBox;
-    }
-    
-    ScrolledPageContent getParentScrolledComposite(Control control) {
-        Control parent= control.getParent();
-        while (!(parent instanceof ScrolledPageContent) && parent != null) {
-            parent= parent.getParent();
-        }
-        if (parent instanceof ScrolledPageContent) {
-            return (ScrolledPageContent) parent;
-        }
-        return null;
-    }
-    
-    ExpandableComposite getParentExpandableComposite(Control control) {
-        Control parent= control.getParent();
-        while (!(parent instanceof ExpandableComposite) && parent != null) {
-            parent= parent.getParent();
-        }
-        if (parent instanceof ExpandableComposite) {
-            return (ExpandableComposite) parent;
-        }
-        return null;
-    }
-    
-    private void makeScrollableCompositeAware(Control control) {
-        ScrolledPageContent parentScrolledComposite= getParentScrolledComposite(control);
-        if (parentScrolledComposite != null) {
-            parentScrolledComposite.adaptChild(control);
-        }
-    }
-    
-    ExpandableComposite createStyleSection(Composite parent, String label, int nColumns) {
-        ExpandableComposite excomposite= new ExpandableComposite(parent, SWT.NONE, ExpandableComposite.TWISTIE | ExpandableComposite.CLIENT_INDENT);
-        excomposite.setText(label);
-        excomposite.setExpanded(false);
-        excomposite.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT));
-        excomposite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, nColumns, 1));
-        excomposite.addExpansionListener(new ExpansionAdapter() {
-            public void expansionStateChanged(ExpansionEvent e) {
-                expandedStateChanged((ExpandableComposite) e.getSource());
-            }
-        });
-        fExpandedComposites.add(excomposite);
-        makeScrollableCompositeAware(excomposite);
-        return excomposite;
-    }
-    
-    final void expandedStateChanged(ExpandableComposite expandable) {
-        ScrolledPageContent parentScrolledComposite= getParentScrolledComposite(expandable);
-        if (parentScrolledComposite != null) {
-            parentScrolledComposite.reflow(true);
-        }
-    }
-    
-    void restoreSectionExpansionStates(IDialogSettings settings) {
-        for (int i= 0; i < fExpandedComposites.size(); i++) {
-            ExpandableComposite excomposite= (ExpandableComposite) fExpandedComposites.get(i);
-            if (settings == null) {
-                excomposite.setExpanded(i == 0); // only expand the first node by default
-            } else {
-                excomposite.setExpanded(settings.getBoolean(SETTINGS_EXPANDED + String.valueOf(i)));
-            }
-        }
-    }
-    
-    void storeSectionExpansionStates(IDialogSettings settings) {
-        for (int i= 0; i < fExpandedComposites.size(); i++) {
-            ExpandableComposite curr= (ExpandableComposite) fExpandedComposites.get(i);
-            settings.put(SETTINGS_EXPANDED + String.valueOf(i), curr.isExpanded());
-        }
-    }
-    
-    SelectionListener getSelectionListener() {
-        if (fSelectionListener == null) {
-            fSelectionListener= new SelectionListener() {
-                public void widgetDefaultSelected(SelectionEvent e) {/*do nothing*/}
-    
-                public void widgetSelected(SelectionEvent e) {
-                    controlChanged(e.widget);
-                }
-            };
-        }
-        return fSelectionListener;
-    }
-    
-    ModifyListener getTextModifyListener() {
-        if (fTextModifyListener == null) {
-            fTextModifyListener= new ModifyListener() {
-                public void modifyText(ModifyEvent e) {
-                    textChanged((Text) e.widget);
-                }
-            };
-        }
-        return fTextModifyListener;
-    }       
-    
-    void controlChanged(Widget widget) {
-        ControlData data= (ControlData) widget.getData();
-        String newValue= null;
-        if (widget instanceof Button) {
-            newValue= data.getValue(((Button)widget).getSelection());           
-        } else if (widget instanceof Combo) {
-            newValue= data.getValue(((Combo)widget).getSelectionIndex());
-        } else {
-            return;
-        }
-        String oldValue= setValue(data.getKey(), newValue);
-        validateSettings(data.getKey(), oldValue, newValue);
-    }
-    
-    void textChanged(Text textControl) {
-        Key key= (Key) textControl.getData();
-        String number= textControl.getText();
-        String oldValue= setValue(key, number);
-        validateSettings(key, oldValue, number);
-    }   
-
-    boolean checkValue(Key key, String value) {
-        return value.equals(getValue(key));
-    }
-    
-    String getValue(Key key) {
-        if (fDisabledProjectSettings != null) {
-            return (String) fDisabledProjectSettings.get(key);
-        }
-        return key.getCurValue(_prefs, fLookupOrder, false, fManager).toString();
-    }
-    
-    
-    boolean getBooleanValue(Key key) {
-        return Boolean.valueOf(getValue(key)).booleanValue();
-    }
-    
-    String setValue(Key key, String value) {
-        if (fDisabledProjectSettings != null) {
-            return (String) fDisabledProjectSettings.put(key, value);
-        }
-        Object newValue =  key.setCurValue(_prefs, fLookupOrder[0], Severity.valueOfString(value), fManager);
-        return newValue != null ? newValue.toString() : "";
-    }
-    
-    String setValue(Key key, boolean value) {
-        return setValue(key, String.valueOf(value));
-    }
-
-    /**
-     * Returns the value as actually stored in the preference store.
-     * @param key
-     * @return the value as actually stored in the preference store.
-     */
-    Object getStoredValue(Key key) {
-        return key.getCurValue(_prefs, fLookupOrder, false, fManager);
-    }
-    
-    /**
-     * Update fields and validate.
-     * @param changedKey Key that changed, or null, if all changed.
-     * @param oldValue 
-     * @param newValue 
-     */ 
-    protected abstract void validateSettings(Key changedKey, String oldValue, String newValue);
-    
-    
-    String[] getTokens(String text, String separator) {
-        StringTokenizer tok= new StringTokenizer(text, separator); 
-        int nTokens= tok.countTokens();
-        String[] res= new String[nTokens];
-        for (int i= 0; i < res.length; i++) {
-            res[i]= tok.nextToken().trim();
-        }
-        return res;
-    }
-
-    private boolean getChanges(IScopeContext currContext, List changedSettings) {
-        boolean needsBuild= false;
-        for (int i= 0; i < fAllKeys.length; i++) {
-            Key key= fAllKeys[i];
-            Object oldVal= key.getStoredValue(_prefs, currContext, null);
-            Object val= key.getCurValue(_prefs, currContext, fManager);
-            if (val == null) {
-                if (oldVal != null) {
-                    changedSettings.add(key);
-                    needsBuild |= !oldVal.equals(key.getCurValue(_prefs, fLookupOrder, true, fManager));
-                }
-            } else if (!val.equals(oldVal)) {
-                changedSettings.add(key);
-                needsBuild |= oldVal != null || !val.equals(key.getCurValue(_prefs, fLookupOrder, true, fManager));
-            }
-        }
-        return needsBuild;
-    }
-    
-    void useProjectSpecificSettings(boolean enable) {
-        boolean hasProjectSpecificOption= fDisabledProjectSettings == null;
-        if (enable != hasProjectSpecificOption && fProject != null) {
-            if (enable) {
-                for (int i= 0; i < fAllKeys.length; i++) {
-                    Key curr= fAllKeys[i];
-                    String val= (String) fDisabledProjectSettings.get(curr);
-                    curr.setCurValue(_prefs, fLookupOrder[0], Severity.valueOfString(val), fManager);
-                }
-                fDisabledProjectSettings= null;
-                updateControls();
-                validateSettings(null, null, null);
-            } else {
-                fDisabledProjectSettings= new IdentityHashMap();
-                for (int i= 0; i < fAllKeys.length; i++) {
-                    Key curr= fAllKeys[i];
-                    Object oldSetting= curr.getCurValue(_prefs, fLookupOrder, false, fManager);
-                    fDisabledProjectSettings.put(curr, oldSetting);
-                    curr.setCurValue(_prefs, fLookupOrder[0], null, fManager); // clear project settings
-                }
-            }
-        }
-    }
-    
-    boolean areSettingsEnabled() {
-        return fDisabledProjectSettings == null || fProject == null;
-    }
-    
-    
-    boolean performOk() {
-        return processChanges(fContainer);
-    }
-    
-//    public boolean performApply() {
-//        return processChanges(null); // apply directly
-//    }
-    
-    boolean processChanges(IWorkbenchPreferenceContainer container) {
-        IScopeContext currContext= fLookupOrder[0];
-        
-        List /* <Key>*/ changedOptions= new ArrayList();
-        boolean needsBuild= getChanges(currContext, changedOptions);
-        if (changedOptions.isEmpty()) {
-            return true;
-        }
-        if (needsBuild) {
-            int count= getRebuildCount();
-            if (count > fRebuildCount) {
-                needsBuild= false; // build already requested
-                fRebuildCount= count;
-            }
-        }
-
-        boolean doBuild= false;
-        
-        final String  showBuildWarningKey = JSFCorePlugin.PLUGIN_ID + "." + "buildwarning_dont_show_again";
-        final IPreferenceStore prefStore = JSFCorePlugin.getDefault().getPreferenceStore();
-        final boolean showDialog = !MessageDialogWithToggle.ALWAYS.equals(prefStore.getString(showBuildWarningKey));
-        
-        if (needsBuild && showDialog) {
-            String[] strings= getFullBuildDialogStrings(fProject == null);
-            if (strings != null) {
-                MessageDialogWithToggle.openInformation
-                	(getShell(), strings[0], strings[1], 
-                			PreferencesMessages.ProblemSeveritiesConfigurationBlock_buildwarning_dont_show_again
-                			, false, prefStore, showBuildWarningKey);
-//                int res= dialog.open();
-//                if (res == 0) {
-//                    doBuild= true;
-//                } else if (res != 1) {
-//                    return false; // cancel pressed
-//                }
-            }
-        }
-        if (container != null) {
-            // no need to apply the changes to the original store: will be done by the page container
-            if (doBuild) { // post build
-                incrementRebuildCount();
-                // TODO: container.registerUpdateJob(CoreUtility.getBuildJob(fProject));
-            }
-        } else {
-            // apply changes right away
-            try {
-                fManager.applyChanges();
-            } catch (BackingStoreException e) {
-                JSFUiPlugin.log(IStatus.ERROR, "Error applying changes", e);
-                return false;
-            }
-            if (doBuild) {
-                //CoreUtility.getBuildJob(fProject).schedule();
-            }
-            
-        }
-        return true;
-    }
-    
-    abstract String[] getFullBuildDialogStrings(boolean workspaceSettings);
-            
-    
-//    public void performDefaults() {
-//        for (int i= 0; i < fAllKeys.length; i++) {
-//            Key curr= fAllKeys[i];
-//            String defValue= curr.getStoredValue(fLookupOrder, true, fManager);
-//            setValue(curr, defValue);
-//        }
-//        
-//        settingsUpdated();
-//        updateControls();
-//        validateSettings(null, null, null);
-//    }
-
-    /**
-     * @since 3.1
-     */
-    void performRevert() {
-        for (int i= 0; i < fAllKeys.length; i++) {
-            Key curr= fAllKeys[i];
-            String origValue= curr.getCurValue(_prefs, fLookupOrder, false, null).toString();
-            setValue(curr, origValue);
-        }
-
-        updateControls();
-        validateSettings(null, null, null);
-    }
-    
-    void dispose() {
-        // do nothing; sub-class should override
-    }
-    
-    void updateControls() {
-        // update the UI
-        for (int i= fCheckBoxes.size() - 1; i >= 0; i--) {
-            updateCheckBox((Button) fCheckBoxes.get(i));
-        }
-        for (int i= fComboBoxes.size() - 1; i >= 0; i--) {
-            updateCombo((Combo) fComboBoxes.get(i));
-        }
-        for (int i= fTextBoxes.size() - 1; i >= 0; i--) {
-            updateText((Text) fTextBoxes.get(i));
-        }
-    }
-    
-    void updateCombo(Combo curr) {
-        ControlData data= (ControlData) curr.getData();
-        
-        String currValue= getValue(data.getKey());  
-        curr.select(data.getSelection(currValue));                  
-    }
-    
-    void updateCheckBox(Button curr) {
-        ControlData data= (ControlData) curr.getData();
-        
-        String currValue= getValue(data.getKey());  
-        curr.setSelection(data.getSelection(currValue) == 0);                       
-    }
-    
-    void updateText(Text curr) {
-        Key key= (Key) curr.getData();
-        
-        String currValue= getValue(key);
-        if (currValue != null) {
-            curr.setText(currValue);
-        }
-    }
-    
-    Button getCheckBox(Key key) {
-        for (int i= fCheckBoxes.size() - 1; i >= 0; i--) {
-            Button curr= (Button) fCheckBoxes.get(i);
-            ControlData data= (ControlData) curr.getData();
-            if (key.equals(data.getKey())) {
-                return curr;
-            }
-        }
-        return null;        
-    }
-    
-    Combo getComboBox(Key key) {
-        for (int i= fComboBoxes.size() - 1; i >= 0; i--) {
-            Combo curr= (Combo) fComboBoxes.get(i);
-            ControlData data= (ControlData) curr.getData();
-            if (key.equals(data.getKey())) {
-                return curr;
-            }
-        }
-        return null;        
-    }
-    
-    Text getTextControl(Key key) {
-        for (int i= fTextBoxes.size() - 1; i >= 0; i--) {
-            Text curr= (Text) fTextBoxes.get(i);
-            ControlData data= (ControlData) curr.getData();
-            if (key.equals(data.getKey())) {
-                return curr;
-            }
-        }
-        return null;        
-    }
-    
-    Control findControl(Key key) {
-        Combo comboBox= getComboBox(key);
-        if (comboBox != null) {
-            return comboBox;
-        }
-        Button checkBox= getCheckBox(key);
-        if (checkBox != null) {
-            return checkBox;
-        }
-        Text text= getTextControl(key);
-        if (text != null) {
-            return text;
-        }
-        return null;
-    }
-    
-    void setComboEnabled(Key key, boolean enabled) {
-        Combo combo= getComboBox(key);
-        Label label= (Label) fLabels.get(combo);
-        combo.setEnabled(enabled);
-        label.setEnabled(enabled);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/PixelConverter.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/PixelConverter.java
deleted file mode 100644
index a5ed503..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/PixelConverter.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Oracle - copied for use in JSF validation tooling
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.widgets.Control;
-
-import org.eclipse.jface.dialogs.Dialog;
-
-/**
- * Copied from JDT.  Used by OptionsConfigurationBlock
- *
- */
-class PixelConverter {
-    
-    private final FontMetrics fFontMetrics;
-    
-    /**
-     * @param control
-     */
-    PixelConverter(Control control) {
-        this(control.getFont());
-    }
-    
-    /**
-     * @param font
-     */
-    PixelConverter(Font font) {
-        GC gc = new GC(font.getDevice());
-        gc.setFont(font);
-        fFontMetrics= gc.getFontMetrics();
-        gc.dispose();
-    }
-    
-    /*
-     * see org.eclipse.jface.dialogs.DialogPage#convertHeightInCharsToPixels(int)
-     */
-    int convertHeightInCharsToPixels(int chars) {
-        return Dialog.convertHeightInCharsToPixels(fFontMetrics, chars);
-    }
-
-    /*
-     * see org.eclipse.jface.dialogs.DialogPage#convertHorizontalDLUsToPixels(int)
-     */
-    int convertHorizontalDLUsToPixels(int dlus) {
-        return Dialog.convertHorizontalDLUsToPixels(fFontMetrics, dlus);
-    }
-
-    /*
-     * see org.eclipse.jface.dialogs.DialogPage#convertVerticalDLUsToPixels(int)
-     */
-    int convertVerticalDLUsToPixels(int dlus) {
-        return Dialog.convertVerticalDLUsToPixels(fFontMetrics, dlus);
-    }
-    
-    /*
-     * see org.eclipse.jface.dialogs.DialogPage#convertWidthInCharsToPixels(int)
-     */
-    int convertWidthInCharsToPixels(int chars) {
-        return Dialog.convertWidthInCharsToPixels(fFontMetrics, chars);
-    }   
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/PreferencesMessages.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/PreferencesMessages.java
deleted file mode 100644
index 8877117..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/PreferencesMessages.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     John Kaplan, johnkaplantech@gmail.com - 108071 [code templates] template for body of newly created class
- *     Oracle - adapted for JSF tooling
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * NLS messages for validation severity preferences
- * 
- * @author cbateman
- *
- */
-public final class PreferencesMessages extends NLS {
-
-    private static final String BUNDLE_NAME= "org.eclipse.jst.jsf.ui.internal.validation.messages";//$NON-NLS-1$
-
-    private PreferencesMessages() {
-        // Do not instantiate
-    }
-
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesPreferencePage_title;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_error;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_warning;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_ignore;
-
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_section_id_resolution;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_section_general;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_section_type_coercion_problems;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_section_constant_folding_and_unused_code;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_section_programming_errors;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_needsbuild_title;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_needsfullbuild_message;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_needsprojectbuild_message;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_buildwarning_dont_show_again;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_common_description;
-
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_general_syntax_error;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_empty_el_expression;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_missing_closing_expr_bracket;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_cannot_apply_operator_to_method_binding;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_dotted_property_key_should_use_array;
-
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_variable_not_found;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_member_not_found;
-
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_binary_op_numeric_coercion_error;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_binary_op_boolean_coercion_error;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_binary_op_no_coercion_available;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_binary_op_literal_to_number_coercion_error;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_unary_op_numeric_coercion_error;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_unary_op_boolean_coercion_error;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_unary_op_string_coercion_not_guaranteed;
-    
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_both_binary_operands_null;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_binary_expression_always_evaluates_same;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_equality_with_null_always_same;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_unary_expression_always_evaluates_same;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_empty_expression_always_false;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_enumeration_comparision_always_same;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_minus_on_null_always_zero;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_first_argument_short_circuits_expression;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_second_argument_always_evaluates_same;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_apply_dot_operator_with_null;
-    
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_possible_division_by_zero;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_possible_array_index_out_of_bounds;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_incompatible_enumeration_comparison;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_member_is_intermediate;
-    
-    static {
-        NLS.initializeMessages(BUNDLE_NAME, PreferencesMessages.class);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ProblemSeveritiesConfigurationBlock.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ProblemSeveritiesConfigurationBlock.java
deleted file mode 100644
index 69b31a7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ProblemSeveritiesConfigurationBlock.java
+++ /dev/null
@@ -1,421 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Oracle - adapted for use in JSF Tooling
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.validation.internal.ELValidationPreferences;
-import org.eclipse.jst.jsf.validation.internal.ELValidationPreferences.Severity;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
-
-
-/**
-  */
-/*package*/ class ProblemSeveritiesConfigurationBlock extends OptionsConfigurationBlock {
-
-    private static final String SETTINGS_SECTION_NAME= "ProblemSeveritiesConfigurationBlock";  //$NON-NLS-1$
-    
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    private final static Key PREF_BINARY_OP_BOTH_OPERANDS_NULL = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_BOTH_OPERANDS_NULL);
-    private final static Key PREF_BINARY_OP_POSSIBLE_DIVISION_BY_ZERO = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_POSSIBLE_DIVISION_BY_ZERO);
-    private final static Key PREF_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION);
-    private final static Key PREF_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME);
-    private final static Key PREF_BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME);
-    private final static Key PREF_BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN);
-    private final static Key PREF_BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS);
-    private final static Key PREF_BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME =
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME);
-    private final static Key PREF_BINARY_OP_NO_AVAILABLE_TYPE_COERCION = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_NO_AVAILABLE_TYPE_COERCION);
-    private final static Key PREF_BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS);
-    private final static Key PREF_UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME = 
-        getJSFCoreKey(ELValidationPreferences.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME);
-    private final static Key PREF_UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE = 
-        getJSFCoreKey(ELValidationPreferences.UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE);
-    private final static Key PREF_UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO = 
-        getJSFCoreKey(ELValidationPreferences.UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO);
-    private final static Key PREF_UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION = 
-        getJSFCoreKey(ELValidationPreferences.UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION);
-    private final static Key PREF_UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN = 
-        getJSFCoreKey(ELValidationPreferences.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN);
-//    private final static Key PREF_TERNARY_OP_CHOICE_IS_ALWAYS_SAME = 
-//        getJSFCoreKey(ELValidationPreferences.TERNARY_OP_CHOICE_IS_ALWAYS_SAME);
-//    private final static Key PREF_TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN = 
-//        getJSFCoreKey(ELValidationPreferences.TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN);
-    private final static Key PREF_UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED = 
-        getJSFCoreKey(ELValidationPreferences.UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED);
-    private final static Key PREF_CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING = 
-        getJSFCoreKey(ELValidationPreferences.CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING);
-    private final static Key PREF_MEMBER_NOT_FOUND = 
-        getJSFCoreKey(ELValidationPreferences.MEMBER_NOT_FOUND);
-    private final static Key PREF_VARIABLE_NOT_FOUND = 
-        getJSFCoreKey(ELValidationPreferences.VARIABLE_NOT_FOUND);
-    private final static Key PREF_MISSING_CLOSING_EXPR_BRACKET =
-        getJSFCoreKey(ELValidationPreferences.MISSING_CLOSING_EXPR_BRACKET);
-    private final static Key PREF_GENERAL_SYNTAX_ERROR = 
-        getJSFCoreKey(ELValidationPreferences.GENERAL_SYNTAX_ERROR);
-    private final static Key PREF_EMPTY_EL_EXPRESSION = 
-        getJSFCoreKey(ELValidationPreferences.EMPTY_EL_EXPRESSION);
-    private final static Key PREF_BINARY_OP_DOT_WITH_VALUEB_NULL = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_DOT_WITH_VALUEB_NULL);
-    private final static Key PREF_BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY =
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY);
-    private final static Key PREF_POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS = 
-        getJSFCoreKey(ELValidationPreferences.POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS);
-    private final static Key PREF_BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME);
-    private final static Key PREF_BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE);
-    private final static Key PREF_MEMBER_IS_INTERMEDIATE =
-        getJSFCoreKey(ELValidationPreferences.MEMBER_IS_INTERMEDIATE);
-
-    private final static int EXPECTED_PREFS = 28;
-    
-    private PixelConverter fPixelConverter;
-    
-    /**
-     * @param prefs 
-     * @param project
-     * @param container
-     */
-    public ProblemSeveritiesConfigurationBlock(/*TODO:IStatusChangeListener context,*/ IJSFPreferenceModel prefs, IProject project, IWorkbenchPreferenceContainer container) {
-        super(prefs, project, getKeys(), container);
-    }
-    
-    private static Key[] getKeys() 
-    {
-        Key[] keys = new Key[] {
-                PREF_BINARY_OP_BOTH_OPERANDS_NULL
-                , PREF_BINARY_OP_POSSIBLE_DIVISION_BY_ZERO
-                , PREF_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION 
-                , PREF_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME
-                , PREF_BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME
-                , PREF_BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN
-                , PREF_BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS
-                , PREF_BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME
-                , PREF_BINARY_OP_NO_AVAILABLE_TYPE_COERCION 
-                , PREF_BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS 
-                , PREF_UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME
-                , PREF_UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE 
-                , PREF_UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO 
-                , PREF_UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION
-                , PREF_UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN
-                , PREF_UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED
-                , PREF_CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING
-                , PREF_MEMBER_NOT_FOUND 
-                , PREF_VARIABLE_NOT_FOUND
-                , PREF_MISSING_CLOSING_EXPR_BRACKET
-                , PREF_GENERAL_SYNTAX_ERROR
-                , PREF_EMPTY_EL_EXPRESSION
-                , PREF_BINARY_OP_DOT_WITH_VALUEB_NULL
-                , PREF_BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY
-                , PREF_POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS 
-                , PREF_BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME
-                , PREF_BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE
-                , PREF_MEMBER_IS_INTERMEDIATE
-          };
-        
-        if (EXPECTED_PREFS != keys.length)
-        {
-            JSFUiPlugin.log(IStatus.WARNING, "Expected "+EXPECTED_PREFS+" preferences but was "+keys.length, new Throwable());
-        }
-
-        return keys;
-    }
-    
-    /*
-     * @see org.eclipse.jface.preference.PreferencePage#createContents(Composite)
-     */
-    protected Control createContents(Composite parent) {
-        fPixelConverter= new PixelConverter(parent);
-        setShell(parent.getShell());
-        
-        Group mainComp= new Group(parent, SWT.NONE);
-        mainComp.setFont(parent.getFont());
-        GridLayout layout= new GridLayout();
-        layout.marginHeight= 0;
-        layout.marginWidth= 0;
-        mainComp.setLayout(layout);
-        mainComp.setText(PreferencesMessages.ProblemSeveritiesConfigurationBlock_common_description);
-        
-        Composite commonComposite= createStyleTabContent(mainComp);
-        GridData gridData= new GridData(GridData.FILL, GridData.FILL, true, true);
-        gridData.heightHint= fPixelConverter.convertHeightInCharsToPixels(20);
-        commonComposite.setLayoutData(gridData);
-        
-        validateSettings(null, null, null);
-    
-        return mainComp;
-    }
-    
-    private Composite createStyleTabContent(Composite folder) {
-        String[] errorWarningIgnore= new String[] { Severity.ERROR.toString(), Severity.WARNING.toString(), Severity.IGNORE.toString() };
-        
-        String[] errorWarningIgnoreLabels= new String[] {
-            PreferencesMessages.ProblemSeveritiesConfigurationBlock_error,  
-            PreferencesMessages.ProblemSeveritiesConfigurationBlock_warning, 
-            PreferencesMessages.ProblemSeveritiesConfigurationBlock_ignore
-        };
-        
-        //String[] enabledDisabled= new String[] { ENABLED, DISABLED };
-        
-        int nColumns= 3;
-        
-        final ScrolledPageContent sc1 = new ScrolledPageContent(folder);
-        
-        Composite composite= sc1.getBody();
-        GridLayout layout= new GridLayout(nColumns, false);
-        layout.marginHeight= 0;
-        layout.marginWidth= 0;
-        composite.setLayout(layout);
-        
-//        Label description= new Label(composite, SWT.LEFT | SWT.WRAP);
-//        description.setFont(description.getFont());
-//        description.setText(PreferencesMessages.ProblemSeveritiesConfigurationBlock_common_description); 
-//        description.setLayoutData(new GridData(GridData.BEGINNING, GridData.CENTER, true, false, nColumns - 1, 1));
-                
-        int indentStep=  fPixelConverter.convertWidthInCharsToPixels(1);
-        
-        int defaultIndent= indentStep * 0;
-        //int extraIndent= indentStep * 2;
-        String label;
-        ExpandableComposite excomposite;
-        Composite inner;
-        
-        // -- general errors
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_section_general; 
-        excomposite= createStyleSection(composite, label, nColumns);
-        
-        inner= new Composite(excomposite, SWT.NONE);
-        inner.setFont(composite.getFont());
-        inner.setLayout(new GridLayout(nColumns, false));
-        excomposite.setClient(inner);
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_general_syntax_error; 
-        addComboBox(inner, label, PREF_GENERAL_SYNTAX_ERROR, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_empty_el_expression; 
-        addComboBox(inner, label, PREF_EMPTY_EL_EXPRESSION, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_missing_closing_expr_bracket; 
-        addComboBox(inner, label, PREF_MISSING_CLOSING_EXPR_BRACKET, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_cannot_apply_operator_to_method_binding; 
-        addComboBox(inner, label, PREF_CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_dotted_property_key_should_use_array; 
-        addComboBox(inner, label, PREF_BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-        
-        // --- id resolution
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_section_id_resolution; 
-        excomposite= createStyleSection(composite, label, nColumns);
-        
-        inner= new Composite(excomposite, SWT.NONE);
-        inner.setFont(composite.getFont());
-        inner.setLayout(new GridLayout(nColumns, false));
-        excomposite.setClient(inner);
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_variable_not_found; 
-        addComboBox(inner, label, PREF_VARIABLE_NOT_FOUND, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_member_not_found; 
-        addComboBox(inner, label, PREF_MEMBER_NOT_FOUND, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_member_is_intermediate; 
-        addComboBox(inner, label, PREF_MEMBER_IS_INTERMEDIATE, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        // --- type coercion problems
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_section_type_coercion_problems; 
-        excomposite= createStyleSection(composite, label, nColumns);
-        
-        inner= new Composite(excomposite, SWT.NONE);
-        inner.setFont(composite.getFont());
-        inner.setLayout(new GridLayout(nColumns, false));
-        excomposite.setClient(inner);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_binary_op_numeric_coercion_error; 
-        addComboBox(inner, label, PREF_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_binary_op_boolean_coercion_error; 
-        addComboBox(inner, label, PREF_BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_binary_op_no_coercion_available; 
-        addComboBox(inner, label, PREF_BINARY_OP_NO_AVAILABLE_TYPE_COERCION, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_binary_op_literal_to_number_coercion_error; 
-        addComboBox(inner, label, PREF_BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_unary_op_numeric_coercion_error; 
-        addComboBox(inner, label, PREF_UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_unary_op_boolean_coercion_error; 
-        addComboBox(inner, label, PREF_UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_unary_op_string_coercion_not_guaranteed; 
-        addComboBox(inner, label, PREF_UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        // --- constant folder and unused code
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_section_constant_folding_and_unused_code; 
-        excomposite= createStyleSection(composite, label, nColumns);
-        
-        inner= new Composite(excomposite, SWT.NONE);
-        inner.setFont(composite.getFont());
-        inner.setLayout(new GridLayout(nColumns, false));
-        excomposite.setClient(inner);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_both_binary_operands_null; 
-        addComboBox(inner, label, PREF_BINARY_OP_BOTH_OPERANDS_NULL, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_binary_expression_always_evaluates_same; 
-        addComboBox(inner, label, PREF_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_equality_with_null_always_same; 
-        addComboBox(inner, label, PREF_BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_enumeration_comparision_always_same; 
-        addComboBox(inner, label, PREF_BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_unary_expression_always_evaluates_same; 
-        addComboBox(inner, label, PREF_UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_empty_expression_always_false; 
-        addComboBox(inner, label, PREF_UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);          
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_minus_on_null_always_zero; 
-        addComboBox(inner, label, PREF_UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);          
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_first_argument_short_circuits_expression; 
-        addComboBox(inner, label, PREF_BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);          
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_second_argument_always_evaluates_same; 
-        addComboBox(inner, label, PREF_BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);          
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_apply_dot_operator_with_null; 
-        addComboBox(inner, label, PREF_BINARY_OP_DOT_WITH_VALUEB_NULL, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);          
-
-        // --- possible programming errors
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_section_programming_errors; 
-        excomposite= createStyleSection(composite, label, nColumns);
-        
-        inner= new Composite(excomposite, SWT.NONE);
-        inner.setFont(composite.getFont());
-        inner.setLayout(new GridLayout(nColumns, false));
-        excomposite.setClient(inner);
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_possible_division_by_zero; 
-        addComboBox(inner, label, PREF_BINARY_OP_POSSIBLE_DIVISION_BY_ZERO, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_possible_array_index_out_of_bounds; 
-        addComboBox(inner, label, PREF_POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);        
-    
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_incompatible_enumeration_comparison; 
-        addComboBox(inner, label, PREF_BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-
-        new Label(composite, SWT.NONE);
-        
-        IDialogSettings section= JSFUiPlugin.getDefault().getDialogSettings().getSection(SETTINGS_SECTION_NAME);
-        restoreSectionExpansionStates(section);
-        
-        return sc1;
-    }
-    
-    /* (non-javadoc)
-     * Update fields and validate.
-     * @param changedKey Key that changed, or null, if all changed.
-     */ 
-    protected void validateSettings(Key changedKey, String oldValue, String newValue) {
-        if (!areSettingsEnabled()) {
-            return;
-        }
-        
-//        if (changedKey != null) {
-//            if (PREF_PB_UNUSED_PARAMETER.equals(changedKey) ||
-//                    PREF_PB_DEPRECATION.equals(changedKey) ||
-//                    PREF_PB_LOCAL_VARIABLE_HIDING.equals(changedKey) ||
-//                    PREF_PB_UNUSED_DECLARED_THROWN_EXCEPTION.equals(changedKey)) {              
-//                updateEnableStates();
-//            } else if (PREF_PB_SIGNAL_PARAMETER_IN_OVERRIDING.equals(changedKey)) {
-//                // merging the two options
-//                setValue(PREF_PB_SIGNAL_PARAMETER_IN_ABSTRACT, newValue);
-//            } else {
-//                return;
-//            }
-//        } else {
-            updateEnableStates();
-//        }       
-        // TODO: fContext.statusChanged(new StatusInfo());
-    }
-    
-    private void updateEnableStates() {
-//        boolean enableUnusedParams= !checkValue(PREF_PB_UNUSED_PARAMETER, Severity.IGNORE.toString());
-//        getCheckBox(PREF_PB_SIGNAL_PARAMETER_IN_OVERRIDING).setEnabled(enableUnusedParams);
-//        getCheckBox(PREF_PB_UNUSED_PARAMETER_INCLUDE_DOC_COMMENT_REFERENCE).setEnabled(enableUnusedParams);
-//        
-//        boolean enableDeprecation= !checkValue(PREF_PB_DEPRECATION, Severity.IGNORE.toString());
-//        getCheckBox(PREF_PB_DEPRECATION_IN_DEPRECATED_CODE).setEnabled(enableDeprecation);
-//        getCheckBox(PREF_PB_DEPRECATION_WHEN_OVERRIDING).setEnabled(enableDeprecation);
-//        
-//        boolean enableThrownExceptions= !checkValue(PREF_PB_UNUSED_DECLARED_THROWN_EXCEPTION, Severity.IGNORE.toString());
-//        getCheckBox(PREF_PB_UNUSED_DECLARED_THROWN_EXCEPTION_WHEN_OVERRIDING).setEnabled(enableThrownExceptions);
-//
-//        boolean enableHiding= !checkValue(PREF_PB_LOCAL_VARIABLE_HIDING, Severity.IGNORE.toString());
-//        getCheckBox(PREF_PB_SPECIAL_PARAMETER_HIDING_FIELD).setEnabled(enableHiding);
-    }
-
-    protected String[] getFullBuildDialogStrings(boolean workspaceSettings) {
-        String title= PreferencesMessages.ProblemSeveritiesConfigurationBlock_needsbuild_title; 
-        String message;
-        if (workspaceSettings) {
-            message= PreferencesMessages.ProblemSeveritiesConfigurationBlock_needsfullbuild_message; 
-        } else {
-            message= PreferencesMessages.ProblemSeveritiesConfigurationBlock_needsprojectbuild_message; 
-        }
-        return new String[] { title, message };
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jdt.internal.ui.preferences.OptionsConfigurationBlock#dispose()
-     */
-    public void dispose() {
-        IDialogSettings section= JSFUiPlugin.getDefault().getDialogSettings().addNewSection(SETTINGS_SECTION_NAME);
-        storeSectionExpansionStates(section);
-        super.dispose();
-    }
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ScrolledPageContent.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ScrolledPageContent.java
deleted file mode 100644
index 74c21a8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ScrolledPageContent.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Oracle - updated for JSF tools
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.SharedScrolledComposite;
-
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-
-
-/**
- * Customized SharedScrolledComposite
- */
-/*package*/ class ScrolledPageContent extends SharedScrolledComposite {
-
-    private FormToolkit fToolkit;
-    
-    /**
-     * @param parent
-     */
-    public ScrolledPageContent(Composite parent) {
-        this(parent, SWT.V_SCROLL | SWT.H_SCROLL);
-    }
-    
-    /**
-     * @param parent
-     * @param style
-     */
-    public ScrolledPageContent(Composite parent, int style) {
-        super(parent, style);
-        
-        setFont(parent.getFont());
-        
-        fToolkit= JavaPlugin.getDefault().getDialogsFormToolkit();
-        
-        setExpandHorizontal(true);
-        setExpandVertical(true);
-        
-        Composite body= new Composite(this, SWT.NONE);
-        body.setFont(parent.getFont());
-        setContent(body);
-    }
-    
-    
-    /**
-     * @param childControl
-     */
-    public void adaptChild(Control childControl) {
-        fToolkit.adapt(childControl, true, true);
-    }
-    
-    /**
-     * @return the content composite
-     */
-    public Composite getBody() {
-        return (Composite) getContent();
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/messages.properties
deleted file mode 100644
index eaeea75..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/messages.properties
+++ /dev/null
@@ -1,64 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-#     John Kaplan, johnkaplantech@gmail.com - 108071 [code templates] template for body of newly created class
-#     Cameron Bateman/Oracle - adapted for use in JSF validation tooling
-###############################################################################
-
-ProblemSeveritiesPreferencePage_title=Problem Severities
-
-ProblemSeveritiesConfigurationBlock_error=Error
-ProblemSeveritiesConfigurationBlock_warning=Warning
-ProblemSeveritiesConfigurationBlock_ignore=Ignore
-
-ProblemSeveritiesConfigurationBlock_section_id_resolution=&Identifier Resolution
-ProblemSeveritiesConfigurationBlock_section_general=&General Problems
-ProblemSeveritiesConfigurationBlock_section_type_coercion_problems=&Type Coercion Problems
-ProblemSeveritiesConfigurationBlock_section_constant_folding_and_unused_code=&Constant folding and unused code
-ProblemSeveritiesConfigurationBlock_section_programming_errors=&Possible programming errors
-
-ProblemSeveritiesConfigurationBlock_needsbuild_title=Error/Warning Settings Changed
-ProblemSeveritiesConfigurationBlock_needsfullbuild_message=The Error/Warning settings have changed. You will need to rebuild or revalidate for these changes to take effect.
-ProblemSeveritiesConfigurationBlock_needsprojectbuild_message=The Error/Warning settings have changed. A rebuild of the project is required for changes to take effect. Build the project now?
-ProblemSeveritiesConfigurationBlock_buildwarning_dont_show_again=Don't show this dialog again
-
-ProblemSeveritiesConfigurationBlock_common_description=Select the severity level for the following problems
-
-ProblemSeveritiesConfigurationBlock_pb_general_syntax_error=General Syntax Error
-ProblemSeveritiesConfigurationBlock_pb_empty_el_expression=Empty EL expression
-ProblemSeveritiesConfigurationBlock_pb_missing_closing_expr_bracket=Missing closing bracket on expression
-ProblemSeveritiesConfigurationBlock_pb_cannot_apply_operator_to_method_binding=Applying operator to method binding
-ProblemSeveritiesConfigurationBlock_pb_dotted_property_key_should_use_array=Dotted property names should use array ([]) syntax
-
-ProblemSeveritiesConfigurationBlock_pb_variable_not_found=Variable not found
-ProblemSeveritiesConfigurationBlock_pb_member_not_found=Member not found
-ProblemSeveritiesConfigurationBlock_pb_member_is_intermediate=Member is intermediate
-
-ProblemSeveritiesConfigurationBlock_pb_binary_op_numeric_coercion_error=Binary operation number coercion problems
-ProblemSeveritiesConfigurationBlock_pb_binary_op_boolean_coercion_error=Binary operation boolean coercion problems
-ProblemSeveritiesConfigurationBlock_pb_binary_op_no_coercion_available=Binary operation no available coercions
-ProblemSeveritiesConfigurationBlock_pb_binary_op_literal_to_number_coercion_error=Binary coercion of literal to number
-ProblemSeveritiesConfigurationBlock_pb_unary_op_numeric_coercion_error=Unary operation number coercion problems
-ProblemSeveritiesConfigurationBlock_pb_unary_op_boolean_coercion_error=Unary operation boolean coercion problems
-ProblemSeveritiesConfigurationBlock_pb_unary_op_string_coercion_not_guaranteed=Unary operation string coercion not guaranteed
-
-ProblemSeveritiesConfigurationBlock_pb_both_binary_operands_null=Both operands null
-ProblemSeveritiesConfigurationBlock_pb_binary_expression_always_evaluates_same=Binary expression always evaluates to same value
-ProblemSeveritiesConfigurationBlock_pb_equality_with_null_always_same=Equality comparison with null always evaluates to same value
-ProblemSeveritiesConfigurationBlock_pb_unary_expression_always_evaluates_same=Unary expression always evaluates to same value
-ProblemSeveritiesConfigurationBlock_pb_empty_expression_always_false=Empty operator always resolves to false on type
-ProblemSeveritiesConfigurationBlock_pb_enumeration_comparision_always_same=Enumeration comparison always evaluates to same value
-ProblemSeveritiesConfigurationBlock_pb_minus_on_null_always_zero=Minus applied to null always evaluates to zero
-ProblemSeveritiesConfigurationBlock_pb_first_argument_short_circuits_expression=First argument short-circuits expression
-ProblemSeveritiesConfigurationBlock_pb_second_argument_always_evaluates_same=Second argument always evaluates the same
-ProblemSeveritiesConfigurationBlock_pb_apply_dot_operator_with_null=Applying the dot ('.') operator with null always returns null
-
-ProblemSeveritiesConfigurationBlock_pb_possible_division_by_zero=Possible division by zero
-ProblemSeveritiesConfigurationBlock_pb_possible_array_index_out_of_bounds=Possible array index out of bounds
-ProblemSeveritiesConfigurationBlock_pb_incompatible_enumeration_comparison=Incompatible enumeration comparison
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 ff85cd0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,77 +0,0 @@
-#Tue Apr 10 10:08:32 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.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/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index e70dc37..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,40 +0,0 @@
-Manifest-Version: 1.0
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.jst.pagedesigner.jsf.ui;singleton:=true
-Bundle-Version: 1.0.1.qualifier
-Bundle-Activator: org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.jst.jsf.facesconfig;bundle-version="[1.0.0,1.1.0)",
- org.eclipse.jst.pagedesigner;bundle-version="[1.0.0,1.1.0)",
- org.eclipse.jst.pagedesigner.jsp.core;bundle-version="[1.0.0,1.1.0)",
- org.eclipse.wst.common.modulecore;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.common.ui.properties;bundle-version="[1.0.101,1.2.0)",
- org.eclipse.jst.jsf.common.ui;bundle-version="[1.0.0,1.1.0)",
- org.eclipse.jst.jsf.core;bundle-version="[1.0.0,1.1.0)",
- org.eclipse.jst.jsf.common;bundle-version="[1.0.0,1.1.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)"
-Eclipse-LazyStart: true
-Bundle-ManifestVersion: 2
-Export-Package: org.eclipse.jst.pagedesigner.jsf.core.dom;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.actions;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.attributegroup;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.celleditors;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfcore;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfcore;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfhtml;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.elementedit.util;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.sections;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.util;x-internal:=true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/about.html b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/about.html
deleted file mode 100644
index 72f94ad..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 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>
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 de92133..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/build.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
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = plugin.xml,\
-               META-INF/,\
-               .,\
-               configs/,\
-               icons/,\
-               plugin.properties,\
-               metadata/,\
-               about.html
-jars.compile.order = .
-javacSource=1.5
-javacTarget=1.5
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/configs/cm/jsfcore.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/configs/cm/jsfcore.properties
deleted file mode 100644
index 25183a0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/configs/cm/jsfcore.properties
+++ /dev/null
@@ -1,35 +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
-###############################################################################
-Attribute.Label.basename=Basename
-Attribute.Label.binding=Binding
-Attribute.Label.converterId=Converter ID
-Attribute.Label.dateStyle=Date Style
-Attribute.Label.escape=Escape
-Attribute.Label.currencyCode=Currency Code
-Attribute.Label.groupingUsed=Grouping Used
-Attribute.Label.id=ID
-Attribute.Label.integerOnly=Integer Only
-Attribute.Label.itemDisabled=Item Disabled
-Attribute.Label.locale=Locale
-Attribute.Label.maximum=Maximum
-Attribute.Label.minimum=Minimum
-Attribute.Label.name=Name
-Attribute.Label.pattern=Pattern
-Attribute.Label.rendered=Rendered
-Attribute.Label.timeStyle=Time Style
-Attribute.Label.timeZone=Time Zone
-Attribute.Label.type=Type
-Attribute.Label.validatorId=Validator ID
-Attribute.Label.value=Value
-Attribute.Label.var=Var
-Category.Label.Constraint=Constraint
-Category.Label.General=General
-Category.Label.Other=Other
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/configs/cm/jsfcore.xml b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/configs/cm/jsfcore.xml
deleted file mode 100644
index d5f3094..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/configs/cm/jsfcore.xml
+++ /dev/null
@@ -1,227 +0,0 @@
-<?xml version="1.0" ?>
-<taglib uri="http://java.sun.com/jsf/core">
-	<tag name="actionListener">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="type" type="CLASSNAME" required="required"
-				typeparam="superType=I:javax.faces.event.ActionListener" 
-				displaylabel="%Attribute.Label.type" />
-		</category>
-	</tag>
-	<tag name="attribute">
-		<category name="General" 
-			displaylabel="%Category.Label.General">
-			<attribute name="name" displaylabel="%Attribute.Label.name" required="required"/>
-			<attribute name="value" required="required"
-				displaylabel="%Attribute.Label.value" />
-		</category>
-	</tag>
-	<tag name="convertDateTime">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="dateStyle" type="ENUMERATED"
-				displaylabel="%Attribute.Label.dateStyle">
-				<option key="short" value="short" />
-				<option key="medium" value="medium" />
-				<option key="long" value="long" />
-				<option key="full" value="full" />
-				<option key="default" value="default" default="default"/>
-			</attribute>
-			<attribute name="locale" type="LOCALE"
-				displaylabel="%Attribute.Label.locale" />
-			<attribute name="pattern" type="ENUMERATED"
-				displaylabel="%Attribute.Label.pattern">
-				<option key="M/d/yy" value="M/d/yy" />
-				<option key="EEE, M/d/yy" value="EEE, M/d/yy" />
-				<option key="MM/dd/yyyy" value="MM/dd/yyyy" />
-				<option key="EEE, MM/dd/yyyy" value="EEE, MM/dd/yyyy" />
-				<option key="MMM d, yyyy" value="MMM d, yyyy" />
-				<option key="EEE, MMM d, yyyy" value="EEE, MMM d, yyyy" />
-				<option key="MMMM d, yyyy" value="MMMM d, yyyy" />
-				<option key="EEEE, MMMM d, yyyy"
-					value="EEEE, MMMM d, yyyy" />
-				<option key="MMMM yyyy" value="MMMM yyyy" />
-				<option key="hh:mm" value="hh:mm" />
-				<option key="hh:mm z" value="hh:mm z" />
-				<option key="HH:mm z" value="HH:mm z" />
-				<option key="HH:mm:ss z" value="HH:mm:ss z" />
-				<option key="M/d/yy hh:mm" value="M/d/yy hh:mm" />
-				<option key="EEE, M/d/yy hh:mm"
-					value="EEE, M/d/yy hh:mm" />
-				<option key="MM/dd/yyyy HH:mm:ss z"
-					value="MM/dd/yyyy HH:mm:ss z" />
-				<option key="EEE, MM/dd/yyyy HH:mm:ss z"
-					value="EEE, MM/dd/yyyy HH:mm:ss z" />
-				<option key="MMM d, yyyy HH:mm z"
-					value="MMM d, yyyy HH:mm z" />
-				<option key="EEE, MMM d, yyyy HH:mm z"
-					value="EEE, MMM d, yyyy HH:mm z" />
-				<option key="MMMM d, yyyy HH:mm z"
-					value="MMMM d, yyyy HH:mm z" />
-				<option key="EEEE, MMMM d, yyyy HH:mm z"
-					value="EEEE, MMMM d, yyyy HH:mm z" />
-			</attribute>
-			<attribute name="timeStyle" type="ENUMERATED"
-				displaylabel="%Attribute.Label.timeStyle">
-				<option key="short" value="short" />
-				<option key="medium" value="medium" />
-				<option key="long" value="long" />
-				<option key="full" value="full" />
-				<option key="default" value="default" default="default"/>
-			</attribute>
-			<attribute name="timeZone" type="TIMEZONE"
-				displaylabel="%Attribute.Label.timeZone" />
-			<attribute name="type" type="ENUMERATED"
-				displaylabel="%Attribute.Label.type">
-				<option key="date" value="date" default="default"/>
-				<option key="time" value="time" />
-				<option key="both" value="both" />
-			</attribute>
-		</category>
-	</tag>
-	<tag name="converter">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="converterId" required="required"
-				displaylabel="%Attribute.Label.converterId" type="converterId"/>
-		</category>
-	</tag>
-	<tag name="convertNumber">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="locale" type="LOCALE"
-				displaylabel="%Attribute.Label.locale" />
-			<attribute name="type" displaylabel="%Attribute.Label.type"
-				type="ENUMERATED">
-				<option key="number" value="number" default="default"/>
-				<option key="currency" value="currency" />
-				<option key="percentage" value="percentage" />
-			</attribute>
-		</category>
-		<category name="Other" displaylabel="%Category.Label.Other">
-			<attribute name="currencyCode"
-				displaylabel="%Attribute.Label.currencyCode" type="CURRENCYCODE" />
-			<attribute name="groupingUsed"
-				displaylabel="%Attribute.Label.groupingUsed" type="BOOLEAN" />
-			<attribute name="integerOnly"
-				displaylabel="%Attribute.Label.integerOnly" type="BOOLEAN" />
-			<attribute name="pattern"
-				displaylabel="%Attribute.Label.pattern" type="ENUMERATED">
-				<option key="0" value="0" />
-				<option key="0.00" value="0.00" />
-				<option key="#,##0" value="#,##0" />
-				<option key="#,##0.00" value="#,##0.00" />
-				<option key="#,##0;(#,##0)" value="#,##0;(#,##0)" />
-				<option key="#,##0.00;(#,##0.00)"
-					value="#,##0.00;(#,##0.00)" />
-				<option key="0.##E0" value="0.##E0" />
-				<option key="0%" value="0%" />
-				<option key="0.00%" value="0.00%" />
-			</attribute>
-		</category>
-	</tag>
-	<tag name="facet">
-		<category name="General" 
-			displaylabel="%Category.Label.General">
-			<attribute name="name" displaylabel="%Attribute.Label.name" required="required"/>
-		</category>
-	</tag>
-	<tag name="loadBundle">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="basename" type="CLASSPATH_RESOURCE" required="required"
-				displaylabel="%Attribute.Label.basename" />
-			<attribute name="var" displaylabel="%Attribute.Label.var" required="required"/>
-		</category>
-	</tag>
-	<tag name="param">
-		<referedcategory ref="General">
-			<includeattrs>
-				<attribute name="name"
-					displaylabel="%Attribute.Label.name" />
-				<attribute name="value"
-					displaylabel="%Attribute.Label.value" required="required"/>
-			</includeattrs>
-		</referedcategory>
-	</tag>
-	<tag name="selectItem">
-		<referedcategory ref="General" />
-		<category name="Other" displaylabel="%Category.Label.Other">
-			<attribute name="itemDisabled"
-				displaylabel="%Attribute.Label.itemDisabled" type="BOOLEAN" typeparam="default=false" />
-		</category>
-	</tag>
-	<tag name="selectItems">
-		<referedcategory ref="General" />
-	</tag>
-	<tag name="subview">
-		<referedcategory ref="General">
-			<includeattrs>
-				<attribute name="id" displaylabel="%Attribute.Label.id" required="required"/>
-			</includeattrs>
-			<excludeattrs refs="value" />
-
-		</referedcategory>
-		<category name="Other" displaylabel="%Category.Label.Other">
-			<attribute name="rendered" type="BOOLEAN"
-				displaylabel="%Attribute.Label.rendered" />
-		</category>
-	</tag>
-	<tag name="validateDoubleRange">
-		<referedcategory ref="Constraint" />
-	</tag>
-	<tag name="validateLength">
-		<referedcategory ref="Constraint" />
-	</tag>
-	<tag name="validateLongRange">
-		<referedcategory ref="Constraint" />
-	</tag>
-	<tag name="validator">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="validatorId"
-				displaylabel="%Attribute.Label.validatorId" type="validatorId" required="required"/>
-		</category>
-	</tag>
-	<tag name="valueChangeListener">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="type" type="CLASSNAME" required="required"
-				typeparam="superType=I:javax.faces.event.ValueChangeListener"
-				displaylabel="%Attribute.Label.type" />
-		</category>
-	</tag>
-	<tag name="verbatim">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="escape" type="BOOLEAN" typeparam="default=false"
-				displaylabel="%Attribute.Label.escape" />
-		</category>
-	</tag>
-	<tag name="view">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="locale" type="LOCALE"
-				displaylabel="%Attribute.Label.locale" />
-		</category>
-	</tag>
-	<definition>
-		<categories>
-			<category name="General"
-				displaylabel="%Category.Label.General">
-				<attribute name="id" displaylabel="%Attribute.Label.id" />
-				<attribute name="value"
-					displaylabel="%Attribute.Label.value" />
-				<attribute name="binding" type="PROPERTYBINDING"
-					displaylabel="%Attribute.Label.binding" />
-			</category>
-			<category name="Constraint"
-				displaylabel="%Category.Label.Constraint">
-				<attribute name="minimum"
-					displaylabel="%Attribute.Label.minimum" />
-				<attribute name="maximum"
-					displaylabel="%Attribute.Label.maximum" />
-			</category>
-		</categories>
-	</definition>
-</taglib>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/configs/cm/jsfhtml.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/configs/cm/jsfhtml.properties
deleted file mode 100644
index 9b68fcd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/configs/cm/jsfhtml.properties
+++ /dev/null
@@ -1,112 +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
-###############################################################################
-Attribute.Label.accept=Accept
-Attribute.Label.acceptcharset=Accept Charset
-Attribute.Label.accesskey=Access Key
-Attribute.Label.action=Action
-Attribute.Label.actionListener=ActionListener
-Attribute.Label.alt=Alt
-Attribute.Label.bgcolor=BG Color
-Attribute.Label.binding=Binding
-Attribute.Label.border=Border
-Attribute.Label.cellpadding=Cell Padding
-Attribute.Label.cellspacing=Cell Spacing
-Attribute.Label.charset=Charset
-Attribute.Label.cols=Cols
-Attribute.Label.columnClasses=Column Classes
-Attribute.Label.columns=Columns
-Attribute.Label.converter=Converter
-Attribute.Label.coords=Coords
-Attribute.Label.dir=Dir
-Attribute.Label.disabled=Disabled
-Attribute.Label.disabledClass=Disabled Class
-Attribute.Label.enabledClass=Enabled Class
-Attribute.Label.enctype=Enctype
-Attribute.Label.errorClass=Error Class
-Attribute.Label.errorStyle=Error Style
-Attribute.Label.escape=Escape
-Attribute.Label.fatalClass=Fatal Class
-Attribute.Label.fatalStyle=Fatal Style
-Attribute.Label.first=First
-Attribute.Label.footerClass=Footer Class
-Attribute.Label.for=For
-Attribute.Label.frame=Frame
-Attribute.Label.globalOnly=Global Only
-Attribute.Label.headerClass=Header Class
-Attribute.Label.height=Height
-Attribute.Label.hreflang=Hreflang
-Attribute.Label.id=ID
-Attribute.Label.image=Image
-Attribute.Label.immediate=Immediate
-Attribute.Label.infoClass=Info Class
-Attribute.Label.infoStyle=Info Style
-Attribute.Label.ismap=Ismap
-Attribute.Label.lang=Lang
-Attribute.Label.layout=Layout
-Attribute.Label.link=Link
-Attribute.Label.longdesc=Longdesc
-Attribute.Label.maxlength=Max Length
-Attribute.Label.onblur=Onblur
-Attribute.Label.onchange=Onchange
-Attribute.Label.onclick=Onclick
-Attribute.Label.ondblclick=Ondblclick
-Attribute.Label.onfocus=Onfocus
-Attribute.Label.onkeydown=Onkeydown
-Attribute.Label.onkeypress=Onkeypress
-Attribute.Label.onkeyup=Onkeyup
-Attribute.Label.onmousedown=Onmousedown
-Attribute.Label.onmousemove=Onmousemove
-Attribute.Label.onmouseout=Onmouseout
-Attribute.Label.onmouseover=Onmouseover
-Attribute.Label.onmouseup=Onmouseup
-Attribute.Label.onreset=Onreset
-Attribute.Label.onselect=Onselect
-Attribute.Label.onsubmit=Onsubmit
-Attribute.Label.readonly=Read Only
-Attribute.Label.redisplay=Redisplay
-Attribute.Label.rel=Rel
-Attribute.Label.rendered=Rendered
-Attribute.Label.required=Required
-Attribute.Label.rev=Rev
-Attribute.Label.rowClasses=Row Classes
-Attribute.Label.rows=Rows
-Attribute.Label.rules=Rules
-Attribute.Label.shape=Shape
-Attribute.Label.showDetail=Show Detail
-Attribute.Label.showSummary=Show Summary
-Attribute.Label.size=Size
-Attribute.Label.style=Style
-Attribute.Label.styleClass=Style Class
-Attribute.Label.summary=Summary
-Attribute.Label.tabindex=Tab Index
-Attribute.Label.target=Target
-Attribute.Label.title=Title
-Attribute.Label.tooltip=Tooltip
-Attribute.Label.type=Type
-Attribute.Label.url=URL
-Attribute.Label.usemap=Usemap
-Attribute.Label.validator=Validator
-Attribute.Label.value=Value
-Attribute.Label.valueChangeListener=ValueChangeListener
-Attribute.Label.var=Var
-Attribute.Label.warnClass=Warn Class
-Attribute.Label.warnStyle=Warn Style
-Attribute.Label.width=Width
-Category.Label.CSS=CSS
-Category.Label.CSS2=CSS2
-Category.Label.CSS3=CSS3
-Category.Label.CSS4=CSS4
-Category.Label.Event=Event
-Category.Label.HTML=HTML
-Category.Label.JSF=JSF
-Category.Label.Language=Language
-Category.Label.Link=Link
-Category.Label.Table=Table
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/configs/cm/jsfhtml.xml b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/configs/cm/jsfhtml.xml
deleted file mode 100644
index 6ccfbcf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/configs/cm/jsfhtml.xml
+++ /dev/null
@@ -1,713 +0,0 @@
-<?xml version="1.0" ?>
-<taglib uri="http://java.sun.com/jsf/html">
-	<tag name="column">
-		<category name="JSF" displaylabel="%Category.Label.JSF">
-			<attribute name="id" displaylabel="%Attribute.Label.id" />
-			<attribute name="binding" type="PROPERTYBINDING"
-				displaylabel="%Attribute.Label.binding" />
-			<attribute name="rendered" type="BOOLEAN"
-				displaylabel="%Attribute.Label.rendered" />
-		</category>
-	</tag>
-	<tag name="commandButton">
-		<referedcategory ref="JSF">
-			<includeattrs>
-				<attribute name="action"
-					displaylabel="%Attribute.Label.action" description="action"/>
-				<attribute name="actionListener" type="METHODBINDING"
-					displaylabel="%Attribute.Label.actionListener" />
-			</includeattrs>
-			<excludeattrs
-				refs="converter,validator,valueChangeListener,required" />
-		</referedcategory>
-		<referedcategory ref="Language" />
-		<referedcategory ref="CSS" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="HTML">
-			<includeattrs>
-				<attribute name="type" type="ENUMERATED"
-					displaylabel="%Attribute.Label.type">
-					<option key="submit" value="submit" default="default"/>
-					<option key="reset" value="reset" />
-				</attribute>
-				<attribute name="image" type="RELATIVEPATH"
-					typeparam="suffix=jpg;gif;png"
-					displaylabel="%Attribute.Label.image" />
-				<attribute name="alt"
-					displaylabel="%Attribute.Label.alt" />
-			</includeattrs>
-		</referedcategory>
-	</tag>
-	<tag name="commandLink">
-		<referedcategory ref="JSF">
-			<includeattrs>
-				<attribute name="action"
-					displaylabel="%Attribute.Label.action" />
-				<attribute name="actionListener" type="METHODBINDING"
-					displaylabel="%Attribute.Label.actionListener" />
-			</includeattrs>
-			<excludeattrs
-				refs="converter,validator,valueChangeListener,required" />
-		</referedcategory>
-		<referedcategory ref="Language" />
-		<referedcategory ref="CSS" />
-		<referedcategory ref="Event">
-			<excludeattrs refs="onchange,onclick,onselect" />
-		</referedcategory>
-		<referedcategory ref="Link" displaylabel="%Category.Label.HTML" />
-	</tag>
-	<tag name="dataTable">
-		<category name="JSF" displaylabel="%Category.Label.JSF">
-			<attribute name="id" displaylabel="%Attribute.Label.id" />
-			<attribute name="value"
-				displaylabel="%Attribute.Label.value" />
-			<attribute name="binding" type="PROPERTYBINDING"
-				displaylabel="%Attribute.Label.binding" />
-			<attribute name="var" displaylabel="%Attribute.Label.var" />
-			<attribute name="rendered" type="BOOLEAN"
-				displaylabel="%Attribute.Label.rendered" />
-			<attribute name="rows" displaylabel="%Attribute.Label.rows" />
-			<attribute name="first"
-				displaylabel="%Attribute.Label.first" />
-		</category>
-		<referedcategory ref="Language" />
-		<referedcategory ref="CSS3" displaylabel="%Category.Label.CSS" />
-		<referedcategory ref="Event">
-			<excludeattrs refs="onblur,onchange,onfocus,onselect" />
-		</referedcategory>
-		<referedcategory ref="Table"
-			displaylabel="%Category.Label.HTML" />
-	</tag>
-	<tag name="form">
-		<category name="JSF" displaylabel="%Category.Label.JSF">
-			<attribute name="id" displaylabel="%Attribute.Label.id" />
-			<attribute name="binding" type="PROPERTYBINDING"
-				displaylabel="%Attribute.Label.binding" />
-			<attribute name="rendered" type="BOOLEAN"
-				displaylabel="%Attribute.Label.rendered" />
-		</category>
-		<referedcategory ref="Language" />
-		<referedcategory ref="CSS" />
-		<referedcategory ref="Event">
-			<includeattrs>
-				<attribute name="onreset"
-					displaylabel="%Attribute.Label.onreset" />
-				<attribute name="onsubmit"
-					displaylabel="%Attribute.Label.onsubmit" />
-			</includeattrs>
-			<excludeattrs refs="onblur,onchange,onfocus,onselect" />
-		</referedcategory>
-		<category name="HTML" displaylabel="%Category.Label.HTML">
-			<attribute name="target" type="ENUMERATED"
-				displaylabel="%Attribute.Label.target">
-				<option key="_self" value="_self" />
-				<option key="_blank" value="_blank" />
-				<option key="_parent" value="_parent" />
-				<option key="_top" value="_top" />
-			</attribute>
-			<attribute name="accept"
-				displaylabel="%Attribute.Label.accept" />
-			<attribute name="acceptcharset"
-				displaylabel="%Attribute.Label.acceptcharset" />
-			<attribute name="enctype"
-				displaylabel="%Attribute.Label.enctype" type="ENUMERATED">
-				<option key="application/x-www-form-urlencoded"
-					value="application/x-www-form-urlencoded" default="default"/>
-			</attribute>
-			<attribute name="title"
-				displaylabel="%Attribute.Label.title" />
-		</category>
-	</tag>
-	<tag name="graphicImage">
-		<category name="JSF" displaylabel="%Category.Label.JSF">
-			<attribute name="value" type="WEBPATH"
-				typeparam="suffix=jpg;gif;png"
-				displaylabel="%Attribute.Label.value" />
-			<attribute name="url" type="WEBPATH"
-				typeparam="suffix=jpg;gif;png" displaylabel="%Attribute.Label.url" />
-			<attribute name="binding" type="PROPERTYBINDING"
-				displaylabel="%Attribute.Label.binding" />
-			<attribute name="id" displaylabel="%Attribute.Label.id" />
-			<attribute name="rendered" type="BOOLEAN"
-				displaylabel="%Attribute.Label.rendered" />
-		</category>
-		<referedcategory ref="Language" />
-		<referedcategory ref="CSS" />
-		<referedcategory ref="Event">
-			<excludeattrs refs="onblur,onchange,onfocus,onselect" />
-		</referedcategory>
-		<category name="HTML" displaylabel="%Category.Label.HTML">
-			<attribute name="ismap" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.ismap" />
-			<attribute name="longdesc" type="RELATIVEPATH"
-				displaylabel="%Attribute.Label.longdesc" />
-			<attribute name="alt" displaylabel="%Attribute.Label.alt" />
-			<attribute name="height"
-				displaylabel="%Attribute.Label.height" />
-			<attribute name="title"
-				displaylabel="%Attribute.Label.title" />
-			<attribute name="usemap"
-				displaylabel="%Attribute.Label.usemap" />
-			<attribute name="width"
-				displaylabel="%Attribute.Label.width" />
-		</category>
-	</tag>
-	<tag name="inputHidden">
-		<referedcategory ref="JSF" />
-	</tag>
-	<tag name="inputSecret">
-		<referedcategory ref="JSF" />
-		<referedcategory ref="Language" />
-		<referedcategory ref="CSS" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="HTML">
-			<includeattrs>
-				<attribute name="maxlength"
-					displaylabel="%Attribute.Label.maxlength" />
-				<attribute name="redisplay" type="BOOLEAN"
-					displaylabel="%Attribute.Label.redisplay" />
-				<attribute name="alt"
-					displaylabel="%Attribute.Label.alt" />
-				<attribute name="size"
-					displaylabel="%Attribute.Label.size" />
-			</includeattrs>
-		</referedcategory>
-	</tag>
-	<tag name="inputText">
-		<referedcategory ref="JSF" />
-		<referedcategory ref="Language" />
-		<referedcategory ref="CSS" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="HTML">
-			<includeattrs>
-				<attribute name="maxlength"
-					displaylabel="%Attribute.Label.maxlength" />
-				<attribute name="alt"
-					displaylabel="%Attribute.Label.alt" />
-				<attribute name="size"
-					displaylabel="%Attribute.Label.size" />
-			</includeattrs>
-		</referedcategory>
-	</tag>
-	<tag name="inputTextarea">
-		<referedcategory ref="JSF" />
-		<referedcategory ref="Language" />
-		<referedcategory ref="CSS" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="HTML">
-			<includeattrs>
-				<attribute name="cols"
-					displaylabel="%Attribute.Label.cols" />
-				<attribute name="rows"
-					displaylabel="%Attribute.Label.rows" />
-			</includeattrs>
-		</referedcategory>
-	</tag>
-	<tag name="message">
-		<category name="JSF" displaylabel="%Category.Label.JSF">
-			<attribute name="id" displaylabel="%Attribute.Label.id" />
-			<attribute name="binding" type="PROPERTYBINDING"
-				displaylabel="%Attribute.Label.binding" />
-			<attribute name="for" displaylabel="%Attribute.Label.for" required="required"/>
-			<attribute name="rendered" type="BOOLEAN"
-				displaylabel="%Attribute.Label.rendered" />
-			<attribute name="showDetail" type="BOOLEAN"
-				typeparam="default=true" displaylabel="%Attribute.Label.showDetail" />
-			<attribute name="showSummary" type="BOOLEAN"
-				typeparam="default=false"
-				displaylabel="%Attribute.Label.showSummary" />
-		</category>
-		<referedcategory ref="CSS2" displaylabel="%Category.Label.CSS" />
-		<category name="HTML" displaylabel="%Category.Label.HTML">
-			<attribute name="tooltip" type="BOOLEAN"
-				displaylabel="%Attribute.Label.tooltip" />
-			<attribute name="title"
-				displaylabel="%Attribute.Label.title" />
-		</category>
-	</tag>
-	<tag name="messages">
-		<category name="JSF" displaylabel="%Category.Label.JSF">
-			<attribute name="id" displaylabel="%Attribute.Label.id" />
-			<attribute name="binding" type="PROPERTYBINDING"
-				displaylabel="%Attribute.Label.binding" />
-			<attribute name="globalOnly" type="BOOLEAN"
-				typeparam="default=false"
-				displaylabel="%Attribute.Label.globalOnly" />
-			<attribute name="rendered" type="BOOLEAN"
-				displaylabel="%Attribute.Label.rendered" />
-			<attribute name="showDetail" type="BOOLEAN"
-				typeparam="default=false"
-				displaylabel="%Attribute.Label.showDetail" />
-			<attribute name="showSummary" type="BOOLEAN"
-				typeparam="default=true"
-				displaylabel="%Attribute.Label.showSummary" />
-		</category>
-		<referedcategory ref="CSS2" displaylabel="%Category.Label.CSS" />
-		<category name="HTML" displaylabel="%Category.Label.HTML">
-			<attribute name="layout" type="ENUMERATED"
-				displaylabel="%Attribute.Label.layout">
-				<option key="list" value="list" default="default"/>
-				<option key="table" value="table" />
-			</attribute>
-			<attribute name="tooltip" type="BOOLEAN"
-				displaylabel="%Attribute.Label.tooltip" />
-			<attribute name="title"
-				displaylabel="%Attribute.Label.title" />
-		</category>
-	</tag>
-	<tag name="outputFormat">
-		<referedcategory ref="JSF">
-			<excludeattrs
-				refs="validator,valueChangeListener,immediate,required" />
-		</referedcategory>
-		<referedcategory ref="CSS" />
-		<category name="HTML" displaylabel="%Category.Label.HTML">
-			<attribute name="escape" type="BOOLEAN"
-				typeparam="default=true" displaylabel="%Attribute.Label.escape" />
-			<attribute name="title"
-				displaylabel="%Attribute.Label.title" />
-		</category>
-	</tag>
-	<tag name="outputLabel">
-		<referedcategory ref="JSF">
-			<excludeattrs
-				refs="validator,valueChangeListener,immediate,required" />
-		</referedcategory>
-		<referedcategory ref="Language" />
-		<referedcategory ref="CSS" />
-		<referedcategory ref="Event">
-			<excludeattrs refs="onchange,onselect" />
-		</referedcategory>
-		<referedcategory ref="HTML">
-			<includeattrs>
-				<attribute name="for"
-					displaylabel="%Attribute.Label.for" />
-			</includeattrs>
-			<excludeattrs refs="disabled,readonly" />
-		</referedcategory>
-	</tag>
-	<tag name="outputLink">
-		<referedcategory ref="JSF">
-			<includeattrs>
-				<attribute name="value" type="RELATIVEPATH"
-					displaylabel="%Attribute.Label.value" />
-			</includeattrs>
-			<excludeattrs
-				refs="validator,valueChangeListener,immediate,required" />
-		</referedcategory>
-		<referedcategory ref="Language" />
-		<referedcategory ref="CSS" />
-		<referedcategory ref="Event">
-			<excludeattrs refs="onchange,onselect" />
-		</referedcategory>
-		<referedcategory ref="Link" displaylabel="%Category.Label.HTML" />
-	</tag>
-	<tag name="outputText">
-		<referedcategory ref="JSF">
-			<excludeattrs
-				refs="validator,valueChangeListener,immediate,required" />
-		</referedcategory>
-		<referedcategory ref="CSS" />
-		<category name="HTML" displaylabel="%Category.Label.HTML">
-			<attribute name="escape" type="BOOLEAN"
-				typeparam="default=true" displaylabel="%Attribute.Label.escape" />
-			<attribute name="title"
-				displaylabel="%Attribute.Label.title" />
-		</category>
-	</tag>
-	<tag name="panelGrid">
-		<category name="JSF" displaylabel="%Category.Label.JSF">
-			<attribute name="id" displaylabel="%Attribute.Label.id" />
-			<attribute name="binding" type="PROPERTYBINDING"
-				displaylabel="%Attribute.Label.binding" />
-			<attribute name="rendered" type="BOOLEAN"
-				displaylabel="%Attribute.Label.rendered" />
-		</category>
-		<referedcategory ref="Language" />
-		<referedcategory ref="CSS3" displaylabel="%Category.Label.CSS" />
-		<referedcategory ref="Event">
-			<excludeattrs refs="onblur,onchange,onfocus,onselect" />
-		</referedcategory>
-		<referedcategory ref="Table"
-			displaylabel="%Category.Label.HTML">
-			<includeattrs>
-				<attribute name="columns"
-					displaylabel="%Attribute.Label.columns" />
-			</includeattrs>
-		</referedcategory>
-	</tag>
-	<tag name="panelGroup">
-		<category name="JSF" displaylabel="%Category.Label.JSF">
-			<attribute name="id" displaylabel="%Attribute.Label.id" />
-			<attribute name="binding" type="PROPERTYBINDING"
-				displaylabel="%Attribute.Label.binding" />
-			<attribute name="rendered" type="BOOLEAN"
-				displaylabel="%Attribute.Label.rendered" />
-		</category>
-		<referedcategory ref="CSS" />
-	</tag>
-	<tag name="selectBooleanCheckbox">
-		<referedcategory ref="JSF" />
-		<referedcategory ref="Language" />
-		<referedcategory ref="CSS" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="HTML" />
-	</tag>
-	<tag name="selectManyCheckbox">
-		<referedcategory ref="JSF" />
-		<referedcategory ref="Language" />
-		<referedcategory ref="CSS4" displaylabel="%Category.Label.CSS" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="HTML">
-			<includeattrs>
-				<attribute name="layout" type="ENUMERATED"
-					displaylabel="%Attribute.Label.layout">
-					<option key="lineDirection" value="lineDirection" default="default" />
-					<option key="pageDirection" value="pageDirection" />
-				</attribute>
-				<attribute name="border"
-					displaylabel="%Attribute.Label.border" />
-			</includeattrs>
-		</referedcategory>
-	</tag>
-	<tag name="selectManyListbox">
-		<referedcategory ref="JSF" />
-		<referedcategory ref="Language" />
-		<referedcategory ref="CSS4" displaylabel="%Category.Label.CSS" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="HTML">
-			<includeattrs>
-				<attribute name="size"
-					displaylabel="%Attribute.Label.size" />
-			</includeattrs>
-		</referedcategory>
-	</tag>
-	<tag name="selectManyMenu">
-		<referedcategory ref="JSF" />
-		<referedcategory ref="Language" />
-		<referedcategory ref="CSS4" displaylabel="%Category.Label.CSS" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="HTML" />
-	</tag>
-	<tag name="selectOneListbox">
-		<referedcategory ref="JSF" />
-		<referedcategory ref="Language" />
-		<referedcategory ref="CSS4" displaylabel="%Category.Label.CSS" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="HTML">
-			<includeattrs>
-				<attribute name="size"
-					displaylabel="%Attribute.Label.size" />
-			</includeattrs>
-		</referedcategory>
-	</tag>
-	<tag name="selectOneMenu">
-		<referedcategory ref="JSF" />
-		<referedcategory ref="Language" />
-		<referedcategory ref="CSS4" displaylabel="%Category.Label.CSS" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="HTML" />
-	</tag>
-	<tag name="selectOneRadio">
-		<referedcategory ref="JSF" />
-		<referedcategory ref="Language" />
-		<referedcategory ref="CSS4" displaylabel="%Category.Label.CSS" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="HTML">
-			<includeattrs>
-				<attribute name="layout" type="ENUMERATED"
-					displaylabel="%Attribute.Label.layout">
-					<option key="lineDirection" value="lineDirection" default="default" />
-					<option key="pageDirection" value="pageDirection" />
-				</attribute>
-				<attribute name="border"
-					displaylabel="%Attribute.Label.border" />
-			</includeattrs>
-		</referedcategory>
-	</tag>
-	<definition>
-		<categories>
-			<category name="JSF" displaylabel="%Category.Label.JSF">
-				<attribute name="id" displaylabel="%Attribute.Label.id" />
-				<attribute name="value"
-					displaylabel="%Attribute.Label.value" />
-				<attribute name="binding" type="PROPERTYBINDING"
-					displaylabel="%Attribute.Label.binding" />
-				<attribute name="converter"
-					displaylabel="%Attribute.Label.converter" />
-				<attribute name="validator" type="METHODBINDING"
-					displaylabel="%Attribute.Label.validator" />
-				<attribute name="valueChangeListener"
-					type="METHODBINDING"
-					displaylabel="%Attribute.Label.valueChangeListener" />
-				<attribute name="immediate" type="BOOLEAN"
-					displaylabel="%Attribute.Label.immediate" />
-				<attribute name="rendered" type="BOOLEAN"
-					displaylabel="%Attribute.Label.rendered" />
-				<attribute name="required" type="BOOLEAN"
-					displaylabel="%Attribute.Label.required" />
-			</category>
-			<category name="Language"
-				displaylabel="%Category.Label.Language">
-				<referedattribute ref="lang" />
-				<attribute name="dir" type="ENUMERATED"
-					displaylabel="%Attribute.Label.dir">
-					<option key="RTL" value="RTL" />
-					<option key="LTR" value="LTR" />
-				</attribute>
-			</category>
-			<category name="CSS" displaylabel="%Category.Label.CSS">
-				<attribute name="style" type="CSSSTYLE"
-					typeparam="style=STYLE" displaylabel="%Attribute.Label.style" />
-				<attribute name="styleClass" type="CSSCLASS"
-					typeparam=" " displaylabel="%Attribute.Label.styleClass" />
-			</category>
-			<category name="Event"
-				displaylabel="%Category.Label.Event">
-				<attribute name="onblur" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.onblur" />
-				<attribute name="onchange" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.onchange" />
-				<attribute name="onclick" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.onclick" />
-				<attribute name="ondblclick" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.ondblclick" />
-				<attribute name="onfocus" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.onfocus" />
-				<attribute name="onkeydown" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.onkeydown" />
-				<attribute name="onkeypress" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.onkeypress" />
-				<attribute name="onkeyup" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.onkeyup" />
-				<attribute name="onmousedown" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.onmousedown" />
-				<attribute name="onmousemove" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.onmousemove" />
-				<attribute name="onmouseout" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.onmouseout" />
-				<attribute name="onmouseover" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.onmouseover" />
-				<attribute name="onmouseup" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.onmouseup" />
-				<attribute name="onselect" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.onselect" />
-			</category>
-			<category name="HTML" displaylabel="%Category.Label.HTML">
-				<attribute name="accesskey"
-					displaylabel="%Attribute.Label.accesskey" />
-				<attribute name="disabled" type="BOOLEAN"
-					displaylabel="%Attribute.Label.disabled" />
-				<attribute name="readonly" type="BOOLEAN"
-					displaylabel="%Attribute.Label.readonly" />
-				<attribute name="title"
-					displaylabel="%Attribute.Label.title" />
-				<attribute name="tabindex"
-					displaylabel="%Attribute.Label.tabindex" />
-			</category>
-			<category name="Link" displaylabel="%Category.Label.Link">
-				<attribute name="accesskey"
-					displaylabel="%Attribute.Label.accesskey" />
-				<attribute name="title"
-					displaylabel="%Attribute.Label.title" />
-				<attribute name="tabindex"
-					displaylabel="%Attribute.Label.tabindex" />
-				<attribute name="charset"
-					displaylabel="%Attribute.Label.charset" />
-				<referedattribute ref="lang" overridename="hreflang"
-					displaylabel="%Attribute.Label.hreflang" />
-				<referedattribute ref="link" overridename="rel"
-					displaylabel="%Attribute.Label.rel" />
-				<attribute name="shape" type="ENUMERATED"
-					displaylabel="%Attribute.Label.shape">
-					<option key="default"
-						value="Entire region" default="default"/>
-					<option key="circle" value="Circular region" />
-					<option key="rect" value="Rectangular region" />
-					<option key="poly" value="Polygonal region" />
-				</attribute>
-				<attribute name="target" type="ENUMERATED"
-					displaylabel="%Attribute.Label.target">
-					<option key="_self" value="_self" />
-					<option key="_blank" value="_blank" />
-					<option key="_parent" value="_parent" />
-					<option key="_top" value="_top" />
-				</attribute>
-				<attribute name="coords"
-					displaylabel="%Attribute.Label.coords" />
-				<referedattribute ref="link" overridename="rev"
-					displaylabel="%Attribute.Label.rev" />
-				<attribute name="type"
-					displaylabel="%Attribute.Label.type" />
-			</category>
-			<category name="CSS2" displaylabel="%Category.Label.CSS2">
-				<attribute name="style" type="CSSSTYLE"
-					typeparam="style=STYLE" displaylabel="%Attribute.Label.style" />
-				<attribute name="styleClass" type="CSSCLASS"
-					typeparam=" " displaylabel="%Attribute.Label.styleClass" />
-				<attribute name="infoStyle" type="CSSSTYLE"
-					displaylabel="%Attribute.Label.infoStyle" />
-				<attribute name="infoClass" type="CSSCLASS"
-					typeparam=" " displaylabel="%Attribute.Label.infoClass" />
-				<attribute name="warnStyle" type="CSSSTYLE"
-					displaylabel="%Attribute.Label.warnStyle" />
-				<attribute name="warnClass" type="CSSCLASS"
-					typeparam=" " displaylabel="%Attribute.Label.warnClass" />
-				<attribute name="errorStyle" type="CSSSTYLE"
-					displaylabel="%Attribute.Label.errorStyle" />
-				<attribute name="errorClass" type="CSSCLASS"
-					typeparam=" " displaylabel="%Attribute.Label.errorClass" />
-				<attribute name="fatalStyle" type="CSSSTYLE"
-					displaylabel="%Attribute.Label.fatalStyle" />
-				<attribute name="fatalClass" type="CSSCLASS"
-					typeparam=" " displaylabel="%Attribute.Label.fatalClass" />
-			</category>
-			<category name="CSS3" displaylabel="%Category.Label.CSS3">
-				<attribute name="style" type="CSSSTYLE"
-					typeparam="style=STYLE" displaylabel="%Attribute.Label.style" />
-				<attribute name="styleClass" type="CSSCLASS"
-					typeparam=" " displaylabel="%Attribute.Label.styleClass" />
-				<attribute name="columnClasses" type="CSSCLASS"
-					typeparam="," displaylabel="%Attribute.Label.columnClasses" />
-				<attribute name="footerClass" type="CSSCLASS"
-					typeparam=" " displaylabel="%Attribute.Label.footerClass" />
-				<attribute name="headerClass" type="CSSCLASS"
-					typeparam=" " displaylabel="%Attribute.Label.headerClass" />
-				<attribute name="rowClasses" type="CSSCLASS"
-					typeparam="separator=," displaylabel="%Attribute.Label.rowClasses" />
-			</category>
-			<category name="CSS4" displaylabel="%Category.Label.CSS4">
-				<attribute name="style" type="CSSSTYLE"
-					typeparam="style=STYLE" displaylabel="%Attribute.Label.style" />
-				<attribute name="styleClass" type="CSSCLASS"
-					typeparam=" " displaylabel="%Attribute.Label.styleClass" />
-				<attribute name="disabledClass" type="CSSCLASS"
-					typeparam="" displaylabel="%Attribute.Label.disabledClass" />
-				<attribute name="enabledClass" type="CSSCLASS"
-					typeparam="" displaylabel="%Attribute.Label.enabledClass" />
-			</category>
-			<category name="Table"
-				displaylabel="%Category.Label.Table">
-				<attribute name="bgcolor" type="COLOR"
-					displaylabel="%Attribute.Label.bgcolor" />
-				<attribute name="border"
-					displaylabel="%Attribute.Label.border" />
-				<attribute name="cellpadding"
-					displaylabel="%Attribute.Label.cellpadding" />
-				<attribute name="cellspacing"
-					displaylabel="%Attribute.Label.cellspacing" />
-				<attribute name="width"
-					displaylabel="%Attribute.Label.width" />
-				<attribute name="frame" type="ENUMERATED"
-					displaylabel="%Attribute.Label.frame">
-					<option key="lhs" value="Left hand side only" />
-					<option key="above" value="Top side only" />
-					<option key="none" value="No sides" default="default"/>
-					<option key="box" value="All four sides" />
-					<option key="vsides"
-						value="Right and left sides only" />
-					<option key="below" value="Bottom side only" />
-					<option key="border" value="All four sides" />
-					<option key="rhs" value="Right hand side only" />
-					<option key="hsides"
-						value="Top and bottom sides only" />
-				</attribute>
-				<attribute name="rules" type="ENUMERATED"
-					displaylabel="%Attribute.Label.rules">
-					<option key="cols" value="Between columns only" />
-					<option key="groups" value="Between row groups" />
-					<option key="rows" value="Between rows only" />
-					<option key="none" value="No rules" default="default"/>
-					<option key="all"
-						value="Between all rows and columns" />
-				</attribute>
-				<attribute name="summary"
-					displaylabel="%Attribute.Label.summary" />
-				<attribute name="title"
-					displaylabel="%Attribute.Label.title" />
-			</category>
-		</categories>
-		<attributes>
-			<attribute name="lang" type="ENUMERATED"
-				displaylabel="%Attribute.Label.lang">
-				<option key="af" value="af Afrikaans" />
-				<option key="ar" value="ar Arabic (needs subtype)" />
-				<option key="be" value="be Belarusian" />
-				<option key="bg" value="bg Bulgarian" />
-				<option key="br" value="br Breton" />
-				<option key="ca" value="ca Catalan" />
-				<option key="cs" value="cs Czech" />
-				<option key="da" value="da Danish" />
-				<option key="de" value="de German (Standard)" />
-				<option key="el" value="el Greek" />
-				<option key="en" value="en English" />
-				<option key="es" value="es Spanish (Spain)" />
-				<option key="et" value="et Estonian" />
-				<option key="eu" value="eu Basque" />
-				<option key="fa" value="fa Farsi" />
-				<option key="fi" value="fi Finnish" />
-				<option key="fo" value="fo Faeroese" />
-				<option key="fr" value="fr French (Standard)" />
-				<option key="gd" value="gd Gaelic (Scotland)" />
-				<option key="he" value="he Hebrew" />
-				<option key="hi" value="hi Hindi" />
-				<option key="hr" value="hr Croatian" />
-				<option key="hu" value="hu Hungarian" />
-				<option key="id" value="id Indonesian" />
-				<option key="is" value="is Icelandic" />
-				<option key="it" value="it Italian (Standard)" />
-				<option key="ja" value="ja Japanese" />
-				<option key="ko" value="ko Korean" />
-				<option key="lt" value="lt Lithuanian" />
-				<option key="lv" value="lv Latvian" />
-				<option key="mk" value="mk Macedonian" />
-				<option key="ms" value="ms Malaysian" />
-				<option key="mt" value="mt Maltese" />
-				<option key="nl" value="nl Dutch (Standard)" />
-				<option key="no" value="no Norwegian (Bokmal/Nynorsk)" />
-				<option key="pl" value="pl Polish" />
-				<option key="pt" value="pt Portuguese (Standard)" />
-				<option key="rm" value="rm Rhaeto-Romanic" />
-				<option key="ro" value="ro Romanian" />
-				<option key="ru" value="ru Russian" />
-				<option key="sk" value="sk Slovak" />
-				<option key="sl" value="sl Slovenian" />
-				<option key="sq" value="sq Albanian" />
-				<option key="sr" value="sr Serbian (Cyrillic/Latin)" />
-				<option key="sv" value="sv Swedish" />
-				<option key="sx" value="sx Sutu" />
-				<option key="sz" value="sz Sami (Lappish)" />
-				<option key="th" value="th Thai" />
-				<option key="tn" value="tn Setswana" />
-				<option key="tr" value="tr Turkish" />
-				<option key="ts" value="ts Tsonga" />
-				<option key="uk" value="uk Ukrainian" />
-				<option key="ur" value="ur Urdu" />
-				<option key="vi" value="vi Vietnamese" />
-				<option key="xh" value="xh Xhosa" />
-				<option key="yi" value="yi Yiddish" />
-				<option key="zh" value="zh Chinese (needs subtype)" />
-				<option key="zu" value="zu Zulu" />
-			</attribute>
-			<attribute name="link" type="MULTICHOICE" typeparam=" "
-				displaylabel="%Attribute.Label.link">
-				<option key="index" value="index" />
-				<option key="subsection" value="subsection" />
-				<option key="bookmark" value="bookmark" />
-				<option key="start" value="start" />
-				<option key="next" value="next" />
-				<option key="stylesheet" value="stylesheet" />
-				<option key="chapter" value="chapter" />
-				<option key="help" value="help" />
-				<option key="alternate" value="alternate" />
-				<option key="appendix" value="appendix" />
-				<option key="contents" value="contents" />
-				<option key="section" value="section" />
-				<option key="prev" value="prev" />
-				<option key="glossary" value="glossary" />
-				<option key="copyright" value="copyright" />
-			</attribute>
-		</attributes>
-	</definition>
-
-</taglib>
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/icons/palette/JSFCORE/large/JSF_ACTIONLISTENER.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_ACTIONLISTENER.gif
deleted file mode 100644
index 5dc1abc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_ACTIONLISTENER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_ATTRIBUTE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_ATTRIBUTE.gif
deleted file mode 100644
index d99d2eb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_ATTRIBUTE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_CONVERTDATETIME.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_CONVERTDATETIME.gif
deleted file mode 100644
index f9f3409..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_CONVERTDATETIME.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_CONVERTER.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_CONVERTER.gif
deleted file mode 100644
index a8f5d3a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_CONVERTER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_CONVERTNUMBER.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_CONVERTNUMBER.gif
deleted file mode 100644
index 21b24f0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_CONVERTNUMBER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_FACET.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_FACET.gif
deleted file mode 100644
index 6424c7f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_FACET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_LOADBUNDLE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_LOADBUNDLE.gif
deleted file mode 100644
index e1cd4e1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_LOADBUNDLE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_PARAM.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_PARAM.gif
deleted file mode 100644
index 79e07c2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_PARAM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_SELECTITEM.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_SELECTITEM.gif
deleted file mode 100644
index 3831d95..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_SELECTITEM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_SELECTITEMS.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_SELECTITEMS.gif
deleted file mode 100644
index b2a1c43..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_SELECTITEMS.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_SUBVIEW.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_SUBVIEW.gif
deleted file mode 100644
index f37f412..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_SUBVIEW.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_VALIDATEDOUBLERANGE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_VALIDATEDOUBLERANGE.gif
deleted file mode 100644
index afee57b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_VALIDATEDOUBLERANGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_VALIDATELENGTH.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_VALIDATELENGTH.gif
deleted file mode 100644
index afee57b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_VALIDATELENGTH.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_VALIDATELONGRANGE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_VALIDATELONGRANGE.gif
deleted file mode 100644
index afee57b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_VALIDATELONGRANGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_VALIDATOR.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_VALIDATOR.gif
deleted file mode 100644
index afee57b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_VALIDATOR.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_VALUECHANGELISTENER.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_VALUECHANGELISTENER.gif
deleted file mode 100644
index 2fafdeb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_VALUECHANGELISTENER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_VERBATIM.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_VERBATIM.gif
deleted file mode 100644
index d284eb9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_VERBATIM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_VIEW.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_VIEW.gif
deleted file mode 100644
index 98294c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/large/JSF_VIEW.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_ACTIONLISTENER.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_ACTIONLISTENER.gif
deleted file mode 100644
index 67b2d33..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_ACTIONLISTENER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_ATTRIBUTE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_ATTRIBUTE.gif
deleted file mode 100644
index b77c750..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_ATTRIBUTE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_CONVERTDATETIME.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_CONVERTDATETIME.gif
deleted file mode 100644
index 779d820..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_CONVERTDATETIME.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_CONVERTER.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_CONVERTER.gif
deleted file mode 100644
index 16466ed..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_CONVERTER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_CONVERTNUMBER.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_CONVERTNUMBER.gif
deleted file mode 100644
index 938f364..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_CONVERTNUMBER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_FACET.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_FACET.gif
deleted file mode 100644
index b9cb148..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_FACET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_LOADBUNDLE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_LOADBUNDLE.gif
deleted file mode 100644
index 8f40ee1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_LOADBUNDLE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_PARAM.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_PARAM.gif
deleted file mode 100644
index b3e0727..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_PARAM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_SELECTITEM.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_SELECTITEM.gif
deleted file mode 100644
index 247efe0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_SELECTITEM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_SELECTITEMS.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_SELECTITEMS.gif
deleted file mode 100644
index 7fb0974..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_SELECTITEMS.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_SUBVIEW.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_SUBVIEW.gif
deleted file mode 100644
index 9748015..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_SUBVIEW.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_VALIDATEDOUBLERANGE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_VALIDATEDOUBLERANGE.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_VALIDATEDOUBLERANGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_VALIDATELENGTH.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_VALIDATELENGTH.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_VALIDATELENGTH.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_VALIDATELONGRANGE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_VALIDATELONGRANGE.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_VALIDATELONGRANGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_VALIDATOR.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_VALIDATOR.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_VALIDATOR.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_VALUECHANGELISTENER.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_VALUECHANGELISTENER.gif
deleted file mode 100644
index a1cd624..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_VALUECHANGELISTENER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_VERBATIM.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_VERBATIM.gif
deleted file mode 100644
index f12c9df..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_VERBATIM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_VIEW.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_VIEW.gif
deleted file mode 100644
index c81630a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFCORE/small/JSF_VIEW.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_COLUMN.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_COLUMN.gif
deleted file mode 100644
index 381154d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_COLUMN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_COMMANDBUTTON.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_COMMANDBUTTON.gif
deleted file mode 100644
index 9ead4e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_COMMANDBUTTON.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_COMMANDLINK.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_COMMANDLINK.gif
deleted file mode 100644
index 4c57d0e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_COMMANDLINK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_DATATABLE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_DATATABLE.gif
deleted file mode 100644
index 9873b09..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_DATATABLE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_FORM.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_FORM.gif
deleted file mode 100644
index cc27deb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_FORM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_GRAPHICIMAGE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_GRAPHICIMAGE.gif
deleted file mode 100644
index ad341a5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_GRAPHICIMAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_INPUTHIDDEN.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_INPUTHIDDEN.gif
deleted file mode 100644
index d14d09f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_INPUTHIDDEN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_INPUTSECRET.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_INPUTSECRET.gif
deleted file mode 100644
index 60c0a5d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_INPUTSECRET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_INPUTTEXT.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_INPUTTEXT.gif
deleted file mode 100644
index 4cc147e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_INPUTTEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_INPUTTEXTAREA.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_INPUTTEXTAREA.gif
deleted file mode 100644
index 25f22d8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_INPUTTEXTAREA.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_MESSAGE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_MESSAGE.gif
deleted file mode 100644
index fb737eb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_MESSAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_MESSAGES.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_MESSAGES.gif
deleted file mode 100644
index ca050e6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_MESSAGES.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_OUTPUTFORMAT.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_OUTPUTFORMAT.gif
deleted file mode 100644
index ac5920d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_OUTPUTFORMAT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_OUTPUTLABEL.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_OUTPUTLABEL.gif
deleted file mode 100644
index 348aa17..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_OUTPUTLABEL.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_OUTPUTLINK.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_OUTPUTLINK.gif
deleted file mode 100644
index 03b2bf9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_OUTPUTLINK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_OUTPUTTEXT.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_OUTPUTTEXT.gif
deleted file mode 100644
index 295ecc4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_OUTPUTTEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_PANELGRID.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_PANELGRID.gif
deleted file mode 100644
index a31479c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_PANELGRID.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_PANELGROUP.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_PANELGROUP.gif
deleted file mode 100644
index da85fe9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_PANELGROUP.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_SELECTBOOLEANCHECKBOX.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_SELECTBOOLEANCHECKBOX.gif
deleted file mode 100644
index 4a02dde..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_SELECTBOOLEANCHECKBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_SELECTMANYCHECKBOX.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_SELECTMANYCHECKBOX.gif
deleted file mode 100644
index 31b1f37..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_SELECTMANYCHECKBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_SELECTMANYLISTBOX.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_SELECTMANYLISTBOX.gif
deleted file mode 100644
index 0ed9443..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_SELECTMANYLISTBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_SELECTMANYMENU.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_SELECTMANYMENU.gif
deleted file mode 100644
index dc1dbbc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_SELECTMANYMENU.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_SELECTONELISTBOX.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_SELECTONELISTBOX.gif
deleted file mode 100644
index a1c257e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_SELECTONELISTBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_SELECTONEMENU.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_SELECTONEMENU.gif
deleted file mode 100644
index 3686b5c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_SELECTONEMENU.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_SELECTONERADIO.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_SELECTONERADIO.gif
deleted file mode 100644
index f6aeac0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/large/JSF_SELECTONERADIO.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_COLUMN.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_COLUMN.gif
deleted file mode 100644
index 5a3db49..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_COLUMN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_COMMANDBUTTON.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_COMMANDBUTTON.gif
deleted file mode 100644
index 8e721c5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_COMMANDBUTTON.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_COMMANDLINK.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_COMMANDLINK.gif
deleted file mode 100644
index 5fd9c94..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_COMMANDLINK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_DATATABLE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_DATATABLE.gif
deleted file mode 100644
index d11c996..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_DATATABLE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_FORM.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_FORM.gif
deleted file mode 100644
index 3081f32..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_FORM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_GRAPHICIMAGE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_GRAPHICIMAGE.gif
deleted file mode 100644
index a988c1d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_GRAPHICIMAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_INPUTHIDDEN.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_INPUTHIDDEN.gif
deleted file mode 100644
index f18865b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_INPUTHIDDEN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_INPUTSECRET.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_INPUTSECRET.gif
deleted file mode 100644
index 13dbf62..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_INPUTSECRET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_INPUTTEXT.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_INPUTTEXT.gif
deleted file mode 100644
index 7f506d9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_INPUTTEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_INPUTTEXTAREA.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_INPUTTEXTAREA.gif
deleted file mode 100644
index a2fa616..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_INPUTTEXTAREA.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_MESSAGE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_MESSAGE.gif
deleted file mode 100644
index 7d0c261..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_MESSAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_MESSAGES.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_MESSAGES.gif
deleted file mode 100644
index 6f43980..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_MESSAGES.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_OUTPUTFORMAT.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_OUTPUTFORMAT.gif
deleted file mode 100644
index 29dcd77..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_OUTPUTFORMAT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_OUTPUTLABEL.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_OUTPUTLABEL.gif
deleted file mode 100644
index b957bca..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_OUTPUTLABEL.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_OUTPUTLINK.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_OUTPUTLINK.gif
deleted file mode 100644
index 5216956..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_OUTPUTLINK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_OUTPUTTEXT.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_OUTPUTTEXT.gif
deleted file mode 100644
index 0845145..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_OUTPUTTEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_PANELGRID.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_PANELGRID.gif
deleted file mode 100644
index dd22a99..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_PANELGRID.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_PANELGROUP.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_PANELGROUP.gif
deleted file mode 100644
index 0a13d8c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_PANELGROUP.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_SELECTBOOLEANCHECKBOX.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_SELECTBOOLEANCHECKBOX.gif
deleted file mode 100644
index 00da14e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_SELECTBOOLEANCHECKBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_SELECTMANYCHECKBOX.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_SELECTMANYCHECKBOX.gif
deleted file mode 100644
index 2e2370d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_SELECTMANYCHECKBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_SELECTMANYLISTBOX.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_SELECTMANYLISTBOX.gif
deleted file mode 100644
index a20aed5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_SELECTMANYLISTBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_SELECTMANYMENU.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_SELECTMANYMENU.gif
deleted file mode 100644
index 4cfeaa8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_SELECTMANYMENU.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_SELECTONELISTBOX.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_SELECTONELISTBOX.gif
deleted file mode 100644
index f6445ed..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_SELECTONELISTBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_SELECTONEMENU.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_SELECTONEMENU.gif
deleted file mode 100644
index 04a0d43..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_SELECTONEMENU.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_SELECTONERADIO.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_SELECTONERADIO.gif
deleted file mode 100644
index 2598367..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/palette/JSFHTML/small/JSF_SELECTONERADIO.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_core.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_core.properties
deleted file mode 100644
index 4ea823a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_core.properties
+++ /dev/null
@@ -1 +0,0 @@
-JSFCORE.display-label=JSF Core
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_core.xml b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_core.xml
deleted file mode 100644
index 227a40e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_core.xml
+++ /dev/null
@@ -1,188 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-	xmlns:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore"
-	id="http://java.sun.com/jsf/core"
-	type="tagFile">
-	
-	<trait id="is-jsf-component-library">
-		<value>true</value>
-	</trait>
-	
-	<trait id="paletteInfos" >
-		<value xsi:type="pi:PaletteInfos">
-			<item id="view"/>
-			<item id="validator"/>
-			<item id="valueChangeListener"/>			
-			<item id="actionListener"/>
-			<item id="convertDateTime"/>
-			<item id="converter"/>
-			<item id="convertNumber"/>			
-			<item id="facet"/>
-			<item id="attribute"/>
-			<item id="loadBundle"/>
-			<item id="param"/>
-			<item id="selectItem"/>
-			<item id="selectItems"/>
-			<item id="subview"/>
-			<item id="validateDoubleRange"/>
-			<item id="validateLength"/>
-			<item id="validateLongRange"/>
-			<item id="verbatim"/>			
-		</value>
-	</trait>
-
-	<trait id="images-base-path">
-		<value>icons/palette/JSFCORE</value>
-	</trait>
-
-	<trait id="display-label">
-		<value>%JSFCORE.display-label</value>
-	</trait>
-	
-	<entity id="actionListener" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_ACTIONLISTENER.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_ACTIONLISTENER.gif</value>
-		</trait>
-	</entity>
-	<entity id="attribute" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_ATTRIBUTE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_ATTRIBUTE.gif</value>
-		</trait>
-	</entity>	
-	<entity id="convertDateTime" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_CONVERTDATETIME.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_CONVERTDATETIME.gif</value>
-		</trait>
-	</entity>
-	<entity id="convertNumber" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_CONVERTNUMBER.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_CONVERTNUMBER.gif</value>
-		</trait>
-	</entity>
-	<entity id="converter" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_CONVERTER.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_CONVERTER.gif</value>
-		</trait>
-	</entity>
-	<entity id="facet" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_FACET.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_FACET.gif</value>
-		</trait>
-	</entity>
-	<entity id="loadBundle" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_LOADBUNDLE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_LOADBUNDLE.gif</value>
-		</trait>
-	</entity>
-	<entity id="param" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_PARAM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_PARAM.gif</value>
-		</trait>
-	</entity>
-	<entity id="selectItem" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_SELECTITEM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_SELECTITEM.gif</value>
-		</trait>
-	</entity>
-	<entity id="selectItems" type="tag">	
-		<trait id="small-icon">
-			<value>small/JSF_SELECTITEMS.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_SELECTITEMS.gif</value>
-		</trait>
-	</entity>
-	<entity id="subview" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_SUBVIEW.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_SUBVIEW.gif</value>
-		</trait>
-	</entity>
-	<entity id="validateDoubleRange" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_VALIDATEDOUBLERANGE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_VALIDATEDOUBLERANGE.gif</value>
-		</trait>
-	</entity>
-	<entity id="validateLength" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_VALIDATELENGTH.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_VALIDATELENGTH.gif</value>
-		</trait>
-	</entity>
-	<entity id="validateLongRange" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_VALIDATELONGRANGE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_VALIDATELONGRANGE.gif</value>
-		</trait>
-	</entity>
-	<entity id="validator" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_VALIDATOR.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_VALIDATOR.gif</value>
-		</trait>
-	</entity>
-	<entity id="valueChangeListener" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_VALUECHANGELISTENER.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_VALUECHANGELISTENER.gif</value>
-		</trait>
-	</entity>
-	<entity id="verbatim" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_VERBATIM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_VERBATIM.gif</value>
-		</trait>
-	</entity>
-	<entity id="view" type="tag">
-		<trait id="small-icon">
-			<value>small/JSF_VIEW.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_VIEW.gif</value>
-		</trait>	
-	</entity>
-</md:metadatamodel>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_core_dti.xml b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_core_dti.xml
deleted file mode 100644
index 66297c3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_core_dti.xml
+++ /dev/null
@@ -1,308 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-	xmlns:dti="http://org.eclipse.jsf.pagedesigner/dtinfo.ecore"
-	id="http://java.sun.com/jsf/core"
-	type="tagFile">
-
-	<entity id="actionListener" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_ACTIONLISTENER.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="attribute" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_ATTRIBUTE.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="convertDateTime" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_CONVERTDATETIME.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="converter" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_CONVERTER.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="convertNumber" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_CONVERTNUMBER.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="facet" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="CreateElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="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="CustomTransformOperation">
-						<parameter value="org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.LoadBundleOperation"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_LOADBUNDLE.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="param" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_PARAM.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectItem" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_SELECTITEM.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectItems" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_SELECTITEMS.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="subview" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_SUBVIEW.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="validateDoubleRange" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VALIDATEDOUBLERANGE.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="validateLength" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VALIDATELENGTH.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="validateLongRange" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VALIDATELONGRANGE.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="validator" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VALIDATOR.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="valueChangeListener" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VALUECHANGELISTENER.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="verbatim" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="CreateElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="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="CreateElementOperation">
-						<parameter value="div"/>
-					</operation>
-					<operation id="CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_html.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_html.properties
deleted file mode 100644
index 72a6e38..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_html.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-JSFHTML.display-label=JSF HTML
-commandButton.display-label=Command Button
-commandLink.display-label=Command Link
-dataTable.display-label=Data Table
-form.display-label=Form
-graphicImage.display-label=Graphic Image
-inputHidden.display-label=Hidden Input
-inputSecret.display-label=Secret Input
-inputText.display-label=Text Input
-inputTextarea.display-label=Textarea Input
-message.display-label=Message
-messages.display-label=Messages
-outputFormat.display-label=Output Format
-outputLabel.display-label=Output Label
-outputLink.display-label=Output Link
-outputText.display-label=Output Text
-panelGrid.display-label=Panel Grid
-panelGroup.display-label=Panel Group
-selectBooleanCheckbox.display-label=Select Boolean Checkbox
-selectManyCheckbox.display-label=Select Many Checkbox
-selectManyListbox.display-label=Select Many Listbox
-selectManyMenu.display-label=Select Many Menu
-selectOneListbox.display-label=Select One Listbox
-selectOneMenu.display-label=Select One Menu
-selectOneRadio.display-label=Select One Radio
-column.display-label=Column
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_html.xml b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_html.xml
deleted file mode 100644
index dfbdb43..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_html.xml
+++ /dev/null
@@ -1,423 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-	xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore"  
-	xmlns:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore"
-	id="http://java.sun.com/jsf/html"
-	type="tagFile">
-	
-	<trait id="is-jsf-component-library">
-		<value>true</value>
-	</trait>
-	
-	<trait id="paletteInfos" >
-		<value xsi:type="pi:PaletteInfos">
-			<item id="outputLabel"/>
-			<item id="inputText"/>
-			<item id="commandButton"/>
-			<item id="inputTextarea"/>
-			<item id="outputText"/>
-			<item id="form"/>
-			<item id="inputHidden"/>
-			<item id="inputSecret"/>
-			<item id="column"/>
-			<item id="commandLink"/>
-			<item id="message"/>			
-			<item id="messages"/>
-			<item id="outputFormat"/>
-			<item id="panelGrid"/>
-			<item id="panelGroup"/>
-			<item id="selectBooleanCheckbox"/>
-			<item id="selectManyCheckbox"/>
-			<item id="selectManyListbox"/>
-			<item id="selectManyMenu"/>
-			<item id="selectOneListbox"/>
-			<item id="selectOneMenu"/>
-			<item id="selectOneRadio"/>
-			<item id="dataTable"/>
-			<item id="graphicImage"/>
-		</value>
-	</trait>
-	
-	<trait id="images-base-path">
-		<value>/icons/palette/JSFHTML/</value>
-	</trait>
-
-	<trait id="display-label">
-		<value>%JSFHTML.display-label</value>
-	</trait>
-		
-	<entity id="commandButton" type="tag">	
-		<trait id="display-label">
-			<value>%commandButton.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_COMMANDBUTTON.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_COMMANDBUTTON.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>	
-	</entity>
-	<entity id="commandLink" type="tag">		
-		<trait id="display-label">
-			<value>%commandLink.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_COMMANDLINK.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_COMMANDLINK.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>	
-		<trait id="tag-create">
-			<value xsi:type="pi:TagCreationInfo">
-				<template><![CDATA[
-					<outputText value="CommandLink"
-					_uri_="http://java.sun.com/jsf/html" />
-				]]></template>
-			</value>
-		</trait>		
-	</entity>
-	<entity id="dataTable" type="tag">
-		<trait id="display-label">
-			<value>%dataTable.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_DATATABLE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_DATATABLE.gif</value>
-		</trait>	
-		<trait id="tag-create">
-			<value xsi:type="pi:TagCreationInfo">
-				<template><![CDATA[ 
-				<column id="column1"
-					_uri_="http://java.sun.com/jsf/html">
-					<facet name="header"
-						_uri_="http://java.sun.com/jsf/core">
-						<outputText value="column1"
-							_uri_="http://java.sun.com/jsf/html" />
-					</facet>
-				</column>
-				<column id="column2"
-					_uri_="http://java.sun.com/jsf/html">
-					<facet name="header"
-						_uri_="http://java.sun.com/jsf/core">
-						<outputText value="column2"
-							_uri_="http://java.sun.com/jsf/html" />
-					</facet>
-				</column>
-				]]></template>
-				<attribute id="border" value="1" />
-			</value>
-		</trait>
-	</entity>
-	<entity id="form" type="tag">
-		<trait id="display-label">
-			<value>%form.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_FORM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_FORM.gif</value>
-		</trait>	
-	</entity>
-
-	<entity id="graphicImage" type="tag">
-		<trait id="display-label">
-			<value>%graphicImage.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_GRAPHICIMAGE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_GRAPHICIMAGE.gif</value>
-		</trait>		
-	</entity>
-	<entity id="inputHidden" type="tag">
-		<trait id="display-label">
-			<value>%inputHidden.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_INPUTHIDDEN.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_INPUTHIDDEN.gif</value>
-		</trait>	
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>	
-	</entity>
-	<entity id="inputSecret" type="tag">
-		<trait id="display-label">
-			<value>%inputSecret.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_INPUTSECRET.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_INPUTSECRET.gif</value>
-		</trait>	
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>
-	</entity>
-	<entity id="inputText" type="tag">
-		<trait id="display-label">
-			<value>%inputText.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_INPUTTEXT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_INPUTTEXT.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>
-	</entity>
-	<entity id="inputTextarea" type="tag">
-		<trait id="display-label">
-			<value>%inputTextarea.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_INPUTTEXTAREA.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_INPUTTEXTAREA.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>
-	</entity>
-	<entity id="message" type="tag">
-		<trait id="display-label">
-			<value>%message.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_MESSAGE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_MESSAGE.gif</value>
-		</trait>
-	</entity>
-	<entity id="messages" type="tag">
-		<trait id="display-label">
-			<value>%messages.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_MESSAGES.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_MESSAGES.gif</value>
-		</trait>	
-	</entity>
-	<entity id="outputFormat" type="tag">
-		<trait id="display-label">
-			<value>%outputFormat.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_OUTPUTFORMAT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_OUTPUTFORMAT.gif</value>
-		</trait>	
-	</entity>
-	<entity id="outputLabel" type="tag">		
-		<trait id="display-label">
-			<value>%outputLabel.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_OUTPUTLABEL.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_OUTPUTLABEL.gif</value>
-		</trait>		
-	</entity>
-	<entity id="outputLink" type="tag">
-		<trait id="display-label">
-			<value>%outputLink.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_OUTPUTLINK.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_OUTPUTLINK.gif</value>
-		</trait>
-		<trait id="tag-create">
-			<value xsi:type="pi:TagCreationInfo">
-				<template><![CDATA[
-				<outputText value="OutputLink"
-					_$uri$="http://java.sun.com/jsf/html" />
-				]]></template>
-
-			</value>
-		</trait>			
-	</entity>
-	<entity id="outputText" type="tag">
-		<trait id="display-label">
-			<value>%outputText.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_OUTPUTTEXT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_OUTPUTTEXT.gif</value>
-		</trait>			
-	</entity>
-	<entity id="panelGrid" type="tag">
-		<trait id="display-label">
-			<value>%panelGrid.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_PANELGRID.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_PANELGRID.gif</value>
-		</trait>
-		<trait id="tag-create">
-			<value xsi:type="pi:TagCreationInfo">
-				<template><![CDATA[
-				<outputText value="item1"
-					_uri_="http://java.sun.com/jsf/html" />
-				<outputText value="item2"
-					_uri_="http://java.sun.com/jsf/html" />
-				<outputText value="item3"
-					_uri_="http://java.sun.com/jsf/html" />
-				<outputText value="item4"
-					_uri_="http://java.sun.com/jsf/html" />
-				]]></template>
-				<attribute id="border" value="1" />
-				<attribute id="columns" value="2" />
-			</value>
-		</trait>					
-	</entity>
-	<entity id="panelGroup" type="tag">
-		<trait id="display-label">
-			<value>%panelGroup.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_PANELGROUP.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_PANELGROUP.gif</value>
-		</trait>	
-	</entity>
-	<entity id="selectBooleanCheckbox" type="tag">
-		<trait id="display-label">
-			<value>%selectBooleanCheckbox.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_SELECTBOOLEANCHECKBOX.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_SELECTBOOLEANCHECKBOX.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>
-	</entity>
-	<entity id="selectManyCheckbox" type="tag">
-		<trait id="display-label">
-			<value>%selectManyCheckbox.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_SELECTMANYCHECKBOX.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_SELECTMANYCHECKBOX.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>
-	</entity>
-	<entity id="selectManyListbox" type="tag">
-		<trait id="display-label">
-			<value>%selectManyListbox.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_SELECTMANYLISTBOX.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_SELECTMANYLISTBOX.gif</value>
-		</trait>	
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>
-	</entity>
-	<entity id="selectManyMenu" type="tag">
-		<trait id="display-label">
-			<value>%selectManyMenu.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_SELECTMANYMENU.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_SELECTMANYMENU.gif</value>
-		</trait>		
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>
-	</entity>
-	<entity id="selectOneListbox" type="tag">
-		<trait id="display-label">
-			<value>%selectOneListbox.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_SELECTONELISTBOX.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_SELECTONELISTBOX.gif</value>
-		</trait>		
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>
-	</entity>
-	<entity id="selectOneMenu" type="tag">
-		<trait id="display-label">
-			<value>%selectOneMenu.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_SELECTONEMENU.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_SELECTONEMENU.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>
-	</entity>
-	<entity id="selectOneRadio" type="tag">
-		<trait id="display-label">
-			<value>%selectOneRadio.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_SELECTONERADIO.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_SELECTONERADIO.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>
-	</entity>
-	<entity id="column" type="tag">
-		<trait id="display-label">
-			<value>%column.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/JSF_COLUMN.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSF_COLUMN.gif</value>
-		</trait>		
-	</entity>
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_html_dti.xml b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_html_dti.xml
deleted file mode 100644
index ba46243..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_html_dti.xml
+++ /dev/null
@@ -1,852 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-	xmlns:dti="http://org.eclipse.jsf.pagedesigner/dtinfo.ecore"
-	id="http://java.sun.com/jsf/html"
-	type="tagFile">
-
-	<entity id="column" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="CustomTransformOperation">
-						<parameter value="org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.ColumnOperation"/>
-					</operation>
-				</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="CreateElementOperation">
-						<parameter value="input"/>
-					</operation>
-					<operation id="CopyAllAttributesOperation"/>
-					<operation id="RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<!-- if image attribute exists -->
-					<operation id="IfOperation">
-						<parameter value="@image"/>
-						<operation id="CreateAttributeOperation">
-							<parameter value="type"/>
-							<parameter value="image"/>
-						</operation>
-						<operation id="RenameAttributeOperation">
-							<parameter value="image"/>
-							<parameter value="src"/>
-						</operation>
-					</operation>
-					<!-- if image attribute does not exist -->
-					<operation id="IfNotOperation">
-						<parameter value="@image"/>
-						<!-- create default type attribute (submit) -->
-						<operation id="CreateAttributeOperation">
-							<parameter value="type"/>
-							<parameter value="submit"/>
-						</operation>
-						<!-- override default if type attribute is set (e.g. reset) -->
-						<operation id="CopyAttributeOperation">
-							<parameter value="type"/>
-						</operation>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="value"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="commandLink" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="CreateElementOperation">
-						<parameter value="a"/>
-					</operation>
-					<operation id="CopyAllAttributesOperation"/>
-					<operation id="RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="CreateAttributeOperation">
-						<parameter value="href"/>
-						<parameter value="#"/>
-					</operation>
-					<operation id="ConvertAttributeToTextOperation">
-						<parameter value="value"/>
-					</operation>
-					<operation id="CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="dataTable" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="CustomTransformOperation">
-						<parameter value="org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.DataTableOperation"/>
-					</operation>
-				</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="CreateElementOperation">
-						<parameter value="form"/>
-					</operation>
-					<operation id="CopyAllAttributesOperation"/>
-					<operation id="RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="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="CreateElementOperation">
-						<parameter value="img"/>
-					</operation>
-					<operation id="CopyAllAttributesOperation"/>
-					<operation id="RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="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="RenameAttributeOperation">
-						<parameter value="value"/>
-						<parameter value="src"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-				>
-					<resolve-attribute-value attributeName="src"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="src"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputHidden" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFHTML/small/JSF_INPUTHIDDEN.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputSecret" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="CreateElementOperation">
-						<parameter value="input"/>
-					</operation>
-					<operation id="CopyAllAttributesOperation"/>
-					<operation id="RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="CreateAttributeOperation">
-						<parameter value="type"/>
-						<parameter value="password"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="value"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputText" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="CreateElementOperation">
-						<parameter value="input"/>
-					</operation>
-					<operation id="CopyAllAttributesOperation"/>
-					<operation id="RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="CreateAttributeOperation">
-						<parameter value="type"/>
-						<parameter value="text"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="value"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputTextarea" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="CreateElementOperation">
-						<parameter value="textarea"/>
-					</operation>
-					<operation id="CopyAllAttributesOperation"/>
-					<operation id="RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="ConvertAttributeToTextOperation">
-						<parameter value="value"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="message" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFHTML/small/JSF_MESSAGE.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="messages" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFHTML/small/JSF_MESSAGES.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="outputFormat" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="CreateElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="CopyAllAttributesOperation"/>
-					<operation id="RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="ConvertAttributeToTextOperation">
-						<parameter value="value"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="outputLabel" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="CreateElementOperation">
-						<parameter value="label"/>
-					</operation>
-					<operation id="CopyAllAttributesOperation"/>
-					<operation id="RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="ConvertAttributeToTextOperation">
-						<parameter value="value"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="outputLink" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="CreateElementOperation">
-						<parameter value="a"/>
-					</operation>
-					<operation id="CopyAllAttributesOperation"/>
-					<operation id="RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="CreateAttributeOperation">
-						<parameter value="href"/>
-						<parameter value="#"/>
-					</operation>
-					<operation id="RenameAttributeOperation">
-						<parameter value="value"/>
-						<parameter value="href"/>
-					</operation>
-					<operation id="CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="outputText" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="CreateElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="CopyAllAttributesOperation"/>
-					<operation id="RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="ConvertAttributeToTextOperation">
-						<parameter value="value"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="panelGrid" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="CustomTransformOperation">
-						<parameter value="org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.PanelGridOperation"/>
-					</operation>
-				</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="CreateElementOperation">
-						<parameter value="div"/>
-					</operation>
-					<operation id="CopyAllAttributesOperation"/>
-					<operation id="RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="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="CreateElementOperation">
-						<parameter value="input"/>
-					</operation>
-					<operation id="CopyAllAttributesOperation"/>
-					<operation id="RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="CreateAttributeOperation">
-						<parameter value="type"/>
-						<parameter value="checkbox"/>
-					</operation>
-					<!-- if value attribute exists and is "true" -->
-					<operation id="IfOperation">
-						<parameter value="self::node()[@value='true']"/>
-						<operation id="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="CustomTransformOperation">
-						<parameter value="org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.SelectManyCheckboxOperation"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectManyListbox" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="CreateElementOperation">
-						<parameter value="select"/>
-					</operation>
-					<operation id="CopyAllAttributesOperation"/>
-					<operation id="RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="RenameAttributeOperation">
-						<parameter value="id"/>
-						<parameter value="name"/>
-					</operation>
-					<!-- multiple select allowed -->
-					<operation id="CreateAttributeOperation">
-						<parameter value="multiple"/>
-						<parameter value="multiple"/>
-					</operation>
-					<!-- if no "size" attribute -->
-					<operation id="IfNotOperation">
-						<parameter value="@size"/>
-						<operation id="CreateAttributeFromXPathOperation">
-							<parameter value="size"/>
-							<parameter value="count(selectItem)"/>
-						</operation>
-					</operation>
-					<!-- iterate over "selectItem" children -->
-					<operation id="IterateOverElementsOperation">
-						<parameter value="selectItem"/>
-						<operation id="AppendChildElementOperation">
-							<parameter value="option"/>
-						</operation>
-						<operation id="CopyAttributeOperation">
-							<parameter value="itemValue"/>
-						</operation>
-						<operation id="RenameAttributeOperation">
-							<parameter value="itemValue"/>
-							<parameter value="value"/>
-						</operation>
-						<operation id="IfOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="AppendChildTextFromXPathOperation">
-								<parameter value="@itemLabel"/>
-							</operation>
-						</operation>
-						<operation id="IfNotOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="IfOperation">
-								<parameter value="@value"/>
-								<operation id="AppendChildTextFromXPathOperation">
-									<parameter value="@value"/>
-								</operation>
-							</operation>
-							<operation id="IfNotOperation">
-								<parameter value="@value"/>
-								<operation id="IfOperation">
-									<parameter value="@itemValue"/>
-									<operation id="AppendChildTextFromXPathOperation">
-										<parameter value="@itemValue"/>
-									</operation>
-								</operation>
-								<operation id="IfNotOperation">
-									<parameter value="@itemValue"/>
-									<operation id="AppendChildTextOperation">
-										<parameter value="selectItem"/>
-									</operation>
-								</operation>
-							</operation>
-						</operation>
-						<operation id="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="CreateElementOperation">
-						<parameter value="select"/>
-					</operation>
-					<operation id="CopyAllAttributesOperation"/>
-					<operation id="RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="RenameAttributeOperation">
-						<parameter value="id"/>
-						<parameter value="name"/>
-					</operation>
-					<!-- multiple select allowed -->
-					<operation id="CreateAttributeOperation">
-						<parameter value="multiple"/>
-						<parameter value="multiple"/>
-					</operation>
-					<!-- size fixed at 1 -->
-					<operation id="CreateAttributeOperation">
-						<parameter value="size"/>
-						<parameter value="1"/>
-					</operation>
-					<!-- iterate over "selectItem" children -->
-					<operation id="IterateOverElementsOperation">
-						<parameter value="selectItem"/>
-						<operation id="AppendChildElementOperation">
-							<parameter value="option"/>
-						</operation>
-						<operation id="CopyAttributeOperation">
-							<parameter value="itemValue"/>
-						</operation>
-						<operation id="RenameAttributeOperation">
-							<parameter value="itemValue"/>
-							<parameter value="value"/>
-						</operation>
-						<operation id="IfOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="AppendChildTextFromXPathOperation">
-								<parameter value="@itemLabel"/>
-							</operation>
-						</operation>
-						<operation id="IfNotOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="IfOperation">
-								<parameter value="@value"/>
-								<operation id="AppendChildTextFromXPathOperation">
-									<parameter value="@value"/>
-								</operation>
-							</operation>
-							<operation id="IfNotOperation">
-								<parameter value="@value"/>
-								<operation id="IfOperation">
-									<parameter value="@itemValue"/>
-									<operation id="AppendChildTextFromXPathOperation">
-										<parameter value="@itemValue"/>
-									</operation>
-								</operation>
-								<operation id="IfNotOperation">
-									<parameter value="@itemValue"/>
-									<operation id="AppendChildTextOperation">
-										<parameter value="selectItem"/>
-									</operation>
-								</operation>
-							</operation>
-						</operation>
-						<operation id="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="CreateElementOperation">
-						<parameter value="select"/>
-					</operation>
-					<operation id="CopyAllAttributesOperation"/>
-					<operation id="RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="RenameAttributeOperation">
-						<parameter value="id"/>
-						<parameter value="name"/>
-					</operation>
-					<!-- if no "size" attribute -->
-					<operation id="IfNotOperation">
-						<parameter value="@size"/>
-						<operation id="CreateAttributeFromXPathOperation">
-							<parameter value="size"/>
-							<parameter value="count(selectItem)"/>
-						</operation>
-					</operation>
-					<!-- iterate over "selectItem" children -->
-					<operation id="IterateOverElementsOperation">
-						<parameter value="selectItem"/>
-						<operation id="AppendChildElementOperation">
-							<parameter value="option"/>
-						</operation>
-						<operation id="CopyAttributeOperation">
-							<parameter value="itemValue"/>
-						</operation>
-						<operation id="RenameAttributeOperation">
-							<parameter value="itemValue"/>
-							<parameter value="value"/>
-						</operation>
-						<operation id="IfOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="AppendChildTextFromXPathOperation">
-								<parameter value="@itemLabel"/>
-							</operation>
-						</operation>
-						<operation id="IfNotOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="IfOperation">
-								<parameter value="@value"/>
-								<operation id="AppendChildTextFromXPathOperation">
-									<parameter value="@value"/>
-								</operation>
-							</operation>
-							<operation id="IfNotOperation">
-								<parameter value="@value"/>
-								<operation id="IfOperation">
-									<parameter value="@itemValue"/>
-									<operation id="AppendChildTextFromXPathOperation">
-										<parameter value="@itemValue"/>
-									</operation>
-								</operation>
-								<operation id="IfNotOperation">
-									<parameter value="@itemValue"/>
-									<operation id="AppendChildTextOperation">
-										<parameter value="selectItem"/>
-									</operation>
-								</operation>
-							</operation>
-						</operation>
-						<operation id="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="CreateElementOperation">
-						<parameter value="select"/>
-					</operation>
-					<operation id="CopyAllAttributesOperation"/>
-					<operation id="RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="RenameAttributeOperation">
-						<parameter value="id"/>
-						<parameter value="name"/>
-					</operation>
-					<!-- size fixed at 1 -->
-					<operation id="CreateAttributeOperation">
-						<parameter value="size"/>
-						<parameter value="1"/>
-					</operation>
-					<!-- iterate over "selectItem" children -->
-					<operation id="IterateOverElementsOperation">
-						<parameter value="selectItem"/>
-						<operation id="AppendChildElementOperation">
-							<parameter value="option"/>
-						</operation>
-						<operation id="CopyAttributeOperation">
-							<parameter value="itemValue"/>
-						</operation>
-						<operation id="RenameAttributeOperation">
-							<parameter value="itemValue"/>
-							<parameter value="value"/>
-						</operation>
-						<operation id="IfOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="AppendChildTextFromXPathOperation">
-								<parameter value="@itemLabel"/>
-							</operation>
-						</operation>
-						<operation id="IfNotOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="IfOperation">
-								<parameter value="@value"/>
-								<operation id="AppendChildTextFromXPathOperation">
-									<parameter value="@value"/>
-								</operation>
-							</operation>
-							<operation id="IfNotOperation">
-								<parameter value="@value"/>
-								<operation id="IfOperation">
-									<parameter value="@itemValue"/>
-									<operation id="AppendChildTextFromXPathOperation">
-										<parameter value="@itemValue"/>
-									</operation>
-								</operation>
-								<operation id="IfNotOperation">
-									<parameter value="@itemValue"/>
-									<operation id="AppendChildTextOperation">
-										<parameter value="selectItem"/>
-									</operation>
-								</operation>
-							</operation>
-						</operation>
-						<operation id="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="CustomTransformOperation">
-						<parameter value="org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.SelectOneRadioOperation"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/plugin.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/plugin.properties
deleted file mode 100644
index f996154..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/plugin.properties
+++ /dev/null
@@ -1,15 +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
-###############################################################################
-####################################################
-# 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 6e9b378..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/plugin.xml
+++ /dev/null
@@ -1,693 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-   <extension
-         point="org.eclipse.jst.pagedesigner.pageDesignerExtension">
-      <tagConverterFactory class="org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfcore.JSFCoreConverterFactory"/>
-	  <attributeCellEditorFactory class="org.eclipse.jst.pagedesigner.jsf.ui.celleditors.JSFAttributeCellEditorFactory"/>
-      <tagConverterFactory class="org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml.JSFHTMLConverterFactory"/>
-      <elementEditFactory class="org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfhtml.JSFHTMLElementEditFactory"/>
-      <elementEditFactory class="org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfcore.JSFCoreElementEditFactory"/>
-      <linkCreator
-            class="org.eclipse.jst.pagedesigner.jsf.ui.actions.JSFCommandLinkCreator"
-            linkIdentifier="JSF CommandLink"/>
-      <linkCreator
-            class="org.eclipse.jst.pagedesigner.jsf.ui.actions.JSFOutputLinkCreator"
-            linkIdentifier="JSF OutputLink"/>
-   </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> 
-   
-   <!-- 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>
-
-   <!-- element and attribute meta data -->
-   <extension
-         point="org.eclipse.jst.pagedesigner.cmRegistry">
-      <registry
-            configFile="configs/cm/jsfcore.xml"
-            uri="http://java.sun.com/jsf/core"/>
-      <registry
-            configFile="configs/cm/jsfhtml.xml"
-            uri="http://java.sun.com/jsf/html"/>
-   </extension>
-   <extension
-         point="org.eclipse.jst.pagedesigner.propertySections">
-      <propertySections>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFCoreActionListenerSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.actionListener">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/core"
-                  tagName="actionListener"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFCoreAttributeSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.attribute">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/core"
-                  tagName="attribute"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFCoreConverterSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.converter">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/core"
-                  tagName="converter"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFCoreFacetSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.facet">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/core"
-                  tagName="facet"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFCoreLoadBundleSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.loadBundle">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/core"
-                  tagName="loadBundle"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFCoreParamSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.param">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/core"
-                  tagName="param"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFCoreSelectItemSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.selectItem">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/core"
-                  tagName="selectItem"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFCoreSelectItemsSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.selectItems">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/core"
-                  tagName="selectItems"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFCoreSubviewSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.subview">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/core"
-                  tagName="subview"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFCoreValidateDoubleRangeSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.validateDoubleRange">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/core"
-                  tagName="validateDoubleRange"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFCoreValidateLengthSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.validateLength">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/core"
-                  tagName="validateLength"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFCoreValidateLongRangeSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.validateLongRange">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/core"
-                  tagName="validateLongRange"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFCoreValidatorSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.validator">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/core"
-                  tagName="validator"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFCoreValueChangeListenerSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.valueChangeListener">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/core"
-                  tagName="valueChangeListener"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFCoreVerbatimSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.verbatim">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/core"
-                  tagName="verbatim"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFCoreViewSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.view">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/core"
-                  tagName="view"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlColumnSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.column">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="column"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlCommandButtonSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.commandButton">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="commandButton"/>
-         </propertySection>
-         <propertySection
-               afterSection="section.general.commandButton"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlActionListenerSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.commandButton.listener">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="commandButton"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlCommandLinkSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.commandLink">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="commandLink"/>
-         </propertySection>
-         <propertySection
-               afterSection="section.general.commandLink"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlActionListenerSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.commandLink.listener">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="commandLink"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlDataTableSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.dataTable">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="dataTable"/>
-         </propertySection>
-         <propertySection
-               afterSection="section.general.dataTable"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlDataTableColumnsSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.dataTable.columns">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="dataTable"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlFormSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.form">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="form"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlGraphicImageSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.graphicImage">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="graphicImage"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputHiddenSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.inputHidden">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="inputHidden"/>
-         </propertySection>
-         <propertySection
-               afterSection="section.general.inputHidden"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputHiddenTypeSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.inputHidden.type">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="inputHidden"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputSecretSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.inputSecret">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="inputSecret"/>
-         </propertySection>
-         <propertySection
-               afterSection="section.general.inputSecret"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputSecretTypeSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.inputSecret.type">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="inputSecret"/>
-         </propertySection>
-         <propertySection
-               afterSection="section.general.inputSecret.type"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputOthersSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.inputText.others">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="inputSecret"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputTextSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.inputText">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="inputText"/>
-         </propertySection>
-         <propertySection
-               afterSection="section.general.inputText"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputTextTypeSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.inputText.type">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="inputText"/>
-         </propertySection>
-         <propertySection
-               afterSection="section.general.inputText.type"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputOthersSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.inputText.others">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="inputText"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputTextareaSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.inputTextarea">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="inputTextarea"/>
-         </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">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="inputTextarea"/>
-         </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">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="inputTextarea"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlMessageSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.message">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="message"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlMessagesSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.messages">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="messages"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlOutputFormatSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.outputFormat">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="outputFormat"/>
-         </propertySection>
-         <propertySection
-               afterSection="section.general.outputFormat"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlOutputFormatParamsSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.outputFormat.params">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="outputFormat"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlOutputLabelSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.outputLabel">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="outputLabel"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlOutputLinkSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.outputLink">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="outputLink"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlOutputTextSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.outputText">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="outputText"/>
-         </propertySection>
-         <propertySection
-               afterSection="section.general.outputText"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlOutputTextConverterSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.outputText.converter">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="outputText"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlPanelGridSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.panelGrid">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="panelGrid"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlPanelGroupSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.panelGroup">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="panelGroup"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectBooleanCheckboxSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.selectBooleanCheckbox">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="selectBooleanCheckbox"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectManyCheckboxSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.selectManyCheckbox">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="selectManyCheckbox"/>
-         </propertySection>
-         <propertySection
-               afterSection="section.general.selectManyCheckbox"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectChoicesSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.selectManyCheckbox.choices">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="selectManyCheckbox"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectManyListboxSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.selectManyListbox">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="selectManyListbox"/>
-         </propertySection>
-         <propertySection
-               afterSection="section.general.selectManyListbox"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectChoicesSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.selectManyListbox.choices">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="selectManyListbox"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectManyMenuSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.selectManyMenu">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="selectManyMenu"/>
-         </propertySection>
-         <propertySection
-               afterSection="section.general.selectManyMenu"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectChoicesSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.selectManyMenu.choices">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="selectManyMenu"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectOneListboxSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.selectOneListbox">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="selectOneListbox"/>
-         </propertySection>
-         <propertySection
-               afterSection="section.general.selectOneListbox"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectChoicesSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.selectOneListbox.choices">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="selectOneListbox"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectOneMenuSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.selectOneMenu">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="selectOneMenu"/>
-         </propertySection>
-         <propertySection
-               afterSection="section.general.selectOneMenu"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectChoicesSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.selectOneMenu.choices">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="selectOneMenu"/>
-         </propertySection>
-         <propertySection
-               afterSection="top"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectOneRadioSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.selectOneRadio">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="selectOneRadio"/>
-         </propertySection>
-         <propertySection
-               afterSection="section.general.selectOneRadio"
-               class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectChoicesSection"
-               tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-               id="section.general.selectOneRadio.choices">
-            <tagFilter
-                  caseSensitive="true"
-                  uri="http://java.sun.com/jsf/html"
-                  tagName="selectOneRadio"/>
-         </propertySection>
-                   <propertySection
-                afterSection="top"
-                class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFCoreConvertDateTimeGroup"
-                tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-                id="section.general.convertDateTime">
-             <tagFilter
-                   caseSensitive="true"
-                   uri="http://java.sun.com/jsf/core"
-                   tagName="convertDateTime"/>
-          </propertySection>
-         <propertySection
-                afterSection="top"
-                class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFCoreConvertNumberGroup"
-                tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-                id="section.general.convertNumber">
-             <tagFilter
-                   caseSensitive="true"
-                   uri="http://java.sun.com/jsf/core"
-                   tagName="convertNumber"/>
-          </propertySection>
-      </propertySections>
-   </extension>
-   
-   <extension
-         point="org.eclipse.jst.jsf.common.standardMetaDataFiles">
-      <standardMetaDataFile
-            location="/metadata/jsf_html.xml"
-            uri="http://java.sun.com/jsf/html">
-      </standardMetaDataFile>
-      <standardMetaDataFile
-            location="/metadata/jsf_core.xml"
-            uri="http://java.sun.com/jsf/core">
-      </standardMetaDataFile>
-            <standardMetaDataFile
-            location="/metadata/jsf_core_dti.xml"
-            uri="http://java.sun.com/jsf/core">
-      </standardMetaDataFile>
-      <standardMetaDataFile
-            location="/metadata/jsf_html_dti.xml"
-            uri="http://java.sun.com/jsf/html">
-      </standardMetaDataFile>      
-   </extension>
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/core/dom/JSFDOMUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/core/dom/JSFDOMUtil.java
deleted file mode 100644
index 16992f7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/core/dom/JSFDOMUtil.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.core.dom;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFDOMUtil
-{
-
-    /**
-     * @param parentEle 
-     * @param name 
-     * @return the facet element or null if not found
-     */
-    public static Element findFacet(Element parentEle, String name)
-    {
-        NodeList childnodes = parentEle.getChildNodes();
-        for (int i=0, size=childnodes.getLength(); i<size; i++)
-        {
-            Node node = childnodes.item(i);
-            if (node.getNodeType() == Node.ELEMENT_NODE && JSFDOMUtil.isFacet((Element)node))
-            {
-                Element ele = (Element) node;
-                if (name.equals(ele.getAttribute("name")))
-                {
-                    return ele;
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @param node
-     * @return true if node is a JSF column
-     */
-    public static boolean isHColumn(Node node)
-    {
-        if (node instanceof Element)
-        {
-            Element ele = (Element) node;
-            if ("column".equalsIgnoreCase(ele.getLocalName()) && ITLDConstants.URI_JSF_HTML.equals(CMUtil.getElementNamespaceURI(ele)))
-            {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * @param panelGridEle
-     * @return the list of UI component children
-     */
-    public static List getUIComponentChildren(Element panelGridEle)
-    {
-        // XXX: temp implementation. Later may move this out to be shared.
-        // currently just returning all children Element. Need to filter out things like non JSF UI component
-        List list = new ArrayList();
-        NodeList childnodes = panelGridEle.getChildNodes();
-        for (int i=0, size=childnodes.getLength(); i<size; i++)
-        {
-            Node node = childnodes.item(i);
-            if (node.getNodeType() == Node.ELEMENT_NODE)
-            {
-                if (JSFDOMUtil.isFacet((Element) node))
-                {
-                    continue;
-                }
-                list.add(node);
-            }
-        }
-        return list;
-    }
-
-    /**
-     * @param ele
-     * @return true if ele is a facet
-     */
-    public static boolean isFacet(Element ele)
-    {
-        // XXX: here we are not checking namespace! for error tolerant.
-        return "facet".equals(ele.getLocalName());
-    }
-
-    /**
-     * @param ele 
-     * @return true if the local name of ele is "param"
-     */
-    public static boolean isUIParameter(Element ele)
-    {
-        return "param".equals(ele.getLocalName());
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIPlugin.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIPlugin.java
deleted file mode 100644
index ec0e9dd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIPlugin.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.ILog;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.Alerts;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class JSFUIPlugin extends AbstractUIPlugin
-{
-    //The shared instance.
-    private static JSFUIPlugin _plugin;
-    //Resource bundle.
-    private ResourceBundle     _resourceBundle;
-    private URL                _pluginBase;
-
-    private static Logger      _logger;
-    private static Alerts      _alerts;
-
-    /**
-     * The constructor.
-     */
-    public JSFUIPlugin()
-    {
-        super();
-        _plugin = this;
-        try
-        {
-            _resourceBundle = ResourceBundle.getBundle("org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPluginResources");
-        }
-        catch (MissingResourceException x)
-        {
-            _resourceBundle = null;
-        }
-    }
-
-    /**
-     * This method is called upon plug-in activation
-     */
-    public void start(BundleContext context) throws Exception
-    {
-        super.start(context);
-        _alerts = new Alerts(this, _resourceBundle);
-        _logger = JSFUICommonPlugin.getLogger(JSFUIPlugin.class);
-//        _logger.setResourceBundle(_resourceBundle);
-        _pluginBase = getBundle().getEntry("/");
-    }
-
-    /**
-     * get the alerts objects associated with this plugin for alerting the user.
-     * @return the alerts
-     */
-    public static Alerts getAlerts()
-    {
-        return _alerts;
-    }
-
-    /**
-     * This method is called when the plug-in is stopped
-     */
-    public void stop(BundleContext context) throws Exception
-    {
-        super.stop(context);
-    }
-
-    /**
-     * Returns the shared instance.
-     * @return the default plugin
-     */
-    public static JSFUIPlugin getDefault()
-    {
-        return _plugin;
-    }
-
-    /**
-     * Returns the string from the plugin's resource bundle,
-     * or 'key' if not found.
-     * @param key 
-     * @return the resource string for key or 'key' if not found
-     */
-    public static String getResourceString(String key)
-    {
-        ResourceBundle bundle = JSFUIPlugin.getDefault().getResourceBundle();
-        try
-        {
-            return (bundle != null) ? bundle.getString(key) : key;
-        }
-        catch (MissingResourceException e)
-        {
-            return key;
-        }
-    }
-
-    /**
-     * Returns the plugin's resource bundle,
-     * @return the resource bundle
-     */
-    public ResourceBundle getResourceBundle()
-    {
-        return _resourceBundle;
-    }
-
-    /**
-     * Return an image from the path
-     * @param name
-     * @return Image
-     */
-    public Image getImage(String name)
-    {
-        if (name == null)
-        {
-            return null;
-        }
-
-        ImageRegistry images = getImageRegistry();
-        Image image = images.get(name);
-        if (image == null)
-        {
-            try
-            {
-                ImageDescriptor id = ImageDescriptor.createFromURL(new URL(_pluginBase,
-                        IFileFolderConstants.FOLDER_ICONS + "/" + name));
-                images.put(name, id);
-
-                image = images.get(name);
-            }
-            catch (MalformedURLException ee)
-            {
-                _logger.error("Error.JSFUIPlugin", name, ee); //$NON-NLS-2$
-            }
-        }
-        return image;
-    }
-
-    /**
-     * Log message and Throwable by severity.
-     * 
-     * @param severity Severity (use appropriate IStatus constant).
-     * @param message Message to be logged.
-     * @param exception Throwable instance to be logged.
-     */
-    public static void log(int severity, String message, Throwable exception) {
-    	ILog log = getDefault().getLog();
-    	IStatus status = new Status(
-    			severity,
-    			"org.eclipse.jst.pagedesigner.jsf.ui",
-    			message,
-    			exception);
-    	log.log(status);
-    }
-
-    /**
-     * Log message by severity.
-     * 
-     * @param severity Severity (use an IStatus constant).
-     * @param message Message to be logged.
-     */
-    public static void log(int severity, String message) {
-    	ILog log = getDefault().getLog();
-    	IStatus status = new Status(
-    			severity,
-    			"org.eclipse.jst.pagedesigner.jsf.ui",
-    			message);
-    	log.log(status);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIPluginResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIPluginResources.properties
deleted file mode 100644
index b628dc5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIPluginResources.properties
+++ /dev/null
@@ -1,50 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-#DataTable
-ElementEdit.Submenu.DataTable=DataTable
-ElementEdit.Submenu.DataTable.SelectTable=Select Table
-ElementEdit.Submenu.DataTable.InsertColumnBefore=Insert Column Before
-ElementEdit.Submenu.DataTable.InsertColumnAfter=Insert Column After
-ElementEdit.Submenu.DataTable.DeleteColumn=Delete Column
-ElementEdit.Submenu.InsertTableHeader=Insert Table Header
-ElementEdit.Submenu.InsertTableFooter=Insert Table Footer
-ElementEdit.Submenu.DeleteTableHeader=Delete Table Header
-ElementEdit.Submenu.DeleteTableFooter=Delete Table Footer
-ElementEdit.Submenu.InsertColumnHeader=Insert Column Header
-ElementEdit.Submenu.InsertColumnFooter=Insert Column Footer
-ElementEdit.Submenu.DeleteColumnHeader=Delete Column Header
-ElementEdit.Submenu.DeleteColumnFooter=Delete Column Footer
-
-#PanelGrid
-ElementEdit.Submenu.PanelGrid=PanelGrid
-ElementEdit.Submenu.PanelGrid.SelectTable=Select Table
-ElementEdit.Submenu.PanelGrid.InsertRowBefore=Insert Row Before
-ElementEdit.Submenu.PanelGrid.InsertRowAfter=Insert Row After
-ElementEdit.Submenu.PanelGrid.InsertColumnBefore=Insert Column Before
-ElementEdit.Submenu.PanelGrid.InsertColumnAfter=Insert Column After
-ElementEdit.Submenu.PanelGrid.DeleteRow=Delete Row
-ElementEdit.Submenu.PanelGrid.DeleteColumn=Delete Column
-ElementEdit.Submenu.PanelGrid.InsertHeader=Insert Header
-ElementEdit.Submenu.PanelGrid.InsertFooter=Insert Footer
-ElementEdit.Submenu.PanelGird.DeleteHeader=Delete Header
-ElementEdit.Submenu.PanelGrid.DeleteFooter=Delete Footer
-
-ElementEdit.Submenu.JavaNavigation=Java
-ElementEdit.Submenu.JavaNavigation.Binding=Binding
-ElementEdit.Submenu.JavaNavigation.Value=Value
-ElementEdit.Submenu.JavaNavigation.Action=Action
-ElementEdit.Submenu.LoadBundle=Open Properties File
-
-#Warning messages
-Message.Warning.Title=Warning
-Message.Warning.InvalidateExpression=The value is either an invalid Expression or the definition is missing.
-
-Error.JSFUIPlugin=Error in jsf.ui plugin
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIResources.properties
deleted file mode 100644
index 0f86386..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIResources.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 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
-###############################################################################
-MessageTagConverter.defaultValue=Message
-MessageTagConverter.defaultTooltip=Summary
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ActionsResources.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ActionsResources.java
deleted file mode 100644
index 77ee60b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ActionsResources.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ActionsResources
-{
-    private static final String         BUNDLE_NAME     = "org.eclipse.jst.pagedesigner.jsf.ui.actions.ActionsResources"; //$NON-NLS-1$
-
-    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
-
-    private ActionsResources()
-    {
-        // no external instantiation
-    }
-
-    /**
-     * @param key
-     * @return the res bundle string for key or !key! if not found
-     */
-    public static String getString(String key)
-    {
-        try
-        {
-            return RESOURCE_BUNDLE.getString(key);
-        }
-        catch (MissingResourceException e)
-        {
-            return '!' + key + '!';
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ActionsResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ActionsResources.properties
deleted file mode 100644
index 2fa58f6..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, 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
-###############################################################################
-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 131c134..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, null);
-    }
-}
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 2942f28..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", null);
-//        CommonDialogFieldGroup group = new CommonDialogFieldGroup();
-//
-//        AttributeData[] data = createAttributeData();
-//        group.setAttributeData(data);
-//
-//        DialogFieldGroupPage page = new DialogFieldGroupPage("Attribute", group); //$NON-NLS-1$
-//        page.setTitle(ActionsResources.getString("AddAttributeAction.Wizard.NewAttribute")); //$NON-NLS-1$
-//        page.setDescription(ActionsResources.getString("AddAttributeAction.Wizard.Description")); //$NON-NLS-1$
-//        CommonDialogFieldWizard wizard = new CommonDialogFieldWizard(page);
-//        wizard.setWindowTitle(ActionsResources.getString("AddAttributeAction.Wizard.NewAttribute")); //$NON-NLS-1$
-//        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-//        dialog.create();
-//        if (dialog.open() == WizardDialog.OK)
-//        {
-//            group.prepareData();
-//            Map attributesMap = new HashMap();
-//            for (int i = 0; i < data.length; i++)
-//            {
-//                attributesMap.put(data[i].attributeName, data[i].value);
-//            }
-//            AddJSFCoreChildCommand command = new AddJSFCoreChildCommand(this.getParentElement(),
-//                IJSFConstants.TAG_ATTRIBUTE, attributesMap);
-//            command.execute();
-//        }
-    }
-
-//    private AttributeData[] createAttributeData()
-//    {
-//        return new AttributeData[] 
-//        {
-//            new AttributeData(IJMTConstants.URI_JSF_CORE, IJSFConstants.TAG_ATTRIBUTE, IJSFConstants.ATTR_NAME),
-//                new AttributeData(IJMTConstants.URI_JSF_CORE, IJSFConstants.TAG_ATTRIBUTE, IJSFConstants.ATTR_VALUE)
-//        }
-//        ;
-//    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConvertDateTimeAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConvertDateTimeAction.java
deleted file mode 100644
index 6172669..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConvertDateTimeAction.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.AddJSFCoreChildCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddConvertDateTimeAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddConvertDateTimeAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddConvertDateTimeAction.ActionLabel.DateTime"), parentNode); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        AddJSFCoreChildCommand command = new AddJSFCoreChildCommand(this.getParentElement(),
-            IJSFConstants.TAG_CONVERTDATETIME, null);
-        command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConvertNumberAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConvertNumberAction.java
deleted file mode 100644
index af33b52..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConvertNumberAction.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.AddJSFCoreChildCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddConvertNumberAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddConvertNumberAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddConvertNumberAction.ActionLabel.Number"), parentNode); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        AddJSFCoreChildCommand command = new AddJSFCoreChildCommand(this.getParentElement(),
-            IJSFConstants.TAG_CONVERTNUMBER, null);
-        command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConverterAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConverterAction.java
deleted file mode 100644
index 67b2e30..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConverterAction.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.AddJSFCoreChildCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddConverterAction extends JSFAddChildAction
-{
-    String	_converterId;
-
-    /**
-     * @param converterId 
-     * @param parentNode
-     */
-    public AddConverterAction(String converterId, IDOMElement parentNode)
-    {
-        super(converterId, parentNode);
-        this._converterId = converterId;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        Map attributes = new HashMap();
-        attributes.put("converterId", _converterId);
-        AddJSFCoreChildCommand command = new AddJSFCoreChildCommand(this.getParentElement(),
-            IJSFConstants.TAG_CONVERTER, attributes);
-        command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddParamAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddParamAction.java
deleted file mode 100644
index 8cb1a74..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddParamAction.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddParamAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddParamAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddParamAction.ActionLabel.Param"), parentNode); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE,
-                IJSFConstants.TAG_PARAM, new String[] { IJSFConstants.ATTR_NAME, IJSFConstants.ATTR_VALUE});
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddSelectItemAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddSelectItemAction.java
deleted file mode 100644
index c725801..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddSelectItemAction.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddSelectItemAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddSelectItemAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddSelectItemAction.ActionLabel.SelectItem"), parentNode); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE,
-                IJSFConstants.TAG_SELECTITEM, new String[] { IJSFConstants.ATTR_ITEMLABEL, IJSFConstants.ATTR_ITEMVALUE});
-    }
-}
-
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddSelectItemsAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddSelectItemsAction.java
deleted file mode 100644
index c4ae73c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddSelectItemsAction.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 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, null);
-        command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateDoubleRangeAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateDoubleRangeAction.java
deleted file mode 100644
index c6c7855..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateDoubleRangeAction.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddValidateDoubleRangeAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddValidateDoubleRangeAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddValidateDoubleRangeAction.ActionLabel.DoubleRange"), parentNode);  //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE,
-                IJSFConstants.TAG_VALIDATEDOUBLERANGE, new String[] { IJSFConstants.ATTR_MINIMUM,
-                        IJSFConstants.ATTR_MAXIMUM});
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateLengthAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateLengthAction.java
deleted file mode 100644
index b89cf1d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateLengthAction.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddValidateLengthAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddValidateLengthAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddValidateLengthAction.ActionLabel.Length"), parentNode);  //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE,
-                IJSFConstants.TAG_VALIDATELENGTH, new String[] { IJSFConstants.ATTR_MINIMUM,
-                        IJSFConstants.ATTR_MAXIMUM});
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateLongRangeAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateLongRangeAction.java
deleted file mode 100644
index a12ce56..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateLongRangeAction.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddValidateLongRangeAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddValidateLongRangeAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddValidateLongRangeAction.ActionLabel.LongRange"), parentNode); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE,
-                IJSFConstants.TAG_VALIDATELONGRANGE, new String[] { IJSFConstants.ATTR_MINIMUM,
-                        IJSFConstants.ATTR_MAXIMUM});
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidatorAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidatorAction.java
deleted file mode 100644
index 9124e34..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidatorAction.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.AddJSFCoreChildCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddValidatorAction extends JSFAddChildAction
-{
-    String	_validatorId;
-
-    /**
-     * @param validatorId
-     * @param parentNode
-     */
-    public AddValidatorAction(String validatorId, IDOMElement parentNode)
-    {
-        super(validatorId, parentNode);
-        this._validatorId = validatorId;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        Map attributes = new HashMap();
-        attributes.put("validatorId", _validatorId);
-        AddJSFCoreChildCommand command = new AddJSFCoreChildCommand(this.getParentElement(),
-            IJSFConstants.TAG_VALIDATOR, attributes);
-        command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValueChangeListenerAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValueChangeListenerAction.java
deleted file mode 100644
index cb76f44..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValueChangeListenerAction.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddValueChangeListenerAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddValueChangeListenerAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddValueChangeListenerAction.ActionLabel.ValueChangeListener"), parentNode); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE,
-                IJSFConstants.TAG_VALUECHANGELISTENER, new String[] { IJSFConstants.ATTR_TYPE});
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/DeleteHColumnHeaderFooterAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/DeleteHColumnHeaderFooterAction.java
deleted file mode 100644
index 8d6fa01..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/DeleteHColumnHeaderFooterAction.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.DeleteHColumnHeaderFooterRequest;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DeleteHColumnHeaderFooterAction extends Action
-{
-    private Command _command;
-
-    /**
-     * @param text
-     * @param editPart 
-     * @param isHeader 
-     */
-    public DeleteHColumnHeaderFooterAction(String text, EditPart editPart, boolean isHeader)
-    {
-        super(text);
-        DeleteHColumnHeaderFooterRequest req = new DeleteHColumnHeaderFooterRequest(text, isHeader);
-        this._command = editPart.getCommand(req);
-        this.setEnabled(this._command != null && this._command.canExecute());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        _command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/DeleteHeaderFooterAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/DeleteHeaderFooterAction.java
deleted file mode 100644
index 7df470c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/DeleteHeaderFooterAction.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.DeleteHeaderFooterRequest;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DeleteHeaderFooterAction extends Action
-{
-    private Command _command;
-
-    /**
-     * @param text
-     * @param editPart 
-     * @param isHeader 
-     */
-    public DeleteHeaderFooterAction(String text, EditPart editPart, boolean isHeader)
-    {
-        super(text);
-        DeleteHeaderFooterRequest req = new DeleteHeaderFooterRequest(text, isHeader);
-        this._command = editPart.getCommand(req);
-        this.setEnabled(this._command != null && this._command.canExecute());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        _command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ExpressionAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ExpressionAction.java
deleted file mode 100644
index 78f1782..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ExpressionAction.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.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;
-    private int             _type;
-
-    /**
-     * @param type
-     */
-    public ExpressionAction(int type)
-    {
-        _type = type;
-    }
-
-    /**
-     * @param attribute
-     */
-    public void setActionValue(String attribute)
-    {
-        _action = attribute;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IAction#isEnabled()
-     */
-    public boolean isEnabled()
-    {
-        return _project != null && isExpression();
-    }
-
-    private boolean isExpression()
-    {
-        boolean flag = false;
-        if (_action != null)
-        {
-            flag = _action.startsWith("#{") && _action.endsWith("}");//$NON-NLS-1$ $NON-NLS-2$
-        }
-        return flag;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IAction#run()
-     */
-    public void run()
-    {
-        IPageVariablesProvider pageVarProvider = (IPageVariablesProvider) getPage().getActiveEditor().getAdapter(
-                IPageVariablesProvider.class);
-        pageVarProvider.refresh();
-
-        Object result = null;
-        if (_type == METHOD)
-        {
-//            result = VariableResolverUtils.resolveMethodBinding(_action, _project, IWebFrameworkResolver.ACTION_METHOD,                    true);
-        	result = null;
-        }
-        else
-        {
-//            result = VariableResolverUtils.resolveValueBinding(_action, _project, true);
-        	result = null;
-        }
-        if (result == null)
-        {
-            JSFUIPlugin.getAlerts().warning("Message.Warning.Title", "Message.Warning.InvalidateExpression");//$NON-NLS-1$ $NON-NLS-2$
-        }
-    }
-
-    /**
-     * @param projectFor
-     */
-    public void setProject(IProject projectFor)
-    {
-        this._project = projectFor;
-    }
-
-    private IWorkbenchPage getPage()
-    {
-        IWorkbench workbench = PlatformUI.getWorkbench();
-        IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-        return window.getActivePage();
-    }
-
-    /**
-     * @param fileFor
-     */
-    public void setFile(IFile fileFor)
-    {
-        _file = fileFor;
-    }
-
-    /**
-     * @return the file
-     */
-    public IFile getFile()
-    {
-        return _file;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/IJSFCoreSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/IJSFCoreSupport.java
deleted file mode 100644
index 70285ee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/IJSFCoreSupport.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-/**
- * This interface is to provide information of how to enable/disable add
- * jsf core sub element.
- * 
- * As other JSF taglibs that we don't know today may also use jsf core tags inside
- * them, so we may also enable the actions for adding jsf core tags to them. But
- * we need check whether individual JSF core tags are supported.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IJSFCoreSupport
-{
-    /**
-     * actionListener can only be added to those ActionSource component.
-     * @return if is an action source
-     */
-    public boolean isActionSource();
-
-    /**
-     * 
-     * @return true if is a UI component
-     */
-    public boolean isUIComponent();
-
-    /**
-     * converter (convertXXX) can only be added to those ValueHolder
-     * @return true if is a value holder
-     */
-    public boolean isValueHolder();
-
-    /**
-     * validator can only be added to EditableValueHolder
-     * @return true if is an editable value holder
-     */
-    public boolean isEditableValueHolder();
-
-    /**
-     * whether support selectItem and selectItems
-     * @return true if supports the UISelectItem(s) contract
-     */
-    public boolean supportSelectItems();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/InsertHColumnHeaderFooterAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/InsertHColumnHeaderFooterAction.java
deleted file mode 100644
index e177212..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/InsertHColumnHeaderFooterAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.InsertHColumnHeaderFooterRequest;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertHColumnHeaderFooterAction extends Action
-{
-    private Command _command;
-
-    /**
-     * @param text
-     * @param editPart 
-     * @param isHeader 
-     */
-    public InsertHColumnHeaderFooterAction(String text, EditPart editPart, boolean isHeader)
-    {
-        super(text);
-
-        InsertHColumnHeaderFooterRequest req = new InsertHColumnHeaderFooterRequest(text, isHeader);
-        this._command = editPart.getCommand(req);
-        this.setEnabled(this._command != null && this._command.canExecute());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        _command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/InsertHeaderFooterAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/InsertHeaderFooterAction.java
deleted file mode 100644
index f2ac6b8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/InsertHeaderFooterAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.InsertHeaderFooterRequest;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertHeaderFooterAction extends Action
-{
-    private Command _command;
-
-    /**
-     * @param text
-     * @param editPart 
-     * @param isHeader 
-     */
-    public InsertHeaderFooterAction(String text, EditPart editPart, boolean isHeader)
-    {
-        super(text);
-
-        InsertHeaderFooterRequest req = new InsertHeaderFooterRequest(text, isHeader);
-        this._command = editPart.getCommand(req);
-        this.setEnabled(this._command != null && this._command.canExecute());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        _command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFAddActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFAddActionGroup.java
deleted file mode 100644
index bd2ed89..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFAddActionGroup.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFAddActionGroup {
-
-	private final static Action EMPTY_ACTION = new Action() {
-        // TODO: why?
-	};
-
-
-	/**
-	 * @param menu
-	 * @param element
-	 * @param support
-	 */
-	public void fillContextMenu(IMenuManager menu, final IDOMElement element,
-			final IJSFCoreSupport support) {
-        IContributionItem item = menu.find(PageDesignerActionConstants.INSERT_SUBMENU_ID);
-        
-        if (item instanceof IMenuManager)
-        {
-    		final IMenuManager submenu = (IMenuManager) item;
-    		submenu.add(EMPTY_ACTION);
-    		submenu.addMenuListener(new IMenuListener() {
-    			public void menuAboutToShow(IMenuManager manager) {
-    				submenu.removeAll();
-    				addJSFAddItems(submenu, element, support);
-    			}
-    		});
-        }
-		//menu.appendToGroup(PageDesignerActionConstants.GROUP_SPECIAL, submenu);
-	}
-
-	/**
-	 * @param submenu
-	 * @param element
-	 */
-	private void addJSFAddItems(IMenuManager submenu, IDOMElement element,
-			IJSFCoreSupport support) {
-		AddActionListenerAction actionListenerAction = new AddActionListenerAction(
-				element);
-		actionListenerAction.setEnabled(support.isActionSource());
-		submenu.add(actionListenerAction);
-
-		AddAttributeAction attrAction = new AddAttributeAction(element);
-		attrAction.setEnabled(support.isUIComponent());
-		submenu.add(attrAction);
-
-		IProject prj = null;
-		IFile file = StructuredModelUtil.getFileFor(element.getModel());
-		if (file != null) {
-			prj = file.getProject();
-		}
-
-		IMenuManager converterMenu = new MenuManager(ActionsResources
-				.getString("Submenu.JSFAdd.Converter"));//$NON-NLS-1$
-		boolean supportConverter = support.isValueHolder();
-		String[] converterIds = getRegisteredConverterIds(prj);
-		if (converterIds != null && converterIds.length > 0) {
-			for (int i = 0; i < converterIds.length; i++) {
-				AddConverterAction action = new AddConverterAction(
-						converterIds[i], element);
-				action.setEnabled(supportConverter);
-				converterMenu.add(action);
-			}
-			converterMenu.add(new Separator());
-		}
-		AddConvertDateTimeAction dateTimeAction = new AddConvertDateTimeAction(
-				element);
-		dateTimeAction.setEnabled(supportConverter);
-		converterMenu.add(dateTimeAction);
-		AddConvertNumberAction numberAction = new AddConvertNumberAction(
-				element);
-		numberAction.setEnabled(supportConverter);
-		converterMenu.add(numberAction);
-		submenu.add(converterMenu);
-
-		AddParamAction addParamAction = new AddParamAction(element);
-		addParamAction.setEnabled(support.isUIComponent());
-		submenu.add(addParamAction);
-
-		AddSelectItemAction selectItemAction = new AddSelectItemAction(element);
-		selectItemAction.setEnabled(support.supportSelectItems());
-		submenu.add(selectItemAction);
-
-		AddSelectItemsAction selectItemsAction = new AddSelectItemsAction(
-				element);
-		selectItemsAction.setEnabled(support.supportSelectItems());
-		submenu.add(selectItemsAction);
-
-		IMenuManager validatorMenu = new MenuManager(ActionsResources
-				.getString("Submenu.JSFAdd.Validators"));//$NON-NLS-1$
-		boolean supportValidator = support.isEditableValueHolder();
-		String[] validatorIds = getRegisteredValidatorIds(prj);
-		if (validatorIds != null && validatorIds.length > 0) {
-			for (int i = 0; i < validatorIds.length; i++) {
-				AddValidatorAction action = new AddValidatorAction(
-						validatorIds[i], element);
-				action.setEnabled(supportValidator);
-				validatorMenu.add(action);
-			}
-			validatorMenu.add(new Separator());
-		}
-		AddValidateDoubleRangeAction doubleRangeAction = new AddValidateDoubleRangeAction(
-				element);
-		doubleRangeAction.setEnabled(supportValidator);
-		validatorMenu.add(doubleRangeAction);
-		AddValidateLengthAction lengthAction = new AddValidateLengthAction(
-				element);
-		lengthAction.setEnabled(supportValidator);
-		validatorMenu.add(lengthAction);
-		AddValidateLongRangeAction longRangeAction = new AddValidateLongRangeAction(
-				element);
-		longRangeAction.setEnabled(supportValidator);
-		validatorMenu.add(longRangeAction);
-		submenu.add(validatorMenu);
-
-		AddValueChangeListenerAction valueChangeAction = new AddValueChangeListenerAction(
-				element);
-		valueChangeAction.setEnabled(support.isEditableValueHolder());
-		submenu.add(valueChangeAction);
-	}
-
-	/**
-	 * @return
-	 */
-	private String[] getRegisteredValidatorIds(IProject project) 
-    {
-        String[] result = null;
-        
-        JSFAppConfigManager appConfigMgr = 
-            JSFAppConfigManager.getInstance(project);
-
-        // getInstance may return null if there is a problem
-        if (appConfigMgr != null)
-        {
-            final List list = appConfigMgr.getValidators();
-            result = new String[list.size()];
-            int i = 0;
-            for (final Iterator it = list.iterator(); it.hasNext();) 
-            {
-                ValidatorType validator = (ValidatorType) it.next();
-                ValidatorIdType validatorId = validator.getValidatorId();
-                if (validatorId != null)
-                    result[i++] = validatorId.getTextContent().trim();
-            }
-        }
-        return result;
-	}
-
-	/**
-	 * @return
-	 */
-	private String[] getRegisteredConverterIds(IProject project) 
-    {
-        String[] result = null;
-        
-        JSFAppConfigManager appConfigMgr = 
-            JSFAppConfigManager.getInstance(project);
-
-        // getInstance may return null if there is a problem
-        if (appConfigMgr != null)
-        {
-            final List list = appConfigMgr.getConverters();
-    		result = new String[list.size()];
-            int i = 0;
-    		for (final Iterator it = list.iterator(); it.hasNext();) 
-            {
-    			ConverterType converter = (ConverterType) it.next();
-    			ConverterIdType converterId = converter.getConverterId();
-    			if (converterId != null)
-    				result[i++] = converterId.getTextContent().trim();
-    		}
-        }
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFAddChildAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFAddChildAction.java
deleted file mode 100644
index 058f67e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFAddChildAction.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * Classes in this package are related to JSF operation. 
- * 
- * @author mengbo
- * @version 1.5
- */
-public class JSFAddChildAction extends Action
-{
-    private IDOMElement _parentEle;
-
-    /**
-     * @param text 
-     * @param parentNode 
-     */
-    public JSFAddChildAction(String text, IDOMElement parentNode)
-    {
-        super(text);
-        this._parentEle = parentNode;
-    }
-
-    /**
-     * @return the parent element
-     */
-    public IDOMElement getParentElement()
-    {
-        return _parentEle;
-    }
-
-    /**
-     * @return the active shell
-     */
-    public Shell getShell()
-    {
-        IWorkbench bench = PlatformUI.getWorkbench();
-        if (bench != null)
-        {
-            IWorkbenchWindow window = bench.getActiveWorkbenchWindow();
-            if (window == null)
-            {
-                IWorkbenchWindow[] windows = bench.getWorkbenchWindows();
-                if (windows != null && windows.length > 0)
-                {
-                    window = windows[0];
-                }
-            }
-            if (window != null)
-            {
-                return window.getShell();
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFCommandLinkCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFCommandLinkCreator.java
deleted file mode 100644
index 41d0a3a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFCommandLinkCreator.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.core.resources.IFile;
-import org.eclipse.gef.EditPart;
-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;
-
-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.utils.StructuredModelUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFCommandLinkCreator extends AbstractLinkCreator
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.actions.link.ILinkCreator#makeLinkElement(org.eclipse.gef.EditPart, org.eclipse.jst.pagedesigner.viewer.DesignRange)
-     */
-    public Element makeLinkElement(EditPart part, DesignRange range)
-    {
-        if (part instanceof TextEditPart)
-        {
-            Text middleNode = LinkUtil.splitDomText(part, range);
-            EditPart parent = part.getParent();
-            Node parentNode = (Node) parent.getModel();
-            Document doc = (parentNode instanceof Document) ? (Document) parentNode : (parentNode.getOwnerDocument());
-
-            IDOMModel model = ((IDOMNode) parentNode).getModel();
-            String prefix = JSPUtil.getOrCreatePrefix(model, ITLDConstants.URI_JSF_HTML, "h");
-            JSPUtil.getOrCreatePrefix(model, ITLDConstants.URI_JSF_CORE, "f");
-
-            Element commandLink = doc.createElement(IJSFConstants.TAG_COMMANDLINK);
-            commandLink.setPrefix(prefix);
-            Element outputText = doc.createElement(IJSFConstants.TAG_OUTPUTTEXT);
-            outputText.setPrefix(prefix);
-            outputText.setAttribute(IJSFConstants.ATTR_VALUE, middleNode.getNodeValue());
-            commandLink.appendChild(outputText);
-
-            parentNode.replaceChild(commandLink, middleNode);
-            return commandLink;
-        }
-
-        return null;
-
-    }
-
-
-    /**
-     * @param range
-     * @return true if can execute
-     */
-    public boolean canExecute(DesignRange range)
-    {
-        DesignPosition startPosition = range.getStartPosition();
-        EditPart part = startPosition.getContainerPart();
-        IDOMNode node = (IDOMNode) part.getModel();
-        IDOMModel model = node.getModel();
-        IFile openedFile = StructuredModelUtil.getFileFor(model);
-        boolean canSupportJSF = JSPUtil.supportTaglib(ITLDConstants.URI_JSF_HTML, openedFile);
-        if (!canSupportJSF)
-        {
-            return false;
-        }
-
-        return super.canExecute(range);
-    }
-
-    public String getSourcePreview(EditPart part, DesignRange range)
-    {
-        if (part instanceof TextEditPart)
-        {
-            TextEditPart textPart = (TextEditPart) part;
-            int[] offsets = textPart.getSelectedRange();
-
-            String displayData = textPart.getTextData();
-            String linkExp = displayData.substring(offsets[0], offsets[1]);
-
-            StringBuffer sb = new StringBuffer();
-            sb.append("<h:commandLink>\n<h:outputText value=\"");
-            sb.append(linkExp);
-            sb.append("\">");
-            sb.append("</h:outputText>\n</h:commandLink>");
-            return sb.toString();
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFNavigationGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFNavigationGroup.java
deleted file mode 100644
index 8f2e179..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(ExpressionAction.METHOD);
-            action.setText(JSFUIPlugin.getResourceString("ElementEdit.Submenu.JavaNavigation.Action"));//$NON-NLS-1$
-            action.setActionValue(ele.getAttribute(ICSSPropertyID.ATTR_ACTION));
-            if (ele != null)
-            {
-                IDOMModel model = ele.getModel();
-                action.setProject(StructuredModelUtil.getProjectFor(model));
-                action.setFile(StructuredModelUtil.getFileFor(model));
-            }
-            submenu.add(action);
-        }
-        if (support.isValueHolder())
-        {
-            ExpressionAction action = new ExpressionAction(ExpressionAction.VARIABLE);
-            action.setText(JSFUIPlugin.getResourceString("ElementEdit.Submenu.JavaNavigation.Value"));//$NON-NLS-1$
-            action.setActionValue(ele.getAttribute(ICSSPropertyID.ATTR_VALUE));
-            if (ele != null)
-            {
-                IDOMModel model = ele.getModel();
-                action.setProject(StructuredModelUtil.getProjectFor(model));
-                action.setFile(StructuredModelUtil.getFileFor(model));
-            }
-            submenu.add(action);
-        }
-
-        {
-            ExpressionAction action = new ExpressionAction(ExpressionAction.VARIABLE);
-            action.setText(JSFUIPlugin.getResourceString("ElementEdit.Submenu.JavaNavigation.Binding"));//$NON-NLS-1$
-            action.setActionValue(ele.getAttribute(ICSSPropertyID.ATTR_BINDING));
-            if (ele != null)
-            {
-                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 036f445..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFOutputLinkCreator.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.actions;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.gef.EditPart;
-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;
-
-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.utils.StructuredModelUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFOutputLinkCreator extends AbstractLinkCreator
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.actions.link.ILinkCreator#makeLinkElement(org.eclipse.gef.EditPart, org.eclipse.jst.pagedesigner.viewer.DesignRange)
-     */
-    public Element makeLinkElement(EditPart part, DesignRange range)
-    {
-        if (part instanceof TextEditPart)
-        {
-            Text middleNode = LinkUtil.splitDomText(part, range);
-            EditPart parent = part.getParent();
-            Node parentNode = (Node) parent.getModel();
-            Document doc = (parentNode instanceof Document) ? (Document) parentNode : (parentNode.getOwnerDocument());
-
-            IDOMModel model = ((IDOMNode) parentNode).getModel();
-            String prefix = JSPUtil.getOrCreatePrefix(model, ITLDConstants.URI_JSF_HTML, "h");
-            String fPrefix = JSPUtil.getOrCreatePrefix(model, ITLDConstants.URI_JSF_CORE, "f");
-
-            Element outputLink = doc.createElement(IJSFConstants.TAG_OUTPUTLINK);
-            outputLink.setPrefix(prefix);
-            Element verbatim = doc.createElement(IJSFConstants.TAG_VERBATIM);
-            verbatim.setPrefix(fPrefix);
-            Text value = doc.createTextNode(middleNode.getNodeValue());
-            verbatim.appendChild(value);
-            outputLink.appendChild(verbatim);
-
-            parentNode.replaceChild(outputLink, middleNode);
-            return outputLink;
-        }
-
-        return null;
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.actions.link.AbstractLinkCreator#canExecute(org.eclipse.jst.pagedesigner.viewer.DesignRange)
-     */
-    public boolean canExecute(DesignRange range)
-    {
-        DesignPosition startPosition = range.getStartPosition();
-        EditPart part = startPosition.getContainerPart();
-        IDOMNode node = (IDOMNode) part.getModel();
-        IDOMModel model = node.getModel();
-        IFile openedFile = StructuredModelUtil.getFileFor(model);
-        if (openedFile == null)
-        {
-            return false;
-        }
-        boolean canSupportJSF = JSPUtil.supportTaglib(ITLDConstants.URI_JSF_HTML, openedFile);
-        if (!canSupportJSF)
-        {
-            return false;
-        }
-
-        return super.canExecute(range);
-    }
-
-    public String getSourcePreview(EditPart part, DesignRange range)
-    {
-        if (part instanceof TextEditPart)
-        {
-            TextEditPart textPart = (TextEditPart) part;
-            int[] offsets = textPart.getSelectedRange();
-            String displayData = textPart.getTextData();
-            String linkExp = displayData.substring(offsets[0], offsets[1]);
-
-            StringBuffer sb = new StringBuffer();
-            sb.append("<h:outputLink>\n<f:verbatim>");
-            sb.append(linkExp);
-            sb.append("</f:verbatim>\n</h:outputLink>");
-            return sb.toString();
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/PageFlowContributor.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/PageFlowContributor.java
deleted file mode 100644
index f43db4f..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);
-        }
-    }
-
-    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 9cdae9b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/AttributeData.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.attributegroup;
-
-import java.util.HashMap;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-class AttributeData
-{
-    /**
-     * possible key in the param map
-     */
-    static final String SuperType = "superTyle";
-    /**
-     * possible key in the param map
-     */
-    static final String Project = "project";
-
-    private final String uri;
-    private final String elementName;
-    private final String attributeName;
-    private Object value;
-    private HashMap paramMap; // null; lazy initialized
-
-    /**
-     * @param uri
-     * @param elementName
-     * @param name
-     */
-    public AttributeData(String uri,String elementName,String name)
-    {
-        this.uri = uri;
-        this.attributeName = name;
-        this.elementName = elementName;
-    }
-
-    /**
-     * @return the uri
-     */
-    public String getUri() {
-        return uri;
-    }
-
-    /**
-     * @return the element name
-     */
-    public String getElementName() {
-        return elementName;
-    }
-
-    /**
-     * @return the attribute name
-     */
-    public String getAttributeName() {
-        return attributeName;
-    }
-
-    /**
-     * @return the value
-     */
-    public Object getValue() {
-        return value;
-    }
-
-    /**
-     * @param value
-     */
-    public void setValue(Object value) {
-        this.value = value;
-    }
-
-    /**
-     * @return the param map
-     */
-    public HashMap getParamMap() 
-    {
-        if (paramMap == null)
-        {
-            paramMap = new HashMap();
-        }
-        return paramMap;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/CommonDialogFieldGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/CommonDialogFieldGroup.java
deleted file mode 100644
index 29ca67a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/CommonDialogFieldGroup.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.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
- */
-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.prepareDialogFiledValue(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.setDialogFiledValue(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 0afbd8a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/DialogFieldFactory.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.jsf.ui.attributegroup;
-
-import org.eclipse.core.resources.IProject;
-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.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.jst.pagedesigner.meta.ICMRegistry;
-import org.eclipse.jst.pagedesigner.meta.IElementDescriptor;
-import org.eclipse.jst.pagedesigner.meta.IValueType;
-import org.eclipse.jst.pagedesigner.meta.internal.CMRegistry;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DialogFieldFactory
-{
-    /**
-     * @param data
-     * @return the dialog field for data
-     */
-    public static DialogField getDialogField(AttributeData data)
-    {
-        IAttributeDescriptor descriptor = getAttributeDescriptor(data.getUri(), data.getElementName(), data.getAttributeName());
-        if(descriptor != null)
-        {
-            String type = descriptor.getValueType();
-            if (IValueType.CLASSNAME.equalsIgnoreCase(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();
-    }
-
-    private static IAttributeDescriptor getAttributeDescriptor(String uri, String elementName, String attributeName)
-    {
-        ICMRegistry registry = CMRegistry.getInstance();
-        IElementDescriptor elementDescriptor = registry.getElementDescriptor(uri, elementName);
-        return elementDescriptor.getAttributeDescriptor(attributeName);
-    }
-
-    /**
-     * @param field
-     * @param value
-     */
-    public static void setDialogFiledValue(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 pair
-     */
-    public static void prepareDialogFiledValue(DialogField field, AttributeData pair)
-    {
-        if (field instanceof StringDialogField)
-        {
-            pair.setValue(((StringDialogField) field).getText());
-        }
-    }
-
-    /**
-     * @param data
-     * @return the dialog field label for data
-     */
-    public static String getDialogFieldLabel(AttributeData data)
-    {
-        String name = data.getAttributeName();
-        int gap = 'a' - 'A';//$NON-NLS-1$ //$NON-NLS-2$
-        if(name != null)
-        {
-            char[] chars = name.toCharArray();
-            char[] newChars = new char[chars.length*2];
-            if(chars.length > 0)
-            {
-                newChars[0] = chars[0] >= 'a' ? (char)(chars[0] - gap) : chars[0];//$NON-NLS-1$
-            }
-            int newPos = 1;
-            for(int i=1; i<chars.length; i++,newPos++)
-            {
-                if(chars[i] >= 'A' && chars[i] <= 'Z')//$NON-NLS-1$ //$NON-NLS-2$
-                {
-                    newChars[newPos++] = ' ';//$NON-NLS-1$
-                }
-                newChars[newPos] = chars[i];
-            }
-            char[] labelChars = new char[newPos + 1];
-            System.arraycopy(newChars,0,labelChars,0,newPos);
-            labelChars[newPos] = ':';//$NON-NLS-1$
-            return new String(labelChars);
-        }
-        return "";//$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/celleditors/ConverterValidatorIdDialogField.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/celleditors/ConverterValidatorIdDialogField.java
deleted file mode 100644
index 07c7ce3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/celleditors/ConverterValidatorIdDialogField.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.jsf.ui.celleditors;
-
-import java.util.Arrays;
-
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ComboDialogField;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
-import org.eclipse.swt.SWT;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ConverterValidatorIdDialogField extends ComboDialogField implements IElementContextable
-{
-    private String _elementId = "";
-
-    /**
-     * The default constructor
-     */
-    public ConverterValidatorIdDialogField()
-    {
-        super(SWT.NONE);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable#setElementContext(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode, org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement)
-     */
-    public void setElementContext(IDOMNode ancester, IDOMElement element)
-    {
-        String[] results = null;
-        if ("validator-id".equalsIgnoreCase(_elementId))
-        {
-            //results = FacesUtil.getRegisteredConverterIds(project);
-        	
-        }
-        else
-        {
-            // results = FacesUtil.getRegisteredValidatorIds(project);
-        }
-        if (results != null)
-        {
-            Arrays.sort(results);
-            setItems(results);
-        }
-        else
-        {
-            setItems(new String[0]);
-        }
-    }
-
-    /**
-     * @return the element id
-     */
-    public String getElementId()
-    {
-        return _elementId;
-    }
-
-    /**
-     * Set the element id
-     * 
-     * @param elementId
-     */
-    public void setElementId(String elementId)
-    {
-        this._elementId = elementId;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/celleditors/JSFAttributeCellEditorFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/celleditors/JSFAttributeCellEditorFactory.java
deleted file mode 100644
index e9931e6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/celleditors/JSFAttributeCellEditorFactory.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.jsf.ui.celleditors;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.pagedesigner.meta.IAttributeCellEditorFactory;
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.jst.pagedesigner.properties.celleditors.LabeledComboBoxCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFAttributeCellEditorFactory implements IAttributeCellEditorFactory
-{
-    private static final String CONVERTERID = "converterId"; //$NON-NLS-1$
-    private static final String VALIDATORID = "validatorId"; //$NON-NLS-1$
-
-    /**
-     * The constructor
-     */
-    public JSFAttributeCellEditorFactory()
-    {
-        super();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.meta.IAttributeCellEditorFactory#createCellEditor(org.eclipse.swt.widgets.Composite, org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor, org.w3c.dom.Element)
-     */
-    public CellEditor createCellEditor(Composite parent, IAttributeDescriptor attr, Element element)
-    {
-        String type = attr.getValueType();
-        String[] results = null;
-        if (type.equalsIgnoreCase(CONVERTERID))
-        {
-        	// XXX
-            // results = FacesUtil.getRegisteredConverterIds(project);
-            Map map = new HashMap();
-            if (results != null)
-            {
-                for (int i = 0; i < results.length; i++)
-                {
-                    map.put(results[i], results[i]);
-                }
-            }
-            return LabeledComboBoxCellEditor.newInstance(parent, map, SWT.NONE);
-        }
-        else if (type.equalsIgnoreCase(VALIDATORID))
-        {
-        	// XXX
-            // results = FacesUtil.getRegisteredValidatorIds(project);
-            Map map = new HashMap();
-            if (results != null)
-            {
-                for (int i = 0; i < results.length; i++)
-                {
-                    map.put(results[i], results[i]);
-                }
-            }
-            return LabeledComboBoxCellEditor.newInstance(parent, map, SWT.NONE);
-        }
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.meta.IAttributeCellEditorFactory#createDialogField(org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor, org.w3c.dom.Element, org.w3c.dom.Element)
-     */
-    public DialogField createDialogField(IAttributeDescriptor attr)
-    {
-        String type = attr.getValueType();
-
-        if (type.equalsIgnoreCase(CONVERTERID))
-        {
-            ConverterValidatorIdDialogField dialogField = new ConverterValidatorIdDialogField();
-            dialogField.setElementId("converter-id");
-            dialogField.setRequired(attr.isRequired());
-            dialogField.setToolTip(attr.getDescription());
-            return dialogField;
-        }
-        else if (type.equalsIgnoreCase(VALIDATORID))
-        {
-            ConverterValidatorIdDialogField dialogField = new ConverterValidatorIdDialogField();
-            dialogField.setElementId("validator-id");
-            dialogField.setRequired(attr.isRequired());
-            dialogField.setToolTip(attr.getDescription());
-            return dialogField;
-        }
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.meta.IAttributeCellEditorFactory#getSupportedValueTypes()
-     */
-    public String[] getSupportedValueTypes()
-    {
-        return new String[] { CONVERTERID, VALIDATORID};
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/AddJSFCoreChildCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/AddJSFCoreChildCommand.java
deleted file mode 100644
index 70eec64..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/AddJSFCoreChildCommand.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddJSFCoreChildCommand extends DesignerCommand
-{
-    // either use single name/value pair
-    private String     _attrName;
-    private String     _attrValue;
-    // or use a map.
-    private Map        _attrMap;
-
-    private String     _coreChildLocalName;
-    private IDOMElement _parent;
-
-    /**
-     * @param parent 
-     * @param coreChildLocalName 
-     * @param attributes 
-     */
-    public AddJSFCoreChildCommand(IDOMElement parent, String coreChildLocalName, Map attributes)
-    {
-        super("", parent); //$NON-NLS-1$
-        StringBuffer buffer = new StringBuffer(CommandResources.getString("AddJSFCoreChildCommand.Label.Add")); //$NON-NLS-1$
-        if(coreChildLocalName != null && coreChildLocalName.length() > 0)
-        {
-            buffer.append(coreChildLocalName.substring(0,1).toUpperCase());
-            buffer.append(coreChildLocalName.substring(1));
-        }
-        setLabel(buffer.toString());
-        this._parent = parent;
-        this._coreChildLocalName = coreChildLocalName;
-        this._attrMap = attributes;
-    }
-
-    /**
-     * @param parent 
-     * @param coreChildLocalName 
-     * @param aname 
-     * @param avalue 
-     */
-    public AddJSFCoreChildCommand(IDOMElement parent, String coreChildLocalName, String aname, String avalue)
-    {
-        super("", parent); //$NON-NLS-1$
-        StringBuffer buffer = new StringBuffer(CommandResources.getString("AddJSFCoreChildCommand.Label.Add")); //$NON-NLS-1$
-        if(coreChildLocalName != null && coreChildLocalName.length() > 0)
-        {
-            buffer.append(coreChildLocalName.substring(0,1).toUpperCase());
-            buffer.append(coreChildLocalName.substring(1));
-        }
-        setLabel(buffer.toString());
-        this._parent = parent;
-        this._coreChildLocalName = coreChildLocalName;
-        this._attrName = aname;
-        this._attrValue = avalue;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(this.getModel(), ITLDConstants.URI_JSF_CORE, "f"); //$NON-NLS-1$
-        String tag = _coreChildLocalName;
-        Element child = _parent.getOwnerDocument().createElement(tag);
-        child.setPrefix(prefix);
-        if (_attrMap != null)
-        {
-            for (Iterator iter = _attrMap.keySet().iterator(); iter.hasNext();)
-            {
-                String key = (String) iter.next();
-                String value = (String) _attrMap.get(key);
-
-                child.setAttribute(key, value);
-            }
-        }
-        if (_attrName != null)
-        {
-            child.setAttribute(_attrName, _attrValue);
-        }
-
-        _parent.appendChild(child);
-        formatNode(child);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(_parent);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/CommandResources.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/CommandResources.java
deleted file mode 100644
index 11e8976..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/CommandResources.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public final class CommandResources
-{
-    private static final String         BUNDLE_NAME     = "org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.CommandResources"; //$NON-NLS-1$
-
-    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
-
-    private CommandResources()
-    {
-        // no external instantiation
-    }
-
-    /**
-     * @param key
-     * @return the resource for key or !key! if not found
-     */
-    public static String getString(String key)
-    {
-        try
-        {
-            return RESOURCE_BUNDLE.getString(key);
-        }
-        catch (MissingResourceException e)
-        {
-            return '!' + key + '!';
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/CommandResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/CommandResources.properties
deleted file mode 100644
index fbcd78b..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, 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
-###############################################################################
-AddJSFCoreChildCommand.Label.Add=Add
-DataTableDeleteColumnCommand.Label.DeleteColumn=Delete Column
-DataTableDeleteHeaderCommand.Label.DeleteHeader=Delete Header
-DataTableDeleteHeaderCommand.Label.DeleteFooter=Delete Footer
-DataTableInsertColumnCommand.Label.InsertColumn=Insert Column
-DataTableInsertHeaderCommand.Label.InsertHeader=Insert Header
-DataTableInsertHeaderCommand.Label.InsertFooter=Insert Footer
-DataTableInsertColumnHeaderCommand.Label.InsertHeader=Insert Header
-DataTableInsertColumnHeaderCommand.Label.InsertFooter=Insert Footer
-DataTableDeleteColumnHeaderCommand.Label.DeleteColumnHeader=Delete Column Header
-DataTableDeleteColumnHeaderCommand.Label.DeleteColumnFooter=Delete Column Footer
-PanelGridDeleteColumnCommand.Label.DeleteColumn=Delete Column
-PanelGridInsertColumnCommand.Label.InsertColumn=Insert Column
-PanelGridInsertFooterCommand.Label.InsertFooter=Insert Footer
-PanelGridInsertHeaderCommand.Label.InsertHeader=Insert Header
-PanelGridDeleteRowCommand.Label.DeleteRow=Delete Row
-PanelGridInsertRowCommand.Label.InsertRow=Insert Row
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteColumnCommand.java
deleted file mode 100644
index 12dce24..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteColumnCommand.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-
-/**
- * Delete a column from dataTable.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DataTableDeleteColumnCommand extends DesignerCommand
-{
-
-    private Element _dataTable;
-    private int     _index;
-
-    /**
-     * @param viewer
-     * @param dataTable 
-     * @param columnIndex 
-     */
-    public DataTableDeleteColumnCommand(IHTMLGraphicalViewer viewer, Element dataTable, int columnIndex)
-    {
-        super(CommandResources.getString("DataTableDeleteColumnCommand.Label.DeleteColumn"), viewer); //$NON-NLS-1$
-        this._dataTable = dataTable;
-        this._index = columnIndex;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        if (this._index < 0)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        NodeList children = _dataTable.getChildNodes();
-        int index = 0;
-        for (int i = 0, size = children.getLength(); i < size; i++)
-        {
-            Node node = children.item(i);
-            if (JSFDOMUtil.isHColumn(node))
-            {
-                if (index++ == this._index)
-                {
-                    _dataTable.removeChild(node);
-                    return;
-                }
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(_dataTable);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteColumnHeaderCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteColumnHeaderCommand.java
deleted file mode 100644
index c16d4eb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteColumnHeaderCommand.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DataTableDeleteColumnHeaderCommand extends DesignerCommand
-{
-    boolean         _header;   // true means header, false means footer.
-    private Element _dataTable;
-
-    /**
-     * @param viewer
-     * @param dataTable 
-     * @param header 
-     */
-    public DataTableDeleteColumnHeaderCommand(IHTMLGraphicalViewer viewer, Element dataTable, boolean header)
-    {
-        super(header ? CommandResources.getString("DataTableDeleteColumnHeaderCommand.Label.DeleteColumnHeader") : //$NON-NLS-1$
-        CommandResources.getString("DataTableDeleteColumnHeaderCommand.Label.DeleteColumnFooter"), viewer); //$NON-NLS-1$ 
-        this._header = header;
-        this._dataTable = dataTable;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        int num = 0;
-        NodeList children = _dataTable.getChildNodes();
-        for (int i = 0, size = children.getLength(); i < size; i++)
-        {
-            Node node = children.item(i);
-            if (JSFDOMUtil.isHColumn(node))
-            {
-                Element column = (Element) node;
-                if (hasHeader(column))
-                {
-                    num++;
-                    break;
-                }
-            }
-        }
-        if (num == 0)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        NodeList children = _dataTable.getChildNodes();
-        for (int i = 0, size = children.getLength(); i < size; i++)
-        {
-            Node node = children.item(i);
-            if (JSFDOMUtil.isHColumn(node))
-            {
-                Element column = (Element) node;
-                if (hasHeader(column))
-                {
-                    Element hf = JSFDOMUtil.findFacet(column, _header ? "header" : "footer"); //$NON-NLS-1$ //$NON-NLS-2$
-                    column.removeChild(hf);
-                }
-            }
-        }
-        formatNode(this._dataTable);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(_dataTable);
-    }
-
-    /**
-     * @param column
-     * @param _header2
-     * @return
-     */
-    private boolean hasHeader(Element column)
-    {
-        return JSFDOMUtil.findFacet(column, _header ? "header" : "footer") != null; //$NON-NLS-1$ //$NON-NLS-2$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteHeaderCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteHeaderCommand.java
deleted file mode 100644
index 44dfff2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteHeaderCommand.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DataTableDeleteHeaderCommand extends DesignerCommand
-{
-    /**
-     * true means header,false means footer
-     */
-    boolean         _isHeader;
-    private Element _dataTable;
-
-    /**
-     * @param viewer
-     * @param dataTable
-     * @param isHeader
-     */
-    public DataTableDeleteHeaderCommand(IHTMLGraphicalViewer viewer, Element dataTable, boolean isHeader)
-    {
-        super(isHeader ? CommandResources.getString("DataTableDeleteHeaderCommand.Label.DeleteHeader") : //$NON-NLS-1$
-        CommandResources.getString("DataTableDeleteHeaderCommand.Label.DeleteFooter"), viewer); //$NON-NLS-1$ 
-        this._isHeader = isHeader;
-        this._dataTable = dataTable;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        if (this._isHeader)
-        {
-            boolean hasHeader = (JSFDOMUtil.findFacet(this._dataTable, "header") != null); //$NON-NLS-1$
-            if (!hasHeader)
-            {
-                return false;
-            }
-        }
-        else
-        {
-            boolean hasFooter = (JSFDOMUtil.findFacet(this._dataTable, "footer") != null); //$NON-NLS-1$
-            if (!hasFooter)
-            {
-                return false;
-            }
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        String type = (this._isHeader) ? "header" : "footer"; //$NON-NLS-1$ //$NON-NLS-2$
-        Element ele = JSFDOMUtil.findFacet(this._dataTable, type);
-        if (ele != null)
-        {
-            this._dataTable.removeChild(ele);
-        }
-        formatNode(this._dataTable);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(_dataTable);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertColumnCommand.java
deleted file mode 100644
index b5c7d0c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertColumnCommand.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * Insert a column into dataTable.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DataTableInsertColumnCommand extends DesignerCommand
-{
-    Element _dataTable;
-    Element _child;
-    int     _index;
-
-    /**
-     * 
-     * @param viewer
-     * @param dataTable
-     * @param index 0 means before the first column.
-     */
-    public DataTableInsertColumnCommand(IHTMLGraphicalViewer viewer, Element dataTable, int index)
-    {
-        super(CommandResources.getString("DataTableInsertColumnCommand.Label.InsertColumn"), viewer); //$NON-NLS-1$
-        this._dataTable = dataTable;
-        this._index = index;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        if (this._index < 0)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_HTML, "h"); //$NON-NLS-1$
-        _child = _dataTable.getOwnerDocument().createElement(prefix + ":column"); //$NON-NLS-1$
-
-        createHeaderFooter(_child);
-        NodeList children = _dataTable.getChildNodes();
-        int count = 0;
-        for (int i = 0, size = children.getLength(); i < size; i++)
-        {
-            Node node = children.item(i);
-            if (JSFDOMUtil.isHColumn(node))
-            {
-                if (_index == count)
-                {
-                    _dataTable.insertBefore(_child, node);
-                    return;
-                }
-                count++;
-            }
-        }
-        _dataTable.insertBefore(_child, null);
-        formatNode(this._child);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(_dataTable);
-    }
-
-    /**
-     * check whether the datatable already have header and footer, if yes,
-     * then also create for this column
-     * 
-     * @param column
-     */
-    private void createHeaderFooter(Element column)
-    {
-        boolean hasHeader = false;
-        boolean hasFooter = false;
-        NodeList children = _dataTable.getChildNodes();
-        for (int i = 0, size = children.getLength(); i < size; i++)
-        {
-            Node node = children.item(i);
-            if (JSFDOMUtil.isHColumn(node))
-            {
-                if (!hasHeader && JSFDOMUtil.findFacet((Element) node, "header") != null) //$NON-NLS-1$
-                {
-                    hasHeader = true;
-                }
-                if (!hasFooter && JSFDOMUtil.findFacet((Element) node, "footer") != null) //$NON-NLS-1$
-                {
-                    hasFooter = true;
-                }
-            }
-        }
-        if (hasHeader)
-        {
-            Element facet = createFacet();
-            facet.setAttribute("name", "header"); //$NON-NLS-1$ //$NON-NLS-2$
-            Element ele = createDefaultElement();
-            facet.appendChild(ele);
-            column.appendChild(facet);
-        }
-        if (hasFooter)
-        {
-            Element facet = createFacet();
-            facet.setAttribute("name", "footer"); //$NON-NLS-1$ //$NON-NLS-2$
-            Element ele = createDefaultElement();
-            facet.appendChild(ele);
-            column.appendChild(facet);
-        }
-    }
-
-    /**
-     * @return
-     */
-    private Element createFacet()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_CORE, "f"); //$NON-NLS-1$
-        Element ele = _dataTable.getOwnerDocument().createElement(IJSFConstants.TAG_FACET);
-        ele.setPrefix(prefix);
-        return ele;
-    }
-
-    private Element createDefaultElement()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_HTML, "h"); //$NON-NLS-1$
-        Element ele = _dataTable.getOwnerDocument().createElement(IJSFConstants.TAG_OUTPUTTEXT);
-        ele.setPrefix(prefix);
-        ele.setAttribute(IJSFConstants.ATTR_VALUE, "Column"); //$NON-NLS-1$
-        return ele;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertColumnHeaderCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertColumnHeaderCommand.java
deleted file mode 100644
index f69707f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertColumnHeaderCommand.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DataTableInsertColumnHeaderCommand extends DesignerCommand
-{
-    boolean         _header;   // true means header, false means footer.
-    private Element _dataTable;
-
-    /**
-     * @param viewer
-     * @param dataTable 
-     * @param header 
-     */
-    public DataTableInsertColumnHeaderCommand(IHTMLGraphicalViewer viewer, Element dataTable, boolean header)
-    {
-        super(header ? CommandResources.getString("DataTableInsertColumnHeaderCommand.Label.InsertHeader") : CommandResources.getString("DataTableInsertColumnHeaderCommand.Label.InsertFooter"), viewer); //$NON-NLS-1$ //$NON-NLS-2$
-        this._header = header;
-        this._dataTable = dataTable;
-    }
-
-    public boolean canExecute()
-    {
-        int num = 0;
-        NodeList children = _dataTable.getChildNodes();
-        for (int i = 0, size = children.getLength(); i < size; i++)
-        {
-            Node node = children.item(i);
-            if (JSFDOMUtil.isHColumn(node))
-            {
-                Element column = (Element) node;
-                if (!hasHeader(column))
-                {
-                    num++;
-                    break;
-                }
-            }
-        }
-        if (num == 0)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        String type = (this._header) ? "header" : "footer"; //$NON-NLS-1$ //$NON-NLS-2$
-
-        NodeList children = _dataTable.getChildNodes();
-        for (int i = 0, size = children.getLength(); i < size; i++)
-        {
-            Node node = children.item(i);
-            if (JSFDOMUtil.isHColumn(node))
-            {
-                Element column = (Element) node;
-                if (!hasHeader(column))
-                {
-                    Element headerOrFooter = createHeaderOrFooter(type);
-                    column.appendChild(headerOrFooter);
-                }
-            }
-        }
-        formatNode(this._dataTable);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(_dataTable);
-    }
-
-    /**
-     * @param column
-     * @param _header2
-     * @return
-     */
-    private boolean hasHeader(Element column)
-    {
-        return JSFDOMUtil.findFacet(column, _header ? "header" : "footer") != null; //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-    private Element createHeaderOrFooter(String type)
-    {
-        Element facet = createFacet();
-        Element def = createDefaultElement();
-        facet.appendChild(def);
-        facet.setAttribute(IJSFConstants.ATTR_NAME, type);
-        return facet;
-    }
-
-    private Element createFacet()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_CORE, "f"); //$NON-NLS-1$
-        Element ele = _dataTable.getOwnerDocument().createElement(IJSFConstants.TAG_FACET);
-        ele.setPrefix(prefix);
-        return ele;
-    }
-
-    private Element createDefaultElement()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_HTML, "h"); //$NON-NLS-1$
-        Element ele = _dataTable.getOwnerDocument().createElement(IJSFConstants.TAG_OUTPUTTEXT);
-        ele.setPrefix(prefix);
-        if (this._header)
-        {
-            ele.setAttribute(IJSFConstants.ATTR_VALUE, "Column Header"); //$NON-NLS-1$
-        }
-        else
-        {
-            ele.setAttribute(IJSFConstants.ATTR_VALUE, "Column Footer"); //$NON-NLS-1$
-        }
-
-        return ele;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertHeaderCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertHeaderCommand.java
deleted file mode 100644
index 4231efc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertHeaderCommand.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.w3c.dom.Element;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * This command is used to insert a header row or footer row.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DataTableInsertHeaderCommand extends DesignerCommand
-{
-    boolean         _header;   // true means header, false means footer.
-    private Element _dataTable;
-
-    /**
-     * @param viewer
-     * @param dataTable 
-     * @param header 
-     */
-    public DataTableInsertHeaderCommand(IHTMLGraphicalViewer viewer, Element dataTable, boolean header)
-    {
-        super(header ? CommandResources.getString("DataTableInsertHeaderCommand.Label.InsertHeader") : CommandResources.getString("DataTableInsertHeaderCommand.Label.InsertFooter"), viewer); //$NON-NLS-1$ //$NON-NLS-2$
-        this._header = header;
-        this._dataTable = dataTable;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        if (this._header)
-        {
-            boolean hasHeader = (JSFDOMUtil.findFacet(this._dataTable, "header") != null); //$NON-NLS-1$
-            if (hasHeader)
-            {
-                return false;
-            }
-        }
-        else
-        {
-            boolean hasFooter = (JSFDOMUtil.findFacet(this._dataTable, "footer") != null); //$NON-NLS-1$
-            if (hasFooter)
-            {
-                return false;
-            }
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        String type = (this._header) ? "header" : "footer"; //$NON-NLS-1$ //$NON-NLS-2$
-        Element headerOrFooter = createHeaderOrFooter(type);
-        if (this._header)
-        {
-            this._dataTable.insertBefore(headerOrFooter, this._dataTable.getFirstChild());
-        }
-        else
-        {
-            this._dataTable.appendChild(headerOrFooter);
-        }
-        formatNode(this._dataTable);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(_dataTable);
-    }
-
-    private Element createHeaderOrFooter(String type)
-    {
-        Element facet = createFacet();
-        Element def = createDefaultElement();
-        facet.appendChild(def);
-        facet.setAttribute(IJSFConstants.ATTR_NAME, type);
-        return facet;
-    }
-
-    private Element createFacet()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_CORE, "f"); //$NON-NLS-1$
-        Element ele = _dataTable.getOwnerDocument().createElement(IJSFConstants.TAG_FACET);
-        ele.setPrefix(prefix);
-        return ele;
-    }
-
-    private Element createDefaultElement()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_HTML, "h"); //$NON-NLS-1$
-        Element ele = _dataTable.getOwnerDocument().createElement(IJSFConstants.TAG_OUTPUTTEXT);
-        ele.setPrefix(prefix);
-        if (this._header)
-        {
-            ele.setAttribute(IJSFConstants.ATTR_VALUE, "Table Header"); //$NON-NLS-1$
-        }
-        else
-        {
-            ele.setAttribute(IJSFConstants.ATTR_VALUE, "Table Footer"); //$NON-NLS-1$
-        }
-        return ele;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridDeleteColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridDeleteColumnCommand.java
deleted file mode 100644
index a57f4f7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridDeleteColumnCommand.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.viewers.ISelection;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPlugin;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * This is for delete a column in panelGrid
- * 
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridDeleteColumnCommand extends DesignerCommand
-{
-
-    private int     _columnIndex;
-    private Element _panelGridEle;
-
-    /**
-     * @param viewer
-     * @param panelGrid 
-     * @param columnIndex 
-     */
-    public PanelGridDeleteColumnCommand(IHTMLGraphicalViewer viewer, Element panelGrid, int columnIndex)
-    {
-        super(CommandResources.getString("PanelGridDeleteColumnCommand.Label.DeleteColumn"), viewer); //$NON-NLS-1$
-        this._panelGridEle = panelGrid;
-        this._columnIndex = columnIndex;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        //if user chose header or footer,then disable the delete column action
-        if (this._columnIndex < 0)
-        {
-            return false;
-        }
-        int columns = DOMUtil.getIntAttributeIgnoreCase(_panelGridEle, "columns", 1); //$NON-NLS-1$
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-        return columns > 1;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        int columns = DOMUtil.getIntAttributeIgnoreCase(_panelGridEle, "columns", 1); //$NON-NLS-1$
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-
-        if (_columnIndex >= columns)
-        {
-            JSFUIPlugin.log(IStatus.ERROR, "Should not happen", new Throwable());
-            return;
-        }
-        List children = JSFDOMUtil.getUIComponentChildren(_panelGridEle);
-        List toRemove = new ArrayList();
-        for (int i = _columnIndex; i < children.size(); i += columns)
-        {
-            toRemove.add(children.get(i));
-        }
-        for (int i = 0, size = toRemove.size(); i < size; i++)
-        {
-            _panelGridEle.removeChild((Node) toRemove.get(i));
-        }
-
-        _panelGridEle.setAttribute("columns", String.valueOf(columns - 1)); //$NON-NLS-1$
-        formatNode(_panelGridEle);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(this._panelGridEle);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridDeleteRowCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridDeleteRowCommand.java
deleted file mode 100644
index e0a2795..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridDeleteRowCommand.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * Remove a row from panel grid
- * 
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridDeleteRowCommand extends DesignerCommand
-{
-    Element _panelGridEle;
-    int     _rowIndex;
-
-    /**
-     * @param viewer
-     * @param panelGrid 
-     * @param index 
-     */
-    public PanelGridDeleteRowCommand(IHTMLGraphicalViewer viewer, Element panelGrid, int index)
-    {
-        super(CommandResources.getString("PanelGridDeleteRowCommand.Label.DeleteRow"), viewer); //$NON-NLS-1$
-        this._panelGridEle = panelGrid;
-        this._rowIndex = index;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        // Remove the row from panelGrid is a little complex. Since this row could
-        // be header or footer.
-        boolean hasHeaderRow = (JSFDOMUtil.findFacet(_panelGridEle, "header") != null); //$NON-NLS-1$
-
-        int columns = DOMUtil.getIntAttributeIgnoreCase(_panelGridEle, "columns", 1); //$NON-NLS-1$
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-
-        List children = JSFDOMUtil.getUIComponentChildren(_panelGridEle);
-        int numRows = (children.size() + columns - 1) / columns;
-
-        int removeRow = _rowIndex;
-
-        if (hasHeaderRow)
-        {
-            if (removeRow == 0)
-            {
-                // remove the header row.
-                removeHeader();
-                formatNode(_panelGridEle);
-                return;
-            }
-            removeRow--;
-        }
-        if (removeRow < numRows)
-        {
-            List toRemove = new ArrayList();
-            int max = columns * (removeRow + 1);
-            max = Math.min(max, children.size());
-            for (int i = (columns * removeRow); i < max; i++)
-            {
-                toRemove.add(children.get(i));
-            }
-            for (int i = 0, size = toRemove.size(); i < size; i++)
-            {
-                _panelGridEle.removeChild((Node) toRemove.get(i));
-            }
-            formatNode(_panelGridEle);
-        }
-        else
-        {
-            // must be footer.
-            removeFooter();
-            formatNode(_panelGridEle);
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        if (this._rowIndex < 0)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /**
-     * 
-     */
-    private void removeFooter()
-    {
-        Element ele = JSFDOMUtil.findFacet(_panelGridEle, "footer"); //$NON-NLS-1$
-        if (ele != null)
-        {
-            _panelGridEle.removeChild(ele);
-        }
-    }
-
-    /**
-     * 
-     */
-    private void removeHeader()
-    {
-        Element ele = JSFDOMUtil.findFacet(_panelGridEle, "header"); //$NON-NLS-1$
-        if (ele != null)
-        {
-            _panelGridEle.removeChild(ele);
-        }
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return this.toDesignSelection(this._panelGridEle);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertColumnCommand.java
deleted file mode 100644
index 3c68d26..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertColumnCommand.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.util.PanelGridUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridInsertColumnCommand extends DesignerCommand
-{
-    private int     _columnIndex;
-    private Element _panelGridEle;
-
-    /**
-     * construction
-     * @param viewer
-     * @param panelGrid
-     * @param columnIndex
-     */
-    public PanelGridInsertColumnCommand(IHTMLGraphicalViewer viewer, Element panelGrid, int columnIndex)
-    {
-        super(CommandResources.getString("PanelGridInsertColumnCommand.Label.InsertColumn"), viewer); //$NON-NLS-1$
-        this._panelGridEle = panelGrid;
-        this._columnIndex = columnIndex;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        if (this._columnIndex < 0)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        int columns = DOMUtil.getIntAttributeIgnoreCase(_panelGridEle, IJSFConstants.ATTR_COLUMNS, 1);
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-
-        int startPoint = 0;
-        if (_columnIndex > columns)
-        {
-            return;
-        }
-        else if (_columnIndex == columns)
-        {
-            startPoint = _columnIndex - 1;
-        }
-        else
-        {
-            startPoint = _columnIndex;
-        }
-
-        List children = JSFDOMUtil.getUIComponentChildren(_panelGridEle);
-
-        List toMove = new ArrayList();
-        for (int i = startPoint; i < children.size(); i += columns)
-        {
-            if (_columnIndex < columns)
-            {
-                toMove.add(children.get(i));
-            }
-            else
-            {
-                int tmp = i + 1;
-                if (tmp == children.size())
-                {
-                    toMove.add(null);
-                }
-                else
-                {
-                    toMove.add(children.get(i + 1));
-                }
-            }
-        }
-        //        for (int i = 0, size = toMove.size(); i < size; i++)
-        int lastRowCells = (children.size() % columns == 0) ? columns : (children.size() % columns);
-        PanelGridUtil util = new PanelGridUtil(this._panelGridEle);
-        int uiRows = util.getUIRowCount();
-        int adds = uiRows;
-        if (this._columnIndex > lastRowCells)
-        {
-            adds += this._columnIndex - lastRowCells;
-        }
-        for (int i = 0, size = adds; i < size; i++)
-        {
-            Node child = createDefaultNode();
-            int toMoveSize = toMove.size();
-            Node node = null;
-            if (i < toMoveSize)
-            {
-                node = (Node) toMove.get(i);
-            }
-            _panelGridEle.insertBefore(child, node);
-        }
-
-        _panelGridEle.setAttribute(IJSFConstants.ATTR_COLUMNS, String.valueOf(columns + 1));
-        formatNode(_panelGridEle);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(this._panelGridEle);
-    }
-
-    private Node createDefaultNode()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_HTML, "h"); //$NON-NLS-1$
-        Element child = _panelGridEle.getOwnerDocument().createElement(IJSFConstants.TAG_OUTPUTTEXT);
-        child.setPrefix(prefix);
-        return child;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertFooterCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertFooterCommand.java
deleted file mode 100644
index d3cb109..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertFooterCommand.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridInsertFooterCommand extends DesignerCommand
-{
-    private Element _panelGrid;
-
-    /**
-     * @param viewer
-     * @param panelGrid
-     */
-    public PanelGridInsertFooterCommand(IHTMLGraphicalViewer viewer, Element panelGrid)
-    {
-        super(CommandResources.getString("PanelGridInsertFooterCommand.Label.InsertFooter"), viewer); //$NON-NLS-1$
-        this._panelGrid = panelGrid;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        boolean hasHeader = (JSFDOMUtil.findFacet(this._panelGrid, "footer") != null); //$NON-NLS-1$
-        if (hasHeader)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        Document doc = this._panelGrid.getOwnerDocument();
-        Element facet = doc.createElement(IJSFConstants.TAG_FACET);
-        facet.setPrefix("f"); //$NON-NLS-1$
-        facet.setAttribute(IJSFConstants.ATTR_NAME, "footer"); //$NON-NLS-1$
-        Element outputText = doc.createElement(IJSFConstants.TAG_OUTPUTTEXT);
-        outputText.setPrefix("h"); //$NON-NLS-1$
-        outputText.setAttribute(IJSFConstants.ATTR_VALUE, "Footer"); //$NON-NLS-1$
-        facet.appendChild(outputText);
-        List list = JSFDOMUtil.getUIComponentChildren(this._panelGrid);
-        if (list != null && list.size() > 0)
-        {
-            this._panelGrid.insertBefore(facet, (Element) list.get(0));
-        }
-        else
-        {
-            this._panelGrid.insertBefore(facet, null);
-        }
-        formatNode(this._panelGrid);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(this._panelGrid);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertHeaderCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertHeaderCommand.java
deleted file mode 100644
index 6a9753d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertHeaderCommand.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridInsertHeaderCommand extends DesignerCommand
-{
-    private Element _panelGrid;
-
-    /**
-     * @param viewer
-     * @param panelGrid
-     */
-    public PanelGridInsertHeaderCommand(IHTMLGraphicalViewer viewer, Element panelGrid)
-    {
-        super(CommandResources.getString("PanelGridInsertHeaderCommand.Label.InsertHeader"), viewer); //$NON-NLS-1$
-        this._panelGrid = panelGrid;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        boolean hasHeader = (JSFDOMUtil.findFacet(this._panelGrid, "header") != null); //$NON-NLS-1$
-        if (hasHeader)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        Document doc = this._panelGrid.getOwnerDocument();
-        Element facet = doc.createElement(IJSFConstants.TAG_FACET);
-        facet.setPrefix("f"); //$NON-NLS-1$
-        facet.setAttribute(IJSFConstants.ATTR_NAME, "header"); //$NON-NLS-1$
-        Element outputText = doc.createElement(IJSFConstants.TAG_OUTPUTTEXT);
-        outputText.setPrefix("h"); //$NON-NLS-1$
-        outputText.setAttribute(IJSFConstants.ATTR_VALUE, "Header"); //$NON-NLS-1$
-        facet.appendChild(outputText);
-        this._panelGrid.insertBefore(facet, this._panelGrid.getFirstChild());
-        formatNode(this._panelGrid);
-    }
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(this._panelGrid);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertRowCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertRowCommand.java
deleted file mode 100644
index 8971b2c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertRowCommand.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridInsertRowCommand extends DesignerCommand
-{
-    private int     _rowIndex;
-    private Element _panelGridEle;
-
-    /**
-     * consturctor
-     * @param viewer
-     * @param panelGrid
-     * @param rowIndex
-     */
-    public PanelGridInsertRowCommand(IHTMLGraphicalViewer viewer, Element panelGrid, int rowIndex)
-    {
-        super(CommandResources.getString("PanelGridInsertRowCommand.Label.InsertRow"), viewer); //$NON-NLS-1$
-        this._panelGridEle = panelGrid;
-        this._rowIndex = rowIndex;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        if (this._rowIndex < 0)
-        {
-            return false;
-        }
-        boolean hasHeaderRow = (JSFDOMUtil.findFacet(_panelGridEle, "header") != null); //$NON-NLS-1$
-        //forbid insert row before header
-        if (hasHeaderRow && _rowIndex == 0)
-        {
-            return false;
-        }
-
-        int offIndex = this._rowIndex;
-        if (hasHeaderRow)
-        {
-            offIndex--;
-        }
-
-        int columns = DOMUtil.getIntAttributeIgnoreCase(_panelGridEle, IJSFConstants.ATTR_COLUMNS, 1);
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-        List children = JSFDOMUtil.getUIComponentChildren(_panelGridEle);
-        int numRows = (children.size() + columns - 1) / columns;
-        //        //if the last element row is not full,then forbid insert row after the row
-        //        if ((children.size() % columns != 0) && (offIndex == numRows))
-        //        {
-        //            return false;
-        //        }
-        //forbid insert row after the footer row
-        if (offIndex > numRows)
-        {
-            return false;
-        }
-
-        return super.canExecute();
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        boolean hasHeaderRow = (JSFDOMUtil.findFacet(_panelGridEle, "header") != null); //$NON-NLS-1$
-
-        int columns = DOMUtil.getIntAttributeIgnoreCase(_panelGridEle, IJSFConstants.ATTR_COLUMNS, 1);
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-
-        List children = JSFDOMUtil.getUIComponentChildren(_panelGridEle);
-        int numRows = (children.size() + columns - 1) / columns;
-
-        int insertRow = _rowIndex;
-
-        if (hasHeaderRow)
-        {
-            if (insertRow == 0)
-            {
-                return;
-            }
-            insertRow--;
-        }
-        //if (insertRow < numRows || ((insertRow == numRows) && (children.size() % columns == 0)))
-
-        {
-            int insertPoint = insertRow * columns;
-            Node node = null;
-            if (insertPoint < children.size())
-            {
-                node = (Node) children.get(insertPoint);
-            }
-
-            int adds = 0;
-            //if insert after the last ui row
-            if (insertRow >= numRows)
-            {
-                adds = columns * (numRows + 1) - children.size();
-            }
-            else
-            {
-                adds = columns;
-            }
-
-            for (int i = 0; i < adds; i++)
-            {
-                Node child = createDefaultNode();
-                _panelGridEle.insertBefore(child, node);
-            }
-            formatNode(_panelGridEle);
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(this._panelGridEle);
-    }
-    
-    private Node createDefaultNode()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_HTML, "h"); //$NON-NLS-1$
-        Element child = _panelGridEle.getOwnerDocument().createElement(IJSFConstants.TAG_OUTPUTTEXT);
-        child.setPrefix(prefix);
-        return child;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/JSFCoreConverterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/JSFCoreConverterFactory.java
deleted file mode 100644
index 9aa0535..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.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.jsf.ui.JSFUIPlugin;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFCoreConverterFactory implements IConverterFactory
-{
-
-    private final ILabelProvider        _labelProvider;
-   
-    // TODO C.B: this is a transitional step so that we can incrementally add
-    // new meta-data driven tag converter one-by-one without breaking other existing
-    // if a tag name is in this set, the new DTTagConverter will be created for it,
-    // else, revert to original one
-    private final static Set                   _dtConversionSupported;
-    
-    static
-    {
-        _dtConversionSupported = new HashSet();
-        /*
-        _dtConversionSupported.add(IJSFConstants.TAG_VIEW);
-        _dtConversionSupported.add(IJSFConstants.TAG_FACET);
-        _dtConversionSupported.add(IJSFConstants.TAG_VERBATIM);
-        */
-    }
-    
-    /**
-     * 
-     */
-    public JSFCoreConverterFactory()
-    {
-        super();
-        _labelProvider = new MyLabelProvider();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#createConverter(org.w3c.dom.Element)
-     */
-    public ITagConverter createConverter(Element element, int mode)
-    {
-        String tagName = element.getLocalName();
-        ITagConverter converter;
-        
-        if (_dtConversionSupported.contains(tagName))
-        {
-            converter = createDTTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_VIEW.equalsIgnoreCase(tagName) || IJSFConstants.TAG_SUBVIEW.equalsIgnoreCase(tagName))
-        {
-            converter = new ViewTagConverter(element);
-            ((ViewTagConverter) converter).setNeedBorderDecorator(true);
-        }
-        else if (IJSFConstants.TAG_FACET.equalsIgnoreCase(tagName)
-                || IJSFConstants.TAG_VERBATIM.equalsIgnoreCase(tagName))
-        {
-            AbstractTagConverter toSpan = new TagConverterToInlineBlock(element, mode);
-            toSpan.setMinWidth(10);
-            toSpan.setMinHeight(10);
-            toSpan.setNeedBorderDecorator(true);
-            converter = toSpan;
-        }
-        else if (IJSFConstants.TAG_LOADBUNDLE.equalsIgnoreCase(tagName))
-        {
-            converter = new LoadBundleTagConverter(element, _labelProvider);
-        }
-        else
-        {
-            converter = new HiddenTagConverter(element, _labelProvider);
-        }
-        converter.setMode(mode);
-        return converter;
-    }
-
-    private static class MyLabelProvider extends org.eclipse.jface.viewers.LabelProvider
-    {
-
-        public Image getImage(Object element) 
-        {
-            if (element instanceof ITagConverter)
-            {
-                final Element hostElement = ((ITagConverter)element).getHostElement();
-                final String tagName = hostElement.getLocalName();
-                return getJSFCoreSharedImage(tagName);
-            }
-            
-            return null;
-        }
-    }
-    
-    /**
-     * @param tagName
-     * @return
-     */
-    private static Image getJSFCoreSharedImage(String tagName)
-    {
-        Image image = JSFUIPlugin.getDefault().getImage("palette/JSFCORE/small/JSF_" + tagName.toUpperCase() + ".gif");
-        return image;
-    }
-
-    /* (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 7608080..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/LoadBundleTagConverter.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfcore;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.util.HashMap;
-import java.util.PropertyResourceBundle;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.converter.HiddenTagConverter;
-import org.eclipse.jst.pagedesigner.utils.PreviewUtil;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class LoadBundleTagConverter extends HiddenTagConverter
-{
-    private static Logger _log = PDPlugin.getLogger(LoadBundleTagConverter.class);
-
-    /**
-     * @param host
-     * @param labelProvider 
-     */
-    public LoadBundleTagConverter(Element host, ILabelProvider labelProvider)
-    {
-        super(host, labelProvider);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#convertRefresh(java.lang.Object)
-     */
-    public void convertRefresh(Object context)
-    {
-        Element hostEle = getHostElement();
-        String varString = hostEle.getAttribute(IJSFConstants.ATTR_VAR);
-        String baseName = hostEle.getAttribute(IJSFConstants.ATTR_BASENAME);
-        if (baseName == null || varString == null)
-        {
-            return;
-        }
-        baseName = baseName.replace('.', '/') + IFileFolderConstants.DOT + IFileFolderConstants.EXT_PROPERTIES;
-        IProject project = null;
-        
-        if (hostEle instanceof IDOMNode)
-        {
-            IDOMModel model = ((IDOMNode) hostEle).getModel();
-            if (model != null)
-            {
-                project = StructuredModelUtil.getProjectFor(model);
-            }
-        }
-        if (project == null)
-        {
-            return;
-        }
-        String prop = (new StringBuffer("webroot")
-            .append(IFileFolderConstants.PATH_SEPARATOR).append(IFileFolderConstants.FOLDER_WEBINF).append(
-            IFileFolderConstants.PATH_SEPARATOR).append(IFileFolderConstants.FOLDER_CLASS).append(
-            IFileFolderConstants.PATH_SEPARATOR).append(baseName)).toString();
-        IResource res = project.findMember(prop);
-        if (res == null)
-        {
-            prop = IFileFolderConstants.FOLDER_SOURCE + IFileFolderConstants.PATH_SEPARATOR + baseName;
-            res = project.findMember(prop);
-            if (res == null)
-            {
-                return;
-            }
-        }
-        InputStream ins = null;
-        try
-        {
-            File f = new File(res.getLocation().toString());
-            ins = new FileInputStream(f);
-            if (ins != null)
-            {
-                ins = new BufferedInputStream(ins);
-                PropertyResourceBundle bundle = new PropertyResourceBundle(ins);
-                if (bundle != null)
-                {
-                    if (PreviewUtil.BUNDLE_MAP == null)
-                    {
-                        PreviewUtil.BUNDLE_MAP = new HashMap();
-                    }
-                    else
-                    {
-                        PreviewUtil.BUNDLE_MAP.clear();
-                    }
-                    PreviewUtil.BUNDLE_MAP.put(varString, bundle);
-                    PreviewUtil.BUNDLE = bundle;
-                    PreviewUtil.VAR = varString;
-                }
-            }
-        }
-        catch (MalformedURLException e)
-        {
-            _log.error("LoadBundleTagConverter.convertRefresh.MalformedURLException", e);
-            return;
-        }
-        catch (IOException e)
-        {
-            _log.error("LoadBundleTagConverter.convertRefresh.IOException", e);
-            return;
-        }
-        finally
-        {
-            ResourceUtils.ensureClosed(ins);
-        }
-
-        return;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/ViewTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/ViewTagConverter.java
deleted file mode 100644
index b6b6c27..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/ViewTagConverter.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfcore;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ViewTagConverter extends AbstractTagConverter
-{
-    /**
-     * @param host
-     */
-    public ViewTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element result = createElement(IHTMLConstants.TAG_DIV);
-        copyChildren(getHostElement(), result);
-//        if(!isPreviewMode())
-//        {
-//            result.setAttribute(IHTMLConstants.ATTR_STYLE,"margin:10px;");
-//        }
-        if(!isPreviewMode() && ConverterUtil.isEmptyContainer(getHostElement()))
-        {
-            result.appendChild(ConverterUtil.createDescriptionElement(getDestDocument(),null));
-        }
-        return result;
-    }
-    	
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/ColumnTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/ColumnTagConverter.java
deleted file mode 100644
index b86d978..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/ColumnTagConverter.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ColumnTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public ColumnTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-        // we render all non-facet (header, footer) sub elements of this element
-        Element resultEle = createElement(IHTMLConstants.TAG_TD);
-        // --- create column's td in column tag converter, this should not be final solution, we might need to use
-        // referece column figure in td later.
-
-        Node parent = hostEle.getParentNode();
-        int offset;
-        if (parent != null && parent.getLocalName().equals(IJSFConstants.TAG_DATATABLE))
-        {
-            String columnClassesAttr = ((Element) parent).getAttribute(IJSFConstants.ATTR_COLUMNCLASSES);
-            List columnClasses = new ArrayList();
-            if (columnClassesAttr != null)
-            {
-                StringTokenizer tokenizer = new StringTokenizer(columnClassesAttr, ", ");
-                while (tokenizer.hasMoreTokens())
-                {
-                    columnClasses.add(tokenizer.nextToken());
-                }
-            }
-            offset = EditModelQuery.getInstance().getSameTypeNodeIndex(hostEle);
-            if (offset < columnClasses.size())
-            {
-                resultEle.setAttribute(ICSSPropertyID.ATTR_CLASS, (String) columnClasses.get(offset));
-            }
-        }
-        if (EditModelQuery.getInstance().hasNonTransparentChild(hostEle, new String[] 
-        {
-                IJSFConstants.TAG_FACET
-        }
-        ))
-        {
-            Node child = hostEle.getFirstChild();
-            int index = 0;
-            while (child != null)
-            {
-                if (!(child instanceof Element)
-                        || !JSFDOMUtil.isFacet((Element) child))
-                {
-                    addChild(child, new ConvertPosition(resultEle, index++));
-                }
-                child = child.getNextSibling();
-            }
-        }
-        else
-        {
-            Node child = createText(" ");
-            resultEle.appendChild(child);
-        }
-        return resultEle;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        Element hostEle = getHostElement();
-        Node parent = hostEle.getParentNode();
-        if (parent != null && parent.getLocalName().equals(IJSFConstants.TAG_DATATABLE))
-        {
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/CommandButtonTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/CommandButtonTagConverter.java
deleted file mode 100644
index e441ba3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/CommandButtonTagConverter.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CommandButtonTagConverter extends AbstractTagConverter
-{
-    private List   _nonVisualChildren = Collections.EMPTY_LIST;
-    
-    /**
-     * @param host
-     */
-    public CommandButtonTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        // Renders an HTML "input" element.
-        Element inputEle = createElement(IHTMLConstants.TAG_INPUT);
-
-        // pass throught attributes
-        JSFConverterUtil.copyAllAttributes(hostEle, inputEle, null);
-        
-//      If the "styleClass" attribute is specified, render its 
-        // value as the value of the "class" attribute.
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, inputEle, IHTMLConstants.ATTR_CLASS);
-        
-        inputEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        // next handles input type
-        // "image" attribute:  Absolute or relative URL of the image to be 
-        // displayed for this button. If specified, this "input" element will be 
-        // of type "image". Otherwise, it will be of the type specified by the 
-        // "type" property with a label specified by the "value" property.
-
-        String imageAttr = hostEle.getAttribute(IJSFConstants.ATTR_IMAGE);
-        String type;
-        if (imageAttr == null || imageAttr.length() == 0)
-        {
-            type = hostEle.getAttribute(IJSFConstants.ATTR_TYPE);
-            if (type == null || type.length() == 0)
-            {
-                type = "submit";	// default type
-            }
-        }
-        else
-        {
-            type = "image";
-            // copy the image attribute as the src attribute
-            String src = mapURL(imageAttr);
-            inputEle.setAttribute(IHTMLConstants.ATTR_SRC, src);
-        }
-        // overwrite the "type" attribute
-        inputEle.setAttribute(IHTMLConstants.ATTR_TYPE, type);       
-
-        String value = hostEle.getAttribute(IJSFConstants.ATTR_VALUE);
-        if (value != null && value.length() > 0)
-        {
-            value = mapValue(value);
-            inputEle.setAttribute(IHTMLConstants.ATTR_VALUE, value);
-        }
-
-        // get non-visual children
-        // a button only has non-visual children, so
-        // all Element child nodes are considered such
-        if (hostEle.hasChildNodes())
-        {
-            _nonVisualChildren = new ArrayList();
-            
-            NodeList list = hostEle.getChildNodes();
-            
-            for (int i = 0; i < list.getLength(); i++)
-            {
-                Node node = list.item(i);
-                
-                if (node.getNodeType() == Node.ELEMENT_NODE)
-                {
-                    _nonVisualChildren.add(node);
-                }
-            }
-        }
-        
-        // Render the clientId of the component as the value of the "name" attribute. 
-        // Render the current value of the component as the value of the "value" attribute. 
-
-        return inputEle;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-    public List getNonVisualChildren() {
-        return _nonVisualChildren;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/CommandLinkTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/CommandLinkTagConverter.java
deleted file mode 100644
index dcf09dc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/CommandLinkTagConverter.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CommandLinkTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public CommandLinkTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-        // Render an HTML "a" anchor element that acts like a form submit button when clicked.
-        Element aEle = createElement(IHTMLConstants.TAG_A);
-
-        JSFConverterUtil.copyAllAttributes(hostEle, aEle, null);
-
-        // If the "styleClass" attribute is specified, render its value as the value of the "class" attribute.
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, aEle, IHTMLConstants.ATTR_CLASS);
-
-        aEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        // Render "#" as the value of the "href" attribute.
-        aEle.setAttribute(IHTMLConstants.ATTR_HREF, "#");
-        // Extend the container border a little to make it selectable
-        if (!isPreviewMode())
-        {
-            String style = aEle.getAttribute(IHTMLConstants.ATTR_STYLE);
-            style = "padding:0.3em;" + style;
-            aEle.setAttribute(IHTMLConstants.ATTR_STYLE, style);
-        }
-
-        int childNodeIndex = 0;
-        // Render the current value of the component as the link text if it
-        // is specified.
-        String value = hostEle.getAttribute(IJSFConstants.ATTR_VALUE);
-        if (value != null && value.length() > 0)
-        {
-            value = mapValue(value);
-            aEle.appendChild(createText(value));
-            childNodeIndex = 1;
-        }
-        // generate children
-        // Render any non-UIParameter children as normal inside of the "a" element.
-        // These will appear as the link text.
-
-        if (hostEle.hasChildNodes())
-        {
-            Node child = hostEle.getFirstChild();
-            for (; child != null; child = child.getNextSibling())
-            {
-                if (!shouldIgnore(child))
-                {
-                    if (child instanceof Element
-                            && (JSFDOMUtil.isUIParameter((Element) child) || isActionListener((Element) child)))
-                    {
-                        // skip
-                    }
-                    else
-                    {
-                        addChild(child, new ConvertPosition(aEle, childNodeIndex++));
-                    }
-                }
-            }
-        }
-        if (ConverterUtil.isEmptyContainer(hostEle) && !hostEle.hasAttribute(IJSFConstants.ATTR_VALUE))
-        {
-            aEle.appendChild(getDestDocument().createTextNode(IJSFConstants.TAG_COMMANDLINK));
-        }
-
-        return aEle;
-    }
-    
-    private boolean isActionListener(Element element)
-    {
-        if(element != null && IJSFConstants.TAG_ACTIONLISTENER.equalsIgnoreCase(element.getLocalName()))
-        {
-            return true;
-        }
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/DataTableTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/DataTableTagConverter.java
deleted file mode 100644
index d4cc641..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/DataTableTagConverter.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DataTableTagConverter extends AbstractTagConverter
-{
-    private static final String FACET_NAME_HEADER = "header";
-
-    /**
-     * @param host
-     */
-    public DataTableTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        // Renders an HTML "table" element compliant with the HTML 401 specification.
-        Element tableEle = createElement(IHTMLConstants.TAG_TABLE);
-
-        // Any pass-through attributes are also rendered on the "table" element.
-        JSFConverterUtil.copyAllAttributes(hostEle, tableEle, null);
-
-        // Please consult the javadoc for UIData to supplement this specification.
-        // If the "styleClass" attribute is specified, render its value as the value
-        // of the "class" attribute on the "table" element.
-        ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, tableEle, IHTMLConstants.ATTR_CLASS);
-        tableEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        List columns = findUIColumns(hostEle);
-
-        // rendering the thead
-        convertTHeader(hostEle, tableEle, columns, true);
-
-        convertTBody(hostEle, tableEle, columns);
-        // rendering the tfoot
-        // Follow the same process as for the header, except replace "header" with
-        // "footer", "th" with "td", "thead" with "tfoot", and "headerClass" with
-        // "footerClass". Do not render any "scope" attribute for the footer.
-        convertTHeader(hostEle, tableEle, columns, false);
-
-        return tableEle;
-    }
-
-    /**
-     * @param hostEle
-     * @return
-     */
-    private List findUIColumns(Element hostEle)
-    {
-        List result = new ArrayList();
-        Node child = hostEle.getFirstChild();
-        if (child != null)
-        {
-
-            while (child != null)
-            {
-                if (child instanceof Element)
-                {
-                    Element ele = (Element) child;
-                    TagIdentifier  tagId = TagIdentifierFactory.createDocumentTagWrapper(ele);
-                    if (IJSFConstants.TAG_IDENTIFIER_COLUMN.isSameTagType(tagId))
-                    {
-                        result.add(ele);
-                    }
-                }
-                child = child.getNextSibling();
-            }
-        }
-        return result;
-    }
-
-    /**
-     * @param hostEle
-     * @param tableEle
-     * @param columns
-     */
-    protected void convertTBody(Element hostEle, Element tableEle, List columns)
-    {
-        // Rendering the table body
-        Element tbodyEle = createElement(IHTMLConstants.TAG_TBODY);
-        tableEle.appendChild(tbodyEle);
-        // Render a "tbody" element. Keep track of the result of the "rows" property
-        // on the UIData component. Keep track of the number of rows we have rendered
-        // so far.
-        // Iterate through the rows. Set the "rowIndex" property of the UIDatacomponent
-        // to be correct as we iterate through the rows.
-        // Stop rendering children and close out the "tbody" element if the "rowAvailable"
-        // property of the UIData returned false.
-
-        // XXX: we are only rendering one row.
-        // Output a "tr" element.
-        Element trEle = createElement(IHTMLConstants.TAG_TR);
-        tbodyEle.appendChild(trEle);
-
-        // Output the value of the "rowClasses" per the attribute description below.
-        String rowClasses = tableEle.getAttribute(IJSFConstants.ATTR_ROWCLASSES);
-        if (rowClasses != null)
-        {
-            // as we are only rendering one row, so we only get the first rowclass
-            StringTokenizer tokenizer = new StringTokenizer(rowClasses, ", ");
-            if (tokenizer.hasMoreTokens())
-            {
-                trEle.setAttribute(IHTMLConstants.ATTR_CLASS, tokenizer.nextToken());
-            }
-        }
-
-        // --------------------------------- move this part into ColumnsTagConverter. ------------------------------
-        String columnClassesAttr = hostEle.getAttribute(IJSFConstants.ATTR_COLUMNCLASSES);
-        List columnClasses = new ArrayList();
-        if (columnClassesAttr != null)
-        {
-            StringTokenizer tokenizer = new StringTokenizer(columnClassesAttr, ", ");
-            while (tokenizer.hasMoreTokens())
-            {
-                columnClasses.add(tokenizer.nextToken());
-            }
-        }
-        // --- create column's td in column tag converter, here
-        // For each UIColumn child, output a "td" element, attaching the value of the
-        // "columnClasses" attribute of the UIData component per the attribute description below.
-        // Recursively encode each child of each UIColumn child. Close out the "td" element.
-        // When done with the row, close out the "tr" element. When done with all the rows,
-        // close out the "tbody" element.
-        for (int i = 0, size = columns.size(); i < size; i++)
-        {
-            Element column = (Element) columns.get(i);
-            addChild(column, new ConvertPosition(trEle, i));
-            //            Element tdEle = createElement("td");
-            //            if (i < columnClasses.size())
-            //            {
-            //                tdEle.setAttribute("class", (String) columnClasses.get(i));
-            //            }
-            //
-            //            trEle.appendChild(tdEle);
-            //            // put the "h:column" under td.
-            //            addChild(column, new ConvertPosition(tdEle, 0));
-        }
-    }
-
-    /**
-     * @param hostEle
-     * @param tableEle
-     * @param columns 
-     * @param header true means header, false means footer
-     */
-    protected void convertTHeader(Element hostEle, Element tableEle, List columns, boolean header)
-    {
-        // If the UIData component has a "header" facet, or any of the child UIColumn
-        // components has a "header" facet, render a "thead" element.
-        Element facetEle = JSFDOMUtil.findFacet(hostEle, header ? FACET_NAME_HEADER : "footer");
-        boolean hasColHeader = false;
-        for (int i = 0, size = columns.size(); i < size; i++)
-        {
-            Element uicolumnEle = (Element) columns.get(i);
-            Element columnFacet = JSFDOMUtil.findFacet(uicolumnEle, header ? FACET_NAME_HEADER : "footer");
-            if (columnFacet != null)
-            {
-                hasColHeader = true;
-                break;
-            }
-        }
-
-        if (facetEle == null && !hasColHeader)
-        {
-            return;
-        }
-        Element theadEle = createElement(header ? IHTMLConstants.TAG_THEAD : IHTMLConstants.TAG_TFOOT);
-        tableEle.appendChild(theadEle);
-
-        // If the UIData component has a "header" facet, encode its contents inside of
-        // "tr" and "th" elements, respectively.
-        if (facetEle != null)
-        {
-            Element trEle = createElement(IHTMLConstants.TAG_TR);
-            theadEle.appendChild(trEle);
-            Element thEle = createElement(header ? IHTMLConstants.TAG_TH : IHTMLConstants.TAG_TD);
-            trEle.appendChild(thEle);
-            // Output the value of the "headerClass" attribute of the UIData component,
-            // if present, as the value of the "class" attribute on the "th".
-            ConverterUtil.copyAttribute(hostEle, header ? IJSFConstants.ATTR_HEADERCLASS
-                    : IJSFConstants.ATTR_FOOTERCLASS, thEle, IHTMLConstants.ATTR_CLASS);
-            // Output the number of child UIColumn components of theUIData component as
-            // the value of the "colspan" attribute on the "th".
-            if (columns.size() > 0)
-            {
-                thEle.setAttribute(IHTMLConstants.ATTR_COLSPAN, String.valueOf(columns.size()));
-            }
-
-            addChild(facetEle, new ConvertPosition(thEle, 0));
-        }
-        // Output "colgroup" as the value of the "scope" attribute on the "th" element.
-
-        // If any of the child UIColumn components has a "header" facet render a "tr"
-        // element.
-        if (hasColHeader)
-        {
-            Element trEle = createElement(IHTMLConstants.TAG_TR);
-            theadEle.appendChild(trEle);
-
-            for (int i = 0, size = columns.size(); i < size; i++)
-            {
-                Element uicolumnEle = (Element) columns.get(i);
-                Element columnFacet = JSFDOMUtil.findFacet(uicolumnEle, header ? FACET_NAME_HEADER : "footer");
-                Element thEle = createElement(header ? IHTMLConstants.TAG_TH : IHTMLConstants.TAG_TD);
-                trEle.appendChild(thEle);
-                if (columnFacet != null)
-                {
-                    // For eachUIColumn that actually has a "header" facet, render it inside of
-                    // a "th" element.
-                    addChild(columnFacet, new ConvertPosition(thEle, 0));
-                }
-                else
-                {
-                    // Columns that don't have a "header" facet cause an empty "th" element to be
-                    // rendered.
-                }
-
-                // Output the value of the "headerClass" attribute of the UIData component,
-                // if present, as the value of the "class" attribute on the "th".
-                ConverterUtil.copyAttribute(hostEle, header ? IJSFConstants.ATTR_HEADERCLASS
-                        : IJSFConstants.ATTR_FOOTERCLASS, thEle, IHTMLConstants.ATTR_CLASS);
-
-                // Output "col" as the value of the "colgroup" attribute on the "th" element.
-            }
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needTableDecorator()
-     */
-    public boolean needTableDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/GraphicImageTagConveter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/GraphicImageTagConveter.java
deleted file mode 100644
index 4705201..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/GraphicImageTagConveter.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class GraphicImageTagConveter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public GraphicImageTagConveter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-        // Renders an HTML "img" element. 
-        Element imgEle = createElement(IHTMLConstants.TAG_IMG);
-
-        JSFConverterUtil.copyAllAttributes(hostEle, imgEle, null);
-
-        // If the "styleClass" attribute is specified, render its value as 
-        // the value of the "class" attribute. 
-        ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, imgEle, IHTMLConstants.ATTR_CLASS);
-        imgEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        // Render the clientId as the value of the "id" attribute. 
-        // Render the value of the component as the value of the "src" 
-        // attribute, after passing it to the getResourceUR() method 
-        // of the ViewHandler  for this application, and passing the 
-        // result through the encodeResourceURL() method of the 
-        // ExternalContext. 
-        String src = getSrc(hostEle);
-        if (src != null)
-        {
-            imgEle.setAttribute(IHTMLConstants.ATTR_SRC, src);
-        }
-        return imgEle;
-    }
-
-    /**
-     * @param hostEle
-     * @return
-     */
-    private String getSrc(Element hostEle)
-    {
-        // TODO: need revisit the spec for special URL converting
-        // for this element
-        String value = hostEle.getAttribute(IJSFConstants.ATTR_VALUE);
-        if (value == null)
-        {
-            // Context-relative URL to retrieve the resource associated 
-            // with this component. This is an alias for the "value" 
-            // property.
-            value = hostEle.getAttribute(IJSFConstants.ATTR_URL);
-        }
-        if (value != null)
-        {
-            value = mapValue(value);
-            value = mapURL(value);
-        }
-        return value;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/InputTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/InputTagConverter.java
deleted file mode 100644
index 865e9aa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/InputTagConverter.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * This is for inputHidden, inputSecret, inputText.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class InputTagConverter extends AbstractTagConverter
-{
-
-    private String _inputType;
-
-    /**
-     * @param host
-     * @param inputType 
-     */
-    public InputTagConverter(Element host, String inputType)
-    {
-        super(host);
-        _inputType = inputType;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-        // Renders an HTML "input" element of "type" "text".
-        Element inputEle = createElement(IHTMLConstants.TAG_INPUT);
-        JSFConverterUtil.copyAllAttributes(hostEle, inputEle, null);
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, inputEle, IHTMLConstants.ATTR_CLASS);
-        inputEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        inputEle.setAttribute(IHTMLConstants.ATTR_TYPE, getInputType());
-
-        inputEle.removeAttribute(IJSFConstants.ATTR_VALUE);
-        inputEle.setAttribute(IJSFConstants.ATTR_VALUE, getValue(hostEle));
-
-        return inputEle;
-    }
-
-    /**
-     * @param hostEle
-     * @return
-     */
-    private String getValue(Element hostEle)
-    {
-        String valueAttr = hostEle.getAttribute(IJSFConstants.ATTR_VALUE);
-        if (valueAttr == null)
-        {
-            String name = hostEle.getLocalName();
-            return name.substring(0, 1).toUpperCase() + name.substring(1);
-        }
-        return mapValue(valueAttr);
-    }
-
-    /**
-     * @return
-     */
-    private String getInputType()
-    {
-        return _inputType;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/InputTextAreaTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/InputTextAreaTagConverter.java
deleted file mode 100644
index 845c9d4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/InputTextAreaTagConverter.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InputTextAreaTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public InputTextAreaTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-        // Renders an HTML "textarea" element.
-        Element textareaEle = createElement(IHTMLConstants.TAG_TEXTAREA);
-
-        JSFConverterUtil.copyAllAttributes(hostEle, textareaEle, null);
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, textareaEle, IHTMLConstants.ATTR_CLASS);
-        textareaEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        String value = hostEle.getAttribute(IJSFConstants.ATTR_VALUE);
-        if (value != null && value.length() > 0)
-        {
-            value = mapValue(value);
-            textareaEle.appendChild(createText(value));
-        }
-
-        return textareaEle;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/JSFFormTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/JSFFormTagConverter.java
deleted file mode 100644
index da4a9ed..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/JSFFormTagConverter.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFFormTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public JSFFormTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        // The value of the "method" attribute must be "post". The value of the 
-        // "action" attribute must be the result of passing the view identifier 
-        // of the current view to the getActionURL()  method of the ViewHandler for 
-        // this application, then passing that String to the encodeActionURL()  
-        // method on the ExternalContext. 
-        // XXX: as our tag converter only serve designer and preview, so we only
-        // deal with attributes relating to visual effect. Ignoring "method", "action",
-        // etc.
-        Element hostEle = getHostElement();
-
-        Element formEle = createElement(IHTMLConstants.TAG_FORM);
-
-        // If the "styleClass" attribute is specified, render its value as the 
-        // value of the "class" attribute. 
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, formEle, IHTMLConstants.ATTR_CLASS);
-        formEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        // pass through other attributes
-        // XXX: handle ignored attributes here.
-        JSFConverterUtil.copyAllAttributes(hostEle, formEle, null);
-
-        // Render all the necessary hidden fields for all commandLink instances 
-        // in the page just before the close of the "form" element.
-        // XXX: ignored for these hidden fields.
-
-        // children of old <h:form> should still be children.
-        this.copyChildren(hostEle, formEle);
-
-        return formEle;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/JSFHTMLConverterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/JSFHTMLConverterFactory.java
deleted file mode 100644
index f03337d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/JSFHTMLConverterFactory.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jst.jsf.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.jsf.ui.JSFUIPlugin;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHTMLConverterFactory implements IConverterFactory
-{
-    private final MyLabelProvider  _labelProvider;
-    
-    // TODO C.B: this is a transitional step so that we can incrementally add
-    // new meta-data driven tag converter one-by-one without breaking other existing
-    // if a tag name is in this set, the new DTTagConverter will be created for it,
-    // else, revert to original one
-    private final static Set                   _dtConversionSupported;
-    
-    static
-    {
-        _dtConversionSupported = new HashSet();
-        /*
-        _dtConversionSupported.add(IJSFConstants.TAG_FORM);
-        _dtConversionSupported.add(IJSFConstants.TAG_INPUTTEXT);
-        _dtConversionSupported.add(IJSFConstants.TAG_INPUTSECRET);
-        _dtConversionSupported.add(IJSFConstants.TAG_INPUTTEXTAREA);
-        _dtConversionSupported.add(IJSFConstants.TAG_OUTPUTTEXT);
-        _dtConversionSupported.add(IJSFConstants.TAG_OUTPUTLABEL);
-        _dtConversionSupported.add(IJSFConstants.TAG_GRAPHICIMAGE);
-        _dtConversionSupported.add(IJSFConstants.TAG_PANELGRID);
-        */
-    }
-    
-    /**
-     * 
-     */
-    public JSFHTMLConverterFactory()
-    {
-        super();
-        _labelProvider = new MyLabelProvider();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#createConverter(org.w3c.dom.Element)
-     */
-    public ITagConverter createConverter(Element element, int mode)
-    {
-        ITagConverter converter;
-        String tagName = element.getLocalName();
-        
-        if (_dtConversionSupported.contains(tagName))
-        {
-            converter = createDTTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_COLUMN.equalsIgnoreCase(tagName))
-        {
-            converter = new ColumnTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_COMMANDBUTTON.equalsIgnoreCase(tagName))
-        {
-            converter = new CommandButtonTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_COMMANDLINK.equalsIgnoreCase(tagName))
-        {
-            converter = new CommandLinkTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_DATATABLE.equalsIgnoreCase(tagName))
-        {
-            converter = new DataTableTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_FORM.equalsIgnoreCase(tagName))
-        {
-            converter = new JSFFormTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_GRAPHICIMAGE.equalsIgnoreCase(tagName))
-        {
-            converter = new GraphicImageTagConveter(element);
-        }
-        else if (IJSFConstants.TAG_INPUTHIDDEN.equalsIgnoreCase(tagName))
-        {
-            return new HiddenTagConverter(element, _labelProvider);
-        }
-        else if (IJSFConstants.TAG_INPUTSECRET.equalsIgnoreCase(tagName))
-        {
-            converter = new InputTagConverter(element, "password");
-        }
-        else if (IJSFConstants.TAG_INPUTTEXT.equalsIgnoreCase(tagName))
-        {
-            converter = new InputTagConverter(element, "text");
-        }
-        else if (IJSFConstants.TAG_INPUTTEXTAREA.equalsIgnoreCase(tagName))
-        {
-            converter = new InputTextAreaTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_MESSAGE.equalsIgnoreCase(tagName)
-        || IJSFConstants.TAG_MESSAGES.equalsIgnoreCase(tagName))
-        {
-            converter = new HiddenTagConverter(element, _labelProvider);
-        }
-        else if (IJSFConstants.TAG_OUTPUTTEXT.equalsIgnoreCase(tagName)
-        || IJSFConstants.TAG_OUTPUTFORMAT.equalsIgnoreCase(tagName))
-        {
-            converter = new OutputTextTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_OUTPUTLABEL.equalsIgnoreCase(tagName))
-        {
-            converter = new OutputLabelTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_OUTPUTLINK.equalsIgnoreCase(tagName))
-        {
-            converter = new OutputLinkTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_PANELGRID.equalsIgnoreCase(tagName))
-        {
-            converter = new PanelGridTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_PANELGROUP.equalsIgnoreCase(tagName))
-        {
-            converter = new PanelGroupTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_SELECTBOOLEANCHECKBOX.equalsIgnoreCase(tagName))
-        {
-            converter = new SelectBooleanCheckboxTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_SELECTMANYCHECKBOX.equalsIgnoreCase(tagName))
-        {
-            converter = new TableBasedSelectTagConverter(element, "checkbox");
-        }
-        else if (IJSFConstants.TAG_SELECTMANYLISTBOX.equalsIgnoreCase(tagName))
-        {
-            converter = new SelectManyListboxTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_SELECTMANYMENU.equalsIgnoreCase(tagName))
-        {
-            converter = new SelectManyMenuTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_SELECTONELISTBOX.equalsIgnoreCase(tagName))
-        {
-            converter = new SelectOneListboxTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_SELECTONEMENU.equalsIgnoreCase(tagName))
-        {
-            converter = new SelectOneMenuTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_SELECTONERADIO.equalsIgnoreCase(tagName))
-        {
-            converter = new TableBasedSelectTagConverter(element, "radio");
-        }
-        else
-        {
-            return null;
-        }
-        converter.setMode(mode);
-        return converter;
-    }
-
-    private static class MyLabelProvider extends LabelProvider
-    {
-        public Image getImage(Object element) 
-        {
-            if (element instanceof ITagConverter)
-            {
-                final Element hostElement = ((ITagConverter)element).getHostElement();
-                final String tagName = hostElement.getLocalName();
-                return getJSFHTMLImage(tagName);
-            }
-            
-            return null;
-        }
-    }
-    
-    /**
-     * @param tagName
-     * @return
-     */
-    private static Image getJSFHTMLImage(String tagName)
-    {
-        Image image = JSFUIPlugin.getDefault().getImage("palette/JSFHTML/small/JSF_" + tagName.toUpperCase() + ".gif");
-        return image;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#getSupportedURI()
-     */
-    public String getSupportedURI()
-    {
-        return ITLDConstants.URI_JSF_HTML;
-    }
-    
-    private ITagConverter createDTTagConverter(Element element)
-    {
-        return new DTTagConverter(element);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/MessageTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/MessageTagConverter.java
deleted file mode 100644
index 6c87783..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/MessageTagConverter.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.eclipse.jst.pagedesigner.jsf.ui.util.JSFUIPluginResourcesUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class MessageTagConverter extends AbstractTagConverter
-{
-    private static final String MESSAGE_CONTENT = JSFUIPluginResourcesUtil.getInstance().getString(
-                                                        "MessageTagConverter.defaultValue");
-    private static final String MESSAGE_TOOLTIP = JSFUIPluginResourcesUtil.getInstance().getString(
-                                                        "MessageTagConverter.defaultTooltip");
-
-    /**
-     * @param host
-     */
-    public MessageTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        // If the "styleClass" or "style" attributes are present, 
-        // render a "span" element. 
-        // XXX: to make things simpler, we always create a span
-        Element spanEle = createElement(IHTMLConstants.TAG_SPAN);
-
-        // If the "style" attribute is present, pass it thru.
-        // XXX: we are passing all the attributes through, since other attribute
-        // don't conflict with html attributes.
-        JSFConverterUtil.copyAllAttributes(hostEle, spanEle, null);
-
-        // If the "styleClass" attribute is present, 
-        // output the value of the "styleClass" attribute as the value of the "class" attribute on the "span" element
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, spanEle, IHTMLConstants.ATTR_CLASS);
-        spanEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        String fatalStyle = hostEle.getAttribute(IJSFConstants.ATTR_FATALSTYLE);
-        String errorStyle = hostEle.getAttribute(IJSFConstants.ATTR_ERRORSTYLE);
-        String warnStyle = hostEle.getAttribute(IJSFConstants.ATTR_WARNSTYLE);
-        String infoStyle = hostEle.getAttribute(IJSFConstants.ATTR_INFOSTYLE);
-        String fatalClass = hostEle.getAttribute(IJSFConstants.ATTR_FATALCLASS);
-        String errorClass = hostEle.getAttribute(IJSFConstants.ATTR_ERRORCLASS);
-        String warnClass = hostEle.getAttribute(IJSFConstants.ATTR_WARNCLASS);
-        String infoClass = hostEle.getAttribute(IJSFConstants.ATTR_INFOCLASS);
-
-        if ((!"".equals(fatalStyle)) && (fatalStyle != null))
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, fatalStyle);
-        }
-        else if ((!"".equals(errorStyle)) && (errorStyle != null))
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, errorStyle);
-        }
-        else if ((!"".equals(warnStyle)) && (warnStyle != null))
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, warnStyle);
-        }
-        else if ((!"".equals(infoStyle)) && (infoStyle != null))
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, infoStyle);
-        }
-
-        if ((!"".equals(fatalClass)) && (fatalClass != null))
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, fatalClass);
-        }
-        else if ((!"".equals(errorClass)) && (errorClass != null))
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, errorClass);
-        }
-        else if ((!"".equals(warnClass)) && (warnClass != null))
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, warnClass);
-        }
-        else if ((!"".equals(infoClass)) && (infoClass != null))
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, infoClass);
-        }
-        spanEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        //If the "tooltip" attribute is present with the value of "true", and so does 
-        //the "showSummary",then output the "summary" as the value of the "title" attribute on the "span". 
-        String hasToolTip = hostEle.getAttribute(IJSFConstants.ATTR_TOOLTIP);
-        String showSummary = hostEle.getAttribute(IJSFConstants.ATTR_SHOWSUMMARY);
-        if ("true".equalsIgnoreCase(hasToolTip))
-        {
-            if ("true".equalsIgnoreCase(showSummary))
-            {
-                spanEle.setAttribute("title", MESSAGE_TOOLTIP);
-            }
-        }
-        Text text = createText(MESSAGE_CONTENT);
-        spanEle.appendChild(text);
-
-        return spanEle;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/MessagesTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/MessagesTagConverter.java
deleted file mode 100644
index 5926405..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/MessagesTagConverter.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.eclipse.jst.pagedesigner.jsf.ui.util.JSFUIPluginResourcesUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class MessagesTagConverter extends AbstractTagConverter
-{
-    private static final String MESSAGE_CONTENT = JSFUIPluginResourcesUtil.getInstance().getString(
-                                                        "MessageTagConverter.defaultValue");
-    private static final String MESSAGE_TOOLTIP = JSFUIPluginResourcesUtil.getInstance().getString(
-                                                        "MessageTagConverter.defaultTooltip");
-
-    /**
-     * @param host
-     */
-    public MessagesTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-        String layout = hostEle.getAttribute(IJSFConstants.ATTR_LAYOUT);
-        if (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(layout))
-        {
-            Element table = createElement(IHTMLConstants.TAG_TABLE);
-            table.setAttribute(IHTMLConstants.ATTR_BORDER, "1");
-            for (int i = 0; i < 2; i++)
-            {
-                Element tr = createElement(IHTMLConstants.TAG_TR);
-                Element td = createElement(IHTMLConstants.TAG_TD);
-                Element span = createSpan();
-                td.appendChild(span);
-                tr.appendChild(td);
-                table.appendChild(tr);
-            }
-            return table;
-        }
-        Element ul = createElement(IHTMLConstants.TAG_UL);
-        for (int i = 0; i < 2; i++)
-        {
-            Element li = createElement(IHTMLConstants.TAG_LI);
-            Element span = createSpan();
-            li.appendChild(span);
-            ul.appendChild(li);
-        }
-        return ul;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-
-    private Element createSpan()
-    {
-        Element hostEle = getHostElement();
-
-        // If the "styleClass" or "style" attributes are present, 
-        // render a "span" element. 
-        // XXX: to make things simpler, we always create a span
-        Element spanEle = createElement(IHTMLConstants.TAG_SPAN);
-
-        // If the "style" attribute is present, pass it thru.
-        // XXX: we are passing all the attributes through, since other attribute
-        // don't conflict with html attributes.
-        JSFConverterUtil.copyAllAttributes(hostEle, spanEle, null);
-
-        // If the "styleClass" attribute is present, 
-        // output the value of the "styleClass" attribute as the value of the "class" attribute on the "span" element
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, spanEle, IHTMLConstants.ATTR_CLASS);
-        spanEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        String fatalStyle = hostEle.getAttribute(IJSFConstants.ATTR_FATALSTYLE);
-        String errorStyle = hostEle.getAttribute(IJSFConstants.ATTR_ERRORSTYLE);
-        String warnStyle = hostEle.getAttribute(IJSFConstants.ATTR_WARNSTYLE);
-        String infoStyle = hostEle.getAttribute(IJSFConstants.ATTR_INFOSTYLE);
-        String fatalClass = hostEle.getAttribute(IJSFConstants.ATTR_FATALCLASS);
-        String errorClass = hostEle.getAttribute(IJSFConstants.ATTR_ERRORCLASS);
-        String warnClass = hostEle.getAttribute(IJSFConstants.ATTR_WARNCLASS);
-        String infoClass = hostEle.getAttribute(IJSFConstants.ATTR_INFOCLASS);
-
-        if ((!"".equals(fatalStyle)) && (fatalStyle != null))
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, fatalStyle);
-        }
-        else if ((!"".equals(errorStyle)) && (errorStyle != null))
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, errorStyle);
-        }
-        else if ((!"".equals(warnStyle)) && (warnStyle != null))
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, warnStyle);
-        }
-        else if ((!"".equals(infoStyle)) && (infoStyle != null))
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, infoStyle);
-        }
-
-        if ((!"".equals(fatalClass)) && (fatalClass != null))
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, fatalClass);
-        }
-        else if ((!"".equals(errorClass)) && (errorClass != null))
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, errorClass);
-        }
-        else if ((!"".equals(warnClass)) && (warnClass != null))
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, warnClass);
-        }
-        else if ((!"".equals(infoClass)) && (infoClass != null))
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, infoClass);
-        }
-
-        //If the "tooltip" attribute is present with the value of "true", and so does 
-        //the "showSummary",then output the "summary" as the value of the "title" attribute on the "span". 
-        String hasToolTip = hostEle.getAttribute(IJSFConstants.ATTR_TOOLTIP);
-        String showSummary = hostEle.getAttribute(IJSFConstants.ATTR_SHOWSUMMARY);
-        if ("true".equalsIgnoreCase(hasToolTip))
-        {
-            if ("true".equalsIgnoreCase(showSummary))
-            {
-                spanEle.setAttribute(IHTMLConstants.ATTR_TITLE, MESSAGE_TOOLTIP);
-            }
-        }
-        Text text = createText(MESSAGE_CONTENT);
-        spanEle.appendChild(text);
-
-        return spanEle;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputLabelTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputLabelTagConverter.java
deleted file mode 100644
index 73ea98e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputLabelTagConverter.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class OutputLabelTagConverter extends AbstractTagConverter
-{
-    /**
-     * @param host
-     */
-    public OutputLabelTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        Element labelEle = createElement(IHTMLConstants.TAG_LABEL);
-
-        JSFConverterUtil.copyAllAttributes(hostEle, labelEle, null);
-
-        // If the "styleClass" attribute is present, 
-        // render its value as the value of the "class" attribute.
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, labelEle, IHTMLConstants.ATTR_CLASS);
-        labelEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        //        String value = getValue(hostEle);
-        //        Text	textNode = createText(value);
-        //        labelEle.appendChild(textNode);
-
-        int index = 0;
-        Node child = hostEle.getFirstChild();
-        if (hostEle.hasChildNodes())
-        {
-            for (; child != null; child = child.getNextSibling())
-            {
-                if (!shouldIgnore(child))
-                {
-                    if (child instanceof Element && JSFDOMUtil.isUIParameter((Element) child))
-                    {
-                        // skip
-                    }
-                    else
-                    {
-                        addChild(child, new ConvertPosition(labelEle, index++));
-                    }
-                }
-            }
-        }
-        else
-        {
-            labelEle.appendChild(createText(getDefaultValue()));
-        }
-
-        return labelEle;
-    }
-
-    /**
-     * @param hostEle
-     * @return
-     */
-    private String getDefaultValue()
-    {
-        String name = IJSFConstants.TAG_OUTPUTLABEL;
-        
-        return name.substring(0, 1).toUpperCase() + name.substring(1);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputLinkTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputLinkTagConverter.java
deleted file mode 100644
index f90bdf9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputLinkTagConverter.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class OutputLinkTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public OutputLinkTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        Element aEle = createElement(IHTMLConstants.TAG_A);
-
-        // If the "style" attribute is present, pass it thru.
-        // XXX: we are passing all the attributes through, since other attribute
-        // don't conflict with html attributes.
-        JSFConverterUtil.copyAllAttributes(hostEle, aEle, null);
-
-        // If the "styleClass" attribute is present,
-        // render its value as the value of the "class" attribute.
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, aEle, IHTMLConstants.ATTR_CLASS);
-        aEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        // value should be mapped to href, but it won't affect visual
-        // so use "#"
-        aEle.setAttribute(IHTMLConstants.ATTR_HREF, "#");
-
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_VALUE, aEle, IHTMLConstants.ATTR_HREF);
-        aEle.removeAttribute(IJSFConstants.ATTR_VALUE);
-
-        // Extend the container border a little to make it selectable
-        if (!isPreviewMode())
-        {
-            String style = aEle.getAttribute(IHTMLConstants.ATTR_STYLE);
-            style = "padding:0.3em;" + style;
-            aEle.setAttribute(IHTMLConstants.ATTR_STYLE, style);
-        }
-
-        int index = 0;
-        Node child = hostEle.getFirstChild();
-        if (hostEle.hasChildNodes())
-        {
-            for (; child != null; child = child.getNextSibling())
-            {
-                if (!shouldIgnore(child))
-                {
-                    if (child instanceof Element && JSFDOMUtil.isUIParameter((Element) child))
-                    {
-                        // skip
-                    }
-                    else
-                    {
-                        addChild(child, new ConvertPosition(aEle, index++));
-                    }
-                }
-            }
-        }
-        if (ConverterUtil.isEmptyContainer(hostEle) && !hostEle.hasAttribute(IJSFConstants.ATTR_VALUE))
-        {
-            aEle.appendChild(createText(getDefaultValue()));
-        }
-        return aEle;
-    }
-
-    private String getDefaultValue()
-    {
-        String name = IJSFConstants.TAG_OUTPUTLINK;
-
-        return name.substring(0, 1).toUpperCase() + name.substring(1);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputTextTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputTextTagConverter.java
deleted file mode 100644
index 0897a59..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputTextTagConverter.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class OutputTextTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public OutputTextTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        // If the "styleClass" or "style" attributes are present, 
-        // render a "span" element. 
-        // XXX: to make things simpler, we always create a span
-        Element spanEle = createElement(IHTMLConstants.TAG_SPAN);
-
-        // If the "style" attribute is present, pass it thru.
-        // XXX: we are passing all the attributes through, since other attribute
-        // don't conflict with html attributes.
-        JSFConverterUtil.copyAllAttributes(hostEle, spanEle, null);
-        
-        // If the "styleClass" attribute is present, 
-        // render its value as the value of the "class" attribute.
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, spanEle, IHTMLConstants.ATTR_CLASS);
-        spanEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-        
-        spanEle.removeAttribute(IJSFConstants.ATTR_VALUE);
-
-        // If the "escape" attribute is not present, or it is present and 
-        // its value is "true" all angle brackets should be converted to the 
-        // ampersand xx semicolon syntax when rendering the value of the "value" 
-        // attribute as the value of the component. If the "escape" attribute is 
-        // present and is "false" the value of the component should be rendered 
-        // as text without escaping. 
-        String value = getValue(hostEle);
-        Text	textNode = createText(value);
-        spanEle.appendChild(textNode);
-
-        return spanEle;
-    }
-
-    /**
-     * @param hostEle
-     * @return
-     */
-    private String getValue(Element hostEle)
-    {
-        String valueAttr = hostEle.getAttribute(IJSFConstants.ATTR_VALUE);
-        if (valueAttr == null)
-        {
-            String name = hostEle.getLocalName();
-            return name.substring(0, 1).toUpperCase() + name.substring(1);
-        }
-        return mapValue(valueAttr);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/PanelGridTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/PanelGridTagConverter.java
deleted file mode 100644
index a163cee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/PanelGridTagConverter.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridTagConverter extends AbstractTagConverter
-{
-    /**
-     * @param host
-     */
-    public PanelGridTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.visualtag.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element panelGridEle = this.getHostElement();
-
-        //  Renders an HTML "table" element, conforming to the rules in the HTML 401 specification.
-        Element tableEle = createElement(IHTMLConstants.TAG_TABLE);
-
-        // Render the pass-through attributes in the table below.
-        // TODO: need handle ignored attributes here. But as they don't conflict
-        // with standard table attributes, so its ok that we leave it later.
-        JSFConverterUtil.copyAllAttributes(panelGridEle, tableEle, null);
-        
-        // If the "styleClass" attribute is specified, render its value as the value of the "class" attribute
-        JSFConverterUtil.copyAttribute(panelGridEle, IJSFConstants.ATTR_STYLECLASS, tableEle, IHTMLConstants.ATTR_CLASS);
-        tableEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        int columns = DOMUtil.getIntAttributeIgnoreCase(panelGridEle, IJSFConstants.ATTR_COLUMNS, 1);
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-
-        // Render the "header" facet, if present, inside of "thead", "tr", and "th" elements, nested in that order.
-        Element facet = JSFDOMUtil.findFacet(panelGridEle, "header");
-        if (facet != null)
-        {
-            // we need render a thead here
-            Element theadEle = createElement(IHTMLConstants.TAG_THEAD);
-            tableEle.appendChild(theadEle);
-            Element trEle = createElement(IHTMLConstants.TAG_TR);
-            theadEle.appendChild(trEle);
-            Element thEle = createElement(IHTMLConstants.TAG_TH);
-            trEle.appendChild(thEle);
-            // If the "headerClass" attribute is specifed, render its value as the value of the "class" attribute on
-            // the "th" element.
-            String headerClass = panelGridEle.getAttribute(IJSFConstants.ATTR_HEADERCLASS);
-            if (headerClass != null && headerClass.length() > 0)
-            {
-                thEle.setAttribute(IHTMLConstants.ATTR_CLASS, headerClass);
-            }
-            // Render the value of the "columns" attribute as the value of the "colspan" attribute on the "th" element.
-            thEle.setAttribute(IHTMLConstants.ATTR_COLSPAN, String.valueOf(columns));
-            addChild(facet, new ConvertPosition(thEle, 0));
-        }
-
-        // Render the "footer" facet if present, using similar logic to the rendering of
-        // the "header", but replacing "thead" with "tfoot", "th" with "td", and "headerClass"
-        // with "footerClass".
-        facet = JSFDOMUtil.findFacet(panelGridEle, "footer");
-        if (facet != null)
-        {
-            // we need render a thead here
-            Element theadEle = createElement(IHTMLConstants.TAG_TFOOT);
-            tableEle.appendChild(theadEle);
-            Element trEle = createElement(IHTMLConstants.TAG_TR);
-            theadEle.appendChild(trEle);
-            Element tdEle = createElement(IHTMLConstants.TAG_TD);
-            trEle.appendChild(tdEle);
-            // If the "headerClass" attribute is specifed, render its value as the value of the "class" attribute on
-            // the "th" element.
-            String footerClass = panelGridEle.getAttribute(IJSFConstants.ATTR_FOOTERCLASS);
-            if (footerClass != null && footerClass.length() > 0)
-            {
-                tdEle.setAttribute(IHTMLConstants.ATTR_CLASS, footerClass);
-            }
-            // Render the value of the "columns" attribute as the value of the "colspan" attribute on the "th" element.
-            tdEle.setAttribute(IHTMLConstants.ATTR_COLSPAN, String.valueOf(columns));
-            addChild(facet, new ConvertPosition(tdEle, 0));
-        }
-
-        List rowclasses = new ArrayList();
-        String rowclassesattr = panelGridEle.getAttribute(IJSFConstants.ATTR_ROWCLASSES);
-        if (rowclassesattr != null)
-        {
-            StringTokenizer tokenizer = new StringTokenizer(rowclassesattr, ", ");
-            while (tokenizer.hasMoreTokens())
-            {
-                rowclasses.add(tokenizer.nextToken());
-            }
-        }
-
-        List columnclasses = new ArrayList();
-        String columnclassattr = panelGridEle.getAttribute(IJSFConstants.ATTR_COLUMNCLASSES);
-        if (columnclassattr != null)
-        {
-            StringTokenizer tokenizer = new StringTokenizer(columnclassattr, ", ");
-            while (tokenizer.hasMoreTokens())
-            {
-                columnclasses.add(tokenizer.nextToken());
-            }
-        }
-
-        // Render the children of the UIPanel component inside of a "tbody" element.
-        // Render the children based on the value of the "columns" attribute, creating a new
-        // row each time a "columns" worth of children have been rendered. Each child is rendered
-        // inside of a "td" element. If a child has "rendered==false" it is not rendered,
-        // and the column counter must not be incremented.
-        Element tbody = createElement(IHTMLConstants.TAG_TBODY);
-        tableEle.appendChild(tbody);
-
-        List uipanelChildren = JSFDOMUtil.getUIComponentChildren(panelGridEle);
-        Element currentTr = null;
-        int nextRow = 0; // for rowclasses
-        for (int i = 0; i < uipanelChildren.size(); i++)
-        {
-            int columnIndex = i % columns;
-            if (columnIndex == 0)
-            {
-                currentTr = createElement(IHTMLConstants.TAG_TR);
-                if (!rowclasses.isEmpty())
-                {
-                    currentTr.setAttribute(IHTMLConstants.ATTR_CLASS, (String) rowclasses.get(nextRow));
-                    nextRow = (nextRow + 1) % rowclasses.size();
-                }
-                tbody.appendChild(currentTr);
-            }
-            Element uichild = (Element) uipanelChildren.get(i);
-            Element td = createElement(IHTMLConstants.TAG_TD);
-            if (columnIndex < columnclasses.size())
-            {
-                td.setAttribute(IHTMLConstants.ATTR_CLASS, (String) columnclasses.get(columnIndex));
-            }
-            currentTr.appendChild(td);
-            this.addChild(uichild, new ConvertPosition(td, 0));
-        }
-
-        return (tableEle);
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needTableDecorator()
-     */
-    public boolean needTableDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/PanelGroupTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/PanelGroupTagConverter.java
deleted file mode 100644
index d98d241..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/PanelGroupTagConverter.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PanelGroupTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public PanelGroupTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        // If the "styleClass" or "style" attributes are present,
-        // render a "span" element.
-        // XXX: for page designer to have the panelGroup to always take up space,
-        // we use "div".
-        Element spanEle = createElement(IHTMLConstants.TAG_DIV);
-
-        // If the "style" attribute is present, pass it thru.
-        // XXX: we are passing all the attributes through, since other attribute
-        // don't conflict with html attributes.
-        JSFConverterUtil.copyAllAttributes(hostEle, spanEle, null);
-
-        // If the "styleClass" attribute is present,
-        // render its value as the value of the "class" attribute.
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, spanEle, IHTMLConstants.ATTR_CLASS);
-        spanEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        copyChildren(hostEle, spanEle);
-        return spanEle;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectBasedTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectBasedTagConverter.java
deleted file mode 100644
index 151b8c6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectBasedTagConverter.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class SelectBasedTagConverter extends SelectTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public SelectBasedTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        // Render an HTML "select" element.
-        Element selectEle = createElement(IHTMLConstants.TAG_SELECT);
-
-        // Render the clientId of the component as the value of the "name" attribute.
-        ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_ID, selectEle, IHTMLConstants.ATTR_NAME);
-
-        // XXX: handle ignore
-        JSFConverterUtil.copyAllAttributes(hostEle, selectEle, null);
-        
-//      If the "styleClass" attribute is specified, render its value as the value of 
-        // the "class" attribute on the "select" element.
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, selectEle, IHTMLConstants.ATTR_CLASS);
-        selectEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        // child class may generated different multiple and size attribute
-        handleMultipleAndSize(hostEle, selectEle);
-
-        // next generated the options under the <select>, so they can also be displayed.
-        List selectItems = this.getSelectItems(hostEle);
-        for (int i=0, size=selectItems.size(); i<size; i++)
-        {
-            SelectItemModel item = (SelectItemModel) selectItems.get(i);
-            Element option = createElement(IHTMLConstants.TAG_OPTION);
-            option.setAttribute(IHTMLConstants.ATTR_VALUE, item.getItemValue());
-            Text textNode = createText(item.getDisplayString());
-            option.appendChild(textNode);
-            selectEle.appendChild(option);
-        }
-
-        return (selectEle);
-    }
-
-    /**
-     * @param hostEle
-     * @param selectEle
-     */
-    protected abstract void handleMultipleAndSize(Element hostEle, Element selectEle);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectBooleanCheckboxTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectBooleanCheckboxTagConverter.java
deleted file mode 100644
index b0b2720..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectBooleanCheckboxTagConverter.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class SelectBooleanCheckboxTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public SelectBooleanCheckboxTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-        // Renders an HTML "input" element of type "checkbox".
-        Element inputEle = createElement(IHTMLConstants.TAG_INPUT);
-        JSFConverterUtil.copyAllAttributes(hostEle, inputEle, null);
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, inputEle, IHTMLConstants.ATTR_CLASS);
-        inputEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        inputEle.setAttribute(IHTMLConstants.ATTR_TYPE, "checkbox");
-        
-        if ("true".equalsIgnoreCase(inputEle.getAttribute(IHTMLConstants.ATTR_VALUE)))
-        {
-            inputEle.setAttribute(IHTMLConstants.ATTR_CHECKED,"checked");
-        }
-        return inputEle;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectItemModel.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectItemModel.java
deleted file mode 100644
index 089c92f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectItemModel.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-/**
- * This class emulate a javax.faces.model.SelectItem
- * 
- * @author mengbo
- * @version 1.5
- */
-public class SelectItemModel
-{
-    private String _description;
-    private String _label;
-    private String _itemValue;
-    private String _value;
-    private String _id;
-    private boolean _disabled;
-    
-    /**
-     * @return Returns the disabled.
-     */
-    public boolean isDisabled()
-    {
-        return _disabled;
-    }
-    
-    /**
-     * @param disabled The disabled to set.
-     */
-    public void setDisabled(boolean disabled)
-    {
-        this._disabled = disabled;
-    }
-    
-    /**
-     * Return a description of this item, for use in development tools.
-     * @return the description
-     */ 
-    public String 	getDescription()
-    {
-        return _description;
-    }
-
-    /**
-     * Return the label of this item, to be rendered visibly for the user.
-     * @return the label for this item
-     */
-    public String 	getLabel()
-    {
-        return _label;
-    }
-
-    /**
-	 * Set the description of this item, for use in development tools.
-	 * @param description
-	 */
-    public void 	setDescription(java.lang.String description)
-    {
-        _description = description;
-    }
-
-    /**
-	 * Set the label of this item, to be rendered visibly for the user.
-	 * @param label
-	 */
-    public void 	setLabel(java.lang.String label)
-    {
-        this._label = label;
-    }
-    /**
-     * @return the item value
-     */
-    public String getItemValue()
-    {
-        return _itemValue;
-    }
-
-    /**
-     * @param itemValue
-     */
-    public void setItemValue(String itemValue)
-    {
-        this._itemValue = itemValue;
-    }
-
-    /**
-     * @return the value
-     */
-    public String getValue()
-    {
-        return _value;
-    }
-
-    /**
-     * @param value
-     */
-    public void setValue(String value)
-    {
-        this._value = value;
-    }
-
-    /**
-     * @return the id
-     */
-    public String getId()
-    {
-        return _id;
-    }
-
-    /**
-     * @param id
-     */
-    public void setId(String id)
-    {
-        _id = id;
-    }
-
-    /**
-     * @return the display string
-     */
-    public String getDisplayString()
-    {
-        if (_label != null && _label.length() > 0)
-        {
-            return _label;
-        }
-        else if (_value != null && _value.length() > 0)
-        {
-            return _value;
-        }
-        else if (_description != null && _description.length() > 0)
-        {
-            return _description;
-        }
-        else if (_itemValue != null && _itemValue.length() > 0)
-        {
-            return _itemValue;
-        }
-        else
-        {
-            return "SelectItem";
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectManyListboxTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectManyListboxTagConverter.java
deleted file mode 100644
index abc3ab6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectManyListboxTagConverter.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.List;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class SelectManyListboxTagConverter extends SelectBasedTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public SelectManyListboxTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.jsfhtml.SelectBasedTagConverter#handleMultipleAndSize(org.w3c.dom.Element, org.w3c.dom.Element)
-     */
-    protected void handleMultipleAndSize(Element hostEle, Element selectEle)
-    {
-        // If the component is a UISelectMany instance, render "multiple" as the value of the 
-        // "multiple" attribute.
-        selectEle.setAttribute("multiple", "multiple");
-
-        // If the "size" attribute is specified, render its value as the value of the "size" 
-        // attribute. Otherwise use the number of items as the value of the "size" attribute.
-        String sizeattr = hostEle.getAttribute("size");
-
-        List selectItems = this.getSelectItems(hostEle);
-        if (sizeattr == null)
-        {
-            if (!selectItems.isEmpty())
-            {
-                selectEle.setAttribute("size", String.valueOf(selectItems.size()));
-            }
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectManyMenuTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectManyMenuTagConverter.java
deleted file mode 100644
index e6ead1f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectManyMenuTagConverter.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class SelectManyMenuTagConverter extends SelectBasedTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public SelectManyMenuTagConverter(Element host)
-    {
-        super(host);
-        // TODO Auto-generated constructor stub
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.jsfhtml.SelectBasedTagConverter#handleMultipleAndSize(org.w3c.dom.Element, org.w3c.dom.Element)
-     */
-    protected void handleMultipleAndSize(Element hostEle, Element selectEle)
-    {
-        // If the component is a UISelectMany instance, render "multiple" as the value of the 
-        // "multiple" attribute.
-        selectEle.setAttribute("multiple", "multiple");
-
-        // If the "size" attribute is specified, render its value as the value of the "size" 
-        // attribute. Otherwise use the number of items as the value of the "size" attribute.
-        selectEle.setAttribute("size", "1");
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectOneListboxTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectOneListboxTagConverter.java
deleted file mode 100644
index e1a0493..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectOneListboxTagConverter.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.List;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class SelectOneListboxTagConverter extends SelectBasedTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public SelectOneListboxTagConverter(Element host)
-    {
-        super(host);
-        // TODO Auto-generated constructor stub
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.jsfhtml.SelectBasedTagConverter#handleMultipleAndSize(org.w3c.dom.Element, org.w3c.dom.Element)
-     */
-    protected void handleMultipleAndSize(Element hostEle, Element selectEle)
-    {
-        // always not multiple
-        selectEle.removeAttribute("multiple");
-
-        // If the "size" attribute is specified, render its value as the value of the "size" 
-        // attribute. Otherwise use the number of items as the value of the "size" attribute.
-        String sizeattr = hostEle.getAttribute("size");
-
-        List selectItems = this.getSelectItems(hostEle);
-        if (sizeattr == null)
-        {
-            if (!selectItems.isEmpty())
-            {
-                selectEle.setAttribute("size", String.valueOf(selectItems.size()));
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectOneMenuTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectOneMenuTagConverter.java
deleted file mode 100644
index 1bb5db4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectOneMenuTagConverter.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class SelectOneMenuTagConverter extends SelectBasedTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public SelectOneMenuTagConverter(Element host)
-    {
-        super(host);
-        // TODO Auto-generated constructor stub
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.jsfhtml.SelectBasedTagConverter#handleMultipleAndSize(org.w3c.dom.Element, org.w3c.dom.Element)
-     */
-    protected void handleMultipleAndSize(Element hostEle, Element selectEle)
-    {
-        // always not multiple
-        selectEle.removeAttribute("multiple");
-
-        selectEle.setAttribute("size", "1");
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectTagConverter.java
deleted file mode 100644
index 0beeac4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectTagConverter.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * This class is supposed to be common parent class for the different selectMany tags.
- * 
- * @author mengbo
- * @version 1.5
- */
-public abstract class SelectTagConverter extends AbstractTagConverter
-{
-    /**
-     * @param host
-     */
-    public SelectTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /**
-     * Return a list of SelectItem
-     * 
-     * @param parent
-     * @return the select item list for parent
-     */
-    protected List getSelectItems(Element parent)
-    {
-        List result = new ArrayList();
-        NodeList nl = parent.getChildNodes();
-        for (int i = 0, size = nl.getLength(); i < size; i++)
-        {
-            Node child = nl.item(i);
-            if (child instanceof Element)
-            {
-                Element ele = (Element) child;
-                String tagname = ele.getLocalName();
-                if (IJSFConstants.TAG_SELECTITEM.equalsIgnoreCase(tagname))
-                {
-                    SelectItemModel item = new SelectItemModel();
-                    item.setDescription(ele.getAttribute(IJSFConstants.ATTR_ITEMDESCRIPTION));
-                    item.setLabel(ele.getAttribute(IJSFConstants.ATTR_ITEMLABEL));
-                    item.setItemValue(ele.getAttribute(IJSFConstants.ATTR_ITEMVALUE));
-                    item.setValue(ele.getAttribute(IJSFConstants.ATTR_VALUE));
-                    item.setId(ele.getAttribute(IJSFConstants.ATTR_ID));
-                    item.setDisabled("true".equalsIgnoreCase(ele.getAttribute(IJSFConstants.ATTR_ITEMDISABLED)));
-                    result.add(item);
-                }
-                else if (IJSFConstants.TAG_SELECTITEMS.equalsIgnoreCase(tagname))
-                {
-                    // as selectItems can only be resolved at run time, so we just emulate
-                    // as if it map to two selectitem
-                    String value = ele.getAttribute(IJSFConstants.ATTR_VALUE);
-                    if (value == null || value.length() == 0)
-                    {
-                        value = IJSFConstants.ATTR_VALUE;
-                    }
-                    SelectItemModel item1 = new SelectItemModel();
-                    item1.setValue(value + "_1");
-                    item1.setId(ele.getAttribute(IJSFConstants.ATTR_ID));
-                    result.add(item1);
-                    SelectItemModel item2 = new SelectItemModel();
-                    item2.setValue(value + "_2");
-                    item2.setId(ele.getAttribute(IJSFConstants.ATTR_ID));
-                    result.add(item2);
-                }
-            }
-        }
-
-        return result;
-    }
-
-    /**
-     * @param parent
-     * @return the select item model for parent
-     */
-    public SelectItemModel getDefault(Element parent)
-    {
-        SelectItemModel item = new SelectItemModel();
-        if (parent.getLocalName().equals(IJSFConstants.TAG_SELECTONERADIO))
-        {
-            item.setLabel("radio");
-        }
-        else if (parent.getLocalName().equals(IJSFConstants.TAG_SELECTMANYCHECKBOX))
-        {
-            item.setLabel("checkBox");
-        }
-        else
-        {
-            item.setLabel(parent.getLocalName());
-        }
-        return item;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/TableBasedSelectTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/TableBasedSelectTagConverter.java
deleted file mode 100644
index 043b82d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/TableBasedSelectTagConverter.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableBasedSelectTagConverter extends SelectTagConverter
-{
-
-    private String _inputType;
-
-    /**
-     * @param host
-     * @param inputType 
-     */
-    public TableBasedSelectTagConverter(Element host, String inputType)
-    {
-        super(host);
-        this._inputType = inputType;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        // Render a "table" element.
-        Element tableEle = createElement(IHTMLConstants.TAG_TABLE);
-
-        // If the "styleClass" is specified, render the value of the "styleClass"
-        // attribute as the value of the "class" attribute on the "table" element.
-        ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, tableEle, IHTMLConstants.ATTR_CLASS);
-
-        // If the "style", "border" attributes are specified, pass them thru. 
-        ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLE, tableEle, IHTMLConstants.ATTR_STYLE);
-        ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_BORDER, tableEle, IHTMLConstants.ATTR_BORDER);
-
-        // If the "layout" attribute is specified, and its value is "pageDirection", 
-        // render the children elements vertically, otherwise horizontally, in the table. 
-        boolean horizontal = true;
-        if ("pageDirection".equalsIgnoreCase(hostEle.getAttribute(IJSFConstants.ATTR_LAYOUT)))
-        {
-            horizontal = false;
-        }
-
-        Element itemContainer;
-        if (horizontal)
-        {
-            itemContainer = createElement(IHTMLConstants.TAG_TR);
-            tableEle.appendChild(itemContainer);
-        }
-        else
-        {
-            itemContainer = tableEle;
-        }
-
-        // XXX: If any of the children are an instance of SelectItemGroup, render them as a 
-        // nested table.
-        // but at design time, we don't know anything about SelectItemGroup. so will not
-        // rendering nested table.
-
-        List selectitems = this.getSelectItems(hostEle);
-
-        // for designer, if there is no item, we still want to render one
-        if (this.isDesignerMode() && selectitems.isEmpty())
-        {
-            SelectItemModel item = getDefault(hostEle);
-            selectitems.add(item);
-        }
-
-        boolean isDisabled = Boolean.TRUE.toString()
-                .equalsIgnoreCase(hostEle.getAttribute(IJSFConstants.ATTR_DISABLED));
-        boolean isReadonly = Boolean.TRUE.toString()
-                .equalsIgnoreCase(hostEle.getAttribute(IJSFConstants.ATTR_READONLY));
-
-        for (int i = 0, size = selectitems.size(); i < size; i++)
-        {
-            SelectItemModel item = (SelectItemModel) selectitems.get(i);
-            // Each of the children are ultimately rendererd as follows. 
-            // Render a "label" element. Inside of the "label", render an "input" element 
-            // of "type" "checkbox" for each child component.
-            Element labelEle = createElement(IHTMLConstants.TAG_LABEL);
-            Element inputEle = createElement(IHTMLConstants.TAG_INPUT);
-            inputEle.setAttribute(IHTMLConstants.ATTR_TYPE, getInputType());
-            if (isDisabled || item.isDisabled())
-            {
-                inputEle.setAttribute(IHTMLConstants.ATTR_DISABLED, "disabled");
-            }
-            if (isReadonly)
-            {
-                inputEle.setAttribute(IHTMLConstants.ATTR_READONLY, "readonly");
-            }
-
-            // As an exception to the general 
-            // rules about how to handle the "id" attribute, render it as an attribute on 
-            // the outer "table" element, the value of which is the clientId of the component 
-            // per the rules at the beginning of this specification.The "id" attribute must 
-            // not be output on each "input" element.
-            if (item.getId() != null)
-            {
-                labelEle.setAttribute(IHTMLConstants.ATTR_ID, item.getId());
-            }
-
-            // The value of the current SelectItem 
-            // is rendered as the value of the "value" attribute. If the value of the enclosing 
-            // UISelectMany matches the current value, render "checked" as the value of the 
-            // "checked" attribute. If the current SelectItem.isDisabled() returns true, 
-            // render "disabled" as the value of the "disabled" attribute.
-            if (item.getValue() != null)
-            {
-                inputEle.setAttribute(IHTMLConstants.ATTR_VALUE, item.getValue());
-            }
-            // XXX: checked and disabled is not handled.
-
-            // Close out the "input" element and render the return value from 
-            // SelectItem.getLabel(). Close out the "label" element and any other nested elements.
-            Text label = createText(item.getDisplayString());
-
-            labelEle.appendChild(inputEle);
-            labelEle.appendChild(label);
-
-            if (horizontal)
-            {
-                Element td = createElement(IHTMLConstants.TAG_TD);
-                td.appendChild(labelEle);
-                itemContainer.appendChild(td);
-            }
-            else
-            {
-                Element tr = createElement(IHTMLConstants.TAG_TR);
-                Element td = createElement(IHTMLConstants.TAG_TD);
-                tr.appendChild(td);
-                td.appendChild(labelEle);
-                itemContainer.appendChild(tr);
-            }
-        }
-
-        return (tableEle);
-    }
-
-    /**
-     * @return the input type
-     */
-    protected String getInputType()
-    {
-        return _inputType;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/ColumnOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/ColumnOperation.java
deleted file mode 100644
index 2d5c3b9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/ColumnOperation.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.TransformOperationFactory;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * ITransformOperation implementation specifically for the "column" JSF (HTML)
- * Element. 
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class ColumnOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-
-		//create "td" Element
-		Element tdElement = createElement("td");
-
-		//get parent Node
-		Node parentNode = srcElement.getParentNode();
-
-		//process if parentNode is a "dataTable" Element
-		if (parentNode != null && parentNode.getNodeType() == Node.ELEMENT_NODE && parentNode.getLocalName().equals("dataTable")) {
-			//tokenize "columnClasses" attribute into a List
-			List columnClassesList = new ArrayList();
-			String columnClassesAttribute = ((Element)parentNode).getAttribute("columnClasses");
-			if (columnClassesAttribute != null && columnClassesAttribute.length() > 0) {
-				StringTokenizer tokenizer = new StringTokenizer(columnClassesAttribute, ", ");
-				while (tokenizer.hasMoreTokens()) {
-					columnClassesList.add(tokenizer.nextToken());
-				}
-			}
-			//set "class" attribute
-			int offset = EditModelQuery.getInstance().getSameTypeNodeIndex(srcElement);
-			if (offset < columnClassesList.size()) {
-				ITransformOperation operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"class", (String)columnClassesList.get(offset)});
-				operation.transform(srcElement, tdElement);
-			}
-		}
-
-		//add non-transparent (?), non-facet children (for further processing)
-        if (EditModelQuery.getInstance().hasNonTransparentChild(srcElement, new String[] {"facet"})) {
-        	Node childNode = srcElement.getFirstChild();
-        	int index = 0;
-        	while (childNode != null) {
-        		if (!(childNode instanceof Element) || !JSFDOMUtil.isFacet((Element)childNode)) {
-        			tagConverterContext.addChild(childNode, new ConvertPosition(tdElement, index++));
-        		}
-        		childNode = childNode.getNextSibling();
-        	}
-        } else {
-        	//append single space for esthetics of the "td" Element
-        	appendChildText(" ", tdElement);
-        }
-
-		return tdElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/DataTableOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/DataTableOperation.java
deleted file mode 100644
index 3d0461b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/DataTableOperation.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.TransformOperationFactory;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation specifically for the "dataTable" JSF
- * (HTML) Element. 
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DataTableOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		Element tableElement = null;
-		//create table element, copy all attributes, rename "styleClass" attribute to "class"
-		tableElement = createElement("table");
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAllAttributesOperation,
-					new String[]{});
-		operation.transform(srcElement, tableElement);
-		operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_RenameAttributeOperation,
-					new String[]{"styleClass", "class"});
-		operation.transform(srcElement, tableElement);
-		//build thead
-		buildHeaderOrFooter(srcElement, tableElement, true);
-		//build tbody
-		buildBody(srcElement, tableElement);
-		//build tfoot
-		buildHeaderOrFooter(srcElement, tableElement, false);
-		return tableElement;
-	}
-
-	private void buildHeaderOrFooter(Element srcElement, Element tableElement, boolean isHeader) {
-		//setup vars depending on whether we are building thead or tfoot
-		String facetName = isHeader ? "header" : "footer";
-		String headerOrFooterTagName = isHeader ? "thead" : "tfoot";
-		String thOrTdTagName = isHeader ? "th" : "td";
-		String headerClassOrFooterClassAttrName = isHeader ? "headerClass" : "footerClass";
-
-		//look for facet ("header" or "footer")
-		Element facetElement = getChildFacetByName(srcElement, facetName);
-
-		//get list of child "column" elements
-		List columnElementList = getChildElements(srcElement, "column");
-
-		//look for facet ("header" or "footer") on child "column" elements
-		boolean hasColumnFacet = false;
-		Iterator itColumnElementList = columnElementList.iterator();
-		while (itColumnElementList.hasNext()) {
-			Element columnElement = (Element)itColumnElementList.next();
-			Element columnFacet = getChildFacetByName(columnElement, facetName);
-			if (columnFacet != null) {
-				hasColumnFacet = true;
-				break;
-			}
-		}
-
-		//test if we even need to build header or footer
-		if (facetElement == null && !hasColumnFacet) {
-			return;
-		}
-
-		//append "thead" or "tfoot" Element
-		Element headerOrFooterElement = appendChildElement(headerOrFooterTagName, tableElement);
-
-		//if facetElement exists, build appropriate thead or tfoot children
-		if (facetElement != null) {
-			//append "tr" Element
-			Element trElement = appendChildElement("tr", headerOrFooterElement);
-			//append "th" or "td" Element
-			Element thOrTdElement = appendChildElement(thOrTdTagName, trElement);
-			//set "class" attribute
-			String headerClassOrFooterClassAttribute = srcElement.getAttribute(headerClassOrFooterClassAttrName);
-			if (headerClassOrFooterClassAttribute != null && headerClassOrFooterClassAttribute.length() > 0) {
-				ITransformOperation operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"class", headerClassOrFooterClassAttribute});
-				operation.transform(srcElement, thOrTdElement);
-			}
-			//set "colspan" attribute
-			if (columnElementList.size() > 0) {
-				ITransformOperation operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"colspan", String.valueOf(columnElementList.size())});
-				operation.transform(srcElement, thOrTdElement);
-			}
-			//add facet Element as child (to be processed further)
-			tagConverterContext.addChild(facetElement, new ConvertPosition(thOrTdElement, 0));
-		}
-
-		//if any child column has "header" or "footer" facet, build "tr" element
-		if (hasColumnFacet) {
-			//append "tr" Element
-			Element trElement = appendChildElement("tr", headerOrFooterElement);
-			//iterate through columnElementList
-			itColumnElementList = columnElementList.iterator();
-			while (itColumnElementList.hasNext()) {
-				Element columnElement = (Element)itColumnElementList.next();
-				//get "header" or "footer" facet of column
-				Element columnFacet = getChildFacetByName(columnElement, facetName);
-				//append "th" or "td" Element
-				Element thOrTdElement = appendChildElement(thOrTdTagName, trElement);
-				//set "class" attribute
-				String headerClassOrFooterClassAttribute = srcElement.getAttribute(headerClassOrFooterClassAttrName);
-				if (headerClassOrFooterClassAttribute != null && headerClassOrFooterClassAttribute.length() > 0) {
-					ITransformOperation operation =
-						TransformOperationFactory.getInstance().getTransformOperation(
-								TransformOperationFactory.OP_CreateAttributeOperation,
-								new String[]{"class", headerClassOrFooterClassAttribute});
-					operation.transform(srcElement, thOrTdElement);
-				}
-				//if facet exists, add facet Element as child (to be processed further)
-				if (columnFacet != null) {
-					tagConverterContext.addChild(columnFacet, new ConvertPosition(thOrTdElement, 0));
-				}
-			}
-		}
-	}
-
-	private void buildBody(Element srcElement, Element tableElement) {
-		//append "tbody" element
-		Element tbodyElement = appendChildElement("tbody", tableElement);
-		//append "tr" element
-		Element trElement = appendChildElement("tr", tbodyElement);
-		//parse "rowClasses" attribute and set "class" attribute
-		String rowClassesAttribute = srcElement.getAttribute("rowClasses");
-		if (rowClassesAttribute != null && rowClassesAttribute.length() > 0) {
-			StringTokenizer tokenizer = new StringTokenizer(rowClassesAttribute, ", ");
-			if (tokenizer.hasMoreTokens()) {
-				ITransformOperation operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"class", tokenizer.nextToken()});
-				operation.transform(srcElement, trElement);
-			}
-		}
-		//add child columns (to be processed further)
-		List columnElementList = getChildElements(srcElement, "column");
-		Iterator itColumnElementList = columnElementList.iterator();
-		int index = 0;
-		while (itColumnElementList.hasNext()) {
-			Element columnElement = (Element)itColumnElementList.next();
-			tagConverterContext.addChild(columnElement, new ConvertPosition(trElement, index++));
-		}
-	}
-
-	/**
-	 * Gets a child Element of the specified parent Element that has the node
-	 * name "facet" and the specified value of the "name" attribute.
-	 * 
-	 * @param srcElement Parent Element instance.
-	 * @param facetName Name of the facet Element for which to search.
-	 * @return Child Element that is a facet with the specified name.
-	 */
-	private Element getChildFacetByName(Element srcElement, String facetName) {
-		Element element = null;
-		List facets = getChildElements(srcElement, "facet");
-		Iterator itFacets = facets.iterator();
-		while (itFacets.hasNext()) {
-			Element facet = (Element)itFacets.next();
-			if (facet.getAttribute("name").equals(facetName)) {
-				element = facet;
-				break;
-			}
-		}
-		return element;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/LoadBundleOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/LoadBundleOperation.java
deleted file mode 100644
index af1d68d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/LoadBundleOperation.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.PropertyResourceBundle;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.eclipse.jst.pagedesigner.utils.PreviewUtil;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation specifically for the "loadBundle" JSF
- * (core) Element. 
- * 
- * @author Ian Trimble - Oracle
- */
-public class LoadBundleOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (srcElement != null) {
-			//get "var" and "basename" attributes of srcElement
-			String var = srcElement.getAttribute(IJSFConstants.ATTR_VAR);
-			String basename = srcElement.getAttribute(IJSFConstants.ATTR_BASENAME);
-			if (var != null && basename != null && var.length() > 0 && basename.length() > 0) {
-				String basePath =
-					basename.replace('.', IFileFolderConstants.PATH_SEPARATOR.charAt(0)) +
-							IFileFolderConstants.DOT +
-							IFileFolderConstants.EXT_PROPERTIES;
-				if (srcElement instanceof IDOMNode) {
-					//get model
-					IDOMModel model = ((IDOMNode)srcElement).getModel();
-					if (model != null) {
-						//get project
-						IProject project = StructuredModelUtil.getProjectFor(model);
-						if (project != null) {
-							//attempt to locate properties file in "/{WebRoot}/WEB-INF/classes"
-							IVirtualComponent component = ComponentCore.createComponent(project);
-							IPath webRootPath = component.getRootFolder().getProjectRelativePath();
-							StringBuffer sb = new StringBuffer(webRootPath.toString());
-							sb.append(IFileFolderConstants.PATH_SEPARATOR);
-							sb.append(IFileFolderConstants.FOLDER_WEBINF);
-							sb.append(IFileFolderConstants.PATH_SEPARATOR);
-							sb.append(IFileFolderConstants.FOLDER_CLASS);
-							sb.append(IFileFolderConstants.PATH_SEPARATOR);
-							sb.append(basePath);
-							IResource resource = project.findMember(sb.toString());
-							if (resource == null) {
-								resource = findFileInSrcFolder(project, basePath);
-								if (resource != null) {
-									//load properties file and configure PreviewUtil
-									InputStream inputStream = null;
-									try {
-										File file = new File(resource.getLocation().toString());
-										inputStream = new FileInputStream(file);
-										if (inputStream != null) {
-											inputStream = new BufferedInputStream(inputStream);
-											PropertyResourceBundle bundle = new PropertyResourceBundle(inputStream);
-											if (bundle != null) {
-												if (PreviewUtil.BUNDLE_MAP == null) {
-													PreviewUtil.BUNDLE_MAP = new HashMap();
-												} else {
-													PreviewUtil.BUNDLE_MAP.clear();
-												}
-												PreviewUtil.BUNDLE_MAP.put(var, bundle);
-												PreviewUtil.BUNDLE = bundle;
-												PreviewUtil.VAR = var;
-											}
-										}
-									} catch(IOException ioe) {
-										PDPlugin.getLogger(LoadBundleOperation.class).error("LoadBundleTagConverter.convertRefresh.IOException", ioe);
-									} finally {
-										ResourceUtils.ensureClosed(inputStream);
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		//return null to indicate there is no HTML element associated with this tag
-		return null;
-	}
-
-	/**
-	 * Find specified file in any source folder of the specified project.
-	 * 
-	 * @param project IProject instance.
-	 * @param filePath Source folder-relative path of the file to be located.
-	 * @return the specified file in any source folder of the specified project.
-	 */
-	protected IResource findFileInSrcFolder(IProject project, String filePath) {
-		IResource resource = null;
-		IJavaProject javaProject = JavaCore.create(project);
-		if (javaProject != null) {
-			try {
-				IClasspathEntry[] classpathEntries = javaProject.getResolvedClasspath(true);
-				for (int i = 0; i < classpathEntries.length; i++) {
-					IClasspathEntry classpathEntry = classpathEntries[i];
-					if (classpathEntry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
-						IPath srcPath = classpathEntry.getPath();
-						//srcPath = srcPath.removeFirstSegments(srcPath.matchingFirstSegments(project.getFullPath()));
-						IPath srcFilePath = srcPath.append(filePath);
-						IResource tmpResource = project.getParent().findMember(srcFilePath);
-						if (tmpResource != null) {
-							resource = tmpResource;
-							break;
-						}
-					}
-				}
-			} catch(JavaModelException jme) {
-				//ignore - returning null from method will indicate failure
-			}
-		}
-		return resource;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/PanelGridOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/PanelGridOperation.java
deleted file mode 100644
index 0ebb2fc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/PanelGridOperation.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.TransformOperationFactory;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * ITransformOperation implementation specifically for the "panelGrid" JSF
- * (HTML) Element. 
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class PanelGridOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		Element tableElement = null;
-		//create table element, copy all attributes, rename "styleClass" attribute to "class"
-		tableElement = createElement("table");
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAllAttributesOperation,
-					new String[]{});
-		operation.transform(srcElement, tableElement);
-		operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_RenameAttributeOperation,
-					new String[]{"styleClass", "class"});
-		operation.transform(srcElement, tableElement);
-		//get value of "columns" attribute
-		int columns;
-		try {
-			columns = Integer.parseInt(srcElement.getAttribute("columns"));
-		} catch(NumberFormatException nfe) {
-			columns = 1;
-		}
-		if (columns < 1) {
-			columns = 1;
-		}
-		//check for "header" facet and render appropriately
-		Element headerFacetElement = getChildFacetByName(srcElement, "header");
-		if (headerFacetElement != null) {
-			Element tHeadElement = appendChildElement("thead", tableElement);
-			Element trElement = appendChildElement("tr", tHeadElement);
-			Element thElement = appendChildElement("th", trElement);
-			String headerClass = srcElement.getAttribute("headerClass");
-			if (headerClass != null && headerClass.length() > 0) {
-				operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"class", headerClass});
-				operation.transform(srcElement, thElement);
-			}
-			operation =
-				TransformOperationFactory.getInstance().getTransformOperation(
-						TransformOperationFactory.OP_CreateAttributeOperation,
-						new String[]{"colspan", String.valueOf(columns)});
-			operation.transform(srcElement, thElement);
-			tagConverterContext.addChild(headerFacetElement, new ConvertPosition(thElement, 0));
-		}
-		//check for "footer" facet and render appropriately
-		Element footerFacetElement = getChildFacetByName(srcElement, "footer");
-		if (footerFacetElement != null) {
-			Element tFootElement = appendChildElement("tfoot", tableElement);
-			Element trElement = appendChildElement("tr", tFootElement);
-			Element tdElement = appendChildElement("td", trElement);
-			String footerClass = srcElement.getAttribute("footerClass");
-			if (footerClass != null && footerClass.length() > 0) {
-				operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"class", footerClass});
-				operation.transform(srcElement, tdElement);
-			}
-			operation =
-				TransformOperationFactory.getInstance().getTransformOperation(
-						TransformOperationFactory.OP_CreateAttributeOperation,
-						new String[]{"colspan", String.valueOf(columns)});
-			operation.transform(srcElement, tdElement);
-			tagConverterContext.addChild(footerFacetElement, new ConvertPosition(tdElement, 0));
-		}
-		//get rowClasses and columnClasses for subsequent processing
-        List rowClasses = new ArrayList();
-        String rowClassesAttribute = srcElement.getAttribute("rowClasses");
-        if (rowClassesAttribute != null && rowClassesAttribute.length() > 0) {
-            StringTokenizer tokenizer = new StringTokenizer(rowClassesAttribute, ", ");
-            while (tokenizer.hasMoreTokens()) {
-                rowClasses.add(tokenizer.nextToken());
-            }
-        }
-        List columnClasses = new ArrayList();
-        String columnClassAttribute = srcElement.getAttribute("columnClasses");
-        if (columnClassAttribute != null) {
-            StringTokenizer tokenizer = new StringTokenizer(columnClassAttribute, ", ");
-            while (tokenizer.hasMoreTokens()) {
-                columnClasses.add(tokenizer.nextToken());
-            }
-        }
-		//render children using appropriate number of columns and appropriate classes
-        Element tBodyElement = appendChildElement("tbody", tableElement);
-        List childElements = getChildElementsSkipFacets(srcElement);
-        Element trElement = null;
-        int nextRow = 0;
-        int curIndex = 0;
-        Iterator itChildElements = childElements.iterator();
-        while (itChildElements.hasNext()) {
-        	int columnIndex = curIndex % columns;
-        	if (columnIndex == 0) {
-        		trElement = appendChildElement("tr", tBodyElement);
-        		if (!rowClasses.isEmpty()) {
-    				operation =
-    					TransformOperationFactory.getInstance().getTransformOperation(
-    							TransformOperationFactory.OP_CreateAttributeOperation,
-    							new String[]{"class", (String)rowClasses.get(nextRow)});
-    				operation.transform(srcElement, trElement);
-        			nextRow = (nextRow + 1) % rowClasses.size();
-        		}
-        	}
-        	Element tdElement = appendChildElement("td", trElement);
-        	if (columnIndex < columnClasses.size()) {
-				operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"class", (String)columnClasses.get(columnIndex)});
-				operation.transform(srcElement, tdElement);
-        	}
-        	tagConverterContext.addChild((Element)itChildElements.next(), new ConvertPosition(tdElement, 0));
-        	curIndex++;
-        }
-        return tableElement;
-	}
-
-	/**
-	 * Gets a child Element of the specified parent Element that has the node
-	 * name "facet" and the specified value of the "name" attribute.
-	 * 
-	 * @param srcElement Parent Element instance.
-	 * @param facetName Name of the facet Element for which to search.
-	 * @return Child Element that is a facet with the specified name.
-	 */
-	private Element getChildFacetByName(Element srcElement, String facetName) {
-		Element element = null;
-		List facets = getChildElements(srcElement, "facet");
-		Iterator itFacets = facets.iterator();
-		while (itFacets.hasNext()) {
-			Element facet = (Element)itFacets.next();
-			String facetAttrName = facet.getAttribute("name");
-			if (facetAttrName != null && facetAttrName.equals(facetName)) {
-				element = facet;
-				break;
-			}
-		}
-		return element;
-	}
-
-	/**
-	 * Gets a list of child Elements of the specified parent Element, skipping
-	 * any "facet" Elements.
-	 * 
-	 * @param srcElement Parent Element instance.
-	 * @return List of child Elements of the specified parent Element that does
-	 * not include any child "facet" Elements.
-	 */
-	private List getChildElementsSkipFacets(Element srcElement) {
-		List childElementsList = new ArrayList();
-		NodeList childNodes = srcElement.getChildNodes();
-		for (int i = 0; i < childNodes.getLength(); i++) {
-			Node childNode = childNodes.item(i);
-			if (childNode.getNodeType() == Node.ELEMENT_NODE) {
-				if (!childNode.getLocalName().equals("facet")) {
-					childElementsList.add(childNode);
-				}
-			}
-		}
-		return childElementsList;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/SelectManyCheckboxOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/SelectManyCheckboxOperation.java
deleted file mode 100644
index 5497bbf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/SelectManyCheckboxOperation.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
-
-/**
- * ITransformOperation implementation specifically for the "selectManyCheckbox"
- * JSF (HTML) Element. 
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class SelectManyCheckboxOperation extends TableBasedOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.TableBasedOperation#getInputType()
-	 */
-	protected String getInputType() {
-		return "checkbox";
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/SelectOneRadioOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/SelectOneRadioOperation.java
deleted file mode 100644
index 891c060..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/SelectOneRadioOperation.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
-
-/**
- * ITransformOperation implementation specifically for the "selectOneRadio"
- * JSF (HTML) Element. 
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class SelectOneRadioOperation extends TableBasedOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.TableBasedOperation#getInputType()
-	 */
-	protected String getInputType() {
-		return "radio";
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/TableBasedOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/TableBasedOperation.java
deleted file mode 100644
index e801d4d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/TableBasedOperation.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.TransformOperationFactory;
-import org.w3c.dom.Element;
-
-/**
- * Abstract ITransformOperation implementation intended as super class for HTML
- * "table"-based "selectXXX" JSF (HTML) Elements. 
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class TableBasedOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		Element tableElement = createElement("table");
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAttributeOperation,
-					new String[]{"styleClass"});
-		operation.transform(srcElement, tableElement);
-		operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_RenameAttributeOperation,
-					new String[]{"styleClass", "class"});
-		operation.transform(srcElement, tableElement);
-		operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAttributeOperation,
-					new String[]{"style"});
-		operation.transform(srcElement, tableElement);
-		operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAttributeOperation,
-					new String[]{"border"});
-		operation.transform(srcElement, tableElement);
-		boolean layoutHorizontal = true;
-		if ("pageDirection".equalsIgnoreCase(srcElement.getAttribute("layout"))) {
-			layoutHorizontal = false;
-		}
-		Element itemContainer;
-		if (layoutHorizontal) {
-			itemContainer = appendChildElement("tr", tableElement);
-		} else {
-			itemContainer = tableElement;
-		}
-		boolean isDisabled = Boolean.TRUE.toString().equalsIgnoreCase(srcElement.getAttribute("disabled"));
-		boolean isReadOnly = Boolean.TRUE.toString().equalsIgnoreCase(srcElement.getAttribute("readonly"));
-		List selectItemList = getChildElements(srcElement, "selectItem");
-		Iterator itSelectItemList = selectItemList.iterator();
-		while (itSelectItemList.hasNext()) {
-			Element selectItem = (Element) itSelectItemList.next();
-			Element labelElement = createElement("label");
-			Element inputElement = appendChildElement("input", labelElement);
-			inputElement.setAttribute("type", getInputType());
-			if (isDisabled || Boolean.TRUE.toString().equalsIgnoreCase(selectItem.getAttribute("itemDisabled"))) {
-				inputElement.setAttribute("disabled", "disabled");
-			}
-			if (isReadOnly) {
-				inputElement.setAttribute("readonly", "readonly");
-			}
-			String selectItemID = selectItem.getAttribute("id");
-			if (selectItemID != null && selectItemID.length() > 0) {
-				inputElement.setAttribute("id", selectItemID);
-			}
-			String selectItemValue = selectItem.getAttribute("value");
-			if (selectItemValue != null && selectItemValue.length() > 0) {
-				inputElement.setAttribute("value", selectItemValue);
-			}
-			String label = getSelectItemLabel(selectItem);
-			appendChildText(label, labelElement);
-			if (layoutHorizontal) {
-				Element tdElement = appendChildElement("td", itemContainer);
-				tdElement.appendChild(labelElement);
-			} else {
-				Element trElement = appendChildElement("tr", itemContainer);
-				Element tdElement = appendChildElement("td", trElement);
-				tdElement.appendChild(labelElement);
-			}
-		}
-		return tableElement;
-	}
-
-	/**
-	 * Subclasses override this in order to return the "type" attribute of
-	 * child "input" Elements ("checkbox" or "radio").
-	 * 
-	 * @return the "type" attribute of child "input" Elements.
-	 */
-	protected abstract String getInputType();
-
-	/**
-	 * Attempts to get a label for the selectItem Element instance.
-	 * 
-	 * @param selectItem "selectItem" source Element instance.
-	 * @return Label for the specified selectItem Element instance.
-	 */
-	private String getSelectItemLabel(Element selectItem) {
-		String attribute = selectItem.getAttribute("itemLabel");
-		if (attribute != null && attribute.length() > 0) {
-			return attribute;
-		}
-		attribute = selectItem.getAttribute("value");
-		if (attribute != null && attribute.length() > 0) {
-			return attribute;
-		}
-		attribute = selectItem.getAttribute("itemDescription");
-		if (attribute != null && attribute.length() > 0) {
-			return attribute;
-		}
-		attribute = selectItem.getAttribute("itemValue");
-		if (attribute != null && attribute.length() > 0) {
-			return attribute;
-		}
-		return "selectItem";
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/FacetElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/FacetElementEdit.java
deleted file mode 100644
index cf5ac89..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/FacetElementEdit.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfcore;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.w3c.dom.Element;
-
-/**
- * Element edit for a f:facet
- * 
- * @author cbateman
- *
- */
-public class FacetElementEdit extends AbstractElementEdit
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#handleModelChange(org.w3c.dom.Element, org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-     */
-    public boolean handleModelChange(Element ele, ElementEditPart part,boolean recursive)
-    {
-        EditPart parent = part.getParent();
-        if (parent instanceof ElementEditPart)
-        {
-            ((ElementEditPart) parent).refreshModelChange(recursive);
-            return true;
-        }
-        return false;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/JSFCoreElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/JSFCoreElementEditFactory.java
deleted file mode 100644
index 966a68b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/JSFCoreElementEditFactory.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfcore;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFCoreElementEditFactory implements IElementEditFactory
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#createElementEdit(org.w3c.dom.Element)
-     */
-    public IElementEdit createElementEdit(TagIdentifier tagIdentifier)
-    {
-        if (IJSFConstants.TAG_IDENTIFIER_LOADBUNDLE.isSameTagType(tagIdentifier))
-        {
-            return new LoadBundleElementEdit();
-        }
-        else if(IJSFConstants.TAG_IDENTIFIER_FACET.isSameTagType(tagIdentifier))
-        {
-            return new FacetElementEdit();
-        }
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#getSupportedURI()
-     */
-    public String getSupportedURI()
-    {
-        return ITLDConstants.URI_JSF_CORE;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/JarEntryEditorInput.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/JarEntryEditorInput.java
deleted file mode 100644
index f6b5697..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/JarEntryEditorInput.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.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);
-    }
-
-    /*
-     * @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 8e03cb1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/LoadBundleAction.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.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
-        {
-            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$
-            }
-        }
-    }
-
-
-    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 113e664..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
-    {
-        ElementEditPart _part;
-        Cursor          _columnSelectCursor;
-
-        /**
-         * @param part
-         */
-        public DataTableResizePolicy(ElementEditPart part)
-        {
-            _part = part;
-        }
-
-        public void deactivate() {
-            super.deactivate();
-            if (_columnSelectCursor != null && !_columnSelectCursor.isDisposed())
-            {
-                _columnSelectCursor.dispose();
-                _columnSelectCursor = null;
-            }
-        }
-
-        private Cursor getColumnSelectCursor()
-        {
-            if (_columnSelectCursor == null)
-            {
-                final Image cursorImage = JSFUIPlugin.getDefault().getImage("column_select.gif");
-                _columnSelectCursor = new Cursor(null, cursorImage.getImageData(), 2, 5);
-            }
-            
-            return _columnSelectCursor;
-        }
-        /* (non-Javadoc)
-         * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#getCommand(org.eclipse.gef.Request)
-         */
-        public Command getCommand(Request request)
-        {
-            IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) _part.getViewer();
-            Element dataTable = (Element) _part.getIDOMNode();
-            if (request instanceof TableResizeRequest)
-            {
-                return super.getCommand(request);
-            }
-            else if (request instanceof TableInsertRequest)
-            {
-                TableInsertRequest tableInsertRequest = (TableInsertRequest) request;
-                if (tableInsertRequest.isRow())
-                {
-                    // don't support insert row.
-                    return null;
-                }
-                int index = tableInsertRequest.getIndex() + (tableInsertRequest.isBefore() ? 0 : 1);
-                return new DataTableInsertColumnCommand(viewer, dataTable, index);
-            }
-            else if (request instanceof InsertHeaderFooterRequest)
-            {
-                InsertHeaderFooterRequest req = (InsertHeaderFooterRequest) request;
-                boolean isHeader = req.isHeader();
-                return new DataTableInsertHeaderCommand(viewer, dataTable, isHeader);
-            }
-            else if (request instanceof DeleteHeaderFooterRequest)
-            {
-                DeleteHeaderFooterRequest req = (DeleteHeaderFooterRequest) request;
-                boolean isHeader = req.isHeader();
-                return new DataTableDeleteHeaderCommand(viewer, dataTable, isHeader);
-            }
-            else if (request instanceof InsertHColumnHeaderFooterRequest)
-            {
-                InsertHColumnHeaderFooterRequest req = (InsertHColumnHeaderFooterRequest) request;
-                boolean isHeader = req.isHeader();
-                return new DataTableInsertColumnHeaderCommand(viewer, dataTable, isHeader);
-            }
-            else if (request instanceof DeleteHColumnHeaderFooterRequest)
-            {
-                DeleteHColumnHeaderFooterRequest req = (DeleteHColumnHeaderFooterRequest) request;
-                boolean isHeader = req.isHeader();
-                return new DataTableDeleteColumnHeaderCommand(viewer, dataTable, isHeader);
-            }
-            else if (request instanceof TableRowColumnDeleteRequest)
-            {
-                TableRowColumnDeleteRequest deleteReq = (TableRowColumnDeleteRequest) request;
-                if (deleteReq.isRow())
-                {
-                    return null;
-                }
-                return new DataTableDeleteColumnCommand(viewer, dataTable, deleteReq.getIndex());
-            }
-            return super.getCommand(request);
-        }
-
-        public Cursor getSelectionToolCursor(Point mouseLocation) 
-        {
-            if (hitTestColumnSelection(mouseLocation))
-            {
-                return getColumnSelectCursor();
-            }
-            
-            return null;
-        }
-
-        protected DragTracker getSelectionTracker(LocationRequest request) {
-            final Point mouseLocator = request.getLocation();
-            if (hitTestColumnSelection(mouseLocator))
-            {
-                ObjectModeDragTracker dragTracker =  new ObjectModeDragTracker(getHost())
-                {
-                    protected boolean handleButtonDown(int button)
-                    {
-                        // only customize the case where we are in a column selection mode
-                        if (button == 1)
-                        {
-                            EditPart retarget = 
-                                getRetargetSelectionEditPart(mouseLocator);
-                            
-                            if (retarget != null)
-                            {
-                                setSourceEditPart(retarget);
-                            }
-                        }
-                        
-                        // default
-                        return super.handleButtonDown(button);
-                    }
-                };
-                
-                dragTracker.setDefaultCursor(getSelectionToolCursor(mouseLocator));
-                return dragTracker;
-            }
-            return new ObjectModeDragTracker(getHost());
-        }
-
-        public DragTracker getSelectionDragTracker(LocationRequest request) {
-            return getSelectionTracker(request);
-        }
-
-        /**
-         * @param mouseLocation
-         * @return the edit part fo the given mouse location
-         */
-        public EditPart getRetargetSelectionEditPart(Point mouseLocation) {
-            if (hitTestColumnSelection(mouseLocation))
-            {
-                GraphicalEditPart editPart = (GraphicalEditPart) getHost();
-                List children = editPart.getChildren();
-                
-                for (Iterator it = children.iterator(); it.hasNext();)
-                {
-                    GraphicalEditPart child = (GraphicalEditPart) it.next();
-
-                    if (child instanceof NodeEditPart)
-                    {
-                        Node childNode = ((NodeEditPart)child).getDOMNode();
-
-                        if (JSFDOMUtil.isHColumn(childNode))
-                        {
-                            Point relativeMousePointer = mouseLocation.getCopy();
-                            IFigure hostFigure = child.getFigure();
-                            hostFigure.translateToRelative(relativeMousePointer);
-                            Rectangle hostBounds = hostFigure.getBounds();
-                            if (relativeMousePointer.x >= hostBounds.x
-                                    && relativeMousePointer.x < hostBounds.x+hostBounds.width)
-                            {
-                                return child;
-                            }
-                        }
-                    }
-                }
-            }
-            
-            // otherwise, don't retarget
-            return null;
-        }
-
-        private boolean hitTestColumnSelection(Point mouseLocation)
-        {
-            final GraphicalEditPart part = (GraphicalEditPart) getHost();
-            final IFigure panelFigure = part.getFigure();
-            
-            Point  relativeLocation = mouseLocation.getCopy();
-            panelFigure.translateToRelative(relativeLocation);
-
-            final int yoffsetAbs = Math.abs(panelFigure.getBounds().y - relativeLocation.y);
-            
-            if (yoffsetAbs <= 4)
-            {
-                return true;
-            }
-            
-            return false;
-        }
-    }
-    
-    /**
-     * @author cbateman
-     *
-     */
-    public static class MyDragMoveEditPolicy extends DragMoveEditPolicy 
-    {
-        protected IPositionMediator createDropChildValidator(
-                DropRequest r) 
-        {
-            DropData dropData = createDropData(r);
-            
-            if (dropData!=null)
-            {
-                DnDPositionValidator validator = 
-                    new DnDPositionValidator(new DropActionData(
-                            ActionData.COMPONENT_MOVE, dropData));
-                validator.addRule(new OnlyColumnsAndFacetsRule(validator, validator.getActionData()));
-                return validator;
-            }
-            return null;
-        }
-        
-        private static class OnlyColumnsAndFacetsRule extends DefaultPositionRule
-        {
-            /**
-             * @param mediator
-             * @param actionData
-             */
-            public OnlyColumnsAndFacetsRule(IPositionMediator mediator,
-                    ActionData actionData) {
-                super(mediator, actionData);
-            }
-
-            public boolean isEditable(Target target) {
-                if (IJSFConstants.TAG_IDENTIFIER_DATA_TABLE.isSameTagType(target.getTagWrapper()))
-                {
-                    return isDataDroppable();
-                }
-                
-                return true;
-            }
-            
-            private boolean isDataDroppable()
-            {
-                ActionData actionData = getActionData();
-                if (actionData instanceof DropActionData)
-                {
-                    DropActionData dropActionData = (DropActionData) actionData;
-                    TagIdentifier tagId = 
-                        (TagIdentifier) dropActionData.getDropData().getTagIdentifiers().get(0);
-                            
-                    if (IJSFConstants.TAG_IDENTIFIER_FACET.isSameTagType(tagId)
-                            || IJSFConstants.TAG_IDENTIFIER_COLUMN.isSameTagType(tagId))
-                    {
-                        return true;
-                    }
-                }
-                
-                return false;
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/DefaultJSFHTMLElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/DefaultJSFHTMLElementEdit.java
deleted file mode 100644
index 2bfcd06..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/DefaultJSFHTMLElementEdit.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfhtml;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.IJSFCoreSupport;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.JSFAddActionGroup;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.JSFNavigationGroup;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DefaultJSFHTMLElementEdit extends AbstractElementEdit
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager, org.w3c.dom.Element)
-     */
-    public void fillContextMenu(IMenuManager contextMenu, Element ele)
-    {
-        super.fillContextMenu(contextMenu, ele);
-
-        // next are JSF HTML special support.
-        new JSFAddActionGroup().fillContextMenu(contextMenu, (IDOMElement) ele, new JSFCoreSupport(ele.getLocalName()));
-        new JSFNavigationGroup().fillContextMenu(contextMenu, (IDOMElement) ele, new JSFCoreSupport(ele.getLocalName()));
-    }
-
-    static class JSFCoreSupport implements IJSFCoreSupport
-    {
-        String _localName;
-
-        /**
-         * @param localtag
-         */
-        public JSFCoreSupport(String localtag)
-        {
-            _localName = localtag;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jst.pagedesigner.jsf.actions.IJSFCoreSupport#isActionSource()
-         */
-        public boolean isActionSource()
-        {
-            // UICommand.
-            return _localName.startsWith("command");
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jst.pagedesigner.jsf.actions.IJSFCoreSupport#isUIComponent()
-         */
-        public boolean isUIComponent()
-        {
-            return true;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jst.pagedesigner.jsf.actions.IJSFCoreSupport#isValueHolder()
-         */
-        public boolean isValueHolder()
-        {
-            // UIOutput
-            return _localName.startsWith("output") || _localName.startsWith("input")
-                || _localName.startsWith("select");
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jst.pagedesigner.jsf.actions.IJSFCoreSupport#isEditableValueHolder()
-         */
-        public boolean isEditableValueHolder()
-        {
-            // UIInput
-            return _localName.startsWith("input") || _localName.startsWith("select");
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jst.pagedesigner.jsf.actions.IJSFCoreSupport#supportSelectItems()
-         */
-        public boolean supportSelectItems()
-        {
-            return _localName.startsWith("select");
-        }
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/JSFHTMLElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/JSFHTMLElementEditFactory.java
deleted file mode 100644
index ebae8db..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/JSFHTMLElementEditFactory.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfhtml;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHTMLElementEditFactory implements IElementEditFactory
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#createElementEdit(org.w3c.dom.Element)
-     */
-    public IElementEdit createElementEdit(final TagIdentifier tagIdentifier)
-    {
-        if (IJSFConstants.TAG_IDENTIFIER_DATA_TABLE.isSameTagType(tagIdentifier))
-        {
-            return new DataTableElementEdit();
-        }
-        else if (IJSFConstants.TAG_IDENTIFIER_PANEL_GRID.isSameTagType(tagIdentifier))
-        {
-            return new PanelGridElementEdit();
-        }
-        else if (IJSFConstants.TAG_IDENTIFIER_COLUMN.isSameTagType(tagIdentifier))
-        {
-            return new ColumnElementEdit();
-        }
-        return new DefaultJSFHTMLElementEdit();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#getSupportedURI()
-     */
-    public String getSupportedURI()
-    {
-        return ITLDConstants.URI_JSF_HTML;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/PanelGridElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/PanelGridElementEdit.java
deleted file mode 100644
index 6719607..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/PanelGridElementEdit.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfhtml;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.SharedCursors;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.actions.single.SelectEditPartAction;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy;
-import org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPlugin;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.DeleteHeaderFooterAction;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.InsertHeaderFooterAction;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.DataTableDeleteHeaderCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridDeleteColumnCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridDeleteRowCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridInsertColumnCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridInsertFooterCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridInsertHeaderCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridInsertRowCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.DeleteHeaderFooterRequest;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.InsertHeaderFooterRequest;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.util.PanelGridUtil;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.tableedit.DeleteRowColumnAction;
-import org.eclipse.jst.pagedesigner.tableedit.InsertRowColumnAction;
-import org.eclipse.jst.pagedesigner.tableedit.TableInsertRequest;
-import org.eclipse.jst.pagedesigner.tableedit.TableResizeRequest;
-import org.eclipse.jst.pagedesigner.tableedit.TableRowColumnDeleteRequest;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridElementEdit extends DefaultJSFHTMLElementEdit
-{
-    private final static Action  EMPTY_ACTION = new Action()
-    {
-        // TODO: why?
-    };
-    private final static int FAKE_INDEX = -10;
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager, org.w3c.dom.Element)
-     */
-    public void fillContextMenu(IMenuManager contextMenu, Element ele)
-    {
-        super.fillContextMenu(contextMenu, ele);
-
-        final IMenuManager tableMenu = new MenuManager(JSFUIPlugin.getResourceString("ElementEdit.Submenu.PanelGrid"));//$NON-NLS-1$
-        tableMenu.add(EMPTY_ACTION);
-        final ElementEditPart gridEditPart = (ElementEditPart) ((IDOMElement) ele).getAdapterFor(EditPart.class);
-
-        // ok, we passed the checking, now let's create the actions.
-        tableMenu.addMenuListener(new IMenuListener()
-        {
-            public void menuAboutToShow(IMenuManager manager)
-            {
-                tableMenu.removeAll();
-                fillPanelGridMenu(gridEditPart, FAKE_INDEX, FAKE_INDEX, tableMenu);
-            }
-        });
-
-        contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER, tableMenu);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContainerContextMenu(org.eclipse.jface.action.IMenuManager, org.eclipse.jst.pagedesigner.parts.ElementEditPart, org.eclipse.jst.pagedesigner.parts.NodeEditPart, org.eclipse.jface.viewers.ISelection)
-     */
-    public boolean fillContainerContextMenu(IMenuManager contextMenu, final ElementEditPart elePart,
-            NodeEditPart nodePart, ISelection innerSelection)
-    {
-        Element table = (Element) elePart.getModel();
-        Node node = (Node) nodePart.getModel();
-
-        Element childEle = null;
-        if (node instanceof Element)
-        {
-            childEle = (Element) node;
-        }
-        else
-        {
-            boolean hasElementParent = false;
-            Node nodeBackup = node;
-            while (!IJSFConstants.TAG_PANELGRID.equalsIgnoreCase(nodeBackup.getParentNode().getLocalName()))
-            {
-                nodeBackup = nodeBackup.getParentNode();
-                if (nodeBackup instanceof Element)
-                {
-                    hasElementParent = true;
-                    break;
-                }
-            }
-            if (!hasElementParent)
-            {
-                return false;
-            }
-            childEle = (Element) nodeBackup;
-        }
-
-        PanelGridUtil util = new PanelGridUtil(table);
-        final int cellRow = util.convertRowIndexFromDomToView(util.getDomRowIndex(childEle));
-        final int cellColumn = util.getDomColumnIndex(childEle);
-
-        final IMenuManager tableMenu = new MenuManager(JSFUIPlugin.getResourceString("ElementEdit.Submenu.PanelGrid"));//$NON-NLS-1$
-        tableMenu.add(EMPTY_ACTION);
-
-        // ok, we passed the checking, now let's create the actions.
-        tableMenu.addMenuListener(new IMenuListener()
-        {
-            public void menuAboutToShow(IMenuManager manager)
-            {
-                tableMenu.removeAll();
-                fillPanelGridMenu(elePart, cellRow, cellColumn, tableMenu);
-            }
-        });
-
-        contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER, tableMenu);
-        return true;
-
-    }
-
-    /**
-     * @param elePart
-     * @param cellRow
-     * @param cellColumn
-     * @param tableMenu
-     */
-    private void fillPanelGridMenu(ElementEditPart elePart, int cellRow, int cellColumn, IMenuManager tableMenu)
-    {
-        SelectEditPartAction action = SelectEditPartAction.create(JSFUIPlugin
-                .getResourceString("ElementEdit.Submenu.PanelGrid.SelectTable"), elePart);//$NON-NLS-1$
-        tableMenu.add(action);
-
-        tableMenu.add(new Separator());
-
-        {
-            InsertRowColumnAction insertRowBeforeAction = new InsertRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.InsertRowBefore"), //$NON-NLS-1$
-                    elePart, cellRow, true, true);
-            tableMenu.add(insertRowBeforeAction);
-
-            InsertRowColumnAction insertRowAfterAction = new InsertRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.InsertRowAfter"), //$NON-NLS-1$
-                    elePart, cellRow, true, false);
-            tableMenu.add(insertRowAfterAction);
-
-            tableMenu.add(new Separator());
-        }
-
-        {
-            InsertRowColumnAction insertColumnBeforeAction = new InsertRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.InsertColumnBefore"), //$NON-NLS-1$
-                    elePart, cellColumn, false, true);
-            tableMenu.add(insertColumnBeforeAction);
-
-            InsertRowColumnAction insertColumnAfterAction = new InsertRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.InsertColumnAfter"), //$NON-NLS-1$
-                    elePart, cellColumn, false, false);
-            tableMenu.add(insertColumnAfterAction);
-
-            tableMenu.add(new Separator());
-        }
-
-        {
-            DeleteRowColumnAction deleteRowAction = new DeleteRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.DeleteRow"), //$NON-NLS-1$
-                    elePart, cellRow, true);
-            tableMenu.add(deleteRowAction);
-
-            DeleteRowColumnAction deleteColumnAction = new DeleteRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.DeleteColumn"), //$NON-NLS-1$
-                    elePart, cellColumn, false);
-            tableMenu.add(deleteColumnAction);
-            tableMenu.add(new Separator());
-        }
-
-        {
-            InsertHeaderFooterAction headerAction = new InsertHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.InsertHeader"), //$NON-NLS-1$
-                    elePart, true);
-            tableMenu.add(headerAction);
-
-            InsertHeaderFooterAction footerAction = new InsertHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.InsertFooter"), //$NON-NLS-1$
-                    elePart, false);
-            tableMenu.add(footerAction);
-
-            DeleteHeaderFooterAction delHeaderAction = new DeleteHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGird.DeleteHeader"), elePart, true);//$NON-NLS-1$
-            tableMenu.add(delHeaderAction);
-
-            DeleteHeaderFooterAction delFooterAction = new DeleteHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.DeleteFooter"), elePart, false);//$NON-NLS-1$
-            tableMenu.add(delFooterAction);
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-     */
-    public void createEditPolicies(ElementEditPart part)
-    {
-        part.installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new PanelGridResizePolicy(part));
-    }
-
-    static class PanelGridResizePolicy extends ElementResizableEditPolicy
-    {
-        ElementEditPart _part;
-
-        /**
-         * @param part
-         */
-        public PanelGridResizePolicy(ElementEditPart part)
-        {
-            _part = part;
-        }
-
-        public Cursor getSelectionToolCursor(Point mouseLocation) 
-        {
-            final GraphicalEditPart part = (GraphicalEditPart) getHost();
-            final IFigure panelFigure = part.getFigure();
-            
-            Point  relativeLocation = mouseLocation.getCopy();
-            panelFigure.translateToRelative(relativeLocation);
-            
-            // row cursor if we are within +/- 2 pixels of the left side
-            final int xoffsetAbs = Math.abs(panelFigure.getBounds().x - relativeLocation.x);
-
-            if (xoffsetAbs <= 2)
-            {
-                return SharedCursors.SIZEE;
-            }
-            
-            final int yoffsetAbs = Math.abs(panelFigure.getBounds().y - relativeLocation.y);
-            
-            if (yoffsetAbs <= 2)
-            {
-                return SharedCursors.SIZEW;
-            }
-            
-            return null;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#getCommand(org.eclipse.gef.Request)
-         */
-        public Command getCommand(Request request)
-        {
-            IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) _part.getViewer();
-            Element panelGrid = (Element) _part.getIDOMNode();
-            if (request instanceof TableResizeRequest)
-            {
-                return super.getCommand(request);
-            }
-            else if (request instanceof TableInsertRequest)
-            {
-                TableInsertRequest tableInsertRequest = (TableInsertRequest) request;
-                if (tableInsertRequest.isRow())
-                {
-                    int index = tableInsertRequest.getIndex() + (tableInsertRequest.isBefore() ? 0 : 1);
-                    return new PanelGridInsertRowCommand(viewer, panelGrid, index);
-                }
-                int index = tableInsertRequest.getIndex() + (tableInsertRequest.isBefore() ? 0 : 1);
-                return new PanelGridInsertColumnCommand(viewer, panelGrid, index);
-            }
-            else if (request instanceof InsertHeaderFooterRequest)
-            {
-                InsertHeaderFooterRequest req = (InsertHeaderFooterRequest) request;
-                boolean isHeader = req.isHeader();
-                if (isHeader)
-                {
-                    return new PanelGridInsertHeaderCommand(viewer, panelGrid);
-                }
-                return new PanelGridInsertFooterCommand(viewer, panelGrid);
-            }
-            else if (request instanceof DeleteHeaderFooterRequest)
-            {
-                DeleteHeaderFooterRequest req = (DeleteHeaderFooterRequest) request;
-                boolean isHeader = req.isHeader();
-                return new DataTableDeleteHeaderCommand(viewer, panelGrid, isHeader);
-            }
-            else if (request instanceof TableRowColumnDeleteRequest)
-            {
-                TableRowColumnDeleteRequest deleteReq = (TableRowColumnDeleteRequest) request;
-                if (deleteReq.isRow())
-                {
-                    return new PanelGridDeleteRowCommand(viewer, panelGrid, deleteReq.getIndex());
-                }
-                return new PanelGridDeleteColumnCommand(viewer, panelGrid, deleteReq.getIndex());
-            }
-            return super.getCommand(request);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/DeleteHColumnHeaderFooterRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/DeleteHColumnHeaderFooterRequest.java
deleted file mode 100644
index 076fd74..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/DeleteHColumnHeaderFooterRequest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DeleteHColumnHeaderFooterRequest extends Request
-{
-    private boolean _isHeader;
-
-    /**
-     * @param type
-     * @param isHeader
-     */
-    public DeleteHColumnHeaderFooterRequest(String type, boolean isHeader)
-    {
-        super(type);
-        this._isHeader = isHeader;
-    }
-
-    /**
-     * @return Returns the _isHeader.
-     */
-    public boolean isHeader()
-    {
-        return _isHeader;
-    }
-
-    /**
-     * @param header The _isHeader to set.
-     */
-    public void setHeader(boolean header)
-    {
-        _isHeader = header;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/DeleteHeaderFooterRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/DeleteHeaderFooterRequest.java
deleted file mode 100644
index d935652..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/DeleteHeaderFooterRequest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DeleteHeaderFooterRequest extends Request
-{
-    private boolean _isHeader;
-
-    /**
-     * @param type
-     * @param isHeader
-     */
-    public DeleteHeaderFooterRequest(String type, boolean isHeader)
-    {
-        super(type);
-        this._isHeader = isHeader;
-    }
-
-    /**
-     * @return Returns the _isHeader.
-     */
-    public boolean isHeader()
-    {
-        return _isHeader;
-    }
-
-    /**
-     * @param header The _isHeader to set.
-     */
-    public void setHeader(boolean header)
-    {
-        _isHeader = header;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/InsertHColumnHeaderFooterRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/InsertHColumnHeaderFooterRequest.java
deleted file mode 100644
index 34e3d4a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/InsertHColumnHeaderFooterRequest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertHColumnHeaderFooterRequest extends Request
-{
-    private boolean _isHeader;
-
-    /**
-     * @param type
-     * @param isHeader
-     */
-    public InsertHColumnHeaderFooterRequest(String type, boolean isHeader)
-    {
-        super(type);
-        this._isHeader = isHeader;
-    }
-
-    /**
-     * @return Returns the _isHeader.
-     */
-    public boolean isHeader()
-    {
-        return _isHeader;
-    }
-
-    /**
-     * @param header The _isHeader to set.
-     */
-    public void setHeader(boolean header)
-    {
-        _isHeader = header;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/InsertHeaderFooterRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/InsertHeaderFooterRequest.java
deleted file mode 100644
index 31e853f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/InsertHeaderFooterRequest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertHeaderFooterRequest extends Request
-{
-    private boolean _isHeader;
-
-    /**
-     * @param type
-     * @param isHeader
-     */
-    public InsertHeaderFooterRequest(String type, boolean isHeader)
-    {
-        super(type);
-        this._isHeader = isHeader;
-    }
-
-    /**
-     * @return Returns the _isHeader.
-     */
-    public boolean isHeader()
-    {
-        return _isHeader;
-    }
-
-    /**
-     * @param header The _isHeader to set.
-     */
-    public void setHeader(boolean header)
-    {
-        _isHeader = header;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/util/DataTableUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/util/DataTableUtil.java
deleted file mode 100644
index a6f3602..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/util/DataTableUtil.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.util;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DataTableUtil
-{
-    private static final int INVALID_POSITION = -10;
-    private Element          _dataTable       = null;
-
-    /**
-     * @param dataTable
-     */
-    public DataTableUtil(Element dataTable)
-    {
-        this._dataTable = dataTable;
-    }
-
-    /**
-     * @param column
-     * @return the column index for column
-     */
-    public int getColumnIndex(Element column)
-    {
-        NodeList nodeList = this._dataTable.getElementsByTagName("h:column");
-        if (nodeList != null)
-        {
-            for (int i = 0, size = nodeList.getLength(); i < size; i++)
-            {
-                if (column == (Element) nodeList.item(i))
-                {
-                    return i;
-                }
-            }
-        }
-        return INVALID_POSITION;
-    }
-
-    /**
-     * @param child
-     * @return the hcolumn parent of child or null if not found
-     */
-    public Element findHColumnParent(Node child)
-    {
-        if (child == null)
-        {
-            return null;
-        }
-
-        Node childBackup = child;
-        boolean hasHColumnParent = false;
-
-        if (JSFDOMUtil.isHColumn(child))
-        {
-            return (Element) child;
-        }
-        while (!IJSFConstants.TAG_DATATABLE.equalsIgnoreCase(childBackup.getParentNode().getLocalName()))
-        {
-            childBackup = childBackup.getParentNode();
-            String tagName = childBackup.getLocalName();
-            if (IJSFConstants.TAG_COLUMN.equalsIgnoreCase(tagName))
-            {
-                hasHColumnParent = true;
-                break;
-            }
-        }
-
-        if (hasHColumnParent)
-        {
-            return (Element) childBackup;
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/util/PanelGridUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/util/PanelGridUtil.java
deleted file mode 100644
index bc57d28..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/util/PanelGridUtil.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.util;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridUtil
-{
-    private static final int INVALID_POSITION = -10;
-    private Element          _panelGrid       = null;
-
-    /**
-     * @param panelGrid
-     */
-    public PanelGridUtil(Element panelGrid)
-    {
-        this._panelGrid = panelGrid;
-    }
-
-    /**
-     * @param domIndex
-     * @return the row index in the panel of the relative dom index
-     */
-    public int convertRowIndexFromDomToView(int domIndex)
-    {
-        boolean hasHeaderRow = (JSFDOMUtil.findFacet(this._panelGrid, "header") != null);
-        boolean hasFooterRow = (JSFDOMUtil.findFacet(this._panelGrid, "footer") != null);
-        if (!hasFooterRow)
-        {
-            return domIndex;
-        }
-        if (domIndex == 0)
-        {
-            return domIndex;
-        }
-        if (hasHeaderRow)
-        {
-            if (domIndex > 1)
-            {
-                return domIndex - 1;
-            }
-        }
-        else
-        {
-            if (domIndex > 0)
-            {
-                return domIndex - 1;
-            }
-        }
-        //must be footer
-        int uiRows = getUIRowCount();
-        return domIndex + uiRows;
-    }
-
-    /**
-     * @param cell
-     * @return the dom row index of cell in the panel
-     */
-    public int getDomRowIndex(Element cell)
-    {
-        boolean hasHeaderRow = (JSFDOMUtil.findFacet(this._panelGrid, "header") != null);
-        boolean hasFooterRow = (JSFDOMUtil.findFacet(this._panelGrid, "footer") != null);
-        //if cell is header or footer
-        boolean isFacet = JSFDOMUtil.isFacet(cell);
-        Element parent = (Element) cell.getParentNode();
-        boolean isParentFacet = JSFDOMUtil.isFacet(parent);
-        if (isParentFacet)
-        {
-            cell = parent;
-        }
-        if (isFacet || isParentFacet)
-        {
-            String attrName = cell.getAttribute("name");
-            if ("header".equalsIgnoreCase(attrName))
-            {
-                return 0;
-            }
-            else if ("footer".equalsIgnoreCase(attrName))
-            {
-                if (hasHeaderRow)
-                {
-                    return 1;
-                }
-                return 0;
-            }
-        }
-
-        int columns = DOMUtil.getIntAttributeIgnoreCase(this._panelGrid, IJSFConstants.ATTR_COLUMNS, 1);
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-        int pos = getPosition(cell);
-        int rowIndex = pos / columns;
-
-        if (hasHeaderRow)
-        {
-            rowIndex++;
-        }
-        if (hasFooterRow)
-        {
-            rowIndex++;
-        }
-
-        return rowIndex;
-    }
-
-    /**
-     * @param cell
-     * @return the column index of cell in the panel
-     */
-    public int getDomColumnIndex(Element cell)
-    {
-        int columns = DOMUtil.getIntAttributeIgnoreCase(this._panelGrid, IJSFConstants.ATTR_COLUMNS, 1);
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-        int pos = getPosition(cell);
-        //if position is at header or footer,then insert column action should be disabled
-        if (pos == INVALID_POSITION)
-        {
-            return pos;
-        }
-
-        int columnIndex = pos % columns;
-        return columnIndex;
-    }
-
-    /**
-     * @return the row count in the panel
-     */
-    public int getUIRowCount()
-    {
-        int columns = DOMUtil.getIntAttributeIgnoreCase(this._panelGrid, IJSFConstants.ATTR_COLUMNS, 1);
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-        List children = JSFDOMUtil.getUIComponentChildren(this._panelGrid);
-        int numRows = (children.size() + columns - 1) / columns;
-
-        return numRows;
-    }
-
-    private int getPosition(Element cell)
-    {
-        List children = JSFDOMUtil.getUIComponentChildren(this._panelGrid);
-        int size = children.size();
-        int i = 0;
-        for (i = 0; i < size; i++)
-        {
-            if (cell == children.get(i))
-            {
-                break;
-            }
-        }
-        if (i == size)
-        {
-            return INVALID_POSITION;
-        }
-        return i;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/IInputWidgetTypes.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/IInputWidgetTypes.java
deleted file mode 100644
index a2df68a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/IInputWidgetTypes.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-interface IInputWidgetTypes 
-{
-    /**
-     *  a hidden input
-     */
-    public static final int       HIDDEN   = 0;
-    /**
-     * a secret input
-     */
-    public static final int       SECRET   = 1;
-    /**
-     * an input box
-     */
-    public static final int       TEXT     = 2;
-    /**
-     * an input text area
-     */
-    public static final int       TEXTAREA = 3;
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreActionListenerSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreActionListenerSection.java
deleted file mode 100644
index 0995808..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreActionListenerSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFCoreActionListenerSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-    public JSFCoreActionListenerSection()
-    {
-        super(ITLDConstants.URI_JSF_CORE, IJSFConstants.TAG_ACTIONLISTENER, 
-                new String[] {
-                	IJSFConstants.ATTR_TYPE
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreAttributeSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreAttributeSection.java
deleted file mode 100644
index 2767db4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreAttributeSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFCoreAttributeSection extends AttributeGroupSection
-{    
-    /**
-     * The default constructor
-     */
-    public JSFCoreAttributeSection()
-    {
-        super(ITLDConstants.URI_JSF_CORE, IJSFConstants.TAG_ATTRIBUTE, 
-                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/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 891975f..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.meta.EditorCreator;
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.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
-{
-    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(String uri, String tag, IAttributeDescriptor attr)
-    {
-        EditorCreator creator = EditorCreator.getInstance();
-        if (attr.getAttributeName().equals(IJSFConstants.ATTR_TYPE))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-                    .createDialogFieldWithWrapper(uri, tag, attr, null);
-            _typeField = (StyleComboDialogField) wrapper.getWrappedDialogField();
-            return wrapper;
-        }
-        else if (attr.getAttributeName().equals(IJSFConstants.ATTR_DATESTYLE))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-                    .createDialogFieldWithWrapper(uri, tag, attr, null);
-            _dateStyleField = (StyleComboDialogField) wrapper.getWrappedDialogField();
-            _dateStyleField.setItems(DATESTYLES);
-            return wrapper;
-        }
-        else if (attr.getAttributeName().equals(IJSFConstants.ATTR_TIMESTYLE))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-                    .createDialogFieldWithWrapper(uri, tag, attr, null);
-            _timeStyleField = (StyleComboDialogField) wrapper.getWrappedDialogField();
-            _timeStyleField.setItems(TIMESTYLES);
-            return wrapper;
-        }
-        else if (attr.getAttributeName().equals(IJSFConstants.ATTR_PATTERN))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-                    .createDialogFieldWithWrapper(uri, tag, attr, null);
-            _patternField = (StyleComboDialogField) wrapper.getWrappedDialogField();
-            return wrapper;
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    public IDialogFieldApplyListener getDialogFieldApplyListener(String uri, String tag, IAttributeDescriptor attr)
-    {
-        String attribute = attr.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);
-        }
-
-        String pattern = element.getAttribute(IJSFConstants.ATTR_PATTERN);
-        _patternField.setTextWithoutUpdate(pattern);
-
-        updateFieldStatus();
-    }
-
-    /**
-     * 
-     */
-    private void updateFieldStatus()
-    {
-        String type = _typeField.getText();
-        String dateStyle = _dateStyleField.getText();
-        String timeStyle = _timeStyleField.getText();
-
-        if (type.equalsIgnoreCase(TYPES[0]))
-        {
-            _dateStyleField.setEnabled(true);
-            _timeStyleField.setEnabled(false);
-            if (dateStyle.equalsIgnoreCase(DATESTYLES[5]))
-            {
-                _patternField.setEnabled(true);
-            }
-            else
-            {
-                _patternField.setEnabled(false);
-            }
-        }
-        else if (type.equalsIgnoreCase(TYPES[1]))
-        {
-            _dateStyleField.setEnabled(false);
-            _timeStyleField.setEnabled(true);
-            if (timeStyle.equalsIgnoreCase(TIMESTYLES[5]))
-            {
-                _patternField.setEnabled(true);
-            }
-            else
-            {
-                _patternField.setEnabled(false);
-            }
-        }
-        else if (type.equalsIgnoreCase(TYPES[2]))
-        {
-            _dateStyleField.setEnabled(true);
-            _timeStyleField.setEnabled(true);
-            if (dateStyle.equalsIgnoreCase(DATESTYLES[5]) || timeStyle.equalsIgnoreCase(TIMESTYLES[5]))
-            {
-                _patternField.setEnabled(true);
-            }
-            else
-            {
-                _patternField.setEnabled(false);
-            }
-        }
-    }
-
-    private void updatePatternItems()
-    {
-        String type = _typeField.getText();
-        String dateStyle = _dateStyleField.getText();
-        String timeStyle = _timeStyleField.getText();
-
-        if (type.equalsIgnoreCase(TYPES[0]) && dateStyle.equalsIgnoreCase(DATESTYLES[5]))
-        {
-            _patternField.getComboControl(null, null).removeAll();
-            _patternField.getComboControl(null, null).setItems(DATEPATTERNS);
-        }
-
-        if (type.equalsIgnoreCase(TYPES[1]) && timeStyle.equalsIgnoreCase(TIMESTYLES[5]))
-        {
-            _patternField.getComboControl(null, null).removeAll();
-            _patternField.getComboControl(null, null).setItems(TIMEPATTERNS);
-        }
-
-        if (type.equalsIgnoreCase(TYPES[2])
-                && (dateStyle.equalsIgnoreCase(DATESTYLES[5]) || timeStyle.equalsIgnoreCase(TIMESTYLES[5])))
-        {
-            _patternField.getComboControl(null, null).removeAll();
-            _patternField.getComboControl(null, null).setItems(DATETIMEPATTERNS);
-        }
-    }
-
-    private void updateFieldData()
-    {
-        String type = _typeField.getText();
-        String dateStyle = _dateStyleField.getText();
-        String timeStyle = _timeStyleField.getText();
-        String pattern = _patternField.getText();
-
-        // update the model
-        if (!_dateStyleField.isEnabled() || dateStyle.equalsIgnoreCase(DATESTYLES[5]))
-        {
-            dateStyle = "";
-        }
-
-        if (!_timeStyleField.isEnabled() || timeStyle.equalsIgnoreCase(TIMESTYLES[5]))
-        {
-            timeStyle = "";
-        }
-
-        if (!_patternField.isEnabled())
-        {
-            pattern = "";
-
-        }
-
-        Map map = new HashMap();
-        map.put(IJSFConstants.ATTR_TYPE, type);
-        map.put(IJSFConstants.ATTR_DATESTYLE, dateStyle);
-        map.put(IJSFConstants.ATTR_TIMESTYLE, timeStyle);
-        map.put(IJSFConstants.ATTR_PATTERN, pattern);
-
-        ChangeAttributeCommand c = new ChangeAttributeCommand(SectionResources
-                .getString("JSFCoreConvertDateTimeSection.ChangeAttribute"), getElement(), map);
-        c.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreConvertNumberGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreConvertNumberGroup.java
deleted file mode 100644
index 760847b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreConvertNumberGroup.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.HashMap;
-import java.util.Map;
-
-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.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.meta.EditorCreator;
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.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 ComboDialogField      _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(String uri, String tag, IAttributeDescriptor attr)
-    {
-        EditorCreator creator = EditorCreator.getInstance();
-        if (attr.getAttributeName().equals(IJSFConstants.ATTR_TYPE))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-                    .createDialogFieldWithWrapper(uri, tag, attr, null);
-            _typeField = (StyleComboDialogField) wrapper.getWrappedDialogField();
-                    _typeField.setItems(TYPES);
-            return wrapper;
-        }
-        else if (attr.getAttributeName().equals(IJSFConstants.ATTR_CURRENCYCODE))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-                    .createDialogFieldWithWrapper(uri, tag, attr, null);
-            _currencyCodeField = (ComboDialogField) wrapper.getWrappedDialogField();
-            return wrapper;
-        }
-        else if (attr.getAttributeName().equals(IJSFConstants.ATTR_CURRENCYSYMBOL))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-                    .createDialogFieldWithWrapper(uri, tag, attr, null);
-            _currencySymbolField = (StringDialogField) wrapper.getWrappedDialogField();
-            return wrapper;
-        }
-        else if (attr.getAttributeName().equals(IJSFConstants.ATTR_PATTERN))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-                    .createDialogFieldWithWrapper(uri, tag, attr, null);
-            _patternField = (StyleComboDialogField) wrapper.getWrappedDialogField();
-            return wrapper;
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    public IDialogFieldApplyListener getDialogFieldApplyListener(String uri, String tag, IAttributeDescriptor attr)
-    {
-        String attribute = attr.getAttributeName();
-        if (attribute.equals(IJSFConstants.ATTR_CURRENCYCODE) || attribute.equals(IJSFConstants.ATTR_CURRENCYSYMBOL)
-                || attribute.equals(IJSFConstants.ATTR_PATTERN))
-        {
-            IDialogFieldApplyListener listener = new IDialogFieldApplyListener()
-            {
-                public void dialogFieldApplied(DialogField field)
-                {
-                    updateFieldData();
-                }
-            };
-            return listener;
-        }
-        else if (attribute.equals(IJSFConstants.ATTR_TYPE))
-        {
-            IDialogFieldApplyListener listener = new IDialogFieldApplyListener()
-            {
-                public void dialogFieldApplied(DialogField field)
-                {
-                    updateFieldStatus();
-                    updateFieldData();
-                }
-            };
-            return listener;
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.pagedesigner.properties.attrgroup.AttributeGroup#refreshData()
-     */
-    public void refreshData()
-    {
-        IDOMElement element = getElement();
-
-        String type = element.getAttribute(IJSFConstants.ATTR_TYPE);
-        if (!_typeField.getText().equalsIgnoreCase(TYPES[3]))
-        {
-            _typeField.setTextWithoutUpdate(type);
-        }
-
-        String currencyCode = element.getAttribute(IJSFConstants.ATTR_CURRENCYCODE);
-        _currencyCodeField.setTextWithoutUpdate(currencyCode);
-
-        String currencySymbol = element.getAttribute(IJSFConstants.ATTR_CURRENCYSYMBOL);
-        _currencySymbolField.setTextWithoutUpdate(currencySymbol);
-
-        String pattern = element.getAttribute(IJSFConstants.ATTR_PATTERN);
-        _patternField.setTextWithoutUpdate(pattern);
-
-        updateFieldStatus();
-    }
-
-    private void updateFieldStatus()
-    {
-        String type = _typeField.getText();
-
-        if (type.equalsIgnoreCase(TYPES[0]))
-        {
-            _currencyCodeField.setEnabled(false);
-            _currencySymbolField.setEnabled(false);
-            _patternField.setEnabled(false);
-        }
-        else if (type.equalsIgnoreCase(TYPES[1]))
-        {
-            _currencyCodeField.setEnabled(true);
-            _currencySymbolField.setEnabled(true);
-            _patternField.setEnabled(false);
-        }
-        else if (type.equalsIgnoreCase(TYPES[2]))
-        {
-            _currencyCodeField.setEnabled(false);
-            _currencySymbolField.setEnabled(false);
-            _patternField.setEnabled(false);
-        }
-        else if (type.equalsIgnoreCase(TYPES[3]))
-        {
-            _currencyCodeField.setEnabled(false);
-            _currencySymbolField.setEnabled(false);
-            _patternField.setEnabled(true);
-        }
-    }
-
-    private void updateFieldData()
-    {
-        String type = _typeField.getText();
-        String currencyCode = _currencyCodeField.getText();
-        String currencySymbol = _currencySymbolField.getText();
-        String pattern = _patternField.getText();
-
-        // update the model
-        if (type.equalsIgnoreCase(TYPES[3]))
-        {
-            type = "";
-        }
-
-        if (!_currencyCodeField.isEnabled())
-        {
-            currencyCode = "";
-        }
-
-        if (!_currencySymbolField.isEnabled())
-        {
-            currencySymbol = "";
-        }
-
-        if (!_patternField.isEnabled())
-        {
-            pattern = "";
-        }
-
-        Map map = new HashMap();
-        map.put(IJSFConstants.ATTR_TYPE, type);
-        map.put(IJSFConstants.ATTR_CURRENCYCODE, currencyCode);
-        map.put(IJSFConstants.ATTR_CURRENCYSYMBOL, currencySymbol);
-        map.put(IJSFConstants.ATTR_PATTERN, pattern);
-
-        ChangeAttributeCommand c = new ChangeAttributeCommand(SectionResources
-                .getString("JSFCoreConvertNumberSection.CommandLabel.ChangeAttribute"), getElement(), map);
-        c.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreConverterSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreConverterSection.java
deleted file mode 100644
index d4eac78..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreConverterSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFCoreConverterSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-    public JSFCoreConverterSection()
-    {
-        super(ITLDConstants.URI_JSF_CORE, IJSFConstants.TAG_CONVERTER, 
-                new String[] {
-                	IJSFConstants.ATTR_CONVERTERID
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreFacetSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreFacetSection.java
deleted file mode 100644
index cb840d1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreFacetSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFCoreFacetSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-    public JSFCoreFacetSection()
-    {
-        super(ITLDConstants.URI_JSF_CORE, IJSFConstants.TAG_FACET, 
-                new String[] {
-                	IJSFConstants.ATTR_NAME
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreLoadBundleSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreLoadBundleSection.java
deleted file mode 100644
index 769060c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreLoadBundleSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFCoreLoadBundleSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-    public JSFCoreLoadBundleSection()
-    {
-        super(ITLDConstants.URI_JSF_CORE, IJSFConstants.TAG_LOADBUNDLE, 
-                new String[] {
-                	IJSFConstants.ATTR_BASENAME,
-                	IJSFConstants.ATTR_VAR
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreParamSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreParamSection.java
deleted file mode 100644
index 5794d92..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreParamSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFCoreParamSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-    public JSFCoreParamSection()
-    {
-        super(ITLDConstants.URI_JSF_CORE, IJSFConstants.TAG_PARAM, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_NAME,
-                	IJSFConstants.ATTR_VALUE,
-                	IJSFConstants.ATTR_BINDING
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreSelectItemSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreSelectItemSection.java
deleted file mode 100644
index e5801c9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreSelectItemSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFCoreSelectItemSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-    public JSFCoreSelectItemSection()
-    {
-        super(ITLDConstants.URI_JSF_CORE, IJSFConstants.TAG_SELECTITEM, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_ITEMLABEL,
-                	IJSFConstants.ATTR_ITEMVALUE
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreSelectItemsSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreSelectItemsSection.java
deleted file mode 100644
index a2390c2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreSelectItemsSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFCoreSelectItemsSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-    public JSFCoreSelectItemsSection()
-    {
-        super(ITLDConstants.URI_JSF_CORE, IJSFConstants.TAG_SELECTITEMS, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_VALUE,
-                    IJSFConstants.ATTR_BINDING
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreSubviewSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreSubviewSection.java
deleted file mode 100644
index af1880e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreSubviewSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFCoreSubviewSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-    public JSFCoreSubviewSection()
-    {
-        super(ITLDConstants.URI_JSF_CORE, IJSFConstants.TAG_SUBVIEW, 
-                new String[] {
-                	IJSFConstants.ATTR_ID
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreValidateDoubleRangeSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreValidateDoubleRangeSection.java
deleted file mode 100644
index 747a343..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreValidateDoubleRangeSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFCoreValidateDoubleRangeSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-    public JSFCoreValidateDoubleRangeSection()
-    {
-        super(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/sections/JSFCoreValidateLengthSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreValidateLengthSection.java
deleted file mode 100644
index 6c60c9d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreValidateLengthSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFCoreValidateLengthSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-    public JSFCoreValidateLengthSection()
-    {
-        super(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/sections/JSFCoreValidateLongRangeSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreValidateLongRangeSection.java
deleted file mode 100644
index 7933d9c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreValidateLongRangeSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFCoreValidateLongRangeSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-    public JSFCoreValidateLongRangeSection()
-    {
-        super(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/sections/JSFCoreValidatorSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreValidatorSection.java
deleted file mode 100644
index aa9d9bf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreValidatorSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFCoreValidatorSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-    public JSFCoreValidatorSection()
-    {
-        super(ITLDConstants.URI_JSF_CORE, IJSFConstants.TAG_VALIDATOR, 
-                new String[] {
-                	IJSFConstants.ATTR_VALIDATORID
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreValueChangeListenerSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreValueChangeListenerSection.java
deleted file mode 100644
index 0db0344..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreValueChangeListenerSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFCoreValueChangeListenerSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-    public JSFCoreValueChangeListenerSection()
-    {
-        super(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/sections/JSFCoreVerbatimSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreVerbatimSection.java
deleted file mode 100644
index ec0eea5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreVerbatimSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFCoreVerbatimSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-    public JSFCoreVerbatimSection()
-    {
-        super(ITLDConstants.URI_JSF_CORE, IJSFConstants.TAG_VERBATIM, 
-                new String[] {
-                	IJSFConstants.ATTR_ESCAPE
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreViewSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreViewSection.java
deleted file mode 100644
index d08a2f7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreViewSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFCoreViewSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-    public JSFCoreViewSection()
-    {
-        super(ITLDConstants.URI_JSF_CORE, IJSFConstants.TAG_VIEW, 
-                new String[] {
-                	IJSFConstants.ATTR_LOCALE
-                });
-    }
-}
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 bd40493..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlActionListenerSection.java
+++ /dev/null
@@ -1,312 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage;
-import org.eclipse.wst.common.ui.properties.internal.provisional.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHtmlActionListenerSection extends BaseCustomSection
-{
-    final private static String[] LISTENTYPES = { "Action"};
-
-    private IDOMElement            _element;
-    private Table                 _listenersTable;
-    private TableViewer           _listenersViewer;
-    private CCombo                _listenTypeCombo;
-    private Button                _listenAddButton, _listenRemoveButton;
-
-    private class ListenerCotentLabelProvider 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 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: 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?
-        }
-    }
-
-    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(100);
-
-        _listenersViewer = new TableViewer(_listenersTable);
-        _listenersViewer.setContentProvider(new ListenerCotentLabelProvider());
-        _listenersViewer.setLabelProvider(new ListenerCotentLabelProvider());
-        _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);
-        _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/JSFHtmlColumnSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlColumnSection.java
deleted file mode 100644
index 6791f46..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlColumnSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlColumnSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-    public JSFHtmlColumnSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_COLUMN, 
-                new String[] {
-                	IJSFConstants.ATTR_ID
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlCommandButtonSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlCommandButtonSection.java
deleted file mode 100644
index 9abaf11..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlCommandButtonSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlCommandButtonSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-    public JSFHtmlCommandButtonSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_COMMANDBUTTON, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                    IJSFConstants.ATTR_VALUE,
-                    IJSFConstants.ATTR_ACTION,
-                    IJSFConstants.ATTR_ACTIONLISTENER,
-                    IJSFConstants.ATTR_TYPE,
-                	IJSFConstants.ATTR_STYLE
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlCommandLinkSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlCommandLinkSection.java
deleted file mode 100644
index 320c4bf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlCommandLinkSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlCommandLinkSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-    public JSFHtmlCommandLinkSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_COMMANDLINK, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_VALUE,
-                	IJSFConstants.ATTR_ACTION,
-                    IJSFConstants.ATTR_ACTIONLISTENER,
-                	IJSFConstants.ATTR_STYLE
-                });
-    }
-}
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 d284853..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlDataTableColumnsSection.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.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.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage;
-import org.eclipse.wst.common.ui.properties.internal.provisional.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 private String           DEFAULT_COLUMN_NAME = "column"; //$NON-NLS-1$
-    final private String           DEFAULT_FACET_NAME  = "header"; //$NON-NLS-1$
-    final 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?
-        }
-
-    }
-
-    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();
-            }
-        }
-        );
-    }
-
-    public 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/JSFHtmlDataTableSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlDataTableSection.java
deleted file mode 100644
index 89bbeb3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlDataTableSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlDataTableSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-    public JSFHtmlDataTableSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_DATATABLE, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_VALUE,
-                    IJSFConstants.ATTR_VAR,
-                	IJSFConstants.ATTR_WIDTH,
-                	IJSFConstants.ATTR_BORDER,
-                	IJSFConstants.ATTR_BGCOLOR,
-                    IJSFConstants.ATTR_STYLE,
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlFormSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlFormSection.java
deleted file mode 100644
index 1fe391d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlFormSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlFormSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-   public JSFHtmlFormSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_FORM, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_STYLE
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlGraphicImageSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlGraphicImageSection.java
deleted file mode 100644
index 3475f7b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlGraphicImageSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlGraphicImageSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-    public JSFHtmlGraphicImageSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_GRAPHICIMAGE, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                    IJSFConstants.ATTR_VALUE,
-                    IJSFConstants.ATTR_URL,
-                    IJSFConstants.ATTR_BINDING,
-                	IJSFConstants.ATTR_STYLE
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputHiddenSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputHiddenSection.java
deleted file mode 100644
index 04c47b2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputHiddenSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlInputHiddenSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-    public JSFHtmlInputHiddenSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_INPUTHIDDEN, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_VALUE
-                });
-    }
-}
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 e5bba5f..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.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage;
-import org.eclipse.wst.common.ui.properties.internal.provisional.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 55a7efa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputOthersSection.java
+++ /dev/null
@@ -1,867 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage;
-import org.eclipse.wst.common.ui.properties.internal.provisional.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 ValidateCotentLabelProvider 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.setInput(_element);
-            updateValidateButtonStatus();
-        }
-    }
-
-    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?
-        }
-    }
-
-    private class ListenerCotentLabelProvider 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(100);
-
-        _convertorsViewer = new TableViewer(_convertorsTable);
-        _convertorsViewer.setContentProvider(new ConvertCotentLabelProvider());
-        _convertorsViewer.setLabelProvider(new ConvertCotentLabelProvider());
-        _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(100);
-
-        _listenersViewer = new TableViewer(_listenersTable);
-        _listenersViewer.setContentProvider(new ListenerCotentLabelProvider());
-        _listenersViewer.setLabelProvider(new ListenerCotentLabelProvider());
-        _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(50);
-
-        TableColumn minColumn = new TableColumn(_validatorsTable, SWT.NONE);
-        minColumn.setText(SectionResources.getString("JSFHtmlInputTextSection.Minimum")); //$NON-NLS-1$
-        minColumn.setWidth(50);
-
-        TableColumn maxColumn = new TableColumn(_validatorsTable, SWT.NONE);
-        maxColumn.setText(SectionResources.getString("JSFHtmlInputTextSection.Maximum")); //$NON-NLS-1$
-        maxColumn.setWidth(50);
-
-        _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 ValidateCotentLabelProvider());
-        _validatorsViewer.setLabelProvider(new ValidateCotentLabelProvider());
-        _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/JSFHtmlInputSecretSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputSecretSection.java
deleted file mode 100644
index 7f7b212..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputSecretSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlInputSecretSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor
-     */
-    public JSFHtmlInputSecretSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_INPUTSECRET, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_VALUE,
-                	IJSFConstants.ATTR_STYLE
-                });
-    }
-}
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 e1eda9f..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.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage;
-import org.eclipse.wst.common.ui.properties.internal.provisional.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/JSFHtmlInputTextSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputTextSection.java
deleted file mode 100644
index 2360ee2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputTextSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlInputTextSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor 
-     */
-    public JSFHtmlInputTextSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_INPUTTEXT, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_VALUE,
-                	IJSFConstants.ATTR_STYLE
-                });
-    }
-}
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 d757e07..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.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage;
-import org.eclipse.wst.common.ui.properties.internal.provisional.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/JSFHtmlInputTextareaSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputTextareaSection.java
deleted file mode 100644
index bb4f5c9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputTextareaSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlInputTextareaSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor 
-     */
-    public JSFHtmlInputTextareaSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_INPUTTEXTAREA, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_VALUE,
-                	IJSFConstants.ATTR_STYLE
-                });
-    }
-}
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 dab7f97..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.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage;
-import org.eclipse.wst.common.ui.properties.internal.provisional.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * FIXME: there is a lot of copied code for this input sections
- * @author mengbo
- * @version 1.5
- */
-public class JSFHtmlInputTextareaTypeSection extends BaseCustomSection
-{
-    private RadiosDialogField     _typesField;
-
-    final private static String[] TYPES    = { SectionResources.getString("JSFHtmlInputHiddenSection.Type0"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type1"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type2"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type3") //$NON-NLS-1$
-                                           };
-
-    /**
-     * The default constructor 
-     */
-    public JSFHtmlInputTextareaTypeSection()
-    {
-        super();
-        _typesField = new RadiosDialogField();
-        _typesField.setLabelText(SectionResources.getString("JSFHtmlInputHiddenSection.Type")); //$NON-NLS-1$
-        _typesField.setItems(TYPES);
-        _typesField.setDialogFieldApplyListener(new IDialogFieldApplyListener()
-        {
-            public void dialogFieldApplied(DialogField field)
-            {
-                int type = _typesField.getSelectedIndex();
-                String prefix = _element.getPrefix();
-                String localTag = toLocalTag(type);
-                String newtag = prefix + ":" + localTag; //$NON-NLS-1$
-                Map attrs = new HashMap();
-                if (type == IInputWidgetTypes.TEXTAREA)
-                {
-                    // need to change "size" attribute to "cols"
-                    String size = _element.getAttribute(IJSFConstants.ATTR_SIZE);
-                    if (size != null && size.length() != 0)
-                    {
-                        attrs.put(IJSFConstants.ATTR_SIZE, null);
-                        attrs.put(IJSFConstants.ATTR_COLS, size);
-                    }
-                }
-                else
-                {
-                    // need to change "cols" attribute to "size"
-                    String size = _element.getAttribute(IJSFConstants.ATTR_COLS);
-                    if (size != null && size.length() != 0)
-                    {
-                        attrs.put(IJSFConstants.ATTR_COLS, null); //$NON-NLS-1$
-                        attrs.put(IJSFConstants.ATTR_SIZE, size); //$NON-NLS-1$
-                    }
-                }
-                ChangeTagCommand c = new ChangeTagCommand(SectionResources
-                        .getString("JSFHtmlInputHidden.CommandLabel.ChangeType"), _element, newtag, attrs, true); //$NON-NLS-1$
-                c.execute();
-                _element = c.getNewElement();
-            }
-        });
-    }
-
-    public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage)
-    {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory();
-        Composite top = factory.createFlatFormComposite(parent);
-
-        int numberOfColumns = _typesField.getNumberOfControls();
-        GridLayout layout = new GridLayout(numberOfColumns, false);
-        top.setLayout(layout);
-
-        _typesField.doFillIntoGrid(factory, top, numberOfColumns);
-        LayoutUtil.setGrabHorizontal(_typesField.getGroup(factory, top), true);
-    }
-
-    private String toLocalTag(int type)
-    {
-        switch (type)
-        {
-            case IInputWidgetTypes.SECRET:
-                return IJSFConstants.TAG_INPUTSECRET;
-            case IInputWidgetTypes.HIDDEN:
-                return IJSFConstants.TAG_INPUTHIDDEN;
-            case IInputWidgetTypes.TEXTAREA:
-                return IJSFConstants.TAG_INPUTTEXTAREA;
-            case IInputWidgetTypes.TEXT:
-                return IJSFConstants.TAG_INPUTTEXT;
-            default:
-                return IJSFConstants.TAG_INPUTHIDDEN;
-        }
-    }
-
-    public void setInput(IWorkbenchPart part, ISelection selection)
-    {
-        super.setInput(part, selection);
-
-        _typesField.setSelectedIndexWithoutUpdate(getInputType());
-    }
-
-    /**
-     * @return one of IInputWidgetTypes
-     */
-    public int getInputType()
-    {
-        String localTag = _element.getLocalName();
-        if (IJSFConstants.TAG_INPUTTEXT.equals(localTag))
-        {
-            return IInputWidgetTypes.TEXT;
-        }
-        else if (IJSFConstants.TAG_INPUTSECRET.equals(localTag))
-        {
-            return IInputWidgetTypes.SECRET;
-        }
-        else if (IJSFConstants.TAG_INPUTHIDDEN.equals(localTag))
-        {
-            return IInputWidgetTypes.HIDDEN;
-        }
-        else if (IJSFConstants.TAG_INPUTTEXTAREA.equals(localTag))
-        {
-            return IInputWidgetTypes.TEXTAREA;
-        }
-        else
-        {
-            return IInputWidgetTypes.HIDDEN;
-        }
-    }
-
-    protected void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue,
-            Object newValue, int pos)
-    {
-        if (_typesField != null)
-        {
-            _typesField.setSelectedIndexWithoutUpdate(getInputType());
-        }
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlMessageSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlMessageSection.java
deleted file mode 100644
index 8476673..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlMessageSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlMessageSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor 
-     */
-    public JSFHtmlMessageSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_MESSAGE, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_FOR,
-                	IJSFConstants.ATTR_STYLE
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlMessagesSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlMessagesSection.java
deleted file mode 100644
index 14cdabc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlMessagesSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlMessagesSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor 
-     */
-    public JSFHtmlMessagesSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_MESSAGES, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_LAYOUT,
-                	IJSFConstants.ATTR_GLOBEONLY,
-                    IJSFConstants.ATTR_STYLE,
-                });
-    }
-}
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 403fe09..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputFormatParamsSection.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.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.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage;
-import org.eclipse.wst.common.ui.properties.internal.provisional.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();
-        }
-    }
-
-    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/JSFHtmlOutputFormatSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputFormatSection.java
deleted file mode 100644
index 5011d60..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputFormatSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlOutputFormatSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor 
-     */
-    public JSFHtmlOutputFormatSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_OUTPUTFORMAT, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_VALUE,
-                	IJSFConstants.ATTR_STYLE
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputLabelSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputLabelSection.java
deleted file mode 100644
index 17fb072..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputLabelSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlOutputLabelSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor 
-     */
-    public JSFHtmlOutputLabelSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_OUTPUTLABEL, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_FOR,
-                	IJSFConstants.ATTR_STYLE
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputLinkSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputLinkSection.java
deleted file mode 100644
index 338b7ad..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputLinkSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlOutputLinkSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor 
-     */
-    public JSFHtmlOutputLinkSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_OUTPUTLINK, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_VALUE,
-                	IJSFConstants.ATTR_STYLE
-                });
-    }
-}
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 f35fb1f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputTextConverterSection.java
+++ /dev/null
@@ -1,318 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage;
-import org.eclipse.wst.common.ui.properties.internal.provisional.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?
-        }
-
-    }
-
-    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/JSFHtmlOutputTextSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputTextSection.java
deleted file mode 100644
index e46317c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputTextSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlOutputTextSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor 
-     */
-    public JSFHtmlOutputTextSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_OUTPUTTEXT, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_VALUE,
-                    IJSFConstants.ATTR_BINDING,
-                	IJSFConstants.ATTR_STYLE
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlPanelGridSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlPanelGridSection.java
deleted file mode 100644
index 1c92da3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlPanelGridSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlPanelGridSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor 
-     */
-    public JSFHtmlPanelGridSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_PANELGRID, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                    IJSFConstants.ATTR_COLUMNS,
-                    IJSFConstants.ATTR_BORDER,
-                	IJSFConstants.ATTR_STYLE
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlPanelGroupSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlPanelGroupSection.java
deleted file mode 100644
index a997931..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlPanelGroupSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlPanelGroupSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor 
-     */
-    public JSFHtmlPanelGroupSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_PANELGROUP, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_VALUE,
-                	IJSFConstants.ATTR_STYLE
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectBooleanCheckboxSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectBooleanCheckboxSection.java
deleted file mode 100644
index 28c358d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectBooleanCheckboxSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlSelectBooleanCheckboxSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor 
-     */
-    public JSFHtmlSelectBooleanCheckboxSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_SELECTBOOLEANCHECKBOX, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_VALUE,
-                	IJSFConstants.ATTR_STYLE
-                });
-    }
-}
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 4eb9eeb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectChoicesSection.java
+++ /dev/null
@@ -1,375 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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.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.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage;
-import org.eclipse.wst.common.ui.properties.internal.provisional.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 class ChoiceCotentLabelProvider 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("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(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()
-        {
-            // do nothing
-        }
-
-        /* (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?
-        }
-    }
-
-    public JSFHtmlSelectChoicesSection()
-    {
-        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);
-
-        createChoicePart(factory, top);
-    }
-
-    /**
-     * @param factory
-     * @param other
-     */
-    private void createChoicePart(TabbedPropertySheetWidgetFactory factory, 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);
-
-        TableColumn choiceColumn = new TableColumn(_choiceTable, SWT.NONE);
-        choiceColumn.setText(SectionResources.getString("JSFHtmlSelectManyCheckboxSection.Choices")); //$NON-NLS-1$
-        choiceColumn.setWidth(100);
-
-        _choiceViewer = new TableViewer(_choiceTable);
-        _choiceViewer.setContentProvider(new ChoiceCotentLabelProvider());
-        _choiceViewer.setLabelProvider(new ChoiceCotentLabelProvider());
-        _choiceViewer.addDoubleClickListener(new IDoubleClickListener()
-        {
-            public void doubleClick(DoubleClickEvent event)
-            {
-                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                if (selection != null)
-                {
-                    IDOMElement node = (IDOMElement) selection.getFirstElement();
-                    gotoNode(node);
-                }
-            }
-        });
-        _choiceViewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(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()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                Map attributes = new HashMap();
-                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()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                IStructuredSelection selection = (IStructuredSelection) _choiceViewer.getSelection();
-                if (selection != null)
-                {
-                    for (Iterator i = selection.iterator(); i.hasNext();)
-                    {
-                        IDOMElement node = (IDOMElement) i.next();
-                        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()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                int index = _choiceTable.getSelectionIndex();
-                IDOMElement child = (IDOMElement) _choiceTable.getItem(index).getData();
-                IDOMElement refchild = (IDOMElement) _choiceTable.getItem(index - 1).getData();
-                RemoveSubNodeCommand remove = new RemoveSubNodeCommand(SectionResources
-                        .getString("JSFHtmlSelectManyCheckboxSection.CommandLabel.RemoveSubTag"), _element, child); //$NON-NLS-1$
-                remove.execute();
-                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()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                int index = _choiceTable.getSelectionIndex();
-                IDOMElement child = (IDOMElement) _choiceTable.getItem(index).getData();
-                IDOMElement refchild = (IDOMElement) _choiceTable.getItem(index + 1).getData();
-                RemoveSubNodeCommand remove = new RemoveSubNodeCommand(SectionResources
-                        .getString("JSFHtmlSelectManyCheckboxSection.CommandLabel.RemoveSubTag"), _element, refchild); //$NON-NLS-1$
-                remove.execute();
-                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);
-        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);
-        }
-    }
-
-    public void setInput(IWorkbenchPart part, ISelection selection)
-    {
-        super.setInput(part, selection);
-
-        _choiceViewer.setInput(_element);
-        updateChoiceButtonStatus();
-    }
-
-    protected void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue,
-            Object newValue, 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/JSFHtmlSelectManyCheckboxSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectManyCheckboxSection.java
deleted file mode 100644
index add7c7e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectManyCheckboxSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlSelectManyCheckboxSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor 
-     */
-    public JSFHtmlSelectManyCheckboxSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_SELECTMANYCHECKBOX, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_VALUE,
-                    IJSFConstants.ATTR_LAYOUT,
-                	IJSFConstants.ATTR_STYLE,
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectManyListboxSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectManyListboxSection.java
deleted file mode 100644
index 8ab6d1c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectManyListboxSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlSelectManyListboxSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor 
-     */
-    public JSFHtmlSelectManyListboxSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_SELECTMANYLISTBOX, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_VALUE,
-                	IJSFConstants.ATTR_SIZE,
-                    IJSFConstants.ATTR_STYLE,
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectManyMenuSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectManyMenuSection.java
deleted file mode 100644
index be99523..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectManyMenuSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlSelectManyMenuSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor 
-     */
-    public JSFHtmlSelectManyMenuSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_SELECTMANYMENU, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_VALUE,
-                	IJSFConstants.ATTR_STYLE
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectOneListboxSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectOneListboxSection.java
deleted file mode 100644
index 47ae386..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectOneListboxSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlSelectOneListboxSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor 
-     */
-    public JSFHtmlSelectOneListboxSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_SELECTONELISTBOX, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_VALUE,
-                    IJSFConstants.ATTR_SIZE,
-                	IJSFConstants.ATTR_STYLE,
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectOneMenuSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectOneMenuSection.java
deleted file mode 100644
index 1d4965e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectOneMenuSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlSelectOneMenuSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor 
-     */
-    public JSFHtmlSelectOneMenuSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_SELECTONEMENU, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_VALUE,
-                	IJSFConstants.ATTR_STYLE
-                });
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectOneRadioSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectOneRadioSection.java
deleted file mode 100644
index d6b8362..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectOneRadioSection.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.jsf.ui.sections;
-
-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.AttributeGroupSection;
-
-/**
- * @author mengbo
- */
-public class JSFHtmlSelectOneRadioSection extends AttributeGroupSection
-{
-    /**
-     * The default constructor 
-     */
-    public JSFHtmlSelectOneRadioSection()
-    {
-        super(ITLDConstants.URI_JSF_HTML, IJSFConstants.TAG_SELECTONERADIO, 
-                new String[] {
-                	IJSFConstants.ATTR_ID,
-                	IJSFConstants.ATTR_VALUE,
-                    IJSFConstants.ATTR_LAYOUT,
-                	IJSFConstants.ATTR_STYLE,
-                });
-    }
-}
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 895d778..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, 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
-###############################################################################
-# <f:convertDateTime>
-JSFCoreConvertDateTimeSection.ChangeAttribute=Change Attribute
-
-# <f:convertNumber>
-JSFCoreConvertNumberSection.CommandLabel.ChangeAttribute=Change Attribute
-
-# <h:commandButton>
-JSFHtmlCommandButtonSection.Listeners=Listeners
-JSFHtmlCommandButtonSection.Add=&Add
-JSFHtmlCommandButtonSection.Remove=&Remove
-JSFHtmlCommandButtonSection.CommandLabel.AddSubTag=Add Sub Tag
-JSFHtmlCommandButtonSection.CommandLabel.RemoveSubTag=Remove Sub Tag
-
-# <h:dataTable>
-JSFHtmlDataTableSection.Columns=Columns
-JSFHtmlDataTableSection.Add=&Add
-JSFHtmlDataTableSection.Remove=&Remove
-JSFHtmlDataTableSection.MoveUp=Move &up
-JSFHtmlDataTableSection.MoveDown=Move &down
-JSFHtmlDataTableSection.CommandLabel.AddSubTag=Add Sub Tag
-JSFHtmlDataTableSection.CommandLabel.RemoveSubTag=Remove Sub Tag
-JSFHtmlDataTableSection.CommandLabel.InsertSubTag=Insert Sub Tag
-
-# <h:inputHidden>
-JSFHtmlInputHiddenSection.Type=Type:
-JSFHtmlInputHiddenSection.Type0=Hidden
-JSFHtmlInputHiddenSection.Type1=Secret
-JSFHtmlInputHiddenSection.Type2=Text
-JSFHtmlInputHiddenSection.Type3=Textarea
-
-JSFHtmlInputHidden.CommandLabel.ChangeType=Change Type
-
-# <h:inputText>
-JSFHtmlInputTextSection.Validators=Validators
-JSFHtmlInputTextSection.Listeners=Listeners
-JSFHtmlInputTextSection.Minimum=Minimum
-JSFHtmlInputTextSection.Maximum=Maximum
-JSFHtmlInputTextSection.Add=&Add
-JSFHtmlInputTextSection.Remove=&Remove
-JSFHtmlInputTextSection.Converter=Converter
-JSFHtmlInputTextSection.CommandLabel.ChangeAttribute=Change Attribute
-JSFHtmlInputTextSection.CommandLabel.AddSubTag=Add Sub Tag
-JSFHtmlInputTextSection.CommandLabel.RemoveSubTag=Remove Sub Tag
-
-# <h:outputFormat>
-JSFHtmlOutputFormatSection.Parameters=Parameters:
-JSFHtmlOutputFormatSection.ColName=Name
-JSFHtmlOutputFormatSection.ColValue=Value
-JSFHtmlOutputFormatSection.CommandLabel.ChangeAttribute=Change Attribute
-JSFHtmlOutputFormatSection.CommandLabel.AddSubTag=Add Sub Tag
-JSFHtmlOutputFormatSection.CommandLabel.RemoveSubTag=Remove Sub Tag
-
-# <h:outputText>
-JSFHtmlOutputTextSection.Converter=Converter
-JSFHtmlOutputTextSection.Add=&Add
-JSFHtmlOutputTextSection.Remove=&Remove
-JSFHtmlOutputTextSection.CommandLabel.AddSubTag=Add Sub Tag
-JSFHtmlOutputTextSection.CommandLabel.RemoveSubTag=Remove Sub Tag
-
-# <h:selectManyCheckbox>
-JSFHtmlSelectManyCheckboxSection.Choices=Choices
-JSFHtmlSelectManyCheckboxSection.Add=&Add
-JSFHtmlSelectManyCheckboxSection.Remove=&Remove
-JSFHtmlSelectManyCheckboxSection.MoveUp=Move &up
-JSFHtmlSelectManyCheckboxSection.MoveDown=Move &down
-JSFHtmlSelectManyCheckboxSection.CommandLabel.AddSubTag=Add Sub Tag
-JSFHtmlSelectManyCheckboxSection.CommandLabel.RemoveSubTag=Remove Sub Tag
-JSFHtmlSelectManyCheckboxSection.CommandLabel.InsertSubTag=Insert Sub Tag
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/util/JSFUIPluginResourcesUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/util/JSFUIPluginResourcesUtil.java
deleted file mode 100644
index 82906ce..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/util/JSFUIPluginResourcesUtil.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.util;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-
-/**
- * @author mengbo
- */
-public class JSFUIPluginResourcesUtil extends ResourceUtils
-{
-    private final static String             bundleName = "org.eclipse.jst.pagedesigner.jsf.ui.JSFUIResources";
-    private static Logger                   _log       = JSFUICommonPlugin.getLogger(JSFUIPluginResourcesUtil.class);
-    private static JSFUIPluginResourcesUtil _resource;                                                          // singleton
-
-    private JSFUIPluginResourcesUtil()
-    {
-        try
-        {
-            _resources = ResourceBundle.getBundle(bundleName);
-        }
-        catch (MissingResourceException e)
-        {
-            _log.error("Error in getting show messages resource bundle file", e);
-        }
-    }
-
-    /**
-     * @return the singleton instance
-     */
-    public static JSFUIPluginResourcesUtil getInstance()
-    {
-        if (_resource == null)
-        {
-            _resource = new JSFUIPluginResourcesUtil();
-        }
-        return _resource;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.classpath b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.cvsignore b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.cvsignore
deleted file mode 100644
index f9eb27a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-build.xml
-@dot
-javaCompiler...args
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.project b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.project
deleted file mode 100644
index 9685725..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.pagedesigner.jsp.core</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 1c9084e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 16:05:25 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 2f9ad38..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,77 +0,0 @@
-#Tue Apr 10 11:11:41 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.jdt.ui.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 82eb6c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Apr 06 18:25:15 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/META-INF/MANIFEST.MF
deleted file mode 100644
index a2bd3fa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,28 +0,0 @@
-Manifest-Version: 1.0
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.jst.pagedesigner.jsp.core;singleton:=true
-Bundle-Version: 1.0.1.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,1.1.0)",
- javax.servlet;bundle-version="[2.4.0,3.0.0)",
- javax.servlet.jsp;bundle-version="[2.0.0,3.0.0)",
- org.apache.commons.el;bundle-version="[1.0.0,2.0.0)"
-Eclipse-LazyStart: true
-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.metadata;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsp.core.pagevar;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsp.core.util;x-internal:=true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/about.html b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/about.html
deleted file mode 100644
index 72f94ad..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 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>
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 806d43f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/build.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
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = plugin.xml,\
-               META-INF/,\
-               .,\
-               lib/,\
-               schema/,\
-               about.html,\
-               plugin.properties,\
-               metadata/,\
-               icons/
-javacSource=1.5
-javacTarget=1.5
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_DECLARATION.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_DECLARATION.gif
deleted file mode 100644
index 5403f72..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_DECLARATION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_DIRECTIVE.INCLUDE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_DIRECTIVE.INCLUDE.gif
deleted file mode 100644
index 5926670..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_DIRECTIVE.INCLUDE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_DIRECTIVE.PAGE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_DIRECTIVE.PAGE.gif
deleted file mode 100644
index e21e763..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_DIRECTIVE.PAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_DIRECTIVE.TAGLIB.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_DIRECTIVE.TAGLIB.gif
deleted file mode 100644
index 723a10d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_DIRECTIVE.TAGLIB.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_EXPRESSION.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_EXPRESSION.gif
deleted file mode 100644
index 53a23e1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_EXPRESSION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_FALLBACK.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_FALLBACK.gif
deleted file mode 100644
index 2507aac..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_FALLBACK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_FORWARD.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_FORWARD.gif
deleted file mode 100644
index 7747595..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_FORWARD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_GETPROPERTY.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_GETPROPERTY.gif
deleted file mode 100644
index 4d11f8d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_GETPROPERTY.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_INCLUDE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_INCLUDE.gif
deleted file mode 100644
index 88e62b4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_INCLUDE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_PARAM.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_PARAM.gif
deleted file mode 100644
index 79e07c2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_PARAM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_PARAMS.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_PARAMS.gif
deleted file mode 100644
index 9f517ae..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_PARAMS.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_PLUGIN.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_PLUGIN.gif
deleted file mode 100644
index 2ba7b4b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_PLUGIN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_ROOT.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_ROOT.gif
deleted file mode 100644
index 922b61d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_ROOT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_SCRIPTLET.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_SCRIPTLET.gif
deleted file mode 100644
index a1d2e61..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_SCRIPTLET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_SETPROPERTY.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_SETPROPERTY.gif
deleted file mode 100644
index 4d11f8d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_SETPROPERTY.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_TEXT.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_TEXT.gif
deleted file mode 100644
index 4cc147e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_TEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_USEBEAN.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_USEBEAN.gif
deleted file mode 100644
index 9d54e8b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/large/JSP_USEBEAN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_DECLARATION.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_DECLARATION.gif
deleted file mode 100644
index 35f48ef..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_DECLARATION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_DIRECTIVE.INCLUDE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_DIRECTIVE.INCLUDE.gif
deleted file mode 100644
index 1ef9c8f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_DIRECTIVE.INCLUDE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_DIRECTIVE.PAGE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_DIRECTIVE.PAGE.gif
deleted file mode 100644
index 37c1e7c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_DIRECTIVE.PAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_DIRECTIVE.TAGLIB.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_DIRECTIVE.TAGLIB.gif
deleted file mode 100644
index 33ef3d8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_DIRECTIVE.TAGLIB.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_EXPRESSION.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_EXPRESSION.gif
deleted file mode 100644
index 66fd649..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_EXPRESSION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_FALLBACK.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_FALLBACK.gif
deleted file mode 100644
index 4fb4150..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_FALLBACK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_FORWARD.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_FORWARD.gif
deleted file mode 100644
index 1d3bafb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_FORWARD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_GETPROPERTY.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_GETPROPERTY.gif
deleted file mode 100644
index af4450a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_GETPROPERTY.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_INCLUDE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_INCLUDE.gif
deleted file mode 100644
index 2584c31..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_INCLUDE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_PARAM.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_PARAM.gif
deleted file mode 100644
index b3e0727..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_PARAM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_PARAMS.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_PARAMS.gif
deleted file mode 100644
index 4075922..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_PARAMS.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_PLUGIN.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_PLUGIN.gif
deleted file mode 100644
index 04bab8e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_PLUGIN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_ROOT.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_ROOT.gif
deleted file mode 100644
index f6d19d4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_ROOT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_SCRIPTLET.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_SCRIPTLET.gif
deleted file mode 100644
index 1753b96..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_SCRIPTLET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_SETPROPERTY.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_SETPROPERTY.gif
deleted file mode 100644
index af4450a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_SETPROPERTY.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_TEXT.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_TEXT.gif
deleted file mode 100644
index 7f506d9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_TEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_USEBEAN.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_USEBEAN.gif
deleted file mode 100644
index ba33db7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/icons/palette/JSP/small/JSP_USEBEAN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/metadata/jsp11.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/metadata/jsp11.properties
deleted file mode 100644
index 747235a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/metadata/jsp11.properties
+++ /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
-###############################################################################
-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.pagedesigner.jsp.core/metadata/jsp11.xml b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/metadata/jsp11.xml
deleted file mode 100644
index 1cd7345..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/metadata/jsp11.xml
+++ /dev/null
@@ -1,282 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-	xmlns:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore"
-	id="jsp11"
-	type="tagFile">
-	
-	<trait id="paletteInfos">
-		<value xsi:type="pi:PaletteInfos">
-			<item id="jsp:directive.include"/>
-			<item id="jsp:directive.taglib"/>
-			<item id="jsp:expression"/>
-			<item id="jsp:declaration"/>
-			<item id="jsp:useBean"/>
-			<item id="jsp:getProperty"/>
-			<item id="jsp:setProperty"/>
-			<item id="jsp:include"/>
-			<item id="jsp:text"/>
-			<item id="jsp:root"/>
-			<item id="jsp:forward"/>
-			<item id="jsp:param"/>
-			<item id="jsp:params"/>
-			<item id="jsp:plugin"/>
-			<item id="jsp:fallback"/>
-			<item id="jsp:scriptlet"/>
-			<item id="jsp:directive.page"/>			
-		</value>
-	</trait>
-
-	<trait id="images-base-path">
-		<value>$nl$/icons/palette/JSP</value>
-	</trait>
-
-	<trait id="display-label">
-		<value>JSP</value>
-	</trait>
-	
-	<entity id="jsp:directive.include">
-		<trait id="display-label">
-			<value>%directive.include.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%directive.include.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_DIRECTIVE.INCLUDE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_DIRECTIVE.INCLUDE.gif</value>
-		</trait>
-	</entity>
-	<entity id="jsp:directive.page">
-		<trait id="display-label">
-			<value>%directive.page.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%directive.page.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_DIRECTIVE.PAGE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_DIRECTIVE.PAGE.gif</value>
-		</trait>
-	</entity>	
-
-	<entity id="jsp:directive.taglib">
-		<trait id="display-label">
-			<value>%directive.taglib.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%directive.taglib.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_DIRECTIVE.TAGLIB.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_DIRECTIVE.TAGLIB.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:expression">
-		<trait id="display-label">
-			<value>%expression.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%expression.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_EXPRESSION.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_EXPRESSION.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:declaration">
-		<trait id="display-label">
-			<value>%declaration.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%declaration.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_DECLARATION.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_DECLARATION.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:useBean">
-		<trait id="display-label">
-			<value>%useBean.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%useBean.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_USEBEAN.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_USEBEAN.gif</value>
-		</trait>
-	</entity>	
-		
-	<entity id="jsp:getProperty">
-		<trait id="display-label">
-			<value>%getProperty.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%getProperty.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_GETPROPERTY.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_GETPROPERTY.gif</value>
-		</trait>
-	</entity>	
-
-	<entity id="jsp:setProperty">
-		<trait id="display-label">
-			<value>%setProperty.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%setProperty.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_SETPROPERTY.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_SETPROPERTY.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:include">
-		<trait id="display-label">
-			<value>%include.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%include.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_INCLUDE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_INCLUDE.gif</value>
-		</trait>
-	</entity>	
-	
-	<entity id="jsp:text">
-		<trait id="display-label">
-			<value>%text.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%text.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_TEXT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_TEXT.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:root">
-		<trait id="display-label">
-			<value>%root.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%root.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_ROOT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_ROOT.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:forward">
-		<trait id="display-label">
-			<value>%forward.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%forward.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_FORWARD.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_FORWARD.gif</value>
-		</trait>
-	</entity>	
-	
-	<entity id="jsp:param">
-		<trait id="display-label">
-			<value>%param.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%param.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_PARAM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_PARAM.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:params">
-		<trait id="display-label">
-			<value>%params.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%params.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_PARAMS.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_PARAMS.gif</value>
-		</trait>
-	</entity>		
-	<entity id="jsp:plugin">
-		<trait id="display-label">
-			<value>%plugin.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%plugin.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_PLUGIN.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_PLUGIN.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:fallback">
-		<trait id="display-label">
-			<value>%fallback.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%fallback.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_FALLBACK.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_FALLBACK.gif</value>
-		</trait>
-	</entity>
-	<entity id="jsp:scriptlet">
-		<trait id="display-label">
-			<value>%scriptlet.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%scriptlet.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_SCRIPTLET.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_SCRIPTLET.gif</value>
-		</trait>
-	</entity>	
-</md:metadatamodel>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/plugin.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/plugin.properties
deleted file mode 100644
index 249602c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/plugin.properties
+++ /dev/null
@@ -1,15 +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
-###############################################################################
-####################################################
-# Plugin XML information.
-####################################################
-pluginName=JavaServer Faces Tools - JSP Core Pagedesigner
-providerName=Eclipse.org
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 70b6d5f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/plugin.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   <extension-point id="pageVar" name="page variable" schema="schema/pageVar.exsd"/>
-   <extension
-       point="org.eclipse.jst.jsf.common.standardMetaDataFiles">
-    <standardMetaDataFile
-          location="$nl$/metadata/jsp11.xml"
-          uri="JSP11">
-    </standardMetaDataFile>
-   </extension>
-   <extension
-         point="org.eclipse.jst.jsf.common.domainSourceModelTypeTranslators">
-    <domainSourceModelTypeTranslator
-          domainSourceModelTypeId="TaglibContentModelHandler"
-          translatorClass="org.eclipse.jst.pagedesigner.jsp.core.internal.metadata.JSPContentModelMetaDataTranslator">
-    </domainSourceModelTypeTranslator>
-    <domainSourceModelTypeTranslator
-          domainSourceModelTypeId="TaglibContentModelHandler"
-          translatorClass="org.eclipse.jst.pagedesigner.jsp.core.internal.metadata.TaglibMetaDataTLDTranslator">
-    </domainSourceModelTypeTranslator>    
-   </extension>
-   <extension
-         point="org.eclipse.jst.jsf.common.domainSourceModelTypes">
-      <domainSourceModelTypes
-            domainId="TagLibraryDomain"
-            domainSourceModelTypeId="TaglibContentModelHandler"
-            locator="org.eclipse.jst.pagedesigner.jsp.core.internal.metadata.TaglibMetaDataLocator"
-            ordinal="0">
-      </domainSourceModelTypes>
-   </extension>
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/schema/pageVar.exsd b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/schema/pageVar.exsd
deleted file mode 100644
index 962bf34..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/schema/pageVar.exsd
+++ /dev/null
@@ -1,172 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.pagedesigner.jsp.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.pagedesigner.jsp.core" id="pageVar" name="page variable"/>
-      </appInfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="taglib" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="tag">
-      <complexType>
-         <attribute name="varName" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="varTypeMode" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="CLASSNAME">
-                  </enumeration>
-                  <enumeration value="EXPRESSION">
-                  </enumeration>
-                  <enumeration value="EXPRESSION_COLLECTION_ITEM">
-                  </enumeration>
-                  <enumeration value="BUNDLE">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="varTypeString" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="varNameIsAttr" type="boolean" use="default" value="true">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="varTypeStringIsAttr" type="boolean" use="default" value="true">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="tagName" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="taglib">
-      <complexType>
-         <sequence>
-            <element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="uri" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         /*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/IJSPCoreConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/IJSPCoreConstants.java
deleted file mode 100644
index 0a7f053..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/IJSPCoreConstants.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IJSPCoreConstants 
-{
-    /**
-     * JSP tag name
-     */
-    final static public String TAG_ATTRIBUTE = "attribute";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_BODY = "body";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_ELEMENT = "element";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_EXPRESSION = "expression";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_DECLARATION = "declaration";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_DIRECTIVE_INCLUDE = "directive.include";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_DIRECTIVE_PAGE = "directive.page";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_DIRECTIVE_TAGLIB = "directive.taglib";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_DOBODY = "doBody";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_FORWARD = "forward";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_GETPROPERTY = "getProperty";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_INCLUDE = "include";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_INVOKE = "invoke";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_OUTPUT = "output";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_PLUGIN = "plugin";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_ROOT = "root";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_SCRIPTLET = "scriptlet";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_SETPROPERTY = "setProperty";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_TEXT = "text";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_USEBEAN = "useBean";
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_LEADING_DIRECTIVE = "directive.";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_ALIGN = "align";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_ARCHIVE = "archive";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_BEANNAME = "beanName";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_CLASS = "class";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_CODE = "code";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_CODEBASE = "codebase";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_DOCTYPEROOTELEMENT = "doctype-root-element";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_DOCTYPESYSTEM = "doctype-system";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_DOCTYPEPUBLIC = "doctype-public";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_FILE = "file";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_FRAGMENT = "fragment";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_HEIGHT = "height";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_HSPACE = "hspace";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_ID = "id";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_IEPLUGINURL = "iepluginurl";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_JREVERSION = "jreversion";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_NAME = "name";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_NSPLUGINURL = "nspluginurl";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_OMITXMLDECLARATION = "omit-xml-declaration";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_PAGE = "page";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_PROPERTY = "property";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_SCOPE = "scope";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_TRIM = "trim";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_TYPE = "type";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_URI = "uri";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_VALUE = "value";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_VAR = "var";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_VARREADER = "varReader";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_VERSION = "version";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_XMLNSJSP = "xmlns:jsp";
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_XMLNSTAGLIBPREFIX = "xmlns:taglibPrefix";
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/JSPCorePlugin.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/JSPCorePlugin.java
deleted file mode 100644
index c31be11..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");
-		} catch (MissingResourceException x) {
-			resourceBundle = null;
-		}
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance.
-	 * @return the default plugin instance
-	 */
-	public static JSPCorePlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the string from the plugin's resource bundle, or 'key' if not
-	 * found.
-	 * @param key 
-	 * @return the string for key or 'key' if not found in the default resource bundle
-	 */
-	public static String getResourceString(String key) {
-		ResourceBundle bundle = JSPCorePlugin.getDefault().getResourceBundle();
-		try {
-			return (bundle != null) ? bundle.getString(key) : key;
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 * @return the resource bundle
-	 */
-	public ResourceBundle getResourceBundle() {
-		return resourceBundle;
-	}
-
-	/**
-	 * @return the plugin id
-	 */
-	public static String getPluginId() {
-		return getDefault().getBundle().getSymbolicName();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/ListenerList.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/ListenerList.java
deleted file mode 100644
index 9596f97..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/ListenerList.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core;
-
-/**
- * Local version of org.eclipse.jface.util.ListenerList (modified)
- * @author mengbo
- * @version 1.5
- */
-public class ListenerList {
-	/**
-	 * The current number of listeners. Maintains invariant: 0 <= fSize <=
-	 * listeners.length.
-	 */
-	private int _size;
-
-	/**
-	 * The list of listeners. Initially <code>null</code> but initialized to
-	 * an array of size capacity the first time a listener is added. Maintains
-	 * invariant: listeners != null if and only if fSize != 0
-	 */
-	private Object[] _listeners = null;
-
-	/**
-	 * The empty array singleton instance, returned by getListeners() when size ==
-	 * 0.
-	 */
-	private static final Object[] EmptyArray = new Object[0];
-
-	/**
-	 * Creates a listener list with the given initial capacity.
-	 * 
-	 * @param capacity
-	 *            the number of listeners which this list can initially accept
-	 *            without growing its internal representation; must be at least
-	 *            1
-	 */
-	public ListenerList(int capacity) {
-		if (capacity < 1) {
-			throw new IllegalArgumentException();
-		}
-		_listeners = new Object[capacity];
-		_size = 0;
-	}
-
-	/**
-	 * Adds a listener to the list. Has no effect if an identical listener is
-	 * already registered.
-	 * 
-	 * @param listener
-	 *            a listener
-	 */
-	public synchronized void add(Object listener) {
-		if (listener == null) {
-			throw new IllegalArgumentException();
-		}
-		// check for duplicates using identity
-		for (int i = 0; i < _size; ++i) {
-			if (_listeners[i] == listener) {
-				return;
-			}
-		}
-		// grow array if necessary
-		if (_size == _listeners.length) {
-			Object[] temp = new Object[(_size * 2) + 1];
-			System.arraycopy(_listeners, 0, temp, 0, _size);
-			_listeners = temp;
-		}
-		_listeners[_size++] = listener;
-	}
-
-	/**
-	 * Returns an array containing all the registered listeners. The resulting
-	 * array is unaffected by subsequent adds or removes. If there are no
-	 * listeners registered, the result is an empty array singleton instance (no
-	 * garbage is created). Use this method when notifying listeners, so that
-	 * any modifications to the listener list during the notification will have
-	 * no effect on the notification itself.
-	 * @return the array of registered listeners
-	 */
-	public synchronized Object[] getListeners() {
-		if (_size == 0) {
-			return EmptyArray;
-		}
-		Object[] result = new Object[_size];
-		System.arraycopy(_listeners, 0, result, 0, _size);
-		return result;
-	}
-
-	/**
-	 * Removes a listener from the list. Has no effect if an identical listener
-	 * was not already registered.
-	 * 
-	 * @param listener
-	 *            a listener
-	 */
-	public synchronized void remove(Object listener) {
-		if (listener == null) {
-			throw new IllegalArgumentException();
-		}
-
-		for (int i = 0; i < _size; ++i) {
-			if (_listeners[i] == listener) {
-				if (--_size == 0) {
-					_listeners = new Object[1];
-				} else {
-					if (i < _size) {
-						_listeners[i] = _listeners[_size];
-					}
-					_listeners[_size] = null;
-				}
-				return;
-			}
-		}
-	}
-
-	/**
-	 * Removes all the listeners from the list.
-	 */
-	public void removeAll() {
-		_listeners = new Object[0];
-		_size = 0;
-	}
-
-	/**
-	 * Returns the number of registered listeners
-	 * 
-	 * @return the number of registered listeners
-	 */
-	public int size() {
-		return _size;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/el/ELParser.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/el/ELParser.java
deleted file mode 100644
index 9c3ee7f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/el/ELParser.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.el;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.el.ComplexValue;
-import org.apache.commons.el.NamedValue;
-
-/**
- * 
- * @author mengbo
- * @version 1.5
- */
-public class ELParser {
-	private String _jsfExpression;
-
-	private List _expressionList;
-
-	/**
-	 * @param expression 
-	 * 
-	 */
-	public ELParser(String expression) {
-		super();
-		_jsfExpression = expression;
-		init();
-	}
-
-	/**
-	 * 
-	 */
-	private void init() {
-		Object parsedExpression = JSFELParserHelper
-				.parseExpression(_jsfExpression);
-
-		if (parsedExpression instanceof ComplexValue) {
-			_expressionList = new ArrayList();
-			_expressionList.add(((ComplexValue) parsedExpression).getPrefix());
-			_expressionList.addAll(((ComplexValue) parsedExpression)
-					.getSuffixes());
-		} else if (parsedExpression instanceof NamedValue) {
-			_expressionList = new ArrayList();
-			_expressionList.add(parsedExpression);
-		}
-
-	}
-
-	/**
-	 * @return the expression elements of null if none
-	 */
-	public Object[] getElements() {
-		if (_expressionList == null) {
-			return null;
-		}
-
-		return _expressionList.toArray();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/el/JSFELParserHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/el/JSFELParserHelper.java
deleted file mode 100644
index 296abe6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/el/JSFELParserHelper.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.el;
-
-import java.io.StringReader;
-
-import org.apache.commons.el.Expression;
-import org.apache.commons.el.ExpressionString;
-import org.apache.commons.el.parser.ELParser;
-import org.apache.commons.el.parser.ParseException;
-
-/**
- * Utility class to implement support functionality to "morph" JSP EL into JSF
- * EL
- * 
- * @author mengbo
- * @version 1.5
- */
-public final class JSFELParserHelper {
-	/**
-	 * an EL left brace
-	 */
-	public static String JSF_EL_LEFT_BRACE = "#{";
-
-	/**
-	 * an EL right brace
-	 */
-	public static String JSF_EL_RIGHT_BRACE = "}";
-
-	private JSFELParserHelper() {
-		// util class, do not instantiate
-	}
-
-	/**
-	 * Gets the parsed form of the given expression string. Returns either an
-	 * Expression or ExpressionString.
-	 * @param expressionString 
-	 * @return the result of parsing expressionString
-	 */
-	public static Object parseExpression(String expressionString) {
-		expressionString = toJspElExpression(expressionString);
-
-		ELParser parser = new ELParser(new StringReader(expressionString));
-		try {
-			Object expression = parser.ExpressionString();
-			if (!(expression instanceof Expression)
-					&& !(expression instanceof ExpressionString)) {
-				return null;
-			}
-
-			return expression;
-		} catch (ParseException e) {
-
-			// String msg = "Invalid expression: '" + expressionString + "'";
-			// log.debug(msg, e);
-			// throw new ReferenceSyntaxException(msg, e);
-		}
-		return null;
-	}
-
-	/**
-	 * @param expressionString
-	 * @return true if the expression is 'valid'
-	 */
-	public static boolean isValidEL(String expressionString) {
-		if (expressionString == null || expressionString.length() == 0) {
-			return false;
-		}
-
-		return expressionString.startsWith(JSF_EL_LEFT_BRACE)
-				&& expressionString.endsWith(JSF_EL_RIGHT_BRACE);
-	}
-
-	/**
-	 * @param expressionString
-	 * @return expressionString with the left and right braces removed
-	 * or the original string if isValidEL(expression) == false
-	 */
-	public static String trimELBrace(String expressionString) {
-		if (!isValidEL(expressionString)) {
-			return expressionString;
-		}
-		String trimedExpression = null;
-
-		trimedExpression = expressionString.substring(JSF_EL_LEFT_BRACE
-				.length(), expressionString.length()
-				- JSF_EL_RIGHT_BRACE.length());
-
-		return trimedExpression;
-	}
-
-	/**
-	 * Convert ValueBinding syntax #{ } to JSP EL syntax ${ }
-	 * 
-	 * @param expressionString
-	 *            <code>ValueBinding</code> reference expression
-	 * 
-	 * @return JSP EL compatible expression
-	 */
-	public static String toJspElExpression(String expressionString) {
-		StringBuffer sb = new StringBuffer(expressionString.length());
-		int remainsPos = 0;
-
-		for (int posOpenBrace = expressionString.indexOf('{'); posOpenBrace >= 0; posOpenBrace = expressionString
-				.indexOf('{', remainsPos)) {
-			if (posOpenBrace > 0) {
-				if (posOpenBrace - 1 > remainsPos)
-					sb.append(expressionString.substring(remainsPos,
-							posOpenBrace - 1));
-
-				if (expressionString.charAt(posOpenBrace - 1) == '$') {
-					sb.append("${'${'}");
-					remainsPos = posOpenBrace + 1;
-					continue;
-				} else if (expressionString.charAt(posOpenBrace - 1) == '#') {
-					// TODO: should use \\ as escape for \ always, not just when
-					// before #{
-					// allow use of '\' as escape symbol for #{ (for
-					// compatibility with Sun's extended implementation)
-					/*
-					 * if (isEscaped(expressionString, posOpenBrace - 1)) {
-					 * escapes: { for (int i = sb.length() - 1; i >= 0; i--) {
-					 * if (sb.charAt(i) != '\\') { sb.setLength( sb.length() -
-					 * (sb.length() - i) / 2); break escapes; } }
-					 * sb.setLength(sb.length() / 2); } sb.append("#{"); } else {
-					 */
-					sb.append("${");
-					int posCloseBrace = indexOfMatchingClosingBrace(
-							expressionString, posOpenBrace);
-					sb.append(expressionString.substring(posOpenBrace + 1,
-							posCloseBrace + 1));
-					remainsPos = posCloseBrace + 1;
-					continue;
-					// }
-				} else {
-					if (posOpenBrace > remainsPos)
-						sb.append(expressionString.charAt(posOpenBrace - 1));
-				}
-			}
-
-			// Standalone brace
-			sb.append('{');
-			remainsPos = posOpenBrace + 1;
-		}
-
-		sb.append(expressionString.substring(remainsPos));
-
-		// Create a new String to shrink mem size since we are caching
-		return new String(sb.toString());
-	}
-
-	private static int findQuote(String expressionString, int start) {
-		int indexofSingleQuote = expressionString.indexOf('\'', start);
-		int indexofDoubleQuote = expressionString.indexOf('"', start);
-		return minIndex(indexofSingleQuote, indexofDoubleQuote);
-	}
-
-	/**
-	 * Return the index of the matching closing brace, skipping over quoted text
-	 * 
-	 * @param expressionString
-	 *            string to search
-	 * @param indexofOpeningBrace
-	 *            the location of opening brace to match
-	 * 
-	 * @return the index of the matching closing brace
-	 * 
-	 * @throws ReferenceSyntaxException
-	 *             if matching brace cannot be found
-	 */
-	private static int indexOfMatchingClosingBrace(String expressionString,
-			int indexofOpeningBrace) {
-		int len = expressionString.length();
-		int i = indexofOpeningBrace + 1;
-
-		// Loop through quoted strings
-		for (;;) {
-			if (i >= len) {
-				throw new IllegalStateException(
-						"Missing closing brace. Expression: '"
-								+ expressionString + "'");
-			}
-
-			int indexofClosingBrace = expressionString.indexOf('}', i);
-			i = minIndex(indexofClosingBrace, findQuote(expressionString, i));
-
-			if (i < 0) {
-				// No delimiter found
-				throw new IllegalStateException(
-						"Missing closing brace. Expression: '"
-								+ expressionString + "'");
-			}
-
-			// 1. If quoted literal, find closing quote
-			if (i != indexofClosingBrace) {
-				i = indexOfMatchingClosingQuote(expressionString, i) + 1;
-				if (i == 0) {
-					// Note: if no match, i==0 because -1 + 1 = 0
-					throw new IllegalStateException(
-							"Missing closing quote. Expression: '"
-									+ expressionString + "'");
-				}
-			} else {
-				// Closing brace
-				return i;
-			}
-		}
-	}
-
-	/**
-	 * Returns the index of the matching closing quote, skipping over escaped
-	 * quotes
-	 * 
-	 * @param expressionString
-	 *            string to scan
-	 * @param indexOfOpeningQuote
-	 *            start from this position in the string
-	 * @return -1 if no match, the index of closing quote otherwise
-	 */
-	private static int indexOfMatchingClosingQuote(String expressionString,
-			int indexOfOpeningQuote) {
-		char quote = expressionString.charAt(indexOfOpeningQuote);
-		for (int i = expressionString.indexOf(quote, indexOfOpeningQuote + 1); i >= 0; i = expressionString
-				.indexOf(quote, i + 1)) {
-			if (!isEscaped(expressionString, i)) {
-				return i;
-			}
-		}
-
-		// No matching quote found
-		return -1;
-	}
-
-	private static boolean isEscaped(String expressionString, int i) {
-		int escapeCharCount = 0;
-		while ((--i >= 0) && (expressionString.charAt(i) == '\\')) {
-			escapeCharCount++;
-		}
-
-		return (escapeCharCount % 2) != 0;
-	}
-
-	/**
-	 * Returns the minimum index >= 0, if any
-	 * 
-	 * <p>
-	 * Use to find the first of two characters in a string:<br>
-	 * <code>minIndex(s.indexOf('/'), indexOf('\'))</code>
-	 * </p>
-	 * @param a 
-	 * @param b 
-	 * @return the minimum index >= 0, if any
-	 * 
-	 */
-	public static int minIndex(int a, int b) {
-		return (a < 0) ? b : (b < 0) ? a : (a < b) ? a : b;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/metadata/JSPContentModelMetaDataTranslator.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/metadata/JSPContentModelMetaDataTranslator.java
deleted file mode 100644
index d3b9c8d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/metadata/JSPContentModelMetaDataTranslator.java
+++ /dev/null
@@ -1,47 +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.jsp.core.internal.metadata;
-
-import org.eclipse.jst.jsf.common.metadata.internal.AbstractTagLibDomainContentModelMetaDataTranslator;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataTranslator;
-import org.eclipse.wst.html.core.internal.contentmodel.JSPCMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-
-/**
- * Translates the JSP CMDocument to standard metadata model entities and traits
- */
-public class JSPContentModelMetaDataTranslator extends AbstractTagLibDomainContentModelMetaDataTranslator implements IMetaDataTranslator {
-
-	public void translate(final IMetaDataModelMergeAssistant assistant) {
-		setAssistant(assistant);
-		CMDocument doc = getSourceModel();
-		if (doc!= null && doc instanceof JSPCMDocument){
-			doTranslate(doc);			
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.AbstractTagLibDomainContentModelMetaDataTranslator#getURIDescription()
-	 */
-	protected String getURIDescription() {		
-		return "JSP Tags";
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.AbstractTagLibDomainContentModelMetaDataTranslator#getURIDisplayLabel()
-	 */
-	protected String getURIDisplayLabel() {		
-		return "JSP";
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/metadata/TaglibMetaDataLocator.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/metadata/TaglibMetaDataLocator.java
deleted file mode 100644
index 78c7802..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/metadata/TaglibMetaDataLocator.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.internal.metadata;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.metadata.internal.AbstractMetaDataLocator;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataLocator;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.IPathSensitiveMetaDataLocator;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.CMDocumentFactoryTLD;
-import org.eclipse.jst.jsp.core.taglib.ITaglibRecord;
-import org.eclipse.jst.jsp.core.taglib.TaglibIndex;
-import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocumentFactory;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
-
-/**
- * Locator of tag library meta data
- *
- */
-public class TaglibMetaDataLocator extends AbstractMetaDataLocator implements IPathSensitiveMetaDataLocator{
-	//project must be set to the current project context during locate only...  should not be used when noifying observers
-	private IProject project;
-	private TaglibMetaDataSource source;
-	
-	/**
-	 * Constructor
-	 */
-	public TaglibMetaDataLocator(){
-		super();
-	}
-	
-	public List/*<IMetaDataModelProvider>*/ locateMetaDataModelProviders(String uri) {
-		List ret = new ArrayList();
-		CMDocument doc = null;
-
-		if (uri == null){
-			return ret;
-		}
-		else if (uri.equalsIgnoreCase(CMDocType.HTML_DOC_TYPE)){
-			doc = HTMLCMDocumentFactory.getCMDocument(CMDocType.HTML_DOC_TYPE);
-		}
-		else if (uri.equalsIgnoreCase(CMDocType.JSP11_DOC_TYPE)){
-			doc = HTMLCMDocumentFactory.getCMDocument(CMDocType.JSP11_DOC_TYPE);
-		}
-		else if (uri.equalsIgnoreCase(CMDocType.JSP12_DOC_TYPE)){
-			doc = HTMLCMDocumentFactory.getCMDocument(CMDocType.JSP12_DOC_TYPE);
-		}
-		else if (uri.equalsIgnoreCase(CMDocType.JSP20_DOC_TYPE)){
-			doc = HTMLCMDocumentFactory.getCMDocument(CMDocType.JSP20_DOC_TYPE);
-		}
-		else if (project != null ){//TLD
-			CMDocumentFactoryTLD factory = new CMDocumentFactoryTLD();
-			ITaglibRecord[] tldRecs = TaglibIndex.getAvailableTaglibRecords(project.getFullPath());
-			ITaglibRecord tldRec = findTLD(tldRecs, uri);
-			if (tldRec != null)
-				doc = factory.createCMDocument(tldRec);
-		}
-		
-		if (doc != null){
-			source = new TaglibMetaDataSource(doc);
-			ret.add(source);
-		}
-				
-		return ret;
-	}
-
-	private ITaglibRecord findTLD(ITaglibRecord[] tldRecs, String uri) {
-		for (int i=0;i<tldRecs.length;i++){
-			ITaglibRecord tld = tldRecs[i];
-			if (uri.equals(tld.getDescriptor().getURI()))
-				return tld;
-		}
-		return null;
-	}
-
-	public void startLocating() {
-//		TaglibIndex.addTaglibIndexListener(this);
-	}
-	public void stopLocating() {		
-//		TaglibIndex.removeTaglibIndexListener(this);//non-api call.... danger
-	}
-	
-	//not currently listening, so will not be called
-//	public void indexChanged(ITaglibDescriptor event) {
-//		if (event.getURI() != null && event.getURI().equals(uri)){
-//			if (!_notificationEventOccuring){
-//				_notificationEventOccuring = true;
-//				int type = adaptTagLibEvent(event);
-//				IMetaDataChangeNotificationEvent mdEvent = new MetaDataChangeNotificationEvent(this, uri, type);
-//				fireEvent(mdEvent);						
-//				_notificationEventOccuring = false;
-//			}
-//		}
-//	}
-
-//	private int adaptTagLibEvent(ITaglibRecordEvent event) {
-//		switch (event.getType()){
-//		case ITaglibRecordEvent.ADDED:
-//			return IMetaDataChangeNotificationEvent.ADDED;
-//		case ITaglibRecordEvent.REMOVED:
-//			return IMetaDataChangeNotificationEvent.REMOVED;
-//		default:
-//			return IMetaDataChangeNotificationEvent.CHANGED;
-//		}		
-//	}
-
-//	private void fireEvent(final IMetaDataChangeNotificationEvent event) {
-//		SafeRunnable.run(new ISafeRunnable(){
-//
-//			public void handleException(Throwable exception) {
-//				// TODO Auto-generated method stub				
-//			}
-//
-//			public void run() throws Exception {
-//				Iterator it = getObservers().iterator();
-//				while (it.hasNext()){
-//					IMetaDataObserver observer = (IMetaDataObserver)it.next();
-//					observer.notifyMetadataChanged(event);
-//				}
-//			}
-//
-//		});
-//		
-//	}
-
-	public void setProjectContext(IProject project) {
-		this.project = project;		
-	}
-	
-	private class TaglibMetaDataSource implements IMetaDataSourceModelProvider{
-
-		private CMDocument doc;
-		private IMetaDataLocator locator;
-
-		TaglibMetaDataSource(CMDocument doc){
-			super();
-			this.doc = doc;
-		}
-		
-		public Object getSourceModel() {
-			return doc;
-		}
-
-		public IMetaDataLocator getLocator() {
-			return locator;
-		}
-
-		public void setLocator(IMetaDataLocator locator) {
-			this.locator = locator;			
-		}
-
-		public Object getAdapter(Class klass) {
-			return null;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/metadata/TaglibMetaDataTLDTranslator.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/metadata/TaglibMetaDataTLDTranslator.java
deleted file mode 100644
index a438b3e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/metadata/TaglibMetaDataTLDTranslator.java
+++ /dev/null
@@ -1,112 +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.jsp.core.internal.metadata;
-
-import org.eclipse.jst.jsf.common.metadata.internal.AbstractTagLibDomainContentModelMetaDataTranslator;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataTranslator;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-
-/**
- * Translates a TLD CMDocument to standard metadata model entities and traits
- *
- */
-public class TaglibMetaDataTLDTranslator extends AbstractTagLibDomainContentModelMetaDataTranslator implements IMetaDataTranslator {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataTranslator#translate(org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant)
-	 */
-	public void translate(final IMetaDataModelMergeAssistant assistant) {
-		setAssistant(assistant);
-		CMDocument doc = getSourceModel();
-		if (doc != null && doc instanceof TLDDocument){
-			doTranslate(doc);
-			
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.AbstractTagLibDomainContentModelMetaDataTranslator#getURIDefaultPrefix()
-	 */
-	protected String getURIDefaultPrefix(){
-		return getTLDDocument().getShortname();
-	}
-	
-	/**
-	 * @param tag
-	 * @return the tag.getDisplayName() if available
-	 */
-	protected String getTagDisplayLabel(CMElementDeclaration tag){
-		String label = ((TLDElementDeclaration)tag).getDisplayName();
-		if (label == null)
-			label = super.getTagDisplayName(tag);
-		return label;		
-	}
-	
-	/**
-	 * @param tag
-	 * @return the tag.getDescription() if available
-	 */
-	protected String getTagDescription(CMElementDeclaration tag){
-		String desc = ((TLDElementDeclaration)tag).getDescription();
-		if (desc == null)
-			desc = super.getTagDescription(tag);
-		return desc;		
-	}
-	
-	/**
-	 * @param tag
-	 * @return the tag.getSmallIcon() if available
-	 */
-	protected String getTagSmallIcon(CMElementDeclaration tag){
-		String smallIcon = ((TLDElementDeclaration)tag).getSmallIcon();
-		if (smallIcon == null)
-			smallIcon = super.getTagSmallIcon(tag);
-		return smallIcon;		
-	}
-	
-	/**
-	 * @param tag
-	 * @return the tag.getLargeIcon() if available
-	 */
-	protected String getTagLargeIcon(CMElementDeclaration tag){
-		String largeIcon = ((TLDElementDeclaration)tag).getLargeIcon();
-		if (largeIcon == null)
-			largeIcon = super.getTagLargeIcon(tag);
-		return largeIcon;		
-	}
-	
-	/**
-	 * @return the tag.getDescription() if available
-	 */
-	protected String getURIDescription() {		
-		return getTLDDocument().getDescription();
-	}
-
-	/**
-	 * @return the tag.getDisplayName()
-	 */
-	protected String getURIDisplayLabel() {		
-		return getTLDDocument().getDisplayName();
-	}
-	
-	/**
-	 * @return the tld document for the source model
-	 */
-	protected TLDDocument getTLDDocument(){
-		return (TLDDocument)getSourceModel();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/DocumentPageVariableAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/DocumentPageVariableAdapter.java
deleted file mode 100644
index ebd93fe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/DocumentPageVariableAdapter.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.jsp.core.ListenerList;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IChangeListener;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IDocumentPageVariableAdapter;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IPageVariableAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * This adapter will be adapted on the JSP document.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DocumentPageVariableAdapter implements
-		IDocumentPageVariableAdapter {
-	private IDOMDocument _document;
-
-	private ListenerList _changeListeners = new ListenerList(2);
-
-	private List _variableInfos = new ArrayList();
-
-	private boolean _readingInfo = false;
-
-	/**
-	 * @param doc 
-	 * 
-	 */
-	public DocumentPageVariableAdapter(IDOMDocument doc) {
-		super();
-		this._document = doc;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider#getBeanInfos()
-	 */
-	public IVariableInfo[] getBeanInfos() {
-		IVariableInfo[] ret = new IVariableInfo[_variableInfos.size()];
-		return (IVariableInfo[]) _variableInfos.toArray(ret);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider#addChangeListener(org.eclipse.jst.pagedesigner.jsp.core.pagevar.IChangeListener)
-	 */
-	public void addChangeListener(IChangeListener listener) {
-		this.reReadInfo();
-		_changeListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider#removeChangeListener(org.eclipse.jst.pagedesigner.jsp.core.pagevar.IChangeListener)
-	 */
-	public void removeChangeListener(IChangeListener listener) {
-		_changeListeners.remove(listener);
-	}
-
-	/**
-	 * fire change events on all listeners
-	 */
-	protected void fireChanged() {
-		Object[] listeners = _changeListeners.getListeners();
-		for (int i = 0; i < listeners.length; i++) {
-			IChangeListener l = (IChangeListener) listeners[i];
-			l.changed();
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return IDocumentPageVariableAdapter.class.equals(type);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		switch (eventType) {
-		case INodeNotifier.STRUCTURE_CHANGED:
-		case INodeNotifier.CONTENT_CHANGED:
-		case INodeNotifier.CHANGE:
-			refresh();
-			break;
-		default:
-			// skip. Ignore other kinds of change.
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider#refresh()
-	 */
-	public void refresh() {
-		reReadInfo();
-	}
-
-	/**
-	 * re-read page variable info
-	 */
-	protected void reReadInfo() {
-		if (this._readingInfo) {
-			return;
-		}
-		try {
-			List oldInfo = this._variableInfos;
-			this._variableInfos = new ArrayList();
-			readNode(_document);
-			if (!isSame(oldInfo, this._variableInfos)) {
-				fireChanged();
-			}
-		} finally {
-			this._readingInfo = false;
-		}
-	}
-
-	/**
-	 * compare two variable info list.
-	 * 
-	 * @param oldInfo
-	 * @param list
-	 * @return true if same.
-	 */
-	private boolean isSame(List oldInfo, List list) {
-		if (oldInfo.size() != list.size()) {
-			return false;
-		}
-		for (int i = 0, size = oldInfo.size(); i < size; i++) {
-			IVariableInfo info1 = (IVariableInfo) oldInfo.get(i);
-			IVariableInfo info2 = (IVariableInfo) list.get(i);
-			if (info1 == null) {
-				return false;// should not happen
-			}
-			if (!info1.equals(info2)) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * recursively read all element, and see whether they have
-	 * IPageVariableAdapter, and then get variable info.
-	 * 
-	 * @param element
-	 */
-	private void readNode(Node node) {
-		if (node instanceof INodeNotifier && node instanceof Element) {
-			Element element = (Element) node;
-			Object obj = ((INodeNotifier) element)
-					.getAdapterFor(IPageVariableAdapter.class);
-			if (obj instanceof IPageVariableAdapter) {
-				IPageVariableAdapter adapter = (IPageVariableAdapter) obj;
-				if (adapter.supportMultipleVariable(element)) {
-					List infos = ((IPageVariableAdapter) obj)
-							.getVariableInfos(element);
-					if (infos != null) {
-						this._variableInfos.addAll(infos);
-					}
-				} else {
-					// hope not doing addAll could improve some performance.
-					IVariableInfo info = adapter.getVariableInfo(element);
-					if (info != null) {
-						this._variableInfos.add(info);
-					}
-				}
-			}
-		}
-
-		NodeList childNodes = node.getChildNodes();
-		if (childNodes != null) {
-			for (int i = 0, length = childNodes.getLength(); i < length; i++) {
-				Node childNode = childNodes.item(i);
-				readNode(childNode);
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/PageVariableAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/PageVariableAdapter.java
deleted file mode 100644
index 40e01b5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/PageVariableAdapter.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IDocumentPageVariableAdapter;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IPageVariableAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PageVariableAdapter implements IPageVariableAdapter {
-	static final PageVariableAdapter _instance = new PageVariableAdapter();
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static PageVariableAdapter getInstance() {
-		return _instance;
-	}
-
-	/**
-	 * no external instatiation
-	 */
-	private PageVariableAdapter() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return IPageVariableAdapter.class.equals(type);
-	}
-
-	private IDocumentPageVariableAdapter getDocumentAdapter(
-			INodeNotifier notifier) {
-		if (notifier instanceof IDOMNode) {
-			IDOMModel model = ((IDOMNode) notifier).getModel();
-			if (model != null) {
-				IDOMDocument document = model.getDocument();
-				if (document != null) {
-					return (IDocumentPageVariableAdapter) document
-							.getAdapterFor(IDocumentPageVariableAdapter.class);
-				}
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		IDocumentPageVariableAdapter docadapter = getDocumentAdapter(notifier);
-
-		switch (eventType) {
-		case INodeNotifier.STRUCTURE_CHANGED:
-			docadapter.refresh();
-			break;
-		case INodeNotifier.CONTENT_CHANGED:
-		case INodeNotifier.CHANGE:
-			// only this node changed, only refresh if this node is page
-			// variable node
-			if (notifier instanceof Element
-					&& supportVariableInfo((Element) notifier)) {
-				docadapter.refresh();
-			}
-			break;
-		default:
-			// skip. Ignore other kinds of change.
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IPageVariableAdapter#supportMultipleVariable(org.w3c.dom.Element)
-	 */
-	public boolean supportMultipleVariable(Element element) {
-		return false;
-	}
-
-	/**
-	 * @param element
-	 * @return
-	 */
-	private boolean supportVariableInfo(Element element) {
-		return PageVariableAdatperRegistry.getInstance().getTagVarDescriptor(
-				element) != null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IPageVariableAdapter#getVariableInfo(org.w3c.dom.Element)
-	 */
-	public IVariableInfo getVariableInfo(Element element) {
-		TagVarDescriptor desc = PageVariableAdatperRegistry.getInstance()
-				.getTagVarDescriptor(element);
-		if (desc == null) {
-			return null;
-		}
-		String name;
-		if (desc.isVarNameIsAttr()) {
-			name = element.getAttribute(desc.getVarName());
-			if (name == null || name.length() == 0) {
-				return null; // missing name.
-			}
-		} else {
-			name = desc.getVarName();
-		}
-		String type;
-		if (desc.isVarTypeStringIsAttr()) {
-			type = element.getAttribute(desc.getVarTypeString());
-			if (type == null || type.length() == 0) {
-				return null; // missing type
-			}
-		} else {
-			type = desc.getVarTypeString();
-		}
-		return new VariableInfo(name, desc.getVarTypeMode(), type);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IPageVariableAdapter#getVariableInfos(org.w3c.dom.Element)
-	 */
-	public List getVariableInfos(Element element) {
-		IVariableInfo info = getVariableInfo(element);
-		if (info == null) {
-			return Collections.EMPTY_LIST;
-		}
-        List ret = new ArrayList(1);
-        ret.add(info);
-        return ret;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/PageVariableAdatperRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/PageVariableAdatperRegistry.java
deleted file mode 100644
index 3226c9d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/PageVariableAdatperRegistry.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.jst.pagedesigner.jsp.core.JSPCorePlugin;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo;
-import org.eclipse.jst.pagedesigner.jsp.core.util.CMUtil;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PageVariableAdatperRegistry {
-	/**
-	 * pageVar
-	 */
-	public static final String PAGEVAR = "pageVar";
-
-	/**
-	 * taglib
-	 */
-	public static final String TAGLIB = "taglib";
-
-	/**
-	 * tag
-	 */
-	public static final String TAG = "tag";
-
-	/**
-	 * varName
-	 */
-	public static final String VARNAME = "varName";
-
-	/**
-	 * varNameIsAttr
-	 */
-	public static final String VARNAMEISATTR = "varNameIsAttr";
-
-	/**
-	 * varTypeMode
-	 */
-	public static final String VARTYPEMODE = "varTypeMode";
-
-	/**
-	 * tagName
-	 */
-	public static final String TAGNAME = "tagName";
-
-	/**
-	 * varTypeString
-	 */
-	public static final String VARTYPESTRING = "varTypeString";
-
-	/**
-	 * varTypeStringIsAttr
-	 */
-	public static final String VARTYPESTRINGISATTR = "varTypeStringIsAttr";
-
-	/**
-	 * uri
-	 */
-	public static final String URI = "uri";
-
-	private static PageVariableAdatperRegistry _instance = null;
-
-	private Map _registry;
-
-	private TagVarDescriptor _useBeanDescriptor;
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static PageVariableAdatperRegistry getInstance() {
-		if (_instance == null) {
-			_instance = new PageVariableAdatperRegistry();
-		}
-		return _instance;
-	}
-
-	private PageVariableAdatperRegistry() {
-		_registry = readAllDescriptors();
-	}
-
-	// public IPageVariableAdapter createAdapter(IDOMElement ele, String uri,
-	// String tagname)
-	// {
-	// String key = uri + "#" + tagname;
-	// TagVarDescriptor desc = (TagVarDescriptor) _registry.get(key);
-	// if (desc != null)
-	// {
-	// PageVariableAdapter adapter = new PageVariableAdapter(ele);
-	// adapter.setVarName(desc.getVarName());
-	// adapter.setVarNameAttrName(desc.isVarNameIsAttr());
-	// adapter.setVarTypeString(desc.getVarTypeString());
-	// adapter.setVarTypeAttrName(desc.isVarTypeStringIsAttr());
-	// adapter.setVarTypeMode(desc.getVarTypeMode());
-	// return adapter;
-	// }
-	// else
-	// {
-	// return null;
-	// }
-	// }
-
-	private Map readAllDescriptors() {
-		Map map = new HashMap();
-
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint(JSPCorePlugin.getPluginId(), PAGEVAR);
-		IExtension[] extensions = extensionPoint.getExtensions();
-
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension ext = extensions[i];
-			IConfigurationElement[] facs = ext.getConfigurationElements();
-
-			for (int j = 0; j < facs.length; j++) {
-				if (facs[j].getName().equals(TAGLIB)) {
-					String uri = facs[j].getAttribute(URI);
-					if (uri == null || uri.length() == 0) {
-						continue;
-					}
-					IConfigurationElement[] tags = facs[j].getChildren(TAG);
-					for (int k = 0; k < tags.length; k++) {
-						TagVarDescriptor desc = new TagVarDescriptor();
-
-						String tag = tags[k].getAttribute(TAGNAME);
-						String varName = tags[k].getAttribute(VARNAME);
-						boolean varNameIsAttr = "true".equalsIgnoreCase(tags[k]
-								.getAttribute(VARNAMEISATTR));
-						String varTypeString = tags[k]
-								.getAttribute(VARTYPESTRING);
-						boolean varTypeStringIsAttr = "true"
-								.equalsIgnoreCase(tags[k]
-										.getAttribute(VARTYPESTRINGISATTR));
-						String varTypeModeString = tags[k]
-								.getAttribute(VARTYPEMODE);
-						int varTypeMode = toVarTypeMode(varTypeModeString);
-
-						desc.setVarName(varName);
-						desc.setVarNameIsAttr(varNameIsAttr);
-						desc.setVarTypeMode(varTypeMode);
-						desc.setVarTypeString(varTypeString);
-						desc.setVarTypeStringIsAttr(varTypeStringIsAttr);
-						desc.setTagName(tag);
-
-						// Use uri#tag as key.
-						map.put(uri + "#" + tag, desc);
-					}
-				}
-			}
-		}
-
-		return map;
-	}
-
-	/**
-	 * @param varTypeModeString
-	 * @return variable typemode
-	 */
-	public static int toVarTypeMode(String varTypeModeString) {
-		if ("CLASSNAME".equalsIgnoreCase(varTypeModeString)) {
-			return IVariableInfo.CLASSNAME;
-		} else if ("EXPRESSION".equalsIgnoreCase(varTypeModeString)) {
-			return IVariableInfo.EXPRESSION;
-		} else if ("EXPRESSION_COLLECTION_ITEM"
-				.equalsIgnoreCase(varTypeModeString)) {
-			return IVariableInfo.EXPRESSION_LISTITEM;
-		} else if ("BUNDLE".equalsIgnoreCase(varTypeModeString)) {
-			return IVariableInfo.RESOURCEBUNDLE;
-		} else {
-			return IVariableInfo.EXPRESSION; // default
-		}
-	}
-
-	/**
-	 * @param uri
-	 * @param tagname
-	 * @return the tag variable descriptor for the given tag (may be null)
-	 */
-	public TagVarDescriptor getTagVarDescriptor(String uri, String tagname) {
-		String key = uri + "#" + tagname;
-		return (TagVarDescriptor) _registry.get(key);
-	}
-
-	/**
-	 * @param localName
-	 * @return
-	 */
-	private TagVarDescriptor getJSPTagVarDescriptor(String localName) {
-		if (IJSPCoreConstants.TAG_USEBEAN.equals(localName)) {
-			if (_useBeanDescriptor == null) {
-				_useBeanDescriptor = new TagVarDescriptor();
-				_useBeanDescriptor.setVarName(IJSPCoreConstants.ATTR_ID);
-				_useBeanDescriptor.setVarNameIsAttr(true);
-				_useBeanDescriptor.setVarTypeMode(IVariableInfo.CLASSNAME);
-				_useBeanDescriptor
-						.setVarTypeString(IJSPCoreConstants.ATTR_CLASS);
-				_useBeanDescriptor.setVarTypeStringIsAttr(true);
-			}
-
-			return _useBeanDescriptor;
-		}
-
-		return null;
-	}
-
-	/**
-	 * @param target 
-	 * @return the tag variable descriptor for the target
-	 */
-	public TagVarDescriptor getTagVarDescriptor(Element target) {
-		if (target instanceof IDOMElement) {
-			IDOMElement xmlEle = (IDOMElement) target;
-			CMElementDeclaration decl = CMUtil.getElementDeclaration(xmlEle);
-			if (decl != null) {
-			    if (CMUtil.isJSP(decl)) {
-			        return getJSPTagVarDescriptor(xmlEle.getLocalName());
-			    }
-                String uri = CMUtil.getTagURI(decl);
-                if (uri != null) {
-                    return getTagVarDescriptor(uri, xmlEle.getLocalName());
-                }
-			}
-		}
-        return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/TagVarDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/TagVarDescriptor.java
deleted file mode 100644
index 8e5b649..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/TagVarDescriptor.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TagVarDescriptor {
-	private String _varName;
-
-	private boolean _varNameIsAttr;
-
-	private String _varTypeString;
-
-	private boolean _varTypeStringIsAttr;
-
-	private int _varTypeMode;
-
-	private String _tagName;
-
-	/**
-	 * @return the varName
-	 */
-	public String getVarName() {
-		return _varName;
-	}
-
-	/**
-	 * @param varName
-	 */
-	public void setVarName(String varName) {
-		this._varName = varName;
-	}
-
-	/**
-	 * @return true if var name is attribute
-	 */
-	public boolean isVarNameIsAttr() {
-		return _varNameIsAttr;
-	}
-
-	/**
-	 * @param varNameIsAttr
-	 */
-	public void setVarNameIsAttr(boolean varNameIsAttr) {
-		this._varNameIsAttr = varNameIsAttr;
-	}
-
-	/**
-	 * @return the variable type mode
-	 */
-	public int getVarTypeMode() {
-		return _varTypeMode;
-	}
-
-	/**
-	 * @param varTypeMode
-	 */
-	public void setVarTypeMode(int varTypeMode) {
-		this._varTypeMode = varTypeMode;
-	}
-
-	/**
-	 * @return the variable type string
-	 */
-	public String getVarTypeString() {
-		return _varTypeString;
-	}
-
-	/**
-	 * @param varTypeString
-	 */
-	public void setVarTypeString(String varTypeString) {
-		this._varTypeString = varTypeString;
-	}
-
-	/**
-	 * @return true if variable type string is attr
-	 */
-	public boolean isVarTypeStringIsAttr() {
-		return _varTypeStringIsAttr;
-	}
-
-	/**
-	 * @param varTypeStringIsAttr
-	 */
-	public void setVarTypeStringIsAttr(boolean varTypeStringIsAttr) {
-		this._varTypeStringIsAttr = varTypeStringIsAttr;
-	}
-
-	/**
-	 * @param tag
-	 */
-	public void setTagName(String tag) {
-		this._tagName = tag;
-	}
-
-	/**
-	 * @return the tag name
-	 */
-	public String getTagName() {
-		return this._tagName;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/VariableInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/VariableInfo.java
deleted file mode 100644
index 6b29b9a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/VariableInfo.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar;
-
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class VariableInfo implements IVariableInfo {
-	private String _typeInfo;
-
-	private int _mode;
-
-	private String _name;
-
-	/**
-	 * @param name 
-	 * @param mode 
-	 * @param typeInfo 
-	 * 
-	 */
-	public VariableInfo(String name, int mode, String typeInfo) {
-		this._name = name;
-		this._mode = mode;
-		this._typeInfo = typeInfo;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo#getName()
-	 */
-	public String getName() {
-		return _name;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo#getMode()
-	 */
-	public int getMode() {
-		return _mode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo#getTypeInfoString()
-	 */
-	public String getTypeInfoString() {
-		return _typeInfo;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-    // TODO: no hashcode override?
-	public boolean equals(Object obj) {
-		if (this == obj) {
-			return true;
-		}
-		if (obj instanceof VariableInfo) {
-			VariableInfo info = (VariableInfo) obj;
-			return this._mode == info._mode && equals(this._name, info._name)
-					&& equals(this._typeInfo, info._typeInfo);
-		}
-        return false;
-	}
-
-	private boolean equals(String s1, String s2) {
-		if (s1 == null) {
-			return s2 == null;
-		}
-        return s1.equals(s2);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IChangeListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IChangeListener.java
deleted file mode 100644
index 9196d0c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IChangeListener.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.pagevar;
-
-import java.util.EventListener;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IChangeListener extends EventListener {
-	/**
-	 * fire a changed indication
-	 */
-	public void changed();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IPageVariablesProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IPageVariablesProvider.java
deleted file mode 100644
index a538ec8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IPageVariablesProvider.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.pagevar;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IPageVariablesProvider {
-	/**
-	 * 
-	 */
-	public void refresh();
-
-	/**
-	 * @return the bean infos
-	 */
-	public IVariableInfo[] getBeanInfos();
-
-	/**
-	 * @param listener
-	 */
-	public void addChangeListener(IChangeListener listener);
-
-	/**
-	 * @param listener
-	 */
-	public void removeChangeListener(IChangeListener listener);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IVariableInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IVariableInfo.java
deleted file mode 100644
index a491de0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IVariableInfo.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.pagevar;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IVariableInfo {
-	/**
-	 * @return the name
-	 */
-	public String getName();
-
-	/**
-	 * TODO
-	 */
-	public static final int CLASSNAME = 0;
-
-	/**
-	 * TODO
-	 */
-	public static final int EXPRESSION = 1;
-
-	/**
-	 * TODO
-	 */
-	public static final int EXPRESSION_LISTITEM = 2;
-
-	/**
-	 * TODO
-	 */
-	public static final int RESOURCEBUNDLE = 3;
-
-	/**
-	 * @return one of CLASSNAME, EXPRESSION, EXPRESSION_LISTITEM, RESOURCEBUNDLE
-	 */
-	public int getMode();
-
-	/**
-	 * type info string will have different meaning for different mode.
-	 * 
-	 * @return the type info string
-	 */
-	public String getTypeInfoString();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/IDocumentPageVariableAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/IDocumentPageVariableAdapter.java
deleted file mode 100644
index 31979ef..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/IDocumentPageVariableAdapter.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter;
-
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-
-/**
- * IDocumentPageVariableAdapter will be adapted to the jsp document.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IDocumentPageVariableAdapter extends IPageVariablesProvider,
-		INodeAdapter {
-    // TODO: what's this for?
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/IPageVariableAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/IPageVariableAdapter.java
deleted file mode 100644
index 158799f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/IPageVariableAdapter.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter;
-
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.w3c.dom.Element;
-
-/**
- * A IPageVariableAdapter normally will be adapted to an JSP tag.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IPageVariableAdapter extends INodeAdapter {
-	/**
-	 * most JSP tags will only support a single variable.
-	 * @param element 
-	 * 
-	 * @return true if the tag supports multiple variables
-	 */
-	public boolean supportMultipleVariable(Element element);
-
-	/**
-	 * If only support single variable, this method will return the variable
-	 * info. This method is provided for better performance.
-	 * 
-	 * @param element 
-	 * @return null means no variable info provided.
-	 */
-	public IVariableInfo getVariableInfo(Element element);
-
-	/**
-	 * should return a list of IVariableInfo
-	 * @param element 
-	 * 
-	 * @return the list of variable infos
-	 */
-	public List getVariableInfos(Element element);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/PageVariableAdapterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/PageVariableAdapterFactory.java
deleted file mode 100644
index 1c6c64d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/PageVariableAdapterFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter;
-
-import org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar.PageVariableAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PageVariableAdapterFactory extends AbstractAdapterFactory {
-	/**
-	 * 
-	 */
-	public PageVariableAdapterFactory() {
-		super(IPageVariableAdapter.class, true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @seeorg.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory#createAdapter(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier)
-	 */
-	protected INodeAdapter createAdapter(INodeNotifier target) {
-		if (target instanceof IDOMElement) {
-			return PageVariableAdapter.getInstance();
-		}
-        return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/util/CMUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/util/CMUtil.java
deleted file mode 100644
index fd299aa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/util/CMUtil.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.util;
-
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-import org.eclipse.wst.html.core.internal.provisional.HTMLCMProperties;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMNodeWrapper;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapter;
-
-/**
- * Utility class to content model related information.
- * 
- * @author mengbo
- */
-public class CMUtil {
-	/**
-	 * If the element is a custom tag, get the URI of it. If the element is a
-	 * standard JSP tag, return null. If is not jsp tag, then return null
-	 * @param decl 
-	 * @return the tag uri for decl
-	 */
-	public static String getTagURI(CMElementDeclaration decl) {
-		if (decl instanceof CMNodeWrapper) {
-			decl = (CMElementDeclaration) ((CMNodeWrapper) decl)
-					.getOriginNode();
-		}
-		if (decl instanceof TLDElementDeclaration) {
-			CMDocument doc = ((TLDElementDeclaration) decl).getOwnerDocument();
-			if (doc instanceof TLDDocument) {
-				return ((TLDDocument) doc).getUri();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * get element declaration of specified element
-	 * 
-	 * @param element
-	 * @return null if can't get it.
-	 */
-	public static CMElementDeclaration getElementDeclaration(IDOMElement element) {
-		INodeNotifier notifier = (INodeNotifier) element.getOwnerDocument();
-		if (notifier == null) {
-			return null;
-		}
-		ModelQueryAdapter mqa = (ModelQueryAdapter) notifier
-				.getAdapterFor(ModelQueryAdapter.class);
-		if (mqa == null) {
-			return null;
-		}
-		return mqa.getModelQuery().getCMElementDeclaration(element);
-	}
-
-	/**
-	 * @param element
-	 * @return the tld element declaration for element
-	 */
-	public static TLDElementDeclaration getTLDElementDeclaration(
-			IDOMElement element) {
-		CMNode decl = getElementDeclaration(element);
-		if (decl instanceof CMNodeWrapper) {
-			decl = ((CMNodeWrapper) decl).getOriginNode();
-		}
-		if (decl instanceof TLDElementDeclaration) {
-			return (TLDElementDeclaration) decl;
-		}
-        return null;
-	}
-
-	/**
-	 * @param decl 
-	 * @return true if decl is a JSP tag 
-	 */
-	public static boolean isJSP(CMElementDeclaration decl) {
-		if (!decl.supports(HTMLCMProperties.IS_JSP)) {
-			return false;
-		}
-		return ((Boolean) decl.getProperty(HTMLCMProperties.IS_JSP))
-				.booleanValue();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.classpath b/jsf/plugins/org.eclipse.jst.pagedesigner/.classpath
deleted file mode 100644
index 472ee29..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.cvsignore b/jsf/plugins/org.eclipse.jst.pagedesigner/.cvsignore
deleted file mode 100644
index f9eb27a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-build.xml
-@dot
-javaCompiler...args
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.project b/jsf/plugins/org.eclipse.jst.pagedesigner/.project
deleted file mode 100644
index 290ca26..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.project
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.pagedesigner</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.jem.beaninfo.BeanInfoNature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index f2dd42a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 16:04:56 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 180cc29..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,77 +0,0 @@
-#Tue Apr 10 12:17:37 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.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/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.pagedesigner/META-INF/MANIFEST.MF
deleted file mode 100644
index 751933e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,123 +0,0 @@
-Manifest-Version: 1.0
-Bundle-SymbolicName: org.eclipse.jst.pagedesigner;singleton:=true
-Bundle-Name: %pluginName
-Bundle-Version: 1.0.1.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,2.4.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.1.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,1.1.0)",
- org.eclipse.wst.common.ui.properties;bundle-version="[1.0.101,1.2.0)",
- org.eclipse.jst.jsf.common.ui;bundle-version="[1.0.0,1.1.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,1.1.0)",
- org.eclipse.jst.jsf.core;bundle-version="[1.0.0,1.1.0)",
- org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.html.ui;bundle-version="[1.0.100,1.1.0)",
- org.eclipse.wst.css.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.html.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.xml.ui;bundle-version="[1.0.100,1.1.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
- javax.servlet;bundle-version="[2.4.0,3.0.0)",
- org.apache.commons.el;bundle-version="[1.0.0,2.0.0)",
- javax.servlet.jsp;bundle-version="[2.0.0,3.0.0)"
-Eclipse-LazyStart: true
-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;x-friends:="org.eclipse.jst.pagedesigner.tests",
- 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;x-friends:="org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.pagedesigner.dtmanager.converter;x-friends:="org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.pagedesigner.dtmanager.converter.internal;x-friends:="org.eclipse.jst.pagedesigner.jsf.ui",
- org.eclipse.jst.pagedesigner.dtmanager.converter.operations;x-friends:="org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;x-internal:=true,
- org.eclipse.jst.pagedesigner.dtmanager.dtinfo;x-friends:="org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;x-internal:=true,
- org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.util;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.actions;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.pagedesigner;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.palette;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.palette.impl;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.palette.internal.metadata;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.palette.paletteinfos;x-friends:="org.eclipse.jst.jsf.metadata.tests",
- org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.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;x-internal:=true,
- org.eclipse.jst.pagedesigner.figurehandler;x-internal:=true,
- org.eclipse.jst.pagedesigner.itemcreation;x-internal:=true,
- org.eclipse.jst.pagedesigner.itemcreation.internal;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.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-internal:=true,
- org.eclipse.jst.pagedesigner.properties.attrgroup;x-internal:=true,
- org.eclipse.jst.pagedesigner.properties.celleditors;x-internal:=true,
- org.eclipse.jst.pagedesigner.properties.internal;x-internal:=true,
- org.eclipse.jst.pagedesigner.range;x-internal:=true,
- org.eclipse.jst.pagedesigner.requests;x-internal:=true,
- org.eclipse.jst.pagedesigner.tableedit;x-internal:=true,
- org.eclipse.jst.pagedesigner.tools;x-internal:=true,
- org.eclipse.jst.pagedesigner.ui.common;x-internal:=true,
- org.eclipse.jst.pagedesigner.ui.common.sash;x-internal:=true,
- org.eclipse.jst.pagedesigner.ui.dialogfields;x-internal:=true,
- org.eclipse.jst.pagedesigner.ui.dialogs;x-internal:=true,
- org.eclipse.jst.pagedesigner.utils;x-internal:=true,
- org.eclipse.jst.pagedesigner.validation.caret;x-internal:=true,
- org.eclipse.jst.pagedesigner.viewer;x-internal:=true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-
-
-
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/about.html b/jsf/plugins/org.eclipse.jst.pagedesigner/about.html
deleted file mode 100644
index 72f94ad..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 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>
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 762bee3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/build.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-jars.compile.order = .
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               META-INF/,\
-               configs/,\
-               icons/,\
-               plugin.properties,\
-               plugin.xml,\
-               schema/,\
-               about.html,\
-               default.properties,\
-               metadata/
-javacSource=1.5
-javacTarget=1.5
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/configs/cm/html.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/configs/cm/html.properties
deleted file mode 100644
index c762a49..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/configs/cm/html.properties
+++ /dev/null
@@ -1,156 +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
-###############################################################################
-Attribute.Label.abbr=Abbr
-Attribute.Label.accept=Accept
-Attribute.Label.accesskey=Accesskey
-Attribute.Label.action=Action
-Attribute.Label.align=Align
-Attribute.Label.alink=Alink
-Attribute.Label.alt=Alt
-Attribute.Label.archive=Archive
-Attribute.Label.autostart=Autostart
-Attribute.Label.axis=Axis
-Attribute.Label.background=Background
-Attribute.Label.balance=Balance
-Attribute.Label.bgcolor=Bgcolor
-Attribute.Label.border=Border
-Attribute.Label.bordercolor=Bordercolor
-Attribute.Label.bordercolordark=Bordercolordark
-Attribute.Label.bordercolorlight=Bordercolorlight
-Attribute.Label.bottommargin=Bottommargin
-Attribute.Label.cellpadding=Cellpadding
-Attribute.Label.cellspacing=Cellspacing
-Attribute.Label.checked=Checked
-Attribute.Label.cite=Cite
-Attribute.Label.class=Class
-Attribute.Label.classid=Classid
-Attribute.Label.clear=Clear
-Attribute.Label.code=Code
-Attribute.Label.codebase=Codebase
-Attribute.Label.codetype=Codetype
-Attribute.Label.color=Color
-Attribute.Label.cols=Cols
-Attribute.Label.colspan=Colspan
-Attribute.Label.compact=Compact
-Attribute.Label.content=Content
-Attribute.Label.controls=Controls
-Attribute.Label.coords=Coords
-Attribute.Label.data=Data
-Attribute.Label.datapagesize=Datapagesize
-Attribute.Label.datetime=Datetime
-Attribute.Label.declare=Declare
-Attribute.Label.defer=Defer
-Attribute.Label.delay=Delay
-Attribute.Label.dir=Dir
-Attribute.Label.disabled=Disabled
-Attribute.Label.dynsrc=Dynsrc
-Attribute.Label.enctype=Enctype
-Attribute.Label.face=Face
-Attribute.Label.for=For
-Attribute.Label.frame=Frame
-Attribute.Label.frameborder=Frameborder
-Attribute.Label.framespacing=Framespacing
-Attribute.Label.headers=Headers
-Attribute.Label.height=Height
-Attribute.Label.hidden=Hidden
-Attribute.Label.href=Href
-Attribute.Label.hreflang=Hreflang
-Attribute.Label.hspace=Hspace
-Attribute.Label.http-equiv=http-equiv
-Attribute.Label.id=ID
-Attribute.Label.ismap=Ismap
-Attribute.Label.label=Label
-Attribute.Label.lang=Lang
-Attribute.Label.language=Language
-Attribute.Label.leftmargin=Leftmargin
-Attribute.Label.link=Link
-Attribute.Label.longdesc=Longdesc
-Attribute.Label.loop=Loop
-Attribute.Label.lowsrc=Lowsrc
-Attribute.Label.marginheight=Marginheight
-Attribute.Label.marginwidth=Marginwidth
-Attribute.Label.maxlength=Maxlength
-Attribute.Label.mayscript=Mayscript
-Attribute.Label.media=Media
-Attribute.Label.method=Method
-Attribute.Label.multiple=Multiple
-Attribute.Label.name=Name
-Attribute.Label.noresize=Noresize
-Attribute.Label.noshade=Noshade
-Attribute.Label.nowrap=Nowrap
-Attribute.Label.onblur=Onblur
-Attribute.Label.onchange=Onchange
-Attribute.Label.onclick=Onclick
-Attribute.Label.ondblclick=Ondblclick
-Attribute.Label.onfocus=Onfocus
-Attribute.Label.onkeydown=Onkeydown
-Attribute.Label.onkeypress=Onkeypress
-Attribute.Label.onkeyup=Onkeyup
-Attribute.Label.onload=Onload
-Attribute.Label.onmousedown=Onmousedown
-Attribute.Label.onmousemove=Onmousemove
-Attribute.Label.onmouseout=Onmouseout
-Attribute.Label.onmouseover=Onmouseover
-Attribute.Label.onmouseup=Onmouseup
-Attribute.Label.onreset=Onreset
-Attribute.Label.onselect=Onselect
-Attribute.Label.onsubmit=Onsubmit
-Attribute.Label.onunload=Onunload
-Attribute.Label.prompt=Prompt
-Attribute.Label.readonly=Readonly
-Attribute.Label.rel=Rel
-Attribute.Label.rev=Rev
-Attribute.Label.rightmargin=Rightmargin
-Attribute.Label.rows=Rows
-Attribute.Label.rowspan=Rowspan
-Attribute.Label.rules=Rules
-Attribute.Label.scope=Scope
-Attribute.Label.scrolling=Scrolling
-Attribute.Label.selected=Selected
-Attribute.Label.shape=Shape
-Attribute.Label.size=Size
-Attribute.Label.span=Span
-Attribute.Label.src=Src
-Attribute.Label.standby=Standby
-Attribute.Label.start=Start
-Attribute.Label.style=Style
-Attribute.Label.summary=Summary
-Attribute.Label.tabindex=Tabindex
-Attribute.Label.target=Target
-Attribute.Label.text=Text
-Attribute.Label.title=Title
-Attribute.Label.topmargin=Topmargin
-Attribute.Label.type=Type
-Attribute.Label.usemap=Usemap
-Attribute.Label.valign=Valign
-Attribute.Label.value=Value
-Attribute.Label.valuetype=Valuetype
-Attribute.Label.vlink=Vlink
-Attribute.Label.volume=Volume
-Attribute.Label.vspace=Vspace
-Attribute.Label.width=Width
-Attribute.Label.wrap=Wrap
-Attribute.Label.xmlns=Xmlns
-Category.Label.Accessibility=Accessibility
-Category.Label.VisualProperty=VisualProperty
-Category.Label.Browser.Specific=Browser Specific
-Category.Label.CSS/Accessibility=CSS/Accessibility
-Category.Label.Content=Content
-Category.Label.Data.Binding=Data Binding
-Category.Label.Dynamic=Dynamic
-Category.Label.Event=Event
-Category.Label.File=File
-Category.Label.General=General
-Category.Label.HTML4.0=HTML 4.0
-Category.Label.Image=Image
-Category.Label.Language=Language
-Category.Label.Radio/Checkbox=Radio/Checkbox
-Category.Label.Text/Password=Text/Password
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/configs/cm/html.xml b/jsf/plugins/org.eclipse.jst.pagedesigner/configs/cm/html.xml
deleted file mode 100644
index c3a29a6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/configs/cm/html.xml
+++ /dev/null
@@ -1,1559 +0,0 @@
-<?xml version="1.0" ?>
-<taglib uri="html">
-	<tag name="a">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="href" type="RELATIVEPATH"
-				displaylabel="%Attribute.Label.href" />
-			<attribute name="name" displaylabel="%Attribute.Label.name" />
-			<referedattribute ref="lang" overridename="hreflang"
-				displaylabel="%Attribute.Label.hreflang" />
-			<referedattribute ref="linktype" overridename="rel"
-				displaylabel="%Attribute.Label.rel" />
-			<referedattribute ref="linktype" overridename="rev"
-				displaylabel="%Attribute.Label.rev" />
-			<referedattribute ref="target" />
-			<attribute name="shape" type="ENUMERATED"
-				displaylabel="%Attribute.Label.shape">
-				<option key="circle" value="circle" />
-				<option key="default" value="default" />
-				<option key="rect" value="rect" default="default" />
-				<option key="poly" value="poly" />
-			</attribute>
-		</category>
-		<referedcategory ref="CSS/Accessibility">
-			<includeattrs>
-				<attribute name="accesskey"
-					displaylabel="%Attribute.Label.accesskey" />
-				<attribute name="tabindex"
-					displaylabel="%Attribute.Label.tabindex" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Event">
-			<includeattrs>
-				<attribute name="onblur"
-					displaylabel="%Attribute.Label.onblur" />
-				<attribute name="onfocus"
-					displaylabel="%Attribute.Label.onfocus" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="abbr">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="acronym">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="address">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="applet">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="code" displaylabel="%Attribute.Label.code" />
-			<attribute name="codebase"
-				displaylabel="%Attribute.Label.codebase" />
-			<attribute name="width" required="required"
-				displaylabel="%Attribute.Label.width" />
-			<attribute name="height" required="required"
-				displaylabel="%Attribute.Label.height" />
-			<attribute name="hspace"
-				displaylabel="%Attribute.Label.hspace" />
-			<attribute name="vspace"
-				displaylabel="%Attribute.Label.vspace" />
-			<referedattribute ref="ialign" overridename="align" />
-			<attribute name="archive"
-				displaylabel="%Attribute.Label.archive" />
-			<attribute name="name" displaylabel="%Attribute.Label.name" />
-		</category>
-		<referedcategory ref="CSS/Accessibility">
-			<includeattrs>
-				<attribute name="alt"
-					displaylabel="%Attribute.Label.alt" />
-			</includeattrs>
-		</referedcategory>
-	</tag>
-	<tag name="area">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="shape" type="ENUMERATED"
-				displaylabel="%Attribute.Label.shape">
-				<option key="circle" value="circle" />
-				<option key="default" value="default" />
-				<option key="rect" value="rect" default="default" />
-				<option key="poly" value="poly" />
-			</attribute>
-			<attribute name="coords"
-				displaylabel="%Attribute.Label.coords" />
-			<attribute name="href" type="RELATIVEPATH"
-				displaylabel="%Attribute.Label.href" />
-			<referedattribute ref="target" />
-		</category>
-		<referedcategory ref="CSS/Accessibility">
-			<includeattrs>
-				<attribute name="alt" required="required"
-					displaylabel="%Attribute.Label.alt" />
-				<attribute name="accesskey"
-					displaylabel="%Attribute.Label.accesskey" />
-				<attribute name="tabindex"
-					displaylabel="%Attribute.Label.tabindex" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Event">
-			<includeattrs>
-				<attribute name="onblur"
-					displaylabel="%Attribute.Label.onblur" />
-				<attribute name="onfocus"
-					displaylabel="%Attribute.Label.onfocus" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="b">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="base">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="href" type="RELATIVEPATH"
-				displaylabel="%Attribute.Label.href" />
-			<referedattribute ref="target" />
-		</category>
-	</tag>
-	<tag name="basefont">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="size" type="ENUMERATED" required="required"
-				displaylabel="%Attribute.Label.size">
-				<option key="1" value="1" />
-				<option key="2" value="2" />
-				<option key="3" value="3" />
-				<option key="4" value="4" />
-				<option key="5" value="5" />
-				<option key="6" value="6" />
-				<option key="7" value="7" />
-			</attribute>
-			<attribute name="face" displaylabel="%Attribute.Label.face" />
-			<attribute name="color" type="COLOR"
-				displaylabel="%Attribute.Label.color" />
-		</category>
-		<referedcategory ref="CSS/Accessibility">
-			<excludeattrs refs="class,style,title" />
-		</referedcategory>
-	</tag>
-	<tag name="bdo">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="big">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="blockquote">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="cite" type="RELATIVEPATH"
-				displaylabel="%Attribute.Label.cite" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="body">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="bgcolor" type="COLOR"
-				displaylabel="%Attribute.Label.bgcolor" />
-			<attribute name="background" type="RELATIVEPATH"
-				typeparam="suffix=jpg;gif;png"
-				displaylabel="%Attribute.Label.background" />
-			<attribute name="text" type="COLOR"
-				displaylabel="%Attribute.Label.text" />
-			<attribute name="link" type="COLOR"
-				displaylabel="%Attribute.Label.link" />
-			<attribute name="vlink" type="COLOR"
-				displaylabel="%Attribute.Label.vlink" />
-			<attribute name="alink" type="COLOR"
-				displaylabel="%Attribute.Label.alink" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event">
-			<includeattrs>
-				<attribute name="onload"
-					displaylabel="%Attribute.Label.onload" />
-				<attribute name="onunload"
-					displaylabel="%Attribute.Label.onunload" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="br">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="clear" type="ENUMERATED"
-				displaylabel="%Attribute.Label.clear">
-				<option key="right" value="right" />
-				<option key="none" value="none" default="default" />
-				<option key="left" value="left" />
-				<option key="all" value="all" />
-			</attribute>
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-	</tag>
-	<tag name="button">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="value"
-				displaylabel="%Attribute.Label.value" />
-			<attribute name="type" type="ENUMERATED"
-				displaylabel="%Attribute.Label.type">
-				<option key="submit" value="submit" default="default" />
-				<option key="reset" value="reset" />
-				<option key="button" value="button" />
-			</attribute>
-			<attribute name="disabled" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.disabled" />
-			<attribute name="name" displaylabel="%Attribute.Label.name" />
-		</category>
-		<referedcategory ref="CSS/Accessibility">
-			<includeattrs>
-				<attribute name="accesskey"
-					displaylabel="%Attribute.Label.accesskey" />
-				<attribute name="tabindex"
-					displaylabel="%Attribute.Label.tabindex" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Event">
-			<includeattrs>
-				<attribute name="onblur"
-					displaylabel="%Attribute.Label.onblur" />
-				<attribute name="onfocus"
-					displaylabel="%Attribute.Label.onfocus" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="caption">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="align" type="ENUMERATED"
-				displaylabel="%Attribute.Label.align">
-				<option key="right" value="right" />
-				<option key="top" value="top" />
-				<option key="left" value="left" />
-				<option key="bottom" value="bottom" />
-			</attribute>
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="center">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="cite">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="code">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="col">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<referedattribute ref="align" />
-			<attribute name="span" displaylabel="%Attribute.Label.span" />
-			<referedattribute ref="valign" />
-			<attribute name="width"
-				displaylabel="%Attribute.Label.width" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="colgroup">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<referedattribute ref="align" />
-			<attribute name="span" displaylabel="%Attribute.Label.span" />
-			<referedattribute ref="valign" />
-			<attribute name="width"
-				displaylabel="%Attribute.Label.width" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="dd">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="del">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="cite" type="RELATIVEPATH"
-				displaylabel="%Attribute.Label.cite" />
-			<attribute name="datetime"
-				displaylabel="%Attribute.Label.datetime" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="dfn">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="dir">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="compact" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.compact" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="div">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<referedattribute ref="dalign" overridename="align" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="dl">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="compact" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.compact" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="dt">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="em">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="fieldset">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="font">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="color" type="COLOR"
-				displaylabel="%Attribute.Label.color" />
-			<attribute name="size" type="ENUMERATED"
-				displaylabel="%Attribute.Label.size">
-				<option key="1" value="1" />
-				<option key="2" value="2" />
-				<option key="3" value="3" />
-				<option key="4" value="4" />
-				<option key="5" value="5" />
-				<option key="6" value="6" />
-				<option key="7" value="7" />
-				<option key="-1" value="-1" />
-				<option key="-2" value="-2" />
-				<option key="-3" value="-3" />
-				<option key="-4" value="-4" />
-				<option key="-5" value="-5" />
-				<option key="-6" value="-6" />
-				<option key="-7" value="-7" />
-				<option key="+1" value="+1" />
-				<option key="+2" value="+2" />
-				<option key="+3" value="+3" />
-				<option key="+4" value="+4" />
-				<option key="+5" value="+5" />
-				<option key="+6" value="+6" />
-				<option key="+7" value="+7" />
-			</attribute>
-			<attribute name="face" displaylabel="%Attribute.Label.face" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="form">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="action" required="required" type="RELATIVEPATH"
-				displaylabel="%Attribute.Label.action" />
-			<attribute name="method" type="ENUMERATED"
-				displaylabel="%Attribute.Label.method">
-				<option key="get" value="get" default="default" />
-				<option key="post" value="post" />
-			</attribute>
-			<attribute name="enctype" type="ENUMERATED"
-				displaylabel="%Attribute.Label.enctype">
-				<option key="application/x-www-form-urlencoded"
-					value="application/x-www-form-urlencoded" default="default" />
-				<option key="text/plain" value="text/plain" />
-				<option key="multipart/form-data"
-					value="multipart/form-data" />
-			</attribute>
-			<attribute name="name" displaylabel="%Attribute.Label.name" />
-			<referedattribute ref="target" />
-		</category>
-		<referedcategory ref="CSS/Accessibility"></referedcategory>
-		<referedcategory ref="Language" />
-		<referedcategory ref="Event">
-			<includeattrs>
-				<attribute name="onreset"
-					displaylabel="%Attribute.Label.onreset" />
-				<attribute name="onsubmit"
-					displaylabel="%Attribute.Label.onsubmit" />
-			</includeattrs>
-		</referedcategory>
-	</tag>
-	<tag name="frame">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="src" type="RELATIVEPATH"
-				displaylabel="%Attribute.Label.src" />
-			<attribute name="frameborder" type="ENUMERATED"
-				displaylabel="%Attribute.Label.frameborder">
-				<option key="0" value="0" />
-				<option key="1" value="1" default="default" />
-			</attribute>
-			<attribute name="scrolling" type="ENUMERATED"
-				displaylabel="%Attribute.Label.scrolling">
-				<option key="yes" value="Yes" />
-				<option key="no" value="No" />
-				<option key="auto" value="Auto" default="default" />
-			</attribute>
-			<attribute name="noresize" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.noresize" />
-			<attribute name="marginwidth"
-				displaylabel="%Attribute.Label.marginwidth" />
-			<attribute name="marginheight"
-				displaylabel="%Attribute.Label.marginheight" />
-			<attribute name="name" displaylabel="%Attribute.Label.name" />
-		</category>
-		<referedcategory ref="CSS/Accessibility">
-			<includeattrs>
-				<attribute name="longdesc"
-					displaylabel="%Attribute.Label.longdesc" />
-			</includeattrs>
-		</referedcategory>
-	</tag>
-	<tag name="frameset">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="rows" displaylabel="%Attribute.Label.rows" />
-			<attribute name="cols" displaylabel="%Attribute.Label.cols" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<category name="Event" displaylabel="%Category.Label.Event">
-			<attribute name="onload"
-				displaylabel="%Attribute.Label.onload" />
-			<attribute name="onunload"
-				displaylabel="%Attribute.Label.onunload" />
-		</category>
-	</tag>
-	<tag name="h1">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<referedattribute ref="dalign" overridename="align" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="h2">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<referedattribute ref="dalign" overridename="align" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="h3">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<referedattribute ref="dalign" overridename="align" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="h4">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<referedattribute ref="dalign" overridename="align" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="h5">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<referedattribute ref="dalign" overridename="align" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="h6">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<referedattribute ref="dalign" overridename="align" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="head">
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="hr">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="align" type="ENUMERATED"
-				displaylabel="%Attribute.Label.align">
-				<option key="right" value="right" />
-				<option key="left" value="left" />
-				<option key="center" value="center" />
-			</attribute>
-			<attribute name="width"
-				displaylabel="%Attribute.Label.width" />
-			<attribute name="size" displaylabel="%Attribute.Label.size" />
-			<attribute name="noshade" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.noshade" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="html">
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="i">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="iframe">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="src" type="RELATIVEPATH"
-				displaylabel="%Attribute.Label.src" />
-			<attribute name="width"
-				displaylabel="%Attribute.Label.width" />
-			<attribute name="marginwidth"
-				displaylabel="%Attribute.Label.marginwidth" />
-			<attribute name="height"
-				displaylabel="%Attribute.Label.height" />
-			<attribute name="marginheight"
-				displaylabel="%Attribute.Label.marginheight" />
-			<referedattribute ref="ialign" overridename="align" />
-			<attribute name="scrolling" type="ENUMERATED"
-				displaylabel="%Attribute.Label.scrolling">
-				<option key="Yes" value="Yes" />
-				<option key="No" value="No" />
-				<option key="Auto" value="Auto" />
-			</attribute>
-			<attribute name="frameborder" type="ENUMERATED"
-				displaylabel="%Attribute.Label.frameborder">
-				<option key="0" value="0" />
-				<option key="1" value="1" default="default" />
-			</attribute>
-			<attribute name="name" displaylabel="%Attribute.Label.name" />
-		</category>
-		<referedcategory ref="CSS/Accessibility">
-			<includeattrs>
-				<attribute name="longdesc"
-					displaylabel="%Attribute.Label.longdesc" />
-			</includeattrs>
-		</referedcategory>
-	</tag>
-	<tag name="img">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="src" type="RELATIVEPATH" required="required"
-				typeparam="suffix=jpg;gif;png" displaylabel="%Attribute.Label.src" />
-			<attribute name="width"
-				displaylabel="%Attribute.Label.width" />
-			<attribute name="height"
-				displaylabel="%Attribute.Label.height" />
-			<attribute name="hspace"
-				displaylabel="%Attribute.Label.hspace" />
-			<attribute name="vspace"
-				displaylabel="%Attribute.Label.vspace" />
-			<attribute name="border"
-				displaylabel="%Attribute.Label.border" />
-			<referedattribute ref="ialign" overridename="align" />
-			<attribute name="usemap"
-				displaylabel="%Attribute.Label.usemap" />
-			<attribute name="ismap" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.ismap" />
-			<attribute name="name" displaylabel="%Attribute.Label.name" />
-		</category>
-		<referedcategory ref="CSS/Accessibility">
-			<includeattrs>
-				<attribute name="alt" required="required"
-					displaylabel="%Attribute.Label.alt" />
-				<attribute name="longdesc" type="RELATIVEPATH"
-					displaylabel="%Attribute.Label.longdesc" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="input">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="checked" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.checked" />
-			<attribute name="maxlength"
-				displaylabel="%Attribute.Label.maxlength" />
-			<attribute name="readonly" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.readonly" />
-			<attribute name="type" type="ENUMERATED"
-				displaylabel="%Attribute.Label.type">
-				<option key="password" value="Password" />
-				<option key="checkbox" value="Checkbox" />
-				<option key="text" value="Text" default="default" />
-				<option key="submit" value="Submit" />
-				<option key="hidden" value="Hidden" />
-				<option key="file" value="File" />
-				<option key="reset" value="Reset" />
-				<option key="radio" value="Radio" />
-				<option key="image" value="Image" />
-				<option key="button" value="Button" />
-			</attribute>
-			<attribute name="disabled" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.disabled" />
-			<attribute name="value"
-				displaylabel="%Attribute.Label.value" />
-			<attribute name="size" displaylabel="%Attribute.Label.size" />
-			<attribute name="accept" type="ENUMERATED"
-				displaylabel="%Attribute.Label.accept">
-				<option key="application/msword"
-					value="application/msword" />
-				<option key="image/jpeg" value="image/jpeg" />
-				<option key="image/x-MS-bmp" value="image/x-MS-bmp" />
-				<option key="image/x-portable-greymap"
-					value="image/x-portable-greymap" />
-				<option key="video/x-msvideo" value="video/x-msvideo" />
-				<option key="video/x-mpeg2" value="video/x-mpeg2" />
-				<option key="audio/x-aiff" value="audio/x-aiff" />
-				<option key="image/x-photo-cd" value="image/x-photo-cd" />
-				<option key="audio/x-waw" value="audio/x-waw" />
-				<option key="image/tiff" value="image/tiff" />
-				<option key="audio/basic" value="audio/basic" />
-				<option key="video/quicktime" value="video/quicktime" />
-				<option key="application/msexcel"
-					value="application/msexcel" />
-				<option key="image/gif" value="image/gif" />
-				<option key="audio/x-pn/realaudio"
-					value="audio/x-pn/realaudio" />
-				<option key="application/pdf" value="application/pdf" />
-				<option key="image/x-portablebitmap"
-					value="image/x-portablebitmap" />
-				<option key="application/rtf" value="application/rtf" />
-				<option key="text/html" value="text/html" />
-				<option key="image/x-portable-pixmap"
-					value="image/x-portable-pixmap" />
-				<option key="text/plain" value="text/plain" />
-				<option key="application/x-zip-compressed"
-					value="application/x-zip-compressed" />
-				<option key="audio/x-mpeg" value="audio/x-mpeg" />
-				<option key="application/postscript"
-					value="application/postscript" />
-				<option key="image/x-png" value="image/x-png" />
-				<option key="image/x-rgb" value="image/x-rgb" />
-			</attribute>
-			<attribute name="name" displaylabel="%Attribute.Label.name" />
-		</category>
-		<referedcategory ref="CSS/Accessibility">
-			<includeattrs>
-				<attribute name="accesskey"
-					displaylabel="%Attribute.Label.accesskey" />
-				<attribute name="alt"
-					displaylabel="%Attribute.Label.alt" />
-				<attribute name="tabindex"
-					displaylabel="%Attribute.Label.tabindex" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Event">
-			<includeattrs>
-				<attribute name="onblur"
-					displaylabel="%Attribute.Label.onblur" />
-				<attribute name="onchange"
-					displaylabel="%Attribute.Label.onchange" />
-				<attribute name="onfocus"
-					displaylabel="%Attribute.Label.onfocus" />
-				<attribute name="onselect"
-					displaylabel="%Attribute.Label.onselect" />
-			</includeattrs>
-		</referedcategory>
-		<category name="Image" displaylabel="%Category.Label.Image">
-			<attribute name="src" type="RELATIVEPATH"
-				typeparam="suffix=jpg;gif;png" displaylabel="%Attribute.Label.src" />
-			<referedattribute ref="ialign" overridename="align" />
-			<attribute name="usemap"
-				displaylabel="%Attribute.Label.usemap" />
-			<attribute name="ismap" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.ismap" />
-		</category>
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="ins">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="cite" type="RELATIVEPATH"
-				displaylabel="%Attribute.Label.cite" />
-			<attribute name="datetime"
-				displaylabel="%Attribute.Label.datetime" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="isindex">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="prompt"
-				displaylabel="%Attribute.Label.prompt" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="kbd">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="label">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="for" displaylabel="%Attribute.Label.for" />
-		</category>
-		<referedcategory ref="CSS/Accessibility">
-			<includeattrs>
-				<attribute name="accesskey"
-					displaylabel="%Attribute.Label.accesskey" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Event">
-			<includeattrs>
-				<attribute name="onblur"
-					displaylabel="%Attribute.Label.onblur" />
-				<attribute name="onfocus"
-					displaylabel="%Attribute.Label.onfocus" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="legend">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="align" type="ENUMERATED"
-				displaylabel="%Attribute.Label.align">
-				<option key="right" value="right" />
-				<option key="top" value="top - not supported by MSIE4" />
-				<option key="left" value="left" />
-				<option key="bottom" value="bottom" />
-			</attribute>
-		</category>
-		<referedcategory ref="CSS/Accessibility">
-			<includeattrs>
-				<attribute name="accesskey"
-					displaylabel="%Attribute.Label.accesskey" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="li">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="type" type="ENUMERATED"
-				displaylabel="%Attribute.Label.type">
-				<option key="i" value="i lower roman" />
-				<option key="I" value="I upper roman" />
-				<option key="a" value="a lower alpha" />
-				<option key="A" value="A upper alpha" />
-				<option key="1" value="1 arabic numbers" />
-				<option key="square" value="square" />
-				<option key="circle" value="circle" />
-				<option key="disc" value="disc" />
-			</attribute>
-			<attribute name="value"
-				displaylabel="%Attribute.Label.value" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="link">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="href" type="RELATIVEPATH"
-				displaylabel="%Attribute.Label.href" />
-			<referedattribute ref="linktype" overridename="rel"
-				displaylabel="%Attribute.Label.rel" />
-			<referedattribute ref="linktype" overridename="rev"
-				displaylabel="%Attribute.Label.rev" />
-			<referedattribute ref="lang" overridename="hreflang"
-				displaylabel="%Attribute.Label.hreflang" />
-			<referedattribute ref="media" />
-			<referedattribute ref="target" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="map">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="name" displaylabel="%Attribute.Label.name" required="required" />
-		</category>
-		<referedcategory ref="CSS/Accessibility"></referedcategory>
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="menu">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="compact" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.compact" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="meta">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="http-equiv"
-				displaylabel="%Attribute.Label.http-equiv" />
-			<attribute name="content" required="required"
-				displaylabel="%Attribute.Label.content" />
-			<attribute name="name" displaylabel="%Attribute.Label.name" />
-		</category>
-		<category name="CSS/Accessibility"
-			displaylabel="%Category.Label.CSS/Accessibility">
-		</category>
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="noframes">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="noscript">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="object">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="usemap"
-				displaylabel="%Attribute.Label.usemap" />
-			<attribute name="standby"
-				displaylabel="%Attribute.Label.standby" />
-			<attribute name="width"
-				displaylabel="%Attribute.Label.width" />
-			<attribute name="height"
-				displaylabel="%Attribute.Label.height" />
-			<attribute name="hspace"
-				displaylabel="%Attribute.Label.hspace" />
-			<attribute name="vspace"
-				displaylabel="%Attribute.Label.vspace" />
-			<referedattribute ref="ialign" overridename="align" />
-			<attribute name="border"
-				displaylabel="%Attribute.Label.border" />
-			<attribute name="name" displaylabel="%Attribute.Label.name" />
-		</category>
-		<referedcategory ref="CSS/Accessibility">
-			<includeattrs>
-				<attribute name="tabindex"
-					displaylabel="%Attribute.Label.tabindex" />
-			</includeattrs>
-		</referedcategory>
-		<category name="Content"
-			displaylabel="%Category.Label.Content">
-			<attribute name="classid" type="RELATIVEPATH"
-				displaylabel="%Attribute.Label.classid" />
-			<attribute name="codebase" type="RELATIVEPATH"
-				displaylabel="%Attribute.Label.codebase" />
-			<attribute name="codetype"
-				displaylabel="%Attribute.Label.codetype" />
-			<attribute name="data" type="RELATIVEPATH"
-				displaylabel="%Attribute.Label.data" />
-			<attribute name="archive"
-				displaylabel="%Attribute.Label.archive" />
-			<attribute name="declare" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.declare" />
-		</category>
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="ol">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="start"
-				displaylabel="%Attribute.Label.start" />
-			<attribute name="type" type="ENUMERATED"
-				displaylabel="%Attribute.Label.type">
-				<option key="i" value="i lower roman" />
-				<option key="I" value="I upper roman" />
-				<option key="a" value="a lower alpha" />
-				<option key="A" value="A upper alpha" />
-				<option key="1" value="1 arabic numbers" />
-			</attribute>
-			<attribute name="compact" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.compact" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="optgroup">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="disabled" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.disabled" />
-		</category>
-		<referedcategory ref="CSS/Accessibility">
-			<includeattrs>
-				<attribute name="label" required="required"
-					displaylabel="%Attribute.Label.label" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Event">
-			<includeattrs>
-				<attribute name="onblur"
-					displaylabel="%Attribute.Label.onblur" />
-				<attribute name="onchange"
-					displaylabel="%Attribute.Label.onchange" />
-				<attribute name="onfocus"
-					displaylabel="%Attribute.Label.onfocus" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="option">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="value"
-				displaylabel="%Attribute.Label.value" />
-			<attribute name="selected" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.selected" />
-			<attribute name="disabled" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.disabled" />
-		</category>
-		<referedcategory ref="CSS/Accessibility">
-			<includeattrs>
-				<attribute name="label"
-					displaylabel="%Attribute.Label.label" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Event">
-			<includeattrs>
-				<attribute name="onblur"
-					displaylabel="%Attribute.Label.onblur" />
-				<attribute name="onchange"
-					displaylabel="%Attribute.Label.onchange" />
-				<attribute name="onfocus"
-					displaylabel="%Attribute.Label.onfocus" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="p">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<referedattribute ref="dalign" overridename="align" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Language" />
-		<referedcategory ref="Event" />
-	</tag>
-	<tag name="param">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="value"
-				displaylabel="%Attribute.Label.value" />
-			<attribute name="valuetype" type="ENUMERATED"
-				displaylabel="%Attribute.Label.valuetype">
-				<option key="object" value="object" />
-				<option key="ref" value="ref" />
-				<option key="data" value="data" default="default" />
-			</attribute>
-			<attribute name="name" displaylabel="%Attribute.Label.name" required="required" />
-		</category>
-		<referedcategory ref="CSS/Accessibility">
-			<excludeattrs refs="class,style,title" />
-		</referedcategory>
-	</tag>
-	<tag name="pre">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="q">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="cite" type="RELATIVEPATH"
-				displaylabel="%Attribute.Label.cite" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="s">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="samp">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="script">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="src" type="RELATIVEPATH"
-				displaylabel="%Attribute.Label.src" />
-			<attribute name="type" type="ENUMERATED" required="required"
-				displaylabel="%Attribute.Label.type">
-				<option key="text/php" value="text/php" />
-				<option key="text/tcl" value="text/tcl" />
-				<option key="text/livescript" value="text/livescript" />
-				<option key="text/vbscript" value="text/vbscript" />
-				<option key="text/jscript" value="text/jscript" />
-				<option key="text/javascript" value="text/javascript" />
-			</attribute>
-			<attribute name="defer" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.defer" />
-		</category>
-	</tag>
-	<tag name="select">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="size" displaylabel="%Attribute.Label.size" />
-			<attribute name="multiple" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.multiple" />
-			<attribute name="disabled" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.disabled" />
-			<attribute name="name" displaylabel="%Attribute.Label.name" />
-		</category>
-		<referedcategory ref="CSS/Accessibility">
-			<includeattrs>
-				<attribute name="tabindex"
-					displaylabel="%Attribute.Label.tabindex" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Event">
-			<includeattrs>
-				<attribute name="onblur"
-					displaylabel="%Attribute.Label.onblur" />
-				<attribute name="onchange"
-					displaylabel="%Attribute.Label.onchange" />
-				<attribute name="onfocus"
-					displaylabel="%Attribute.Label.onfocus" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="small">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="span">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="strike">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="strong">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="style">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="type" type="ENUMERATED" required="required"
-				displaylabel="%Attribute.Label.type">
-				<option key="text/css" value="text/css" />
-				<option key="text/javascript" value="text/javascript" />
-			</attribute>
-			<referedattribute ref="media" />
-		</category>
-		<category name="CSS/Accessibility"
-			displaylabel="%Category.Label.CSS/Accessibility">
-			<attribute name="title"
-				displaylabel="%Attribute.Label.title" />
-		</category>
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="sub">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="sup">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="table">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="width"
-				displaylabel="%Attribute.Label.width" />
-			<attribute name="border"
-				displaylabel="%Attribute.Label.border" />
-			<attribute name="align" type="ENUMERATED"
-				displaylabel="%Attribute.Label.align">
-				<option key="right" value="right" />
-				<option key="left" value="left" />
-				<option key="center" value="center" />
-			</attribute>
-			<attribute name="cellpadding"
-				displaylabel="%Attribute.Label.cellpadding" />
-			<attribute name="cellspacing"
-				displaylabel="%Attribute.Label.cellspacing" />
-			<attribute name="bgcolor" type="COLOR"
-				displaylabel="%Attribute.Label.bgcolor" />
-			<attribute name="frame" type="ENUMERATED"
-				displaylabel="%Attribute.Label.frame">
-				<option key="lhs"
-					value="Lhs - Border on the left-hand side of the table frame" />
-				<option key="above"
-					value="Above - Border on the top side of the table frame" />
-				<option key="void"
-					value="Void - Removes all outside table borders (default)" />
-				<option key="box"
-					value="Box - Border on all sides of the table frame" />
-				<option key="vsides"
-					value="Vsides - Border on the left and right sides of the table frame" />
-				<option key="below"
-					value="Below - Border on the bottom side of the table frame" />
-				<option key="border"
-					value="Border - Border on all sides of the table frame" />
-				<option key="rhs"
-					value="Rhs - Border on the right-hand side of the table frame" />
-				<option key="hsides"
-					value="Hsides - Border on the top and bottom sides of the table frame" />
-			</attribute>
-			<attribute name="rules" type="ENUMERATED"
-				displaylabel="%Attribute.Label.rules">
-				<option key="cols"
-					value="Cols - Displays vertical borders between all table columns" />
-				<option key="groups"
-					value="Groups - Displays horizontal borders between all table groups" />
-				<option key="rows"
-					value="Rows - Displays horizontal borders between all table rows" />
-				<option key="none"
-					value="None - Removes all interior table borders (default)" />
-				<option key="all"
-					value="All - Displays a border on all rows and columns" />
-			</attribute>
-		</category>
-		<referedcategory ref="CSS/Accessibility">
-			<includeattrs>
-				<attribute name="summary"
-					displaylabel="%Attribute.Label.summary" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="tbody">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<referedattribute ref="align" />
-			<referedattribute ref="valign" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="td">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="width"
-				displaylabel="%Attribute.Label.width" />
-			<attribute name="height"
-				displaylabel="%Attribute.Label.height" />
-			<attribute name="colspan"
-				displaylabel="%Attribute.Label.colspan" />
-			<attribute name="rowspan"
-				displaylabel="%Attribute.Label.rowspan" />
-			<referedattribute ref="align" />
-			<attribute name="nowrap" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.nowrap" />
-			<attribute name="bgcolor" type="COLOR"
-				displaylabel="%Attribute.Label.bgcolor" />
-			<referedattribute ref="scope" />
-			<referedattribute ref="valign" />
-		</category>
-		<referedcategory ref="CSS/Accessibility">
-			<includeattrs>
-				<attribute name="abbr"
-					displaylabel="%Attribute.Label.abbr" />
-				<attribute name="axis"
-					displaylabel="%Attribute.Label.axis" />
-				<attribute name="headers"
-					displaylabel="%Attribute.Label.headers" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="textarea">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="cols" required="required" displaylabel="%Attribute.Label.cols" />
-			<attribute name="rows" required="required" displaylabel="%Attribute.Label.rows" />
-			<attribute name="disabled" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.disabled" />
-			<attribute name="readonly" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.readonly" />
-			<attribute name="name" displaylabel="%Attribute.Label.name" />
-		</category>
-		<referedcategory ref="CSS/Accessibility">
-			<includeattrs>
-				<attribute name="accesskey"
-					displaylabel="%Attribute.Label.accesskey" />
-				<attribute name="tabindex"
-					displaylabel="%Attribute.Label.tabindex" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Event">
-			<includeattrs>
-				<attribute name="onblur"
-					displaylabel="%Attribute.Label.onblur" />
-				<attribute name="onchange"
-					displaylabel="%Attribute.Label.onchange" />
-				<attribute name="onfocus"
-					displaylabel="%Attribute.Label.onfocus" />
-				<attribute name="onselect"
-					displaylabel="%Attribute.Label.onselect" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="tfoot">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<referedattribute ref="align" />
-			<referedattribute ref="valign" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="th">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="width"
-				displaylabel="%Attribute.Label.width" />
-			<attribute name="height"
-				displaylabel="%Attribute.Label.height" />
-			<attribute name="colspan"
-				displaylabel="%Attribute.Label.colspan" />
-			<attribute name="rowspan"
-				displaylabel="%Attribute.Label.rowspan" />
-			<referedattribute ref="align" />
-			<attribute name="nowrap" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.nowrap" />
-			<attribute name="bgcolor" type="COLOR"
-				displaylabel="%Attribute.Label.bgcolor" />
-			<referedattribute ref="scope" />
-			<referedattribute ref="valign" />
-		</category>
-		<referedcategory ref="CSS/Accessibility">
-			<includeattrs>
-				<attribute name="abbr"
-					displaylabel="%Attribute.Label.abbr" />
-				<attribute name="axis"
-					displaylabel="%Attribute.Label.axis" />
-				<attribute name="headers"
-					displaylabel="%Attribute.Label.headers" />
-			</includeattrs>
-		</referedcategory>
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="thead">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<referedattribute ref="align" />
-			<referedattribute ref="valign" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="title">
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="tr">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<referedattribute ref="align" />
-			<referedattribute ref="valign" />
-			<attribute name="bgcolor" type="COLOR"
-				displaylabel="%Attribute.Label.bgcolor" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="tt">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="u">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="ul">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="type" type="ENUMERATED"
-				displaylabel="%Attribute.Label.type">
-				<option key="square" value="square" />
-				<option key="circle" value="circle" />
-				<option key="disc" value="disc" />
-			</attribute>
-			<attribute name="compact" type="NAMED-BOOLEAN"
-				displaylabel="%Attribute.Label.compact" />
-		</category>
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<tag name="var">
-		<referedcategory ref="CSS/Accessibility" />
-		<referedcategory ref="Event" />
-		<referedcategory ref="Language" />
-	</tag>
-	<definition>
-		<categories>
-			<category name="CSS/Accessibility"
-				displaylabel="%Category.Label.CSS/Accessibility">
-				<attribute name="class" type="CSSCLASS"
-					displaylabel="%Attribute.Label.class" />
-				<attribute name="id" type="CSSID"
-					displaylabel="%Attribute.Label.id" />
-				<attribute name="style" type="CSSSTYLE"
-					typeparam="style=STYLE" displaylabel="%Attribute.Label.style" />
-				<attribute name="title"
-					displaylabel="%Attribute.Label.title" />
-			</category>
-			<category name="Event"
-				displaylabel="%Category.Label.Event">
-				<attribute name="onclick" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.onclick" />
-				<attribute name="ondblclick" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.ondblclick" />
-				<attribute name="onmousedown" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.onmousedown" />
-				<attribute name="onmousemove" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.onmousemove" />
-				<attribute name="onmouseout" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.onmouseout" />
-				<attribute name="onmouseover" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.onmouseover" />
-				<attribute name="onmouseup" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.onmouseup" />
-				<attribute name="onkeydown" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.onkeydown" />
-				<attribute name="onkeypress" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.onkeypress" />
-				<attribute name="onkeyup" type="JAVASCRIPT"
-					displaylabel="%Attribute.Label.onkeyup" />
-			</category>
-			<category name="Language"
-				displaylabel="%Category.Label.Language">
-				<attribute name="dir" type="ENUMERATED"
-					displaylabel="%Attribute.Label.dir">
-					<option key="ltr" value="left-to-right" />
-					<option key="rtl" value="right-to-left" />
-				</attribute>
-				<referedattribute ref="lang" />
-			</category>
-		</categories>
-		<attributes>
-			<attribute name="align" type="ENUMERATED"
-				displaylabel="%Attribute.Label.align">
-				<option key="right" value="right" />
-				<option key="char" value="char" />
-				<option key="left" value="left" />
-				<option key="center" value="center" />
-				<option key="justify" value="justify" />
-			</attribute>
-			<attribute name="dalign" type="ENUMERATED"
-				displaylabel="%Attribute.Label.align">
-				<option key="right" value="right" />
-				<option key="left" value="left" />
-				<option key="center" value="center" />
-				<option key="justify" value="justify" />
-			</attribute>
-			<attribute name="ialign" type="ENUMERATED"
-				displaylabel="%Attribute.Label.align">
-				<option key="bottom" value="bottom" />
-				<option key="middle" value="middle" />
-				<option key="top" value="top" />
-				<option key="right" value="right" />
-				<option key="left" value="left" />
-			</attribute>
-			<attribute name="lang" type="ENUMERATED"
-				displaylabel="%Attribute.Label.lang">
-				<option key="af" value="af Afrikaans" />
-				<option key="ar" value="ar Arabic (needs subtype)" />
-				<option key="be" value="be Belarusian" />
-				<option key="bg" value="bg Bulgarian" />
-				<option key="br" value="br Breton" />
-				<option key="ca" value="ca Catalan" />
-				<option key="cs" value="cs Czech" />
-				<option key="da" value="da Danish" />
-				<option key="de" value="de German (Standard)" />
-				<option key="el" value="el Greek" />
-				<option key="en" value="en English" />
-				<option key="es" value="es Spanish (Spain)" />
-				<option key="et" value="et Estonian" />
-				<option key="eu" value="eu Basque" />
-				<option key="fa" value="fa Farsi" />
-				<option key="fi" value="fi Finnish" />
-				<option key="fo" value="fo Faeroese" />
-				<option key="fr" value="fr French (Standard)" />
-				<option key="gd" value="gd Gaelic (Scotland)" />
-				<option key="he" value="he Hebrew" />
-				<option key="hi" value="hi Hindi" />
-				<option key="hr" value="hr Croatian" />
-				<option key="hu" value="hu Hungarian" />
-				<option key="id" value="id Indonesian" />
-				<option key="is" value="is Icelandic" />
-				<option key="it" value="it Italian (Standard)" />
-				<option key="ja" value="ja Japanese" />
-				<option key="ko" value="ko Korean" />
-				<option key="lt" value="lt Lithuanian" />
-				<option key="lv" value="lv Latvian" />
-				<option key="mk" value="mk Macedonian" />
-				<option key="ms" value="ms Malaysian" />
-				<option key="mt" value="mt Maltese" />
-				<option key="nl" value="nl Dutch (Standard)" />
-				<option key="no" value="no Norwegian (Bokmal/Nynorsk)" />
-				<option key="pl" value="pl Polish" />
-				<option key="pt" value="pt Portuguese (Standard)" />
-				<option key="rm" value="rm Rhaeto-Romanic" />
-				<option key="ro" value="ro Romanian" />
-				<option key="ru" value="ru Russian" />
-				<option key="sk" value="sk Slovak" />
-				<option key="sl" value="sl Slovenian" />
-				<option key="sq" value="sq Albanian" />
-				<option key="sr" value="sr Serbian (Cyrillic/Latin)" />
-				<option key="sv" value="sv Swedish" />
-				<option key="sx" value="sx Sutu" />
-				<option key="sz" value="sz Sami (Lappish)" />
-				<option key="th" value="th Thai" />
-				<option key="tn" value="tn Setswana" />
-				<option key="tr" value="tr Turkish" />
-				<option key="ts" value="ts Tsonga" />
-				<option key="uk" value="uk Ukrainian" />
-				<option key="ur" value="ur Urdu" />
-				<option key="vi" value="vi Vietnamese" />
-				<option key="xh" value="xh Xhosa" />
-				<option key="yi" value="yi Yiddish" />
-				<option key="zh" value="zh Chinese (needs subtype)" />
-				<option key="zu" value="zu Zulu" />
-			</attribute>
-			<attribute name="linktype">
-				<option key="index" value="index" />
-				<option key="subsection" value="subsection" />
-				<option key="bookmark" value="bookmark" />
-				<option key="start" value="start" />
-				<option key="next" value="next" />
-				<option key="stylesheet" value="stylesheet" />
-				<option key="chapter" value="chapter" />
-				<option key="help" value="help" />
-				<option key="alternate" value="alternate" />
-				<option key="appendix" value="appendix" />
-				<option key="contents" value="contents" />
-				<option key="section" value="section" />
-				<option key="prev" value="prev" />
-				<option key="previous" value="previous" />
-				<option key="glossary" value="glossary" />
-				<option key="copyright" value="copyright" />
-			</attribute>
-			<attribute name="media" type="ENUMERATED"
-				displaylabel="%Attribute.Label.media">
-				<option key="tv" value="tv" />
-				<option key="braille" value="braille" />
-				<option key="tty" value="tty" />
-				<option key="print" value="print" />
-				<option key="all" value="all" />
-				<option key="projection" value="projection" />
-				<option key="handheld" value="handheld" />
-				<option key="screen" value="screen" />
-				<option key="aural" value="aural" />
-			</attribute>
-			<attribute name="scope" type="ENUMERATED"
-				displaylabel="%Attribute.Label.scope">
-				<option key="row" value="row" />
-				<option key="col" value="col" />
-				<option key="rowgroup" value="rowgroup" />
-				<option key="colgroup" value="colgroup" />
-			</attribute>
-			<attribute name="target" type="ENUMERATED"
-				displaylabel="%Attribute.Label.target">
-				<option key="_self" value="_self" />
-				<option key="_blank" value="_blank" />
-				<option key="_parent" value="_parent" />
-				<option key="_top" value="_top" />
-			</attribute>
-			<attribute name="valign" type="ENUMERATED"
-				displaylabel="%Attribute.Label.valign">
-				<option key="middle" value="middle" />
-				<option key="top" value="top" />
-				<option key="baseline" value="baseline" />
-				<option key="bottom" value="bottom" />
-			</attribute>
-		</attributes>
-	</definition>
-</taglib>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/configs/cm/jsp.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/configs/cm/jsp.properties
deleted file mode 100644
index f07afa0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/configs/cm/jsp.properties
+++ /dev/null
@@ -1,37 +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
-###############################################################################
-Attribute.Label.align=Align
-Attribute.Label.beanName=BeanName
-Attribute.Label.class=Class
-Attribute.Label.code=Code
-Attribute.Label.codebase=Codebase
-Attribute.Label.contentType=ContentType
-Attribute.Label.flush=Flush
-Attribute.Label.file=File
-Attribute.Label.height=Height
-Attribute.Label.hspace=Hspace
-Attribute.Label.id=ID
-Attribute.Label.iepluginurl=Eepluginurl
-Attribute.Label.import=Import
-Attribute.Label.jreversion=Jreversion
-Attribute.Label.name=Name
-Attribute.Label.nspluginurl=Nspluginurl
-Attribute.Label.page=Page
-Attribute.Label.param=Param
-Attribute.Label.property=Property
-Attribute.Label.scope=Scope
-Attribute.Label.type=Type
-Attribute.Label.value=Value
-Attribute.Label.version=Version
-Attribute.Label.vspace=Vspace
-Attribute.Label.width=Width
-Attribute.Label.xmlnsjsp=xmlns:jsp
-Category.Label.General=General
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/configs/cm/jsp.xml b/jsf/plugins/org.eclipse.jst.pagedesigner/configs/cm/jsp.xml
deleted file mode 100644
index 6736eef..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/configs/cm/jsp.xml
+++ /dev/null
@@ -1,119 +0,0 @@
-<?xml version="1.0" ?>
-<taglib uri="jsp">
-	<tag name="declaration" />
-	<tag name="expression" />
-	<tag name="fallback" />
-	<tag name="forward">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="page" type="RELATIVEPATH"
-				typeparam="suffix=jsp;htm;html" displaylabel="%Attribute.Label.page" />
-		</category>
-	</tag>
-	<tag name="getproperty">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="name" displaylabel="%Attribute.Label.name" />
-			<attribute name="property"
-				displaylabel="%Attribute.Label.property" />
-		</category>
-	</tag>
-	<tag name="include">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="page" type="RELATIVEPATH"
-				typeparam="suffix=jsp;htm;html" displaylabel="%Attribute.Label.page" />
-			<attribute name="flush" type="BOOLEAN"
-				displaylabel="%Attribute.Label.flush" />
-		</category>
-	</tag>
-	<tag name="directive.include">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="file" type="RELATIVEPATH"
-				typeparam="suffix=jsp;htm;html" displaylabel="%Attribute.Label.file" />
-		</category>
-	</tag>
-	<tag name="directive.page">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="import"
-				displaylabel="%Attribute.Label.import" />
-			<attribute name="contentType"
-				displaylabel="%Attribute.Label.contentType" />
-		</category>
-	</tag>
-	<tag name="param">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="name" displaylabel="%Attribute.Label.name" />
-			<attribute name="value"
-				displaylabel="%Attribute.Label.value" />
-		</category>
-	</tag>
-	<tag name="params" />
-	<tag name="plugin">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="type" type="ENUMERATED"
-				displaylabel="%Attribute.Label.type">
-				<option key="applet" value="applet" />
-				<option key="bean" value="bean" />
-			</attribute>
-			<attribute name="jreversion"
-				displaylabel="%Attribute.Label.jreversion" type="ENUMERATED">
-				<option key="1.2" value="1.2" />
-			</attribute>
-			<attribute name="nspluginurl"
-				displaylabel="%Attribute.Label.nspluginurl" />
-			<attribute name="iepluginurl"
-				displaylabel="%Attribute.Label.iepluginurl" />
-		</category>
-	</tag>
-	<tag name="root">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="version" type="ENUMERATED"
-				displaylabel="%Attribute.Label.version">
-				<option key="1.2" value="1.2" />
-				<option key="2.0" value="2.0" />
-			</attribute>
-			<attribute name="xmlns:jsp" type="ENUMERATED"
-				displaylabel="%Attribute.Label.xmlnsjsp">
-				<option key="http://java.sun.com/JSP/Page" value="http://java.sun.com/JSP/Page" />
-			</attribute>
-		</category>
-	</tag>
-	<tag name="scriptlet" />
-	<tag name="setproperty">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="name" displaylabel="%Attribute.Label.name" />
-			<attribute name="property"
-				displaylabel="%Attribute.Label.property" />
-			<attribute name="param"
-				displaylabel="%Attribute.Label.param" />
-			<attribute name="value"
-				displaylabel="%Attribute.Label.value" />
-		</category>
-	</tag>
-	<tag name="directive.taglib" />
-	<tag name="usebean">
-		<category name="General"
-			displaylabel="%Category.Label.General">
-			<attribute name="id" displaylabel="%Attribute.Label.id" />
-			<attribute name="scope" type="ENUMERATED"
-				displaylabel="%Attribute.Label.scope">
-				<option key="page" value="page" />
-				<option key="session" value="session" />
-				<option key="request" value="request" />
-				<option key="application" value="application" />
-			</attribute>
-			<attribute name="class" type="CLASSNAME"
-				displaylabel="%Attribute.Label.class" />
-			<attribute name="type" displaylabel="%Attribute.Label.type" />
-			<attribute name="beanName"
-				displaylabel="%Attribute.Label.beanName" />
-		</category>
-	</tag>
-</taglib>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/default.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/default.properties
deleted file mode 100644
index ff236a1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/default.properties
+++ /dev/null
@@ -1,12 +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
-###############################################################################
-# This file contains all the Default Preference Settings
-
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/MoveHandle.png b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/MoveHandle.png
deleted file mode 100644
index 679ef99..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/MoveHandle.png
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding.gif
deleted file mode 100644
index 6638a99..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding_disabled.gif
deleted file mode 100644
index c5064fd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Plugin.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Plugin.gif
deleted file mode 100644
index 471b1b5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Plugin.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold.gif
deleted file mode 100644
index f814851..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold_disabled.gif
deleted file mode 100644
index 639de46..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_designer.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_designer.gif
deleted file mode 100644
index fdfcae0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_designer.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_hsplit.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_hsplit.gif
deleted file mode 100644
index 4dae95d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_hsplit.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic.gif
deleted file mode 100644
index fb765fe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic_disabled.gif
deleted file mode 100644
index 7475315..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont.gif
deleted file mode 100644
index 39afd38..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont_disabled.gif
deleted file mode 100644
index fe38ccb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_paragraph.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_paragraph.gif
deleted file mode 100644
index b129090..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_paragraph.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont.gif
deleted file mode 100644
index f0b4eba..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont_disabled.gif
deleted file mode 100644
index c02528a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_source.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_source.gif
deleted file mode 100644
index 86986df..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_source.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline.gif
deleted file mode 100644
index b8ac977..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline_disabled.gif
deleted file mode 100644
index f06517b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_vsplit.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_vsplit.gif
deleted file mode 100644
index 6564d07..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_vsplit.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_nopic.jpg b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_nopic.jpg
deleted file mode 100644
index f98b233..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_nopic.jpg
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/newsuade_wiz.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/newsuade_wiz.gif
deleted file mode 100644
index ecd75f4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/newsuade_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/large/PD_Palette_Default.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/large/PD_Palette_Default.gif
deleted file mode 100644
index a320fcb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/large/PD_Palette_Default.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Default.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Default.gif
deleted file mode 100644
index 5e7fb33..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Default.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export.gif
deleted file mode 100644
index 095beb0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Disabled.gif
deleted file mode 100644
index 04800a6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Hover.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Hover.gif
deleted file mode 100644
index 095beb0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Hover.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import.gif
deleted file mode 100644
index 0af6903..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Disabled.gif
deleted file mode 100644
index 5c828d4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Hover.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Hover.gif
deleted file mode 100644
index 0af6903..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Hover.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_A.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_A.gif
deleted file mode 100644
index 4c57d0e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_A.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_FORM.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_FORM.gif
deleted file mode 100644
index cc27deb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_FORM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_HEAD.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_HEAD.gif
deleted file mode 100644
index 4bdc052..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_HEAD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_HR.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_HR.gif
deleted file mode 100644
index 44e283d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_HR.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_IMG.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_IMG.gif
deleted file mode 100644
index 776fc8f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_IMG.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_INPUT_BUTTON.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_INPUT_BUTTON.gif
deleted file mode 100644
index 9ead4e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_INPUT_BUTTON.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_INPUT_CHECKBOX.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_INPUT_CHECKBOX.gif
deleted file mode 100644
index 4a02dde..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_INPUT_CHECKBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_INPUT_HIDDEN.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_INPUT_HIDDEN.gif
deleted file mode 100644
index d14d09f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_INPUT_HIDDEN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_INPUT_IMAGE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_INPUT_IMAGE.gif
deleted file mode 100644
index b12850f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_INPUT_IMAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_INPUT_PASSWORD.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_INPUT_PASSWORD.gif
deleted file mode 100644
index 05d5fe5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_INPUT_PASSWORD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_INPUT_RADIO.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_INPUT_RADIO.gif
deleted file mode 100644
index f6aeac0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_INPUT_RADIO.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_INPUT_TEXT.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_INPUT_TEXT.gif
deleted file mode 100644
index 1c8fa1e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_INPUT_TEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_OBJECT.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_OBJECT.gif
deleted file mode 100644
index cba93bf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_OBJECT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_SELECT.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_SELECT.gif
deleted file mode 100644
index 3831d95..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_SELECT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_TABLE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_TABLE.gif
deleted file mode 100644
index 9873b09..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_TABLE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_TEXTAREA.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_TEXTAREA.gif
deleted file mode 100644
index 25f22d8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/large/HTML_TEXTAREA.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_A.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_A.gif
deleted file mode 100644
index 5fd9c94..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_A.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_BR.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_BR.gif
deleted file mode 100644
index b468685..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_BR.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_FORM.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_FORM.gif
deleted file mode 100644
index 3081f32..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_FORM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_HEAD.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_HEAD.gif
deleted file mode 100644
index 4bdc052..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_HEAD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_HR.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_HR.gif
deleted file mode 100644
index 19ab614..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_HR.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_IMG.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_IMG.gif
deleted file mode 100644
index 115cbc6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_IMG.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_INPUT_BUTTON.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_INPUT_BUTTON.gif
deleted file mode 100644
index 8e721c5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_INPUT_BUTTON.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_INPUT_CHECKBOX.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_INPUT_CHECKBOX.gif
deleted file mode 100644
index 00da14e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_INPUT_CHECKBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_INPUT_HIDDEN.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_INPUT_HIDDEN.gif
deleted file mode 100644
index f18865b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_INPUT_HIDDEN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_INPUT_IMAGE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_INPUT_IMAGE.gif
deleted file mode 100644
index 2a75963..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_INPUT_IMAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_INPUT_PASSWORD.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_INPUT_PASSWORD.gif
deleted file mode 100644
index 25c2e26..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_INPUT_PASSWORD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_INPUT_RADIO.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_INPUT_RADIO.gif
deleted file mode 100644
index 2598367..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_INPUT_RADIO.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_INPUT_TEXT.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_INPUT_TEXT.gif
deleted file mode 100644
index 7f506d9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_INPUT_TEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_OBJECT.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_OBJECT.gif
deleted file mode 100644
index 745f6d9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_OBJECT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_SELECT.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_SELECT.gif
deleted file mode 100644
index 247efe0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_SELECT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_TABLE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_TABLE.gif
deleted file mode 100644
index d11c996..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_TABLE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_TEXTAREA.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_TEXTAREA.gif
deleted file mode 100644
index a2fa616..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/HTML/small/HTML_TEXTAREA.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_DECLARATION.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_DECLARATION.gif
deleted file mode 100644
index 5403f72..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_DECLARATION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_DIRECTIVE.INCLUDE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_DIRECTIVE.INCLUDE.gif
deleted file mode 100644
index 5926670..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_DIRECTIVE.INCLUDE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_DIRECTIVE.PAGE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_DIRECTIVE.PAGE.gif
deleted file mode 100644
index e21e763..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_DIRECTIVE.PAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_DIRECTIVE.TAGLIB.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_DIRECTIVE.TAGLIB.gif
deleted file mode 100644
index 723a10d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_DIRECTIVE.TAGLIB.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_EXPRESSION.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_EXPRESSION.gif
deleted file mode 100644
index 53a23e1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_EXPRESSION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_FALLBACK.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_FALLBACK.gif
deleted file mode 100644
index 2507aac..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_FALLBACK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_FORWARD.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_FORWARD.gif
deleted file mode 100644
index 7747595..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_FORWARD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_GETPROPERTY.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_GETPROPERTY.gif
deleted file mode 100644
index 4d11f8d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_GETPROPERTY.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_INCLUDE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_INCLUDE.gif
deleted file mode 100644
index 88e62b4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_INCLUDE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_PARAM.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_PARAM.gif
deleted file mode 100644
index 79e07c2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_PARAM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_PARAMS.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_PARAMS.gif
deleted file mode 100644
index 9f517ae..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_PARAMS.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_PLUGIN.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_PLUGIN.gif
deleted file mode 100644
index 2ba7b4b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_PLUGIN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_ROOT.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_ROOT.gif
deleted file mode 100644
index 922b61d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_ROOT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_SCRIPTLET.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_SCRIPTLET.gif
deleted file mode 100644
index a1d2e61..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_SCRIPTLET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_SETPROPERTY.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_SETPROPERTY.gif
deleted file mode 100644
index 4d11f8d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_SETPROPERTY.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_TEXT.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_TEXT.gif
deleted file mode 100644
index 4cc147e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_TEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_USEBEAN.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_USEBEAN.gif
deleted file mode 100644
index 9d54e8b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/large/JSP_USEBEAN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_DECLARATION.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_DECLARATION.gif
deleted file mode 100644
index 35f48ef..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_DECLARATION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_DIRECTIVE.INCLUDE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_DIRECTIVE.INCLUDE.gif
deleted file mode 100644
index 1ef9c8f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_DIRECTIVE.INCLUDE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_DIRECTIVE.PAGE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_DIRECTIVE.PAGE.gif
deleted file mode 100644
index 37c1e7c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_DIRECTIVE.PAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_DIRECTIVE.TAGLIB.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_DIRECTIVE.TAGLIB.gif
deleted file mode 100644
index 33ef3d8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_DIRECTIVE.TAGLIB.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_EXPRESSION.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_EXPRESSION.gif
deleted file mode 100644
index 66fd649..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_EXPRESSION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_FALLBACK.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_FALLBACK.gif
deleted file mode 100644
index 4fb4150..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_FALLBACK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_FORWARD.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_FORWARD.gif
deleted file mode 100644
index 1d3bafb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_FORWARD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_GETPROPERTY.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_GETPROPERTY.gif
deleted file mode 100644
index af4450a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_GETPROPERTY.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_INCLUDE.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_INCLUDE.gif
deleted file mode 100644
index 2584c31..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_INCLUDE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_PARAM.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_PARAM.gif
deleted file mode 100644
index b3e0727..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_PARAM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_PARAMS.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_PARAMS.gif
deleted file mode 100644
index 4075922..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_PARAMS.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_PLUGIN.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_PLUGIN.gif
deleted file mode 100644
index 04bab8e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_PLUGIN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_ROOT.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_ROOT.gif
deleted file mode 100644
index f6d19d4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_ROOT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_SCRIPTLET.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_SCRIPTLET.gif
deleted file mode 100644
index 1753b96..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_SCRIPTLET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_SETPROPERTY.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_SETPROPERTY.gif
deleted file mode 100644
index af4450a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_SETPROPERTY.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_TEXT.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_TEXT.gif
deleted file mode 100644
index 7f506d9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_TEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_USEBEAN.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_USEBEAN.gif
deleted file mode 100644
index ba33db7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/JSP/small/JSP_USEBEAN.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/metadata/html.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/metadata/html.properties
deleted file mode 100644
index 7f19286..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/metadata/html.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
-###############################################################################
-A.display-label=Link
-A.description=This element allows the user to navigate the content of the document
-
-BR.display-label=Line Break
-BR.description=This element is used to enforce a line break
-
-INPUT.BUTTON.display-label=Button
-INPUT.BUTTON.description=An INPUT element with TYPE=SUBMIT represents an input option, typically a button, that instructs the user agent to submit the form
-
-INPUT.CHECKBOX.display-label=Checkbox
-INPUT.CHECKBOX.description=An INPUT element with TYPE=CHECKBOX represents a boolean choice. A set of such elements with the same name represents an n-of-many choice field
-
-INPUT.HIDDEN.display-label=Hidden Field
-INPUT.HIDDEN.description=An INPUT element with TYPE=HIDDEN represents a hidden field.The user does not interact with this field; instead, the VALUE attribute specifies the value of the field
-
-INPUT.IMAGE.display-label=Image Button
-INPUT.IMAGE.description=An INPUT element with TYPE=IMAGE specifies an image resource to display, and allows input of two form fields: the x and y coordinate of a pixel chosen from the image
-
-INPUT.PASSWORD.display-label=Password Field
-INPUT.PASSWORD.description=An INPUT element with TYPE=PASSWORD is a text field as above, except that the value is obscured as it is entered
-
-INPUT.RADIO.display-label=Radio Button
-INPUT.RADIO.description=An INPUT element with TYPE=RADIO represents a boolean choice. A set of such elements with the same name represents a 1-of-many choice field
-
-INPUT.TEXT.display-label=Text Field 
-INPUT.TEXT.description=The default vaule of the TYPE attribute is TEXT, indicating a single line text entry field
-
-FORM.display-label=Form
-FORM.description=The FORM element contains a sequence of input elements, along with document structuring elements
-
-HR.display-label=Horizontal Rule
-HR.description=The HR element is a divider between sections of text; typically a full width horizontal rule or equivalent graphic
-
-IMG.display-label=Image
-IMG.description=The IMG element refers to an image or icon via a hyperlink
-
-SELECT.display-label=Select
-SELECT.description=The SELECT element constrains the form field to an enumerated list of values
-
-TABLE.display-label=Table
-TABLE.description=HTML Tables are contained within a TABLE element. The TABLE element denotes the range of the table, and uses attribute to define properties of it
-
-TEXTAREA.display-label=Text Area
-TEXTAREA.description=The TEXTAREA element represents a multi-line text field
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/metadata/html.xml b/jsf/plugins/org.eclipse.jst.pagedesigner/metadata/html.xml
deleted file mode 100644
index 0266b15..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/metadata/html.xml
+++ /dev/null
@@ -1,223 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-	xmlns:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore"
-	id="HTML"
-	type="tagFile">
-	
-	<trait id="paletteInfos" >
-		<value xsi:type="pi:PaletteInfos">
-			<item id="BR"/>
-			<item id="INPUT.TEXT" tag="INPUT"/>
-			<item id="INPUT.BUTTON" tag="INPUT">
-				<display-label>%INPUT.BUTTON.display-label</display-label>
-				<description>%INPUT.BUTTON.description</description>
-				<small-icon>small/HTML_INPUT_BUTTON.gif</small-icon>
-				<large-icon>small/HTML_INPUT_BUTTON.gif</large-icon>
-				<tag-create>
-					<attribute id="type" value="submit"/>
-				</tag-create>
-			</item>
-			<item id="INPUT.CHECKBOX" tag="INPUT">
-				<display-label>%INPUT.CHECKBOX.display-label</display-label>
-				<description>%INPUT.CHECKBOX.description</description>
-				<small-icon>small/HTML_INPUT_CHECKBOX.gif</small-icon>
-				<large-icon>small/HTML_INPUT_CHECKBOX.gif</large-icon>
-				<tag-create>
-					<attribute id="type" value="checkbox"/>
-				</tag-create>				
-			</item>
-			<item id="FORM"/>		
-			<item id="INPUT.HIDDEN" tag="INPUT">
-				<display-label>%INPUT.HIDDEN.display-label</display-label>
-				<description>%INPUT.HIDDEN.description</description>
-				<small-icon>small/HTML_INPUT_HIDDEN.gif</small-icon>
-				<large-icon>small/HTML_INPUT_HIDDEN.gif</large-icon>
-				<tag-create>
-					<attribute id="type" value="hidden"/>
-				</tag-create>	
-			</item>
-			<item id="HR"/>
-			<item id="IMG"/>
-			<item id="INPUT.IMAGE" tag="INPUT">
-				<display-label>%INPUT.IMAGE.display-label</display-label>
-				<description>%INPUT.IMAGE.description</description>
-				<small-icon>small/HTML_INPUT_IMAGE.gif</small-icon>
-				<large-icon>small/HTML_INPUT_IMAGE.gif</large-icon>
-				<tag-create>
-					<attribute id="type" value="image"/>
-				</tag-create>					
-			</item>
-			<item id="A"/>			
-			<item id="INPUT.PASSWORD" tag="INPUT">
-				<display-label>%INPUT.PASSWORD.display-label</display-label>
-				<description>%INPUT.PASSWORD.description</description>
-				<small-icon>small/HTML_INPUT_PASSWORD.gif</small-icon>
-				<large-icon>small/HTML_INPUT_PASSWORD.gif</large-icon>
-				<tag-create>
-					<attribute id="type" value="password"/>
-				</tag-create>					
-			</item>
-			<item id="INPUT.RADIO" tag="INPUT">
-				<display-label>%INPUT.RADIO.display-label</display-label>
-				<description>%INPUT.RADIO.description</description>
-				<small-icon>small/HTML_INPUT_RADIO.gif</small-icon>
-				<large-icon>small/HTML_INPUT_RADIO.gif</large-icon>
-				<tag-create>
-					<attribute id="type" value="radio"/>
-				</tag-create>					
-			</item>			
-			<item id="SELECT"/>
-			<item id="TABLE"/>
-			<item id="TEXTAREA"/>
-		</value>
-	</trait>
-
-	<trait id="images-base-path">
-		<value>$nl$/icons/palette/HTML</value>
-	</trait>
-
-	<trait id="display-label">
-		<value>HTML 4.0</value>
-	</trait>
-	
-	<entity id="A">
-		<trait id="display-label">
-			<value>%A.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%A.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/HTML_A.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/HTML_A.gif</value>
-		</trait>
-	</entity>
-	<entity id="BR">
-		<trait id="display-label">
-			<value>%BR.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%BR.description</value>
-		</trait>		
-		<trait id="expert">
-			<value>true</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/HTML_BR.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/HTML_BR.gif</value>
-		</trait>
-	</entity>
-	<entity id="INPUT">
-		<trait id="display-label">
-			<value>%INPUT.TEXT.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value>%INPUT.TEXT.description</value>
-		</trait>
-		<trait id="small-icon">
-			<value>small/HTML_INPUT_TEXT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/HTML_INPUT_TEXT.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>	
-	</entity>
-	<entity id="FORM">
-		<trait id="display-label">
-			<value>%FORM.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value>%FORM.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/HTML_FORM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/HTML_FORM.gif</value>
-		</trait>
-	</entity>
-	<entity id="HR">
-		<trait id="display-label">
-			<value>%HR.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value>%HR.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/HTML_HR.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/HTML_HR.gif</value>
-		</trait>
-	</entity>	
-	<entity id="IMG">
-		<trait id="display-label">
-			<value>%IMG.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value>%IMG.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/HTML_IMG.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/HTML_IMG.gif</value>
-		</trait>
-	</entity>	
-	<entity id="SELECT">
-		<trait id="display-label">
-			<value>%SELECT.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value>%SELECT.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/HTML_SELECT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/HTML_SELECT.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>			
-	</entity>		
-	<entity id="TABLE">
-		<trait id="display-label">
-			<value>%TABLE.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value>%TABLE.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/HTML_TABLE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/HTML_TABLE.gif</value>
-		</trait>
-	</entity>
-	<entity id="TEXTAREA">
-		<trait id="display-label">
-			<value>%TEXTAREA.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value>%TEXTAREA.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/HTML_TEXTAREA.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/HTML_TEXTAREA.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value>true</value>
-		</trait>
-	</entity>		
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/metadata/jsp11.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/metadata/jsp11.properties
deleted file mode 100644
index 747235a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/metadata/jsp11.properties
+++ /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
-###############################################################################
-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.pagedesigner/metadata/jsp11.xml b/jsf/plugins/org.eclipse.jst.pagedesigner/metadata/jsp11.xml
deleted file mode 100644
index df0690e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/metadata/jsp11.xml
+++ /dev/null
@@ -1,282 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-	xmlns:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore"
-	id="jsp11"
-	type="tagFile">
-	
-	<trait id="paletteInfos">
-		<value xsi:type="pi:PaletteInfos">
-			<item id="jsp:directive.include"/>
-			<item id="jsp:directive.taglib"/>
-			<item id="jsp:expression"/>
-			<item id="jsp:declaration"/>
-			<item id="jsp:useBean"/>
-			<item id="jsp:getProperty"/>
-			<item id="jsp:setProperty"/>
-			<item id="jsp:include"/>
-			<item id="jsp:text"/>
-			<item id="jsp:root"/>
-			<item id="jsp:forward"/>
-			<item id="jsp:param"/>
-			<item id="jsp:params"/>
-			<item id="jsp:plugin"/>
-			<item id="jsp:fallback"/>
-			<item id="jsp:scriptlet"/>
-			<item id="jsp:directive.page"/>			
-		</value>
-	</trait>
-
-	<trait id="images-base-path">
-		<value>icons/palette/JSP</value>
-	</trait>
-
-	<trait id="display-label">
-		<value>JSP</value>
-	</trait>
-	
-	<entity id="jsp:directive.include">
-		<trait id="display-label">
-			<value>%directive.include.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%directive.include.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_DIRECTIVE.INCLUDE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_DIRECTIVE.INCLUDE.gif</value>
-		</trait>
-	</entity>
-	<entity id="jsp:directive.page">
-		<trait id="display-label">
-			<value>%directive.page.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%directive.page.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_DIRECTIVE.PAGE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_DIRECTIVE.PAGE.gif</value>
-		</trait>
-	</entity>	
-
-	<entity id="jsp:directive.taglib">
-		<trait id="display-label">
-			<value>%directive.taglib.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%directive.taglib.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_DIRECTIVE.TAGLIB.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_DIRECTIVE.TAGLIB.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:expression">
-		<trait id="display-label">
-			<value>%expression.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%expression.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_EXPRESSION.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_EXPRESSION.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:declaration">
-		<trait id="display-label">
-			<value>%declaration.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%declaration.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_DECLARATION.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_DECLARATION.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:useBean">
-		<trait id="display-label">
-			<value>%useBean.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%useBean.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_USEBEAN.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_USEBEAN.gif</value>
-		</trait>
-	</entity>	
-		
-	<entity id="jsp:getProperty">
-		<trait id="display-label">
-			<value>%getProperty.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%getProperty.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_GETPROPERTY.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_GETPROPERTY.gif</value>
-		</trait>
-	</entity>	
-
-	<entity id="jsp:setProperty">
-		<trait id="display-label">
-			<value>%setProperty.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%setProperty.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_SETPROPERTY.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_SETPROPERTY.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:include">
-		<trait id="display-label">
-			<value>%include.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%include.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_INCLUDE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_INCLUDE.gif</value>
-		</trait>
-	</entity>	
-	
-	<entity id="jsp:text">
-		<trait id="display-label">
-			<value>%text.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%text.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_TEXT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_TEXT.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:root">
-		<trait id="display-label">
-			<value>%root.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%root.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_ROOT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_ROOT.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:forward">
-		<trait id="display-label">
-			<value>%forward.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%forward.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_FORWARD.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_FORWARD.gif</value>
-		</trait>
-	</entity>	
-	
-	<entity id="jsp:param">
-		<trait id="display-label">
-			<value>%param.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%param.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_PARAM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_PARAM.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:params">
-		<trait id="display-label">
-			<value>%params.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%params.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_PARAMS.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_PARAMS.gif</value>
-		</trait>
-	</entity>		
-	<entity id="jsp:plugin">
-		<trait id="display-label">
-			<value>%plugin.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%plugin.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_PLUGIN.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_PLUGIN.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:fallback">
-		<trait id="display-label">
-			<value>%fallback.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%fallback.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_FALLBACK.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_FALLBACK.gif</value>
-		</trait>
-	</entity>
-	<entity id="jsp:scriptlet">
-		<trait id="display-label">
-			<value>%scriptlet.display-label</value>
-		</trait>
-		<trait id="description">
-			<value>%scriptlet.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value>small/JSP_SCRIPTLET.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value>large/JSP_SCRIPTLET.gif</value>
-		</trait>
-	</entity>	
-</md:metadatamodel>
diff --git a/jsf/plugins/org.eclipse.jst.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/PaletteInfos.ecore b/jsf/plugins/org.eclipse.jst.pagedesigner/model/PaletteInfos.ecore
deleted file mode 100644
index ab8633b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/model/PaletteInfos.ecore
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="paletteinfos"
-    nsURI="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore" nsPrefix="pi">
-  <eClassifiers xsi:type="ecore:EClass" name="PaletteInfos">
-    <eOperations name="findPaletteInfoById" eType="#//PaletteInfo">
-      <eParameters name="id" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="infos" upperBound="-1"
-        eType="#//PaletteInfo" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="item"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PaletteInfo">
-    <eOperations name="isExpert" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-    <eOperations name="isHidden" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="tag" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="displayLabel" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-label"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="description" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="expert" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hidden" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="smallIcon" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="small-icon"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="largeIcon" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="large-icon"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tagCreation" eType="#//TagCreationInfo">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="tag-create"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TagCreationInfo">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributes" upperBound="-1"
-        eType="#//TagCreationAttribute" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="template" eType="ecore:EDataType ../../../plugin/org.eclipse.emf.ecore/model/XMLType.ecore#//AnySimpleType"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TagCreationTemplate">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="template" eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EObject"
-        containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TagCreationAttribute">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/model/PaletteInfos.genmodel b/jsf/plugins/org.eclipse.jst.pagedesigner/model/PaletteInfos.genmodel
deleted file mode 100644
index 499e2a8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/model/PaletteInfos.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="PaletteInfos" 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"
-    usedGenPackages="platform:/plugin/org.eclipse.emf.ecore/model/XMLType.genmodel#//type">
-  <foreignModel>PaletteInfos.ecore</foreignModel>
-  <genPackages prefix="PaletteInfos" basePackage="org.eclipse.jst.pagedesigner.editors.palette"
-      disposableProviderFactory="true" classPackageSuffix="internal.impl" utilityPackageSuffix="internal.util"
-      providerPackageSuffix="internal.provider" presentationPackageSuffix="internal.presentation"
-      testsPackageSuffix="internal.tests" generateExampleClass="false" multipleEditorPages="false"
-      generateModelWizard="false" ecorePackage="PaletteInfos.ecore#/">
-    <genClasses ecoreClass="PaletteInfos.ecore#//PaletteInfos">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference PaletteInfos.ecore#//PaletteInfos/infos"/>
-      <genOperations ecoreOperation="PaletteInfos.ecore#//PaletteInfos/findPaletteInfoById">
-        <genParameters ecoreParameter="PaletteInfos.ecore#//PaletteInfos/findPaletteInfoById/id"/>
-      </genOperations>
-    </genClasses>
-    <genClasses ecoreClass="PaletteInfos.ecore#//PaletteInfo">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute PaletteInfos.ecore#//PaletteInfo/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute PaletteInfos.ecore#//PaletteInfo/tag"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute PaletteInfos.ecore#//PaletteInfo/displayLabel"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute PaletteInfos.ecore#//PaletteInfo/description"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute PaletteInfos.ecore#//PaletteInfo/expert"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute PaletteInfos.ecore#//PaletteInfo/hidden"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute PaletteInfos.ecore#//PaletteInfo/smallIcon"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute PaletteInfos.ecore#//PaletteInfo/largeIcon"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference PaletteInfos.ecore#//PaletteInfo/tagCreation"/>
-      <genOperations ecoreOperation="PaletteInfos.ecore#//PaletteInfo/isExpert"/>
-      <genOperations ecoreOperation="PaletteInfos.ecore#//PaletteInfo/isHidden"/>
-    </genClasses>
-    <genClasses ecoreClass="PaletteInfos.ecore#//TagCreationInfo">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference PaletteInfos.ecore#//TagCreationInfo/attributes"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute PaletteInfos.ecore#//TagCreationInfo/template"/>
-    </genClasses>
-    <genClasses ecoreClass="PaletteInfos.ecore#//TagCreationTemplate">
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference PaletteInfos.ecore#//TagCreationTemplate/template"/>
-    </genClasses>
-    <genClasses ecoreClass="PaletteInfos.ecore#//TagCreationAttribute">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute PaletteInfos.ecore#//TagCreationAttribute/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute PaletteInfos.ecore#//TagCreationAttribute/value"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.properties
deleted file mode 100644
index 8329c1c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/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
-###############################################################################
-####################################################
-# Plugin XML information.
-####################################################
-pluginName=JavaServer Faces Tools - Web Page Editor
-providerName=Eclipse.org
-
-editor.binding.context.name=Web Page Editor Editor Binding Context
-editor.binding.context.description=Binding Context Used When Editing Using Web Page Editor
-# ====================================================================
-
-
-editor.name.0 = Web Page Editor
-category.name.0 = Page Layout
-command.name.0 = vertical Layout
-command.name.1 = horizontal Layout
-command.name.2 = graphical designer
-command.name.3 = source code
\ 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 40e2e83..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.xml
+++ /dev/null
@@ -1,142 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-	<extension-point id="pageDesignerExtension" name="Web Page Editor Extension" schema="schema/pageDesignerExtension.exsd" />
-	<extension-point id="propertySections" name="Property Section" schema="schema/propertySections.exsd" />
-	<extension-point id="propertyContributor" name="property contributor" schema="schema/propertyContributor.exsd" />
-	<extension-point id="popupMenuContributor" name="popupMenu Contributor" schema="schema/popupMenuContributor.exsd"/>
-	<extension-point id="cmRegistry" name="Content Model Meta Data" schema="schema/cmRegistry.exsd"/>
-
-	<extension point="org.eclipse.ui.editors">
-		<editor class="org.eclipse.jst.pagedesigner.editors.HTMLEditor"
-			contributorClass="org.eclipse.jst.pagedesigner.editors.actions.PageDesignerActionBarContributor2"
-			default="false"
-			extensions="jsp,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.wst.common.ui.properties.propertyTabs">
-		<propertyTabs
-			contributorId="org.eclipse.jst.pagedesigner.pageDesigner.tabPropertyContributor">
-			<propertyTab label="Quick Edit" category="Quick Edit" id="org.eclipse.jst.pagedesigner.tabQuickEdit" />
-			<propertyTab label="Attributes" category="Attributes" id="org.eclipse.jst.pagedesigner.tabAttributes" />
-		</propertyTabs>
-	</extension>
-
-	<extension
-		point="org.eclipse.wst.common.ui.properties.propertyContributor">
-		<propertyContributor
-			sectionDescriptorProvider="org.eclipse.jst.pagedesigner.properties.internal.DesignerTabPropertySectionDescriptorProvider"
-			contributorId="org.eclipse.jst.pagedesigner.pageDesigner.tabPropertyContributor">
-			<propertyCategory category="Quick Edit" />
-			<propertyCategory category="Attributes" />
-		</propertyContributor>
-	</extension>
-
-	<extension
-		point="org.eclipse.jst.pagedesigner.propertySections">
-		<propertySections>
-			<propertySection afterSection="top"
-				class="org.eclipse.jst.pagedesigner.properties.AllPropertySection"
-				tab="org.eclipse.jst.pagedesigner.tabAttributes"
-				id="section.allproperty" />
-		</propertySections>
-	</extension>
-	
-	<extension point="org.eclipse.jst.pagedesigner.pageDesignerExtension">
-		<linkCreator class="org.eclipse.jst.pagedesigner.actions.link.HtmlLinkCreator" linkIdentifier="Html Link"/>
-	</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 
-       uri = "http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore" 
-       class = "org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage"
-       genModel = "model/paletteInfos.genmodel" /> 
-    <package
-          class="org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage"
-          genModel="model/DTInfo.genmodel"
-          uri="http://org.eclipse.jsf.pagedesigner/dtinfo.ecore">
-    </package>
-   </extension>
- <extension
-       point="org.eclipse.jst.jsf.common.standardMetaDataFiles">
-    <standardMetaDataFile
-          location="$nl$/metadata/html.xml"
-          uri="HTML">
-    </standardMetaDataFile>
- </extension>
- <extension
-       point="org.eclipse.jst.jsf.common.domainSourceModelTypeTranslators">
-    <domainSourceModelTypeTranslator
-          domainSourceModelTypeId="TaglibContentModelHandler"
-          translatorClass="org.eclipse.jst.pagedesigner.editors.palette.internal.metadata.HTMLContentModelMetaDataTranslator">
-    </domainSourceModelTypeTranslator>
- </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>
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/cmRegistry.exsd b/jsf/plugins/org.eclipse.jst.pagedesigner/schema/cmRegistry.exsd
deleted file mode 100644
index b6662dc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/cmRegistry.exsd
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.pagedesigner">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.pagedesigner" id="cmRegistry" name="Content Model Meta Data"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;&lt;b&gt;This extension point is provisional and subject to change&lt;/b&gt;&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="registry" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="registry">
-      <annotation>
-         <documentation>
-            User must provide either &quot;configFile&quot; attribute or &quot;class&quot; attribute.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="configFile" type="string">
-            <annotation>
-               <documentation>
-                  A path relative to the root of the declaring plugin. Point to a config file that contains the information for the specified tag lib of the uri.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="resource"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  A class that implements ICMRegistry. The implemented ICMRegistry must return the same uri as the uri attribute in getSupportedURI() method.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="uri" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         2.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright 2006 Sybase and others
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/pageDesignerExtension.exsd b/jsf/plugins/org.eclipse.jst.pagedesigner/schema/pageDesignerExtension.exsd
deleted file mode 100644
index 9b45509..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/pageDesignerExtension.exsd
+++ /dev/null
@@ -1,147 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.pagedesigner">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.pagedesigner" id="pageDesignerExtension" name="Web Page Editor Extension"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;&lt;b&gt;This extension point is provisional and subject to change&lt;/b&gt;&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="localDropHandler" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="attributeCellEditorFactory" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="tagConverterFactory" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="elementEditFactory" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="linkCreator" minOccurs="0" maxOccurs="unbounded"/>
-         </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">
-      <complexType>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </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>
-
-   <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 faf3ce6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/propertyContributor.exsd
+++ /dev/null
@@ -1,76 +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="propertyContributor" name="property 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="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">
-      <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/propertySections.exsd b/jsf/plugins/org.eclipse.jst.pagedesigner/schema/propertySections.exsd
deleted file mode 100644
index 64f095d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/propertySections.exsd
+++ /dev/null
@@ -1,132 +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="propertySections" name="Property Sections" since="2.0"/>
-      </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="propertySections"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The identifier of the extension point, i.e. &lt;tt&gt;org.eclipse.wst.ui.properties.propertySections&lt;/tt&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="propertySections">
-      <complexType>
-         <sequence>
-            <element ref="propertySection" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-      </complexType>
-   </element>
-
-   <element name="propertySection">
-      <complexType>
-         <sequence>
-            <element ref="tagFilter" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="tab" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The tab in which this section appears.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique id for the section.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The class that implements the section, i.e. implements &lt;tt&gt;org.eclipse.wst.ui.properties.IPropertySection&lt;/tt&gt;.
-Or, the class could extends &lt;code&gt;AttributeGroup&lt;/code&gt;, in that case, system will automatically create a &lt;code&gt;AttributeGroupSection&lt;/code&gt; for it.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="afterSection" type="string">
-            <annotation>
-               <documentation>
-                  When there is more than one section in a tab, sections are sorted by the afterSection attribute.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="filter" type="string">
-            <annotation>
-               <documentation>
-                  The class that implements a ISectionFilter
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="tagFilter">
-      <complexType>
-         <attribute name="uri" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="tagName" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="caseSensitive" type="boolean" use="default" value="true">
-            <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/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 556b25d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IHTMLConstants.java
+++ /dev/null
@@ -1,505 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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 {
-	public static final String TAG_A = "a"; // anchor
-
-	public static final String TAG_ABBR = "abbr"; // abbreviated form (e.g.,
-
-	// WWW, HTTP, etc.)
-
-	public static final String TAG_ACRONYM = "acronym";
-
-	public static final String TAG_ADDRESS = "address"; // information on author
-
-	public static final String TAG_APPLET = "applet"; // Java applet
-
-	public static final String TAG_AREA = "area"; // client-side image map
-
-	// area
-
-	public static final String TAG_B = "b"; // bold text style
-
-	public static final String TAG_BASE = "base"; // document base URI
-
-	public static final String TAG_BASEFONT = "basefont"; // base font size
-
-	public static final String TAG_BDO = "bdo"; // I18N BiDi over-ride
-
-	public static final String TAG_BIG = "big"; // large text style
-
-	public static final String TAG_BLOCKQUOTE = "blockquote"; // long
-
-	// quotation
-
-	public static final String TAG_BODY = "body"; // document body
-
-	public static final String TAG_BR = "br"; // forced line break
-
-	public static final String TAG_BUTTON = "button"; // push button
-
-	public static final String TAG_CAPTION = "caption"; // table caption
-
-	public static final String TAG_CENTER = "center"; // shorthand for DIV
-
-	// align=center
-
-	public static final String TAG_CITE = "cite"; // citation
-
-	public static final String TAG_CODE = "code"; // computer code fragment
-
-	public static final String TAG_COL = "col"; // table column
-
-	public static final String TAG_COLGROUP = "colgroup"; // table column
-
-	// group
-
-	public static final String TAG_DD = "dd"; // definition description
-
-	public static final String TAG_DEL = "del"; // deleted text
-
-	public static final String TAG_DFN = "dfn"; // instance definition
-
-	public static final String TAG_DIR = "dir"; // directory list
-
-	public static final String TAG_DIV = "div"; // generic language/style
-
-	// container
-
-	public static final String TAG_DL = "dl"; // definition list
-
-	public static final String TAG_DT = "dt"; // definition term
-
-	public static final String TAG_EM = "em"; // emphasis
-
-	public static final String TAG_FIELDSET = "fieldset"; // form control
-
-	// group
-
-	public static final String TAG_FONT = "font"; // local change to font
-
-	public static final String TAG_FORM = "form"; // interactive form
-
-	public static final String TAG_FRAME = "frame"; // subwindow
-
-	public static final String TAG_FRAMESET = "frameset"; // window
-
-	// subdivision
-
-	public static final String TAG_H1 = "h1"; // heading
-
-	public static final String TAG_H2 = "h2"; // heading
-
-	public static final String TAG_H3 = "h3"; // heading
-
-	public static final String TAG_H4 = "h4"; // heading
-
-	public static final String TAG_H5 = "h5"; // heading
-
-	public static final String TAG_H6 = "h6"; // heading
-
-	public static final String TAG_HEAD = "head"; // document head
-
-	public static final String TAG_HR = "hr"; // horizontal rule
-
-	public static final String TAG_HTML = "html"; // document root element
-
-	public static final String TAG_I = "i"; // italic text style
-
-	public static final String TAG_IFRAME = "iframe"; // inline subwindow
-
-	public static final String TAG_IMG = "img"; // Embedded image
-
-	public static final String TAG_INPUT = "input"; // form control
-
-	public static final String TAG_INS = "ins"; // inserted text
-
-	public static final String TAG_ISINDEX = "isindex"; // single line prompt
-
-	public static final String TAG_KBD = "kbd"; // text to be entered by the
-
-	// user
-
-	public static final String TAG_LABEL = "label"; // form field label text
-
-	public static final String TAG_LEGEND = "legend"; // fieldset legend
-
-	public static final String TAG_LI = "li"; // list item
-
-	public static final String TAG_LINK = "link"; // a media-independent link
-
-	public static final String TAG_MAP = "map"; // client-side image map
-
-	public static final String TAG_MENU = "menu"; // menu list
-
-	public static final String TAG_META = "meta"; // generic metainformation
-
-	public static final String TAG_NOEMBED = "noembed";
-
-	public static final String TAG_NOFRAMES = "noframes"; // alternate content
-
-	// container for non
-	// frame-based
-	// rendering
-
-	public static final String TAG_NOSCRIPT = "noscript"; // alternate content
-
-	// container for non
-	// script-based
-	// rendering
-
-	public static final String TAG_OBJECT = "object"; // generic embedded
-
-	// object
-
-	public static final String TAG_OL = "ol"; // ordered list
-
-	public static final String TAG_OPTGROUP = "optgroup"; // option group
-
-	public static final String TAG_OPTION = "option"; // selectable choice
-
-	public static final String TAG_P = "p"; // paragraph
-
-	public static final String TAG_PARAM = "param"; // named property value
-
-	public static final String TAG_PRE = "pre"; // preformatted text
-
-	public static final String TAG_Q = "q"; // short inline quotation
-
-	public static final String TAG_S = "s"; // strike-through text style
-
-	public static final String TAG_SAMP = "samp"; // sample program output,
-
-	// scripts, etc.
-
-	public static final String TAG_SCRIPT = "script"; // script statements
-
-	public static final String TAG_SELECT = "select"; // option selector
-
-	public static final String TAG_SMALL = "small"; // small text style
-
-	public static final String TAG_SPAN = "span"; // generic language/style
-
-	// container
-
-	public static final String TAG_STRIKE = "strike"; // strike-through text
-
-	public static final String TAG_STRONG = "strong"; // strong emphasis
-
-	public static final String TAG_STYLE = "style"; // style info
-
-	public static final String TAG_SUB = "sub"; // subscript
-
-	public static final String TAG_SUP = "sup"; // superscript
-
-	public static final String TAG_TABLE = "table";
-
-	public static final String TAG_TBODY = "tbody"; // table body
-
-	public static final String TAG_TD = "td"; // table data cell
-
-	public static final String TAG_TEXTAREA = "textarea"; // multi-line text
-
-	// field
-
-	public static final String TAG_TFOOT = "tfoot"; // table footer
-
-	public static final String TAG_TH = "th"; // table header cell
-
-	public static final String TAG_THEAD = "thead"; // table header
-
-	public static final String TAG_TITLE = "title"; // document title
-
-	public static final String TAG_TR = "tr"; // table row
-
-	public static final String TAG_TT = "tt"; // teletype or monospaced text
-
-	// style
-
-	public static final String TAG_U = "u"; // underlined text style
-
-	public static final String TAG_UL = "ul"; // unordered list
-
-	public static final String TAG_VAR = "var"; // instance of a variable or
-
-	/**
-	 * 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
-
-	public static final String ATTR_ABBR = "abbr";
-
-	public static final String ATTR_ACCEPTCHARSET = "accept-charset";
-
-	public static final String ATTR_ACCEPT = "accept";
-
-	public static final String ATTR_ACCESSKEY = "accesskey";
-
-	public static final String ATTR_ACTION = "action";
-
-	public static final String ATTR_ALIGN = "align";
-
-	public static final String ATTR_ALINK = "alink";
-
-	public static final String ATTR_ALT = "alt";
-
-	public static final String ATTR_ARCHIVE = "archive";
-
-	public static final String ATTR_AXIS = "axis";
-
-	public static final String ATTR_BACKGROUND = "background";
-
-	public static final String ATTR_BGCOLOR = "bgcolor";
-
-	public static final String ATTR_BORDER = "border";
-
-	public static final String ATTR_CELLPADDING = "cellpadding";
-
-	public static final String ATTR_CELLSPACING = "cellspacing";
-
-	public static final String ATTR_CHAR = "char";
-
-	public static final String ATTR_CHAROFF = "charoff";
-
-	public static final String ATTR_CHARSET = "charset";
-
-	public static final String ATTR_CHECKED = "checked";
-
-	public static final String ATTR_CITE = "cite";
-
-	public static final String ATTR_CLASS = "class";
-
-	public static final String ATTR_CLASSID = "classid";
-
-	public static final String ATTR_CLEAR = "clear";
-
-	public static final String ATTR_CODE = "code";
-
-	public static final String ATTR_CODEBASE = "codebase";
-
-	public static final String ATTR_CODETYPE = "codetype";
-
-	public static final String ATTR_COLOR = "color";
-
-	public static final String ATTR_COLS = "cols";
-
-	public static final String ATTR_COLSPAN = "colspan";
-
-	public static final String ATTR_COMPACT = "compact";
-
-	public static final String ATTR_CONTENT = "content";
-
-	public static final String ATTR_COORDS = "coords";
-
-	public static final String ATTR_DATA = "data";
-
-	public static final String ATTR_DATETIME = "datetime";
-
-	public static final String ATTR_DECLARE = "declare";
-
-	public static final String ATTR_DEFER = "defer";
-
-	public static final String ATTR_DIR = "dir";
-
-	public static final String ATTR_DISABLED = "disabled";
-
-	public static final String ATTR_ENCTYPE = "enctype";
-
-	public static final String ATTR_FACE = "face";
-
-	public static final String ATTR_FOR = "for";
-
-	public static final String ATTR_FRAME = "frame";
-
-	public static final String ATTR_FRAMEBORDER = "frameborder";
-
-	public static final String ATTR_HEADERS = "headers";
-
-	public static final String ATTR_HEIGHT = "height";
-
-	public static final String ATTR_HREF = "href";
-
-	public static final String ATTR_HREFLANG = "hreflang";
-
-	public static final String ATTR_HSPACE = "hspace";
-
-	public static final String ATTR_HTTPEQUIV = "http-equiv";
-
-	public static final String ATTR_ID = "id";
-
-	public static final String ATTR_ISMAP = "ismap";
-
-	public static final String ATTR_LABEL = "label";
-
-	public static final String ATTR_LANG = "lang";
-
-	public static final String ATTR_LANGUAGE = "language";
-
-	public static final String ATTR_LINK = "link";
-
-	public static final String ATTR_LONGDESC = "longdesc";
-
-	public static final String ATTR_MARGINHEIGHT = "marginheight";
-
-	public static final String ATTR_MARGINWIDTH = "marginwidth";
-
-	public static final String ATTR_MAXLENGTH = "maxlength";
-
-	public static final String ATTR_MEDIA = "media";
-
-	public static final String ATTR_METHOD = "method";
-
-	public static final String ATTR_MULTIPLE = "multiple";
-
-	public static final String ATTR_NAME = "name";
-
-	public static final String ATTR_NOHREF = "nohref";
-
-	public static final String ATTR_NORESIZE = "noresize";
-
-	public static final String ATTR_NOSHADE = "noshade";
-
-	public static final String ATTR_NOWRAP = "nowrap";
-
-	public static final String ATTR_OBJECT = "object";
-
-	public static final String ATTR_ONBLUR = "onblur";
-
-	public static final String ATTR_ONCHANGE = "onchange";
-
-	public static final String ATTR_ONCLICK = "onclick";
-
-	public static final String ATTR_ONDBLCLICK = "ondblclick";
-
-	public static final String ATTR_ONFOCUS = "onfocus";
-
-	public static final String ATTR_ONKEYDOWN = "onkeydown";
-
-	public static final String ATTR_ONKEYPRESS = "onkeypress";
-
-	public static final String ATTR_ONKEYUP = "onkeyup";
-
-	public static final String ATTR_ONLOAD = "onload";
-
-	public static final String ATTR_ONMOUSEDOWN = "onmousedown";
-
-	public static final String ATTR_ONMOUSEMOVE = "onmousemove";
-
-	public static final String ATTR_ONMOUSEOUT = "onmouseout";
-
-	public static final String ATTR_ONMOUSEOVER = "onmouseover";
-
-	public static final String ATTR_ONMOUSEUP = "onmouseup";
-
-	public static final String ATTR_ONRESET = "onreset";
-
-	public static final String ATTR_ONSELECT = "onselect";
-
-	public static final String ATTR_ONSUBMIT = "onsubmit";
-
-	public static final String ATTR_ONUNLOAD = "onunload";
-
-	public static final String ATTR_PROFILE = "profile";
-
-	public static final String ATTR_PROMPT = "prompt";
-
-	public static final String ATTR_READONLY = "readonly";
-
-	public static final String ATTR_REL = "rel";
-
-	public static final String ATTR_REV = "rev";
-
-	public static final String ATTR_ROWS = "rows";
-
-	public static final String ATTR_ROWSPAN = "rowspan";
-
-	public static final String ATTR_RULES = "rules";
-
-	public static final String ATTR_SCHEME = "scheme";
-
-	public static final String ATTR_SCOPE = "scope";
-
-	public static final String ATTR_SCROLLING = "scrolling";
-
-	public static final String ATTR_SELECTED = "selected";
-
-	public static final String ATTR_SHAPE = "shape";
-
-	public static final String ATTR_SIZE = "size";
-
-	public static final String ATTR_SPAN = "span";
-
-	public static final String ATTR_SRC = "src";
-
-	public static final String ATTR_STANDBY = "standby";
-
-	public static final String ATTR_START = "start";
-
-	public static final String ATTR_STYLE = "style";
-
-	public static final String ATTR_SUMMARY = "summary";
-
-	public static final String ATTR_TABINDEX = "tabindex";
-
-	public static final String ATTR_TARGET = "target";
-
-	public static final String ATTR_TEXT = "text";
-
-	public static final String ATTR_TITLE = "title";
-
-	public static final String ATTR_TYPE = "type";
-
-	public static final String ATTR_USEMAP = "usemap";
-
-	public static final String ATTR_VALIGN = "valign";
-
-	public static final String ATTR_VALUE = "value";
-
-	public static final String ATTR_VALUETYPE = "valuetype";
-
-	public static final String ATTR_VERSION = "version";
-
-	public static final String ATTR_VLINK = "vlink";
-
-	public static final String ATTR_VSPACE = "vspace";
-
-	public static final String ATTR_WIDTH = "width";
-
-	public static final String TYPE_SUBMIT = "submit";
-
-	public static final String TYPE_CHECKBOX = "checkbox";
-
-	public static final String TYPE_RADIO = "radio";
-
-	public static final String TYPE_IMAGE = "image";
-
-	public static final String TYPE_PASSWORD = "password";
-
-	public static final String TYPE_TEXT = "text";
-
-	public static final String TYPE_HIDDEN = "hidden";
-
-	public static final String SUBMIT_LABEL = "Submit Query";
-
-	public static final String RESET_LABEL = "Reset";
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IJMTConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IJMTConstants.java
deleted file mode 100644
index 8baff30..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IJMTConstants.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;
-
-/**
- * JMT constants that would be used through the JMT core plugin.
- * 
- * @author mengbo
- */
-public interface IJMTConstants {
-	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.
-	public static final String ROOT_RESOURCEBUNDLE = "org.eclipse.jst.pagedesigner.JMTResources"; //$NON-NLS-1$
-
-	public static final String DEFAULT_PROPERTIES = "default.properties"; //$NON-NLS-1$
-
-	public static final String USERAGENT = "html4.css"; //$NON-NLS-1$
-
-	public static final String EDITORID_HTML = "org.eclipse.jst.pagedesigner.PageDesignerEditor"; //$NON-NLS-1$
-
-	public static final String PREF_PALETTE_SHOW_ALL = "pref.palette.showall"; //$NON-NLS-1$
-
-	public static final String EXTENSION_POINT_PAGEDESIGNER = "pageDesignerExtension"; //$NON-NLS-1$
-
-	public static final String EXTENSION_POINT_CMREGISTRY = "cmRegistry"; //$NON-NLS-1$
-
-	public static final String EXTENSION_POINT_PALETTEITEMCONFIG = "PaletteItemConfigContributions"; //$NON-NLS-1$
-
-	public static final String ATTRIBUTE_PATH_PALETTEITEMCONFIG = "path"; //$NON-NLS-1$
-
-	public static final String ATTRIBUTE_INDEX_PALETTEITEMCONFIG = "index"; //$NON-NLS-1$
-
-	public static final String LOCAL_DROP_HANDLER = "localDropHandler"; //$NON-NLS-1$
-
-	public static final String TAG_CONVERTER_FACTORY = "tagConverterFactory"; //$NON-NLS-1$
-
-	public static final String ATTRIBUTE_CELLEDITOR_FACTORY = "attributeCellEditorFactory"; //$NON-NLS-1$
-
-	public static final String ELEMENT_EDIT_FACTORY = "elementEditFactory"; //$NON-NLS-1$
-
-	public static final String LINK_CREATOR = "linkCreator"; //$NON-NLS-1$
-
-    public static final String TAG_CREATOR_FACTORY_EXT_NAME = "tagCreationFactories"; // $NON-NLS-1$
-
-    public static final Object TAG_CREATOR_FACTORY_ELEMENT_NAME = "tagCreatorFactory"; // $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 fdf992d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/JMTResources.properties
+++ /dev/null
@@ -1,241 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-####################################################
-# Resource message for Logging
-####################################################
-Log.Error.PageDesignerResources.Open=Error occurred getting the source bundle.
-Log.Error.MessageFormater.Format0=Error in message format.
-Log.Error.ExtensionReader.ReadLinkExtension=can't create linkCreator instance
-Log.Error.PreviewResources.ResouceNotFound=resource {0} not found
-
-Error.StringBufferWriter.Write.0=Error in string buffer writing.
-Error.RangeModeCommand.SetSelection=Selection error
-Error.SourceViewerCommand.Execution=Error in command execution
-Error.PDPlugin.Installation.0=Error starting plug-in.
-Error.PDPlugin.Installation.1=Problems starting plug-in Web Application Development.
-Error.PDPlugin.Installation.6=Problems starting plug-in Web Application Development.
-Error.DesignerPropertyTool.NatureQuerying=Error in project Java nature querying.
-Error.PDPlugin.Installation.10=log.PDPlugin.image.error
-Error.PDPlugin.Installation.13=log.PDPlugin.image.error
-Error.PDPlugin.Installation.15=error in installtion query.
-Error.ProjectResolver.GetlocationByURI.0=Error in taglib locating.
-Error.ProjectFileDialogContentProvider.0=Core error, you may need to restart the application.
-Error.EditValidateUtil.Position = Error in position validation.
-Error.EditValidateUtil.Text = Error occurred in text validation.
-Error.EditValidateUtil.Node = Error occurred in node validation.
-Error.EditValidateUtil.Range = Error occurred in range validation.
-Error.EditValidateUtil.StringIndex = Invalid string.
-Error.EditValidateUtil.IndexOffset = Invalid index or offset of string.
-CSSColorConverter.0=Error in color expression:
-CSSColorConverter.1=Error in color expression:
-Error.CSSFigure.0=Error in flowContext setting.
-Error.CSSUtil.0=Could not cast to CSS style
-Error.CSSUtil.1=Could not cast to CSS style
-Error.CSSUtil.2=Could not cast to CSS style
-Error.CSSUtil.3=Could not cast to CSS style
-Error.HTMLEditor.0=
-Error.HTMLEditor.1=Error occurred getting storage contents
-Error.HTMLEditor.2=Error occurred closing content.
-Error.HTMLEditor.3=The core has exception
-Error.HTMLEditor.4=Error occurred closing stream.
-Error.HTMLEditor.5=Error occurred initializing the editor.
-Error.HTMLEditor.6=Error occurred changing the page.
-Error.FontSizeMeta.0=Error occurred in tag font attribute calculating.
-Error.EditModelQuery.0=Error in position creation:
-Error.EditModelQuery.1=Error occurred getting node at indexed position
-Error.CommonResourceDialog.0.1=Error in project memeber querying
-Error.CommonResourceDialog.0.2=Please refer to error log for details
-Error.ImgFileFilter.1=CoreException is thrown, please refer to error log for details
-Error.ImgFileFilter.3=CoreException is thrown, please refer to error log for details
-Error.ImgFileFilter.0=Error in filtering the tree
-Error.ImgFileFilter.2=Error in getting project Nature
-Info.FontWeightMeta.0=Error occurred in integer processing.
-Warn.PolicyHelper.0=cannot get status line manager
-Warn.PolicyHelper.1=viewer is not HTML viewer
-HTMLSpecialCharHelper.3=Exception thrown
-HTMLSpecialCharHelper.2=Truncated & without ;
-HTMLSpecialCharHelper.1=Not an entity and not a &\#XXXX;
-HTMLSpecialCharHelper.0=Error in number expression
-
-####################################################
-# Resource message for RenderingTraverser
-####################################################
-RenderingTraverser.Error.FileNotFound		=	File Not Found
-RenderingTraverser.Error.UnsupportedEncoding	=	Unsupport Encoding
-RenderingTraverser.Error.IO		=	IO exception
-
-PaletteItemManager.error=error in constructor
-PaletteItemManager.initForPluginExtension.error.IOException=IOExcetpion in initForPluginExtension error
-PaletteItemManager.initForPluginExtension.error.MalformedURLException=MalformedURLException in initForPluginExtension
-PaletteItemManager.initForPluginExtension.error.InstantiationException=InstantiationException in initForPluginExtension
-PaletteItemManager.save.error.IOException=IOException when save
-ParagraphSupport.CommandLabel.Preformated=Preformated
-PaletteItemManager.loadPaletteItemState.error.IOException=IOException in loadPaletteItemState
-PaletteItemManager.loadPaletteItemState.error.SAXException=SAXException in loadPaletteItemState
-PaletteItemManager.loadPaletteItemState.error.getDocumentBuilderFail=getDocumentBuilder Failed
-
-PreviewUtil.previewFile.CoreException= CoreException previewing file
-PreviewUtil.previewFile.IOException= IOException previewing file
-
-#context menu
-ActionGroup.Submenu.TextStyle=Text Style
-ActionGroup.Submenu.Align=Align
-ActionGroup.Submenu.ParagraphFormat=Paragraph Format
-ActionGroup.Submenu.StyleClasses=Style Classes
-ActionGroup.Submenu.BorderStyle=Border Style
-ActionGroup.Submenu.Color=Color
-ActionGroup.Submenu.BackgroundColor=Background Color
-ActionGroup.Submenu.Link=Make Link...
-ActionGroup.Submenu.SelectRelative=Select Relative
-
-TableActionGroup.Submenu.SelectTable=Select Table
-TableActionGroup.Submenu.InsertRowBefore=Insert Row Before
-TableActionGroup.Submenu.InsertRowAfter=Insert Row After
-TableActionGroup.Submenu.InsertColumnBefore=Insert Column Before
-TableActionGroup.Submenu.InsertColumnAfter=Insert Column After
-TableActionGroup.Submenu.DeleteRow=Delete Row
-TableActionGroup.Submenu.DeleteColumn=Delete Column
-ElementEdit.Submenu.Table=Table
-ElementEdit.Submenu.SelectTable=Select Table
-ElementEdit.Submenu.InsertRowBefore=Insert Row Before
-ElementEdit.Submenu.InsertRowAfter=Insert Row After
-ElementEdit.Submenu.InsertColumnBefore=Insert Column Before
-ElementEdit.Submenu.InsertColumnAfter=Insert Column After
-ElementEdit.Submenu.DeleteRow=Delete Row
-ElementEdit.Submenu.DeleteColumn=Delete Column
-ElementEdit.Submenu.InsertHeader=Insert Header
-ElementEdit.Submenu.InsertFooter=Insert Footer
-ElementEdit.Submenu.DeleteHeader=Delete Header
-ElementEdit.Submenu.DeleteFooter=Delete Footer
-ElementEdit.Submenu.Taglib=Open Definition File
-TableInsertHeaderFooterCommand.ColumnHeader=Column Header
-TableInsertHeaderFooterCommand.ColumnFooter=Column Footer
-
-Action.Name.Copy=Copy
-Action.Name.Cut=Cut
-Action.Name.Paste=Paste
-
-Message.Warning.Title=Warning
-Taglib.OpenFile.ERROR=The file that the URI refers to does not exist.
-
-MakeLinkAction.Wizard.PageTitle=Please select link type
-CreateLinkWizard.Title=Select Link Type
-LinkWizardPage.GroupTitle=Link Types
-LinkWizardPage.PreviewLabel=Preview
-
-ItemCreationEditPolicy.CommandLabel.CreateItem=Create Item
-MakeLinkCommand.Label.MakeLink=Make Link
-AttributePropertySource.CommandLabel.ChangeAttribute=Change Attribute
-ChangeAttributeAction.CommandLabel.ChangeStyleClass=Change Style Class
-BorderStyleSupport.CommandLabel.Hidden=Hidden
-BorderStyleSupport.CommandLabel.Dotted=Dotted
-BorderStyleSupport.CommandLabel.Dashed=Dashed
-BorderStyleSupport.CommandLabel.Solid=Solid
-BorderStyleSupport.CommandLabel.Double=Double
-BorderStyleSupport.CommandLabel.Groove=Groove
-BorderStyleSupport.CommandLabel.Ridge=Ridge
-BorderStyleSupport.CommandLabel.Inset=Inset
-BorderStyleSupport.CommandLabel.Outset=Outset
-ColorSupport.CommandLabel.Aqua=Aqua
-ColorSupport.CommandLabel.Black=Black
-ColorSupport.CommandLabel.Blue=Blue
-ColorSupport.CommandLabel.Fuchsia=Fuchsia
-ColorSupport.CommandLabel.Gray=Gray
-ColorSupport.CommandLabel.Green=Green
-ColorSupport.CommandLabel.Lime=Lime
-ColorSupport.CommandLabel.Maroon=Maroon
-ColorSupport.CommandLabel.Navy=Navy
-ColorSupport.CommandLabel.Olive=Olive
-ColorSupport.CommandLabel.Orange=Orange
-ColorSupport.CommandLabel.Purple=Purple
-ColorSupport.CommandLabel.Red=Red
-ColorSupport.CommandLabel.Silver=Silver
-ColorSupport.CommandLabel.Teal=Teal
-ColorSupport.CommandLabel.White=White
-ColorSupport.CommandLabel.Yellow=Yellow
-ColorSupport.CommandLabel.Default=Default
-ParagraphSupport.CommandLabel.None=None
-ParagraphSupport.CommandLabel.Paragraph=Paragraph
-ParagraphSupport.CommandLabel.Heading1=Heading 1
-ParagraphSupport.CommandLabel.Heading2=Heading 2
-ParagraphSupport.CommandLabel.Heading3=Heading 3
-ParagraphSupport.CommandLabel.Heading4=Heading 4
-ParagraphSupport.CommandLabel.Heading5=Heading 5
-ParagraphSupport.CommandLabel.Heading6=Heading 6
-ParagraphSupport.CommandLabel.P=P
-ParagraphSupport.CommandLabel.H1=H1
-ParagraphSupport.CommandLabel.H2=H2
-ParagraphSupport.CommandLabel.H3=H3
-ParagraphSupport.CommandLabel.H4=H4
-ParagraphSupport.CommandLabel.H5=H5
-ParagraphSupport.CommandLabel.H6=H6
-ParagraphSupport.CommandLabel.PRE=PRE
-HTagsInsertGroupAction.ActionLabel.Hx=Hx
-RangeStyleSupport.ActionLabel.Bold=Bold
-RangeStyleSupport.ActionLabel.Italic=Italic
-RangeStyleSupport.ActionLabel.Underline=Underline
-ShowAllAction.ActionLabel.ShowAll=Show All
-AlignSupport.ActionLabel.Left=Left
-AlignSupport.ActionLabel.Center=Center
-AlignSupport.ActionLabel.Right=Right
-AlignSupport.ActionLabel.Justify=Justify
-
-Info.ElementDescReader.ReadPropertyFile=The property file:{0} is not found
-Info.ElementDescReader.ReadPropertyFile.Key=The key:{0} is not found in file:{1}
-ChangeStyleAction.Text=Edit Style...
-
-Log.Error.HTMLStringTagConverter.Error=Error
-ConverterUtil.Description= Drag and drop Web page content here
-
-SimpleGraphicalEditor.help.id=org.eclipse.jst.pagedesigner.graphicalEditor
-DesignerTabbedPropertySheetPage.help.id=org.eclipse.jst.pagedesigner.QuickEditor
-MyPropertySheetPage.help.id=org.eclipse.jst.pagedesigner.Attributes
-StyleDialog.help.id=org.eclipse.jst.pagedesigner.styleDialog
-DesignerPaletteViewerProvider.help.id=org.eclipse.jst.pagedesigner.palette_help
-
-StyleClassSupport.Default=Default
-XMLUtil.Error.0=Error in create documentBuilder:
-XMLUtil.Error.2=Error in object persistance:
-PreviewUtil.Error.0=Error occurred processing the resource bundle:
-PreviewUtil.Error.3=Error occurred opening the file:
-PreviewHandlerNew.Error.0=Error in model release:
-PreviewConvertContext.Error.0=Error:
-CellEditorFactoryRegistry.Info.2=Error in fields retrieving:
-CellEditorFactoryRegistry.Info.3=Error in fields retrieving:
-PageExpressionContext.Info.0=Error:
-TextLayoutSupport.Info.1=Error in text painting:
-
-CMRegistry.ReadConfigration=Reading Properties Configurations
-CMRegistry.HTMLConfigration=Reading HTML Configuration ...
-CMRegistry.JSPConfigration=Reading JSP Configuration ...
-CMRegistry.OtherConfigration=Reading Other Configuration ...
-
-HTMLEditor.Design=Design
-HTMLEditor.Source=Source
-
-LocalSelectionDropTargetListener.MessageDialog.Title=Info
-LocalSelectionDropTargetListener.MessageDialog.Message=The page is deleted, save it first.
-
-LoadBundleTagConverter.convertRefresh.MalformedURLException= MalformedURLException in LoadBundleTagConverter
-LoadBundleTagConverter.convertRefresh.IOException= IOException in LoadBundleTagConverter
-
-Warning.TransformOperationFactory.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.NotITransformOperation=ITransformOperation class specified by name in metadata does not implement ITransformOperation ("{0}")
-Warning.TransformOperationFactory.UnknownOperationID=Unknown operation ID specified in metadata ("{0}")
-Warning.TransformOperationFactory.TooFewParameters=Too few parameters specified in metadata for operation ("{0}")
-
-#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}
\ 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 178b7bb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/PDPlugin.java
+++ /dev/null
@@ -1,436 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class PDPlugin extends AbstractUIPlugin {
-	private static final String ICONS_LIB_PATH = "icons";
-
-	//private static final boolean ROOT_PLUGIN = false;
-
-	// The shared instance.
-	private static PDPlugin _plugin;
-
-	private static Logger _log;
-
-	private static Alerts _alerts;
-
-	private ResourceBundle _resourceBundle;
-
-	private Properties _properties;
-
-	private URL _pluginBase;
-
-	/**
-	 * The constructor.
-	 */
-	public PDPlugin() {
-		super();
-		_plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-
-		try {
-			// get resource bundle.
-			_resourceBundle = ResourceBundle
-					.getBundle(IJMTConstants.ROOT_RESOURCEBUNDLE);
-			_alerts = new Alerts(this, _resourceBundle);
-
-			// get properties.
-			_properties = new Properties();
-			InputStream input = null;
-			_pluginBase = getBundle().getEntry("/");
-			try {
-				input = (new URL(_pluginBase, IJMTConstants.DEFAULT_PROPERTIES))
-						.openStream();
-				_properties.load(input);
-			} finally {
-				try {
-					input.close();
-				} catch (IOException ee)// NOPMD
-				{
-					// nothing to do when IOException throwed in closing files.
-				}
-			}
-
-			// set up logging for this plugin and everthing under it.
-			_log = new Logger(this.getBundle(), _resourceBundle);
-
-			// NOTE: add in any other plugin code statup HERE!!!!
-
-			// log.CommonPlugin=Web Application Development Common Plugin
-			// initialized on eclipse version {0}.
-
-			// log.info("log.CommonPlugin", version);
-
-		} catch (Exception ee) {
-			// only log if the logger was configured correctly.
-			if (_log != null) {
-				_log
-						.error(
-								"log.msg",
-								"Problems starting plug-in Web Application Development Common.",
-								ee);
-			}
-
-			throw new CoreException(
-					new Status(
-							IStatus.ERROR,
-							getBundle().getSymbolicName(),
-							IStatus.OK,
-							"Problems starting plug-in Web Application Development Common",
-							ee));
-		}
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static PDPlugin getDefault() {
-		return _plugin;
-	}
-
-	/**
-	 * get the alerts objects associated with this plugin for alerting the user.
-	 * 
-	 * @return
-	 */
-	public static Alerts getAlerts() {
-		return _alerts;
-	}
-
-	/**
-	 * Returns a logger for the new class using this plugin for reference.
-	 */
-	public static Logger getLogger(Class theClass) {
-		if (getDefault() != null && getDefault().getRootLogger() != null) {
-			return getDefault().getRootLogger();
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the plugin's root logger
-	 */
-	public Logger getRootLogger() {
-		return _log;
-	}
-
-	/**
-	 * Returns this plugin's unique identifier
-	 * 
-	 * @retun this plugin's unique identifier
-	 */
-	public static String getPluginId() {
-		return getDefault().getBundle().getSymbolicName();
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 */
-	public ResourceBundle getResourceBundle() {
-		return _resourceBundle;
-	}
-
-	/**
-	 * Returns 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 + '!';
-		}
-	}
-
-	/**
-	 * Returns the plugin's descriptor's resource bundle,
-	 */
-	public ResourceBundle getPluginDecriptorBundle() {
-		return Platform.getResourceBundle(getDefault().getBundle());
-	}
-
-	/**
-	 * Returns the plugin's default properties. These are normally used for
-	 * default preferences.
-	 */
-	public Properties getProperties() {
-		return _properties;
-	}
-
-	/**
-	 * 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.
-	 */
-	public static Display getStandardDisplay() {
-		Display display;
-		display = Display.getCurrent();
-		if (display == null) {
-			display = Display.getDefault();
-		}
-		return display;
-	}
-
-	/**
-	 * Returns the workspace instance.
-	 */
-	public static IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	/**
-	 * Returns a shared image for the given name.  Image must exist in icons folder of pagedesigner plugin.
-	 * <p>
-	 * Note: Images returned from this method will be automitically disposed of
-	 * when this plug-in shuts down. Callers must not dispose of these images
-	 * themselves.
-	 * </p>
-	 * 
-	 * @param name
-	 *            the image name found in /icons (with extension)
-	 * @return the image, null on error or not found.
-	 */
-	public Image getImage(String name) {
-		if (name == null) {
-			return null;
-		}
-
-		ImageRegistry images = getImageRegistry();
-		Image image = images.get(name);
-		if (image == null) {
-			getImageDescriptor(name);		
-			image = images.get(name);
-		}
-		return image;
-	}
-
-	/**
-	 * Returns a shared ImageDescriptor for the given name
-	 * <p>
-	 * Note: ImageDescriptor returned from this method will be automatically
-	 * disposed of when this plug-in shuts down. Callers must not dispose of
-	 * these ImageDescriptor themselves.
-	 * </p>
-	 * 
-	 * @param name
-	 *            the ImageDescriptor name found in /icons (with extension)
-	 * @return the ImageDescriptor, null on error or not found.
-	 */
-	public ImageDescriptor getImageDescriptor(String name) {
-		if (name == null) {
-			return null;
-		}
-
-		ImageRegistry images = getImageRegistry();
-		ImageDescriptor id = images.getDescriptor(name);
-		if (id == null) {
-			InputStream stream = null;
-			try {//check existance of file
-				URL url = new URL(_pluginBase,
-						ICONS_LIB_PATH + "/" + name);
-				
-				//doing the following to check existance... exception will be caught and null descriptor returned
-				stream = url.openStream();
-				stream.close();
-				
-				id = ImageDescriptor.createFromURL(url);
-				images.put(name, id);
-			} catch (IOException e1) {
-				_log.info("Unable to create ImageDescriptor for: "+name, e1);
-				return null;
-			} 
-		}
-		return id;
-	}
-
-	/**
-	 * Read a file resource. The file should contain any partial path and the
-	 * filename from the plugin base. The caller is responsible for closing the
-	 * file.
-	 */
-	public InputStream readFile(String file) throws MalformedURLException,
-			IOException {
-		return (new URL(_pluginBase, file)).openStream();
-	}
-
-	public File getFile(String file) throws MalformedURLException, IOException {
-		return new File((new URL(_pluginBase, file)).getPath());
-	}
-
-	public static Path getInstallLocation() {
-		try {
-			URL url = getDefault().getBundle().getEntry("/");
-			String s1 = FileLocator.resolve(url).getFile();
-			if (s1.startsWith("/")) //$NON-NLS-1$
-			{
-				s1 = s1.substring(1);
-			}
-			s1 = (new Path(s1)).toOSString();
-			String s;
-			if (s1.endsWith(File.separator)) {
-				s = s1;
-			} else {
-				s = s1 + File.separator;
-			}
-			return new Path(s);
-		} catch (Exception exception) {
-			_log.error("Error.PDPlugin.Installation.15", exception); //$NON-NLS-1$
-			return null;
-		}
-	}
-
-	public static IModelManager getModelManager() {
-		return StructuredModelManager.getModelManager();
-	}
-
-	/**
-	 * 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.
-	}
-
-	/**
-	 * Returns the active workbench Shell. Used for some funciton need IShell
-	 * Parameter.
-	 * 
-	 * @return
-	 */
-	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;
-	}
-
-	/**
-	 * Returns the active display.
-	 * 
-	 * @return
-	 */
-	public static Display getDisplay() {
-		Shell shell = getActiveWorkbenchShell();
-		if (shell != null) {
-			return shell.getDisplay();
-		}
-        return Display.getDefault();
-	}
-
-	/**
-	 * Returns current active project.
-	 * 
-	 * @return
-	 */
-	public static IProject getCurrentProject() {
-		IProject curProject = null;
-		IEditorPart editor = PDPlugin.getDefault().getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage().getActiveEditor();
-		IEditorInput input = editor.getEditorInput();
-		IFile inputFile = null;
-		if (input != null && input instanceof IFileEditorInput) {
-			inputFile = ((IFileEditorInput) input).getFile();
-			curProject = inputFile.getProject();
-		}
-		return curProject;
-	}
-	
-	public static void log(IStatus status)
-	{
-	    ILog log = getDefault().getLog();
-	    log.log(status);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/container/ContainerActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/container/ContainerActionGroup.java
deleted file mode 100644
index 807cad2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/container/ContainerActionGroup.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.container;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.ui.actions.ActionGroup;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ContainerActionGroup extends ActionGroup {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		ISelection selection = this.getContext().getSelection();
-
-		EditPart part = findCommonAncesterPart(selection);
-		if (!(part instanceof NodeEditPart)) {
-			return;
-		}
-
-		NodeEditPart original = (NodeEditPart) part;
-		// start from the parent of part
-		while (part.getParent() instanceof ElementEditPart) {
-			ElementEditPart elementEditPart = (ElementEditPart) part
-					.getParent();
-
-			IElementEdit elementEdit = elementEditPart.getElementEdit();
-			if (elementEdit != null) {
-				boolean filled = elementEdit.fillContainerContextMenu(menu,
-						elementEditPart, original, selection);
-				if (filled) {
-					break;
-				}
-			}
-
-			part = part.getParent();
-		}
-	}
-
-	/**
-	 * Give a selection, find a single common container node as start for table
-	 * related operations.
-	 * 
-	 * @param selection
-	 * @return
-	 */
-	private EditPart findCommonAncesterPart(ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection structsel = (IStructuredSelection) selection;
-			if (structsel.size() != 1) {
-				return null;
-			} else if (structsel.getFirstElement() instanceof EditPart) {
-				return (EditPart) structsel.getFirstElement();
-			} else {
-				return null;
-			}
-		} else if (selection instanceof DesignRange) {
-			DesignRange range = (DesignRange) selection;
-			if (!range.isValid()) {
-				return null;
-			}
-			if (range.isEmpty()) {
-				DesignPosition position = range.getStartPosition();
-				if (position.getOffset() == 0
-						|| position.getContainerNode() instanceof Text) {
-					return position.getContainerPart();
-				}
-                return position.getSiblingEditPart(false);
-			}
-            return RangeUtil.findCommonAncestor(range);
-		} else {
-			return null;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/AbstractLinkCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/AbstractLinkCreator.java
deleted file mode 100644
index c2f6e25..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/AbstractLinkCreator.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.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;
-
-	/*
-	 * (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(ILinkCreator.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 e36848a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/CreateLinkWizard.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.actions.link;
-
-import java.util.Map;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CreateLinkWizard extends Wizard {
-	private static final String WIZARD_TITLE = PDPlugin
-			.getResourceString("CreateLinkWizard.Title");
-
-	private static final String INTIAL_DEFAULT_PAGE_IMAGE = "newsuade_wiz.gif";
-
-	private static final String PAGE_NAME = "first";
-
-	private String _pageTitle;
-
-	private EditPart _part;
-
-	private DesignRange _range;
-
-	private Map _linkMap;
-
-	private String _linkType;
-
-	public CreateLinkWizard(EditPart part, DesignRange range, Map 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;
-	}
-
-	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);
-	}
-
-	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 5ef0c1d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ExtensionReader.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.actions.link;
-
-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;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ExtensionReader {
-	private static Logger _log = PDPlugin.getLogger(ExtensionReader.class);
-
-	private static ILinkCreator[] _handlers = null;
-
-	private static final String ATTR_CLASS = "class";
-
-	public static synchronized ILinkCreator[] getAllLinkHandlers() {
-		if (_handlers == null) {
-			_handlers = readAllLinkHandlers();
-		}
-		return _handlers;
-
-	}
-
-	private static ILinkCreator[] readAllLinkHandlers() {
-		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[] 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(obj);
-						}
-					} catch (CoreException e) {
-						_log
-								.error("Log.Error.ExtensionReader.ReadLinkExtension");
-					}
-				}
-			}
-		}
-		ILinkCreator[] ret = new ILinkCreator[result.size()];
-		result.toArray(ret);
-		return ret;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/HtmlLinkCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/HtmlLinkCreator.java
deleted file mode 100644
index 8e3c6f9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/HtmlLinkCreator.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class HtmlLinkCreator extends AbstractLinkCreator {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.actions.link.ILinkCreator#makeLinkElement(org.eclipse.gef.EditPart,
-	 *      org.eclipse.jst.pagedesigner.viewer.DesignRange)
-	 */
-	public Element makeLinkElement(EditPart part, DesignRange range) {
-		if (part instanceof TextEditPart) {
-			Text middleNode = LinkUtil.splitDomText(part, range);
-			EditPart parent = part.getParent();
-			Node parentNode = (Node) parent.getModel();
-			Document doc = (parentNode instanceof Document) ? (Document) parentNode
-					: (parentNode.getOwnerDocument());
-
-			Element htmlLink = doc.createElement(IHTMLConstants.TAG_A);
-			htmlLink.setAttribute(ICSSPropertyID.ATTR_HREF, "");
-			Text text = doc.createTextNode(middleNode.getNodeValue());
-			htmlLink.appendChild(text);
-			parentNode.replaceChild(htmlLink, middleNode);
-			return htmlLink;
-		}
-
-		return null;
-	}
-
-	public String getSourcePreview(EditPart part, DesignRange range) {
-		if (part instanceof TextEditPart) {
-			TextEditPart textPart = (TextEditPart) part;
-			int[] offsets = textPart.getSelectedRange();
-			String displayData = textPart.getTextData();
-
-			String linkExp = displayData.substring(offsets[0], offsets[1]);
-			StringBuffer sb = new StringBuffer();
-			sb.append("<a href=\"\">");
-			sb.append(linkExp);
-			sb.append("</a>");
-			return sb.toString();
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ILinkCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ILinkCreator.java
deleted file mode 100644
index 83b332b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ILinkCreator.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.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 {
-	public static final String LINK_IDENTIFIER = "linkIdentifier";
-
-	public Element makeLinkElement(EditPart part, DesignRange range);
-
-	public String getLinkIdentifier();
-
-	public boolean canExecute(DesignRange range);
-
-	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 4f1152e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkRequest.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.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 String _identifier = "";
-
-	private DesignRange _range = null;
-
-	public LinkRequest(String identifier, DesignRange range) {
-		this._identifier = identifier;
-		this._range = range;
-	}
-
-	public String getIdentifier() {
-		return this._identifier;
-	}
-
-	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 271b8c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkUtil.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 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 {
-	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;
-	}
-
-	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 f64d5e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkWizardPage.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.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
- */
-public class LinkWizardPage extends WizardPage {
-	private static final String GROUP_TITLE = PDPlugin
-			.getResourceString("LinkWizardPage.GroupTitle");
-
-	private static final String PREVIEW_TAG_LABEL = PDPlugin
-			.getResourceString("LinkWizardPage.PreviewLabel");
-
-	private StyledText _text = null;
-
-	private Map _linkMap = null;
-
-	private String _linkType = null;
-
-	private EditPart _part = null;
-
-	private DesignRange _range = null;
-
-	public LinkWizardPage(String pageName, String title, EditPart editPart,
-			DesignRange range, Map linkMap) {
-		super(pageName, title, null);
-		this._part = editPart;
-		this._range = range;
-		this._linkMap = linkMap;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		layout = new GridLayout();
-		layout.marginWidth = 20;
-		parent.setLayout(layout);
-		data = new GridData(GridData.FILL_BOTH | GridData.CENTER);
-		parent.setLayoutData(data);
-
-		Group group = new Group(parent, SWT.NONE);
-		group.setText(GROUP_TITLE);
-		layout = new GridLayout();
-		group.setLayout(layout);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		group.setLayoutData(data);
-
-		String defaultLink = "";
-		Set set = this._linkMap.keySet();
-		int size = set.size();
-		String[] keys = new String[size];
-		Iterator itr = set.iterator();
-		int i = 0;
-		while (itr.hasNext()) {
-			String key = (String) 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 = (ILinkCreator) _linkMap.get(defaultLink);
-		_linkType = creator.getLinkIdentifier();
-		String previewText = creator.getSourcePreview(_part, _range);
-		previewText = previewText == null ? "" : previewText;
-		_text.setText(previewText);
-		_text.setEditable(false);
-
-		super.setControl(group);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		return true;
-	}
-
-	public String getChosenLinkType() {
-		return this._linkType;
-	}
-
-	class SelectLinkListener extends SelectionAdapter {
-		private String _key;
-
-		public SelectLinkListener(String key) {
-			this._key = key;
-		}
-
-		public void widgetSelected(SelectionEvent e) {
-			ILinkCreator creator = (ILinkCreator) _linkMap.get(this._key);
-			_linkType = creator.getLinkIdentifier();
-			String previewText = creator.getSourcePreview(_part, _range);
-			previewText = previewText == null ? "" : previewText;
-			_text.setText(previewText);
-			super.widgetSelected(e);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkAction.java
deleted file mode 100644
index ea6c413..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkAction.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.actions.link;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonWizardDialog;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class MakeLinkAction extends Action {
-	private final static String MAKE_LINK = PDPlugin
-			.getResourceString("ActionGroup.Submenu.Link");
-
-	private final static String WIZARD_PAGE_TITLE = PDPlugin
-			.getResourceString("MakeLinkAction.Wizard.PageTitle");
-
-	private EditPart _editPart;
-
-	private DesignRange _range;
-
-	private String _linkType;
-
-	/**
-	 * @param range
-	 */
-	public MakeLinkAction(DesignRange range) {
-		super(MAKE_LINK);
-		_range = range;
-		_editPart = convertToEditPart(_range);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		Map 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 set = map.entrySet();
-			Iterator itr = set.iterator();
-			while (itr.hasNext()) {
-				ILinkCreator creator = (ILinkCreator) itr.next();
-				_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 calAvailableLinkCreator() {
-		Map map = new HashMap();
-		ILinkCreator[] linkCreators = ExtensionReader.getAllLinkHandlers();
-		for (int i = 0, size = linkCreators.length; i < size; i++) {
-			String identifier = linkCreators[i].getLinkIdentifier();
-			boolean canExecute = linkCreators[i].canExecute(_range);
-			if (canExecute) {
-				map.put(identifier, linkCreators[i]);
-			}
-		}
-		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 9ccd1d1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkCommand.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.actions.link;
-
-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;
-
-	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() {
-		ILinkCreator[] creators = ExtensionReader.getAllLinkHandlers();
-		if (creators != null) {
-			for (int i = 0, size = creators.length; i < size; i++) {
-				ILinkCreator linkCreator = creators[i];
-				String identifier = linkCreator.getLinkIdentifier();
-				if (this._identifier.equalsIgnoreCase(identifier)) {
-					this._linkcreator = linkCreator;
-					break;
-				}
-			}
-		}
-		if (this._linkcreator != null) {
-			return this._linkcreator.canExecute(_range);
-		}
-
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		if (this._linkcreator != null) {
-			Element ele = this._linkcreator.makeLinkElement(this._part,
-					this._range);
-			Node node = (Node) this._part.getModel();
-			Node parent = node.getParentNode();
-			formatNode(parent);
-
-			this._ele = ele;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_ele);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/CustomedContextMenuActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/CustomedContextMenuActionGroup.java
deleted file mode 100644
index b6721fc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/CustomedContextMenuActionGroup.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.menuextension;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.extensionpoint.IContextMenuItemContributor;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CustomedContextMenuActionGroup extends ActionGroup {
-	private final static String POPUPMENU_EXTENSION_ID = "org.eclipse.jst.pagedesigner.popupMenuContributor"; //$NON-NLS-1$
-
-	private List _contributedMenuListener;
-
-	private Control _parentControl;
-
-	private IStructuredModel _model;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		populateContributedMenu(menu);
-	}
-
-	private List getListeners() {
-		if (_contributedMenuListener == null) {
-			_contributedMenuListener = computeContributedMenuListener();
-		}
-		return _contributedMenuListener;
-	}
-
-	private List computeContributedMenuListener() {
-		IExtensionRegistry registry = Platform.getExtensionRegistry();
-		IExtensionPoint extensionPoint = registry
-				.getExtensionPoint(POPUPMENU_EXTENSION_ID);
-		IExtension[] extensions = extensionPoint.getExtensions();
-		List results = new ArrayList();
-		for (int i = 0; i < extensions.length; i++) {
-			IConfigurationElement[] elements = extensions[i]
-					.getConfigurationElements();
-			for (int j = 0; j < elements.length; j++) {
-				try {
-					Object listener = elements[j]
-							.createExecutableExtension("class");//$NON-NLS-1$
-
-					if (listener instanceof IContextMenuItemContributor) {
-						results.add(listener);
-						((IContextMenuItemContributor) listener)
-								.setURI(elements[j].getAttribute("URI"));//$NON-NLS-1$
-					}
-				} catch (CoreException e) {
-					// ignore
-				}
-			}
-		}
-		return results;
-	}
-
-	private void populateContributedMenu(IMenuManager menuMgr) {
-		List list = getListeners();
-		for (int i = 0, n = list.size(); i < n; i++) {
-			IContextMenuItemContributor contributor = (IContextMenuItemContributor) list
-					.get(i);
-			IFile file = StructuredModelUtil.getFileFor(_model);
-			if (file != null && contributor.getURI() != null) {
-				if (JSPUtil.supportTaglib(contributor.getURI(), file)) {
-					contributor.fillContextMenu(menuMgr, getContext()
-							.getSelection(), _model, _parentControl);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @return Returns the model.
-	 */
-	public IStructuredModel getModel() {
-		return _model;
-	}
-
-	/**
-	 * @param model
-	 *            The model to set.
-	 */
-	public void setModel(IStructuredModel model) {
-		this._model = model;
-	}
-
-	/**
-	 * @return Returns the parentControl.
-	 */
-	public Control getParentControl() {
-		return _parentControl;
-	}
-
-	/**
-	 * @param parentControl
-	 *            The parentControl to set.
-	 */
-	public void setParentControl(Control parentControl) {
-		this._parentControl = parentControl;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/RunAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/RunAction.java
deleted file mode 100644
index 4b58c68..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/RunAction.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.menuextension;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RunAction extends Action {
-	/**
-	 * constant for debug launch mode
-	 */
-	public static final String LAUNCH_MODE_DEBUG = "debug";
-
-	/**
-	 * constant for run launch mode
-	 */
-	public static final String LAUNCH_MODE_RUN = "run";
-
-	private final String ID = "org.eclipse.jst.pagedesigner.actions.menuextension.RunAction";
-
-	//private EditorPart _editor;
-
-	private String _mode;
-
-	/**
-	 * @param editor
-	 * @param mode
-	 */
-	public RunAction(EditorPart editor, String mode) {
-		//_editor = editor;
-		_mode = mode;
-	}
-
-	public void run() {
-	    PDPlugin.getLogger(getClass()).error("Obsolete.  Shouldn't be used", new Throwable());
-	    // FIXME: we don't support this feature and it seems to depend
-	    // on debugger internal code anyway...
-	    //		List allShortCuts = DebugUIPlugin.getDefault()
-//				.getLaunchConfigurationManager().getLaunchShortcuts();
-//		Iterator iter = allShortCuts.iterator();
-//		LaunchShortcutExtension ext = null;
-//		while (iter.hasNext()) {
-//			ext = (LaunchShortcutExtension) iter.next();
-//			try {
-//				if (ext.getId().equals("org.eclipse.wst.server.launchShortcut")) {
-//					break;
-//				}
-//			} catch (Exception e) {
-//				// not supported
-//			}
-//		}
-//		if (ext != null) {
-//			ext.launch(getSelection(), _mode);
-//		}
-	}
-
-//	private IStructuredSelection getSelection() {
-//		IEditorInput input = ((HTMLEditor) _editor).getEditorInput();
-//		List elements = new ArrayList();
-//		if (input instanceof FileEditorInput) {
-//			elements.add(((FileEditorInput) input).getFile());
-//		}
-//		return new StructuredSelection(elements);
-//	}
-
-	public String getId() {
-		return ID;
-	}
-
-	public String getText() {
-		return _mode.substring(0, 1).toUpperCase()
-				+ _mode.substring(1, _mode.length());
-	}
-
-	private ImageDescriptor getImageDescriptorForModel(String id) {
-		IConfigurationElement[] elements = Platform.getExtensionRegistry()
-				.getConfigurationElementsFor("org.eclipse.ui.actionSets");
-		for (int i = 0; i < elements.length; i++) {
-			if ("actionSet".equals(elements[i].getName())) {
-				IConfigurationElement[] actions = elements[i]
-						.getChildren("action");
-				for (int j = 0; j < actions.length; j++) {
-					if (id.equals(actions[j].getAttribute("id"))) {
-						String iconPath = actions[j].getAttribute("icon");
-						if (iconPath != null) {
-							return AbstractUIPlugin.imageDescriptorFromPlugin(
-									actions[j].getDeclaringExtension()
-											.getContributor().getName(), iconPath);
-						}
-                        return null;
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	public ImageDescriptor getImageDescriptor() {
-		if (_mode == LAUNCH_MODE_DEBUG) {
-			return getImageDescriptorForModel("org.eclipse.debug.internal.ui.actions.DebugDropDownAction");
-		} else if (_mode == LAUNCH_MODE_RUN) {
-			return getImageDescriptorForModel("org.eclipse.debug.internal.ui.actions.RunDropDownAction");
-		} else {
-			return super.getImageDescriptor();
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/AlignSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/AlignSupport.java
deleted file mode 100644
index e1ac246..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/AlignSupport.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.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 {
-
-	public 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;
-
-	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);
-		}
-	}
-
-	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 81ae111..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ChangeStyleAction.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.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 String _expectedTag;
-
-	/**
-	 * @param text
-	 * @param image
-	 */
-	public ChangeStyleAction(String text, String name, ImageDescriptor image,
-			int style) {
-		super(text, style);
-		_expectedTag = name;
-		this.setImageDescriptor(image);
-	}
-
-	public ChangeStyleAction(String text, String name, ImageDescriptor enabled,
-			ImageDescriptor disabled, int style) {
-		super(text, style);
-		_expectedTag = name;
-		setImageDescriptor(enabled);
-		setDisabledImageDescriptor(disabled);
-	}
-
-	protected String getExpectedCSSProperty() {
-		return null;
-	}
-
-	protected String getExpectedCSSPropertyValue() {
-		return null;
-	}
-
-	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 2e506a4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/DesignerToolBarAction.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.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);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.texteditor.IUpdate#update()
-	 */
-	public 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);
-			}
-		}
-	}
-
-	protected abstract boolean isApplied(DOMRange range);
-
-	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;
-	}
-
-	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();
-		}
-	}
-
-	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 ec5ee27..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/HTagsInsertGroupAction.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.DesignRange;
-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();
-
-	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;
-	}
-
-	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.commands.range.InsertTagChangeStyleAction#supportSingle(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected boolean supportSingle() {
-		return true;
-	}
-
-	/*
-	 * (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.jst.pagedesigner.commands.range.InsertTagChangeStyleAction#setEnabled(org.eclipse.jst.pagedesigner.viewer.DesignRange)
-	 */
-	public void setStatus(DesignRange range) {
-		this.setEnabled(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 fd03625..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/InsertTagChangeStyleAction.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.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 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;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.texteditor.IUpdate#update()
-	 */
-	public void update() {
-		if (_viewer == null) {
-			this.setChecked(false);
-			this.setEnabled(false);
-			return;
-		}
-		if (!_viewer.isInRangeMode()) {
-			// XXX: later we may support in range mode.
-			this.setChecked(false);
-			this.setEnabled(false);
-			return;
-		}
-		DesignRange range = _viewer.getRangeSelection();
-		if (range == null || !range.isValid()) {
-			this.setChecked(false);
-			this.setEnabled(false);
-			return;
-		}
-		setEnabled(range);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.texteditor.IUpdate#update()
-	 */
-	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) && !supportSingle()) {
-				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;
-	}
-
-	protected boolean supportSingle() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneParagraphStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneParagraphStyleAction.java
deleted file mode 100644
index 6ca6c0b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneParagraphStyleAction.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.commands.range.Paragraph;
-import org.eclipse.jst.pagedesigner.commands.range.ParagraphFinder;
-import org.eclipse.jst.pagedesigner.commands.range.ParagraphUnapplyStyleCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class NoneParagraphStyleAction extends ParagraphStyleAction {
-
-	private String[] _applyingTags;
-
-	/**
-	 * @param text
-	 * @param tags
-	 * @param image
-	 * @param style
-	 */
-	public NoneParagraphStyleAction(String text, String[] tags,
-			ImageDescriptor image, int style) {
-		super(text, "", image, style);
-		_applyingTags = tags;
-	}
-
-	/**
-	 * @param text
-	 * @param node
-	 * @param image
-	 * @param style
-	 */
-	public NoneParagraphStyleAction(String text, Node node,
-			ImageDescriptor image, int style) {
-		super(text, node, image, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editors.actions.DesignerToolBarAction#isApplied(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected boolean isApplied(DOMRange range) {
-		if (range != null) {
-			boolean ordered = range.isOrdered();
-			IDOMPosition start = ordered ? range.getStartPosition() : range
-					.getEndPosition();
-			IDOMPosition end = ordered ? range.getEndPosition() : range
-					.getStartPosition();
-			Node common = null;
-			if (EditModelQuery.isSame(range)) {
-				ParagraphFinder finder = new ParagraphFinder(start);
-				Paragraph p = finder.getParagraph(start);
-				common = p.getLowestContainer();
-			} else {
-				common = EditModelQuery.getInstance().getCommonAncestor(start,
-						end);
-			}
-			// the lowest common block parent is the container to apply style.
-			if (EditModelQuery.hasAncestor(common, _applyingTags, true)) {
-				return false;
-			}
-            return true;
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#getCommand()
-	 */
-	protected Command getCommand() {
-		ParagraphUnapplyStyleCommand command = new ParagraphUnapplyStyleCommand(
-				getViewer(), _applyingTags, null, null);
-		return command;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneStyleAction.java
deleted file mode 100644
index ce5e97e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneStyleAction.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.commands.range.UnapplyStyleCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class NoneStyleAction extends ChangeStyleAction {
-	private String[] _applyingStyleTags;
-
-	/**
-	 * @param text
-	 * @param names
-	 * @param image
-	 * @param style
-	 */
-	public NoneStyleAction(String text, String[] names, ImageDescriptor image,
-			int style) {
-		super(text, "", image, style);
-		_applyingStyleTags = names;
-	}
-
-	protected boolean isApplied(DOMRange range) {
-		if (range != null) {
-			boolean ordered = range.isOrdered();
-			IDOMPosition start = ordered ? range.getStartPosition() : range
-					.getEndPosition();
-			IDOMPosition end = ordered ? range.getEndPosition() : range
-					.getStartPosition();
-			Node common = null;
-			common = EditModelQuery.getInstance().getCommonAncestor(start, end);
-			if (EditModelQuery.hasAncestor(common, _applyingStyleTags, true)) {
-				return false;
-			}
-            return true;
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#getCommand()
-	 */
-	protected Command getCommand() {
-		UnapplyStyleCommand command = new UnapplyStyleCommand(getViewer(),
-				getExpectedTag(), null, null);
-		return command;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphAction.java
deleted file mode 100644
index d2f13d0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphAction.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.jface.action.Action;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ParagraphAction extends Action {
-	/**
-	 * @param text
-	 * @param htmlTag
-	 */
-	public ParagraphAction(String text, String htmlTag) {
-		super(text);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphStyleAction.java
deleted file mode 100644
index bcc8a21..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphStyleAction.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.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);
-	}
-
-	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;
-	}
-
-	protected boolean containsTag(Node common) {
-		// the lowest common block parent is the container to apply style.
-		if (_applyingNode == null) {
-			return common.getNodeName() != null
-					&& getExpectedTag().equalsIgnoreCase(
-							common.getNodeName().toLowerCase());
-		}
-        
-        String align = ((Element) _applyingNode).getAttribute("align");
-        if (!(common instanceof Element)) {
-        	return false;
-        }
-        String cAlign = ((Element) common).getAttribute("align");
-        if (align == null || cAlign == null) {
-        	return false;
-        }
-        if (align.equals(cAlign)) {
-        	return true;
-        }
-        return false;
-	}
-
-	/**
-	 * @return Returns the _expectedTag.
-	 */
-	public String getExpectedTag() {
-		if (_tagName == null) {
-			return _applyingNode.getNodeName().toLowerCase();
-		}
-        return _tagName.toLowerCase();
-	}
-
-	/**
-	 * @return Returns the _applyingNode.
-	 */
-	public Element getApplyingNode() {
-		if (_applyingNode != null) {
-			return (Element) _applyingNode;
-		}
-        return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#getCommand()
-	 */
-	protected Command getCommand() {
-		ParagraphApplyStyleCommand command = null;
-		if (getApplyingNode() != null) {
-			command = new ParagraphApplyStyleCommand(getViewer(),
-					getApplyingNode(), null, null);
-		} else {
-			command = new ParagraphApplyStyleCommand(getViewer(),
-					getExpectedTag(), null, null);
-		}
-		return command;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphSupport.java
deleted file mode 100644
index 52616e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphSupport.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.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$
-	};
-
-	public static int getCurrentParagraphMode(DesignRange range) {
-		return 0;
-	}
-
-	public static void createParagraphActions(IMenuManager man,
-			DesignRange range, int currentMode, 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 4203ccc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeActionGroup.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.actions.range;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.link.MakeLinkAction;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.editors.actions.DesignActionBarFactory;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.ui.actions.ActionGroup;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RangeActionGroup extends ActionGroup {
-    // TODO: what is this?  a separator?
-	private static final Action action = new Action() {
-        // Action is abstract but has no abstract methods
-        // so create a default empty action that does nothing
-	};
-
-	/**
-	 * 
-	 */
-	public RangeActionGroup() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager contextMenu) 
-    {
-		DesignRange selection = fixUpSelection(getContext().getSelection());
-		if (selection == null) {
-			return;
-		}
-        IContributionItem styleSubMenuItem = 
-            contextMenu.find(PageDesignerActionConstants.STYLE_SUBMENU_ID);
-        
-        if (styleSubMenuItem instanceof IMenuManager)
-        {
-            final IMenuManager subMenu = (IMenuManager) styleSubMenuItem;
-    		if (getContext().getInput() instanceof IHTMLGraphicalViewer) {
-    			addParagraphFormatMenu(subMenu, selection,
-    					(IHTMLGraphicalViewer) getContext().getInput());
-    			addHorizontalAlignMenu(subMenu, selection,
-    					(IHTMLGraphicalViewer) getContext().getInput());
-    			addTextStyleMenu(subMenu, (IHTMLGraphicalViewer) getContext()
-    					.getInput());
-    		}
-            // TODO: the (commented out) copy of this method does nothing
-    		//addListModeMenu(menu, selection);
-    
-    		// TODO: the (commented out) copy of this method does nothing
-            //addTextFontMenu(menu, selection);
-    
-    		addLinkMenu(subMenu, selection);
-        }
-    }
-
-	/**
-	 * @param selection
-	 * @return
-	 */
-	private DesignRange fixUpSelection(ISelection selection) {
-		if (selection instanceof DesignRange) {
-			return (DesignRange) selection;
-		}
-        return null;
-	}
-
-	private void addLinkMenu(IMenuManager menu, final DesignRange selection) {
-		Action action1 = new MakeLinkAction(selection);
-		menu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, action1);
-	}
-
-	private void addTextStyleMenu(IMenuManager menu,
-			final IHTMLGraphicalViewer viewer) {
-		final IMenuManager submenu = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.TextStyle"));//$NON-NLS-1$
-		submenu.add(action);
-
-		submenu.setRemoveAllWhenShown(true);
-		submenu.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				DesignerToolBarAction action1 = null;
-				action1 = DesignActionBarFactory.getInstance().getStyleAction(
-						IHTMLConstants.TAG_U);
-				action1.setViewer(viewer);
-				submenu.add(action1);
-
-				action1 = DesignActionBarFactory.getInstance().getStyleAction(
-						IHTMLConstants.TAG_B);
-				action1.setViewer(viewer);
-				submenu.add(action1);
-
-				action1 = DesignActionBarFactory.getInstance().getStyleAction(
-						IHTMLConstants.TAG_I);
-				action1.setViewer(viewer);
-				submenu.add(action1);
-
-				action1 = DesignActionBarFactory.getInstance().getStyleAction(
-						IHTMLConstants.TAG_SMALL);
-				action1.setViewer(viewer);
-				submenu.add(action1);
-
-				action1 = DesignActionBarFactory.getInstance().getStyleAction(
-						IHTMLConstants.TAG_BIG);
-				action1.setViewer(viewer);
-				submenu.add(action1);
-
-			}
-		});
-		menu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, submenu);
-	}
-
-	/**
-	 * @param menu
-	 * @param selection
-	 */
-//	private void addTextFontMenu(IMenuManager menu, DesignRange selection) {
-//	    //
-//	}
-
-	/**
-	 * @param menu
-	 * @param selection
-	 */
-	private void addHorizontalAlignMenu(IMenuManager menu,
-			final DesignRange selection, final IHTMLGraphicalViewer viewer) {
-		// we have to initialize align nodes here for some refresh problem
-		Element[] alignNodes = new Element[4];
-		final String[] alignValues = new String[] { "left", "center", "right",
-				"justify" };
-		Document document = viewer.getModel().getDocument();
-		for (int i = 0; i < 4; i++) {
-			Element node = document.createElement(IHTMLConstants.TAG_P);
-			node.setAttribute(IHTMLConstants.ATTR_ALIGN, alignValues[i]);
-			alignNodes[i] = node;
-		}
-		AlignSupport.setAlignNodes(alignNodes);
-
-		final IMenuManager submenu = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.Align"));//$NON-NLS-1$
-		submenu.add(action);
-		submenu.setRemoveAllWhenShown(true);
-		submenu.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				AlignSupport.createAlignActions(submenu, viewer);
-			}
-		});
-		menu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, submenu);
-
-	}
-
-	/**
-	 * @param menu
-	 * @param selection
-	 */
-//	private void addListModeMenu(IMenuManager menu, DesignRange selection) {
-//	}
-
-	/**
-	 * @param menu
-	 * @param selection
-	 */
-	private void addParagraphFormatMenu(IMenuManager menu,
-			final DesignRange selection, final IHTMLGraphicalViewer viewer) {
-		final IMenuManager submenu = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.ParagraphFormat"));//$NON-NLS-1$
-		submenu.add(action);
-		// Add the submenu.
-		final int mode = ParagraphSupport.getCurrentParagraphMode(selection);
-
-		submenu.addMenuListener(new IMenuListener() {
-
-			public void menuAboutToShow(IMenuManager manager) {
-				submenu.removeAll();
-				ParagraphSupport.createParagraphActions(submenu, selection,
-						mode, 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 ba633ab..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleAction.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.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
-	 */
-	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 754870a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleSupport.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.IMenuManager;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RangeStyleSupport {
-	public 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$
-
-	public static final String[] HtmlTag = new String[] { "STRONG", "I", "U", }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	public static final String[] CSSProperty = new String[] {
-			"font-weight", "font-style", "text-decoration", }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	public static final String[] CSSValue = new String[] { "bolder", "italic",
-			"underline", };
-
-	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/BorderStyleSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/BorderStyleSupport.java
deleted file mode 100644
index 4e968a4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/BorderStyleSupport.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.single;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BorderStyleSupport {
-	public static final String VAL_HIDDEN = PDPlugin
-			.getResourceString("BorderStyleSupport.CommandLabel.Hidden"); //$NON-NLS-1$
-
-	public static final String VAL_DOTTED = PDPlugin
-			.getResourceString("BorderStyleSupport.CommandLabel.Dotted"); //$NON-NLS-1$
-
-	public static final String VAL_DASHED = PDPlugin
-			.getResourceString("BorderStyleSupport.CommandLabel.Dashed"); //$NON-NLS-1$
-
-	public static final String VAL_SOLID = PDPlugin
-			.getResourceString("BorderStyleSupport.CommandLabel.Solid"); //$NON-NLS-1$
-
-	public static final String VAL_DOUBLE = PDPlugin
-			.getResourceString("BorderStyleSupport.CommandLabel.Double"); //$NON-NLS-1$
-
-	public static final String VAL_GROOVE = PDPlugin
-			.getResourceString("BorderStyleSupport.CommandLabel.Groove"); //$NON-NLS-1$
-
-	public static final String VAL_RIDGE = PDPlugin
-			.getResourceString("BorderStyleSupport.CommandLabel.Ridge"); //$NON-NLS-1$
-
-	public static final String VAL_INSET = PDPlugin
-			.getResourceString("BorderStyleSupport.CommandLabel.Inset"); //$NON-NLS-1$
-
-	public static final String VAL_OUTSET = PDPlugin
-			.getResourceString("BorderStyleSupport.CommandLabel.Outset"); //$NON-NLS-1$
-
-	public static final String[] BORDERSTYLES = new String[] { VAL_HIDDEN,
-			VAL_DOTTED, VAL_DASHED, VAL_SOLID, VAL_DOUBLE, VAL_GROOVE,
-			VAL_RIDGE, VAL_INSET, VAL_OUTSET };
-
-	public static final String getCurrentBorderStyle(IDOMElement ele) {
-		return VAL_HIDDEN;
-	}
-
-	public static void createParagraphActions(IMenuManager man,
-			IDOMElement ele, String currentMode) {
-		for (int i = 0; i < BORDERSTYLES.length; i++) {
-			BorderStyleAction action = new BorderStyleAction(BORDERSTYLES[i],
-					ele, BORDERSTYLES[i]);
-			if (BORDERSTYLES[i].equalsIgnoreCase(currentMode)) {
-				action.setChecked(true);
-			}
-			man.add(action);
-		}
-	}
-}
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 83a031b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeStyleAction.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.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 TEXT = PDPlugin
-			.getResourceString("ChangeStyleAction.Text");
-
-	private ElementEditPart _editPart;
-
-	private IDOMElement _element;
-
-	public ChangeStyleAction(ElementEditPart part, IDOMElement ele) {
-		super(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 b89fda7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeStylePropertyAction.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.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
-	 */
-	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 e63f87f..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
- */
-public class ColorSupport {
-	public 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"
-	 */
-	public static void createColorActions(IMenuManager menu, IDOMElement ele,
-			String cssProperty) {
-		boolean needAdditional = true;
-		String currentValue = DOMStyleUtil.getInlineStyleProperty(ele,
-				cssProperty);
-		ChangeStylePropertyAction defaultAction = new ChangeStylePropertyAction(
-				PDPlugin.getResourceString("ColorSupport.CommandLabel.Default"), ele, cssProperty, null); //$NON-NLS-1$
-		if (currentValue == null || currentValue.length() == 0) {
-			defaultAction.setChecked(true);
-			needAdditional = false;
-		}
-		menu.add(defaultAction);
-		menu.add(new Separator());
-		for (int i = 0; i < COLOR_VALUES.length; i++) {
-			ChangeStylePropertyAction action = new ChangeStylePropertyAction(
-					COLOR_VALUES[i], ele, cssProperty, COLOR_VALUES[i]);
-			if (COLOR_VALUES[i].equalsIgnoreCase(currentValue)) {
-				action.setChecked(true);
-				needAdditional = false;
-			}
-			menu.add(action);
-		}
-
-		if (needAdditional) {
-			ChangeStylePropertyAction action = new ChangeStylePropertyAction(
-					currentValue, ele, cssProperty, currentValue);
-			action.setChecked(true);
-			menu.add(action);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectEditPartAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectEditPartAction.java
deleted file mode 100644
index 2cb2299..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectEditPartAction.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.StructuredSelection;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class SelectEditPartAction extends Action {
-    
-    /**
-     * @param text
-     * @param forThisPart
-     * @return a convience object when the edit part that needs selection
-     * is already known when the action is constructed
-     */
-    public static SelectEditPartAction create(final String text, final EditPart forThisPart)
-    {
-        return new SelectEditPartAction(text)
-        {
-            protected EditPart getNewSelection() {
-                return forThisPart;
-            }
-        };
-    }
-
-	/**
-	 * @param text
-	 */
-	protected SelectEditPartAction(String text) {
-		super(text);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-        final EditPart newSelection = getNewSelection();
-        newSelection.getViewer().setSelection(new StructuredSelection(newSelection));
-	}
-    
-    /**
-     * @return the EditPart onto which selection should be applied.
-     */
-    protected abstract EditPart getNewSelection();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectNodeAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectNodeAction.java
deleted file mode 100644
index 3a6a729..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectNodeAction.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.actions.single;
-
-import org.w3c.dom.Node;
-
-/**
- * An edit part selection action that corresponds to a Node selection
- */
-public abstract class SelectNodeAction extends SelectEditPartAction 
-{
-    protected final Node _node;
-    
-    
-    /**
-     * @param text
-     * @param curNode
-     */
-    protected SelectNodeAction(String text, Node curNode) {
-        super(text);
-        _node = curNode;
-    }
-   
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectParentAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectParentAction.java
deleted file mode 100644
index 33d053e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectParentAction.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.gef.EditPart;
-import org.w3c.dom.Node;
-
-/**
- * Given a target node/edit part change selection to its parent
- * 
- * @author cbateman
- *
- */
-public class SelectParentAction extends SelectNodeAction {
-
-    private final EditPart _editPart;
-    
-    /**
-     * @param node
-     * @param editPart
-     * @return an action that will change focus selection to the parent
-     * part of node/editPart or a disabled one if there is no parent
-     */
-    public static SelectParentAction create(Node node, EditPart editPart)
-    {
-        Node parent = node.getParentNode();
-        
-        if (parent != null)
-        {
-            final String text = "Parent ("+parent.getNodeName()+")";
-            return new SelectParentAction(text, node, editPart);
-        }
-        SelectParentAction action = new SelectParentAction("Parent", node, editPart);
-        action.setEnabled(false);
-        return action;
-    }
-    
-    private SelectParentAction(String text, Node node, EditPart editPart)
-    {
-        super(text, node);
-        _editPart = editPart;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.actions.single.SelectEditPartAction#getNewSelection()
-     */
-    protected EditPart getNewSelection() 
-    {
-        return _editPart.getParent();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SingleElementActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SingleElementActionGroup.java
deleted file mode 100644
index 9bf37dd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SingleElementActionGroup.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.dom.DOMStyleUtil;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * Group that constructs context menu items for a single selected element.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class SingleElementActionGroup extends ActionGroup {
-    // TODO: why?
-	private static final Action action = new Action() {
-        // create a default instance that does nothing
-        // Action is abstract but has no abstract methods
-        // run() on this object is a NOOP
-	};
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		ElementEditPart part = fixUpSelection(getContext().getSelection());
-		if (part == null) {
-			return;
-		}
-		IDOMElement ele = (IDOMElement) part.getIDOMNode();
-        addPositionRelativeMenu(menu, part, ele);
-		addStylelMenu(menu, part, ele);
-
-		// next add element special actions
-		IElementEdit elementEdit = part.getElementEdit();
-		if (elementEdit != null) {
-			elementEdit.fillContextMenu(menu, ele);
-		}
-	}
-
-	/**
-	 * @param selection
-	 * @return
-	 */
-	private ElementEditPart fixUpSelection(ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection sel = (IStructuredSelection) selection;
-			if (sel.size() != 1) {
-				return null;
-			}
-			if (sel.getFirstElement() instanceof ElementEditPart) {
-				return (ElementEditPart) sel.getFirstElement();
-			}
-		}
-		return null;
-	}
-
-    /**
-     * Add menu actions that select relative to the current position
-     * 
-     * @param menu
-     * @param part
-     * @param ele
-     */
-    private void addPositionRelativeMenu(IMenuManager menu, ElementEditPart part, IDOMElement ele)
-    {
-        IContributionItem subMenuItem = menu.find(PageDesignerActionConstants.SELECT_SUBMENU_ID);
-        
-        if (subMenuItem instanceof IMenuManager)
-        {
-            final IMenuManager subMenu = (IMenuManager) subMenuItem;
-    //        final IMenuManager selectMenu = new MenuManager(PDPlugin
-    //                .getResourceString("ActionGroup.Submenu.SelectRelative"));//$NON-NLS-1$
-            SelectParentAction  selectParentAction = SelectParentAction.create(ele, part);
-            // Eclipse UI guideline: 6.13
-            // even if there is no parent, a disabled action will be returned by
-            // create and this should be added to the menu
-            subMenu.add(selectParentAction);
-            
-            List children = new ArrayList();
-            for (Iterator it = part.getChildren().iterator(); it.hasNext();)
-            {
-                EditPart childPart = (EditPart) it.next();
-                
-                // only include selectable element edit part that are modelling
-                // XML elements in the source doc
-                if (childPart instanceof ElementEditPart
-                        && ((ElementEditPart)childPart).isSelectable()
-                        && ((ElementEditPart)childPart).getModel() instanceof Element)
-                {
-                    children.add(SelectNodeAction
-                            .create(((Element)((ElementEditPart)childPart).getModel()).getNodeName(), childPart));
-                }
-            }
-
-            
-            // don't add the select Children menu unless there are actually children
-            if (children.size() > 0)
-            {
-                MenuManager selectChildMenu = new MenuManager("Children"/*PDPlugin
-                .getResourceString("ActionGroup.Submenu.StyleClasses")*/);
-                subMenu.add(selectChildMenu);
-
-                for (final Iterator it = children.iterator(); it.hasNext();)
-                {
-                    selectChildMenu.add((Action)it.next());
-                }
-            }
-            else
-            {   // Eclipse UI guideline 6.13
-                // create the child actions even if no children but make it
-                // a disabled option if no children
-                Action childrenAction = new Action("Children"){/* do nothing*/};
-                childrenAction.setEnabled(false);
-                subMenu.add(childrenAction);
-            }
-        }
-    }
-    
-	/**
-	 * @param menu
-	 * @param part
-	 */
-	private void addStylelMenu(IMenuManager menu, ElementEditPart part,
-			IDOMElement ele) {
-        IContributionItem subMenu = 
-            menu.find(PageDesignerActionConstants.STYLE_SUBMENU_ID);
-
-        if (subMenu instanceof IMenuManager)
-        {
-            final IMenuManager subMenuManager = 
-                (IMenuManager) subMenu;
-    		addStyle(subMenuManager, part, ele);
-    		addStyleClassesMenu(subMenuManager, part, ele);
-    
-    		if (DOMStyleUtil.supportStyleAttribute(ele)) {
-    			// addBorderStyleMenu(stylesub, part, ele);
-    			addColorMenu(subMenuManager, part, ele);
-    			addBackgroundMenu(subMenuManager, part, ele);
-    		}
-        }
-	}
-
-	/**
-	 * 
-	 * @param menu
-	 * @param part
-	 * @param ele
-	 */
-	private void addStyle(IMenuManager subMenu, ElementEditPart part,
-			IDOMElement ele) {
-        StyleSupport.createStyleAction(subMenu, part, ele);
-	}
-
-	/**
-	 * @param stylesub
-	 * @param part
-	 */
-	private void addStyleClassesMenu(IMenuManager subMenu,
-			ElementEditPart part, final IDOMElement ele) {
-		final IMenuManager classmenu = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.StyleClasses"));//$NON-NLS-1$
-		StyleClassSupport.createStyleClassActions(classmenu, ele);
-
-        subMenu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE,
-                classmenu);
-	}
-
-	/**
-	 * @param stylesub
-	 * @param part
-	 */
-	private void addColorMenu(IMenuManager subMenu, ElementEditPart part,
-			final IDOMElement ele) {
-		final IMenuManager colorSub = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.Color"));//$NON-NLS-1$
-		colorSub.add(action);
-		colorSub.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				colorSub.removeAll();
-				ColorSupport.createColorActions(colorSub, ele,
-						ICSSPropertyID.ATTR_COLOR);
-			}
-		});
-        subMenu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE,
-				colorSub);
-
-	}
-
-	/**
-	 * @param stylesub
-	 * @param part
-	 */
-	private void addBackgroundMenu(IMenuManager subMenu, ElementEditPart part,
-			final IDOMElement ele) {
-		final IMenuManager colorSub = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.BackgroundColor"));//$NON-NLS-1$
-		colorSub.add(action);
-		colorSub.addMenuListener(new IMenuListener() {
-
-			public void menuAboutToShow(IMenuManager manager) {
-				colorSub.removeAll();
-				ColorSupport.createColorActions(colorSub, ele,
-						ICSSPropertyID.ATTR_BACKGROUND_COLOR);
-			}
-		});
-
-        subMenu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE,
-				colorSub);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleClassSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleClassSupport.java
deleted file mode 100644
index da13637..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleClassSupport.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.CSSUtil;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class StyleClassSupport {
-	private final static String DEFAULT = PDPlugin
-			.getResourceString("StyleClassSupport.Default");
-
-	/**
-	 * @param classmenu
-	 * @param ele 
-	 */
-	public static void createStyleClassActions(IMenuManager classmenu,
-			IDOMElement ele) {
-		String styleClassAttr = getStyleClassAttributeName(ele);
-		if (styleClassAttr == null) {
-			return; // don't support style class
-		}
-		String styleClass = getStyleClass(ele);
-
-		boolean needAdditional = true;
-		ChangeAttributeAction action = new ChangeAttributeAction(DEFAULT, ele,
-				styleClassAttr, null);
-		if (styleClass == null || styleClass.length() == 0) {
-			action.setChecked(true);
-			needAdditional = false;
-		}
-		classmenu.add(action);
-		String[] classes = CSSUtil.getCSSClasses(ele.getOwnerDocument());
-		if (classes.length > 0) {
-			classmenu.add(new Separator());
-		}
-		for (int i = 0; i < classes.length; i++) {
-			ChangeAttributeAction action2 = new ChangeAttributeAction(
-					classes[i], ele, styleClassAttr, classes[i]);
-			if (classes[i].equalsIgnoreCase(styleClass)) {
-				action2.setChecked(true);
-				needAdditional = false;
-			}
-			classmenu.add(action2);
-		}
-		if (needAdditional) {
-			ChangeAttributeAction action2 = new ChangeAttributeAction(
-					styleClass, ele, styleClassAttr, styleClass);
-			action2.setChecked(true);
-			classmenu.add(action2);
-		}
-	}
-
-	/**
-	 * @param ele
-	 * @return the style class for ele or null if none
-	 */
-	public static String getStyleClass(IDOMElement ele) {
-		String styleClassAttr = getStyleClassAttributeName(ele);
-		if (styleClassAttr != null) {
-			return ele.getAttribute(styleClassAttr);
-		}
-        return null;
-	}
-
-	/**
-	 * FIXME: This is a temparary impelementation, with everything hard coded.
-	 * In the future, should have some INodeAdapter mechanism for each node to
-	 * tell the style class attribute name.
-	 * 
-	 * @param ele
-	 * @return the style class attribute name or null if none applies
-	 */
-	public static String getStyleClassAttributeName(IDOMElement ele) {
-		CMElementDeclaration decl = CMUtil.getElementDeclaration(ele);
-		if (decl == null) {
-			return null;
-		}
-		String taguri = CMUtil.getTagURI(decl);
-		if (taguri == null || ITLDConstants.URI_HTML.equals(taguri)) {
-			if (decl.getAttributes().getNamedItem("class") != null) {
-				return "class";
-			}
-            return null;
-		} else if (decl.getAttributes().getNamedItem("styleClass") != null) {
-			return "styleClass";
-		} else if (decl.getAttributes().getNamedItem("class") != null) {
-			return "class";
-		} else {
-			return null;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleSupport.java
deleted file mode 100644
index 85a1134..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleSupport.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.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 class StyleSupport {
-	public static void createStyleAction(IMenuManager menu,
-			ElementEditPart part, IDOMElement ele) {
-		if (part == null) {
-			return;
-		}
-		if (hasStyleAttribute(ele)) {
-			IAction action = new ChangeStyleAction(part, ele);
-			menu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, action);
-		}
-	}
-
-	private static boolean hasStyleAttribute(IDOMElement ele) {
-		CMElementDeclaration decl = CMUtil.getElementDeclaration(ele);
-		if (decl == null) {
-			return false;
-		}
-		if (decl.getAttributes().getNamedItem("style") != null) {
-			return true;
-		}
-		return false;
-	}
-}
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 d52bb3c..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
- */
-public 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._tablePart;
-
-		if (tablePart == null || !supportTableActions(tablePart)) {
-			return;
-		}
-
-		final int cellRow = context._rowIndex;
-		final int cellColumn = context._columnIndex;
-
-		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 6f48192..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/table/TableOperationContext.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.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
- */
-public class TableOperationContext {
-	public ElementEditPart _tablePart;
-
-	public int _rowIndex;
-
-	public int _columnIndex;
-
-	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;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/IBodyInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/IBodyInfo.java
deleted file mode 100644
index 34dfb61..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/IBodyInfo.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.adapters;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * This is an adapter interface. Will be adapted to all the node in the
- * document. It provides additional information to support designer.
- * 
- * Basicaly it tells the correspoinding node's body related information.
- * 
- * @author mengbo
- */
-// XXX: in the future will use adapter mechanism to support dynamic information
-public interface IBodyInfo // extends INodeAdapter
-{
-	// /**
-	// * whether this node is runtime visible.
-	// *
-	// * @return
-	// */
-	// public boolean isRuntimeVisible(INodeNotifier node);
-	//    
-	// /**
-	// * whether this node is design time visible.
-	// * @return
-	// */
-	// public boolean isDesignTimeVisible(INodeNotifier node);
-
-	// /**
-	// * whether is HTML tag.
-	// * @param node
-	// * @return
-	// */
-	// public boolean isHTML(IDOMNode node);
-	//    
-	// /**
-	// * whether is JSP tag.
-	// * @param node
-	// * @return
-	// */
-	// public boolean isJSP(IDOMNode node);
-	//    
-	// /**
-	// * whether is custom tag.
-	// * @param node
-	// * @return
-	// */
-	// public boolean isCustomTag(IDOMNode node);
-	//    
-	// /**
-	// * for custom tag, there may have a corresponding HTML tag name.
-	// * This can be used for content model validation.
-	// *
-	// * @param node
-	// * @return
-	// */
-	// public String getCorrespondingHTMLTag(IDOMNode node);
-
-	/**
-	 * whether this node is body node. We treat the document node and certain
-	 * element node like "HTML", "BODY", "f:view", "f:subview" as body node. At
-	 * design time we may want to move those visual node into the body.
-	 * 
-	 * @param node 
-	 * @return true if node is a body container
-	 */
-	public boolean isBodyContainer(IDOMNode node);
-
-	/**
-	 * this method should only be called isBodyContainer return true; It checks
-	 * whether the uri/localname should belong to the head part of this body
-	 * container.
-	 * 
-	 * @param node 
-	 * @param uri
-	 * @param localname
-	 * @return true if node is a header
-	 */
-	public boolean isBodyHeader(IDOMNode node, String uri, String localname);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/internal/BodyInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/internal/BodyInfo.java
deleted file mode 100644
index 5d9c498..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/internal/BodyInfo.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.adapters.internal;
-
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.adapters.IBodyInfo;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-// XXX: currently hardcoded as sigleton implementation,
-// it is believed in the future will not use singleton, because we want to
-// dynamically
-// support other taglibs.
-public class BodyInfo implements IBodyInfo {
-	private static final BodyInfo _instance = new BodyInfo();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.adapters.IDesignInfo#isBodyContainer(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier)
-	 */
-	public boolean isBodyContainer(IDOMNode node) {
-		switch (node.getNodeType()) {
-		case Node.DOCUMENT_FRAGMENT_NODE:
-		case Node.DOCUMENT_NODE:
-			return true;
-		case Node.ELEMENT_NODE:
-			return isBodyContainerElement((Element) node);
-		default:
-			return false;
-		}
-	}
-
-	/**
-	 * @param element
-	 * @return
-	 */
-	private boolean isBodyContainerElement(Element element) {
-		String localname = element.getLocalName();
-		/*
-		 * String namespaceURI = CMUtil.getElementNamespaceURI(element); if
-		 * (IJMTConstants.URI_HTML.equals(namespaceURI)) { return
-		 * "html".equalsIgnoreCase(localname) ||
-		 * "body".equalsIgnoreCase(localname); } if
-		 * (IJMTConstants.URI_JSF_CORE.equals(namespaceURI)) { return
-		 * "view".equals(localname) || "subview".equals(localname); }
-		 */
-		return IHTMLConstants.TAG_HTML.equalsIgnoreCase(localname)
-				|| IHTMLConstants.TAG_BODY.equalsIgnoreCase(localname)
-				|| IJSFConstants.TAG_VIEW.equals(localname)
-				|| IJSFConstants.TAG_SUBVIEW.equals(localname);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.adapters.IDesignInfo#isBodyHeader(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      java.lang.String, java.lang.String)
-	 */
-	public boolean isBodyHeader(IDOMNode node, String uri, String localname) {
-		switch (node.getNodeType()) {
-		case Node.DOCUMENT_FRAGMENT_NODE:
-		case Node.DOCUMENT_NODE:
-			return isDocumentHeader(uri, localname);
-		case Node.ELEMENT_NODE:
-			return isElementHeader((Element) node, uri, localname);
-		default:
-			return false;
-		}
-	}
-
-	/**
-	 * @param element
-	 * @param uri
-	 * @param localname
-	 * @return
-	 */
-	private boolean isElementHeader(Element element, String uri,
-			String localname) {
-		String elelocalname = element.getLocalName();
-		String namespaceURI = CMUtil.getElementNamespaceURI(element);
-		if (ITLDConstants.URI_HTML.equals(namespaceURI)
-				&& IHTMLConstants.TAG_HTML.equalsIgnoreCase(elelocalname)) {
-			return IHTMLConstants.TAG_HEAD.equalsIgnoreCase(localname);
-		}
-		if (ITLDConstants.URI_JSF_CORE.equals(namespaceURI)
-				&& IJSFConstants.TAG_VIEW.equalsIgnoreCase(elelocalname)) {
-			return IJSFConstants.TAG_LOADBUNDLE.equalsIgnoreCase(localname);
-		}
-		return false;
-	}
-
-	/**
-	 * @param uri
-	 * @param localname
-	 * @return
-	 */
-	private boolean isDocumentHeader(String uri, String localname) {
-		// FIXME: temparary commented out, since the dragged node do not have
-		// uri information for now.
-		// if (IJMTConstants.URI_JSP.equals(uri))
-		return IJSPCoreConstants.TAG_DIRECTIVE_PAGE.equals(localname)
-				|| IJSPCoreConstants.TAG_DIRECTIVE_TAGLIB.equals(localname);
-
-	}
-
-	/**
-	 * @return the singleton
-	 */
-	public static IBodyInfo getInstance() {
-		return _instance;
-	}
-
-	private BodyInfo()
-	{
-	    // no external instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CloneNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CloneNodeCommand.java
deleted file mode 100644
index c618210..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CloneNodeCommand.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * This is when user control+mouse drag. Can also be used in other places.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class CloneNodeCommand extends DesignerCommand {
-	IDOMPosition _insertPosition;
-
-	Node _originalNode;
-
-	Node _resultNode;
-
-	/**
-	 * @param viewer
-	 * @param insertionPoint 
-	 * @param originalNode 
-	 */
-	public CloneNodeCommand(IHTMLGraphicalViewer viewer,
-			IDOMPosition insertionPoint, Node originalNode) {
-		super(
-				CommandResources.getString("CloneNodeCommand.Label.CloneNode"), viewer); //$NON-NLS-1$
-		this._insertPosition = insertionPoint;
-		this._originalNode = originalNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		Node newNode = DOMUtil.cloneNodeDeep(this.getDocument(), _originalNode);
-		DOMUtil.insertNode(_insertPosition, newNode);
-		_resultNode = newNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_resultNode);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.java
deleted file mode 100644
index c18db16..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CommandResources {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.commands.CommandResources"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(BUNDLE_NAME);
-
-	private CommandResources() {
-        // no local instantiation
-	}
-
-	/**
-	 * @param key
-	 * @return the resource value for key or  !key! if not foudnd
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.properties
deleted file mode 100644
index 465ddff..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.properties
+++ /dev/null
@@ -1,32 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 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
-###############################################################################
-PasteNodeCommand.Label.DeleteNode=Delete Node
-CutNodeCommand.Label.CutNode=Cut Node
-DeleteNodeCommand.Label.DeleteNode=Delete Node
-DeleteAction.CommandLabel.Delete=Delete
-TableDeleteColumnCommand.Label.DeleteColumn=Delete Column
-TableInsertColumnCommand.Label.InsertColumn=Insert Column
-TableResizeColumnCommand.Label.ResizeColumn=Resize Column
-TableResizeRowCommand.Label.ResizeColumn=Resize Column
-TableDeleteRowCommand.Label.DeleteRow=Delete Row
-TableInsertRowCommand.Label.InsertRow=Insert Row
-TableDeleteHeaderFooterCommand.Label.DeleteHeader=Delete Header
-TableDeleteHeaderFooterCommand.Label.DeleteFooter=Delete Footer
-TableInsertHeaderFooterCommand.Label.InsertHeader=Insert Header
-TableInsertHeaderFooterCommand.Label.InsertFooter=Insert Footer
-PasteCommand.Label.Paste=Paste
-DeleteCommand.Label.Delete=Delete
-CutCommand.Label.Cut=Cut
-CopyCommand.Label.Copy=Copy
-ApplyStyleCommand.Label.ApplyStyle=Apply Style
-ChangeStyleCommand.Label.ChangeStyle=Change Style
-MoveNodeCommand.Label.MoveNode=Move Node
-CloneNodeCommand.Label.CloneNode=Copy Node
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyAction.java
deleted file mode 100644
index 2502ac3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyAction.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.gef.ui.parts.GraphicalEditor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.range.CopyCommand;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class CopyAction extends DesignAction implements UpdateAction {
-	/**
-	 * @param editor
-	 */
-	public CopyAction(GraphicalEditor editor) {
-		super(editor, PDPlugin.getResourceString("Action.Name.Copy"));//$NON-NLS-1$
-		// this.setAccelerator(SWT.CTRL | SWT.INSERT);
-		// this.setActionDefinitionId(ITextEditorActionDefinitionIds.CUT);
-	}
-
-	public void perform() {
-		DesignerCommand command = null;
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer.isInRangeMode()) {
-			command = new CopyCommand(viewer);
-			command.execute();
-		} else {
-			Command nodeCopy = new CopyNodeCommand(viewer);
-			nodeCopy.execute();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#isEnabled()
-	 */
-	public boolean isEnabled() {
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer != null) {
-			if (viewer.isInRangeMode()
-					&& !EditModelQuery.isSame(viewer.getRangeSelection())) {
-				return true;
-			} else if (!viewer.isInRangeMode()
-					&& viewer.getSelectedEditParts().size() > 0) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.actions.UpdateAction#update()
-	 */
-	public void update() {
-		this.setEnabled(isEnabled());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyNodeCommand.java
deleted file mode 100644
index dd9900c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyNodeCommand.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.w3c.dom.Node;
-
-/**
- * As copy operation won't change anything in the current document, so it is not
- * extending from DesignerCommand.
- * 
- * @author mengbo
- */
-public class CopyNodeCommand extends Command {
-	private IHTMLGraphicalViewer _viewer;
-
-	/**
-	 * @param viewer
-	 */
-	public CopyNodeCommand(IHTMLGraphicalViewer viewer) {
-		super("");
-		this._viewer = viewer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	public void execute() {
-		List parts = _viewer.getSelectedEditParts();
-		Vector result = new Vector();
-		if (parts.size() > 0) {
-			for (int i = 0, n = parts.size(); i < n; i++) {
-				EditPart part = (EditPart) parts.get(i);
-				Object model = part.getModel();
-				if (model instanceof Node) {
-					EditValidateUtil.validNode((Node) model);
-					result.add(((Node) model).cloneNode(true));
-				}
-			}
-			setClipboard(result);
-		}
-	}
-
-	private void setClipboard(Vector result) {
-		Node[] nodes = (Node[]) result.toArray(new Node[result.size()]);
-		StringBuffer sb = new StringBuffer();
-		for (int i = 0, size = nodes.length; i < size; i++) {
-			DOMUtil.nodeToString(nodes[i], sb);
-		}
-		// TemplateTransfer.getInstance().setObject(result);
-		Clipboard board = new Clipboard(_viewer.getControl().getDisplay());
-		board.setContents(new Object[] { result, sb.toString() },
-				new Transfer[] { TemplateTransfer.getInstance(),
-						TextTransfer.getInstance() });
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CreateItemCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CreateItemCommand.java
deleted file mode 100644
index e6c6acb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CreateItemCommand.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.commands;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.jst.pagedesigner.utils.CommandUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class CreateItemCommand extends DesignerCommand {
-	private final IDOMPosition _position;
-
-	private final TagToolPaletteEntry _tagItem;
-	private Element _ele;
-	private IAdaptable _customizationData;
-
-	/**
-	 * @param label
-	 * @param model 
-	 * @param position 
-	 * @param tagItem 
-	 */
-	public CreateItemCommand(String label, IDOMModel model,
-			IDOMPosition position, TagToolPaletteEntry tagItem) {
-		super(label, model.getDocument());
-		this._position = position;
-		this._tagItem = tagItem;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		Element element = CommandUtil.excuteInsertion(this._tagItem,
-				getModel(), this._position, this._customizationData);
-		if (element != null) {
-			formatNode(element);
-		}
-		this._ele = element;
-	}
-
-	@Override
-    protected void postPostExecute() 
-	{
-        // during JUnit testing, we may not have viewer.
-        // this will cause us not to have undo support,
-        // but should not effect testing for this command
-	    if (getViewer() != null)
-        {
-            super.postPostExecute();
-        }
-    }
-
-    @Override
-    protected boolean prePreExecute() 
-    {
-        // during JUnit testing, we may not have viewer.
-        // this will cause us not to have undo support,
-        // but should not effect testing for this command
-        if (getViewer() != null)
-        {
-            return super.prePreExecute();
-        }
-        
-        return true;
-    }
-
-    /*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_ele);
-	}
-
-    /**
-     * @param customizationData
-     */
-    public void setCustomizationData(IAdaptable customizationData) 
-    {
-        _customizationData = customizationData;
-    }
-    
-    /**
-     * This method is for test purposes and should generally not be 
-     * used by clients.
-     * 
-     * @return the customization data
-     */
-    protected final IAdaptable getCustomizationData()
-    {
-        return _customizationData;
-    }
-}
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 40c23a8..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.HTMLGraphicalViewer;
-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) ((HTMLGraphicalViewer) viewer)
-					.getEditDomain()).getEditorPart());
-			_viewer = editor.getTextEditor().getTextViewer();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		Element element = ((Element) _part.getModel());
-		String width = element.getAttribute(ICSSPropertyID.ATTR_WIDTH);
-		// String height = element.getAttribute(ICSSPropertyID.ATTR_HEIGHT);
-		String originalStyle = element.getAttribute(ICSSPropertyID.ATTR_STYLE);
-		StringBuffer style;
-		if (originalStyle != null) {
-			originalStyle = this.removeOthers(originalStyle,
-					ICSSPropertyID.ATTR_WIDTH);
-			originalStyle = this.removeOthers(originalStyle,
-					ICSSPropertyID.ATTR_HEIGHT);
-			style = new StringBuffer(originalStyle);
-		} else {
-			style = new StringBuffer(50);
-		}
-		if (null == width) {
-			style.append(";").append(ICSSPropertyID.ATTR_WIDTH).append(":")
-					.append(((Rectangle) _constraint).width).append(";");
-			style.append(ICSSPropertyID.ATTR_HEIGHT).append(":").append(
-					((Rectangle) _constraint).height).append("");
-		}
-		element.setAttribute(ICSSPropertyID.ATTR_STYLE, style.toString());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#redo()
-	 */
-	public void redo() {
-		_viewer.doOperation(ITextOperationTarget.REDO);
-	}
-
-	/**
-	 * @param style
-	 * @param item
-	 * @return ?
-	 */
-	public String removeOthers(String style, String item) {
-		String result = null;
-		int pos = style.indexOf(item);
-		if (pos < 0) {
-			return style;
-		}
-		int pos1 = pos;
-		if (pos > 0) {
-			if (style.charAt(pos - 1) == ';') {
-				pos--;
-			}
-		}
-		char ch = style.charAt(pos1);
-		while (!(ch == ';' || ch == '"' || ch == '\'')) {
-			pos1++;
-			if (pos1 >= style.length()) {
-				break;
-			}
-			ch = style.charAt(pos1);
-		}
-		if (pos1 < style.length()) {
-			result = style.substring(0, pos)
-					+ style.substring(pos1 + 1, style.length());
-		} else {
-			result = style.substring(0, pos);
-		}
-		if (result.indexOf(item) >= 0) {
-			return removeOthers(result, item);
-		}
-        return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#undo()
-	 */
-	public void undo() {
-		_viewer.doOperation(ITextOperationTarget.UNDO);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignerCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignerCommand.java
deleted file mode 100644
index 6be92b1..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
-	 * @deprecated Should remove command coupling to non-model objects
-	 */
-	public IHTMLGraphicalViewer getViewer() {
-		return _viewer;
-	}
-
-	/**
-	 * @return the DOM model that this command will effect
-	 */
-	public IDOMModel getModel() {
-		return _model;
-	}
-
-	/**
-	 * @return the dom document for the model this command will effect
-	 */
-	public IDOMDocument getDocument() {
-		return getModel().getDocument();
-	}
-
-	/**
-	 * executes the Command. This method should not be called if the Command is
-	 * not executable.
-	 */
-	public final void execute() {
-		boolean ok = prePreExecute();
-		if (ok) {
-			try {
-				preExecute();
-				doExecute();
-				postExecute();
-			} catch (Exception ex) {
-				handleException(ex);
-			} finally {
-				postPostExecute();
-			}
-		}
-	}
-
-	/**
-	 * child class can override.
-	 * 
-	 * @param ex
-	 */
-	protected void handleException(Exception ex) {
-		ex.printStackTrace();
-	}
-
-	/**
-	 * prePreExecute and postPostExecute is a pair. prePreExecute() SHOULD NOT
-	 * throw any exception, if it throw any exception, it should catch itself
-	 * and return false to indicate not continue.
-	 * @return true if execution should continue, false if should not 
-	 */
-	protected boolean prePreExecute() {
-		int position = -1;
-		int length = -1;
-		ISelection selection = getViewer().getSelection();
-		if (selection != null) {
-			if (getViewer().isInRangeMode()) {
-				DesignRange range = (DesignRange) selection;
-				if (range.isValid()) {
-					IDOMPosition domPos = DOMPositionHelper.toDOMPosition(range
-							.getStartPosition());
-					IDOMPosition domEnd = DOMPositionHelper.toDOMPosition(range
-							.getEndPosition());
-					if (EditValidateUtil.validPosition(domPos)
-							&& EditValidateUtil.validPosition(domEnd)) {
-						position = EditModelQuery
-								.getIndexedRegionLocation(domPos);
-						int end = EditModelQuery
-								.getIndexedRegionLocation(domEnd);
-						if (end < position) {
-							length = position - end;
-							position = end;
-						} else {
-							length = end - position;
-						}
-					}
-				}
-			} else {
-				Object object = ((IStructuredSelection) selection)
-						.getFirstElement();
-				if (object instanceof ElementEditPart) {
-					Node node = ((ElementEditPart) object).getIDOMNode();
-					position = EditModelQuery.getNodeStartIndex(node);
-					length = EditModelQuery.getNodeLenth(node);
-				}
-			}
-		}
-		if (position >= 0 && length >= 0) {
-			getModel().beginRecording(this, getLabel(), position, length);
-		} else {
-			getModel().beginRecording(this, getLabel());
-		}
-		getViewer().startSelectionChange();
-		getModel().aboutToChangeModel();
-		return true;
-	}
-
-	/**
-	 * child class can override this method for any pre action.
-	 */
-	protected void preExecute() {
-        // does nothing; children may wish to implement
-	}
-
-	/**
-	 * child class should override this method for the real action.
-	 */
-	protected abstract void doExecute();
-
-	/**
-	 * child class can override this method for any post action. NOTE: if
-	 * preExecute() or doExecute() throw exception, then this method will NOT be
-	 * called.
-	 */
-	protected void postExecute() {
-        // does nothing; child may wish to implement
-	}
-
-	/**
-	 * if prePreExecute() return true, then this method will always be called
-	 * even preExecute()/doExecute() and postExecute() fail.
-	 */
-	protected void postPostExecute() {
-		getModel().changedModel();
-
-		// after "changedModel()" is called, model will fire out batched events
-		// about model change
-		// and EditPart will be refreshed. Only at this time, could we use
-		// EditPart to construct the
-		// result selection.
-
-		// enforce a validate, so things get layed out, thus all the figures
-		// will be valid.
-		this.getViewer().getViewport().validate();
-
-		ISelection sel = getAfterCommandDesignerSelection();
-		if (sel != null) {
-			ITextSelection textSel = SelectionHelper
-					.convertFromDesignSelectionToTextSelection(sel);
-			if (textSel != null) {
-				getModel().endRecording(this, textSel.getOffset(),
-						textSel.getLength());
-			} else {
-				getModel().endRecording(this);
-			}
-		} else {
-			getModel().endRecording(this);
-		}
-
-		if (sel != null) {
-			getViewer().setSelection(sel);
-		} else {
-			getViewer().deselectAll();
-		}
-		if (getViewer() != null) {
-			getViewer().selectionChanged();
-		}
-	}
-
-	/**
-	 * child class should override this method to provide the selection after
-	 * command. This method is called after model changed. So at time of this
-	 * call, the editpart should be valid. Default implementation.
-	 * 
-	 * @return the selection
-	 */
-	protected abstract ISelection getAfterCommandDesignerSelection();
-
-	/**
-	 * @param range
-	 * @return a selection that contains the dom range or null if one doesn't exist
-	 */
-	protected ISelection toDesignRange(DOMRange range) {
-		try {
-			if (range == null) {
-				return null;
-			}
-			IDOMPosition startPos = range.getStartPosition();
-			DesignPosition start = DOMPositionHelper.toDesignPosition(startPos);
-			if (range.isEmpty()) {
-				return new DesignRange(start, start);
-			}
-            IDOMPosition endPos = range.getEndPosition();
-            return new DesignRange(start, DOMPositionHelper
-            		.toDesignPosition(endPos));
-		} catch (Exception e) {
-			// "Selection error"
-			_log.error("Error.RangeModeCommand.SetSelection"); //$NON-NLS-1$
-			return null;
-		}
-
-	}
-
-	/**
-	 * @param node
-	 * @return a selection for the node
-	 */
-	protected IStructuredSelection toDesignSelection(Node node) {
-		if (node instanceof INodeNotifier) {
-			EditPart part = (EditPart) ((INodeNotifier) node)
-					.getAdapterFor(EditPart.class);
-			if (part != null) {
-				return new StructuredSelection(part);
-			}
-		}
-		return null;
-	}
-
-	//    
-	// /**
-	// * set selection to the specified node. Normally called by child class in
-	// <code>setSelection()</code> implementation.
-	// *
-	// * @param node
-	// */
-	// protected final void setSelection(Node node)
-	// {
-	// EditPart part = (EditPart) ((INodeNotifier)
-	// node).getAdapterFor(EditPart.class);
-	//
-	// StructuredSelection sel = new StructuredSelection(part);
-	// getViewer().setSelection(sel);
-	// }
-
-	/**
-	 * format the specified node in source code. Utility method that can be
-	 * called by child classes
-	 * 
-	 * @param node
-	 */
-	public void formatNode(Node node) {
-		// XXX: there should have some other way to get the FormatProcessor.
-		// currently hardcoded to HTMLFormatProcessorImpl().
-		new HTMLFormatProcessorImpl().formatNode(node);
-	}
-
-	/**
-	 * Re-executes the Command. This method should only be called after
-	 * <code>undo()</code> has been called.
-	 */
-	public void redo() {
-		// this method should in fact never be called, because we have already
-		// delegate undo
-		// operations to source view.
-		getModel().getUndoManager().redo();
-	}
-
-	/**
-	 * Undoes the changes performed during <code>execute()</code>. This
-	 * method should only be called after <code>execute</code> has been
-	 * called, and only when <code>canUndo()</code> returns <code>true</code>.
-	 * 
-	 * @see #canUndo()
-	 */
-	public void undo() {
-		// this method should in fact never be called, because we have already
-		// delegate undo
-		// operations to source view.
-		getModel().getUndoManager().undo();
-	}
-
-	/**
-	 * a utility method. NOTE: this method can ONLY be called BEFORE you change
-	 * anything in the model.
-	 * 
-	 * @param ele
-	 * @return the figure info for the  element
-	 */
-	public IFigure getFigureInfo(Element ele) {
-		if (ele instanceof IDOMElement) {
-			EditPart part = (EditPart) ((IDOMElement) ele)
-					.getAdapterFor(EditPart.class);
-			if (part instanceof GraphicalEditPart) {
-				return ((GraphicalEditPart) part).getFigure();
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/MoveNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/MoveNodeCommand.java
deleted file mode 100644
index 327a2c7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/MoveNodeCommand.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * Move a node from one place to another place.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class MoveNodeCommand extends DesignerCommand {
-	private IDOMPosition insertPosition;
-
-	private Node originalNode;
-
-	/**
-	 * @param viewer
-	 * @param insertionPoint 
-	 * @param originalNode 
-	 */
-	public MoveNodeCommand(IHTMLGraphicalViewer viewer,
-			IDOMPosition insertionPoint, Node originalNode) {
-		super(
-				CommandResources.getString("MoveNodeCommand.Label.MoveNode"), viewer); //$NON-NLS-1$
-		this.insertPosition = insertionPoint;
-		this.originalNode = originalNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		getModel().beginRecording(this);
-		try {
-			Node originalParent = originalNode.getParentNode();
-			if (originalParent == null) {
-				return;
-			}
-			// when remove the _originalNode, may affect the insertionPosition.
-			if (originalParent == insertPosition.getContainerNode()) {
-				// under same parent, may affect it.
-				int insertIndex = insertPosition.getOffset();
-				int nodeIndex = -1;
-				NodeList list = originalParent.getChildNodes();
-				for (int i = 0, length = list.getLength(); i < length; i++) {
-					if (originalNode == list.item(i)) {
-						nodeIndex = i;
-					}
-				}
-				if (nodeIndex == -1) {
-					return; // should not happen.
-				}
-				if (insertIndex < nodeIndex) {
-					insertPosition = new DOMPosition(originalParent,
-							insertIndex);
-				} else if (insertIndex == nodeIndex
-						|| insertIndex == nodeIndex + 1) {
-					// move to same position, do nothing.
-					return;
-				} else {
-					insertPosition = new DOMPosition(originalParent,
-							insertIndex - 1);
-				}
-			}
-			originalParent.removeChild(originalNode);
-			DOMUtil.insertNode(insertPosition, originalNode);
-		} finally {
-			getModel().endRecording(this);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(originalNode);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDDropRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDDropRequest.java
deleted file mode 100644
index 75c1fcf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDDropRequest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.swt.dnd.DropTargetEvent;
-
-/**
- * @author mengbo
- */
-public class PDDropRequest extends Request implements DropRequest {
-	private Point _location;
-
-	private DropTargetEvent _currentEvent;
-
-	/**
-	 * 
-	 */
-	public PDDropRequest() {
-		setType(PDRequestConstants.REQ_DROP);
-	}
-
-	/**
-	 * Returns the location of the object to be created.
-	 * 
-	 * @return the location
-	 */
-	public Point getLocation() {
-		return _location;
-	}
-
-	/**
-	 * Sets the location where the new object will be placed.
-	 * 
-	 * @param location
-	 *            the location
-	 */
-	public void setLocation(Point location) {
-		this._location = location;
-	}
-
-	/**
-	 * @param ev
-	 */
-	public void setCurrentEvent(DropTargetEvent ev) {
-		_currentEvent = ev;
-	}
-
-	/**
-	 * @return the current drop target event
-	 */
-	public DropTargetEvent getCurrentEvent() {
-		return _currentEvent;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDRequestConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDRequestConstants.java
deleted file mode 100644
index ca4aa70..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDRequestConstants.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-/**
- * @author mengbo
- */
-public interface PDRequestConstants {
-
-	/**
-	 * TODO: purpose?
-	 */
-	String REQ_DROP = "pd drop";
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PaletteDropInsertCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PaletteDropInsertCommand.java
deleted file mode 100644
index dc3ca56..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PaletteDropInsertCommand.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.commands;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dnd.internal.SourceViewerDragDropHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.jst.pagedesigner.itemcreation.command.SingletonContainerCreationCommand;
-import org.eclipse.jst.pagedesigner.utils.CommandUtil;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class PaletteDropInsertCommand extends SourceViewerCommand {
-	private final Logger _log = PDPlugin
-			.getLogger(PaletteDropInsertCommand.class);
-
-	private TagToolPaletteEntry _tagItem;
-
-	private int _location;
-
-	private List _nodesToFormat = new ArrayList();
-
-	private Element _element;
-
-	/**
-	 * @param label
-	 * @param editor
-	 * @param tagItem
-	 * @param location
-	 */
-	public PaletteDropInsertCommand(String label, StructuredTextEditor editor,
-			TagToolPaletteEntry tagItem, int location) {
-		super(label, editor);
-		_tagItem = tagItem;
-		_location = location;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void doExecute() {
-		IDOMModel model = getModel();
-		try {
-			Node node = getSourceEditingTextTools().getNode(_location);
-			IDOMPosition position = null;
-			if (node != null) {
-				position = SourceViewerDragDropHelper.getInstance()
-						.findPosition(_location, node);
-			} else {
-				// empty file
-				position = new DOMPosition(getModel().getDocument(), 0);
-			}
-			Assert.isTrue(position != null);
-			if (!_tagItem.getURI().equalsIgnoreCase(ITLDConstants.URI_HTML)
-					&& //
-					!_tagItem.getURI().equalsIgnoreCase(
-							ITLDConstants.URI_JSP)) {
-			    SingletonContainerCreationCommand command = 
-			        new SingletonContainerCreationCommand
-			            (position, IJSFConstants.TAG_IDENTIFIER_VIEW, null);
-			    command.execute();
-			    Iterator it = command.getResult().iterator();
-			    
-			    if (it.hasNext())
-			    {
-	                position = command.getResult().iterator().next();
-			    }
-			    else
-			    {
-			        throw new IllegalStateException("Expected result of command");
-			    }
-			}
-			_element = CommandUtil
-					.excuteInsertion(_tagItem, model, position, null);
-			if (_element != null) {
-				_nodesToFormat.add(_element);
-				SourceViewerDragDropHelper.getInstance().changeCaret(_editor,
-						true);
-				formatNodes();
-			}
-		} catch (Exception e) {
-			_log.error("Bad text insertion location", e);
-		}
-	}
-
-
-	 //TODO: dead	/*
-//	 * (non-Javadoc)
-//	 * 
-//	 * @see org.eclipse.jst.pagedesigner.requests.NodeCreationFactory#getPrefix(int)
-//	 */
-//	public String getPrefix(String uri, IDOMModel model, String suggested,
-//			Node nodes[]) {
-//		if (ITLDConstants.URI_HTML.equals(uri)
-//				|| ITLDConstants.URI_JSP.equals(uri)) {
-//			return null;
-//		}
-//
-//		// now handles custom tag lib
-//
-//		return JSPUtil.getOrCreatePrefix(model, uri, suggested, nodes);
-//	}
-
-	public void setSelection() {
-		if (_element != null) {
-			int offset = EditModelQuery.getNodeStartIndex(_element);
-			int length = EditModelQuery.getNodeEndIndex(_element) - offset;
-			_editor.getTextViewer().setSelectedRange(offset, length);
-		}
-	}
-
-	private void formatNodes() {
-		for (int i = 0, n = _nodesToFormat.size(); i < n; i++) {
-			formatNode((Node) _nodesToFormat.get(i));
-		}
-	}
-}
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 f105e3d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/SourceViewerCommand.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 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 {
-	protected StructuredTextEditor _editor;
-
-	private Document _document;
-
-	private Logger _log = PDPlugin.getLogger(SourceViewerCommand.class);
-
-	/**
-	 * 
-	 */
-	public SourceViewerCommand(String label, StructuredTextEditor editor) {
-		super();
-		_editor = editor;
-		IDOMSourceEditingTextTools tools = getSourceEditingTextTools();
-		_document = tools.getDOMDocument();
-	}
-
-	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.
-	 */
-	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);
-	}
-
-	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();
-			}
-		}
-	}
-
-	public abstract void doExecute();
-
-	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 fced248..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/SwitchSelectionCommand.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.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;
-
-public class SwitchSelectionCommand extends Command {
-	IHTMLGraphicalViewer _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 31248a9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteHeaderFooterCommand.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.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;
-
-	public TableDeleteHeaderFooterCommand(IHTMLGraphicalViewer viewer,
-			Element table, boolean isHeader) {
-		super(
-				isHeader ? CommandResources
-						.getString("TableDeleteHeaderFooterCommand.Label.DeleteHeader") : CommandResources.getString("TableDeleteHeaderFooterCommand.Label.DeleteFooter"), viewer); //$NON-NLS-1$ //$NON-NLS-2$
-		this._table = table;
-		this._isHeader = isHeader;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		String sectionName = this._isHeader ? IHTMLConstants.TAG_THEAD
-				: IHTMLConstants.TAG_TFOOT;
-		int rows = TableUtil.countSectionRows(this._table, sectionName);
-		if (rows == 0) {
-			return false;
-		}
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		String sectionName = this._isHeader ? IHTMLConstants.TAG_THEAD
-				: IHTMLConstants.TAG_TFOOT;
-		List list = DOMUtil.getChildElementsByTagIgnoreCase(this._table,
-				sectionName);
-		Node delNode = (Node) list.get(0);
-		this._table.removeChild(delNode);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return this.toDesignSelection(this._table);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteRowCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteRowCommand.java
deleted file mode 100644
index 3ee5ea7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteRowCommand.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableDeleteRowCommand extends DesignerCommand {
-	Element _tableEle;
-
-	int _rowIndex;
-
-	/**
-	 * @param viewer
-	 * @param table
-	 * @param index
-	 */
-	public TableDeleteRowCommand(IHTMLGraphicalViewer viewer, Element table,
-			int index) {
-		super(CommandResources
-				.getString("TableDeleteRowCommand.Label.DeleteRow"), viewer); //$NON-NLS-1$
-		this._tableEle = table;
-		this._rowIndex = index;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		if (this._rowIndex < 0) {
-			return false;
-		}
-		List list = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, list);
-		// int index = TableUtil.countRowIndexInDOMTree(this._tableEle,
-		// this._rowIndex);
-		int index = this._rowIndex;
-		Element tr = (Element) list.get(index);
-		boolean hasRowSpan = TableUtil.hasRowSpanElement(tr);
-		boolean isAffectedByRowSpan = TableUtil.isAffectedByRowSpan(list, tr,
-				index);
-		if (hasRowSpan || isAffectedByRowSpan) {
-			return false;
-		}
-
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		List list = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, list);
-		// int index = TableUtil.countRowIndexInDOMTree(this._tableEle,
-		// this._rowIndex);
-		int index = this._rowIndex;
-		Element tr = (Element) list.get(index);
-		tr.getParentNode().removeChild(tr);
-		formatNode(this._tableEle);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertColumnCommand.java
deleted file mode 100644
index 4db65c8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertColumnCommand.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableInsertColumnCommand extends DesignerCommand {
-	private Element _tableEle;
-
-	private int _columnIndex;
-
-	private TableUtil _tableUtil;
-
-	/**
-	 * @param viewer
-	 * @param dataTable
-	 * @param index
-	 */
-	public TableInsertColumnCommand(IHTMLGraphicalViewer viewer,
-			Element dataTable, int index) {
-		super(
-				CommandResources
-						.getString("TableInsertColumnCommand.Label.InsertColumn"), viewer); //$NON-NLS-1$
-		this._tableEle = dataTable;
-		this._columnIndex = index;
-		this._tableUtil = new TableUtil(this._tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		if (this._columnIndex < 0) {
-			return false;
-		}
-		boolean isAffectedByColSpan = _tableUtil
-				.isAffectedByColSpan(this._columnIndex);
-		if (isAffectedByColSpan) {
-			return false;
-		}
-
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		List trList = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, trList);
-
-		List[] lists = _tableUtil.getTrCellLists();
-		int maxColumn = _tableUtil.getColumnCount();
-
-		boolean isAtLastColumn = false;
-		if (this._columnIndex >= maxColumn) {
-			isAtLastColumn = true;
-		}
-
-		for (int i = 0, size = trList.size(); i < size; i++) {
-			Element tr = (Element) trList.get(i);
-			boolean hasTH = (DOMUtil.getChildElementsByTagIgnoreCase(tr,
-					IHTMLConstants.TAG_TH).size() > 0);
-
-			List cells = lists[i];
-			if (isAtLastColumn || (cells.size() <= this._columnIndex)) {
-				int index = this._columnIndex + 1;
-				for (int k = cells.size(); k < index; k++) {
-					tr.appendChild(createDefaultElement(hasTH));
-				}
-			} else {
-				Element cell = (Element) cells.get(this._columnIndex);
-				if (!cell.getTagName().equalsIgnoreCase("fake")) //$NON-NLS-1$
-				{
-					tr.insertBefore(createDefaultElement(hasTH), cell);
-				} else {
-					boolean hasRealElement = false;
-					for (int k = _columnIndex + 1; k < cells.size(); k++) {
-						Element td = (Element) cells.get(k);
-						if (!td.getTagName().equalsIgnoreCase("fake")) //$NON-NLS-1$
-						{
-							hasRealElement = true;
-							tr.insertBefore(createDefaultElement(hasTH), td);
-							break;
-						}
-					}
-					if (!hasRealElement) {
-						tr.appendChild(createDefaultElement(hasTH));
-					}
-				}
-			}
-
-		}
-		formatNode(this._tableEle);
-	}
-
-	private Element createDefaultElement(boolean createTH) {
-		Document doc = this._tableEle.getOwnerDocument();
-		Element td = null;
-		if (createTH) {
-			td = doc.createElement(IHTMLConstants.TAG_TH);
-		} else {
-			td = doc.createElement(IHTMLConstants.TAG_TD);
-		}
-
-		Node node = doc.createTextNode(""); //$NON-NLS-1$
-		td.appendChild(node);
-		return td;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertHeaderFooterCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertHeaderFooterCommand.java
deleted file mode 100644
index 49b33b5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertHeaderFooterCommand.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.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;
-
-	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 d725b31..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertRowCommand.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.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
-	 */
-	public TableInsertRowCommand(IHTMLGraphicalViewer viewer, Element table,
-			int index, boolean isBefore) {
-		super(CommandResources
-				.getString("TableInsertRowCommand.Label.InsertRow"), viewer); //$NON-NLS-1$
-		this._tableEle = table;
-		this._rowIndex = index;
-		this._isBefore = isBefore;
-		this._tableUtil = new TableUtil(this._tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		if (this._rowIndex < 0) {
-			return false;
-		}
-		List list = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, list);
-		// if the row neither at the beginning nor the end then count
-		if (_rowIndex > 0 && _rowIndex < list.size()) {
-			// int index = TableUtil.countRowIndexInDOMTree(this._tableEle,
-			// this._rowIndex);
-			int index = this._rowIndex;
-			Element tr = (Element) list.get(index);
-			boolean isAffectedByRowSpan = TableUtil.isAffectedByRowSpan(list,
-					tr, index);
-			if (isAffectedByRowSpan) {
-				return false;
-			}
-
-		}
-
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		List list = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, list);
-		Element insertElement = createDefaultElement();
-
-		if (this._rowIndex < list.size()) {
-			// int index = TableUtil.countRowIndexInDOMTree(this._tableEle,
-			// this._rowIndex);
-			int index = this._rowIndex;
-			Element tr = (Element) list.get(index);
-			Element nextTr = tr;
-
-			// int headRows = TableUtil.countSectionRows(this._tableEle,
-			// IHTMLConstants.TAG_THEAD);
-			// int footRows = TableUtil.countSectionRows(this._tableEle,
-			// IHTMLConstants.TAG_TFOOT);
-			if (!_isBefore) {
-				int parentIndex = index - 1;
-				/**
-				 * doesn't need any more,since the row index is from model now
-				 * int bodyRows = list.size() - headRows - footRows; boolean
-				 * hasBodyRow = false; boolean hasFootRow = false; if (bodyRows >
-				 * 0) { hasBodyRow = true; } if (footRows > 0) { hasFootRow =
-				 * true; } //last row in THEAD excute insert row after command
-				 * if ((this._rowIndex == headRows) && hasBodyRow && hasFootRow) {
-				 * parentIndex = index - footRows - 1; } //last row in TBODY
-				 * excute insert row after command if ((this._rowIndex ==
-				 * (list.size() - footRows)) && hasBodyRow && hasFootRow) {
-				 * parentIndex = list.size() - 1; }
-				 */
-
-				tr = (Element) list.get(parentIndex);
-			}
-
-			if (tr.getParentNode() == nextTr.getParentNode()) {
-				tr.getParentNode().insertBefore(insertElement, nextTr);
-			} else {
-				tr.getParentNode().appendChild(insertElement);
-			}
-		} else {
-			// int index = TableUtil.countRowIndexInDOMTree(this._tableEle,
-			// this._rowIndex - 1);
-			int index = this._rowIndex - 1;
-			Element tr = (Element) list.get(index);
-			tr.getParentNode().insertBefore(insertElement, null);
-		}
-		formatNode(this._tableEle);
-
-	}
-
-	private Element createDefaultElement() {
-		Document doc = this._tableEle.getOwnerDocument();
-		Element ele = doc.createElement(IHTMLConstants.TAG_TR);
-		int columnCount = _tableUtil.getColumnCount();
-		for (int i = 0; i < columnCount; i++) {
-			Element td = doc.createElement(IHTMLConstants.TAG_TD);
-			Node node = doc.createTextNode(""); //$NON-NLS-1$
-			td.appendChild(node);
-			ele.appendChild(td);
-		}
-		return ele;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableResizeColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableResizeColumnCommand.java
deleted file mode 100644
index f4e8b82..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableResizeColumnCommand.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.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;
-
-	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 19db48b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableResizeRowCommand.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.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;
-
-	public TableResizeRowCommand(IHTMLGraphicalViewer viewer, Element table,
-			int rowIndex, int delta) {
-		super(CommandResources
-				.getString("TableResizeRowCommand.Label.ResizeColumn"), viewer); //$NON-NLS-1$
-		this._table = table;
-		this._rowIndex = rowIndex;
-		this._delta = delta;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(this._table);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		int index = this._rowIndex - 1;
-		if (index < 0) {
-			index = 0;
-		}
-		// int domIndex = TableUtil.countRowIndexInDOMTree(this._table, index);
-		int domIndex = index;
-
-		List list = new ArrayList();
-		TableUtil.getTrElements(this._table, list);
-		Element tr = (Element) list.get(domIndex);
-
-		IFigure cellFigure = getFigureInfo(tr);
-		int oldRowHeight = cellFigure.getBounds().height;
-		int cellPadding = cellFigure.getInsets().getHeight();
-		int newHeight = oldRowHeight + this._delta - cellPadding;
-		if (this._rowIndex - 1 < 0) {
-			newHeight = oldRowHeight - this._delta - cellPadding;
-		}
-		Map map = new HashMap();
-		if (newHeight > 0) {
-			map.put(ICSSPropertyID.ATTR_HEIGHT, newHeight + "px"); //$NON-NLS-1$ //$NON-NLS-2$
-			DOMStyleUtil.insertStyle(tr, map);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/CaretPositionTracker.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/CaretPositionTracker.java
deleted file mode 100644
index 7295210..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/CaretPositionTracker.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.nav;
-
-/**
- * @author mengbo
- */
-public interface CaretPositionTracker {
-	/**
-	 * @return Returns the xoffset.
-	 */
-	public int getXoffset();
-
-	/**
-	 * @param xoffset
-	 *            The xoffset to set.
-	 */
-	public void setXoffset(int xoffset);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/HorizontalMoveCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/HorizontalMoveCommand.java
deleted file mode 100644
index 044ab8e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/HorizontalMoveCommand.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.nav;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.parts.SubNodeEditPart;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.DesignRefPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class HorizontalMoveCommand extends Command implements
-		ICaretPositionMover {
-	private static Logger _log = PDPlugin
-			.getLogger(HorizontalMoveCommand.class);
-
-	IHTMLGraphicalViewer _viewer;
-
-	boolean _forward;
-
-	boolean _onlyMoveEnd;
-
-	/**
-	 * @param viewer
-	 * @param b
-	 * @param c
-	 */
-	public HorizontalMoveCommand(IHTMLGraphicalViewer viewer, boolean b,
-			boolean c) {
-		_viewer = viewer;
-		_forward = b;
-		_onlyMoveEnd = c;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		DesignPosition position = null;
-		if (_viewer.isInRangeMode()) {
-			if (_viewer.getRangeSelection() != null
-					&& _viewer.getRangeSelection().isValid()) {
-				position = _viewer.getRangeSelection().getEndPosition();
-				position = performInlineMode(_forward);
-			}
-		} else {
-			position = performObjectMode();
-		}
-		setRange(position);
-	}
-
-	private DesignPosition performObjectMode() {
-		DesignPosition result = null;
-		IMovementMediator validator = new InlineEditingNavigationMediator(
-				new ActionData(ActionData.KEYBOARD_NAVAGATION, null));
-		DesignPosition position = getCurrentObjectPosition();
-		if (position != null) {
-			_viewer.setRange(position, position);
-			if (!validator.isValidPosition(position)) {
-				position = performInlineMode(_forward);
-				if (validator.isValidPosition(position)) {
-					result = position;
-				} else {
-					result = performInlineMode(!_forward);
-				}
-			} else {
-				result = position;
-			}
-		}
-		return result;
-	}
-
-	private DesignPosition performInlineMode(boolean forward) {
-		DesignRange range = _viewer.getRangeSelection();
-
-		if (range == null || !range.isValid()) {
-			_log.error("invalud range");
-			return null;
-		}
-
-		DesignPosition position = range.getEndPosition();
-		if (position.getContainerPart() instanceof TextEditPart) {
-			int length = ((TextEditPart) position.getContainerPart())
-					.getTextData().length();
-			int newoffset = position.getOffset() + (_forward ? 1 : -1);
-			if (newoffset >= 0 && newoffset <= length) {
-				DesignPosition newposi = new DesignPosition(position
-						.getContainerPart(), newoffset);
-				return newposi;
-			}
-		}
-		DesignPosition newpos = EditHelper.moveToNextEditPosition(
-				ActionData.KEYBOARD_NAVAGATION, position, forward);
-		return newpos;
-	}
-
-	private void setRange(DesignPosition newpos) {
-		if (_onlyMoveEnd) {
-			_viewer.setRangeEndPosition(newpos);
-		} else {
-			_viewer.setRange(newpos, newpos);
-		}
-	}
-
-	private DesignPosition getCurrentObjectPosition() {
-		DesignRange result = null;
-		if (_viewer.isInRangeMode()) {
-			result = _viewer.getRangeSelection();
-		} else {
-			List parts = _viewer.getSelectedEditParts();
-			if (parts.size() > 0) {
-				EditPart selection = (EditPart) parts.get(0);
-				if (selection instanceof SubNodeEditPart) {
-					DesignPosition position = new DesignRefPosition(selection,
-							_forward);
-					result = new DesignRange(position, position);
-				}
-			}
-		}
-		return result != null && result.isValid() ? result.getEndPosition()
-				: null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/ICaretPositionMover.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/ICaretPositionMover.java
deleted file mode 100644
index ca75659..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/ICaretPositionMover.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.nav;
-
-/**
- * Tags commands that care about caret position
- * TODO: does presently appear to have a purpose
- * 
- * @author mengbo
- * 
- */
-public interface ICaretPositionMover {
-    // empty; tagging interface
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/VerticalMoveCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/VerticalMoveCommand.java
deleted file mode 100644
index 492b495..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/VerticalMoveCommand.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.nav;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.EditPartPositionHelper;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.widgets.Caret;
-
-/**
- * @author mengbo
- */
-public class VerticalMoveCommand extends Command {
-	private static Logger _log = PDPlugin
-			.getLogger(HorizontalMoveCommand.class);
-
-	IHTMLGraphicalViewer _viewer;
-
-	boolean _up;
-
-	boolean _onlyMoveEnd;
-
-	/**
-	 * @param viewer
-	 * @param up
-	 * @param c
-	 */
-	public VerticalMoveCommand(IHTMLGraphicalViewer viewer, boolean up,
-			boolean c) {
-		_viewer = viewer;
-		_up = up;
-		_onlyMoveEnd = c;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		int OFFSET = 2;
-		DesignRange range = _viewer.getRangeSelection();
-		if (range == null || !range.isValid()) {
-			_log.error("invalud range");
-			return;
-		}
-		IMovementMediator moveMediator = new InlineEditingNavigationMediator(
-				new ActionData(ActionData.KEYBOARD_NAVAGATION, null));
-		DesignPosition position = range.getEndPosition();
-		Caret caret = _viewer.getCaret();
-		Point point = null;
-		DesignPosition newPos = position;
-		EditPart containerpart = null, rootpart1;
-		if (_up) {
-			point = new Point(((CaretPositionTracker) _viewer).getXoffset(),
-					caret.getBounds().y);
-		} else {
-			point = new Point(((CaretPositionTracker) _viewer).getXoffset(),
-					caret.getBounds().y + caret.getBounds().height);
-
-		}
-		rootpart1 = getRootEditablePart(position.getContainerPart(),
-				moveMediator);// position.getContainerPart();
-		if (rootpart1 == null) {
-			return;
-		}
-        
-        point = adjustLocation(rootpart1, point);
-		Rectangle bound = EditPartPositionHelper.getAbsoluteBounds(rootpart1);
-		// get current according to the point.
-		// FlowBoxLine line =
-		// getCurrentLine(moveMediator.getEditableContainer(new
-		// Target(rootpart)), point, moveMediator);
-		while (true) {
-			// try to change offset and then to search for new point.
-			if (_up) {
-				point.y -= OFFSET;
-				if (point.y <= bound.y) {
-					newPos = position;
-					break;
-				}
-			} else {
-				point.y += OFFSET;
-				if (point.y >= bound.y + bound.height) {
-					newPos = position;
-					break;
-				}
-			}
-			containerpart = ((InlineEditingNavigationMediator) moveMediator)
-					.getConstainedEditableContainer(position, point, _viewer);
-			if (containerpart != null) {
-				if (!EditModelQuery.isChild(Target.resolveNode(rootpart1),
-						Target.resolveNode(containerpart))) {
-					containerpart = rootpart1;
-				}
-				bound = EditPartPositionHelper.getAbsoluteBounds(rootpart1);
-				newPos = EditPartPositionHelper
-						.findEditPartPositionConstrained(containerpart, point,
-								moveMediator);
-			} else {
-				newPos = position;
-				break;
-			}
-			if (newPos != null) {
-				if (found(newPos, position)) {
-					break;
-				}
-			}
-		}
-		setRange(position, newPos);
-	}
-
-	private void setRange(DesignPosition position, DesignPosition newPos) {
-		if (!EditModelQuery.isSame(position, newPos)) {
-			{
-				if (_onlyMoveEnd) {
-					_viewer.setRangeEndPosition(newPos);
-				} else {
-					_viewer.setRange(newPos, newPos);
-				}
-			}
-		}
-	}
-
-	/*
-	 * We should change this, it is too tricky to do in this way.
-	 */
-	private Point adjustLocation(EditPart rootPart, Point point) {
-		Point result = point.getCopy();
-		Rectangle bounds = EditPartPositionHelper.getAbsoluteBounds(rootPart);
-		if (!bounds.contains(point)) {
-			if (bounds.getLeft().x > point.x) {
-				result.x = bounds.getLeft().x;
-			} else if (bounds.getRight().x < point.x) {
-				result.x = bounds.getRight().x;
-			}
-		}
-		return result;
-	}
-
-	private EditPart getRootEditablePart(EditPart part,
-			IMovementMediator moveMediator) {
-		EditPart rootpart = null;
-		if ((rootpart = ((InlineEditingNavigationMediator) moveMediator)
-				.getRootConstainedEditableContainer(new Target(part))) == null) {
-			rootpart = moveMediator.getEditableContainer(new Target(part));
-		}
-		return rootpart;
-	}
-
-	private boolean found(DesignPosition newPos, DesignPosition prevPos) {
-		Rectangle newRec = EditPartPositionHelper
-				.convertToAbsoluteCaretRect(newPos);
-		Rectangle prevRec = EditPartPositionHelper
-				.convertToAbsoluteCaretRect(prevPos);
-		if (_up) {
-			return getYDistance(newRec, prevRec, _up) < 0;
-		}
-        return getYDistance(newRec, prevRec, _up) > 0;
-	}
-
-	/**
-	 * Distance from rec1 to rec2 at y coordination, if top, compare top,
-	 * otherwise compare bottom.
-	 * 
-	 * @param rec1
-	 * @param rec2
-	 * @param up
-	 * @return
-	 */
-	private int getYDistance(Rectangle rec1, Rectangle rec2, boolean top) {
-		if (rec1.getCopy().intersect(rec2).height > 0) {
-			return 0;
-		}
-        if (top) {
-        	return rec1.getTop().y - rec2.getTop().y;
-        }
-        return rec1.getBottom().y - rec2.getBottom().y;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ApplyStyleCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ApplyStyleCommand.java
deleted file mode 100644
index 884c565..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ApplyStyleCommand.java
+++ /dev/null
@@ -1,495 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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;
-
-	protected 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;
-	}
-
-	public ApplyStyleCommand(IHTMLGraphicalViewer viewer, Element node,
-			String property, String value) {
-		super(
-				CommandResources
-						.getString("ApplyStyleCommand.Label.ApplyStyle"), viewer); //$NON-NLS-1$
-		this._applyingNode = node;
-	}
-
-	/*
-	 * (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 6dec925..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/BlockNodeFinder.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.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;
-
-	public BlockNodeFinder(IDOMPosition position, String[] additionalTags) {
-		_position = position;
-		_additionalTags = additionalTags;
-	}
-
-	private Node findInlineSiblings(IDOMPosition position, List result,
-			boolean forward) {
-		Node container = EditModelQuery.getInstance().getSibling(position,
-				forward);
-		if (!forward) {
-			while (container != null) {
-				if (EditModelQuery.isInline(container)) {
-					result.add(container);
-				} else {
-					return container;
-				}
-				container = container.getPreviousSibling();
-			}
-		} else {
-			while (container != null) {
-				if (EditModelQuery.isInline(container)) {
-					result.add(container);
-				} else {
-					return container;
-				}
-				container = container.getNextSibling();
-			}
-		}
-		// the result will be non-zero length.
-		return null;
-	}
-
-	private Node getParagraphNodes(IDOMPosition position, List result,
-			boolean forward) {
-		Node sResult = findInlineSiblings(position, result, forward);
-		Node container = position.getContainerNode();
-		container = position.isText() ? container.getParentNode() : container;
-		while (sResult == null) {
-			// stop at block, special container and H style nodes.
-			if (EditModelQuery.isBlockNode(container)
-					|| EditModelQuery.isDocument(container)
-					|| (container.getLocalName() != null && (container
-							.getLocalName().equals(IJSFConstants.TAG_VIEW) || container
-							.getLocalName().equalsIgnoreCase(
-									IHTMLConstants.TAG_HTML))) || //
-					(_additionalTags != null
-							&& Arrays.asList(_additionalTags).contains(
-									getTagName()) && Arrays.asList(
-							_additionalTags).contains(container))) {
-				return container;
-			}
-			position = new DOMRefPosition(container, forward);
-			sResult = findInlineSiblings(position, result, forward);
-			container = container.getParentNode();
-		}
-		return sResult;
-	}
-
-	/**
-	 * Search for an area between two block nodes or within a block node, search
-	 * will stop before or under a node which has block display-type, or
-	 * particular container like "html", jsf "view", .etc, two positions (left
-	 * and right) are returned in result.
-	 * 
-	 * The searcher will search parent's directly children, if no block node is
-	 * found, then go up the node tree to search again.
-	 * 
-	 * @param position
-	 * @param result
-	 */
-	public void getParagraphNodes(IDOMPosition position, List result) {
-		List tempResult = new ArrayList();
-		Node r1 = getParagraphNodes(position, tempResult, true);
-		if (EditModelQuery.isChild(r1, position.getContainerNode())) {
-			result.add(new DOMPosition(r1, r1.getChildNodes().getLength()));
-		} else {
-			result.add(new DOMRefPosition(r1, false));
-		}
-
-		Node r2 = getParagraphNodes(position, tempResult, false);
-		if (EditModelQuery.isChild(r2, position.getContainerNode())) {
-			result.add(new DOMPosition(r2, 0));
-		} else {
-			result.add(new DOMRefPosition(r2, true));
-		}
-	}
-
-	private String getTagName() {
-		String name = _position.getContainerNode().getNodeName();
-		name = name == null ? "" : name.toLowerCase();
-		return name;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ClipboardData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ClipboardData.java
deleted file mode 100644
index 5f0ce33..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ClipboardData.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.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;
-
-	/**
-	 * 
-	 */
-	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;
-	}
-
-	public Object getClipboardData() {
-		Clipboard clipboard = new Clipboard(_control.getDisplay());
-
-		final Object cuted = clipboard.getContents(TemplateTransfer.getInstance());
-		if (cuted instanceof Node[] || cuted instanceof Vector) {
-			return cuted;
-		}
-        return clipboard.getContents(TextTransfer.getInstance());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ContentCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ContentCommand.java
deleted file mode 100644
index c612aac..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ContentCommand.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Text;
-
-/**
- * This command can used to handle things like "paste". Or keyboard printable
- * ascii key. Note: ENTER key is not handled here.
- * 
- * @author mengbo
- */
-// FIXME: \r \n in the content string is not handled.
-public class ContentCommand extends RangeModeCommand {
-
-	private String _content;
-
-	/**
-	 * @param viewer
-	 * @param content 
-	 */
-	public ContentCommand(IHTMLGraphicalViewer viewer, String content) {
-		super("", viewer);
-		_content = content;
-	}
-
-	/**
-	 * @param viewer
-	 * @param c
-	 */
-	public ContentCommand(IHTMLGraphicalViewer viewer, char c) {
-		super("", viewer);
-		_content = String.valueOf(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected DOMRange doRangeExecute(DOMRange range) {
-		if (range == null)
-			return null;
-
-		IDOMPosition position = DOMPositionHelper.removeRange(range);
-		position = doContent(position);
-		return new DOMRange(position, position);
-
-	}
-
-	/**
-	 * @param position
-	 * @return ??
-	 */
-	protected IDOMPosition doContent(IDOMPosition position) {
-		position = DOMPositionHelper.mergeIntoText(position);
-
-		if (position.getContainerNode() instanceof Text) {
-			Text text = (Text) position.getContainerNode();
-			String data = text.getData();
-			int offset = position.getOffset();
-			String newData = data.substring(0, offset) + _content
-					+ data.substring(offset);
-			text.setData(newData);
-			return new DOMPosition(text, offset + _content.length());
-		}
-        // we need to create a text node.
-        Text text = getDocument().createTextNode(_content);
-        position.getContainerNode().insertBefore(text,
-        		position.getNextSiblingNode());
-        return new DOMRefPosition(text, true);
-	}
-
-	// protected DesignPosition doContent()
-	// {
-	// // DesignPosition position = removeRange();
-	// DesignPosition position = this.getSelectionRange().getEndPosition();
-	// if ('\r' == _content || '\n' == _content)
-	// {
-	// Element br = getModel().getDocument().createElement("BR");
-	// Node node = RangeUtil.insertElement(position, br);
-	//
-	// // we need set the new range to the node.
-	// // FIXME: temp code, need to reconsider how to do refresh, when those
-	// editpart
-	// // are recreated.
-	// IDOMNode parent = (IDOMNode) node.getParentNode();
-	// EditPart parentPart = (EditPart) parent.getAdapterFor(EditPart.class);
-	// List childParts = parentPart.getChildren();
-	// for (int i=0; i<childParts.size(); i++)
-	// {
-	// if (node == ((EditPart)childParts.get(i)).getModel())
-	// {
-	// return new DesignPosition(parentPart, i+1);
-	// }
-	// }
-	// return new DesignPosition(parentPart, childParts.size());
-	// }
-	// else
-	// {
-	// TextPosition textPosition = RangeUtil.insertText(position,
-	// String.valueOf(_content));
-	// IDOMText text = textPosition.getTextNode();
-	// EditPart part = (EditPart) text.getAdapterFor(EditPart.class);
-	// return new DesignPosition(part, textPosition.getOffset());
-	// }
-	// }
-	//
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyCommand.java
deleted file mode 100644
index 594cf62..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyCommand.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class CopyCommand extends RangeModeCommand {
-
-	/**
-	 * @param viewer
-	 */
-	public CopyCommand(IHTMLGraphicalViewer viewer) {
-		super(CommandResources.getString("CopyCommand.Label.Copy"), viewer); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange selection) {
-		DesignEdit edit = new CopyEdit(selection, getViewer());
-		edit.operate();
-		return selection;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyEdit.java
deleted file mode 100644
index a94540e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyEdit.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.Stack;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class CopyEdit extends DesignEdit {
-	private static Logger _log = PDPlugin.getLogger(CopyEdit.class);
-
-	private Stack result = new Stack();
-
-	/**
-	 * @param range
-	 * @param viewer
-	 */
-	public CopyEdit(DOMRange range, GraphicalViewer viewer) {
-		super(range, viewer);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignEdit#operate()
-	 */
-	protected boolean operate() {
-		WorkNode root = getRootWorkNode();
-		Node rootNode = root.getNode();
-		result = getProcessedResult();
-		collectOtherStyles(rootNode, result);
-		setClipboard(result);
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignEdit#processContainer(org.eclipse.jst.pagedesigner.commands.range.WorkNode)
-	 */
-	protected Node processContainer(WorkNode node) {
-		return node.getNode().cloneNode(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.AbstractCopyEdit#processNode(org.w3c.dom.Node,
-	 *      int[], java.util.Stack)
-	 */
-	protected Node processNode(WorkNode node) {
-		int pos[] = node.getPosOffsets();
-		// the text could be tranparent, or 0 length.
-		Assert.isTrue(pos[0] <= pos[1]);
-		if (pos[0] == pos[1]) {
-			return null;
-		}
-		return node.getNode().cloneNode(true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.AbstractCopyEdit#processText(org.w3c.dom.Text,
-	 *      int[], java.util.Stack)
-	 */
-	protected Text processText(WorkNode node) {
-		Text currentNode = (Text) node.getNode();
-		int left = EditModelQuery.getNodeStartIndex(currentNode);
-		int right = EditModelQuery.getNodeEndIndex(currentNode);
-		int location1 = EditHelper.getInstance().getLocation(currentNode,
-				node.getPosOffsets()[0], true);
-		int location2 = EditHelper.getInstance().getLocation(currentNode,
-				node.getPosOffsets()[1], true);
-		int start = 0;
-		int end = right - left;
-		// left index
-		if (location1 > EditHelper.IN_MIDDLE
-				|| location2 < EditHelper.IN_MIDDLE) {
-			return null;
-		}
-		if (location1 <= EditHelper.IN_MIDDLE) {
-			start = node.getQualifiedOffsets()[0];
-		}
-		if (location2 >= EditHelper.IN_MIDDLE) {
-			end = node.getQualifiedOffsets()[1];
-		}
-		if (start == end) {
-			return null;
-		}
-        
-        try {
-        	String text = currentNode.getData().substring(start, end);
-        	return EditModelQuery.getDocumentNode(currentNode)
-        			.createTextNode(text);
-        } catch (DOMException e) {
-            // TODO: changed this from catching Exception
-            // DOMException is the only exception that 
-            // anything in the try is threatening to throw
-            // and even that is Runtime
-        	_log.error("Exception", e);
-        	return null;
-        }
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutCommand.java
deleted file mode 100644
index 985967b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutCommand.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class CutCommand extends RangeModeCommand {
-	/**
-	 * @param viewer
-	 */
-	public CutCommand(IHTMLGraphicalViewer viewer) {
-		super(CommandResources.getString("CutCommand.Label.Cut"), viewer); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange selection) {
-		DesignEdit edit = new CutEdit(selection, getViewer());
-		if (EditModelQuery.isSame(selection)) {
-			return null;
-		}
-        if (edit.perform()) {
-        	return new DOMRange(edit.getOperationPosition(), edit
-        			.getOperationPosition());
-        }
-        return selection;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutEdit.java
deleted file mode 100644
index c0a8104..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutEdit.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.Stack;
-
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-
-/**
- * @author mengbo
- */
-public class CutEdit extends DeleteEdit {
-	/**
-	 * @param range
-	 * @param viewer 
-	 */
-	public CutEdit(DOMRange range, GraphicalViewer viewer) {
-		super(range, viewer);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignEdit#operate()
-	 */
-	protected boolean operate() {
-		Stack result = deleteRange();
-		setClipboard(result);
-		return true;
-	}
-
-	/*
-	 * private Text cutText(Text text, int start, int end) {
-	 * EditValidateUtil.validStringIndexOffset(text, start, end - start); String
-	 * content = text.substringData(start, end - start); if (content == null ||
-	 * content.length() == 0) { return null; } text.deleteData(start, end -
-	 * start); return _document.createTextNode(content); }
-	 */
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteCommand.java
deleted file mode 100644
index 26ea1d9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteCommand.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.nav.ICaretPositionMover;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * @author mengbo
- */
-public class DeleteCommand extends RangeModeCommand implements
-		ICaretPositionMover {
-	private boolean _forward;
-
-	/**
-	 * @param forward
-	 * @param viewer
-	 */
-	public DeleteCommand(boolean forward, IHTMLGraphicalViewer viewer) {
-		super(CommandResources.getString("DeleteCommand.Label.Delete"), viewer); //$NON-NLS-1$
-		_forward = forward;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected DOMRange doRangeExecute(DOMRange selection) {
-		if (selection == null) {
-			return null;
-		}
-
-		DesignEdit edit = new DeleteEdit(selection, getViewer(), _forward);
-		Listener listener = new Listener() {
-			public void handleEvent(Event event) {
-				event.type = SWT.NONE;
-			}
-		};
-		getViewer().getControl().getDisplay()
-				.addFilter(SWT.Selection, listener);
-		boolean status = edit.perform();
-		getViewer().getControl().getDisplay().removeFilter(SWT.Selection,
-				listener);
-		if (status) {
-			return new DOMRange(edit.getOperationPosition(), edit
-					.getOperationPosition());
-		}
-        return selection;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteEdit.java
deleted file mode 100644
index f036180..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteEdit.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.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
-	 */
-	public DeleteEdit(DOMRange range, GraphicalViewer viewer, boolean forward) {
-		super(range, viewer);
-		_forward = forward;
-	}
-
-	public DeleteEdit(DOMRange range, GraphicalViewer viewer) {
-		super(range, viewer);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignEdit#operate()
-	 */
-	protected boolean operate() {
-		try {
-			boolean result = true;
-			if (EditModelQuery.isSame(getRange())) {
-				deleteSingle();
-			} else {
-				deleteRange();
-			}
-			return result;
-		} catch (Exception e) {
-			_log.error("Exception", e);
-			return false;
-		}
-	}
-
-	/**
-	 * Delete one node or char at operation position.
-	 */
-	private void deleteSingle() {
-		IDOMPosition opPosition = getOperationPosition();
-		opPosition = EditHelper.moveToNextEditPosition(getOperationPosition(),
-				_forward, new InlineEditingNavigationMediator(new ActionData(
-						ActionData.INLINE_EDIT, null)));
-		// for inner debug
-		if (INNER_DEBUG) {
-			_log.info("EditHelper, now we are at:" + opPosition);
-		}
-		if (EditModelQuery.isSame(opPosition, getOperationPosition())) {
-			return;
-		}
-        setRange(new DOMRange(opPosition, getOperationPosition()));
-        deleteRange();
-	}
-
-	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, 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, 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 c158325..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DesignEdit.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.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.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
- */
-public abstract class DesignEdit {
-	public static final int DELETE_OPERATION = 1;
-
-	public static final int INSERT_OPERATION = 2;
-
-	private Stack _selections;
-
-	private DOMRange _range;
-
-	private GraphicalViewer _viewer;
-
-	private IDOMPosition _operationPosition;
-
-	protected Document _document;
-
-	protected IDOMModel _model;
-
-	protected Stack _processedResult;
-
-	public DesignEdit(DOMRange range, GraphicalViewer viewer) {
-		setRange(range);
-		_viewer = viewer;
-		_operationPosition = getRange().getStartPosition();
-		_document = ((IDOMNode) _operationPosition.getContainerNode())
-				.getModel().getDocument();
-		_model = ((IDOMNode) _operationPosition.getContainerNode()).getModel();
-	}
-
-	protected abstract boolean operate();
-
-	protected abstract Text processText(WorkNode node);
-
-	protected abstract Node processNode(WorkNode node);
-
-	protected abstract Node processContainer(WorkNode node);
-
-	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);
-	}
-
-	protected Clipboard getClipboard() {
-		return new Clipboard(_viewer.getControl().getDisplay());
-	}
-
-	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;
-	}
-
-	protected void setOperationPosition(IDOMPosition position) {
-		if (!EditValidateUtil.validPosition(position)) {
-			return;
-		}
-		position = EditHelper.ensureDOMPosition(position);
-		_operationPosition = position;
-	}
-
-	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;
-	}
-
-	public Stack getProcessedResult() {
-		if (_processedResult == null) {
-			_processedResult = new Stack();
-			WorkNode rootNode = getRootWorkNode();
-			if (rootNode != null) {
-				processNodes(rootNode, _processedResult);
-			}
-		}
-		return _processedResult;
-	}
-
-	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;
-	}
-
-	protected 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;
-	}
-
-	protected final boolean processContainer(WorkNode node, Stack result) {
-		processContainer(node);
-		getSelections().remove(node);
-		return true;
-	}
-
-	protected 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;
-	}
-
-	protected 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);
-					}
-				}
-			}
-		}
-	}
-
-	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;
-	}
-
-	public Node collectStyleNodes(Node rootNode, Vector result) {
-		Element element = null;
-		if (rootNode instanceof Element) {
-			element = (Element) rootNode;
-		} else if (rootNode.getParentNode() != null) {
-			element = (Element) rootNode.getParentNode();
-		}
-		ICSSStyle style = CSSUtil.getCSSStyle(element);
-
-		Node node = EditModelQuery.getDocumentNode(rootNode).createElement(
-				"span");
-		for (int i = 0, n = result.size(); i < n; i++) {
-			node.appendChild((Node) result.elementAt(i));
-		}
-		((Element) node).setAttribute(IHTMLConstants.ATTR_STYLE, CSSUtil
-				.resolveCSSStyle(style));
-		result.removeAllElements();
-		result.add(node);
-		return node;
-	}
-
-	public Node collectOtherStyles(Node rootNode, Vector result) {
-		Node cur = rootNode, prev = null, appendPoint = null;
-		if (EditValidateUtil.validNode(rootNode)) {
-			while (!EditModelQuery.isDocument(cur)) {
-				if (!EditValidateUtil.validNode(cur)) {
-					return null;
-				}
-				String name = cur.getNodeName() != null ? cur.getNodeName()
-						.toLowerCase() : "";
-				if (EditModelQuery.HTML_STYLE_NODES.contains(name)) {
-					if (prev != null) {
-						Node newone = cur.cloneNode(false);
-						newone.appendChild(prev);
-						prev = newone;
-					} else {
-						prev = cur.cloneNode(false);
-						appendPoint = prev;
-					}
-				}
-				cur = cur.getParentNode();
-			}
-			if (appendPoint != null) {
-				for (int i = 0, n = result.size(); i < n; i++) {
-					appendPoint.appendChild((Node) result.elementAt(i));
-				}
-				result.removeAllElements();
-				result.add(prev);
-			}
-		}
-		return prev;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/IInputSourceProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/IInputSourceProvider.java
deleted file mode 100644
index fabe0ca..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/IInputSourceProvider.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.range;
-
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public interface IInputSourceProvider {
-	/**
-	 * @return Returns the _data.
-	 */
-	public Node[] getNodes();
-
-	public String getStringData();
-
-	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 38d2ac7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/InsertCommand.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.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
-	 */
-	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 84ede40..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/InsertEdit.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.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
-	 */
-	public InsertEdit(DOMRange range, GraphicalViewer viewer,
-			IInputSourceProvider data) {
-		super(range, viewer);
-		_data = data;
-	}
-
-	public InsertEdit(IDOMPosition position, GraphicalViewer viewer,
-			IInputSourceProvider data) {
-		super(new DOMRange(position, position), viewer);
-		setOperationPosition(position);
-		_data = data;
-	}
-
-	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 = _document.createTextNode(_data.getCharacterData()
-					.toString());
-			position.getContainerNode().insertBefore(text, refNode);
-			setOperationPosition(new DOMPosition(text, text.getLength()));
-		}
-		return true;
-	}
-
-	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 = _document.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(_document, 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 7b455af..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/KeyboardData.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.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;
-
-	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;
-	}
-
-	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;
-	}
-
-	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 1c879ae..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/Paragraph.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 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;
-
-	public Paragraph(IDOMPosition start, IDOMPosition end) {
-		_range = new DOMRange(start, end);
-	}
-
-	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 27d4488..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphApplyStyleCommand.java
+++ /dev/null
@@ -1,408 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.Arrays;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.dom.IDOMRefPosition;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class ParagraphApplyStyleCommand extends ApplyStyleCommand {
-
-    /**
-     * the list of possible html heading tags
-     */
-    private static final String[] HH = { "h1", "h2", "h3", "h4", "h5", "h6" };
-
-    /**
-	 * @param viewer
-	 * @param tag
-	 * @param property
-	 * @param value
-	 */
-	public ParagraphApplyStyleCommand(IHTMLGraphicalViewer viewer, String tag,
-			String property, String value) {
-		super(viewer, tag, property, value);
-	}
-
-	/**
-	 * @param viewer
-	 * @param node
-	 * @param property
-	 * @param value
-	 */
-	public ParagraphApplyStyleCommand(IHTMLGraphicalViewer viewer,
-			Element node, String property, String value) {
-		super(viewer, node, property, value);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange range) {
-		if (range != null) {
-			boolean ordered = range.isOrdered();
-			IDOMPosition start = ordered ? range.getStartPosition() : range
-					.getEndPosition();
-			IDOMPosition end = ordered ? range.getEndPosition() : range
-					.getStartPosition();
-			Node common = null;
-			Node container = null;
-			if (EditModelQuery.isSame(range)) {
-				container = start.getContainerNode();
-				ParagraphFinder finder = new ParagraphFinder(start);
-				Paragraph p = finder.getParagraph(start);
-				start = p.getStart();
-				end = p.getEnd();
-				common = p.getLowestContainer();
-			} else {
-				common = EditModelQuery.getInstance().getCommonAncestor(start,
-						end);
-			}
-			DOMRange rt;
-			// This code is for h1-h6 only, it may need to be replaced.
-			if ((rt = replaceExistingH(start, end)) != null) {
-				return rt;
-			}
-			// replace existing p
-			if (getTag().equalsIgnoreCase(IHTMLConstants.TAG_P)) {
-				rt = replaceExistingP(start, end);
-				if (rt != null) {
-					return rt;
-				}
-			}
-			if (start.getContainerNode() == end.getContainerNode()) {
-				int offset1 = start.getOffset();
-				int offset2 = end.getOffset();
-				IDOMPosition old = start;
-				start = split(start);
-				// parent is splited
-				if (start != old) {
-					container = start.getNextSiblingNode();
-					offset2 -= offset1;
-					end = new DOMPosition(container, offset2);
-				}
-				end = split(end);
-			} else {
-				start = split(common, start);
-				end = split(common, end);
-			}
-			range = InsertStyleTag(new DOMRange(start, end));
-		}
-		return range;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		return true;
-	}
-
-	/*
-	 * Try to split the node so that we can avoid wrap its children directly.
-	 * Begining from 'position' the split can reach as high as the level of
-	 * 'common'.
-	 */
-	private IDOMPosition split(Node common, IDOMPosition position) {
-		Assert.isTrue(EditModelQuery.isChild(common, position
-				.getContainerNode()));
-		Node container = position.getContainerNode();
-		String[] styleNodes = new String[EditModelQuery.HTML_STYLE_NODES.size()];
-		EditModelQuery.HTML_STYLE_NODES.toArray(styleNodes);
-		while (EditModelQuery.isText(container) || (container != common && //
-				EditModelQuery.containItem(styleNodes, container, true))) {
-			IDOMPosition old = position;
-			position = EditHelper.splitNode(position);
-			if (old == position) {
-				int pos = EditHelper.getLocation(position);
-				switch (pos) {
-				case -1:
-					position = new DOMRefPosition(position.getContainerNode(),
-							false);
-					break;
-				case 1:
-					position = new DOMRefPosition(position.getContainerNode(),
-							true);
-				}
-			}
-			Node containerBackup = container;
-			container = container.getParentNode();
-			if (containerBackup.getNodeName().equalsIgnoreCase(
-					IHTMLConstants.TAG_P)) {
-				container.removeChild(containerBackup);
-			}
-		}
-		return position;
-	}
-
-	/*
-	 * Split the position's container node only.
-	 */
-	private IDOMPosition split(IDOMPosition position) {
-		Node container = position.getContainerNode();
-		String[] styleNodes = new String[EditModelQuery.HTML_STYLE_NODES.size()];
-		EditModelQuery.HTML_STYLE_NODES.toArray(styleNodes);
-		if (EditModelQuery.isText(container)
-				|| EditModelQuery.containItem(styleNodes, container, true)) {
-			return EditHelper.splitNode(position);
-		}
-		return position;
-	}
-
-	private DOMRange replaceExistingH(IDOMPosition start, IDOMPosition end) {
-		Node common = EditModelQuery.getInstance()
-				.getCommonAncestor(start, end);
-		// Here we insert some code to avoid creating tags duplicated. but these
-		// are not the entire cases.
-		if (Arrays.asList(HH).contains(
-				getAName(getTag()).toLowerCase())
-				&& Arrays.asList(HH).contains(
-						getAName(common.getNodeName()).toLowerCase())) {
-			// uncheck action menu
-			if (getAName(getTag()).toLowerCase().equalsIgnoreCase(
-					getAName(common.getNodeName()).toLowerCase())) {
-				NodeList nodes = common.getChildNodes();
-
-				for (int i = 0, size = nodes.getLength(); i < size; i++) {
-					common.getParentNode().insertBefore(nodes.item(i), common);
-				}
-				common.getParentNode().removeChild(common);
-				return new DOMRange(start, end);
-			}
-			start = DOMPositionHelper.toDOMRefPosition(start);
-			end = DOMPositionHelper.toDOMRefPosition(end);
-			Node newHNode = EditModelQuery.getDocumentNode(common)
-					.createElement(getTag());
-			EditModelQuery.copyChildren(common, newHNode);
-			common.getParentNode().replaceChild(newHNode, common);
-			return new DOMRange(start, end);
-		}
-		return null;
-	}
-
-	private DOMRange replaceExistingP(IDOMPosition start, IDOMPosition end) {
-		// find the selected startNode,endNode and start node's parent node
-		Node startNode = start instanceof IDOMRefPosition ? start
-				.getNextSiblingNode() : start.getContainerNode();
-		Node endNode = end instanceof IDOMRefPosition ? end
-				.getPreviousSiblingNode() : end.getContainerNode();
-		Node parentNode = startNode.getParentNode();
-
-		if (!(start.isText()) && start instanceof DOMPosition) {
-			startNode = startNode.getChildNodes().item(start.getOffset());
-			parentNode = start.getContainerNode();
-		}
-		if (!(end.isText()) && end instanceof DOMPosition) {
-			// because the offset is based on the position between nodes,so we
-			// need to reduce one from the offset
-			// in order to get the correct end node.
-			endNode = endNode.getChildNodes().item(end.getOffset() - 1);
-		}
-
-		// compute selected character number in the text or selected element
-		// number under a node
-		int len = 0;
-//		if (start instanceof DOMPosition && end instanceof DOMPosition
-//				|| start instanceof IDOMPosition && end instanceof IDOMPosition) {
-        // TODO: as written, this will be the only statement run, since
-        // both start and end are instanceof IDOMPosition by defn.
-			len = end.getOffset() - start.getOffset();
-//		} else {
-//			IDOMRefPosition startRef = null;
-//			IDOMRefPosition endRef = null;
-//			if (!(start.isText()) && start instanceof DOMPosition) {
-//				startRef = new DOMRefPosition(startNode, false);
-//			} else if (!(end.isText()) && end instanceof DOMPosition) {
-//				endRef = new DOMRefPosition(endNode, true);
-//			}
-//			len = (endRef != null ? endRef.getOffset() : end.getOffset())
-//					- (startRef != null ? startRef.getOffset() : start
-//							.getOffset());
-//		}
-
-		// if a full Text node is selected,and the Text node is the only child
-		// of its parent
-		if ((startNode == endNode) && (startNode instanceof Text)) {
-			TextEditPart part = (TextEditPart) ((INodeNotifier) startNode)
-					.getAdapterFor(EditPart.class);
-			boolean condition = false;
-			if (start instanceof IDOMRefPosition
-					|| (start instanceof DOMPosition && !start.isText())) {
-				condition = parentNode.getNodeName().equalsIgnoreCase(
-						IHTMLConstants.TAG_P)
-						&& parentNode.getChildNodes().getLength() == 1;
-			} else {
-				condition = parentNode.getNodeName().equalsIgnoreCase(
-						IHTMLConstants.TAG_P)
-						&& parentNode.getChildNodes().getLength() == 1
-						&& part.getTextData().length() == len;
-			}
-			if (condition) {
-				// if uncheck the align action
-				if (this._applyingNode
-						.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._applyingNode
-						.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._applyingNode
-						.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._applyingNode
-						.getAttribute(IHTMLConstants.ATTR_ALIGN);
-				((Element) parentNode).setAttribute(IHTMLConstants.ATTR_ALIGN,
-						align);
-
-				IDOMPosition startPos = new DOMPosition(parentNode, 0);
-				IDOMPosition endPos = new DOMRefPosition(endNode, true);
-				return new DOMRange(startPos, endPos);
-			}
-		}
-		return null;
-	}
-
-	private DOMRange InsertStyleTag(DOMRange range) {
-		if (range == null || range.isEmpty()) {
-			return null;
-		}
-
-		boolean ordered = range.isOrdered();
-		IDOMPosition start = ordered ? range.getStartPosition() : range
-				.getEndPosition();
-		IDOMPosition end = ordered ? range.getEndPosition() : range
-				.getStartPosition();
-
-		Node startContainer = start.getContainerNode();
-		Node endContainer = end.getContainerNode();
-
-		Node common = DOMUtil.findCommonAncester(start.getContainerNode(), end
-				.getContainerNode());
-		if (common == null) {
-			// should not happen.
-			return null;
-		}
-        if (startContainer instanceof Text) {
-        	// if the start offset is 0,then skip split the Text
-        	if (start.getOffset() > 0) {
-        		startContainer = ((Text) startContainer).splitText(start
-        				.getOffset());
-        		start = new DOMRefPosition(startContainer, false);
-        	}
-        } else {
-        	startContainer = start.getNextSiblingNode();
-        }
-        if (endContainer instanceof Text) {
-        	if (end.getOffset() > 0) {
-        		endContainer = ((Text) endContainer).splitText(end
-        				.getOffset());
-        		endContainer = endContainer.getPreviousSibling();
-        	} else {
-        		endContainer = endContainer.getPreviousSibling();
-        	}
-        } else {
-        	endContainer = end.getPreviousSiblingNode();
-        }
-
-        // now the startContainer and the endContainer should share the same
-        // parent
-        Element newNode = createStyleElement();
-        startContainer.getParentNode()
-        		.insertBefore(newNode, startContainer);
-
-        Node sibling = startContainer.getNextSibling();
-        newNode.appendChild(startContainer);
-        Node endNodeSibling = endContainer.getNextSibling();
-        while (sibling != null && startContainer != endContainer
-        		&& sibling != endNodeSibling) {
-        	Node tempNode = sibling.getNextSibling();
-        	newNode.appendChild(sibling);
-        	sibling = tempNode;
-        }
-
-        IDOMPosition startPos = new DOMPosition(newNode, 0);
-        IDOMPosition endPos = new DOMRefPosition(endContainer, true);
-        return new DOMRange(startPos, endPos);
-	}
-
-	private static String getAName(String name) {
-		return name == null ? "" : name;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphFinder.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphFinder.java
deleted file mode 100644
index 1dfda9d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphFinder.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class ParagraphFinder {
-	private final IDOMPosition _position;
-
-	/**
-	 * @param position
-	 */
-	public ParagraphFinder(IDOMPosition position) {
-		_position = position;
-	}
-
-	/**
-	 * @return the dom position
-	 */
-	public IDOMPosition getPosition() {
-		return _position;
-	}
-
-	private Node findInlineSiblings(IDOMPosition position, List result,
-			boolean forward) {
-		Node container = EditModelQuery.getInstance().getSibling(position,
-				forward);
-		if (!forward) {
-			while (container != null) {
-				if (EditModelQuery.isInline(container)) {
-					result.add(container);
-				} else {
-					return container;
-				}
-				container = container.getPreviousSibling();
-			}
-		} else {
-			while (container != null) {
-				if (EditModelQuery.isInline(container)) {
-					result.add(container);
-				} else {
-					return container;
-				}
-				container = container.getNextSibling();
-			}
-		}
-		// the result will be non-zero length.
-		return null;
-	}
-
-	private Node getParagraphNodes(IDOMPosition position, List result,
-			boolean forward) {
-		Node sResult = findInlineSiblings(position, result, forward);
-		Node container = position.getContainerNode();
-		container = position.isText() ? container.getParentNode() : container;
-		while (sResult == null) {
-			// stop at block, special container and H style nodes.
-			if (EditModelQuery.isBlockNode(container)
-					|| EditModelQuery.isDocument(container)
-					|| (container.getLocalName() != null && (container
-							.getLocalName().equals(IJSFConstants.TAG_VIEW) || container
-							.getLocalName().equalsIgnoreCase(
-									IHTMLConstants.TAG_HTML)))) {
-				return container;
-			}
-			position = new DOMRefPosition(container, forward);
-			sResult = findInlineSiblings(position, result, forward);
-			container = container.getParentNode();
-		}
-		return sResult;
-	}
-
-	/**
-	 * Search for an area between two block nodes or within a block node, search
-	 * will stop before or under a node which has block display-type, or
-	 * particular container like "html", jsf "view", .etc, two positions (left
-	 * and right) are returned in result.
-	 * 
-	 * The searcher will search parent's directly children, if no block node is
-	 * found, then go up the node tree to search again.
-	 * 
-	 * @param position
-	 * @return the paragraph
-	 */
-	public Paragraph getParagraph(IDOMPosition position) {
-		List tempResult = new ArrayList();
-		IDOMPosition p1, p2;
-		Node r1 = getParagraphNodes(position, tempResult, true);
-		if (EditModelQuery.isChild(r1, position.getContainerNode())) {
-			p1 = new DOMPosition(r1, r1.getChildNodes().getLength());
-		} else {
-			p1 = new DOMRefPosition(r1, false);
-		}
-
-		Node r2 = getParagraphNodes(position, tempResult, false);
-		if (EditModelQuery.isChild(r2, position.getContainerNode())) {
-			p2 = new DOMPosition(r2, 0);
-		} else {
-			p2 = new DOMRefPosition(r2, true);
-		}
-		return new Paragraph(p1, p2);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphUnapplyStyleCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphUnapplyStyleCommand.java
deleted file mode 100644
index c0611c6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphUnapplyStyleCommand.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class ParagraphUnapplyStyleCommand extends ApplyStyleCommand {
-	private String _groupTags[];
-
-	/**
-	 * @param viewer
-	 * @param tags
-	 * @param property
-	 * @param value
-	 */
-	public ParagraphUnapplyStyleCommand(IHTMLGraphicalViewer viewer,
-			String[] tags, String property, String value) {
-		super(viewer, "", property, value);
-		_groupTags = tags;
-	}
-
-	/**
-	 * @param viewer
-	 * @param node
-	 * @param property
-	 * @param value
-	 */
-	public ParagraphUnapplyStyleCommand(IHTMLGraphicalViewer viewer,
-			Element node, String property, String value) {
-		super(viewer, node, property, value);
-	}
-
-	private DOMRange removeExistingStyles(IDOMPosition start, IDOMPosition end) {
-		Node common = null;
-		if (EditModelQuery.isSame(start, end)) {
-			ParagraphFinder finder = new ParagraphFinder(start);
-			Paragraph p = finder.getParagraph(start);
-			start = p.getStart();
-			end = p.getEnd();
-			common = p.getLowestContainer();
-		} else {
-			common = EditModelQuery.getInstance().getCommonAncestor(start, end);
-		}
-		// Here we insert some code to avoid creating tags duplicated. but these
-		// are not the entire cases.
-		// if (Arrays.asList(_groupTags).contains(common.getNodeName()))
-		if (EditModelQuery.containItem(_groupTags, common, true)) {
-			start = DOMPositionHelper.toDOMRefPosition(start);
-			end = DOMPositionHelper.toDOMRefPosition(end);
-			Node parent = common.getParentNode();
-			EditModelQuery.copyChildren(common, parent);
-			common.getParentNode().removeChild(common);
-			return new DOMRange(start, end);
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange range) {
-		return removeExistingStyles(range.getStartPosition(), range
-				.getEndPosition());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/PasteCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/PasteCommand.java
deleted file mode 100644
index 5ec0958..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/PasteCommand.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class PasteCommand extends RangeModeCommand {
-
-	/**
-	 * @param viewer
-	 */
-	public PasteCommand(IHTMLGraphicalViewer viewer) {
-		super(CommandResources.getString("PasteCommand.Label.Paste"), viewer); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange selection) {
-		InsertEdit edit = new InsertEdit(selection, getViewer(),
-				new ClipboardData(getViewer().getControl()));
-		if (edit.operate()) {
-			return new DOMRange(edit.getOperationPosition(), edit
-					.getOperationPosition());
-		}
-        return selection;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/RangeModeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/RangeModeCommand.java
deleted file mode 100644
index 07ce127..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/RangeModeCommand.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public abstract class RangeModeCommand extends DesignerCommand {
-//	private static final Logger _log = PDPlugin
-//			.getLogger(RangeModeCommand.class);
-
-	DOMRange _resultRange = null;
-
-	/**
-	 * @param label
-	 * @param viewer
-	 */
-	public RangeModeCommand(String label, IHTMLGraphicalViewer viewer) {
-		super(label, viewer);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#prePreExecute()
-	 */
-	protected boolean prePreExecute() {
-		int position = -1;
-		int length = -1;
-		ISelection selection = getViewer().getSelection();
-		if (selection != null) {
-			if (getViewer().isInRangeMode()) {
-				DesignRange range = (DesignRange) selection;
-				if (range.isValid()) {
-					IDOMPosition domPos = DOMPositionHelper.toDOMPosition(range
-							.getStartPosition());
-					IDOMPosition domEnd = DOMPositionHelper.toDOMPosition(range
-							.getEndPosition());
-					if (!EditValidateUtil.validPosition(domPos)
-							|| !EditValidateUtil.validPosition(domEnd)) {
-						return false;
-					}
-					position = EditModelQuery.getIndexedRegionLocation(domPos);
-					int end = EditModelQuery.getIndexedRegionLocation(domEnd);
-					if (end < position) {
-						length = position - end;
-						position = end;
-					} else {
-						length = end - position;
-					}
-				}
-			} else {
-				Object object = ((IStructuredSelection) selection)
-						.getFirstElement();
-				if (object instanceof ElementEditPart) {
-					Node node = ((ElementEditPart) object).getIDOMNode();
-					position = EditModelQuery.getNodeStartIndex(node);
-					length = EditModelQuery.getNodeLenth(node);
-				} else {
-					return false;
-				}
-			}
-			if (position >= 0 && length >= 0) {
-				getModel().beginRecording(this, getLabel(), position, length);
-			} else {
-				getModel().beginRecording(this, getLabel());
-			}
-			getViewer().startSelectionChange();
-			getModel().aboutToChangeModel();
-			return true;
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected final void doExecute() {
-		DesignRange range = getViewer().getRangeSelection();
-		if (range != null && range.isValid()) {
-			DOMRange domrange = (range == null || !range.isValid()) ? null
-					: toDOMRange(range);
-			_resultRange = doRangeExecute(domrange);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected final ISelection getAfterCommandDesignerSelection() {
-//		try {
-			if (_resultRange == null) {
-				return null;
-			}
-			IDOMPosition startPos = _resultRange.getStartPosition();
-			DesignPosition start = DOMPositionHelper.toDesignPosition(startPos);
-			if (_resultRange.isEmpty()) {
-				return new DesignRange(start, start);
-			}
-            IDOMPosition endPos = _resultRange.getEndPosition();
-            return new DesignRange(start, DOMPositionHelper
-            		.toDesignPosition(endPos));
-            // TODO: don't know what this exception catch is for
-//		} catch (Exception e) {
-//			// "Selection error"
-//			_log.error("Error.RangeModeCommand.SetSelection"); //$NON-NLS-1$
-//			return null;
-//		}
-	}
-
-	/**
-	 * @param range
-	 * @return
-	 */
-	private DOMRange toDOMRange(DesignRange range) {
-		return new DOMRange(DOMPositionHelper.toDOMPosition(range
-				.getStartPosition()), DOMPositionHelper.toDOMPosition(range
-				.getEndPosition()));
-	}
-
-	/**
-	 * In the implementation of this method, should not do anything relating to
-	 * EditPart. (maybe even not ICSSStyle, since not style information not
-	 * refreshed yet)
-	 * @param selection 
-	 * 
-	 * @return null means no change have been done to the model. In this case,
-	 *         system may choose to cancel undo recorrding, etc.
-	 */
-	protected abstract DOMRange doRangeExecute(DOMRange selection);
-
-	/**
-	 * @param parent
-	 * @param ref
-	 * @param child
-	 */
-	protected static void appendChild(Node parent, Node ref, Node child) {
-		Node next = ref.getNextSibling();
-		if (next == null)
-			parent.appendChild(child);
-		else
-			parent.insertBefore(child, next);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/SelectAllCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/SelectAllCommand.java
deleted file mode 100644
index 4118016..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/SelectAllCommand.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.JSFRootContainerPositionRule;
-import org.eclipse.jst.pagedesigner.validation.caret.RootContainerPositionRule;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * Called in response to a Ctrl-A-style select all action
- *
- */
-public class SelectAllCommand extends Command {
-	private IHTMLGraphicalViewer _viewer;
-
-	/**
-	 * @param label
-	 * @param viewer
-	 */
-	public SelectAllCommand(String label, IHTMLGraphicalViewer viewer) {
-		super(label);
-		_viewer = viewer;
-	}
-
-	public void execute() {
-		Node document = _viewer.getModel().getDocument();
-		IMovementMediator validator = new InlineEditingNavigationMediator(
-				new ActionData(ActionData.KEYBOARD_NAVAGATION, null));
-		Node htmlRoot = RootContainerPositionRule
-				.getBasicContainer((Document) document);
-		Node jsfRoot = JSFRootContainerPositionRule
-				.getBasicContainer((Document) document, 3);
-		Node root;
-		if (htmlRoot != null && jsfRoot != null) {
-			if (EditModelQuery.isChild(htmlRoot, jsfRoot)) {
-				root = htmlRoot;
-			} else if (EditModelQuery.isChild(jsfRoot, htmlRoot)) {
-				root = jsfRoot;
-			} else {
-				root = htmlRoot;
-			}
-		} else {
-			if (htmlRoot != null) {
-				root = htmlRoot;
-			} else if (jsfRoot != null) {
-				root = jsfRoot;
-			} else {
-				root = document;
-			}
-		}
-		IDOMPosition position1, position2;
-		// if (root.hasChildNodes())
-		// {
-		// Node first = root.getFirstChild();
-		// position1 = new DOMRefPosition(first, false);
-		// Node last = root.getLastChild();
-		// position2 = new DOMRefPosition(last, true);
-		// }
-		// else
-		// {
-		position1 = new DOMPosition(root, 0);
-		position2 = new DOMPosition(root, root.getChildNodes().getLength());
-		// }
-		if (!validator.isValidPosition(position1)) {
-			position1 = EditHelper.moveToNextEditPosition(position1, true,
-					validator);
-		}
-		if (!validator.isValidPosition(position2)) {
-			position2 = EditHelper.moveToNextEditPosition(position2, false,
-					validator);
-		}
-		if (EditValidateUtil.validPosition(position1)
-				&& EditValidateUtil.validPosition(position2)) {
-			_viewer.setRange(DOMPositionHelper.toDesignPosition(position1),
-					DOMPositionHelper.toDesignPosition(position2));
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/UnapplyStyleCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/UnapplyStyleCommand.java
deleted file mode 100644
index b2c05e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/UnapplyStyleCommand.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class UnapplyStyleCommand extends ApplyStyleCommand {
-	/**
-	 * @param viewer
-	 * @param tag
-	 * @param property
-	 * @param value
-	 */
-	public UnapplyStyleCommand(IHTMLGraphicalViewer viewer, String tag,
-			String property, String value) {
-		super(viewer, tag, property, value);
-	}
-
-	/**
-	 * @param viewer
-	 * @param node
-	 * @param property
-	 * @param value
-	 */
-	public UnapplyStyleCommand(IHTMLGraphicalViewer viewer, Element node,
-			String property, String value) {
-		super(viewer, node, property, value);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange range) {
-		if (range == null || range.isEmpty()) {
-			return null;
-		}
-
-		boolean ordered = range.isOrdered();
-		IDOMPosition start = ordered ? range.getStartPosition() : range
-				.getEndPosition();
-		IDOMPosition end = ordered ? range.getEndPosition() : range
-				.getStartPosition();
-
-		Node common = DOMUtil.findCommonAncester(start.getContainerNode(), end
-				.getContainerNode());
-		if (common == null) {
-			// should not happen.
-			return null;
-		}
-
-		if (common instanceof Text) {
-			doTextNodeStyleApply((Text) common, start.getOffset(), end
-					.getOffset());
-		}
-
-		return null;
-	}
-
-	/**
-	 * @param start
-	 * @param end
-	 * @param common
-	 */
-	private DOMRange doTextNodeStyleApply(Text textNode, int startOffset,
-			int endOffset) {
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/WorkNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/WorkNode.java
deleted file mode 100644
index 72bee81..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/WorkNode.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class WorkNode {
-	private WorkNode parent;
-
-	private WorkNode previous;
-
-	private WorkNode next;
-
-	private Node node;
-
-	private int pos[];
-
-	private boolean isRoot;
-
-	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;
-	}
-
-	public int[] getQualifiedOffsets() {
-		int result[] = new int[] { getPosOffsets()[0], getPosOffsets()[1] };
-		result[0] = result[0] < 0 ? 0 : result[0];
-		int length = EditModelQuery.getNodeLenth(node);
-		result[0] = result[0] > length ? length : result[0];
-		result[1] = result[1] < 0 ? 0 : result[1];
-		result[1] = result[1] > length ? length : result[1];
-		return result;
-	}
-
-	/**
-	 * @return Returns the pos.
-	 */
-	public int[] getPosOffsets() {
-		return pos;
-	}
-
-	/**
-	 * @return Returns the isRoot.
-	 */
-	public boolean isRoot() {
-		return isRoot;
-	}
-
-	/**
-	 * @param isRoot
-	 *            The isRoot to set.
-	 */
-	public void setRoot(boolean isRoot) {
-		this.isRoot = isRoot;
-	}
-
-	/**
-	 * @return Returns the next.
-	 */
-	public WorkNode getNext() {
-		return next;
-	}
-
-	/**
-	 * @param next
-	 *            The next to set.
-	 */
-	public void setNext(WorkNode next) {
-		this.next = next;
-	}
-
-	/**
-	 * @return Returns the parent.
-	 */
-	public WorkNode getParent() {
-		return parent;
-	}
-
-	/**
-	 * @param parent
-	 *            The parent to set.
-	 */
-	public void setParent(WorkNode parent) {
-		this.parent = parent;
-	}
-
-	/**
-	 * @return Returns the previous.
-	 */
-	public WorkNode getPrevious() {
-		return previous;
-	}
-
-	/**
-	 * @param previous
-	 *            The previous to set.
-	 */
-	public void setPrevious(WorkNode previous) {
-		this.previous = previous;
-	}
-
-	private int[] resoveOffsets(Node node1, int pos1, int pos2) {
-		int left = EditModelQuery.getNodeStartIndex(node1);
-		return new int[] { pos1 - left, pos2 - left };
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer sb = new StringBuffer();
-		sb.append("Node:").append(node).append(" pos[]:").append(pos);
-		return sb.toString();
-	}
-
-	public 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 9c830e1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/AddSubNodeCommand.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.commands.single;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddSubNodeCommand extends SingleNodeCommand {
-	private IDOMElement _parent, _child;
-
-	private String _tagName;
-
-	private String _url;
-
-	private Map _attributes;
-
-	/**
-	 * @param label
-	 * @param node
-	 */
-	public AddSubNodeCommand(String label, IDOMElement node, String name,
-			String url, Map attributs) {
-		super(label, node);
-		this._parent = node;
-		this._tagName = name;
-		this._url = url;
-		this._attributes = attributs;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		String prefix = JSPUtil.getOrCreatePrefix(_parent.getModel(), _url,
-				null);
-		_child = (IDOMElement) _parent.getOwnerDocument().createElement(
-				prefix + ":" + _tagName);
-		for (Iterator iterator = _attributes.keySet().iterator(); iterator
-				.hasNext();) {
-			String key = (String) iterator.next();
-			String value = (String) _attributes.get(key);
-			_child.setAttribute(key, value);
-		}
-		_parent.appendChild(_child);
-	}
-
-	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 fa189da..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeAttributeCommand.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.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;
-	}
-
-	public ChangeAttributeCommand(String label, IDOMElement node, Map attributes) {
-		super(label, node);
-		_element = node;
-		_attributes = attributes;
-		_attrName = null;
-		_attrValue = null;
-	}
-
-	protected void doExecute() {
-		if (_attrName != null) {
-			updateElement(_attrName, _attrValue);
-		} else if (_attributes != null) {
-			for (Iterator iterator = _attributes.keySet().iterator(); iterator
-					.hasNext();) {
-				String name = (String) iterator.next();
-				String value = (String) _attributes.get(name);
-				if (isSameValue(value, _element.getAttribute(name))) {
-					continue;
-				}
-				updateElement(name, value);
-			}
-		}
-	}
-
-	private void updateElement(String name, String value) {
-		if (_element.hasAttribute(name) && isEmptyString(value)
-				&& !_keepEmptyAttribute) {
-			_element.removeAttribute(name);
-		}
-		if (!isEmptyString(value) || _keepEmptyAttribute) {
-			_element.setAttribute(name, value);
-		}
-	}
-
-	private boolean isSameValue(String value1, String value2) {
-		value1 = value1 == null ? "" : value1;
-		value2 = value2 == null ? "" : value2;
-		return value1.equals(value2);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.equals("")) {
-			return true;
-		}
-        return false;
-	}
-
-	/**
-	 * @return Returns the keepEmptyAttribute.
-	 */
-	public boolean isKeepEmptyAttribute() {
-		return _keepEmptyAttribute;
-	}
-
-	/**
-	 * @param keepEmptyAttribute
-	 *            The keepEmptyAttribute to set.
-	 */
-	public void setKeepEmptyAttribute(boolean keepEmptyAttribute) {
-		this._keepEmptyAttribute = keepEmptyAttribute;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeStyleCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeStyleCommand.java
deleted file mode 100644
index 4a88c34..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeStyleCommand.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.single;
-
-import java.util.Map;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.dom.DOMStyleUtil;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclaration;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.css.ElementCSSInlineStyle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ChangeStyleCommand extends SingleNodeCommand {
-	private Map _styleProperties = null;
-
-	private CSSPropertyContext _context = null;
-
-	/**
-	 * @param node
-	 * @param map
-	 */
-	public ChangeStyleCommand(IDOMElement node, Map map) {
-		super(CommandResources
-				.getString("ChangeStyleCommand.Label.ChangeStyle"), node); //$NON-NLS-1$
-		_styleProperties = map;
-	}
-
-	/**
-	 * @param node
-	 * @param context
-	 */
-	public ChangeStyleCommand(IDOMElement node, CSSPropertyContext context) {
-		super(CommandResources
-				.getString("ChangeStyleCommand.Label.ChangeStyle"), node); //$NON-NLS-1$
-		_context = context;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		getOriginalElement().getModel().beginRecording(this);
-		try {
-			if (_styleProperties != null) {
-				IDOMElement original = this.getOriginalElement();
-				DOMStyleUtil.insertStyle(original, _styleProperties);
-			} else if (_context != null) {
-				ICSSStyleDeclaration styleDeclaration = (ICSSStyleDeclaration) ((ElementCSSInlineStyle) getOriginalElement())
-						.getStyle();
-
-				if (styleDeclaration == null) {
-					getOriginalElement().setAttribute(IJSFConstants.ATTR_STYLE,
-							""); //$NON-NLS-1$
-					styleDeclaration = (ICSSStyleDeclaration) ((ElementCSSInlineStyle) getOriginalElement())
-							.getStyle();
-				}
-				_context.applyModified(styleDeclaration);
-			}
-		} finally {
-			getOriginalElement().getModel().endRecording(this);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeTagCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeTagCommand.java
deleted file mode 100644
index 6fb8b98..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeTagCommand.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.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 IDOMElement _element;
-
-	private String _uri;
-
-	private String _localTag;
-
-	private Map _attributes;
-
-	private boolean _moveContent;
-
-	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;
-	}
-
-	/**
-	 * @param label
-	 * @param node
-	 * @param uri 
-	 * @param tag 
-	 * @param attributes 
-	 * @param movecontent 
-	 */
-	public ChangeTagCommand(String label, IDOMElement node, String uri,
-			String tag, Map attributes, boolean movecontent) {
-		super(label, node);
-		this._element = node;
-		this._uri = uri;
-		this._localTag = tag;
-		this._attributes = attributes;
-		this._moveContent = movecontent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		String tag = null;
-
-		if (_totalTag != null) {
-			tag = _totalTag;
-		} else {
-			if (ITLDConstants.URI_HTML.equals(_uri)) {
-				tag = _localTag;
-			} else if (ITLDConstants.URI_JSP.equals(_uri)) {
-				tag = "jsp:" + _localTag;
-			} else {
-				tag = JSPUtil.getOrCreatePrefix(getModel(), _uri, null)
-						+ _localTag;
-			}
-		}
-		// we need to remove the old element and create a new one with the new
-		// tag.
-		IDOMElement replacement = (IDOMElement) _element.getOwnerDocument()
-				.createElement(tag);
-		NamedNodeMap attrs = _element.getAttributes();
-		for (int i = 0, n = attrs.getLength(); i < n; i++) {
-			Attr a = (Attr) attrs.item(i);
-			replacement.setAttribute(a.getName(), a.getValue());
-		}
-		if (_attributes != null) {
-			for (Iterator iter = _attributes.keySet().iterator(); iter
-					.hasNext();) {
-				String name = (String) iter.next();
-				String value = (String) _attributes.get(name);
-				replacement.setAttribute(name, value);
-			}
-		}
-		if (_moveContent) {
-			NodeList nl = _element.getChildNodes();
-			ArrayList list = new ArrayList();
-			for (int i = 0, n = nl.getLength(); i < n; i++) {
-				list.add(nl.item(i));
-
-			}
-			for (int i = 0, n = list.size(); i < n; i++) {
-				replacement.appendChild((Node) list.get(i));
-			}
-		}
-		_element.getParentNode().replaceChild(replacement, _element);
-		setReplacedElement(replacement);
-	}
-
-	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 25f6de0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/InsertSubNodeCommand.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.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
-	 */
-	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);
-	}
-
-	public IDOMElement getChildNode() {
-		return _child;
-	}
-}
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 0d34b94..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/AbstractTagConverter.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.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;
-
-	/**
-	 * 
-	 */
-	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
-	}
-
-	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.
-	 * 
-	 */
-	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.
-	 * 
-	 */
-	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);
-	}
-
-	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!!!
-	protected String mapValue(String value) {
-		if (value == null) {
-			return null;
-		}
-		if (isDesignerMode()) {
-			// if there has jsf binding expressions
-			int checkPos = value.indexOf("#{");
-			if (checkPos != -1) {
-				String mapValue = "";
-				int preferType = PreferenceReader.getMapValueType();
-				switch (preferType) {
-				case PreferenceReader.FULL_EXPRESSION_TYPE:
-					mapValue = value;
-					break;
-				case PreferenceReader.LAST_EXPRESSION_TYPE:
-					String strBackup = value;
-					StringBuffer sb = new StringBuffer();
-					while (strBackup.indexOf("#{") != -1) {
-						int pos = strBackup.indexOf("#{");
-						int endBracketPos = strBackup.indexOf("}", pos + 1);
-						if (endBracketPos != -1) {
-							sb.append(strBackup.substring(0, pos + 2));
-							String exp = strBackup.substring(pos + 2,
-									endBracketPos);
-							if (allowTrim(exp)) {
-								int lastDotPos = exp.lastIndexOf(".");
-								if (lastDotPos != -1) {
-									String convertedExp = exp
-											.substring(lastDotPos + 1);
-									sb.append(convertedExp);
-								} else {
-									sb.append(exp);
-								}
-
-							} else {
-								sb.append(exp);
-							}
-							sb.append("}");
-						} else {
-							break;
-						}
-						if (strBackup.length() > endBracketPos + 1) {
-							strBackup = strBackup.substring(endBracketPos + 1);
-						} else {
-							strBackup = "";
-							break;
-						}
-
-					}
-					sb.append(strBackup);
-					mapValue = sb.toString();
-					break;
-				case PreferenceReader.REAL_VALUE_TYPE:
-					// TODO calculate the expression value
-				default:
-					mapValue = value;
-					break;
-				}
-
-				return mapValue;
-			}
-		} else {
-			// preview mode. let's try to display the value.
-			try {
-				return (String) PageExpressionContext.getCurrent()
-						.evaluateExpression(value, String.class, null);
-			} catch (Exception ex) {
-				// can't calculate the result. ignore.
-				// ex.printStackTrace();
-			}
-		}
-		return value;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-	 */
-	public boolean needBorderDecorator() {
-		return this._needBorderDecorator;
-	}
-
-	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;
-	}
-
-	public final boolean isPreviewMode() {
-		return this._mode == IConverterFactory.MODE_PREVIEW;
-	}
-
-	public final boolean isDesignerMode() {
-		return this._mode == IConverterFactory.MODE_DESIGNER;
-	}
-
-	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;
-	}
-
-	public void setMinWidth(int minWidth) {
-		this._minWidth = minWidth;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#getMinHeight()
-	 */
-	public int getMinHeight() {
-		return this._minHeight;
-	}
-
-	public void setMinHeight(int minHeight) {
-		this._minHeight = minHeight;
-	}
-
-	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 97f2ba8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConvertPosition.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.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 {
-	Node _parentNode;
-
-	int _index;
-
-	/**
-	 * 
-	 */
-	public ConvertPosition(Node parent, int index) {
-		this._parentNode = parent;
-		this._index = index;
-	}
-
-	public Node getParentNode() {
-		return _parentNode;
-	}
-
-	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 21f3d88..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFacRegistryReader.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;
-
-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;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ConverterFacRegistryReader {
-	static IConverterFactory[] _handlers = null;
-
-	public static synchronized IConverterFactory[] getAllHandlers() {
-		if (_handlers == null) {
-			_handlers = readAllHandlers();
-		}
-		return _handlers;
-
-	}
-
-	private static IConverterFactory[] 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.TAG_CONVERTER_FACTORY)) {
-					dropHandlers[j].getAttribute("class");
-					Object obj;
-					try {
-						obj = dropHandlers[j]
-								.createExecutableExtension("class");
-
-						if (obj instanceof IConverterFactory) {
-							result.add(obj);
-						}
-					} catch (CoreException e) {
-						// ignore the exception
-						e.printStackTrace();
-					}
-				}
-			}
-		}
-		IConverterFactory[] ret = new IConverterFactory[result.size()];
-		result.toArray(ret);
-		return ret;
-	}
-
-}
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 5a54c1b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFactoryRegistry.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.converter;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.LabelProvider;
-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.converter.html.HTMLConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.jsp.JSPConverterFactory;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ConverterFactoryRegistry {
-	List _factories = new ArrayList();
-
-	private static ConverterFactoryRegistry _instance;
-
-	/**
-	 * 
-	 */
-	private ConverterFactoryRegistry() {
-		_factories.add(new JSPConverterFactory());
-		_factories.add(new HTMLConverterFactory());
-
-		IConverterFactory facs[] = ConverterFacRegistryReader.getAllHandlers();
-		if (facs != null) {
-			for (int i = 0; i < facs.length; i++) {
-				addFactory(facs[i]);
-			}
-		}
-	}
-
-	public void addFactory(IConverterFactory fac) {
-		_factories.add(fac);
-	}
-
-	public ITagConverter createTagConverter(Element ele, int mode,
-			IDOMDocument targetDocument) {
-		ITagConverter converter = internalCreateTagConverter(ele, mode);
-		if (converter != null) {
-			converter.setDestDocument(targetDocument);
-		}
-		return converter;
-	}
-
-	public ITagConverter internalCreateTagConverter(Element ele, int mode) {
-		String uri = CMUtil.getElementNamespaceURI(ele);
-		// first round, match uri
-		for (int i = 0, size = _factories.size(); i < size; i++) {
-			IConverterFactory fac = (IConverterFactory) _factories.get(i);
-			String facuri = fac.getSupportedURI();
-			if (facuri != null && facuri.equals(uri)) {
-				ITagConverter converter = fac.createConverter(ele, mode);
-				if (converter != null) {
-					return converter;
-				}
-			}
-		}
-		// second round
-		for (int i = 0, size = _factories.size(); i < size; i++) {
-			IConverterFactory fac = (IConverterFactory) _factories.get(i);
-			String facuri = fac.getSupportedURI();
-			if (facuri == null) {
-				ITagConverter converter = fac.createConverter(ele, mode);
-				if (converter != null) {
-					return converter;
-				}
-			}
-		}
-
-		// can't find. We need some default tag converter for it.
-		// if the tag is empty, show it as icon.
-		if (uri == null || ITLDConstants.URI_HTML.equals(uri)) {
-			// basically, for HTML or non JSP tag, directly renders it.
-			return new DumTagConverter(ele);
-		}
-        CMElementDeclaration decl = CMUtil.getElementDeclaration(ele);
-        if (decl == null) {
-        	return new DumTagConverter(ele);
-        }
-        int contentType = decl.getContentType();
-        if (contentType == CMElementDeclaration.EMPTY) {
-        	// if the tag is empty, show it as icon.
-        	return new HiddenTagConverter(ele,
-                    new LabelProvider()
-                    {
-                        public Image getImage(Object element) {
-                            return getUnknownImage();
-                        }
-                    }
-             );
-        }
-        return new DefaultUnknownTagConverter(ele, mode);
-
-	}
-
-	Image getUnknownImage() {
-		return PDPlugin.getDefault().getImage(
-				"palette/GENERIC/small/PD_Palette_Default.gif");
-	}
-
-	public static ConverterFactoryRegistry getInstance() {
-		if (_instance == null) {
-			_instance = new ConverterFactoryRegistry();
-		}
-		return _instance;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterUtil.java
deleted file mode 100644
index 2dd2678..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterUtil.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.converter;
-
-import java.util.Set;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ConverterUtil {
-	/**
-	 * 
-	 * @param source
-	 * @param dest
-	 * @param ignore
-	 */
-	public static void copyAllAttributes(Element source, Element dest,
-			Set ignore) {
-		NamedNodeMap attrs = source.getAttributes();
-		for (int i = 0, size = attrs.getLength(); i < size; i++) {
-			Attr attr = (Attr) attrs.item(i);
-			if (ignore == null || !ignore.contains(attr.getName())) {
-				dest.setAttribute(attr.getName(), attr.getValue());
-			}
-		}
-	}
-
-	/**
-	 * copy a single attribute (if exist)
-	 * 
-	 * @param source
-	 * @param srcattr
-	 * @param dest
-	 * @param destattr
-	 */
-	public static void copyAttribute(Element source, String srcattr,
-			Element dest, String destattr) {
-		Attr attr = source.getAttributeNode(srcattr);
-		if (attr != null) {
-			dest.setAttribute(destattr, attr.getValue());
-		}
-	}
-
-	/**
-	 * @param hostElement
-	 * @return true if hostElement represents an empty container
-	 */
-	public static boolean isEmptyContainer(Element hostElement) {
-		NodeList nl = hostElement.getChildNodes();
-		if (nl == null || nl.getLength() == 0) {
-			return true;
-		}
-
-		for (int i = 0, n = nl.getLength(); i < n; i++) {
-			Node node = nl.item(i);
-			if (!(node instanceof IDOMText)) {
-				return false;
-			}
-			if (!((IDOMText) node).isElementContentWhitespace()) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	public static Element createDescriptionElement(IDOMDocument document,
-			String text) {
-		if (document == null) {
-			return null;
-		}
-		Element span = document.createElement(IHTMLConstants.TAG_SPAN); //$NON-NLS-1$
-		span.setAttribute(
-				"style", "color:gray;font-style:italic;font-size:normal;"); //$NON-NLS-1$ //$NON-NLS-2$
-		if (text == null) {
-			span.appendChild(document.createTextNode(PDPlugin
-					.getResourceString("ConverterUtil.Description"))); //$NON-NLS-1$
-		} else {
-			span.appendChild(document.createTextNode(text));
-		}
-		return span;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DefaultUnknownTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DefaultUnknownTagConverter.java
deleted file mode 100644
index 397fcf7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DefaultUnknownTagConverter.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.converter;
-
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * This tag converter is for those unsupported jsp tags.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DefaultUnknownTagConverter extends AbstractTagConverter {
-
-	/**
-	 * @param host
-	 */
-	public DefaultUnknownTagConverter(Element host, int  mode) {
-		super(host);
-        setMode(mode);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element hostEle = this.getHostElement();
-		Element divEle = createElement("div");
-		String style = DOMUtil.getAttributeIgnoreCase(hostEle, "style");
-		if (style == null) {
-			style = "";
-		}
-		if (style.length() > 0 && !style.endsWith(";")) {
-			style += ";";
-		}
-		style += "border: none; padding: 0; margin: 0";
-		divEle.setAttribute("style", style);
-		Element div2 = createElement("span");
-        String border = isPreviewMode() ? "border-style: solid;border-width: 1px" : "border:none";
-		div2.setAttribute("style", "background-color: white;"+border+";color:gray");
-		Text txt = createText(hostEle.getTagName());
-		div2.appendChild(txt);
-
-		divEle.appendChild(div2);
-
-		Element div3 = createElement("div");
-		div3.setAttribute("style", "margin: 0; padding: 0");
-		divEle.appendChild(div3);
-
-		copyChildren(getHostElement(), div3);
-		return divEle;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-	 */
-	public boolean needBorderDecorator() {
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDeepTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDeepTagConverter.java
deleted file mode 100644
index 0a56b52..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDeepTagConverter.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DumDeepTagConverter extends AbstractTagConverter {
-
-	/**
-	 * @param host
-	 */
-	public DumDeepTagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		return (Element) DOMUtil.cloneNodeDeepIgnoreError(getDestDocument(),
-				getHostElement());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-    // TODO: dead?
-//	private boolean internalIsWidget(Element result) {
-//		String tagname = result.getTagName();
-//		if (IHTMLConstants.TAG_INPUT.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_SELECT.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_TEXTAREA.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_IMG.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_HEAD.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_SCRIPT.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_LINK.equalsIgnoreCase(tagname)) {
-//			return true;
-//		} else {
-//
-//			return false;
-//		}
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isWidget()
-	 */
-	public boolean isWidget() {
-		return true;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDescriptionTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDescriptionTagConverter.java
deleted file mode 100644
index 2221a52..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDescriptionTagConverter.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DumDescriptionTagConverter extends AbstractTagConverter {
-	/**
-	 * @param host
-	 */
-	public DumDescriptionTagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element result = createElement(getHostElement().getTagName());
-		ConverterUtil.copyAllAttributes(getHostElement(), result, null);
-		copyChildren(getHostElement(), result);
-
-		if (!this.isPreviewMode()
-				&& ConverterUtil.isEmptyContainer(getHostElement())) {
-			result.appendChild(ConverterUtil.createDescriptionElement(
-					getDestDocument(), null));
-		}
-
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumTagConverter.java
deleted file mode 100644
index 43c987e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumTagConverter.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.converter;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DumTagConverter extends AbstractTagConverter {
-	/**
-	 * 
-	 */
-	public DumTagConverter(Element host, boolean needBorder) {
-		this(host);
-		this.setNeedBorderDecorator(needBorder);
-	}
-
-	public DumTagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element result = createElement(getHostElement().getTagName());
-		ConverterUtil.copyAllAttributes(getHostElement(), result, null);
-		if (!internalIsWidget(result)) {
-			copyChildren(getHostElement(), result);
-		} else {
-			dumCopyChildren(getHostElement(), result);
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		if (isWidget()) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @param result
-	 * @return
-	 */
-	private boolean internalIsWidget(Element result) {
-		String tagname = result.getTagName();
-		if (IHTMLConstants.TAG_INPUT.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_SELECT.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_TEXTAREA.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_IMG.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_OBJECT.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_HEAD.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_SCRIPT.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_LINK.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_BR.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_STYLE.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_HR.equalsIgnoreCase(tagname)) {
-			return true;
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isWidget()
-	 */
-	public boolean isWidget() {
-		return internalIsWidget(getResultElement());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HTMLStringTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HTMLStringTagConverter.java
deleted file mode 100644
index 1b03c05..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HTMLStringTagConverter.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * For some tag, could generate some XML code.
- * 
- * @author mengbo
- * @version 1.5
- */
-public abstract class HTMLStringTagConverter extends AbstractTagConverter {
-
-	static Logger _log = PDPlugin.getLogger(HTMLStringTagConverter.class);
-
-	/**
-	 * @param host
-	 */
-	public HTMLStringTagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		// following are XML implementation. Assume the string is welformed HTML
-		// try
-		// {
-		// String html = getGeneratedHTML();
-		// DocumentBuilder builder =
-		// DocumentBuilderFactory.newInstance().newDocumentBuilder();
-		// Element result = builder.parse(new InputSource(new
-		// StringReader(html))).getDocumentElement();
-		// return (Element)DOMUtil.cloneNodeDeep(this.getDestDocument(),
-		// result);
-		// }
-		// catch(Exception ex)
-		// {
-		// Element temp = createElement("div");
-		// temp.appendChild(createText("ERROR: "+ex.getMessage()));
-		// return temp;
-		// }
-		InputStream stream = null;
-		try {
-			String id = "" + System.currentTimeMillis() + ".html";
-			IModelManager manager = StructuredModelManager.getModelManager();
-			stream = new ByteArrayInputStream(getGeneratedHTML().getBytes());
-			IDOMModel model = (IDOMModel) manager.getModelForRead(id, stream,
-					null);
-			Element root = model.getDocument().getDocumentElement();
-			Element resultEle = (Element) DOMUtil.cloneNodeDeepIgnoreError(
-					getDestDocument(), root);
-			model.releaseFromRead();
-			return resultEle;
-		} catch (Exception ex) {
-			_log.error("Log.Error.HTMLStringTagConverter.Error", ex);
-			Element temp = createElement("div");
-			temp.appendChild(createText("Error loading: " + ex.getMessage()));
-			return temp;
-		} finally {
-			ResourceUtils.ensureClosed(stream);
-		}
-	}
-
-	/**
-	 * @return the generated HTML string
-	 * @throws Exception
-	 */
-	public abstract String getGeneratedHTML() throws Exception;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter.java
deleted file mode 100644
index 4b4a8a6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter.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.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;
-
-	/**
-	 * 
-	 */
-	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;
-	}
-
-	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 cd09809..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter2.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.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;
-
-	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 002a7b0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IConverterFactory.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;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IConverterFactory {
-	public static final int MODE_DESIGNER = 0;
-
-	public static final int MODE_PREVIEW = 1;
-
-	/**
-	 * 
-	 * @param element
-	 * @return null if this factory don't support this element
-	 */
-	public ITagConverter createConverter(Element element, int mode);
-
-	/**
-	 * get the URI namespace that this factory support. "null" means this
-	 * factory can be used as default factory.
-	 * 
-	 * @return null if this factory don't have a specific URI to support.
-	 */
-	public String getSupportedURI();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IDOMFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IDOMFactory.java
deleted file mode 100644
index 3e3d374..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IDOMFactory.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * Factory interface. AbstractTagConverter will implement it.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IDOMFactory {
-	/**
-	 * create element
-	 * 
-	 * @param tag
-	 * @return a new element using tag as its name
-	 */
-	public Element createElement(String tag);
-
-	/**
-	 * create text node
-	 * 
-	 * @param content
-	 * @return a new text node using content as its body
-	 */
-	public Text createText(String content);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ITagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ITagConverter.java
deleted file mode 100644
index b5aea53..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ITagConverter.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.List;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * ITagConverter is used to convert a custom tag to a HTML tag. Each
- * ITagConverter instance will be dedicated to a single custom tag element.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface ITagConverter {
-	/**
-	 * Set the target document where the converted node should belong to.
-	 * 
-	 * @param document
-	 */
-	public void setDestDocument(IDOMDocument document);
-
-	/**
-	 * refresh the internal state of this ITagConverter. This method normally is
-	 * called when the host element change.
-	 * 
-	 * @param context
-	 */
-	public void convertRefresh(Object context);
-
-	/**
-	 * @return The host element being converted.
-	 */
-	public Element getHostElement();
-
-	/**
-	 * for some tags, they don't convert to HTML. In that case, this method
-	 * should return false for them. And if this method return false, then
-	 * should return an image in <code>getVisualImage()</code> for displaying
-	 * in the designer.
-	 * 
-	 * @return true if the tag represents something that will be rendered visually at runtime
-	 */
-	public boolean isVisualByHTML();
-
-	/**
-	 * if isVisualByHTML() return false, then this method should return an image
-	 * to be displayed in designer.
-	 * 
-	 * Normally this image will be a shared image for those hidden elements. It
-	 * is this class's responsibility to dispose the image if the image is not a
-	 * shared one.
-	 * 
-	 * @return the placeholder image for non-visual tags
-	 */
-	public Image getVisualImage();
-
-	/**
-	 * @return the result element after conversion
-	 */
-	public Element getResultElement();
-
-	/**
-	 * @return the list of children that should be continuely converted.
-	 */
-	public List getChildModeList();
-    
-    /**
-     * @return a list of Element tags that map to non-visual children
-     * Type should be always be Element.
-     */
-    public List getNonVisualChildren();
-
-	/**
-	 * For child nodes that need further convert, return their position in the
-	 * converted DOM tree.
-	 * 
-	 * @param childModel
-	 * @return the position of child nodes
-	 */
-	public ConvertPosition getChildVisualPosition(Node childModel);
-
-	/**
-	 * When the convert result in multi-level element. If this method return
-	 * false, then the caller should not use child nodes of
-	 * <code>getHostElement()</code>
-	 * 
-	 * @return true if the host element has convertable children
-	 */
-	public boolean isMultiLevel();
-
-	/**
-	 * 
-	 * @return true if the host element is a widget
-	 */
-	public boolean isWidget();
-
-	/**
-	 * API contract needed here
-	 * 
-	 */
-	public void dispose();
-
-	/**
-	 * @param mode
-	 */
-	public void setMode(int mode);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/JSFConverterUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/JSFConverterUtil.java
deleted file mode 100644
index 5ac56f8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/JSFConverterUtil.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFConverterUtil {
-	private static List NamedBooleanList = Arrays.asList(new String[] {
-			"disabled", "readonly", "ismap" });
-
-	/**
-	 * 
-	 * @param source
-	 * @param dest
-	 * @param ignore
-	 */
-	public static void copyAllAttributes(Element source, Element dest,
-			Set ignore) {
-		NamedNodeMap attrs = source.getAttributes();
-		for (int i = 0, size = attrs.getLength(); i < size; i++) {
-			Attr attr = (Attr) attrs.item(i);
-			if (ignore == null || !ignore.contains(attr.getName())) {
-				if (NamedBooleanList.contains(attr.getName())
-						&& "false".equalsIgnoreCase(attr.getValue())) {
-					continue;
-				}
-				dest.setAttribute(attr.getName(), attr.getValue());
-			}
-		}
-	}
-
-	/**
-	 * copy a single attribute (if exist)
-	 * 
-	 * @param source
-	 * @param srcattr
-	 * @param dest
-	 * @param destattr
-	 */
-	public static void copyAttribute(Element source, String srcattr,
-			Element dest, String destattr) {
-		Attr attr = source.getAttributeNode(srcattr);
-		if (attr != null) {
-			dest.setAttribute(destattr, attr.getValue());
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/PreferenceReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/PreferenceReader.java
deleted file mode 100644
index 71b2830..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/PreferenceReader.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.converter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PreferenceReader {
-	public final static int FULL_EXPRESSION_TYPE = 0;
-
-	public final static int LAST_EXPRESSION_TYPE = 1;
-
-	public final static int REAL_VALUE_TYPE = 2;
-
-	public static int getMapValueType() {
-		return LAST_EXPRESSION_TYPE;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToDumBlock.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToDumBlock.java
deleted file mode 100644
index 619875d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToDumBlock.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TagConverterToDumBlock extends AbstractTagConverter {
-
-	/**
-	 * @param host
-	 */
-	public TagConverterToDumBlock(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element result = createElement(IHTMLConstants.TAG_DIV);
-		copyChildren(getHostElement(), result);
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToInlineBlock.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToInlineBlock.java
deleted file mode 100644
index a111932..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToInlineBlock.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * This converter can be used simply convert the tag to inline div, and copy all
- * the children
- * 
- * NOTE: It behave almost same as "span". In fact, we may remove this later, if
- * our css engine support "minWidth"/"minHeight" for inline element.
- * 
- * NOTE: it will not copy attributes!
- * 
- * @author mengbo
- * @version 1.5
- * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#getMinHeight()
- * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#getMinWidth()
- */
-public class TagConverterToInlineBlock extends AbstractTagConverter {
-	private int displayMode;
-
-	/**
-	 * @param host
-	 * @param mode
-	 */
-	public TagConverterToInlineBlock(Element host, int mode) {
-		super(host);
-		this.displayMode = mode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element result = null;
-		if (displayMode == IConverterFactory.MODE_PREVIEW) {
-			result = createElement("span");
-			copyChildren(getHostElement(), result);
-		} else {
-			result = createElement("div");
-			result
-					.setAttribute(
-							"style",
-							"display:inline-block; border-width:0; margin:0; min-width:1.2em;min-height:1.2em;");
-			copyChildren(getHostElement(), result);
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToSpan.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToSpan.java
deleted file mode 100644
index 5dfa800..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToSpan.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * This converter can be used simply convert the tag to span, and copy all the
- * children
- * 
- * NOTE: it will not copy attributes!
- * 
- * @author mengbo
- * @version 1.5
- */
-public class TagConverterToSpan extends AbstractTagConverter {
-
-	/**
-	 * @param host
-	 */
-	public TagConverterToSpan(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		// Register a named facet on the UIComponent associated with the
-		// closest parent UIComponent custom action.
-		// we'll render facet as a inline flow figure. so treat it as simple
-		// <span> here.
-		Element result = createElement("span");
-		copyChildren(getHostElement(), result);
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/ATagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/ATagConverter.java
deleted file mode 100644
index a86dd89..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/ATagConverter.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter.html;
-
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.eclipse.jst.pagedesigner.converter.DumTagConverter;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ATagConverter extends DumTagConverter {
-	private boolean _emptyContainer = false;
-
-	/**
-	 * @param host
-	 */
-	public ATagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		_emptyContainer = ConverterUtil.isEmptyContainer(getHostElement());
-		if (_emptyContainer) {
-			Element resultEle = createElement("a");
-			ConverterUtil.copyAllAttributes(getHostElement(), resultEle, null);
-			Text fakedNode = createText("link");
-			resultEle.appendChild(fakedNode);
-			return resultEle;
-		}
-        return super.doConvertRefresh();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-	 */
-	public boolean needBorderDecorator() {
-		return _emptyContainer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return _emptyContainer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return _emptyContainer;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/HTMLConverterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/HTMLConverterFactory.java
deleted file mode 100644
index 829cb01..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/HTMLConverterFactory.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.pagedesigner.converter.html;
-
-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.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 PDPlugin.getDefault().getImage(
-				"palette/GENERIC/small/PD_Palette_Default.gif");
-	}
-
-	/*
-	 * (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 cc9de36..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/IncludeTagConverterPreview.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.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.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
-	 */
-	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);
-	}
-
-	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;
-	}
-
-	public Element previewFile(IFile file) {
-		IDOMModel xmlModel = null;
-		DocumentPageVariableAdapter provider = null;
-		boolean pushedPageVarProvider = false;
-		try {
-
-			xmlModel = (IDOMModel) PDPlugin.getModelManager().getModelForRead(
-					file);
-			if (xmlModel != null) {
-				IDOMDocument doc = xmlModel.getDocument();
-
-				// XXX: need to also register page variable adapters. In the
-				// future, this should go to some
-				// SSE system registry mechanism.
-				xmlModel.getFactoryRegistry().addFactory(
-						new PageVariableAdapterFactory());
-				provider = new DocumentPageVariableAdapter(doc);
-				doc.addAdapter(provider);
-
-				provider.refresh();
-				PageExpressionContext.getCurrent()
-						.pushPageVarProvider(provider);
-
-				Node child = xmlModel.getDocument().getFirstChild();
-				PreviewConvertContext context = new PreviewConvertContext(this
-						.getDestDocument());
-				List results = new ArrayList();
-				while (child != null) {
-					Node node = context.previewConvert(child);
-					if (node != null) {
-						results.add(node);
-					}
-					child = child.getNextSibling();
-				}
-
-				if (results.size() == 0) {
-					return null;
-				} else if (results.size() == 1
-						&& results.get(0) instanceof Element) {
-					return (Element) results.get(0);
-				} else {
-					Element ret = createElement(IHTMLConstants.TAG_SPAN);
-					for (int i = 0, n = results.size(); i < n; i++) {
-						ret.appendChild((Node) results.get(i));
-					}
-					return ret;
-				}
-			}
-		} catch (CoreException e) {
-			_log.error("PreviewUtil.previewFile.CoreException", e);
-		} catch (IOException e) {
-			_log.error("PreviewUtil.previewFile.IOException", e);
-		} catch (Exception ex) {
-			_log.error("PreviewUtil.previewFile.CoreException", ex);
-		} finally {
-			if (pushedPageVarProvider) {
-				PageExpressionContext.getCurrent().popPageVarProvider(provider);
-			}
-			if (xmlModel != null) {
-				xmlModel.releaseFromRead();
-			}
-		}
-		return null;
-	}
-
-	static String getResolvedURL(Element element, String attrName) {
-		URIResolver resolver = null;
-		if (element instanceof IDOMNode) {
-            // TODO: the new URI resolver is not available on the IStructuredModel
-			resolver = ((IDOMNode) element).getModel().getResolver();
-		}
-		if (null == resolver) {
-			return null;
-		}
-		String src = element.getAttribute(attrName);
-		if (src != null && src.length() > 0) {
-			return resolver.getLocationByURI(src);
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/JSPConverterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/JSPConverterFactory.java
deleted file mode 100644
index a9e0b7c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/JSPConverterFactory.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.converter.jsp;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-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.jsp.core.IJSPCoreConstants;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSPConverterFactory implements IConverterFactory {
-    private final ILabelProvider  _labelProvider;
-    
-	/**
-	 * 
-	 */
-	public JSPConverterFactory() {
-        _labelProvider = new MyLabelProvider();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#createConverter(org.w3c.dom.Element)
-	 */
-	public ITagConverter createConverter(Element element, int mode) {
-		String tagName = element.getLocalName();
-
-		if (mode == IConverterFactory.MODE_PREVIEW) {
-			// we want to generate the included page in preview, so
-			// handle differently
-			if (IJSPCoreConstants.TAG_INCLUDE.equalsIgnoreCase(tagName)) {
-				IncludeTagConverterPreview c = new IncludeTagConverterPreview(
-						element, "page");
-				c.setMode(mode);
-				return c;
-			} else if (IJSPCoreConstants.TAG_DIRECTIVE_INCLUDE
-					.equalsIgnoreCase(tagName)) {
-				IncludeTagConverterPreview c = new IncludeTagConverterPreview(
-						element, "file");
-				c.setMode(mode);
-				return c;
-			} else if (IJSPCoreConstants.TAG_ROOT.equalsIgnoreCase(tagName)) {
-				TagConverterToDumBlock c = new TagConverterToDumBlock(element);
-				c.setNeedBorderDecorator(true);
-				c.setMode(mode);
-				return c;
-			} else {
-				return new HiddenTagConverter(element, _labelProvider);
-			}
-		}
-        if (IJSPCoreConstants.TAG_ROOT.equalsIgnoreCase(tagName)) {
-        	TagConverterToDumBlock c = new TagConverterToDumBlock(element);
-        	c.setNeedBorderDecorator(true);
-        	c.setMode(mode);
-        	return c;
-        }
-        return new HiddenTagConverter(element, _labelProvider);
-	}
-    
-    private static class MyLabelProvider extends org.eclipse.jface.viewers.LabelProvider
-    {
-
-        public Image getImage(Object element) 
-        {
-            if (element instanceof ITagConverter)
-            {
-                final Element hostElement = ((ITagConverter)element).getHostElement();
-                final String tagName = hostElement.getLocalName();
-                return getJSPSharedImage(tagName);
-            }
-            
-            return null;
-        }
-    }
-
-	/**
-	 * @param tagName
-	 * @return
-	 */
-	private static Image getJSPSharedImage(String tagName) {
-		Image image = PDPlugin.getDefault().getImage(
-				"palette/JSP/small/JSP_" + tagName.toUpperCase() + ".gif");
-		return image;
-	}
-
-	/*
-	 * (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/css2/CSSTempUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/CSSTempUtil.java
deleted file mode 100644
index 91fee54..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/CSSTempUtil.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;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetAdapter;
-import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetListAdapter;
-import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.stylesheets.StyleSheet;
-import org.w3c.dom.stylesheets.StyleSheetList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public 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 ele
-	 * @return
-	 * @see org.eclipse.wst.html.core.htmlcss.HTMLDocumentAdapter#addStyleSheet(org.w3c.dom.Element)
-	 */
-	public static List getStyleSheets(Element element) {
-		List styleSheets = new ArrayList();
-		INodeNotifier docnotifier = (INodeNotifier) element.getOwnerDocument();
-		IStyleSheetListAdapter adapter = (IStyleSheetListAdapter) docnotifier
-				.getAdapterFor(IStyleSheetListAdapter.class);
-
-		StyleSheetList ssl = (adapter == null ? null : adapter.getStyleSheets());
-
-		if (ssl != null) {
-			for (int i = 0, numStyles = ssl.getLength(); i < numStyles; i++) {
-				// loop for styles (<style> and <link>)
-				org.w3c.dom.stylesheets.StyleSheet ss = ssl.item(i);
-				styleSheets.add(ss);
-			}
-		}
-
-		// now is our work-around part for support datawindow.
-		Node parent = element.getParentNode();
-		Element rootEle = element;
-		while (parent != null && parent instanceof Element) {
-			rootEle = (Element) parent;
-			parent = parent.getParentNode();
-		}
-		addStyleSheet(rootEle, styleSheets);
-		return styleSheets;
-	}
-
-	/**
-	 */
-	private static void addStyleSheet(Element node, List result) {
-		IDOMElement element = (IDOMElement) node;
-		String tagName = element.getTagName();
-		if (tagName == null) {
-			return;
-		}
-		boolean isContainer = false;
-
-		if (element.isCommentTag()) {
-			Node parent = element.getParentNode();
-			if (parent == element.getOwnerDocument()) {
-				// This condition is too severe, actually do not work for JSF
-				// template.
-				// But above (! globalTag() && isContainer()) cover JSF template
-				// + tpl template
-				isContainer = true;
-			} else if (parent.getNodeType() == Node.ELEMENT_NODE) {
-				tagName = ((Element) parent).getTagName();
-				if (tagName != null
-						&& tagName
-								.equalsIgnoreCase(HTML40Namespace.ElementName.HEAD)) {
-					isContainer = true;
-				}
-			}
-		} else {
-			INodeNotifier notifier = element;
-
-			// (lium) Increase performance: since this method is called tooooo
-			// many times,
-			// and getAdapterFor() is slow, so add a check on the tagName to
-			// filter
-			// those stylesheet stuff first.
-			if (IHTMLConstants.TAG_LINK.equalsIgnoreCase(tagName)
-					|| IHTMLConstants.TAG_STYLE.equalsIgnoreCase(tagName)) {
-				INodeAdapter adapter = notifier
-						.getAdapterFor(IStyleSheetAdapter.class);
-				if (adapter instanceof IStyleSheetAdapter) {
-                    // XXX: see bug 171740.  This is a (hopefully) temporary
-                    // workaround that avoids having the call to getSheet throw an NPE
-                    IStyleSheetAdapter sheetAdapter = (IStyleSheetAdapter) adapter;
-                    if (sheetAdapter.getElement() != null
-                            && "text/css".equals(sheetAdapter.getElement().getAttribute(HTML40Namespace.ATTR_NAME_TYPE)))
-
-                    {
-    					StyleSheet sheet = ((IStyleSheetAdapter) adapter)
-    							.getSheet();
-                        
-                        if (sheet != null)
-                        {
-                            result.add(sheet);
-                        }
-                    }
-				}
-			}
-
-			isContainer = true;
-		}
-		if (isContainer) {
-			for (Node child = element.getFirstChild(); child != null; child = child
-					.getNextSibling()) {
-				if (child.getNodeType() != Node.ELEMENT_NODE)
-					continue;
-				addStyleSheet((Element) child, result);
-			}
-		}
-	}
-}
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 edd0ffe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/CSSUtil.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.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;
-
-	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
-	 */
-	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 node
-	 * @return
-	 */
-	public static String resolveCSSStyle(ICSSStyle style) {
-		StringBuffer sb = new StringBuffer();
-		Object object1 = style.getColor();
-		if (object1 instanceof Color) {
-			sb.append("color:");
-
-			sb.append("#").append(
-					Integer.toHexString(((Color) object1).getRed()));
-			sb.append("#").append(
-					Integer.toHexString(((Color) object1).getGreen()));
-			sb.append("#").append(
-					Integer.toHexString(((Color) object1).getBlue()));
-			sb.append(";");
-		}
-		Object object2 = style.getCSSFont();
-		if (object2 instanceof CSSFont) {
-			sb.append(((CSSFont) object2).getCSSString());
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Many of this method implementation copied from HTMLDocumentAdapter,
-	 * mainly add support for user agent default style sheet.
-	 * 
-	 * @param element
-	 *            the element.
-	 * @param pseudoName
-	 *            the pseudoname of the element
-	 * @return
-	 */
-	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
-	 */
-	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 = CSSUtil.class
-					.getResourceAsStream(IJMTConstants.USERAGENT);
-			IStructuredModel model = StructuredModelManager.getModelManager()
-					.getModelForEdit(IJMTConstants.USERAGENT, input, null);
-			ICSSModel cssmodel = (ICSSModel) model;
-			_userAgentDefault = (StyleSheet) cssmodel.getDocument();
-
-			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 6f774fc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/ICSSStyle.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;
-
-import java.util.Map;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.list.ICounterValueGenerator;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-
-/**
- * The style declaration for an element can be cached.
- * 
- * @author mengbo
- */
-public interface ICSSStyle extends INodeAdapter, IAdaptable {
-
-    // the number of extra pixels to add to top, bottom, left and right padding insets
-    // in the rendering so that separation between contained components is more
-    // apparent at design time.  These extra pixels are design mode only
-    // Note: margin padding would be preferred but it doesn't seem to affect
-    // bottom padding the way border insets do.
-    // TODO:  this should be set to a preference and probably also use an
-    // algorithm to determine if the the current box style already has a large
-    // enough separation offset (perhaps a threshold instead of an additive value)
-    public static final int ARTIFICIAL_BORDER_OFFSET = 4;
-    
-    public static final int INHERIT = Integer.MIN_VALUE;
-    
-	public static final String TOP = "top";
-
-	public static final String RIGHT = "right";
-
-	public static final String LEFT = "left";
-
-	public static final String BOTTOM = "bottom";
-
-	public void reset();
-
-	public ICSSFont getCSSFont();
-
-	public Object getStyleProperty(String property);
-
-	public Insets getMarginInsets();
-
-	public Insets getBorderInsets();
-
-	public Insets getPaddingInsets();
-
-	/**
-	 * shortcut method to get the CSS display.
-	 * 
-	 * @see http://www.w3.org/TR/REC-CSS2/visuren.html#propdef-display
-	 * @return
-	 */
-	public String getDisplay();
-
-	/**
-	 * null means transparent.
-	 * 
-	 * @return
-	 */
-	public Object getBackgroundColor();
-
-	public Object getColor();
-
-	/**
-	 * @return
-	 */
-	public boolean isSizeIncludeBorderPadding();
-
-	public void dispose();
-
-	/**
-	 * @return
-	 */
-	public ICSSStyle getParentStyle();
-
-	/**
-	 * Get counters declared on this style. the counters are either created by
-	 * counter-reset or refered by counter-increment
-	 * 
-	 * @return
-	 */
-	public Map getCounters();
-
-	/**
-	 * Search a named counter declared on this style or its ancestors' styles
-	 * 
-	 * @param name
-	 * @param must
-	 * @return
-	 */
-	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
-	 */
-	public int getRowSpan();
-
-	/**
-	 * @return
-	 */
-	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
-	 */
-	public boolean isInSelection();
-
-	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 b2afe44..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/border/CSSBorder.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.css2.border;
-
-import java.util.Arrays;
-
-import org.eclipse.draw2d.AbstractBorder;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.MessageFormater;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- */
-public class CSSBorder extends AbstractBorder {
-
-	private static final String BODER_QUERY_TEMPLETE = "border-{0}-style";
-
-	private static final String COLOR_QUERY_TEMPLETE = "border-{0}-color";
-
-	private ICSSStyle _style;
-
-	protected Rectangle _innerRect = new Rectangle();
-
-	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) };
-	}
-
-	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);
-		}
-	}
-
-	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 3e6e57a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorConverter.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.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();
-
-	public static CSSColorConverter getInstantce() {
-		if (_instance == null) {
-			_instance = new CSSColorConverter();
-		}
-		return _instance;
-	}
-
-	protected 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 5e278da..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 {
-	public static final HashMap SYSTEM_DEFAULT_COLORS = new HashMap(20);
-
-	public static final HashMap EXTENDED_COLORS = new HashMap(20);
-
-    // TODO C.B.: there is overlap here between the default and extended
-    // colors.  Also, for the custom colors, should use a ColorRegistry
-    // that allows other components to share values here
-	static {
-		SYSTEM_DEFAULT_COLORS.put("black", ColorConstants.black);
-		SYSTEM_DEFAULT_COLORS.put("blue", ColorConstants.blue);
-		SYSTEM_DEFAULT_COLORS.put("gray", ColorConstants.gray);
-		SYSTEM_DEFAULT_COLORS.put("green", new Color(null, 0, 128, 0));
-		SYSTEM_DEFAULT_COLORS.put("orange", ColorConstants.orange);
-		SYSTEM_DEFAULT_COLORS.put("red", ColorConstants.red);
-		SYSTEM_DEFAULT_COLORS.put("white", ColorConstants.white);
-		SYSTEM_DEFAULT_COLORS.put("yellow", ColorConstants.yellow);
-		SYSTEM_DEFAULT_COLORS.put("aqua", ColorConstants.cyan);
-		SYSTEM_DEFAULT_COLORS.put("fuchsia", new Color(null, 255, 0, 255));
-		SYSTEM_DEFAULT_COLORS.put("lime", ColorConstants.green);
-		SYSTEM_DEFAULT_COLORS.put("maroon", new Color(null, 128, 0, 0));
-		SYSTEM_DEFAULT_COLORS.put("navy", new Color(null, 0, 0, 128));
-		SYSTEM_DEFAULT_COLORS.put("olive", new Color(null, 128, 128, 0));
-		SYSTEM_DEFAULT_COLORS.put("purple", new Color(null, 128, 0, 128));
-		SYSTEM_DEFAULT_COLORS.put("silver", ColorConstants.lightGray);
-		SYSTEM_DEFAULT_COLORS.put("teal", new Color(null, 0, 128, 128));
-
-		SYSTEM_DEFAULT_COLORS.put("activeborder", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_WIDGET_BORDER));
-		// Active window border.
-		SYSTEM_DEFAULT_COLORS.put("activecaption",
-				ColorConstants.titleBackground);
-		// Active window caption.
-		SYSTEM_DEFAULT_COLORS
-				.put("appworkspace", ColorConstants.listBackground);
-		// Background color of multiple document interface.
-		SYSTEM_DEFAULT_COLORS.put("background", ColorConstants.listBackground);
-		// Desktop background.
-		SYSTEM_DEFAULT_COLORS.put("buttonface", ColorConstants.button);
-		// Face color for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("buttonhighlight",
-				ColorConstants.buttonLightest);
-		// Dark shadow for three-dimensional display elements (for edges facing
-		// away from the light source).
-		SYSTEM_DEFAULT_COLORS.put("buttonshadow", ColorConstants.buttonDarker);
-		// Shadow color for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("buttontext", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_WIDGET_FOREGROUND));
-		// Text on push buttons.
-		SYSTEM_DEFAULT_COLORS
-				.put("captiontext", ColorConstants.titleForeground);
-		// Text in caption, size box, and scrollbar arrow box.
-		SYSTEM_DEFAULT_COLORS.put("graytext",
-				ColorConstants.titleInactiveForeground);
-		// Grayed (disabled) text. This color is set to #000 if the current
-		// display driver does not support a solid gray color.
-		SYSTEM_DEFAULT_COLORS.put("highlight",
-				ColorConstants.menuBackgroundSelected);
-		// Item(s) selected in a control.
-		SYSTEM_DEFAULT_COLORS.put("highlighttext",
-				ColorConstants.menuForegroundSelected);
-		// Text of item(s) selected in a control.
-		SYSTEM_DEFAULT_COLORS.put("inactiveborder", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT));
-		// Inactive window border.
-		SYSTEM_DEFAULT_COLORS.put("inactivecaption",
-				ColorConstants.titleInactiveBackground);
-		// Inactive window caption.
-		SYSTEM_DEFAULT_COLORS.put("inactivecaptiontext",
-				ColorConstants.titleInactiveForeground);
-		// Color of text in an inactive caption.
-		SYSTEM_DEFAULT_COLORS.put("infobackground",
-				ColorConstants.tooltipBackground);
-		// Background color for tooltip controls.
-		SYSTEM_DEFAULT_COLORS.put("infotext", ColorConstants.tooltipForeground);
-		// Text color for tooltip controls.
-		SYSTEM_DEFAULT_COLORS.put("menu", ColorConstants.menuBackground);
-		// Menu background.
-		SYSTEM_DEFAULT_COLORS.put("menutext", ColorConstants.menuForeground);
-		// Text in menus.
-		SYSTEM_DEFAULT_COLORS.put("scrollbar", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
-		// Scroll bar gray area.
-		SYSTEM_DEFAULT_COLORS.put("threeddarkshadow", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_WIDGET_DARK_SHADOW));
-		// Dark shadow for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("threedface", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
-		// Face color for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("threedhighlight", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW));
-		// Highlight color for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("threedlightshadow", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW));
-		// Light color for three-dimensional display elements (for edges facing
-		// the light source).
-		SYSTEM_DEFAULT_COLORS.put("threedshadow", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_WIDGET_DARK_SHADOW));
-		// Dark shadow for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("window", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_LIST_BACKGROUND));
-		// Window background.
-		SYSTEM_DEFAULT_COLORS.put("windowframe", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_WIDGET_BORDER));
-		// Window frame.
-		SYSTEM_DEFAULT_COLORS.put("windowtext", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_LIST_FOREGROUND));
-		// Window text
-		SYSTEM_DEFAULT_COLORS.put("hyperlink", ColorConstants.blue);
-	}
-
-    // populate the extended color palette.  Where the extended 
-    // color is the same as a constant color, use that to save
-    // on SWT resource handles
-	static {
-		EXTENDED_COLORS.put("aliceblue", new Color(null, 240, 248, 255));
-		EXTENDED_COLORS.put("antiquewhite", new Color(null, 250, 235, 215));
-		EXTENDED_COLORS.put("aqua", ColorConstants.cyan);
-		EXTENDED_COLORS.put("aquamarine", new Color(null, 127, 255, 212));
-		EXTENDED_COLORS.put("azure", new Color(null, 240, 255, 255));
-		EXTENDED_COLORS.put("beige", new Color(null, 245, 245, 220));
-		EXTENDED_COLORS.put("bisque", new Color(null, 255, 228, 196));
-		EXTENDED_COLORS.put("black", ColorConstants.black);
-		EXTENDED_COLORS.put("blanchedalmond", new Color(null, 255, 235, 205));
-		EXTENDED_COLORS.put("blue", ColorConstants.blue);
-		EXTENDED_COLORS.put("blueviolet", new Color(null, 138, 43, 226));
-		EXTENDED_COLORS.put("brown", new Color(null, 165, 42, 42));
-		EXTENDED_COLORS.put("burlywood", new Color(null, 222, 184, 135));
-		EXTENDED_COLORS.put("cadetblue", new Color(null, 95, 158, 160));
-		EXTENDED_COLORS.put("chartreuse", new Color(null, 127, 255, 0));
-		EXTENDED_COLORS.put("chocolate", new Color(null, 210, 105, 30));
-		EXTENDED_COLORS.put("coral", new Color(null, 255, 127, 80));
-		EXTENDED_COLORS.put("cornflowerblue", new Color(null, 100, 149, 237));
-		EXTENDED_COLORS.put("cornsilk", new Color(null, 255, 248, 220));
-		EXTENDED_COLORS.put("crimson", new Color(null, 220, 20, 60));
-		EXTENDED_COLORS.put("cyan", new Color(null, 0, 255, 255));
-		EXTENDED_COLORS.put("darkblue", new Color(null, 0, 0, 139));
-		EXTENDED_COLORS.put("darkcyan", new Color(null, 0, 139, 139));
-		EXTENDED_COLORS.put("darkgoldenrod", new Color(null, 184, 134, 11));
-		EXTENDED_COLORS.put("darkgray", new Color(null, 169, 169, 169));
-		EXTENDED_COLORS.put("darkgreen", new Color(null, 0, 100, 0));
-		EXTENDED_COLORS.put("darkkhaki", new Color(null, 189, 183, 107));
-		EXTENDED_COLORS.put("darkmagenta", new Color(null, 139, 0, 139));
-		EXTENDED_COLORS.put("darkolivegreen", new Color(null, 85, 107, 47));
-		EXTENDED_COLORS.put("darkorange", new Color(null, 255, 140, 0));
-		EXTENDED_COLORS.put("darkorchid", new Color(null, 153, 50, 204));
-		EXTENDED_COLORS.put("darkred", new Color(null, 139, 0, 0));
-		EXTENDED_COLORS.put("darksalmon", new Color(null, 233, 150, 122));
-		EXTENDED_COLORS.put("darkseagreen", new Color(null, 143, 188, 143));
-		EXTENDED_COLORS.put("darkslateblue", new Color(null, 72, 61, 139));
-		EXTENDED_COLORS.put("darkslategray", new Color(null, 47, 79, 79));
-		EXTENDED_COLORS.put("darkturquoise", new Color(null, 0, 206, 209));
-		EXTENDED_COLORS.put("darkviolet", new Color(null, 148, 0, 211));
-		EXTENDED_COLORS.put("deeppink", new Color(null, 255, 20, 147));
-		EXTENDED_COLORS.put("deepskyblue", new Color(null, 0, 191, 255));
-		EXTENDED_COLORS.put("dimgray", new Color(null, 105, 105, 105));
-		EXTENDED_COLORS.put("dodgerblue", new Color(null, 30, 144, 255));
-		EXTENDED_COLORS.put("feldspar", new Color(null, 209, 146, 117));
-		EXTENDED_COLORS.put("firebrick", new Color(null, 178, 34, 34));
-		EXTENDED_COLORS.put("floralwhite", new Color(null, 255, 250, 240));
-		EXTENDED_COLORS.put("forestgreen", new Color(null, 34, 139, 34));
-		EXTENDED_COLORS.put("fuchsia", new Color(null, 255, 0, 255));
-		EXTENDED_COLORS.put("gainsboro", new Color(null, 220, 220, 220));
-		EXTENDED_COLORS.put("ghostwhite", new Color(null, 248, 248, 255));
-		EXTENDED_COLORS.put("gold", new Color(null, 255, 215, 0));
-		EXTENDED_COLORS.put("goldenrod", new Color(null, 218, 165, 32));
-		EXTENDED_COLORS.put("gray", ColorConstants.gray);
-		EXTENDED_COLORS.put("green", new Color(null, 0, 128, 0));
-		EXTENDED_COLORS.put("greenyellow", new Color(null, 173, 255, 47));
-		EXTENDED_COLORS.put("honeydew", new Color(null, 240, 255, 240));
-		EXTENDED_COLORS.put("hotpink", new Color(null, 255, 105, 180));
-		EXTENDED_COLORS.put("indianred", new Color(null, 205, 92, 92));
-		EXTENDED_COLORS.put("indigo", new Color(null, 75, 0, 130));
-		EXTENDED_COLORS.put("ivory", new Color(null, 255, 255, 240));
-		EXTENDED_COLORS.put("khaki", new Color(null, 240, 230, 140));
-		EXTENDED_COLORS.put("lavender", new Color(null, 230, 230, 250));
-		EXTENDED_COLORS.put("lavenderblush", new Color(null, 255, 240, 245));
-		EXTENDED_COLORS.put("lawngreen", new Color(null, 124, 252, 0));
-		EXTENDED_COLORS.put("lemonchiffon", new Color(null, 255, 250, 205));
-		EXTENDED_COLORS.put("lightblue", new Color(null, 173, 216, 230));
-		EXTENDED_COLORS.put("lightcoral", new Color(null, 240, 128, 128));
-		EXTENDED_COLORS.put("lightcyan", new Color(null, 224, 255, 255));
-		EXTENDED_COLORS.put("lightgoldenrodyellow", new Color(null, 250, 250,
-				210));
-		EXTENDED_COLORS.put("lightgrey", new Color(null, 211, 211, 211));
-		EXTENDED_COLORS.put("lightgreen", new Color(null, 144, 238, 144));
-		EXTENDED_COLORS.put("lightpink", new Color(null, 255, 182, 193));
-		EXTENDED_COLORS.put("lightsalmon", new Color(null, 255, 160, 122));
-		EXTENDED_COLORS.put("lightseagreen", new Color(null, 32, 178, 170));
-		EXTENDED_COLORS.put("lightskyblue", new Color(null, 135, 206, 250));
-		EXTENDED_COLORS.put("lightslateblue", new Color(null, 132, 112, 255));
-		EXTENDED_COLORS.put("lightslategray", new Color(null, 119, 136, 153));
-		EXTENDED_COLORS.put("lightsteelblue", new Color(null, 176, 196, 222));
-		EXTENDED_COLORS.put("lightyellow", new Color(null, 255, 255, 224));
-		EXTENDED_COLORS.put("lime", ColorConstants.green);
-		EXTENDED_COLORS.put("limegreen", new Color(null, 50, 205, 50));
-		EXTENDED_COLORS.put("linen", new Color(null, 250, 240, 230));
-		EXTENDED_COLORS.put("magenta", new Color(null, 255, 0, 255));
-		EXTENDED_COLORS.put("maroon", new Color(null, 128, 0, 0));
-		EXTENDED_COLORS.put("mediumaquamarine", new Color(null, 102, 205, 170));
-		EXTENDED_COLORS.put("mediumblue", new Color(null, 0, 0, 205));
-		EXTENDED_COLORS.put("mediumorchid", new Color(null, 186, 85, 211));
-		EXTENDED_COLORS.put("mediumpurple", new Color(null, 147, 112, 216));
-		EXTENDED_COLORS.put("mediumseagreen", new Color(null, 60, 179, 113));
-		EXTENDED_COLORS.put("mediumslateblue", new Color(null, 123, 104, 238));
-		EXTENDED_COLORS.put("mediumspringgreen", new Color(null, 0, 250, 154));
-		EXTENDED_COLORS.put("mediumturquoise", new Color(null, 72, 209, 204));
-		EXTENDED_COLORS.put("mediumvioletred", new Color(null, 199, 21, 133));
-		EXTENDED_COLORS.put("midnightblue", new Color(null, 25, 25, 112));
-		EXTENDED_COLORS.put("mintcream", new Color(null, 245, 255, 250));
-		EXTENDED_COLORS.put("mistyrose", new Color(null, 255, 228, 225));
-		EXTENDED_COLORS.put("moccasin", new Color(null, 255, 228, 181));
-		EXTENDED_COLORS.put("navajowhite", new Color(null, 255, 222, 173));
-		EXTENDED_COLORS.put("navy", new Color(null, 0, 0, 128));
-		EXTENDED_COLORS.put("oldlace", new Color(null, 253, 245, 230));
-		EXTENDED_COLORS.put("olive", new Color(null, 128, 128, 0));
-		EXTENDED_COLORS.put("olivedrab", new Color(null, 107, 142, 35));
-		EXTENDED_COLORS.put("orange", new Color(null, 255, 165, 0));
-		EXTENDED_COLORS.put("orangeted", new Color(null, 255, 69, 0));
-		EXTENDED_COLORS.put("orchid", new Color(null, 218, 112, 214));
-		EXTENDED_COLORS.put("ralegoldenrod", new Color(null, 238, 232, 170));
-		EXTENDED_COLORS.put("palegreen", new Color(null, 152, 251, 152));
-		EXTENDED_COLORS.put("paleturquoise", new Color(null, 175, 238, 238));
-		EXTENDED_COLORS.put("palevioletred", new Color(null, 216, 112, 147));
-		EXTENDED_COLORS.put("papayawhip", new Color(null, 255, 239, 213));
-		EXTENDED_COLORS.put("peachpuff", new Color(null, 255, 218, 185));
-		EXTENDED_COLORS.put("peru", new Color(null, 205, 133, 63));
-		EXTENDED_COLORS.put("pink", new Color(null, 255, 192, 203));
-		EXTENDED_COLORS.put("plum", new Color(null, 221, 160, 221));
-		EXTENDED_COLORS.put("powderblue", new Color(null, 176, 224, 230));
-		EXTENDED_COLORS.put("purple", new Color(null, 128, 0, 128));
-		EXTENDED_COLORS.put("red", ColorConstants.red);
-		EXTENDED_COLORS.put("rosybrown", new Color(null, 188, 143, 143));
-		EXTENDED_COLORS.put("royalblue", new Color(null, 65, 105, 225));
-		EXTENDED_COLORS.put("saddlebrown", new Color(null, 139, 69, 19));
-		EXTENDED_COLORS.put("salmon", new Color(null, 250, 128, 114));
-		EXTENDED_COLORS.put("sandybrown", new Color(null, 244, 164, 96));
-		EXTENDED_COLORS.put("seagreen", new Color(null, 46, 139, 87));
-		EXTENDED_COLORS.put("seashell", new Color(null, 255, 245, 238));
-		EXTENDED_COLORS.put("sienna", new Color(null, 160, 82, 45));
-		EXTENDED_COLORS.put("silver", new Color(null, 192, 192, 192));
-		EXTENDED_COLORS.put("skyblue", new Color(null, 135, 206, 235));
-		EXTENDED_COLORS.put("slateblue", new Color(null, 106, 90, 205));
-		EXTENDED_COLORS.put("slategray", new Color(null, 112, 128, 144));
-		EXTENDED_COLORS.put("snow", new Color(null, 255, 250, 250));
-		EXTENDED_COLORS.put("springgreen", new Color(null, 0, 255, 127));
-		EXTENDED_COLORS.put("steelblue", new Color(null, 70, 130, 180));
-		EXTENDED_COLORS.put("tan", new Color(null, 210, 180, 140));
-		EXTENDED_COLORS.put("teal", new Color(null, 0, 128, 128));
-		EXTENDED_COLORS.put("thistle", new Color(null, 216, 191, 216));
-		EXTENDED_COLORS.put("tomato", new Color(null, 255, 99, 71));
-		EXTENDED_COLORS.put("turquoise", new Color(null, 64, 224, 208));
-		EXTENDED_COLORS.put("violet", new Color(null, 238, 130, 238));
-		EXTENDED_COLORS.put("violetred", new Color(null, 208, 32, 144));
-		EXTENDED_COLORS.put("wheat", new Color(null, 245, 222, 179));
-		EXTENDED_COLORS.put("white", ColorConstants.white);
-		EXTENDED_COLORS.put("whitesmoke", new Color(null, 245, 245, 245));
-		EXTENDED_COLORS.put("yellow", ColorConstants.yellow);
-		EXTENDED_COLORS.put("yellowgreen", new Color(null, 154, 205, 50));
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorManager.java
deleted file mode 100644
index 66dce7b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorManager.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.color;
-
-/**
- * @author mengbo
- */
-public class CSSColorManager {
-	private static CSSColorManager _instance;
-
-	private CSSColorManager() {
-        // no external instantiation
-	}
-
-	/**
-	 * @return the single instance
-	 */
-	public static CSSColorManager getInstance() {
-		if (_instance == null) {
-			_instance = new CSSColorManager();
-		}
-		return _instance;
-	}
-
-	/**
-	 * return Color or RGB. If return color, then the returned color is system
-	 * color, caller should NOT dispose the returned color
-	 * 
-	 * @param cssText
-	 * @return the color object for cssText
-	 */
-	public Object getColor(String cssText) {
-		return CSSColorConverter.getInstantce().getCSSColor(cssText);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFont.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFont.java
deleted file mode 100644
index 646da86..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFont.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.font;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * @author mengbo
- */
-public class CSSFont implements ICSSFont {
-	private String _family;
-
-	private int _size;
-
-	private int _style;
-
-	private int _weight;
-
-	private String _cssString;
-
-	/**
-	 * @param family 
-	 * @param size 
-	 * @param style 
-	 * @param weight 
-	 * @param cssString 
-	 * 
-	 */
-	public CSSFont(String family, int size, int style, int weight,
-			String cssString) {
-		this._family = family;
-		this._size = size;
-		this._style = style;
-		this._weight = weight;
-		_cssString = cssString;
-	}
-
-	public String getFontFamily() {
-		return _family;
-	}
-
-	public int getFontSize() {
-		return _size;
-	}
-
-	public int getFontStyle() {
-		return _style;
-	}
-
-	public String getCSSString() {
-		return _cssString;
-	}
-
-	public int getWeight() {
-		return _weight;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if (obj instanceof CSSFont) {
-			CSSFont fd = (CSSFont) obj;
-			return this._family.equals(fd._family) && this._size == fd._size
-					&& this._style == fd._style && this._weight == fd._weight;
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return _family.hashCode() + _size + _style + _weight;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.font.ICSSFont#getSwtFont()
-	 */
-	public Font getSwtFont() {
-		// return FontPoolManager.getInstance().getFont(this);
-		return CSSFontManager.getInstance().getSwtFont(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.font.ICSSFont#getXHeight()
-	 */
-	public int getXHeight() {
-		return getFontSize();
-	}
-
-	/**
-	 * @return the style mask for the font style
-	 */
-	public int getSwtFontStyle() {
-		int style = SWT.NONE;
-		// see:http://www.htmlhelp.com/reference/css/font/font-weight.html
-		if (getWeight() >= 600)
-			style |= SWT.BOLD;
-		style |= getFontStyle();
-		return style;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFontManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFontManager.java
deleted file mode 100644
index 3fc1c94..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFontManager.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.font;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.FontFamilyMeta;
-import org.eclipse.jst.pagedesigner.css2.property.FontSizeMeta;
-import org.eclipse.jst.pagedesigner.css2.property.FontWeightMeta;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.utils.CacheManager;
-import org.eclipse.jst.pagedesigner.utils.ICacheEntryCreator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- */
-public class CSSFontManager implements ICSSFontManager {
-	private static CSSFontManager _instance;
-
-	private static final boolean DEBUG = false;
-
-	private int _totalFont = 0;
-
-	// private static FontPoolManager _fontPoolManager;
-	// Map _cache = new HashMap();
-
-	private static final int CACHESIZE = 100; // we cache 100 font.
-
-	// the scale to convert the px to pt.
-	private final static double FONT_SCALE = ((double) Display.getCurrent()
-			.getDPI().x) / 72;
-
-	static String cssFontToLocalFont(String original) {
-		if ("serif".equalsIgnoreCase(original)) {
-			return "Georgia";
-		} else if ("sans-serif".equalsIgnoreCase(original)) {
-			return "Arial";
-		} else if ("cursive".equalsIgnoreCase(original)) {
-			// FIXME: MS windows does not support the alternative fonts that
-			// match cursive defined at
-			// http://www.w3.org/TR/REC-CSS2/fonts.html#generic-font-families,
-			// We use Comic Sans MS font family
-			// because it is MS alternative.
-			return "Comic Sans MS";
-		} else if ("fantasy".equalsIgnoreCase(original)) {
-			return cssFontToLocalFont("serif");
-		} else if ("monospace".equalsIgnoreCase(original)) {
-			return "Courier New";
-		} else {
-			return original;
-		}
-	}
-
-	private CacheManager _cacheManager = new CacheManager(
-			new ICacheEntryCreator() {
-				public Object createEntry(Object key) {
-					if (DEBUG) {
-						_totalFont++;
-						System.out.println("TotalFont++: " + _totalFont);
-					}
-					CSSFont cssfont = (CSSFont) key;
-
-					Font font = new Font(null, cssFontToLocalFont(cssfont
-							.getFontFamily()), (int) Math.round(cssfont
-							.getFontSize()
-							/ FONT_SCALE), cssfont.getSwtFontStyle());
-					return font;
-				}
-
-				public void dispose(Object key, Object entry) {
-					if (DEBUG) {
-						_totalFont--;
-						System.out.println("TotalFont--: " + _totalFont);
-					}
-					((Font) entry).dispose();
-
-				}
-			}, CACHESIZE);
-
-	/**
-	 * constructor
-	 */
-	private CSSFontManager() {
-		super();
-	}
-
-	private String resolveFontStyleString(ICSSStyle style) {
-		StringBuffer sb = new StringBuffer();
-		sb.append(ICSSPropertyID.ATTR_FONT_FAMILY).append(":");
-		sb.append("'").append(
-				(String) style
-						.getStyleProperty(ICSSPropertyID.ATTR_FONT_FAMILY))
-				.append("'");
-		sb.append(";");
-		sb.append(ICSSPropertyID.ATTR_FONT_STYLE).append(":");
-		sb
-				.append(
-						(String) style
-								.getStyleProperty(ICSSPropertyID.ATTR_FONT_STYLE))
-				.append(";");
-		sb.append(ICSSPropertyID.ATTR_FONT_WEIGHT).append(":");
-		sb.append(
-				((Integer) style
-						.getStyleProperty(ICSSPropertyID.ATTR_FONT_WEIGHT))
-						.toString()).append(";");
-		sb.append(ICSSPropertyID.ATTR_FONT_SIZE).append(":");
-		int fontSize = getFontSize(style, style
-				.getStyleProperty(ICSSPropertyID.ATTR_FONT_SIZE));
-		sb.append(Integer.toString(fontSize));
-		return sb.toString();
-	}
-
-	public ICSSFont createFont(ICSSStyle style) {
-		String fontfamily = (String) style
-				.getStyleProperty(ICSSPropertyID.ATTR_FONT_FAMILY);
-		Object fontsizeobj = style
-				.getStyleProperty(ICSSPropertyID.ATTR_FONT_SIZE);
-		int fontsize;
-		fontsize = getFontSize(style, fontsizeobj);
-		int fontstyle = getFontStyle(style);
-		int fontweight = ((Integer) style
-				.getStyleProperty(ICSSPropertyID.ATTR_FONT_WEIGHT)).intValue();
-
-		return new CSSFont(fontfamily, fontsize, fontstyle, fontweight,
-				resolveFontStyleString(style));
-	}
-
-	private int getFontSize(ICSSStyle style, Object fontsizeobj) {
-		int fontsize;
-		if (fontsizeobj instanceof Length) {
-			fontsize = ((Length) fontsizeobj).getValue();
-		} else {
-			fontsize = style.getParentStyle().getCSSFont().getFontSize();
-		}
-		return fontsize;
-	}
-
-	/**
-	 * @param style
-	 */
-	private int getFontStyle(ICSSStyle style) {
-		int fontstyle;
-		String fontstylestr = (String) style
-				.getStyleProperty(ICSSPropertyID.ATTR_FONT_STYLE);
-		if (ICSSPropertyID.VAL_ITALIC.equals(fontstylestr)
-				|| ICSSPropertyID.VAL_OBLIQUE.equals(fontstylestr)) {
-			fontstyle = SWT.ITALIC;
-		} else {
-			fontstyle = SWT.NORMAL;
-		}
-		return fontstyle;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.font.ICSSFontManager#dispose()
-	 */
-	public void dispose() {
-		_cacheManager.disposeAll();
-	}
-
-	/**
-	 * @return the default css font
-	 */
-	public ICSSFont createDefaultFont() {
-		CSSFont result = new CSSFont(FontFamilyMeta.DEFAULT_FONT,
-				(int) FontSizeMeta.MEDIUM_VAL_INT, SWT.NORMAL,
-				FontWeightMeta.NORMAL_WEIGHT.intValue(), "");
-		return result;
-	}
-
-	/**
-	 * @param f
-	 * @return the swt font for f
-	 */
-	public Font getSwtFont(CSSFont f) {
-		return (Font) _cacheManager.getEntry(f);
-	}
-
-	/**
-	 * @return the singleton font manager
-	 */
-	public static CSSFontManager getInstance() {
-		if (_instance == null) {
-			_instance = new CSSFontManager();
-		}
-		return _instance;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFont.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFont.java
deleted file mode 100644
index 74adcfb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFont.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.font;
-
-import org.eclipse.swt.graphics.Font;
-
-/**
- * XXX: this class should be renamed to CSSFontDescriptor. Since now it is only
- * used to describe a CSSFont.
- * 
- * @author mengbo
- */
-public interface ICSSFont {
-	/**
-	 * Will get a Font system resource from a pool.
-	 * 
-	 * The caller should NOT dispose the returned Font object.
-	 * 
-	 * The caller should not hold reference on the returned Font object, since
-	 * system may dispose it at any time.
-	 * 
-	 * @return the swt font
-	 */
-	public Font getSwtFont();
-
-	/**
-	 * @return the css font family
-	 */
-	public String getFontFamily();
-
-	/**
-	 * @return font size in pixel 
-	 */
-	public int getFontSize();
-
-	/**
-	 * @return font x height in pixel
-	 */
-	public int getXHeight();
-
-	/**
-	 * @return the font weight
-	 */
-	public int getWeight();
-
-	/**
-	 * 
-	 * @return could be SWT.NONE or SWT.ITALIC
-	 */
-	public int getFontStyle();
-
-	/**
-	 * @return the css string
-	 */
-	public String getCSSString();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFontManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFontManager.java
deleted file mode 100644
index a5a8d3d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFontManager.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.font;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-
-/**
- * @author mengbo
- */
-public interface ICSSFontManager {
-	/**
-	 * @param style
-	 * @return ??
-	 */
-	public ICSSFont createFont(ICSSStyle style);
-
-	/**
-	 * FIXME: purpose?
-	 */
-	public void dispose();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/html4.css b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/html4.css
deleted file mode 100644
index e91e5de..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/html4.css
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Basic HTML style information.
- */
-html,
-address,
-blockquote,listing,
-body, dd, div,
-dl, dt, fieldset, legend,form,
-frame, frameset,
-h1, h2, h3, h4,
-h5, h6, noframes,noscript,
-ol, p, ul, center,
-dir, hr, menu, pre, plaintext, xmp  { display: block }
-
-ol				{counter-reset: _anonymous; list-style-type: decimal}
-ul,dir,menu  	{counter-reset: _anonymous; list-style-type: disc}
-li           	{display: list-item}
-li				{counter-increment: _anonymous}
-
-head            { display: none }
-table           { display: table }
-tr              { display: table-row }
-thead           { display: table-header-group }
-tbody           { display: table-row-group }
-tfoot           { display: table-footer-group }
-col             { display: table-column }
-colgroup        { display: table-column-group }
-td, th          { display: table-cell; }
-caption         { display: table-caption }
-th              { font-weight: bolder;}
-caption         { text-align: center;horizontal-align:top }
-button, textarea,
-input, object, 
-select, img { display:inline-block; }
-pre,plaintext, xmp   { white-space: pre }
-h1, h2, h3, h4,
-h5, h6, b,
-strong          { font-weight: bold }
-i, cite, em,dfn,
-var, address    { font-style: italic }
-pre, tt, code,plaintext, xmp,
-kbd, samp       { font-family: monospace }
-ol              { list-style-type: decimal }
-br:before       { content: "\A" }
-center          { text-align: center }
-sub             { vertical-align: sub }
-sup             { vertical-align: super }
-u, ins          { text-decoration: underline }
-input			{ text-decoration: none }
-button			{ white-space: nowrap }
-a[href]			{ text-decoration: underline }
-
-/*
- * styles that may be different for different user agent.
- * This part may need to move out and put into different css files.
- */
-body            { line-height: 1.12em }
-h1              { font-size: 2em; margin: .67em 0 }
-h2              { font-size: 1.5em; margin: .75em 0 }
-h3              { font-size: 1.17em; margin: .83em 0 }
-h4, p,ul,
-fieldset, form,
-ol, dl, dir,
-menu            { margin: 1.12em 0 }
-blockquote      { margin: 1em 40px }
-h5              { font-size: .83em; margin: 1.5em 0 }
-h6              { font-size: .75em; margin: 1.67em 0 }
-blockquote      { margin-left: 40px; margin-right: 40px }
-big             { font-size: larger }
-small, sub, sup { font-size: smaller }
-s, strike, del  { text-decoration: line-through }
-hr              { border: 1px inset }
-ol, ul, dir,
-menu, dd        { margin-left: 40px;border:0px }
-ol ul, ul ol,
-ul ul, ol ol    { margin-top: 0; margin-bottom: 0 }
-abbr, acronym   { font-variant: small-caps; letter-spacing: 0.1em }
-a[href]         { color:blue;}
-select			{background-color: window;font-family:sans-serif;font-size:13px;font-weight: normal;}
-textarea		{border: 2px inset;font-size:13px;font-family:monospace}
-textarea,
-input 			{background-color: window}
-input,
-input[type=text],
-input[type=password] {border: 2px inset;font-size:13px;font-family:sans-serif;font-weight: normal;}
-/* following upcased TYPE is for workaround the WTP M2 bug of not setting default content type */
-input[TYPE=submit],input[TYPE=reset],input[TYPE=button],input[TYPE=cancel],
-button,
-input[type=button],
-input[type=reset],
-input[type=cancel],
-input[type=submit] {background-color: ButtonFace; border: 2px outset; font-size:13px;
-					font-family:sans-serif;text-align: center;font-weight: normal;}
-input[type=image],
-input[type=checkbox],
-input[type=radio]  {border: none }
-input[type=hidden]  {border: none }
-img				{border: 0px none}
-listing         {font-family:monospace;font-size: medium;white-space: pre; margin: 1em 0;}
-tbody,thead,tfoot     {vertical-align: middle;}
-blink 			{text-decoration: blink;}
-
-hr 		{margin: 0.5em auto 0.5em auto;}
-caption  {border: 0px none;margin: 0px; padding:0px 0px 4px 0px;}
-td, th,
-table    {border: 4px none;}
-button   {padding: 3px 5px;text-align: center;vertical-align: middle;}
-button,textarea,input   {vertical-align: text-bottom;color:black;font-style:none;}
-select {vertical-align: text-bottom;}
-input[type=image]  {vertical-align: baseline;}
-li   {min-height:1.2em}
-button {min-height:1.8em}
-div,tr,form {min-height:1.2em}
-table,td {min-width:1.2em;min-height:1.2em}
-
-/* nested lists have no top/bottom margins */
-ul ul,   ul ol,   ul dir,   ul menu,   ul dl,
-ol ul,   ol ol,   ol dir,   ol menu,   ol dl,
-dir ul,  dir ol,  dir dir,  dir menu,  dir dl,
-menu ul, menu ol, menu dir, menu menu, menu dl,
-dl ul,   dl ol,   dl dir,   dl menu,   dl dl 	{margin-top: 0; margin-bottom: 0;}
-
-/* 2 deep unordered lists use a circle */
-ol ul,   ul ul,   menu ul,   dir ul,
-ol menu, ul menu, menu menu, dir menu,
-ol dir,  ul dir,  menu dir,  dir dir 	{list-style-type: circle;}
-
-/* 3 deep (or more) unordered lists use a square */
-ol ol ul,     ol ul ul,     ol menu ul,     ol dir ul,
-ol ol menu,   ol ul menu,   ol menu menu,   ol dir menu,
-ol ol dir,    ol ul dir,    ol menu dir,    ol dir dir,
-ul ol ul,     ul ul ul,     ul menu ul,     ul dir ul,
-ul ol menu,   ul ul menu,   ul menu menu,   ul dir menu,
-ul ol dir,    ul ul dir,    ul menu dir,    ul dir dir,
-menu ol ul,   menu ul ul,   menu menu ul,   menu dir ul,
-menu ol menu, menu ul menu, menu menu menu, menu dir menu,
-menu ol dir,  menu ul dir,  menu menu dir,  menu dir dir,
-dir ol ul,    dir ul ul,    dir menu ul,    dir dir ul,
-dir ol menu,  dir ul menu,  dir menu menu,  dir dir menu,
-dir ol dir,   dir ul dir,   dir menu dir,   dir dir dir { list-style-type: square;}
-
-/**
- * We do not write codes to support some elements. This part defines properties for them 
- * to improve the look of these elements.
- */
-applet {border: 1px solid;}
-fieldset {border: 2px groove;}
-applet,iframe {display:inline-block; border:3px inset; }
-object {display:inline-block;border:0px none;}
-
-
-/* 
- * Sets right margin to have gap between widgets.
- */
-input,textarea,button	 { margin-right: 2px;}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockBox.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockBox.java
deleted file mode 100644
index 7c635a5..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);
-	}
-
-	public int getInternalContentWidth() {
-		return _internalContentWidth;
-	}
-
-	public 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 35eb4c7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlow.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.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.
- */
-public 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();
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigure#createDefaultFlowLayout()
-	 */
-	protected FlowFigureLayout createDefaultFlowLayout() {
-		return new BlockFlowLayout(this);
-	}
-
-	/**
-	 * Returns the BlockBox associated with this.
-	 * 
-	 * @return This BlockFlow's BlockBox
-	 */
-	protected BlockBox getBlockBox() {
-		return _blockBox;
-	}
-
-	/**
-	 * Returns the horizontal aligment.
-	 * 
-	 * @return the hotizontal aligment
-	 */
-	public int getHorizontalAligment() {
-		return _aligment & PositionConstants.LEFT_CENTER_RIGHT;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigure#postValidate()
-	 */
-	public void postValidate() {
-		setBounds(getBlockBox().toRectangle().expand(getInsets()));
-		List v = getChildren();
-		for (int i = 0, n = v.size(); i < n; i++) {
-			((FlowFigure) v.get(i)).postValidate();
-		}
-	}
-
-	/**
-	 * Sets the horitontal aligment of the block. Valid values are:
-	 * <UL>
-	 * <LI>{@link org.eclipse.draw2d.PositionConstants#LEFT}
-	 * <LI>{@link org.eclipse.draw2d.PositionConstants#RIGHT}
-	 * <LI>{@link org.eclipse.draw2d.PositionConstants#CENTER}
-	 * 
-	 * @param value
-	 *            the aligment
-	 */
-	public void setHorizontalAligment(int value) {
-		if (!(value == PositionConstants.LEFT
-				|| value == PositionConstants.RIGHT || value == PositionConstants.CENTER)) {
-			throw new IllegalArgumentException(
-					"Horizontal Aligment must be one of: LEFT, CENTER, RIGHT");
-		}
-		this._aligment &= ~PositionConstants.LEFT_CENTER_RIGHT;
-		this._aligment |= value;
-		revalidate();
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#useLocalCoordinates()
-	 */
-	protected boolean useLocalCoordinates() {
-		return true;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlowContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlowContext.java
deleted file mode 100644
index 7cb5efd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlowContext.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.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 {
-	protected LineBox _currentLine;
-
-	private LineBox _previousLine = null;
-
-	protected BlockBox _blockBox;
-
-	protected FlowContext _originalContext;
-
-	protected ICSSStyle _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();
-	}
-
-	public 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();
-	}
-
-	protected 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
-	 */
-	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._borderInsets.left + _blockBox._paddingInsets.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._borderInsets.top
-					+ _blockBox._paddingInsets.top;
-			if (topMargin != Integer.MIN_VALUE)
-				line._y += topMargin;
-		} else {
-			if (topMargin == Integer.MIN_VALUE)
-				line._y = _previousLine._y + _previousLine.getHeight()
-						+ getLinePadding() + _previousLine._marginInsets.bottom; // XXX:
-			// should
-			// add
-			// previous
-			// margin
-			// bottom?
-			else
-				line._y = _previousLine._y
-						+ _previousLine.getHeight()
-						+ Math.max(topMargin,
-								_previousLine._marginInsets.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._marginInsets.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);
-	}
-
-	public 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 f50ee60..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlowLayout.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.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
-	 */
-	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._marginInsets.bottom; // XXX:
-				// should
-				// add
-				// previous
-				// margin
-				// bottom?
-			} else {
-				line._y = _previousLine._y
-						+ _previousLine.getHeight()
-						+ Math.max(topMargin,
-								_previousLine._marginInsets.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 54978d1..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._marginInsets = new Insets(style.getMarginInsets());
-		box._borderInsets = new Insets(style.getBorderInsets());
-		box._paddingInsets = 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 c3dd625..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSBlockFlowLayout.java
+++ /dev/null
@@ -1,745 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
-import org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.css2.widget.BorderUtil;
-import org.eclipse.swt.graphics.FontMetrics;
-
-/**
- * The block layout for {@link CSSFigure}figures. Basic code structure is from
- * BlockFlowLayout.
- * 
- * @author mengbo
- */
-public class CSSBlockFlowLayout extends CSSLayout implements ICSSPainter2 {
-	private LineBox _previousLine = null;
-
-	/**
-	 * the block box for the layout object
-	 */
-	protected BlockBox _blockBox = null;
-
-	/**
-	 * The font metrics for this layout object
-	 */
-	protected FontMetrics _fontMetrices;
-
-	int _userSpecifiedWidth;
-
-	int _userSpecifiedHeight;
-
-	/*
-	 * whether we need HScroll and VScroll when overflow is set to "scroll".
-	 * will be updated in "endBlock" and used in "paintFigurePostClientArea"
-	 */
-	boolean _needHScroll = false;
-
-	boolean _needVScroll = false;
-
-	/**
-     * Creates a new CSSBlockFlowLayout with the given BlockFlow.
-	 * @param cssfigure
-	 */
-	public CSSBlockFlowLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/**
-	 * @return true if this layout box has more than one line
-	 */
-	protected boolean hasMoreThanOneLine() {
-		return _previousLine != null;
-	}
-
-	/**
-	 * @return true if this layout block is inline
-	 */
-	public boolean isInlineBlock() {
-		String obj = getCSSStyle().getDisplay();
-		return ICSSPropertyID.VAL_INLINE_BLOCK.equals(obj)
-				|| ICSSPropertyID.VAL_INLINE_TABLE.equals(obj);
-	}
-
-	/**
-	 * @return true if should expand the width to all available width. 
-	 */
-	public boolean shouldExpand() {
-		ICSSStyle style = getCSSStyle();
-		if (style == null) {
-			return false;
-		}
-        return "block".equalsIgnoreCase(style.getDisplay())
-        		|| "list-item".equalsIgnoreCase(style.getDisplay());
-	}
-
-	// ---------------------------------------------------------------------------------------------------
-	// preLayout stage. Major job is get the top-left corner information of the
-	// new block.
-
-	/**
-	 * sets up the single block that contains all of the lines.
-	 */
-	protected void setupBlock() {
-		// int recommended = line.getAvailableWidth();
-		// if (recommended != previousRecommendedWidth)
-		// Remove all current Fragments
-		_blockBox.clear();
-		// Ask for a new line, in case we are in the middle of a line
-
-		if (!isInlineBlock()) {
-			LineBox lineBox = getFlowContext().getCurrentLine();
-			if (lineBox != null && !lineBox.isEmptyStringLine()) {
-				getFlowContext().endLine();
-			}
-		}
-
-		ICSSStyle style = getCSSStyle();
-
-		// endLine will result in context create a new line, so we are in the
-		// new line now.
-		// passing in the top margin, and context will consider that when create
-		// the new line.
-		int marginTop = style.getMarginInsets().top;
-		LineBox line = getFlowContext().getCurrentLine(marginTop);
-
-		// Setup the one fragment for this Block with the correct X and
-		// available width
-
-		// FIXME: according to spec, when using percentage width/height, should
-		// percentage to
-		// the "containing block". But we don't have very good "containing
-		// block" resolution
-		// implementation yet.
-
-		// calculate the min size
-		// int minWidth = 0;
-		// int minHeight = 0;
-		// if (style != null)
-		// {
-		// // try to see whether there is any designer specified min size
-		// ITagEditInfo info = (ITagEditInfo)
-		// style.getAdapter(ITagEditInfo.class);
-		// if (info != null)
-		// {
-		// minWidth = info.getMinWidth();
-		// minHeight = info.getMinHeight();
-		// }
-		//
-		// // CSS also has the min-width/min-height property. We should also get
-		// that,
-		// // and using the max of the "min-width" css property and the designer
-		// specified min size.
-		// int height = getLengthValue(style,ICSSPropertyID.ATTR_MIN_HEIGHT);
-		// if(height > minHeight)
-		// {
-		// minHeight = height;
-		// }
-		// int width = getLengthValue(style,ICSSPropertyID.ATTR_MIN_WIDTH);
-		// if(width > minWidth)
-		// {
-		// minWidth = width;
-		// }
-		// }
-
-		// keep track of user specified size, this will be used when handling
-		// the "overflow" CSS property.
-		_userSpecifiedWidth = 0;
-		_userSpecifiedHeight = 0;
-
-		{
-			int width = getLengthValue(style, ICSSPropertyID.ATTR_WIDTH);
-
-			int availableWidth = line.getAvailableWidth()
-					- style.getMarginInsets().getWidth();
-			if (width <= 0) {
-				// no width setting
-				if (isCalculatingMaxWidth()) {
-					_blockBox.setRecommendedWidth(Integer.MAX_VALUE);
-					// _blockBox.setWidth( (minWidth>0?minWidth:0));
-				} else {
-					_blockBox.setRecommendedWidth(availableWidth);
-					if (shouldExpand()) {
-						_blockBox.setWidth(availableWidth);
-					} else {
-						// _blockBox.setWidth( (minWidth>0?minWidth:0));
-					}
-				}
-			} else {
-				int w = width;
-				if (!style.isSizeIncludeBorderPadding()) {
-					w += style.getBorderInsets().getWidth()
-							+ style.getPaddingInsets().getWidth();
-				}
-				// XXX: should we use minWidth or follow user's choice?
-				// if (w < minWidth)
-				// {
-				// w = minWidth;
-				// }
-				_userSpecifiedWidth = w;
-				_blockBox.setWidth(w);
-				_blockBox.setRecommendedWidth(w);
-			}
-		}
-
-		{
-			int height = getLengthValue(style, ICSSPropertyID.ATTR_HEIGHT);
-			// Object height =
-			// style.getStyleProperty(ICSSPropertyID.ATTR_HEIGHT);
-			// Length heightLength = (height instanceof Length) ? (Length)
-			// height : null;
-
-			if (height <= 0) {
-				// if (minHeight > 0)
-				// {
-				// // _blockBox.setHeight(minHeight);
-				// _blockBox.setRecommendedHeight(minHeight);
-				// }
-				// else
-				{
-					_blockBox.setHeight(0);
-					_blockBox.setRecommendedHeight(0);
-				}
-			} else {
-				int h = height;
-				if (handlingBorderForBlock()
-						&& !style.isSizeIncludeBorderPadding()) {
-					h += style.getBorderInsets().getHeight()
-							+ style.getPaddingInsets().getHeight();
-				}
-				// XXX: should we follow minHeight or user's choice?
-				// if (minHeight > h)
-				// {
-				// h = minHeight;
-				// }
-				_userSpecifiedHeight = h;
-				_blockBox.setHeight(h);
-				_blockBox.setRecommendedHeight(h);
-			}
-		}
-		_blockBox._marginInsets = 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._paddingInsets.getHeight()
-									+ BorderUtil.SCROLL_WIDTH) {
-						_needVScroll = true;
-					}
-				}
-				if (!_needHScroll && _needVScroll) {
-					if (_userSpecifiedWidth > 0
-							&& _blockBox.getInternalContentWidth() >= 0
-							&& _userSpecifiedWidth < _blockBox
-									.getInternalContentWidth()
-									+ _blockBox._paddingInsets.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._marginInsets.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()._marginInsets.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._marginInsets.bottom; // XXX:
-				// should
-				// add
-				// previous
-				// margin
-				// bottom?
-			} else {
-				line._y = _previousLine._y
-						+ _previousLine.getHeight()
-						+ Math.max(topMargin,
-								_previousLine._marginInsets.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._borderInsets);
-
-					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 b343aae..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSBrFlowLayout.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.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author mengbo
- */
-public class CSSBrFlowLayout extends CSSInlineFlowLayout implements ICSSPainter {
-	/**
-	 * @param flow
-	 */
-	public CSSBrFlowLayout(CSSFigure flow) {
-		super(flow);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSInlineFlowLayout#flush()
-	 */
-	protected void flush() {
-		FlowBox forcedBox = new FlowBox();
-		forcedBox.setWidth(16);
-		forcedBox.setHeight(getCSSStyle().getCSSFont().getXHeight());
-		addToCurrentLine(forcedBox);
-		endLine();
-
-		FlowBox flowbox = new FlowBox();
-		flowbox.setHeight(getCSSStyle().getCSSFont().getFontSize());
-		getCurrentLine().add(flowbox);
-
-		super.flush();
-	}
-
-	public void paintFigure(Graphics g) {
-		List fragments = getFragmentsForRead();
-		if (!fragments.isEmpty()) {
-			FlowBox box = (FlowBox) fragments.get(0);
-			g.drawImage(getSharedHTMLImage(), new Point(box._x, box._y));
-		}
-	}
-
-	private static Image getSharedHTMLImage() {
-		return PDPlugin.getDefault().getImage("palette/HTML/small/HTML_BR.gif");
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSFigure.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSFigure.java
deleted file mode 100644
index 79012d9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSFigure.java
+++ /dev/null
@@ -1,514 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.border.CSSBorder;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.VisibilityMeta;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo;
-import org.eclipse.jst.pagedesigner.css2.widget.BorderUtil;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * Normally a CSSFigure is a container. It's layout will be driven by different
- * display type information from the style.
- * 
- * Each CSSFigure will be driven by ICSSStyle, the display type of the ICSSStyle
- * will decide the layout to be used for the figure.
- * 
- * @author mengbo
- */
-public class CSSFigure extends FlowFigure implements ICSSFigure {
-	private static Logger _log = PDPlugin.getLogger(CSSFigure.class);
-
-	private static final Rectangle PRIVATE_RECT = new Rectangle();
-
-	ICSSStyle _style;
-
-	// NOTE: here keep the element is only for debug use. CSSFigure shouldn't
-	// require an element.
-	// Element _element;
-
-	// if this field is set, then regetLayout() will still return this layout,
-	// without going through the CSS resolution
-	CSSLayout _fixedLayout;
-
-	public CSSFigure() {
-		_style = DefaultStyle.getInstance();
-		invalidateCSS();
-	}
-
-	public CSSFigure(ICSSStyle style) {
-		_style = style;
-		// _element = element;
-		invalidateCSS();
-	}
-
-	public ICSSStyle getCSSStyle() {
-		return _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);
-	}
-
-	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);
-	}
-
-	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
-	 */
-	public Rectangle[] getFragmentsBounds() {
-		List list = getFragmentsForRead();
-		if (list == null || list.size() == 0) {
-			// should not happen. but still handle it.
-			return new Rectangle[] { getBounds() };
-		}
-        Rectangle[] ret = new Rectangle[list.size()];
-        for (int i = 0, size = list.size(); i < size; i++) {
-        	FlowBox box = (FlowBox) list.get(i);
-        	ret[i] = new Rectangle(box._x, box._y, box.getWidth(), box
-        			.getHeight());
-        }
-        return ret;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#setBounds(org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void setBounds(Rectangle r) {
-		if (getBounds().equals(r)) {
-			return;
-		}
-		boolean invalidate = getBounds().width != r.width
-				|| getBounds().height != r.height;
-		super.setBounds(r);
-
-		CSSLayout layout = (CSSLayout) this.getLayoutManager();
-		layout.setBoundsCalled(r, invalidate);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigure#postValidate()
-	 */
-	public void postValidate() {
-		CSSLayout layout = (CSSLayout) getLayoutManager();
-		layout.postValidateForAbsolute();
-		layout.postValidate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#validate()
-	 */
-	public void validate() {
-		super.validate();
-		// should not call this.postValidate() here. PostValidate() should
-		// only be started from the FlowPage. Otherwise it will be called
-		// multiple times on a figure.
-		// this.postValidate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#useLocalCoordinates()
-	 */
-	protected boolean useLocalCoordinates() {
-		CSSLayout layout = (CSSLayout) getLayoutManager();
-		if (layout == null) {
-			return false;
-		}
-        return layout.useLocalCoordinates();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#paint(org.eclipse.draw2d.Graphics)
-	 */
-	public void paint(Graphics graphics) {
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			Object visibility = style
-					.getStyleProperty(ICSSPropertyID.ATTR_VISIBILITY);
-			// handle visibility: hidden here.
-			// TODO: "collapse" is not supported yet!
-			if (VisibilityMeta.HIDDEN.equals(visibility)) {
-				return;
-			}
-		}
-
-		CSSLayout layout = (CSSLayout) this.getLayoutManager();
-		graphics.pushState();
-		try {
-			paintFigure(graphics);
-			graphics.restoreState();
-			paintClientArea(graphics);
-			if (layout instanceof ICSSPainter2) {
-				if (useLocalCoordinates()) {
-					graphics.translate(getBounds().x + getInsets().left,
-							getBounds().y + getInsets().top);
-					((ICSSPainter2) layout).paintFigurePostClientArea(graphics);
-					graphics.restoreState();
-				} else {
-					((ICSSPainter2) layout).paintFigurePostClientArea(graphics);
-				}
-			}
-			paintBorder(graphics);
-		} finally {
-			graphics.popState();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigure#paintFigure(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintFigure(Graphics g) {
-		Color rgbColor = null;
-		boolean fillArea = false;
-		Object bg = getCSSStyle().getBackgroundColor();
-		if (bg instanceof RGB) {
-			rgbColor = new Color(null, (RGB) bg);
-			g.setBackgroundColor(rgbColor);
-			fillArea = true;
-		} else if (bg instanceof Color) {
-			g.setBackgroundColor((Color) bg);
-			fillArea = true;
-		}
-		if (fillArea) {
-			List fragments = getFragmentsForRead();
-
-			for (int i = 0, n = fragments.size(); i < n; i++) {
-				Object obj = fragments.get(i);
-				if (obj instanceof FlowBox) {
-					FlowBox box = (FlowBox) obj;
-					g.fillRectangle(box._x, box._y, box.getWidth(), box
-							.getHeight());
-				}
-			}
-		}
-		if (rgbColor != null) {
-			rgbColor.dispose();
-		}
-		g.restoreState();
-
-		LayoutManager layout = getLayoutManager();
-		if (layout instanceof ICSSPainter) {
-			if (useLocalCoordinates()) {
-				g.translate(getBounds().x + getInsets().left, getBounds().y
-						+ getInsets().top);
-				((ICSSPainter) layout).paintFigure(g);
-				g.restoreState();
-			} else {
-				((ICSSPainter) layout).paintFigure(g);
-			}
-		}
-
-		// paint selected mode here.
-		paintSelection(g);
-
-		if (Debug.DEBUG_BOX) {
-			// draw two levels of boxes. Since normally each figure will only
-			// have two levels of boxes.
-			List fragments = this.getFragmentsForRead();
-			for (int i = 0, size = fragments.size(); i < size; i++) {
-				FlowBox box = (FlowBox) fragments.get(i);
-				BoxUtil.drawBox(g, box);
-				if (box instanceof BlockBox) {
-					BlockBox compositeBox = (BlockBox) box;
-					List list = compositeBox.getFragments();
-					for (int j = 0; j < list.size(); j++) {
-						g.translate(this.getInsets().left,
-								this.getInsets().right);
-						BoxUtil.drawBox(g, (FlowBox) list.get(j));
-						g.restoreState();
-					}
-				}
-			}
-		}
-		if (Debug.DEBUG_BASELINE) {
-			List fragments = this.getFragmentsForRead();
-			for (int i = 0, size = fragments.size(); i < size; i++) {
-				Object obj = fragments.get(i);
-				if (obj instanceof LineBox) {
-					LineBox linebox = (LineBox) obj;
-					g.setForegroundColor(ColorConstants.red);
-					g.drawLine(linebox._x, linebox._y + linebox.getAscent(),
-							linebox._x + linebox.getWidth(), linebox._y
-									+ linebox.getAscent());
-				}
-			}
-		}
-
-		if (Debug.DEBUG_BORDERPADDING) {
-			if (this.getLayoutManager() instanceof CSSBlockFlowLayout) {
-				g.setLineWidth(1);
-				Rectangle rect = getBounds().getCopy().crop(getInsets());
-				g.setForegroundColor(ColorConstants.green);
-				g.drawRectangle(rect);
-				g.setForegroundColor(ColorConstants.red);
-				g.drawRectangle(getBounds());
-			}
-		}
-
-		if (Debug.DEBUG_BOX) {
-			CSSLayout csslayout = (CSSLayout) this.getLayoutManager();
-			if (csslayout._absoluteContext != null) {
-				BlockBox blockbox = csslayout._absoluteContext._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 Border} or {@link 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 97f4571..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSInlineFlowLayout.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.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._marginInsets.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.
-	 */
-	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 99081a7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSLayout.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.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.PositionMeta;
-import org.eclipse.jst.pagedesigner.css2.property.VerticalAlignMeta;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-
-/**
- * CSSLayout is the base layout manager for different CSS layouts, such as block
- * layout, inline layout (possible in the future table layout, etc)
- * 
- * @author mengbo
- */
-public abstract class CSSLayout extends FlowFigureLayout implements FlowContext {
-	protected 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;
-
-	/**
-	 * @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
-	 */
-	public ICSSStyle getCSSStyle() {
-		return getCSSFigure().getCSSStyle();
-	}
-
-	/**
-	 * @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();
-	}
-
-	protected boolean isAbsolutePosition() {
-		ICSSStyle style = getCSSStyle();
-
-		// FIXME: Some layout don't support absolute, need check here
-		if (style != null) {
-			Object obj = style.getStyleProperty(ICSSPropertyID.ATTR_POSITION);
-			if (PositionMeta.ABSOLUTE.equals(obj)
-					|| PositionMeta.FIXED.equals(obj)) {
-				return supportAbsolutePosition();
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Child class could override this method.
-	 * 
-	 * @return
-	 */
-	protected boolean supportAbsolutePosition() {
-		if (findContainingPositionedFigure() == null) {
-			return false;
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContainerLayout#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();
-	}
-
-	public FlowContext getParentFigureContext() {
-		return super.getFlowContext();
-	}
-
-	public 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._marginInsets.right;
-		}
-        return 0;
-	}
-
-	public void setCalculatingMaxWidth(boolean c) {
-		_calculatingMaxWidth = c;
-	}
-
-	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();
-
-	// ------------------------------------------------------------------------------------
-
-	public CSSFigure getCSSFigure() {
-		return (CSSFigure) getFlowFigure();
-	}
-
-	/**
-	 * 
-	 * @return
-	 */
-	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
-	 */
-	public 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
-	 */
-	public boolean handlingBorderForBlock() {
-		return true;
-	}
-
-	/**
-	 * This method is called when the corresponding figure is revalidated.
-	 * 
-	 */
-	public 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 a3608dd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSListItemLayout.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.list.CounterHelper;
-import org.eclipse.jst.pagedesigner.css2.list.ICounterValueGenerator;
-import org.eclipse.jst.pagedesigner.css2.marker.CounterUtil;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- */
-public class CSSListItemLayout extends CSSBlockFlowLayout implements
-		ICSSPainter {
-	private static final String DEFAULT_LIST_COUNTER = "_anonymous";
-
-	private static final int CIRCLE_DIAMETER = 6;
-
-	private static final int DISC_DIAMETER = 5;
-
-	private static final int ROUNDRECT_ARC = 2;
-
-	private static final int TEXT_PADDING = 16;
-
-	private int _count;
-
-	/**
-	 * @param cssfigure
-	 */
-	public CSSListItemLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSPainter#paintFigure(org.eclipse.draw2d.Graphics)
-	 */
-	public void paintFigure(Graphics g) {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-
-		Rectangle drawArea = null;
-		Font font = getCSSStyle().getCSSFont().getSwtFont();
-
-		// draw the marker box
-		Object styleType = style
-				.getStyleProperty(ICSSPropertyID.ATTR_LIST_STYLE_TYPE);
-
-		g.pushState();
-
-		Color newColor = null;
-		Object color = style.getColor();
-		if (color instanceof Color) {
-			g.setForegroundColor((Color) color);
-			g.setBackgroundColor((Color) color);
-		} else if (color instanceof RGB) {
-			newColor = new Color(Display.getCurrent(), (RGB) color);
-			g.setForegroundColor(newColor);
-			g.setBackgroundColor(newColor);
-		}
-
-		if (styleType instanceof String) {
-			int type = CounterHelper.toTypeInt((String) styleType);
-			switch (type) {
-			case CounterHelper.LIST_T_UPPER_ALPHA:
-			case CounterHelper.LIST_T_LOWER_ALPHA:
-			case CounterHelper.LIST_T_LOWER_ROMAN:
-			case CounterHelper.LIST_T_UPPER_ROMAN:
-			case CounterHelper.LIST_T_DECIMAL:
-				g.setFont(font);
-				String displayString = CounterUtil.convertCount(_count, type);
-				Point point = getDrawPointForText(displayString);
-				g.drawString(displayString, point);
-				break;
-			case CounterHelper.LIST_T_CIRCLE:
-				drawArea = getDrawAreaForGraph(CIRCLE_DIAMETER, CIRCLE_DIAMETER);
-				g.drawArc(drawArea, 0, 360);
-				break;
-			case CounterHelper.LIST_T_SQUARE:
-				drawArea = getDrawAreaForGraph(DISC_DIAMETER, DISC_DIAMETER);
-				g.fillRectangle(drawArea);
-			case CounterHelper.LIST_T_DECIMAL_LEADING_ZERO:
-			case CounterHelper.LIST_T_LOWER_GREEK:
-			case CounterHelper.LIST_T_ARMENIAN:
-			case CounterHelper.LIST_T_GEORGIAN:
-			case CounterHelper.LIST_T_IMAGE:
-			case CounterHelper.LIST_T_NONE:
-			default:
-				drawArea = getDrawAreaForGraph(DISC_DIAMETER, DISC_DIAMETER);
-				g.fillRoundRectangle(drawArea, ROUNDRECT_ARC, ROUNDRECT_ARC);
-				break;
-			}
-		}
-		g.popState();
-
-		if (newColor != null) {
-			newColor.dispose();
-		}
-	}
-
-	/**
-	 * @param g
-	 * @return
-	 */
-	private Rectangle getDrawAreaForGraph(int width, int height) {
-		Rectangle drawArea;
-
-		int x = 0;
-		int y = 0;
-
-		List list = _blockBox.getFragments();
-		Rectangle box = _blockBox.toRectangle().getCopy().expand(
-				_blockBox.getBorderPaddingInsets().getAdded(
-						_blockBox._marginInsets));
-		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._marginInsets));
-
-		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 c74963a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSPageFlowLayout.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.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];
-
-	private Dimension _cacheMaxWidthSize = null;
-
-	/**
-	 * @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;
-		_cacheMaxWidthSize = null;
-	}
-
-	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;
-	}
-
-	public 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];
-	}
-
-	public Dimension getMaxContentWidthSize(IFigure container) {
-		if (this._cacheMaxWidthSize == null) {
-			boolean b = getCalcuatingMaxWidth();
-			setCalculatingMaxWidth(true);
-
-			// Flowpage must temporarily layout to determine its preferred size
-			int oldWidth = getRecommendedWidth();
-			setRecommendedWidth(Integer.MAX_VALUE);
-			container.validate();
-			_cacheMaxWidthSize = _pageSize.getExpanded(container.getInsets()
-					.getWidth(), container.getInsets().getHeight());
-
-			if (0 != oldWidth) {
-				setRecommendedWidth(oldWidth);
-				container.getUpdateManager().addInvalidFigure(container);
-			}
-
-			setCalculatingMaxWidth(b);
-		}
-		return _cacheMaxWidthSize;
-	}
-}
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 9994cbb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSTextFigure.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.css2.layout;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.jst.pagedesigner.css2.style.StyleUtil;
-import org.eclipse.jst.pagedesigner.viewer.CaretPositionResolver;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * @author mengbo
- */
-public class CSSTextFigure extends FlowFigure implements ICSSFigure {
-	private ICSSTextProvider _provider;
-
-	private List _fragments = new ArrayList(1);
-
-	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;
-	}
-
-	/**
-	 * @see FlowFigure#createDefaultFlowLayout()
-	 */
-	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();
-	}
-
-	public String getText() {
-		return _provider.getTextData();
-	}
-
-	/**
-	 * @see FlowFigure#postValidate()
-	 */
-	public void postValidate() {
-		List list = getFragments();
-		FlowBox box;
-		int left = Integer.MAX_VALUE, top = left;
-		int right = Integer.MIN_VALUE, bottom = right;
-		for (int i = 0, n = list.size(); i < n; i++) {
-			box = (FlowBox) list.get(i);
-			left = Math.min(left, box._x);
-			right = Math.max(right, box._x + box._width);
-			top = Math.min(top, box._y);
-			bottom = Math.max(bottom, box._y + box._height);
-		}
-		setBounds(new Rectangle(left, top, right - left, bottom - top));
-		list = getChildren();
-		for (int i = 0, n = list.size(); i < n; i++) {
-			((FlowFigure) list.get(i)).postValidate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#paintBorder(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintBorder(Graphics graphics) {
-		if (Debug.DEBUG_TEXTBORDER) {
-			if (_fragments != null) {
-				graphics.setForegroundColor(ColorConstants.darkBlue);
-				for (int i = 0, size = _fragments.size(); i < size; i++) {
-					FlowBox box = (FlowBox) _fragments.get(i);
-					BoxUtil.drawBox(graphics, box);
-				}
-				graphics.restoreState();
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#paintFigure(Graphics)
-	 */
-	protected void paintFigure(Graphics g) {
-		Object result = this.getCSSStyle().getColor();
-		Color color;
-		if (result instanceof Color) {
-			color = (Color) result;
-		} else if (result instanceof RGB) {
-			color = new Color(null, (RGB) result);
-		} else {
-			color = null;
-		}
-		int[] range = null;
-		if (!StyleUtil.isInWidget(this.getCSSStyle())) {
-			range = _provider.getSelectedRange();
-		}
-		if (range == null || range[0] == range[1]) {
-			// we are not in selection
-			TextLayoutSupport.paintTextFigure(g, _fragments, getCSSStyle()
-					.getCSSFont().getSwtFont(), color, ((Integer) getCSSStyle()
-					.getStyleProperty(ICSSPropertyID.ATTR_TEXTDECORATION))
-					.intValue());
-		} else {
-			TextLayoutSupport.paintTextFigureWithSelection(g, _fragments,
-					_provider.getTextData(), getCSSStyle().getCSSFont()
-							.getSwtFont(), color, ((Integer) getCSSStyle()
-							.getStyleProperty(
-									ICSSPropertyID.ATTR_TEXTDECORATION))
-							.intValue(), range[0], range[1],
-					ColorConstants.white, ColorConstants.blue);
-		}
-		if (color != result && color != null) {
-			color.dispose();
-		}
-	}
-
-	/**
-	 * Find out lines which has closer y coordinate to point, and then line
-	 * which has closer x coordinate.
-	 * 
-	 * @param relative
-	 * @return
-	 */
-    // 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;
-	}
-
-	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
-	 */
-	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 d452e0d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSTextLayout.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.layout;
-
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * @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;
-
-	public CSSTextLayout(CSSTextFigure textfigure) {
-		super(textfigure);
-	}
-
-	// --------------------------------------------------------------------------------------------------
-	FlowBox findLastNonLineBox(LineBox box) {
-		List fragments = box.getFragments();
-		for (int i = fragments.size() - 1; i >= 0; i--) {
-			FlowBox item = (FlowBox) fragments.get(i);
-			if (item instanceof LineBox) {
-				FlowBox found = findLastNonLineBox((LineBox) item);
-				if (found != null) {
-					return found;
-				}
-			} else {
-				return item;
-			}
-		}
-		return null;
-	}
-
-	// boolean isElementContentWhitespaceEnding()
-	// {
-	// if (!this._context.isCurrentLineOccupied())
-	// return true;
-	// LineBox line = this._context.getCurrentLine();
-	// FlowBox lastNoneLinebox = findLastNonLineBox(line);
-	// if (lastNoneLinebox instanceof TextFragmentBox)
-	// return ((TextFragmentBox) lastNoneLinebox)._isLastCharWhitespace;
-	// else
-	// return true;
-	// }
-	//
-	// String normalize(String text)
-	// {
-	// text = EntityMap.translateAndCompact(text);
-	// if (text.length() > 0 &&
-	// Character.isElementContentWhitespace(text.charAt(0)) &&
-	// isElementContentWhitespaceEnding())
-	// return text.substring(1);
-	// else
-	// return text;
-	// }
-
-	private void layoutEmptyString(List fragments, Font font) {
-		// empty node! we want to create a fake fragment, so things can be
-		// consistent
-		// that all the CSSTextFigure will have something inside, also in this
-		// way, even
-		// empty text node will have a position, thus we can support showing
-		// caret associated
-		// with this text figure.
-		fragments.clear();
-		TextFragmentBox box = TextLayoutSupport.getFragment(0, fragments);
-		box._length = 0;
-		box._offset = 0;
-		box._height = 0;
-		box._width = 0;
-		box.setTextData("");
-
-		// {following comments deprecated XXX: If is empty string, we only want
-		// to this figure to have a size, but don't
-		// want to it to be added into current line. Otherwise, a line with only
-		// a empty string
-		// will also take a line's space.}
-
-		// please reference LineBox.isOccupied()
-		// now we treat a line with only an empty text as not occupied.
-		getFlowContext().getCurrentLine().add(box);
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#layout()
-	 */
-	protected void layout() {
-		CSSTextFigure flowFigure = (CSSTextFigure) getFlowFigure();
-
-		List fragments = flowFigure.getFragments();// Reuse the previous List
-		// of fragments
-		String text = flowFigure.getText();
-		Font font = flowFigure.getCSSStyle().getCSSFont().getSwtFont();
-		Object whitespace = flowFigure.getCSSStyle().getStyleProperty(
-				ICSSPropertyID.ATTR_WHITESPACE);
-
-		if (whitespace == ICSSPropertyID.VAL_PRE) {
-			if (text == null || text.length() == 0)
-				layoutEmptyString(fragments, font);
-			else
-				TextLayoutSupport.layoutNoWrap(getFlowContext(), text,
-						fragments, font);
-		} else if (whitespace == ICSSPropertyID.VAL_NOWRAP) {
-			if (text == null || text.length() == 0)
-				layoutEmptyString(fragments, font);
-			else
-				TextLayoutSupport.layoutNoWrap(getFlowContext(), text,
-						fragments, font);
-		} else {
-			if (text == null || text.length() == 0)
-				layoutEmptyString(fragments, font);
-			else {
-				boolean trimLeadingChar = (text.charAt(0) == ' ' && shouldTrimLeadingWhitespace(getFlowContext()));
-				TextLayoutSupport.layoutNormal(getFlowContext(), text,
-						fragments, font, _wrappingStyle, trimLeadingChar);
-			}
-		}
-	}
-
-	// 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;
-		}
-	}
-
-	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 ef573ee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSWidgetLayout.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.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
-	 */
-	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;
-	}
-
-	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 6cce954..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CompositeBox.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.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;
-	}
-
-	/**
-	 * Returns the recommended height for this compositebox.
-	 * 
-	 * @return
-	 */
-	public int getRecommendedHeight() {
-		return _recommendedHeight;
-	}
-
-	// public int getInnerTop() {
-	// validate();
-	// return y;
-	// }
-
-	/**
-	 * 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;
-	}
-
-	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;
-	}
-
-	public int getContentWidth() {
-		return getWidth() - getBorderPaddingWidth();
-	}
-
-	public int getContentHeight() {
-		return getHeight() - getBorderPaddingHeight();
-	}
-
-	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 c15f21d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/Debug.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.css2.layout;
-
-/**
- * Debug constants.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class Debug {
-	public static final boolean DEBUG_BASELINE = false;
-
-	public static final boolean DEBUG_BOX = false;
-
-	public static final boolean DEBUG_BORDERPADDING = false;
-
-	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 d67849b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/DisplayToLayout.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.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 class DisplayToLayout {
-	/**
-	 * @param figure
-	 * @param display
-	 * @param old
-	 * @return
-	 */
-	public static CSSLayout displayToLayout(CSSFigure figure, String display,
-			LayoutManager old) {
-		if ("block".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSBlockFlowLayout(figure);
-		} else if ("inline".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSInlineFlowLayout(figure);
-		} else if ("table".equalsIgnoreCase(display) || "inline-table".equalsIgnoreCase(display)) //$NON-NLS-1$ $NON-NLS-2$
-		{
-			return new CSSTableLayout2(figure);
-		} else if ("table-row".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSTRLayout(figure);
-		} else if ("table-row-group".equalsIgnoreCase(display) //$NON-NLS-1$
-				|| "table-header-group".equalsIgnoreCase(display) //$NON-NLS-1$
-				|| "table-footer-group".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSTRGroupLayout(figure);
-		} else if ("table-cell".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSTableCellLayout(figure);
-		} else if (display.equalsIgnoreCase("table-caption")) //$NON-NLS-1$
-		{
-			return new CSSTableCaptionLayout(figure);
-		} else if ("inline-block".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSBlockFlowLayout(figure) {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#isInlineBlock()
-				 */
-				public boolean isInlineBlock() {
-					return true;
-				}
-			};
-		} else if (ICSSPropertyID.VAL_LIST_ITEM.equalsIgnoreCase(display)) {
-			return new CSSListItemLayout(figure);
-		}
-		return null;
-	}
-
-	/**
-	 * @param figure
-	 * @param display
-	 * @param old
-	 * @return
-	 */
-	public static boolean isInline(String display) {
-		return "inline".equalsIgnoreCase(display) //$NON-NLS-1$
-				|| "inline-block".equalsIgnoreCase(display); //$NON-NLS-1$
-	}
-
-	/**
-	 * @param style
-	 * @return
-	 */
-	public static boolean isPositioned(ICSSStyle style) {
-		Object position = style.getStyleProperty(ICSSPropertyID.ATTR_POSITION);
-		if (PositionMeta.STATIC.equalsIgnoreCase((String) position)) {
-			return false;
-		}
-        return true;
-	}
-}
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 60e3f6f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FigureUtil.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.layout;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Translatable;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class FigureUtil {
-	// 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);
-		}
-	}
-
-	// 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);
-		}
-
-	}
-}
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 149fbd9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowBox.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 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
-	 */
-	public int _x;
-
-	/**
-	 * The y location
-	 */
-	public int _y;
-
-	int _width;
-
-	int _height;
-
-	public Insets _marginInsets = new Insets();
-
-	public Insets _borderInsets = new Insets();
-
-	public 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;
-	}
-
-	public void setWidth(int w) {
-		_width = w;
-	}
-
-	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());
-	}
-
-	public int getBorderPaddingWidth() {
-		return _borderInsets.getWidth() + _paddingInsets.getWidth();
-	}
-
-	/**
-	 * @return
-	 */
-	public int getBorderPaddingHeight() {
-		return _borderInsets.getHeight() + _paddingInsets.getHeight();
-	}
-
-	/**
-	 * @return
-	 */
-	public Insets getBorderPaddingInsets() {
-		Insets temp = new Insets(_borderInsets);
-		return temp.add(_paddingInsets);
-	}
-
-	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;
-	}
-
-	public Rectangle getRectangle() {
-		return new Rectangle(this._x, this._y, this.getWidth(), this
-				.getHeight());
-	}
-}
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 aa17d12..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowContainerLayout.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.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 = false;
-
-	/**
-	 * @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._marginInsets.right;
-		}
-        return 0;
-	}
-
-	public void setCalculatingMaxWidth(boolean c) {
-		_calculatingMaxWidth = c;
-	}
-
-	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 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 dbca0dd..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
-	 */
-	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
-	 */
-	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
-	 */
-	boolean isCalculatingMaxWidth();
-
-	/**
-	 * when calculating percentage width, we need the container width
-	 * 
-	 * @return
-	 */
-	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 c610eb8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowFigure.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.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * The base implementation for text flow figures. A flow figure is used to
- * render a document in which elements are laid out horizontally within a "line"
- * until that line is filled. Layout continues on the next line.
- * <p>
- * WARNING: This class is not intended to be subclassed by clients. Future
- * versions may contain additional abstract methods.
- * 
- * @author mengbo
- * @since 2.1
- */
-public abstract class FlowFigure extends Figure {
-
-	// static final boolean SHOW_BASELINE = true;
-
-	/**
-	 * Constructs a new FlowFigure.
-	 */
-	public FlowFigure() {
-		// setLayoutManager(createDefaultFlowLayout());
-	}
-
-	/**
-	 * If the child is a <code>FlowFigure</code>, its FlowContext is passed
-	 * to it.
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#add(IFigure, Object, int)
-	 */
-	public void add(IFigure child, Object constraint, int index) {
-		super.add(child, constraint, index);
-		if (child instanceof FlowFigure) {
-			FlowFigure ff = (FlowFigure) child;
-			if (getLayoutManager() instanceof FlowContext) {
-				ff.setOriginalFlowContext((FlowContext) getLayoutManager());
-			} else {
-				PDPlugin.getLogger(this.getClass()).error("layout is not FlowContext", new Throwable("This exception is artificial so  we can get a stack trace"));
-			}
-		}
-	}
-
-	/**
-	 * Creates the default layout manager
-	 * 
-	 * @return The default layout
-	 */
-	// protected abstract FlowFigureLayout createDefaultFlowLayout();
-	/**
-	 * @see Figure#paintFigure(Graphics)
-	 */
-	protected void paintFigure(Graphics g) {
-		super.paintFigure(g);
-		// g.drawRectangle(getBounds().getResized(-1,-1));
-	}
-
-	/**
-	 * Called after validate has occurred. This is used to update the bounds of
-	 * the FlowFigure to encompass its new flow boxed created during validate.
-	 */
-	public abstract void postValidate();
-
-	/**
-	 * FlowFigures override setBounds() to prevent translation of children.
-	 * "bounds" is a derived property for FlowFigures, calculated from the
-	 * fragments that make up the FlowFigure.
-	 * 
-	 * @see Figure#setBounds(Rectangle)
-	 */
-	public void setBounds(Rectangle r) {
-		if (getBounds().equals(r))
-			return;
-		erase();
-		bounds.x = r.x;
-		bounds.y = r.y;
-		bounds.width = r.width;
-		bounds.height = r.height;
-		fireFigureMoved();
-		repaint();
-	}
-
-	/**
-	 * Sets the flow context.
-	 * 
-	 * @param flowContext
-	 *            the flow context for this flow figure
-	 */
-	public void setOriginalFlowContext(FlowContext flowContext) {
-		((FlowFigureLayout) getLayoutManager())
-				.setOriginalFlowContext(flowContext);
-	}
-
-	public void setDisplayString(String s) {
-		_displayString = s;
-	}
-
-	public String toString() {
-		if (_displayString == null)
-        {
-			return super.toString();
-        }
-        return _displayString + " " + getClass().getName();
-	}
-
-	String _displayString; // for debug
-
-	/**
-	 * @return
-	 */
-	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 3f80478..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowFigureLayout.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.css2.layout;
-
-import org.eclipse.draw2d.AbstractLayout;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-
-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;
-	}
-
-	public FlowContext getOriginalFlowContext() {
-		return _context;
-	}
-
-	/**
-	 * get flow context.
-	 * 
-	 * @return
-	 */
-	public FlowContext getFlowContext() {
-		return _context;
-	}
-
-	public String toString() {
-		// for debug purpose.
-		return _flowFigure.toString();
-	}
-
-	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 5ebde82..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowUtilities.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.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 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
-	 */
-	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;
-	}
-
-	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
-	 */
-	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);
-	}
-
-}
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 b0a1935..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
-	 */
-	public List getFragmentsForRead();
-
-	/**
-	 * get the CSSStyle of this CSS figure.
-	 * 
-	 * @return
-	 */
-	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 1320103..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
-	 */
-	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 5ab842f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/LineBox.java
+++ /dev/null
@@ -1,414 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and 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()}or {@link#getHeight()}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._marginInsets.left;
-			xLocation = block._x + block._width + block._marginInsets.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();
-			}
-		}
-	}
-
-	protected 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._marginInsets.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;
-	}
-
-	/**
-	 * @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;
-	}
-
-	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;
-	}
-}
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 4ea41d9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/MultiLineLabel.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.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;
-
-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;
-	}
-
-	public 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 8090751..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/TextFragmentBox.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.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;
-
-	public 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;
-	}
-
-	public String getTextData() {
-		return _textData;
-	}
-
-	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 0a4a352..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/TextLayoutSupport.java
+++ /dev/null
@@ -1,386 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.property.TextDecorationMeta;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * @author mengbo
- */
-public class TextLayoutSupport {
-	private static final Logger _log = PDPlugin
-			.getLogger(TextLayoutSupport.class);
-
-	private static final String[] DELIMITERS = { "\r\n", //$NON-NLS-1$
-			"\n", //$NON-NLS-1$
-			"\r" //$NON-NLS-1$
-	}; //$NON-NLS-1$
-
-	static private int delimeterLength;
-
-	/**
-	 * Reuses an existing <code>TextFragmentBox</code>, or creates a new one.
-	 * 
-	 * @param i
-	 *            the index
-	 * @param fragments
-	 *            the original list of fragments
-	 * @return a TextFragmentBox
-	 */
-	// copied from TextLayout
-	protected static TextFragmentBox getFragment(int i, List fragments) {
-		if (fragments.size() > i) {
-			return (TextFragmentBox) fragments.get(i);
-		}
-		TextFragmentBox box = new TextFragmentBox();
-		fragments.add(box);
-		return box;
-	}
-
-	/**
-	 * Returns the average character width of given TextFragmentbox
-	 * 
-	 * @param fragment
-	 *            the TextFragmentBox
-	 * @return the average character width
-	 */
-	public static float getAverageCharWidth(TextFragmentBox fragment) {
-		if (fragment._width != 0 && fragment._length != 0) {
-			return fragment._width / (float) fragment._length;
-		}
-		return 0.0f;
-	}
-
-	// ----------------------------------------------------------------------------------------
-	/**
-	 * this method will create a set of TextFragment. Each fragment will offset
-	 * to the original text (whole text for the text figure).
-	 */
-	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);
-		}
-	}
-
-	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;
-	}
-
-	public static void paintTextFigure(Graphics g, List fragments, Font font,
-			int textDecoration) {
-		paintTextFigure(g, fragments, font, null, 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);
-		}
-	}
-
-	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$
-		}
-	}
-
-	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;
-	}
-}
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 5be873b..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;
-	}
-
-	public void setAscent(int ascent) {
-		_ascent = ascent;
-	}
-
-	/**
-	 * @return
-	 */
-	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 7351ac0..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._y + bottomBox.getHeight() - topBox._y;
-		}
-		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._marginInsets
-							.getHeight(), movement);
-					lineBox._y = lineBox._y + LineMovement
-							- lineBox._marginInsets.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 7ba7fda..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableLayout2.java
+++ /dev/null
@@ -1,633 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSPainter;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo;
-import org.eclipse.swt.SWT;
-
-/**
- * see also http://www.w3.org/TR/REC-CSS2/tables.html
- * 
- * @author mengbo
- * @version 1.5
- */
-public class CSSTableLayout2 extends CSSBlockFlowLayout implements ICSSPainter {
-	static Logger _log = PDPlugin.getLogger(CSSTableLayout2.class);
-
-	int _hspacing;
-
-	int _vspacing;
-
-	int[] _columnWidths;
-
-	int[] _rowHeights;
-
-	Dimension _captionSize;
-
-	// _tableInfo will be initialized in preLayout
-	TableInfo _tableInfo;
-
-	private int _internalTableWidth;
-
-	private int _internalTableHeight;
-
-	private int _rowx;
-
-	private int _rowwidth;
-
-	/**
-	 * @param flowfigure
-	 */
-	public CSSTableLayout2(CSSFigure flowfigure) {
-		super(flowfigure);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#preLayout()
-	 */
-	protected void preLayout() {
-		// super.preLayout will setup the block box.
-		super.preLayout();
-
-		ICSSStyle style = this.getCSSStyle();
-
-		_hspacing = _vspacing = 3; // default value
-
-		if (style != null) {
-			Object borderspacing = style
-					.getStyleProperty(ICSSPropertyID.ATTR_BORDER_SPACING);
-			if (borderspacing instanceof int[]) {
-				int[] intvalues = (int[]) borderspacing;
-				_hspacing = intvalues[0];
-				_vspacing = intvalues[1];
-			} else {
-				ITagEditInfo info = (ITagEditInfo) style
-						.getAdapter(ITagEditInfo.class);
-				if (info != null && info.needTableDecorator()) {
-					// default decorating value. to make things look more
-					// separated.
-					if (_hspacing < 5) {
-						_hspacing = 5;
-					}
-					if (_vspacing < 5) {
-						_vspacing = 5;
-					}
-				}
-			}
-		}
-
-		// TODO: support caption
-		_tableInfo = new TableInfo(getCSSFigure());
-
-		// construct the table structure.
-		_tableInfo.constructTable();
-
-		// calculate the user specified width/height for table and cells.
-		// contentWidth is the user specified content width. If <= 0 means no
-		// user
-		// specification.
-		int contentWidth = this._blockBox.getContentWidth();
-		int availableWidth = this._blockBox.getRecommendedContentWidth();
-		int contentHeight = this._blockBox.getContentHeight();
-
-		_tableInfo.calculateWidth(contentWidth, availableWidth);
-		_tableInfo.calculateHeight(contentHeight);
-
-		int columnCount = _tableInfo.getColumnCount();
-
-		int columnMinWidths[] = new int[columnCount];
-		int columnMaxWidths[] = new int[columnCount];
-
-		// For each column, determine a maximum and minimum column width from
-		// the cells that span only that column. The minimum is that required by
-		// the cell with the largest minimum cell width (or the column 'width',
-		// whichever is larger). The maximum is that required by the cell with
-		// the
-		// largest maximum cell width (or the column 'width', whichever is
-		// larger).
-		List cells = _tableInfo.getCells();
-		for (int i = 0, size = cells.size(); i < size; i++) {
-			TableCellInfo cellinfo = (TableCellInfo) cells.get(i);
-			if (cellinfo.getColSpan() == 1) {
-				int column = cellinfo.getColumnIndex();
-				Dimension mincw = cellinfo.getMinCWDimension();
-				Dimension maxcw = cellinfo.getMaxCWDimension();
-				if (maxcw.width < mincw.width) {
-					maxcw.width = mincw.width;
-				}
-				if (mincw.width > columnMinWidths[column]) {
-					columnMinWidths[column] = mincw.width;
-				}
-				if (maxcw.width > columnMaxWidths[column]) {
-					columnMaxWidths[column] = maxcw.width;
-				}
-			}
-		}
-		// For caption, determine a maximum and minimum width from it.
-		int captionWidth = 0;
-		if (_tableInfo._caption != null) {
-			captionWidth = _tableInfo._caption.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._caption != null) {
-			_captionSize = _tableInfo._caption.getFigure().getPreferredSize(
-					_internalTableWidth, SWT.DEFAULT);
-			captionHeight = _captionSize.height;
-		} else {
-			_captionSize = null;
-		}
-		_internalTableHeight += captionHeight;
-
-		_blockBox.setHeight(_internalTableHeight + insets.getHeight());
-
-		_rowwidth = _internalTableWidth - 2 * _hspacing;
-		_rowx = _hspacing; // XXX: table border width left?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#endBlock()
-	 */
-	protected void endBlock() {
-		_blockBox.setWidth(_internalTableWidth
-				+ _blockBox.getBorderPaddingWidth());
-		_blockBox.setHeight(_internalTableHeight
-				+ _blockBox.getBorderPaddingHeight());
-		super.endBlock();
-	}
-
-	//
-	// /**
-	// * when some of the column has percentage width, and sigmaMax smaller than
-	// container,
-	// * @param containerWidth
-	// * @param columnMinWidths
-	// * @param columnMaxWidths
-	// * @return
-	// */
-	// private int distribute2(int containerWidth, int[] columnMinWidths, int[]
-	// columnMaxWidths)
-	// {
-	//        
-	// }
-	//    
-	/**
-	 * Distribute the additional width to columnMinWidths, using max width as a
-	 * possible reference on how to distribute.
-	 * 
-	 * @param toDistribute
-	 * @param columnMinWidths
-	 * @param columnMaxWidths
-	 */
-	private void distribute(int toDistribute, int[] columnMinWidths,
-			int[] columnMaxWidths) {
-		if (toDistribute <= 0)
-			return;
-		if (columnMinWidths.length == 0)
-			return;
-
-		int[] delta = new int[columnMinWidths.length];
-		int sigmaDelta = 0;
-		for (int i = 0; i < columnMinWidths.length && toDistribute > 0; i++) {
-			if (_tableInfo._widthSpecified[i]) {
-				delta[i] = 0;
-			} else {
-				delta[i] = columnMaxWidths[i] - columnMinWidths[i];
-				if (delta[i] <= 0) {
-					delta[i] = 0;
-				}
-				sigmaDelta += delta[i];
-			}
-		}
-		if (sigmaDelta == 0) {
-			// should not happen, but anyway, distribute all to the last column
-			// columnMinWidths[columnMinWidths.length-1] += toDistribute;
-			averageDeltaToCell(columnMinWidths, toDistribute);
-		} else {
-			int left = toDistribute;
-			for (int i = 0; i < columnMinWidths.length - 1; i++) {
-				if (delta[i] > 0) {
-					int add = delta[i] * toDistribute / sigmaDelta;
-					left -= add;
-					columnMinWidths[i] += add;
-				}
-			}
-			columnMinWidths[columnMinWidths.length - 1] += left;
-		}
-	}
-
-	private void averageDeltaToCell(int[] columnMinWidths, int toDistribute) {
-
-		if (toDistribute <= 0) {
-			return;
-		}
-		ArrayList list = new ArrayList();
-		for (int i = 0; i < columnMinWidths.length; i++) {
-			if (!_tableInfo._widthSpecified[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._caption;
-	}
-
-	/**
-	 * @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 6a6ac4d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CachedTableCellLayout.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and 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 {
-	protected Dimension _pageSize = new Dimension();
-
-	protected 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();
-	}
-
-	public abstract Rectangle getCellRect();
-
-	public 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;
-		}
-	}
-
-	public int getRecommendedWidth() {
-		return _recommendedWidth;
-	}
-
-	private void setRecommendedWidth(int width) {
-		if (_recommendedWidth == width) {
-			return;
-		}
-		_recommendedWidth = width;
-	}
-
-	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 05c3c07..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._widthSpecified[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 5f4b889..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableInfo.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and 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
- */
-public class TableInfo extends TableItemInfo {
-	List _tableHeaderGroups = new ArrayList();
-
-	List _tableTRandTRGs = new ArrayList();
-
-	List _tableFooterGroups = new ArrayList();
-
-	TableCaptionInfo _caption;
-
-	int _columnCount;
-
-	int _rowCount;
-
-	List _cells = null;
-
-	private List _rows = null;
-
-	int _tableWidth; // calculated table width, valid after calling to
-
-	// calculateTableWidth
-
-	int _availableWidth;
-
-	int _tableHeight;
-
-	private int[] _widthPercentage;
-
-	private int[] _heightPercentage;
-
-	boolean[] _widthSpecified;
-
-	/**
-	 * @param figure
-	 */
-	public TableInfo(ICSSFigure figure) {
-		super(figure);
-	}
-
-	public List getTableHeaderGroups() {
-		return _tableHeaderGroups;
-	}
-
-	public List getTRandTRGs() {
-		return _tableTRandTRGs;
-	}
-
-	public List getTableFooterGroups() {
-		return _tableFooterGroups;
-	}
-
-	public int getColumnCount() {
-		return _columnCount;
-	}
-
-	public int getRowCount() {
-		return _rowCount;
-	}
-
-	protected 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;
-		}
-	}
-
-	public void setWidthPercentage(int columnIndex, int percentageValue) {
-		if (percentageValue > this._widthPercentage[columnIndex]) {
-			this._widthPercentage[columnIndex] = percentageValue;
-		}
-	}
-
-	public 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;
-	}
-
-	public int[] getHeightPercentages() {
-		return this._heightPercentage;
-	}
-
-	public 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;
-	}
-
-	public 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);
-		}
-	}
-
-	public 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 87ffa68..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableInfoContext.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.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
- */
-public 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
-	 */
-	public IntFlexArray getIntFlexArray() {
-		return _array;
-	}
-
-	/**
-	 * @return
-	 */
-	public int getCurrentCol() {
-		return _currentCol;
-	}
-
-	public void setCurrentCol(int currentcol) {
-		_currentCol = currentcol;
-	}
-
-	public int getCurrentRow() {
-		return _currentRow;
-	}
-
-	/**
-	 * @return
-	 */
-	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
-	 */
-	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 33c6e12..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableItemInfo.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.table;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableItemInfo {
-	public ICSSFigure _figure;
-
-	/**
-	 * 
-	 */
-	public TableItemInfo(ICSSFigure figure) {
-		_figure = figure;
-	}
-
-	public ICSSFigure getFigure() {
-		return _figure;
-	}
-
-	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 d9ae2fe..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
- */
-public class TableRowGroupInfo extends TableItemInfo {
-	List _rowList = new ArrayList();
-
-	private int _rowIndex;
-
-	private int _rowCount;
-
-	/**
-	 * @param figure
-	 */
-	public TableRowGroupInfo(ICSSFigure figure) {
-		super(figure);
-	}
-
-	public List getRowList() {
-		return _rowList;
-	}
-
-	public int getRowIndex() {
-		return _rowIndex;
-	}
-
-	public int getRowCount() {
-		return this._rowCount;
-	}
-
-	/**
-	 * @param context
-	 */
-	public void calculateRowGroup(TableInfoContext context) {
-		this._rowIndex = context.getCurrentRow();
-		List children = getFigure().getChildren();
-		for (int i = 0, size = children.size(); i < size; i++) {
-			IFigure childfigure = (IFigure) children.get(i);
-			if (childfigure instanceof ICSSFigure) {
-				ICSSStyle childstyle = ((ICSSFigure) childfigure).getCSSStyle();
-				if (childstyle != null
-						&& "table-row"
-								.equalsIgnoreCase(childstyle.getDisplay())) {
-					TableRowInfo rowInfo = new TableRowInfo(
-							(ICSSFigure) childfigure);
-					_rowList.add(rowInfo);
-					rowInfo.calculateRow(context);
-				} else {
-					// skip
-				}
-			} else {
-				// skip
-			}
-		}
-		context.finishRowGroup();
-		this._rowCount = context.getCurrentRow() - this._rowIndex;
-	}
-
-	/**
-	 * @param _cells
-	 */
-	public void getCells(List _cells) {
-		for (int i = 0, size = _rowList.size(); i < size; i++) {
-			TableRowInfo rowInfo = (TableRowInfo) _rowList.get(i);
-			rowInfo.getCells(_cells);
-		}
-	}
-
-	/**
-	 * @param figure
-	 * @return
-	 */
-	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 f305d0d..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
- */
-public class TableRowInfo extends TableItemInfo {
-	List _cells = new ArrayList();
-
-	int _rowIndex;
-
-	private int _rowHeight;
-
-	/**
-	 * @param figure
-	 */
-	public TableRowInfo(ICSSFigure figure) {
-		super(figure);
-	}
-
-	public List getCells() {
-		return _cells;
-	}
-
-	public int getRowIndex() {
-		return _rowIndex;
-	}
-
-	public int getSpecifiedRowHeight() {
-		return _rowHeight;
-	}
-
-	/**
-	 * @param context
-	 */
-	public void calculateRow(TableInfoContext context) {
-		this._rowIndex = context.getCurrentRow();
-
-		List children = getFigure().getChildren();
-		for (int i = 0, size = children.size(); i < size; i++) {
-			IFigure childfigure = (IFigure) children.get(i);
-			if (childfigure instanceof ICSSFigure) {
-				ICSSStyle childstyle = ((ICSSFigure) childfigure).getCSSStyle();
-				if (childstyle != null) {
-					String display = childstyle.getDisplay();
-					if ("table-cell".equalsIgnoreCase(display)) {
-						TableCellInfo cellInfo = new TableCellInfo(
-								(ICSSFigure) childfigure);
-						cellInfo.calculateCellInfo(context);
-						_cells.add(cellInfo);
-					} else {
-						// skip
-					}
-				}
-			} else {
-				// skip
-			}
-		}
-		// ok, we have finished a row
-		context.finishRow();
-	}
-
-	/**
-	 * @param _cells2
-	 */
-	public void getCells(List cells) {
-		cells.addAll(this._cells);
-	}
-
-	/**
-	 * @param figure
-	 * @return
-	 */
-	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 height
-	 */
-	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 9711992..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CSSHtmlListStyleData.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.css2.list;
-
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author mengbo
- */
-public class CSSHtmlListStyleData {
-	public final static int LIST_T_IMAGE = 0;
-
-	public final static int LIST_T_DISC = 1;
-
-	public final static int LIST_T_CIRCLE = 2;
-
-	public final static int LIST_T_SQUARE = 3;
-
-	public final static int LIST_T_DECIMAL = 0x11;
-
-	public final static int LIST_T_DECIMAL_LEADING_ZERO = 0x12;
-
-	public final static int LIST_T_LOWER_ALPHA = 0x13;
-
-	public final static int LIST_T_LOWER_ROMAN = 0x14;
-
-	public final static int LIST_T_UPPER_ALPHA = 0x15;
-
-	public final static int LIST_T_UPPER_ROMAN = 0x16;
-
-	//private CSSMarkerStyleData _markerStyleData;
-
-	private Image _markerImage;
-
-	private int _type;
-
-	public boolean isDefaultPicture() {
-		return (_type & 0xf) != 0;
-	}
-
-	private String getResolvedURL() {
-		//String textValue = _markerStyleData.getTextContent();
-		// TODO: when I found this, resolver was not being set and would either
-        // have thrown NPE or returned "".. so I've "improved it :)
-        //URIResolver resolver = null;// FIXME: this is not implemented yet.
-		// DesignerPropertyTool.getModel().getResolver();
-		//if (textValue != null && textValue.length() > 0) {
-		//	return resolver.getLocationByURI(textValue);
-		//}
-		return "";
-	}
-
-	/**
-	 * @return Returns the markerImage.
-	 */
-	public Image getMarkerImage() {
-		if (!this.isImage()) {
-			return null;
-		}
-		if (_markerImage == null) {
-			String uri = this.getResolvedURL();
-			_markerImage = new Image(null, uri);
-		}
-		return _markerImage;
-	}
-
-	/**
-	 * @return Returns the type.
-	 */
-	public int getType() {
-		return _type;
-	}
-
-	public void setType(String type) {
-
-		this._type = toTypeInt(type);
-	}
-
-	/**
-	 * @return Returns the markerString.
-	 */
-	public String getTextValue(int index) {
-		if (!this.isText()) {
-			return null;
-		}
-		// ICounter counter = CounterFactory.getInstance().getCounter(_type);
-		return "";
-
-	}
-
-	public boolean isText() {
-		return (_type & 0xf0) != 0;
-	}
-
-	public boolean isImage() {
-		return (_type == LIST_T_IMAGE);
-	}
-
-	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 0fcbb6e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CSSMarkerStyleData.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.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 isOutside
-	 *            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;
-	}
-
-	public Object getNextElement() {
-		if (_content == null || _content.size() == 0) {
-			return null;
-		}
-		return _content.remove(0);
-	}
-
-	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 5d666f7..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 b8d1138..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CounterHelper.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.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 class CounterHelper {
-	public final static int LIST_T_IMAGE = 0;
-
-	public final static int LIST_T_DISC = 1;
-
-	public final static int LIST_T_CIRCLE = 2;
-
-	public final static int LIST_T_SQUARE = 3;
-
-	public final static int LIST_T_DECIMAL = 0x11;
-
-	public final static int LIST_T_DECIMAL_LEADING_ZERO = 0x12;
-
-	public final static int LIST_T_LOWER_ALPHA = 0x13;
-
-	public final static int LIST_T_LOWER_ROMAN = 0x14;
-
-	public final static int LIST_T_UPPER_ALPHA = 0x15;
-
-	public final static int LIST_T_UPPER_ROMAN = 0x16;
-
-	public final static int LIST_T_LOWER_GREEK = 0x21;
-
-	public final static int LIST_T_ARMENIAN = 0x22;
-
-	public final static int LIST_T_GEORGIAN = 0x23;
-
-	public final static int LIST_T_NONE = 0x24;
-
-	// /**
-	// * Collect counters declaration from node and its parents
-	// *
-	// * @param style
-	// * @param counters
-	// * @return
-	// */
-	// public static void getCounters(ICSSStyle style, HashMap counters)
-	// {
-	// processCounterReset(style, counters);
-	// Object content = style.getStyleProperty(ICSSPropertyID.ATTR_CONTENT);
-	// // content counter could be reference or creation of new one.
-	// if (content != null && content != ICSSPropertyMeta.NOT_SPECIFIED)
-	// {
-	// // XXX: what 's the content.
-	// ContentObject contentObject = null;
-	// Object counter = null;
-	// if (content instanceof List)
-	// {
-	// // TODO: we only deal with one currently.
-	// contentObject = (ContentObject) ((List) content).get(0);
-	// }
-	// else if (content instanceof ContentObject)
-	// {
-	// contentObject = (ContentObject) content;
-	// }
-	// if (style.getParentStyle() != null)
-	// {
-	// String identifier = contentObject.getCounter().getIdentifier();
-	// counter = style.getParentStyle().findCounter(identifier, false);
-	// if (counter == null)
-	// {
-	// // no reference, then create it.
-	// counter = contentObject.getCounter();
-	// }
-	// }
-	// Assert.isTrue(counter != null);
-	// ((Counter2) counter).regist(style);
-	// counters.put(((Counter2) counter).getIdentifier(), counter);
-	// }
-	// // counter-increment is reference.
-	// processCounterIncrement(style/* , counters */);
-	// }
-
-	/**
-	 * @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
-	 * @param counters
-	 */
-	public static void processCounterIncrement(ICSSStyle style/*
-																 * , HashMap
-																 * counters
-																 */) {
-		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));
-						}
-					}
-				}
-			}
-		}
-	}
-
-	public static boolean isImage(ICSSStyle style) {
-		return false;
-	}
-
-	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));
-	}
-
-	public static boolean isNodeImage(ICSSStyle style) {
-		return false;
-	}
-
-	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;
-	}
-
-	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;
-	}
-
-	// TODO: for future use we need a new ContentObject to hold other objects
-	// declares in css style.
-
-	// public static ContentObject getContentObject(ICSSStyle style)
-	// {
-	// // TODO: currently we only fetch first counter in case there are more
-	// than one counters.
-	// if (style.getStyleProperty(ICSSPropertyID.ATTR_CONTENT) !=
-	// ICSSPropertyMeta.NOT_SPECIFIED)
-	// {
-	// Object content = style.getStyleProperty(ICSSPropertyID.ATTR_CONTENT);
-	// Object object = null;
-	// if (content instanceof List)
-	// {
-	// object = ((List) content).get(0);
-	// }
-	// else if (content instanceof ContentObject)
-	// {
-	// object = content;
-	// }
-	// if (object instanceof ContentObject)
-	// {
-	// return (ContentObject) content;
-	// }
-	// }
-	// return null;
-	// }
-
-	public static boolean isIdentifier(Object cssValue) {
-		return (cssValue instanceof ICSSPrimitiveValue)
-				&& ((ICSSPrimitiveValue) cssValue).getPrimitiveType() == CSSPrimitiveValue.CSS_IDENT;
-	}
-
-	public static boolean isNumber(Object cssValue) {
-		return cssValue instanceof ICSSPrimitiveValue
-				&& ((ICSSPrimitiveValue) cssValue).getPrimitiveType() == ICSSPrimitiveValue.CSS_INTEGER;
-	}
-}
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 1776993..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CounterValueGenerator.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.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;
-
-	public static final Set STRING_TYPES = new HashSet();
-
-	public static final Set NON_STRING_TYPES = new HashSet();
-	static {
-		NON_STRING_TYPES.add("disc");
-		NON_STRING_TYPES.add("circle");
-		NON_STRING_TYPES.add("square");
-		STRING_TYPES.add("decimal");
-		STRING_TYPES.add("decimal-leading-zero");
-		STRING_TYPES.add("lower-roman");
-		STRING_TYPES.add("upper-roman");
-		STRING_TYPES.add("lower-greek");
-		STRING_TYPES.add("lower-alpha");
-		STRING_TYPES.add("lower-latin");
-		STRING_TYPES.add("upper-alpha");
-		STRING_TYPES.add("upper-latin");
-		STRING_TYPES.add("hebrew");
-		STRING_TYPES.add("armenian");
-		STRING_TYPES.add("georgian");
-		STRING_TYPES.add("cjk-ideographic");
-		STRING_TYPES.add("hiragana");
-		STRING_TYPES.add("katakana");
-		STRING_TYPES.add("hiragana-iroha");
-		STRING_TYPES.add("katakana-iroha");
-	}
-
-	private final static int DEFAULT_INCREMENT = 1;
-
-	private boolean _first = true;
-
-	private Integer _initial;
-
-	private List _visitors;
-
-	private int _count;
-
-	private String _identifier;
-
-	private String _styleType;
-
-	private String _seperator;
-
-	private ICSSStyle _style;
-
-	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;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.w3c.dom.css.Counter#getListStyle()
-	 */
-	public String getListStyle() {
-		return _styleType;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @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 01b660f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/HTMLListInfoHelper.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.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
- */
-public 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;
-	}
-
-	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;
-	}
-
-	public static Integer getValueInt(ICSSStyle style) {
-		try {
-			return Integer.valueOf(getValue(style));
-		} catch (NumberFormatException ex) {
-			return null;
-		}
-	}
-}
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 86c9793..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ICounterValueGenerator.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.list;
-
-/**
- * @author mengbo
- */
-public interface ICounterValueGenerator {
-	public String getIdentifier();
-
-	public ICounterValueGenerator resetCount(int initial);
-
-	public ICounterValueGenerator resetCount();
-
-	/*
-	 * Set the counter based on value.
-	 */
-	public void setCount(Integer value);
-
-	// public void regist(Object caller);
-	// public void unregist(Object caller);
-
-	/*
-	 * Increase counter based on declared increment number
-	 */
-	public void increase(int increment);
-
-	/*
-	 * Increase counter with default increment number(1)
-	 */
-	public void increase();
-
-	public Integer getCount(Object caller);
-
-	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 152d1dd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/IIndexConverter.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.css2.list;
-
-/**
- * @author mengbo
- */
-public interface IIndexConverter {
-	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 4b2ac8a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/IncrementObject.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.css2.list;
-
-/**
- * @author mengbo
- */
-public class IncrementObject {
-	private String _counterName;
-
-	private Integer _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 5412580..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ListStyleUtil.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.list;
-
-/**
- * @author mengbo
- */
-public class ListStyleUtil {
-	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;
-	}
-
-}
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 bfaabf5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ResetObject.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.css2.list;
-
-/**
- * @author mengbo
- */
-public class ResetObject {
-	private String _counterName;
-
-	private Integer _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 9a08dd3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/CounterFactory.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.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;
-
-	public static CounterFactory getInstance() {
-		if (_instance == null) {
-			_instance = new CounterFactory();
-		}
-		return _instance;
-	}
-
-	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;
-
-		}
-	}
-}
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 d1627c7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/CounterUtil.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.marker;
-
-import org.eclipse.jst.pagedesigner.css2.list.CounterHelper;
-
-/**
- * @author mengbo
- */
-public class CounterUtil {
-	public static String convertCount(int count, int type) {
-		// XXX: currently we only support style that IE supported.for type that
-		// does not
-		// support we return an empty String.
-		StringBuffer buffer = new StringBuffer();
-		switch (type) {
-		case CounterHelper.LIST_T_DECIMAL:
-			buffer.append(count);
-			buffer.append('.');
-			break;
-		case CounterHelper.LIST_T_UPPER_ALPHA:
-		case CounterHelper.LIST_T_LOWER_ALPHA:
-			char charA = 'a';
-			if (type == CounterHelper.LIST_T_UPPER_ALPHA) {
-				charA = 'A';
-			}
-			int index = count;
-			while (index > 0 && index > 26) {
-				buffer.append((char) (charA + (index / 26) - 1));
-				index = index % 26;
-			}
-			buffer.append((char) (charA + (index - 1)));
-			buffer.append(".");
-			break;
-		case CounterHelper.LIST_T_UPPER_ROMAN:
-		case CounterHelper.LIST_T_LOWER_ROMAN:
-			String string = new RomanCounter().getString(count);
-			if (type == CounterHelper.LIST_T_LOWER_ROMAN) {
-				buffer.append(string.toLowerCase());
-			} else {
-				buffer.append(string);
-			}
-			buffer.append(".");
-			break;
-		case CounterHelper.LIST_T_ARMENIAN:
-			break;
-		case CounterHelper.LIST_T_DECIMAL_LEADING_ZERO:
-			break;
-		case CounterHelper.LIST_T_LOWER_GREEK:
-			break;
-		case CounterHelper.LIST_T_GEORGIAN:
-			break;
-		default:
-			break;
-		}
-		return buffer.toString();
-	}
-}
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 4e8c88f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/DecimalCounter.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.marker;
-
-import org.eclipse.jst.pagedesigner.css2.list.CSSHtmlListStyleData;
-
-/**
- * @author mengbo
- */
-public class DecimalCounter extends EnumerableCounter {
-	protected DecimalCounter() {
-	    // do nothing; restrict construction to child classes
-	}
-
-	/*
-	 * (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 = getChildrenCount();
-			for (int i = sb.length(); i < count; i++) {
-				sb.append('0');
-			}
-			sb.append(Integer.toString(index));
-			return sb.toString();
-		default:
-			return null;
-		}
-	}
-
-	public int getChildrenCount() {
-		return 1;
-	}
-}
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 190d9a3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/EnumerableCounter.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.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 Object getNextObject(Element element, int type) {
-		int index = calculateIndex(element);
-		return getNextString(index, type);
-	}
-
-	public int calculateIndex(Element element) {
-		String tag = element.getLocalName();
-		Node parent = element.getParentNode();
-		NodeList children = parent.getChildNodes();
-		int index = 1;
-		for (int i = 0; i < children.getLength(); i++) {
-			Node child = children.item(i);
-			if (child == element) {
-				break;
-			}
-			if (child.getLocalName().equalsIgnoreCase(tag)) {
-				index++;
-			}
-		}
-		return 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 93d06bb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/ICounter.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and 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 {
-	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 b9e9c41..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/RomanCounter.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.marker;
-
-import org.eclipse.jst.pagedesigner.css2.list.CSSHtmlListStyleData;
-
-/**
- * @author mengbo
- */
-public class RomanCounter extends EnumerableCounter {
-	protected RomanCounter() {
-	    // do nothing; restrict construction to sub-classes
-	}
-
-	/*
-	 * (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)
-	 */
-	public String getString(int index) {
-		// FIXME: Need to enhance more.
-		StringBuffer roman = new StringBuffer();
-		int a, b, c, d;
-		a = (index / 1000) * 1000;
-		b = ((index / 100) % 10) * 100;
-		c = ((index / 10) % 10) * 10;
-		d = ((index / 1) % 10) * 1;
-
-		if (a == 1000)
-			roman.append("M");
-		else if (a == 2000)
-			roman.append("MM");
-		else if (a == 3000)
-			roman.append("MMM");
-
-		if (b == 100)
-			roman.append("C");
-		else if (b == 200)
-			roman.append("CC");
-		else if (b == 300)
-			roman.append("CCC");
-		else if (b == 400)
-			roman.append("CD");
-		else if (b == 500)
-			roman.append("D");
-		else if (b == 600)
-			roman.append("DC");
-		else if (b == 700)
-			roman.append("DCC");
-		else if (b == 800)
-			roman.append("DCCC");
-		else if (b == 900)
-			roman.append("CM");
-
-		if (c == 10)
-			roman.append("X");
-		else if (c == 20)
-			roman.append("XX");
-		else if (c == 30)
-			roman.append("XXX");
-		else if (c == 40)
-			roman.append("XL");
-		else if (c == 50)
-			roman.append("L");
-		else if (c == 60)
-			roman.append("LX");
-		else if (c == 70)
-			roman.append("LXX");
-		else if (c == 80)
-			roman.append("LXXX");
-		else if (c == 90)
-			roman.append("XC");
-
-		if (d == 1)
-			roman.append("I");
-		else if (d == 2)
-			roman.append("II");
-		else if (d == 3)
-			roman.append("III");
-		else if (d == 4)
-			roman.append("IV");
-		else if (d == 5)
-			roman.append("V");
-		else if (d == 6)
-			roman.append("VI");
-		else if (d == 7)
-			roman.append("VII");
-		else if (d == 8)
-			roman.append("VIII");
-		else if (d == 9)
-			roman.append("IX");
-
-		return roman.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BackgroundColorMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BackgroundColorMeta.java
deleted file mode 100644
index d2674e6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BackgroundColorMeta.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.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 };
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	public BackgroundColorMeta() {
-		super(false, ICSSPropertyID.VAL_TRANSPARENT);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String text = value.getCssText();
-		Object result = CSSColorManager.getInstance().getColor(text);
-		if (result != null) {
-			return result;
-		}
-        return getInitialValue(propertyName, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return _keywords;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		Object result;
-		String colorAttr = null;
-		if (ICSSPropertyID.ATTR_BACKGROUND_COLOR.equalsIgnoreCase(propertyName)) {
-			colorAttr = DOMUtil.getAttributeIgnoreCase(element,
-					ICSSPropertyID.ATTR_BGCOLOR);
-		}
-		if (colorAttr != null && colorAttr.trim().length() != 0) {
-			colorAttr = colorAttr.trim();
-			result = CSSColorManager.getInstance().getColor(colorAttr);
-			return result;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderCollapseMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderCollapseMeta.java
deleted file mode 100644
index 874a137..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderCollapseMeta.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.property;
-
-/**
- * @author mengbo
- */
-public class BorderCollapseMeta extends CSSPropertyMeta {
-	static String[] keywords = new String[] { ICSSPropertyID.VAL_COLLAPSE,
-			ICSSPropertyID.VAL_SEPARATE };
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	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 e91fdbf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderColorMeta.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.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 };
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	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 601ec79..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderSpacingMeta.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.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 {
-	public static final int[] INITIAL_SPACING = new int[] { 3, 3 };
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	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);
-	}
-
-	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 e71ff76..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderStyleMeta.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and 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 };
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	public BorderStyleMeta() {
-		super(false, ICSSPropertyID.VAL_NONE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(htmltag)) {
-			return calculateTableOverride(element, propertyName);
-		} else if (IHTMLConstants.TAG_TD.equalsIgnoreCase(htmltag)
-				|| IHTMLConstants.TAG_TH.equalsIgnoreCase(htmltag)) {
-			return calculateTDOverride(element, propertyName, style);
-		} else if (IHTMLConstants.TAG_IMG.equalsIgnoreCase(htmltag)) {
-			String border = DOMUtil.getAttributeIgnoreCase(element,
-					IHTMLConstants.ATTR_BORDER);
-			if (border != null) {
-				return ICSSPropertyID.VAL_SOLID;
-			}
-		}
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-
-	/**
-	 * @param element
-	 * @param propertyName
-	 * @return
-	 */
-	private Object calculateTDOverride(Element element, String propertyName,
-			ICSSStyle style) {
-		// if element is empty, and "empty-cells" property is hide, then we
-		// don't display border.
-		Object obj = style.getStyleProperty(ICSSPropertyID.ATTR_EMPTY_CELLS);
-		if (EmptyCellsMeta.HIDE.equals(obj) && TableUtil.isEmptyCell(element)) {
-			return ICSSPropertyID.VAL_NONE;
-		}
-
-		// find containing table first
-		Node parent = element;
-		Element tableEle = null;
-		while ((parent = parent.getParentNode()) != null
-				&& parent instanceof Element) {
-			if (((Element) parent).getTagName().equalsIgnoreCase(
-					IHTMLConstants.TAG_TABLE)) {
-				tableEle = (Element) parent;
-				break;
-			}
-
-		}
-		if (tableEle != null) {
-			String rules = DOMUtil.getAttributeIgnoreCase(tableEle,
-					IHTMLConstants.ATTR_RULES);
-			String borderstr = DOMUtil.getAttributeIgnoreCase(tableEle,
-					IHTMLConstants.ATTR_BORDER);
-			if (rules == null || rules.length() == 0) {
-				if (borderstr == null || "0".equals(borderstr.trim())) {
-					return ICSSPropertyID.VAL_NONE;
-				}
-                return ICSSPropertyID.VAL_TDBORDERSTYLE;
-			}
-            // ok, we got a value for rules
-            if (TableUtil.matchRules(extractEdge(propertyName), rules)) {
-            	return ICSSPropertyID.VAL_TDBORDERSTYLE;
-            }
-            return ICSSPropertyID.VAL_NONE;
-		}
-        return null;
-	}
-
-	/**
-	 * @param element
-	 * @param propertyName
-	 * @return
-	 */
-	private Object calculateTableOverride(Element element, String propertyName) {
-		String frame = DOMUtil.getAttributeIgnoreCase(element,
-				IHTMLConstants.ATTR_FRAME);
-		String borderstr = DOMUtil.getAttributeIgnoreCase(element,
-				IHTMLConstants.ATTR_BORDER);
-		// border="0" implies frame="void"
-		if ("0".equals(borderstr)) {
-			return ICSSPropertyID.VAL_NONE;
-		}
-		if (frame == null || frame.length() == 0) {
-			if (borderstr == null) {
-				return ICSSPropertyID.VAL_NONE;
-			} else if (borderstr.trim().length() == 0) {
-				frame = IHTMLConstants.ATTR_BORDER;
-			} else {
-				try {
-					Integer.parseInt(borderstr);
-					frame = IHTMLConstants.ATTR_BORDER;
-				} catch (Exception ex) {
-					frame = borderstr;
-				}
-			}
-		}
-		// ok, we got a value for frame.
-		if (TableUtil.matchFrame(extractEdge(propertyName), frame)) {
-			return ICSSPropertyID.VAL_OUTSET;
-		}
-        return ICSSPropertyID.VAL_NONE;
-	}
-
-	static String extractEdge(String propertyName) {
-		if (ICSSPropertyID.ATTR_BORDER_BOTTOM_STYLE
-				.equalsIgnoreCase(propertyName)) {
-			return "bottom";
-		} else if (ICSSPropertyID.ATTR_BORDER_LEFT_STYLE
-				.equalsIgnoreCase(propertyName)) {
-			return "left";
-		} else if (ICSSPropertyID.ATTR_BORDER_RIGHT_STYLE
-				.equalsIgnoreCase(propertyName)) {
-			return "right";
-		} else {
-			return "top";
-		}
-	}
-
-	/**
-	 * @param propertyName
-	 * @return
-	 */
-	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 8de7cf2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderWidthMeta.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.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 };
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	public BorderWidthMeta() {
-		super(false, LENGTH_4); // medium length.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.LengthMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getPercentageType()
-	 */
-	public int getPercentageType() {
-		return PERCENTAGE_NONE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.LengthMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		// Computed value: absolute length; '0' if the border style is 'none' or
-		// 'hidden'
-		Object stylevalue = style.getStyleProperty("border-"
-				+ extractEdge(propertyName) + "-style");
-		if (ICSSPropertyID.VAL_NONE.equals(stylevalue)
-				|| ICSSPropertyID.VAL_HIDDEN.equals(stylevalue)) {
-			return Length.LENGTH_0;
-		}
-
-		Object obj = super.calculateCSSValueResult(value, propertyName, style);
-		if (ICSSPropertyID.VAL_THIN.equals(obj)) {
-			return Length.LENGTH_1;
-		} else if (ICSSPropertyID.VAL_MEDIUM.equals(obj)) {
-			return Length.LENGTH_3;
-		} else if (ICSSPropertyID.VAL_THICK.equals(obj)) {
-			return Length.LENGTH_8;
-		}
-		return obj;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if ("table".equalsIgnoreCase(htmltag)) {
-			return calculateTableOverride(element, propertyName);
-		} else if ("td".equalsIgnoreCase(htmltag)
-				|| "th".equalsIgnoreCase(htmltag)) {
-			return calculateTDOverride(element, propertyName);
-		} else if ("img".equalsIgnoreCase(htmltag)) {
-			String border = DOMUtil.getAttributeIgnoreCase(element, "border");// ICSSPropertyID.ATTR_BORDERSIZE);
-			if (border != null) {
-				try {
-					return new Length(Integer.parseInt(border), false);
-				} catch (Exception ex) {
-					// Integer processing, no need to report.
-				}
-			}
-		}
-
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-
-	/**
-	 * @param element
-	 * @param propertyName
-	 * @return
-	 */
-	private Object calculateTDOverride(Element element, String propertyName) {
-		// find containing table first
-		Node parent = element;
-		Element tableEle = null;
-		while ((parent = parent.getParentNode()) != null
-				&& parent instanceof Element) {
-			if (((Element) parent).getTagName().equalsIgnoreCase("table")) {
-				tableEle = (Element) parent;
-				break;
-			}
-
-		}
-		if (tableEle != null) {
-			String rules = DOMUtil.getAttributeIgnoreCase(tableEle, "rules");
-			String borderstr = DOMUtil.getAttributeIgnoreCase(tableEle,
-					"border");
-			if (rules == null || rules.length() == 0) {
-				if (borderstr == null || "0".equals(borderstr.trim())) {
-					return null;
-				}
-                return Length.LENGTH_1;
-			}
-            // ok, we got a value for rules
-            if (TableUtil.matchRules(extractEdge(propertyName), rules)) {
-            	return Length.LENGTH_1;
-            }
-            return Length.LENGTH_0;
-		}
-        return Length.LENGTH_0;
-	}
-
-	/**
-	 * @param element
-	 * @param propertyName
-	 * @return
-	 */
-	private Object calculateTableOverride(Element element, String propertyName) {
-		String frame = DOMUtil.getAttributeIgnoreCase(element, "frame");
-		String borderstr = DOMUtil.getAttributeIgnoreCase(element, "border");
-		// border="0" implies frame="void"
-		if ("0".equals(borderstr)) {
-			return Length.LENGTH_0;
-		}
-		if (frame == null || frame.length() == 0) {
-			if (borderstr == null) {
-				return null;
-			} else if (borderstr.trim().length() == 0) {
-				return Length.LENGTH_1;
-			} else {
-				try {
-					return new Length(Integer.parseInt(borderstr), false);
-				} catch (Exception ex) {
-					frame = borderstr;
-				}
-			}
-		}
-		// ok, we got a value for frame.
-		if (TableUtil.matchFrame(extractEdge(propertyName), frame)) {
-			if (borderstr != null) {
-				try {
-					return new Length(Integer.parseInt(borderstr), false);
-				} catch (Exception ex) {
-					// ignore. pass through to return length_1
-				}
-			}
-			return Length.LENGTH_1;
-		}
-        return Length.LENGTH_0;
-	}
-
-	static String extractEdge(String propertyName) {
-		if (ICSSPropertyID.ATTR_BORDER_BOTTOM_WIDTH
-				.equalsIgnoreCase(propertyName)) {
-			return "bottom";
-		} else if (ICSSPropertyID.ATTR_BORDER_LEFT_WIDTH
-				.equalsIgnoreCase(propertyName)) {
-			return "left";
-		} else if (ICSSPropertyID.ATTR_BORDER_RIGHT_WIDTH
-				.equalsIgnoreCase(propertyName)) {
-			return "right";
-		} else {
-			return "top";
-		}
-	}
-
-	/**
-	 * @param propertyName
-	 * @return
-	 */
-	public static boolean isBorderWidth(String propertyName) {
-		return ICSSPropertyID.ATTR_BORDER_BOTTOM_WIDTH
-				.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_BORDER_LEFT_WIDTH
-						.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_BORDER_RIGHT_WIDTH
-						.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_BORDER_TOP_WIDTH
-						.equalsIgnoreCase(propertyName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getInitialValue(java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object getInitialValue(String propertyName, ICSSStyle style) {
-		// Computed value: absolute length; '0' if the border style is 'none' or
-		// 'hidden'
-		Object stylevalue = style.getStyleProperty("border-"
-				+ extractEdge(propertyName) + "-style");
-		if (ICSSPropertyID.VAL_NONE.equals(stylevalue)
-				|| ICSSPropertyID.VAL_HIDDEN.equals(stylevalue)) {
-			return Length.LENGTH_0;
-		}
-		return super.getInitialValue(propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CSSMetaRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CSSMetaRegistry.java
deleted file mode 100644
index be3e05b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CSSMetaRegistry.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.css2.property;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author mengbo
- */
-public class CSSMetaRegistry {
-	Map _map = new HashMap();
-
-	private static CSSMetaRegistry _instance;
-
-	private CSSMetaRegistry() {
-		initialize();
-	}
-
-	public void initialize() {
-		_map.put(ICSSPropertyID.ATTR_DISPLAY, new DisplayMeta());
-		_map.put(ICSSPropertyID.ATTR_TEXTALIGN, new TextAlignMeta());
-		_map.put(ICSSPropertyID.ATTR_HORIZONTAL_ALIGN,
-				new HorizontalAlignMeta());
-		_map.put(ICSSPropertyID.ATTR_TEXTDECORATION, new TextDecorationMeta());
-		_map.put(ICSSPropertyID.ATTR_WHITESPACE, new WhiteSpaceMeta());
-		_map.put(ICSSPropertyID.ATTR_WIDTH, new WidthMeta());
-		_map.put(ICSSPropertyID.ATTR_MIN_WIDTH, new WidthMeta());
-		_map.put(ICSSPropertyID.ATTR_HEIGHT, new HeightMeta());
-		_map.put(ICSSPropertyID.ATTR_MIN_HEIGHT, new HeightMeta());
-
-		_map.put(ICSSPropertyID.ATTR_BORDER_LEFT_WIDTH, new BorderWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_RIGHT_WIDTH, new BorderWidthMeta());
-		_map
-				.put(ICSSPropertyID.ATTR_BORDER_BOTTOM_WIDTH,
-						new BorderWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_TOP_WIDTH, new BorderWidthMeta());
-
-		_map.put(ICSSPropertyID.ATTR_BORDER_LEFT_STYLE, new BorderStyleMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_RIGHT_STYLE, new BorderStyleMeta());
-		_map
-				.put(ICSSPropertyID.ATTR_BORDER_BOTTOM_STYLE,
-						new BorderStyleMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_TOP_STYLE, new BorderStyleMeta());
-
-		_map.put(ICSSPropertyID.ATTR_BORDER_LEFT_COLOR, new BorderColorMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_RIGHT_COLOR, new BorderColorMeta());
-		_map
-				.put(ICSSPropertyID.ATTR_BORDER_BOTTOM_COLOR,
-						new BorderColorMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_TOP_COLOR, new BorderColorMeta());
-
-		_map.put(ICSSPropertyID.ATTR_PADDING_LEFT, new PaddingWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_PADDING_RIGHT, new PaddingWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_PADDING_BOTTOM, new PaddingWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_PADDING_TOP, new PaddingWidthMeta());
-
-		_map.put(ICSSPropertyID.ATTR_MARGIN_LEFT, new MarginWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_MARGIN_RIGHT, new MarginWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_MARGIN_BOTTOM, new MarginWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_MARGIN_TOP, new MarginWidthMeta());
-
-		_map.put(ICSSPropertyID.ATTR_FONT_FAMILY, new FontFamilyMeta());
-		_map.put(ICSSPropertyID.ATTR_FONT_SIZE, new FontSizeMeta());
-		_map.put(ICSSPropertyID.ATTR_FONT_STYLE, new FontStyleMeta());
-		_map.put(ICSSPropertyID.ATTR_FONT_WEIGHT, new FontWeightMeta());
-
-		_map.put(ICSSPropertyID.ATTR_BACKGROUND_COLOR,
-				new BackgroundColorMeta());
-		_map.put(ICSSPropertyID.ATTR_COLOR, new ColorPropertyMeta());
-		_map.put(ICSSPropertyID.ATTR_TEXTCOLOR, new ColorPropertyMeta());
-
-		_map.put(ICSSPropertyID.ATTR_BORDER_COLLAPSE, new BorderCollapseMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_SPACING, new BorderSpacingMeta());
-
-		_map.put(ICSSPropertyID.ATTR_LIST_STYLE_TYPE, new ListStyleTypeMeta());
-		_map
-				.put(ICSSPropertyID.ATTR_LIST_STYLE_IMAGE,
-						new ListStyleImageMeta());
-		_map.put(ICSSPropertyID.ATTR_LIST_STYLE_POSITION,
-				new ListStylePositionMeta());
-		_map.put(ICSSPropertyID.ATTR_COUNTER_RESET, new CounterResetMeta());
-		_map.put(ICSSPropertyID.ATTR_COUNTER_INCREMENT,
-				new CounterIncrementMeta());
-
-		_map.put(ICSSPropertyID.ATTR_TOP, new PositionOffsetMeta());
-		_map.put(ICSSPropertyID.ATTR_RIGHT, new PositionOffsetMeta());
-		_map.put(ICSSPropertyID.ATTR_BOTTOM, new PositionOffsetMeta());
-		_map.put(ICSSPropertyID.ATTR_LEFT, new PositionOffsetMeta());
-		_map.put(ICSSPropertyID.ATTR_POSITION, new PositionMeta());
-
-		_map.put(ICSSPropertyID.ATTR_EMPTY_CELLS, new EmptyCellsMeta());
-		_map.put(ICSSPropertyID.ATTR_VISIBILITY, new VisibilityMeta());
-		_map.put(ICSSPropertyID.ATTR_VERTICAL_ALIGN, new VerticalAlignMeta());
-
-		_map.put(ICSSPropertyID.ATTR_OVERFLOW, new OverflowMeta());
-	}
-
-	public ICSSPropertyMeta getMeta(String property) {
-		return (ICSSPropertyMeta) _map.get(property);
-	}
-
-	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 110b994..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CSSPropertyMeta.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.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 {
-	public static final String[] EMPTY_KEYWORDS = new String[0];
-
-	boolean _inherited;
-
-	Object _initialValue;
-
-	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
-	 */
-	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 776b1ce..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ColorPropertyMeta.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 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.eclipse.swt.graphics.Color;
-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 Color getDefaultColor() {
-		return null;
-	}
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	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 01e9652..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ContentMeta.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;
-
-/**
- * @author mengbo
- */
-public class ContentMeta extends CSSPropertyMeta {
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	public ContentMeta() {
-		// why inherit this??
-		super(false, null);
-	}
-
-	/*
-	 * (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, AbstractStyle style) { if (value instanceof Counter) {
-	 * Counter c = (Counter)value; ContentObject object = new ContentObject();
-	 * 
-	 * MyCounter counter = new MyCounter(c.getIdentifier(), c.getListStyle(),
-	 * c.getSeparator()); object.setCounter(counter); return object; } return
-	 * value; }
-	 */
-}
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 c6e2012..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CounterIncrementMeta.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.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);
-	}
-
-	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 a362774..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CounterResetMeta.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.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);
-	}
-
-	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 c72f927..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/DisplayMeta.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.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 };
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	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 50785b3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/EmptyCellsMeta.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.property;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class EmptyCellsMeta extends CSSPropertyMeta {
-	public static final String SHOW = "show";
-
-	public static final String HIDE = "hide";
-
-	public static final String[] _keywords = new String[] { SHOW, HIDE };
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	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 12ad19f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FloatInfo.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.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 {
-	/**
-	 * 
-	 */
-	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);
-	}
-
-	/**
-	 * 
-	 */
-	public float getValue() {
-		return _value;
-	}
-
-	/**
-	 * 
-	 */
-	String getIdentifier() {
-		return _identifier;
-	}
-
-	/**
-	 * 
-	 */
-	public short getValueType() {
-		return _type;
-	}
-
-	/**
-	 * 
-	 */
-	static short getFloatValueType(String value, String ident) {
-		ident = ident.toLowerCase();
-		short valueType;
-		if (ident.length() == 0) {
-			if (0 <= value.indexOf('.')) {
-				valueType = CSSPrimitiveValue.CSS_NUMBER;
-			} else {
-				valueType = ICSSPrimitiveValue.CSS_INTEGER;
-			}
-		} else if (ident.equals("%")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_PERCENTAGE;
-		} else if (ident.equalsIgnoreCase("em")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_EMS;
-		} else if (ident.equalsIgnoreCase("ex")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_EXS;
-		} else if (ident.equalsIgnoreCase("px")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_PX;
-		} else if (ident.equalsIgnoreCase("cm")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_CM;
-		} else if (ident.equalsIgnoreCase("mm")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_MM;
-		} else if (ident.equalsIgnoreCase("in")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_IN;
-		} else if (ident.equalsIgnoreCase("pt")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_PT;
-		} else if (ident.equalsIgnoreCase("pc")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_PC;
-		} else if (ident.equalsIgnoreCase("deg")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_DEG;
-		} else if (ident.equalsIgnoreCase("rad")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_RAD;
-		} else if (ident.equalsIgnoreCase("grad")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_GRAD;
-		} else if (ident.equalsIgnoreCase("ms")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_MS;
-		} else if (ident.equalsIgnoreCase("s")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_S;
-		} else if (ident.equalsIgnoreCase("hz")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_HZ;
-		} else if (ident.equalsIgnoreCase("khz")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_KHZ;
-		} else {
-			valueType = CSSPrimitiveValue.CSS_DIMENSION;
-		}
-		return valueType;
-	}
-
-	private float _value = 0.0f;
-
-	private String _identifier = null;
-
-	private short _type = CSSPrimitiveValue.CSS_UNKNOWN;
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontFamilyMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontFamilyMeta.java
deleted file mode 100644
index 68cfc8b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontFamilyMeta.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.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 {
-	public static final String DEFAULT_FONT = "Times New Roman";
-
-	private static FontData[] _FontData;
-
-	private static FontData[] getFontData() {
-		if (_FontData == null) {
-			ArrayList list = new ArrayList();
-			list.addAll(Arrays.asList(Display.getCurrent().getFontList(null,
-					false)));
-			list.addAll(Arrays.asList(Display.getCurrent().getFontList(null,
-					true)));
-			_FontData = (FontData[]) list.toArray(new FontData[list.size()]);
-		}
-		return _FontData;
-	}
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	public FontFamilyMeta() {
-		super(true, DEFAULT_FONT);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		if (value.getCssValueType() == CSSValue.CSS_VALUE_LIST) {
-			CSSValueList valueList = (CSSValueList) value;
-			for (int i = 0, count = valueList.getLength(); i < count; i++) {
-				String name = valueList.item(i).getCssText();
-				name = trimPadding(name);
-				if (isSupportedFont(name)) {
-					return name;
-				}
-			}
-		}
-		return trimPadding(value.getCssText());
-	}
-
-	private String trimPadding(String name) {
-		String value = name;
-		if (value != null) {
-			value = value.replaceAll("\"", "");
-			value = value.replaceAll("'", "");
-		}
-		return value;
-	}
-
-	private boolean isSupportedFont(String name) {
-		FontData[] fontData = getFontData();
-		for (int i = 0; i < fontData.length; i++) {
-			if (fontData[i].getName().equalsIgnoreCase(name)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if ("FONT".equalsIgnoreCase(htmltag)
-				|| "BASEFONT".equalsIgnoreCase(htmltag)) {
-			String face = DOMUtil.getAttributeIgnoreCase(element, "face");
-			if (face != null) {
-				String[] names = getFontNameList(face);
-				for (int i = 0; i < names.length; i++) {
-					if (isSupportedFont(names[i])) {
-						return names[i];
-					}
-				}
-			} else {
-				return null;
-			}
-		}
-		return null;
-	}
-
-	private String[] getFontNameList(String face) {
-		StringTokenizer tokenizer = new StringTokenizer(face, ",");
-		String[] names = new String[tokenizer.countTokens()];
-		for (int i = 0; i < names.length; i++) {
-			names[i] = trimPadding(tokenizer.nextToken());
-		}
-		return names;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontSizeMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontSizeMeta.java
deleted file mode 100644
index 774204b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontSizeMeta.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and 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 };
-
-	public static final double MEDIUM_VAL_INT = 16;
-
-	public static final double SCALING_FACTOR = 1.2;
-
-	public 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.
-	public static final double CSS_ABSOLUTE_FACTORS[] = { 0.63, 0.82, 1, 1.12,
-			1.5, 2.0, 3.0 };
-
-	public static final int MIN_SIZE_FOR_SMALLER = 1;
-
-	public static final int MIN_SIZE_FOR_LARGER = 9;
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	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);
-	}
-
-	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 8464868..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontStyleMeta.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.property;
-
-/**
- * @author mengbo
- */
-public class FontStyleMeta extends CSSPropertyMeta {
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_NORMAL,
-			ICSSPropertyID.VAL_ITALIC, ICSSPropertyID.VAL_OBLIQUE };
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	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 3163be9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontWeightMeta.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.css2.property;
-
-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.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 {
-
-	public static final Integer NORMAL_WEIGHT = new Integer(400);
-
-	public static final Integer BOLD_WEIGHT = new Integer(700);
-
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_NORMAL,
-			ICSSPropertyID.VAL_BOLD, ICSSPropertyID.VAL_BOLDER,
-			ICSSPropertyID.VAL_LIGHTER };
-
-	private Logger _log = PDPlugin.getLogger(FontWeightMeta.class);
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	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.
-				_log.error("Info.FontWeightMeta.0", ex); //$NON-NLS-1$
-				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 2c635ff..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/HeightMeta.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.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 {
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	public HeightMeta() {
-		super(false, ICSSPropertyID.VAL_AUTO);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (!"input".equalsIgnoreCase(htmltag)) //$NON-NLS-1$
-		{
-			String attributeName = ICSSPropertyID.ATTR_HEIGHT;
-			if ("hr".equalsIgnoreCase(htmltag)) {
-				attributeName = ICSSPropertyID.ATTR_SIZE;
-			}
-
-			String height = DOMUtil.getAttributeIgnoreCase(element,
-					attributeName);
-			if (height != null) {
-				return LengthMeta.toLength(height, style, this
-						.getPercentageType(), getBaseFont(style));
-			}
-		}
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/HorizontalAlignMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/HorizontalAlignMeta.java
deleted file mode 100644
index c549528..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/HorizontalAlignMeta.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.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$
-	};
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	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 2939923..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ICSSPropertyID.java
+++ /dev/null
@@ -1,382 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and 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 {
-	public static final String ATTR_DISPLAY = "display";
-
-	public static final String ATTR_WHITESPACE = "white-space";
-
-	public static final String ATTR_TEXTDECORATION = "text-decoration";
-
-	public static final String ATTR_TEXTALIGN = "text-align";
-
-	public static final String ATTR_WIDTH = "width";
-
-	public static final String ATTR_MIN_WIDTH = "min-width";
-
-	public static final String ATTR_HEIGHT = "height";
-
-	public static final String ATTR_MIN_HEIGHT = "min-height";
-
-	public static final String ATTR_BORDER_LEFT_WIDTH = "border-left-width";
-
-	public static final String ATTR_BORDER_RIGHT_WIDTH = "border-right-width";
-
-	public static final String ATTR_BORDER_BOTTOM_WIDTH = "border-bottom-width";
-
-	public static final String ATTR_BORDER_TOP_WIDTH = "border-top-width";
-
-	public static final String ATTR_FONT_FAMILY = "font-family";
-
-	public static final String ATTR_FONT_SIZE = "font-size";
-
-	public static final String ATTR_FONT_STYLE = "font-style";
-
-	public static final String ATTR_FONT_WEIGHT = "font-weight";
-
-	public static final String ATTR_BORDER_LEFT_STYLE = "border-left-style";
-
-	public static final String ATTR_BORDER_RIGHT_STYLE = "border-right-style";
-
-	public static final String ATTR_BORDER_BOTTOM_STYLE = "border-bottom-style";
-
-	public static final String ATTR_BORDER_TOP_STYLE = "border-top-style";
-
-	public static final String ATTR_BORDER_LEFT_COLOR = "border-left-color";
-
-	public static final String ATTR_BORDER_RIGHT_COLOR = "border-right-color";
-
-	public static final String ATTR_BORDER_BOTTOM_COLOR = "border-bottom-color";
-
-	public static final String ATTR_BORDER_TOP_COLOR = "border-top-color";
-
-	public static final String ATTR_PADDING_RIGHT = "padding-right";
-
-	public static final String ATTR_PADDING_BOTTOM = "padding-bottom";
-
-	public static final String ATTR_PADDING_LEFT = "padding-left";
-
-	public static final String ATTR_PADDING_TOP = "padding-top";
-
-	public static final String ATTR_MARGIN_RIGHT = "margin-right";
-
-	public static final String ATTR_MARGIN_BOTTOM = "margin-bottom";
-
-	public static final String ATTR_MARGIN_LEFT = "margin-left";
-
-	public static final String ATTR_MARGIN_TOP = "margin-top";
-
-	public static final String ATTR_BACKGROUND_COLOR = "background-color";
-
-	public static final String ATTR_COLOR = "color";
-
-	public static final String ATTR_TEXTCOLOR = "text";
-
-	public static final String ATTR_BORDER_COLLAPSE = "border-collapse";
-
-	public static final String ATTR_BORDER_SPACING = "border-spacing";
-
-	public static final String ATTR_LIST_STYLE_TYPE = "list-style-type";
-
-	public static final String ATTR_LIST_STYLE_POSITION = "list-style-position";
-
-	public static final String ATTR_LIST_STYLE_IMAGE = "list-style-image";
-
-	public static final String ATTR_COUNTER_RESET = "counter-reset";
-
-	public static final String ATTR_COUNTER_INCREMENT = "counter-increment";
-
-	public static final String ATTR_EMPTY_CELLS = "empty-cells";
-
-	public static final String ATTR_VISIBILITY = "visibility";
-
-	public static final String ATTR_VERTICAL_ALIGN = "vertical-align";
-
-	public static final String ATTR_HORIZONTAL_ALIGN = "horizontal-align";
-
-	public static final String ATTR_CONTENT = "content";
-
-	public static final String ATTR_BGCOLOR = "bgcolor";
-
-	public static final String ATTR_TEXT = "text";
-
-	public final static String ATTR_MULTIPLE = "multiple";
-
-	public final static String ATTR_ITEMLABEL = "itemLabel";
-
-	public final static String ATTR_BINDING = "binding";
-
-	public final static String ATTR_ITEMVALUE = "itemValue";
-
-	public final static String ATTR_VALUE = "value";
-
-	public static final String ATTR_URI = "uri";
-
-	public static final String ATTR_PREFIX = "prefix";
-
-	public static final String ATTR_STYLECLASS = "styleClass";
-
-	public static final String ATTR_SIZE = "size";
-
-	public static final String ATTR_BASEFONT = "basefont";
-
-	public static final String ATTR_ROWSPAN = "rowSpan";
-
-	public static final String ATTR_COLSPAN = "colSpan";
-
-	public static final String ATTR_TYPE = "type";
-
-	public static final String ATTR_URL = "url";
-
-	public static final String ATTR_SRC = "src";
-
-	public static final String ATTR_TAGLIB_LOCATION = "taglib-location";
-
-	public static final String ATTR_TAGLIB_URI = "taglib-uri";
-
-	public static final String ATTR_IMAGE = "image";
-
-	public static final String ATTR_RESET = "reset";
-
-	public static final String ATTR_FOOTER = "footer";
-
-	public static final String ATTR_HEADER = "header";
-
-	public static final String ATTR_COLUMNS = "columns";
-
-	public static final String ATTR_COLUMNCLASSES = "columnClasses";
-
-	public static final String ATTR_CLASS = "class";
-
-	public static final String ATTR_STYLE = "style";
-
-	public static final String ATTR_PAGE = "page";
-
-	public static final String ATTR_HREF = "href";
-
-	public static final String ATTR_NAME = "name";
-
-	public static final String ATTR_BASENAME = "basename";
-
-	public static final String ATTR_ACTION = "action";
-
-	public static final String ATTR_TARGET = "target";
-
-	public static final String ATTR_TOP = "top";
-
-	public static final String ATTR_BOTTOM = "bottom";
-
-	public static final String ATTR_LEFT = "left";
-
-	public static final String ATTR_RIGHT = "right";
-
-	public static final String ATTR_POSITION = "position";
-
-	public static final String VAL_TRANSPARENT = "transparent";
-
-	public static final String VAL_COLLAPSE = "collapse";
-
-	public static final String VAL_SEPARATE = "separate";
-
-	public static final String ATTR_OVERFLOW = "overflow";
-
-	// border style values
-	public static final String VAL_HIDDEN = "hidden";
-
-	public static final String VAL_DOTTED = "dotted";
-
-	public static final String VAL_DASHED = "dashed";
-
-	public static final String VAL_SOLID = "solid";
-
-	public static final String VAL_DOUBLE = "double";
-
-	public static final String VAL_GROOVE = "groove";
-
-	public static final String VAL_RIDGE = "ridge";
-
-	public static final String VAL_INSET = "inset";
-
-	public static final String VAL_OUTSET = "outset";
-
-	// XXX: we introduce a new style for TD default border style, since it
-	// seemed IE
-	// is using none of the above style for td.
-	public static final String VAL_TDBORDERSTYLE = "__td_border_style__";
-
-	public static final String VAL_THIN = "thin";
-
-	public static final String VAL_THICK = "thick";
-
-	public static final String VAL_INLINE = "inline";
-
-	public static final String VAL_BLOCK = "block";
-
-	public static final String VAL_INLINE_BLOCK = "inline-block";
-
-	public static final String VAL_LIST_ITEM = "list-item";
-
-	public static final String VAL_RUN_IN = "run-in";
-
-	public static final String VAL_COMPACT = "compact";
-
-	public static final String VAL_MARKER = "marker";
-
-	public static final String VAL_TABLE = "table";
-
-	public static final String VAL_INLINE_TABLE = "inline-table";
-
-	public static final String VAL_TABLE_ROW_GROUP = "table-row-group";
-
-	public static final String VAL_TABLE_HEADER_GROUP = "table-header-group";
-
-	public static final String VAL_TABLE_FOOTER_GROUP = "table-footer-group";
-
-	public static final String VAL_TABLE_ROW = "table-row";
-
-	public static final String VAL_TABLE_COLUMN_GROUP = "table-column-group";
-
-	public static final String VAL_TABLE_COLUMN = "table-column";
-
-	public static final String VAL_TABLE_CELL = "table-cell";
-
-	public static final String VAL_TABLE_CAPTION = "table-caption";
-
-	public static final String VAL_NONE = "none";
-
-	public static final String VAL_XX_SMALL = "xx-small";
-
-	public static final String VAL_X_SMALL = "x-small";
-
-	public static final String VAL_SMALL = "small";
-
-	public static final String VAL_MEDIUM = "medium";
-
-	public static final String VAL_LARGE = "large";
-
-	public static final String VAL_X_LARGE = "x-large";
-
-	public static final String VAL_XX_LARGE = "xx-large";
-
-	public static final String VAL_LARGER = "larger";
-
-	public static final String VAL_SMALLER = "smaller";
-
-	public static final String VAL_ITALIC = "italic";
-
-	public static final String VAL_OBLIQUE = "oblique";
-
-	public static final String VAL_NORMAL = "normal";
-
-	public static final String VAL_BOLD = "bold";
-
-	public static final String VAL_BOLDER = "bolder";
-
-	public static final String VAL_LIGHTER = "lighter";
-
-	public static final String VAL_AUTO = "auto";
-
-	public static final String VAL_OUTSIDE = "outside";
-
-	public static final String VAL_INSIDE = "inside";
-
-	public static final String VAL_LEFT = "left";
-
-	public static final String VAL_RIGHT = "right";
-
-	public static final String VAL_CENTER = "center";
-
-	public static final String VAL_JUSTIFY = "justify";
-
-	public static final String VAL_UNDERLINE = "underline";
-
-	public static final String VAL_OVERLINE = "overline";
-
-	public static final String VAL_LINETHROUGH = "line-through";
-
-	public static final String VAL_BLINK = "blink";
-
-	public static final String VAL_PRE = "pre";
-
-	public static final String VAL_NOWRAP = "nowrap";
-
-	public final static String VAL_DISC = "disc"; //$NON-NLS-1$
-
-	public final static String VAL_CIRCLE = "circle"; //$NON-NLS-1$
-
-	public final static String VAL_DECIMAL = "decimal"; //$NON-NLS-1$
-
-	public final static String VAL_CJK_IDEOGRAPHIC = "cjk-ideographic"; //$NON-NLS-1$
-
-	public final static String VAL_DECIMAL_LEADING_ZERO = "decimal-leading-zero"; //$NON-NLS-1$
-
-	public final static String VAL_ARMENIAN = "armenian"; //$NON-NLS-1$
-
-	public final static String VAL_LOWER_ALPHA = "lower-alpha"; //$NON-NLS-1$
-
-	public final static String VAL_LOWER_GREEK = "lower-greek"; //$NON-NLS-1$
-
-	public final static String VAL_LOWER_LATIN = "lower-latin"; //$NON-NLS-1$
-
-	public final static String VAL_LOWER_ROMAN = "lower-roman"; //$NON-NLS-1$
-
-	public final static String VAL_UPPER_ALPHA = "upper-alpha"; //$NON-NLS-1$
-
-	public final static String VAL_UPPER_LATIN = "upper-latin"; //$NON-NLS-1$
-
-	public final static String VAL_UPPER_ROMAN = "upper-roman"; //$NON-NLS-1$
-
-	public final static String VAL_HIRAGANA = "hiragana"; //$NON-NLS-1$
-
-	public final static String VAL_HIRAGANA_IROHA = "hiragana-iroha"; //$NON-NLS-1$
-
-	public final static String VAL_HEBREW = "hebrew"; //$NON-NLS-1$
-
-	public final static String VAL_GEORGIAN = "georgian"; //$NON-NLS-1$
-
-	public final static String VAL_KATAKANA = "katakana"; //$NON-NLS-1$
-
-	public final static String VAL_KATAKANA_IROHA = "katakana-iroha"; //$NON-NLS-1$
-
-	public final static String VAL_SQUARE = "square"; //$NON-NLS-1$
-
-	public final static String VAL_IMAGE = "image"; //$NON-NLS-1$
-
-	public static final String VAL_MULTIPLE = "multiple";
-
-	public static final String VAL_BUTTON = "button";
-
-	public static final String VAL_CHECKBOX = "checkbox";
-
-	public static final String VAL_RADIO = "radio";
-
-	public static final String VAL_FILE = "file";
-
-	public static final String VAL_RESET = "reset";
-
-	public static final String VAL_SUBMIT = "submit";
-
-	public static final String VAL_PASSWORD = "password";
-
-	public static final String VAL_TEXT = "text";
-
-	public static final String VAL_VISIBLE = "visible";
-
-	public static final String VAL_SCROLL = "scroll";
-
-	public static final String TAG_TAGLIB = "taglib";
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ICSSPropertyMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ICSSPropertyMeta.java
deleted file mode 100644
index 6f93c9a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ICSSPropertyMeta.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.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public interface ICSSPropertyMeta {
-	public static final int PERCENTAGE_NONE = 0;
-
-	public static final int PERCENTAGE_BOXSIZE = 1;
-
-	public static final int PERCENTAGE_HEIGHT_CONTAININGBLOCK = 2;
-
-	public static final int PERCENTAGE_FONT = 3;
-
-	public static final int PERCENTAGE_WIDTH_CONTAININGBLOCK = 4;
-
-	public static final Object NOT_SPECIFIED = "NOT_SPECIFIED";
-
-	/**
-	 * whether default inherit.
-	 * 
-	 * @return
-	 */
-	public boolean isInherited();
-
-	/**
-	 * initial value
-	 * 
-	 * @return
-	 */
-	public Object getInitialValue(String propertyName, ICSSStyle style);
-
-	public Object getHTMLElementInitialValue(Element element, String htmltag,
-			String propertyName);
-
-	/**
-	 * what's percentage value based on.
-	 * 
-	 * @return
-	 */
-	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
-	 */
-	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 65eb53c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/LengthMeta.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.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));
-	}
-
-	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 value
-	 * @param parentValue
-	 * @param font
-	 * @return
-	 */
-	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
-	 */
-	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;
-	}
-
-	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 e872080..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStyleImageMeta.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;
-
-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;
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	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 c6c8cef..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStylePositionMeta.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 ListStylePositionMeta extends CSSPropertyMeta {
-	private static final String INITIAL_VALUE = ICSSPropertyID.VAL_OUTSIDE;
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	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 bf6d464..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStyleTypeMeta.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.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;
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	public ListStyleTypeMeta() {
-		super(true, INITIAL_VALUE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		return value.getCssText();
-	}
-
-	// /*
-	// * (non-Javadoc)
-	// *
-	// * @see
-	// org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	// java.lang.String, java.lang.String,
-	// org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	// */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		String listStyle = DOMUtil.getAttributeIgnoreCase(element, "type");
-		if (listStyle == null && element != null
-				&& element.getParentNode() != null) {
-			listStyle = DOMUtil.getAttributeIgnoreCase((Element) element
-					.getParentNode(), "type");
-		}
-		if (listStyle != null) {
-			listStyle = listStyle.trim();
-			if (listStyle.equals("1")) {
-				return ICSSPropertyID.VAL_DECIMAL;
-			} else if (listStyle.equals("a")) {
-				return ICSSPropertyID.VAL_LOWER_ALPHA;
-			} else if (listStyle.equals("A")) {
-				return ICSSPropertyID.VAL_UPPER_ALPHA;
-			} else if (listStyle.equals("i")) {
-				return ICSSPropertyID.VAL_LOWER_ROMAN;
-			} else if (listStyle.equals("I")) {
-				return ICSSPropertyID.VAL_UPPER_ROMAN;
-			}
-			return listStyle;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/MarginWidthMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/MarginWidthMeta.java
deleted file mode 100644
index f5d23c4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/MarginWidthMeta.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.css2.property;
-
-/**
- * @author mengbo
- */
-public class MarginWidthMeta extends LengthMeta {
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	public MarginWidthMeta() {
-		super(false, ICSSPropertyID.VAL_AUTO);
-	}
-
-	/**
-	 * @param propertyName
-	 * @return
-	 */
-	public static boolean isMarginWidth(String propertyName) {
-		return ICSSPropertyID.ATTR_MARGIN_BOTTOM.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_MARGIN_TOP
-						.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_MARGIN_LEFT
-						.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_MARGIN_RIGHT
-						.equalsIgnoreCase(propertyName);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/OverflowMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/OverflowMeta.java
deleted file mode 100644
index 6014eb6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/OverflowMeta.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.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 };
-
-	public OverflowMeta() {
-		super(false, ICSSPropertyID.VAL_VISIBLE);
-	}
-
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String display = style.getDisplay();
-		// we only support overflow for "block". Which means we don't support it
-		// for table/inline-block, etc.
-		if (!"block".equalsIgnoreCase(display)) {
-			return ICSSPropertyID.VAL_VISIBLE;
-		}
-		return super.calculateCSSValueResult(value, propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PaddingWidthMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PaddingWidthMeta.java
deleted file mode 100644
index 62c081a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PaddingWidthMeta.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.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class PaddingWidthMeta extends LengthMeta {
-    
-    private static int MIN_PADDING_THRESHOLD = 4;
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	public PaddingWidthMeta() {
-		super(false, ICSSPropertyID.VAL_AUTO);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (IHTMLConstants.TAG_TD.equalsIgnoreCase(htmltag)
-				|| IHTMLConstants.TAG_TH.equalsIgnoreCase(htmltag)) {
-			Node parent = element;
-			Element tableEle = null;
-			while ((parent = parent.getParentNode()) != null
-					&& parent instanceof Element) {
-				if (((Element) parent).getTagName().equalsIgnoreCase(
-						IHTMLConstants.TAG_TABLE)) {
-					tableEle = (Element) parent;
-					break;
-				}
-			}
-			if (tableEle != null) {
-				//TODO:  Why is only cellpadding being checked?  Why does this class even exist?  What is difference with BorderWidthMeta?   
-				String padding = DOMUtil.getAttributeIgnoreCase(tableEle,
-						"cellpadding");//$NON-NLS-1$
-				if (padding != null && padding.trim().length() > 0) {//fix for 200592						
-					Object length = LengthMeta.toLength(padding, style, this
-								.getPercentageType(), getBaseFont(style));
-                    if (length instanceof Length && ((Length)length).getValue() >= MIN_PADDING_THRESHOLD)                    
-                        return length;
-                    
-				}
-                // TODO should not be hardcoded value.  Either should change to a pref
-                // or a per-component customization.
-                return new Length(MIN_PADDING_THRESHOLD, false);
-			}
-		}
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PositionMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PositionMeta.java
deleted file mode 100644
index 28cafba..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PositionMeta.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.css2.property;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PositionMeta extends CSSPropertyMeta {
-	public static final String STATIC = "static";
-
-	public static final String ABSOLUTE = "absolute";
-
-	public static final String RELATIVE = "relative";
-
-	public static final String FIXED = "fixed";
-
-	public static final String[] _keywords = new String[] { STATIC, ABSOLUTE,
-			RELATIVE, FIXED };
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	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 f96864d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PositionOffsetMeta.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.property;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PositionOffsetMeta extends LengthMeta {
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	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 1415cef..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TableUtil.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.css2.property;
-
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableUtil {
-	static final String TOP = "top";
-
-	static final String BOTTOM = "bottom";
-
-	static final String LEFT = "left";
-
-	static final String RIGHT = "right";
-
-	public static boolean matchFrame(String edge, String frame) {
-		if ("above".equalsIgnoreCase(frame)) {
-			return TOP.equalsIgnoreCase(edge);
-		} else if ("below".equalsIgnoreCase(frame)) {
-			return BOTTOM.equalsIgnoreCase(edge);
-		} else if ("hsides".equalsIgnoreCase(frame)) {
-			return TOP.equalsIgnoreCase(edge) || BOTTOM.equalsIgnoreCase(edge);
-		} else if ("vsides".equalsIgnoreCase(frame)) {
-			return LEFT.equalsIgnoreCase(edge) || RIGHT.equalsIgnoreCase(edge);
-		} else if ("lhs".equalsIgnoreCase(frame)) {
-			return LEFT.equalsIgnoreCase(edge);
-		} else if ("rhs".equalsIgnoreCase(frame)) {
-			return RIGHT.equalsIgnoreCase(edge);
-		} else if ("box".equalsIgnoreCase(frame)
-				|| "border".equalsIgnoreCase(frame)) {
-			return true;
-		} else {
-			return false;
-		}
-	}
-
-	/**
-	 * @param string
-	 * @param rules
-	 * @return
-	 */
-	public static boolean matchRules(String edge, String rules) {
-		// TODO: "groups" not supported.
-
-		if ("rows".equalsIgnoreCase(rules)) {
-			return TOP.equalsIgnoreCase(edge) || BOTTOM.equalsIgnoreCase(edge);
-		} else if ("cols".equalsIgnoreCase(rules)) {
-			return LEFT.equalsIgnoreCase(edge) || RIGHT.equalsIgnoreCase(edge);
-		} else if ("all".equalsIgnoreCase(rules)) {
-			return true;
-		} else {
-			return false;
-		}
-
-	}
-
-	/**
-	 * @param element
-	 * @return
-	 * @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 2e07141..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TextAlignMeta.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 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 };
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	public TextAlignMeta() {
-		super(true, NOT_SPECIFIED);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		// /for td, it may look for the attribute value up to tr, but must stop
-		// at table.
-		// so for table,set _inherited=false to stop it.
-		if (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(htmltag)) {
-			this._inherited = false;
-		} else {
-			this._inherited = true;
-		}
-		if (Arrays.asList(HOR_SLIGN_HTMLTAGS).contains(htmltag.toLowerCase())) {
-			return null;
-		}
-
-		String align = DOMUtil.getAttributeIgnoreCase(element,
-				IHTMLConstants.ATTR_ALIGN);
-		String value = checkKeywordValues(align);
-		if (value != null) {
-			return value;
-		}
-		if ("middle".equalsIgnoreCase(align)) {
-			return ICSSPropertyID.VAL_CENTER;
-		}
-
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TextDecorationMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TextDecorationMeta.java
deleted file mode 100644
index 05b10a4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TextDecorationMeta.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.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 {
-	public 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;
-
-	public 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 };
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	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 5720b84..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/VerticalAlignMeta.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 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 {
-	public static final String BASELINE = "baseline"; //$NON-NLS-1$
-
-	public static final String MIDDLE = "middle"; //$NON-NLS-1$
-
-	public static final String SUB = "sub"; //$NON-NLS-1$
-
-	public static final String SUPER = "super"; //$NON-NLS-1$
-
-	public static final String TEXT_TOP = "text-top"; //$NON-NLS-1$
-
-	public static final String TEXT_BOTTOM = "text-bottom"; //$NON-NLS-1$
-
-	public static final String TOP = "top"; //$NON-NLS-1$
-
-	public static final String BOTTOM = "bottom"; //$NON-NLS-1$
-
-	public static final String CENTER = "center"; //$NON-NLS-1$
-
-	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 };
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	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 668bbd3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/VisibilityMeta.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.property;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class VisibilityMeta extends CSSPropertyMeta {
-	public static final String VISIBLE = "visible";
-
-	public static final String HIDDEN = "hidden";
-
-	public static final String COLLAPSE = "collapse";
-
-	public static final String[] KEYWORDS = new String[] { VISIBLE, HIDDEN,
-			COLLAPSE };
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	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 afcb81e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/WhiteSpaceMeta.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.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 };
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	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 1f5851e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/WidthMeta.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.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 {
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	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 74454aa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/DimensionInfo.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.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 {
-	Dimension _dimension;
-
-	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);
-	}
-
-	public Dimension getDimension() {
-		return _dimension;
-	}
-
-	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 f5446ae..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
-	 */
-	public String getTextData();
-
-	/**
-	 * get the selected information.
-	 * 
-	 * @return
-	 */
-	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 b1b8a12..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/ICSSWidgetProvider.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.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
-	 */
-	public ICSSStyle getCSSStyle();
-
-	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
-	 */
-	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 rect
-	 */
-	public void paintFigure(Graphics g, Rectangle rect);
-
-	/**
-	 * @return
-	 */
-	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 fd00a16..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/AbstractStyle.java
+++ /dev/null
@@ -1,658 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.style;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.CSSUtil;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.CSSFontManager;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFontManager;
-import org.eclipse.jst.pagedesigner.css2.list.CounterHelper;
-import org.eclipse.jst.pagedesigner.css2.list.CounterValueGenerator;
-import org.eclipse.jst.pagedesigner.css2.list.ICounterValueGenerator;
-import org.eclipse.jst.pagedesigner.css2.property.CSSMetaRegistry;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.css.CSSStyleDeclaration;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public class AbstractStyle implements ICSSStyle {
-	public static final String ATTR_NAME = "name";
-
-	public static final String ATTR_ID = "id";
-
-	protected 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;
-
-	public Element getElement() {
-		return _element;
-	}
-
-	public AbstractStyle(Element element) {
-		_element = element;
-	}
-
-	/**
-	 * reset all the cache.
-	 */
-	public void reset() {
-		_cachedValues.clear();
-		_font = null;
-		_cache = null;
-		_defaultCache = null;
-		_cssDeclareWasSearched = false;
-		_cssDefaultDeclareWasSearched = false;
-		// if (_counters != null)
-		// {
-		// unregistCounter();
-		// _counters.clear();
-		// _counters = null;
-		// }
-		_borderInsets = _marginInsets = _paddingInsets = null;
-	}
-
-	/**
-	 * this is a hook method so caller can use it to override default
-	 * calculation. Note, after the call to <code>reset</code>, it will be
-	 * lost.
-	 * 
-	 * @param property
-	 * @param value
-	 */
-	public void setStyleProperty(String property, Object value) {
-		_cachedValues.put(property, value);
-	}
-
-	/**
-	 * get a style property value.
-	 * 
-	 * @param property
-	 * @return
-	 */
-	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
-	 */
-	protected CSSStyleDeclaration calculateDeclaration() {
-		String name = getHtmlElement().getAttribute("id");
-		if (name == null || name.length() == 0) {
-			name = getHtmlElement().getAttribute("name");
-		}
-		return CSSUtil.getCSSDeclaration(this.getHtmlElement(), name);
-	}
-
-	protected CSSStyleDeclaration calculateDefaultDeclaration() {
-		return CSSUtil.getDefaultCSSDeclaration(this.getHtmlElement(), null);
-	}
-
-	public CSSStyleDeclaration getDeclaration() {
-		// FIXME:may need to be change, boolean variable is not a best way.
-		if (!_cssDeclareWasSearched) {
-			_cache = calculateDeclaration();
-			_cssDeclareWasSearched = true;
-		}
-		return _cache;
-	}
-
-	public CSSStyleDeclaration getDefaultDeclaration() {
-		// FIXME:may need to be change, boolean variable is not a best way.
-		if (!_cssDefaultDeclareWasSearched) {
-			_defaultCache = calculateDefaultDeclaration();
-			_cssDefaultDeclareWasSearched = true;
-		}
-		return _defaultCache;
-	}
-
-	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;
-	}
-
-	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
-	 */
-	protected String getHTMLTag() {
-		return _element.getTagName();
-	}
-
-	/**
-	 * @param propertyName
-	 * @return
-	 */
-	protected ICSSPropertyMeta getPropertyMeta(String propertyName) {
-		return CSSMetaRegistry.getInstance().getMeta(propertyName);
-	}
-
-	/**
-	 * convert the CSSValue to the property type specified data result.
-	 * 
-	 * @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 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 propertyName
-	 * @return
-	 */
-	protected Object getParentResultValue(ICSSPropertyMeta meta,
-			String propertyName) {
-		ICSSStyle style = getParentStyle();
-		return style.getStyleProperty(propertyName);
-	}
-
-	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
-	 */
-	public ICSSFont getCSSFont() {
-		if (_font == null) {
-			_font = getFontManager().createFont(this);
-		}
-		return _font;
-	}
-
-	/**
-	 * @return
-	 */
-	private ICSSFontManager getFontManager() {
-		return CSSFontManager.getInstance();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#dispose()
-	 */
-	public void dispose() {
-        // TODO: anything to dispose?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getMarginInsets()
-	 */
-	public Insets getMarginInsets() {
-		if (_marginInsets == null) {
-			int top = getInsetProperty(ICSSPropertyID.ATTR_MARGIN_TOP);
-			int left = getInsetProperty(ICSSPropertyID.ATTR_MARGIN_LEFT);
-			int bottom = getInsetProperty(ICSSPropertyID.ATTR_MARGIN_BOTTOM);
-			int right = getInsetProperty(ICSSPropertyID.ATTR_MARGIN_RIGHT);
-			_marginInsets = new Insets(top, left, bottom, right);
-		}
-		return _marginInsets;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getPaddingInsets()
-	 */
-	public Insets getPaddingInsets() {
-		if (_paddingInsets == null) {
-			int top = getInsetProperty(ICSSPropertyID.ATTR_PADDING_TOP)+ARTIFICIAL_BORDER_OFFSET;
-			int left = getInsetProperty(ICSSPropertyID.ATTR_PADDING_LEFT)+ARTIFICIAL_BORDER_OFFSET;
-			int bottom = getInsetProperty(ICSSPropertyID.ATTR_PADDING_BOTTOM)+ARTIFICIAL_BORDER_OFFSET;
-			int right = getInsetProperty(ICSSPropertyID.ATTR_PADDING_RIGHT)+ARTIFICIAL_BORDER_OFFSET;
-			_paddingInsets = new Insets(top, left, bottom, right);
-		}
-		return _paddingInsets;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getBorderInsets()
-	 */
-	public Insets getBorderInsets() {
-		if (_borderInsets == null) {
-			int top = getInsetProperty(ICSSPropertyID.ATTR_BORDER_TOP_WIDTH);
-			int left = getInsetProperty(ICSSPropertyID.ATTR_BORDER_LEFT_WIDTH);
-			int bottom = getInsetProperty(ICSSPropertyID.ATTR_BORDER_BOTTOM_WIDTH);
-			int right = getInsetProperty(ICSSPropertyID.ATTR_BORDER_RIGHT_WIDTH);
-			_borderInsets = new Insets(top, left, bottom, right);
-		}
-		return _borderInsets;
-	}
-
-	/**
-	 * @param border_top_width
-	 * @return
-	 */
-	private int getInsetProperty(String propertyName) {
-		Object obj = this.getStyleProperty(propertyName);
-		if (obj instanceof Length) {
-			Length l = (Length) obj;
-			if (l.isPercentage()) {
-				return 0; // FIXME:
-			}
-            return l.getValue();
-		}
-
-		return 0;
-	}
-
-	public boolean isAdapterForType(Object type) {
-		return (type == ICSSStyle.class);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#isSizeIncludeBorderPadding()
-	 */
-	public boolean isSizeIncludeBorderPadding() {
-		String display = this.getDisplay();
-		if ("table-cell".equalsIgnoreCase(display)) {
-			return false;
-		}
-		String tag = this.getHTMLTag();
-		if ("img".equalsIgnoreCase(tag)) {
-			return false;
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.sse.model.INodeAdapter#notifyChanged(com.ibm.sse.model.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getBackgroundColor()
-	 */
-	public Object getColor() {
-		Object _color = null;
-		if (_color == null) {
-			_color = getStyleProperty(ICSSPropertyID.ATTR_COLOR);
-			if (_color == null) {
-				_color = getStyleProperty(ICSSPropertyID.ATTR_TEXTCOLOR);
-			}
-		}
-		return _color;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getColor()
-	 */
-	public Object getBackgroundColor() {
-		Object _backgroundColor = null;
-		if (_backgroundColor == null) {
-			_backgroundColor = getStyleProperty(ICSSPropertyID.ATTR_BACKGROUND_COLOR);
-		}
-		return _backgroundColor;
-	}
-
-	public Element getHtmlElement() {
-		// if (_element instanceof IDOMElement)
-		// {
-		// EditPart part = (EditPart) ((IDOMElement)
-		// _element).getAdapterFor(EditPart.class);
-		// if (part instanceof ElementEditPart)
-		// {
-		// ElementEditPart elementPart = (ElementEditPart) part;
-		// ITagHandler h = elementPart.getTagHandler();
-		// if (h != null)
-		// {
-		// return h.mapCustomElement(_element);
-		// }
-		// }
-		//
-		// }
-		return _element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getDisplay()
-	 */
-	public String getDisplay() {
-		Object display = this.getStyleProperty(ICSSPropertyID.ATTR_DISPLAY);
-		String displayStr;
-		if (display == null) {
-			displayStr = ICSSPropertyID.VAL_INLINE;
-		} else if (display instanceof String) {
-			displayStr = (String) display;
-		} else {
-			displayStr = display.toString();
-		}
-		if (ICSSPropertyID.VAL_INLINE.equalsIgnoreCase(displayStr)
-				&& IHTMLConstants.TAG_TABLE.equalsIgnoreCase(getHTMLTag())) {
-			return ICSSPropertyID.VAL_INLINE_TABLE;
-		}
-		if (ICSSPropertyID.VAL_INLINE.equalsIgnoreCase(displayStr)) {
-			Object width = this.getStyleProperty(ICSSPropertyID.ATTR_WIDTH);
-			if (width instanceof Length) {
-				return ICSSPropertyID.VAL_INLINE_BLOCK;
-			}
-			Object height = this.getStyleProperty(ICSSPropertyID.ATTR_HEIGHT);
-			if (height instanceof Length) {
-				return ICSSPropertyID.VAL_INLINE_BLOCK;
-			}
-			return displayStr;
-		}
-        return displayStr;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getListStyle()
-	 */
-	public Map getCounters() {
-		if (_counters == null) {
-			_counters = new HashMap();
-			CounterHelper.processCounterReset(this, _counters);
-		}
-		return _counters;
-	}
-
-	/**
-	 * Get named counter from counters.
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getCounter(java.lang.String)
-	 */
-	public ICounterValueGenerator findCounter(String name, boolean must) {
-		Map counters = getCounters();
-		if (counters == null || !counters.containsKey(name)) {
-			if (getParentStyle() != null
-					&& !(getParentStyle() instanceof DefaultStyle)) {
-				// ensure it is registered somewhere.
-				return getParentStyle().findCounter(name, must);
-			}
-			// must is called by counter-increment
-			else if (must) {
-				// the caller should do the other setting.
-				ICounterValueGenerator counter = new CounterValueGenerator(
-						name, null, null, this);
-				counter.resetCount();
-				counters.put(name, counter);
-			}
-		}
-		return (ICounterValueGenerator) counters.get(name);
-	}
-
-	/**
-	 * @param buffer
-	 */
-	public void dumpDebugInfo(StringBuffer buffer) {
-		if (_cache != null) {
-			buffer.append("cache:\n");
-			buffer.append(_cache.getCssText()).append("\n");
-		}
-		if (_defaultCache != null) {
-			buffer.append("default cache:\n");
-			buffer.append(_defaultCache.getCssText()).append("\n");
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getColSpan()
-	 */
-	public int getColSpan() {
-		int colspan = DOMUtil.getIntAttributeIgnoreCase(getHtmlElement(),
-				"colspan", 1);
-		// if span == 0, means span all col from the current column to end
-		// colume
-		if (colspan < 0) {
-			return 1;
-		}
-        return colspan;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getRowSpan()
-	 */
-	public int getRowSpan() {
-		int rowspan = DOMUtil.getIntAttributeIgnoreCase(getHtmlElement(),
-				"rowspan", 1);
-		if (rowspan < 0) {
-			return 1;
-		}
-        return rowspan;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#isInSelection()
-	 */
-	public boolean isInSelection() {
-		IRangeSelectionProxy proxy = (IRangeSelectionProxy) getAdapter(IRangeSelectionProxy.class);
-		if (proxy != null) {
-			return proxy.isRangeSelected();
-		}
-		ICSSStyle parentStyle = getParentStyle();
-		if (parentStyle != null) {
-			return parentStyle.isInSelection();
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if (this._element instanceof INodeNotifier) {
-			Object ret = ((INodeNotifier) _element).getAdapterFor(adapter);
-			if (ret != null && adapter.isInstance(ret)) {
-				return ret;
-			}
-		}
-		return null;
-	}
-
-	// private void unregistCounter()
-	// {
-	// if (_counters != null)
-	// {
-	// Collection c = _counters.values();
-	// Iterator iter = c.iterator();
-	// while (iter.hasNext())
-	// {
-	// Counter2 counter = (Counter2) iter.next();
-	// counter.unregist(this);
-	// }
-	// }
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#resetCounters()
-	 */
-	public void processCounters() {
-		this._counters = null;
-		CounterHelper.processCounterIncrement(this);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/ControlOverrideSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/ControlOverrideSupport.java
deleted file mode 100644
index d8d67df..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/ControlOverrideSupport.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.style;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.jst.pagedesigner.css2.property.BorderStyleMeta;
-import org.eclipse.jst.pagedesigner.css2.property.BorderWidthMeta;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
-import org.eclipse.jst.pagedesigner.css2.property.TextDecorationMeta;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * This class provides support for setting default styles of certain UI
- * controls.
- * 
- * @author mengbo
- */
-public class ControlOverrideSupport {
-	static Color _buttonBackground = ColorConstants.button;
-
-	public static Object handleButtonOverride(ICSSPropertyMeta meta,
-			String propertyName) {
-		// if (BorderStyleMeta.isBorderStyle(propertyName))
-		// {
-		// return ICSSPropertyID.VAL_RIDGE;
-		// }
-		// else if (BorderWidthMeta.isBorderWidth(propertyName))
-		// {
-		// return Length.LENGTH_3;
-		// }
-		// else if
-		// (ICSSPropertyID.ATTR_TEXTDECORATION.equalsIgnoreCase(propertyName))
-		// {
-		// return new Integer(TextDecorationMeta.NONE);
-		// }
-		// else if
-		// (ICSSPropertyID.ATTR_BACKGROUND_COLOR.equalsIgnoreCase(propertyName))
-		// {
-		// return _buttonBackground;
-		// }
-		// else if
-		// (ICSSPropertyID.ATTR_PADDING_LEFT.equalsIgnoreCase(propertyName) ||
-		// ICSSPropertyID.ATTR_PADDING_RIGHT.equalsIgnoreCase(propertyName))
-		// {
-		// return Length.LENGTH_8;
-		// }
-
-		return null;
-	}
-
-	public static Object handleInputTextOverride(ICSSPropertyMeta meta,
-			String propertyName) {
-		if (BorderStyleMeta.isBorderStyle(propertyName)) {
-			return ICSSPropertyID.VAL_GROOVE;
-		} else if (BorderWidthMeta.isBorderWidth(propertyName)) {
-			return Length.LENGTH_3;
-		} else if (ICSSPropertyID.ATTR_TEXTDECORATION
-				.equalsIgnoreCase(propertyName)) {
-			return new Integer(TextDecorationMeta.NONE);
-		}
-
-		return null;
-	}
-
-	public static Object handleHighlightBorderOverride(ICSSPropertyMeta meta,
-			String propertyName) {
-		if (BorderStyleMeta.isBorderStyle(propertyName)) {
-			return ICSSPropertyID.VAL_DOTTED;
-		} else if (BorderWidthMeta.isBorderWidth(propertyName)) {
-			return Length.LENGTH_1;
-		}
-		return null;
-	}
-}
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 8c25a45..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/DefaultStyle.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.css2.style;
-
-import java.util.Map;
-
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.CSSFontManager;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.list.ICounterValueGenerator;
-import org.eclipse.jst.pagedesigner.css2.property.CSSMetaRegistry;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * @author mengbo
- */
-public class DefaultStyle implements ICSSStyle {
-
-	private static final Insets EMPTY_INSETS = new Insets();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#reset()
-	 */
-	public void reset() {
-        // TODO: dead?        
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getStyleProperty(java.lang.String)
-	 */
-	public Object getStyleProperty(String property) {
-		ICSSPropertyMeta meta = CSSMetaRegistry.getInstance().getMeta(property);
-		if (meta == null) {
-			return ICSSPropertyMeta.NOT_SPECIFIED;
-		}
-        return meta.getInitialValue(property, this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getMarginInsets()
-	 */
-	public Insets getMarginInsets() {
-		return EMPTY_INSETS;
-        //return new Insets(0, 0, 0, 0);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getBorderInsets()
-	 */
-	public Insets getBorderInsets() {
-		return EMPTY_INSETS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getPaddingInsets()
-	 */
-	public Insets getPaddingInsets() {
-        return new Insets(ARTIFICIAL_BORDER_OFFSET, ARTIFICIAL_BORDER_OFFSET, ARTIFICIAL_BORDER_OFFSET, ARTIFICIAL_BORDER_OFFSET);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#isSizeIncludeBorderPadding()
-	 */
-	public boolean isSizeIncludeBorderPadding() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#dispose()
-	 */
-	public void dispose() {
-        // TODO: anything to dispose
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.sse.model.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return type == ICSSStyle.class;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.sse.model.INodeAdapter#notifyChanged(com.ibm.sse.model.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-        // TODO: do nothing?
-	}
-
-	private ICSSFont defaultFont = CSSFontManager.getInstance().createDefaultFont();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getCSSFont()
-	 */
-	public ICSSFont getCSSFont() {
-		return defaultFont;
-	}
-
-	/**
-	 * @return
-	 */
-	public static ICSSStyle getInstance() {
-		if (_instance == null) {
-			_instance = new DefaultStyle();
-		}
-		return _instance;
-	}
-
-	static DefaultStyle _instance;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getParentStyle()
-	 */
-	public ICSSStyle getParentStyle() {
-		// return this;
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getBackgroundColor()
-	 */
-	public Object getBackgroundColor() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getColor()
-	 */
-	public Object getColor() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getDisplay()
-	 */
-	public String getDisplay() {
-		return "inline";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getListStyle()
-	 */
-	public Map getCounters() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getCounter(java.lang.String)
-	 */
-	public ICounterValueGenerator findCounter(String name, boolean must) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getColSpan()
-	 */
-	public int getColSpan() {
-		return 1;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getRowSpan()
-	 */
-	public int getRowSpan() {
-		return 1;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#isInSelection()
-	 */
-	public boolean isInSelection() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#resetCounters()
-	 */
-	public void processCounters() {
-		// do nothing.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getHTMLelementValue(java.lang.String)
-	 */
-	public Object getHTMLelementInitValue(String propertyName) {
-		ICSSPropertyMeta meta = CSSMetaRegistry.getInstance().getMeta(
-				propertyName);
-		if (meta == null) {
-			return ICSSPropertyMeta.NOT_SPECIFIED;
-		}
-        return meta.getInitialValue(propertyName, this);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/HiddenElementStyle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/HiddenElementStyle.java
deleted file mode 100644
index 46c1907..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/HiddenElementStyle.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.style;
-
-import org.eclipse.jst.pagedesigner.parts.EditProxyAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Element;
-
-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;
-		}
-	};
-
-	public HiddenElementStyle(EditProxyAdapter adapter) {
-		this._editProxyAdapter = adapter;
-	}
-
-	public HiddenElementStyle(Element convertedElement) {
-		this._convertedElement = convertedElement;
-	}
-
-	public boolean isInSelection() {
-		if (_convertedElement instanceof INodeNotifier) {
-			Object ret = ((INodeNotifier) _convertedElement)
-					.getAdapterFor(AbstractStyle.class);
-			if (ret instanceof AbstractStyle) {
-				return ((AbstractStyle) ret).isInSelection();
-			}
-		}
-
-		if (_editProxyAdapter != null) {
-			return _editProxyAdapter.isRangeSelected();
-		}
-
-		return false;
-	}
-
-	public Object getAdapter(Class adapter) {
-		if (_convertedElement instanceof INodeNotifier) {
-			Object ret = ((INodeNotifier) _convertedElement)
-					.getAdapterFor(AbstractStyle.class);
-			if (ret instanceof AbstractStyle) {
-				return ((AbstractStyle) ret).getAdapter(adapter);
-			}
-		}
-		if (_editProxyAdapter != null && adapter == ITagEditInfo.class) {
-			return _tagEditInfo;
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/IRangeSelectionProxy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/IRangeSelectionProxy.java
deleted file mode 100644
index 499193e..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
-	 */
-	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 d19b982..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/ITagEditInfo.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.style;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface ITagEditInfo {
-	public boolean isWidget();
-
-	public boolean needBorderDecorator();
-
-	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();
-
-	public int getMinHeight();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/ImageStyleHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/ImageStyleHelper.java
deleted file mode 100644
index 6072010..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/ImageStyleHelper.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.style;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-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 ImageStyleHelper {
-	public static Image loadImage(String url, Element source) {
-		if (source instanceof IDOMElement) {
-			IDOMModel model = ((IDOMElement) source).getModel();
-            // TODO: the new resolver is not compatible with model
-			URIResolver resolver = model.getResolver();
-			if (resolver != null)
-				url = resolver.getLocationByURI(url);
-		}
-		if (url != null) {
-			return new Image(null, url);
-		}
-		return null;
-	}
-}
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 9f1e0c5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/StyleUtil.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.style;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class StyleUtil {
-	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;
-	}
-}
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 47afe93..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/value/Length.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.value;
-
-/**
- * @author mengbo
- */
-public class Length {
-	public static final Length LENGTH_0 = new Length(0, false);
-
-	public static final Length LENGTH_1 = new Length(1, false);
-
-	public static final Length LENGTH_2 = new Length(2, false);
-
-	public static final Length LENGTH_3 = new Length(3, false);
-
-	public static final Length LENGTH_8 = new Length(8, false);
-
-	boolean _percentage;
-
-	int _value;
-
-	public Length(int value, boolean percentage) {
-		_value = value;
-		_percentage = percentage;
-	}
-
-	public boolean isPercentage() {
-		return _percentage;
-	}
-
-	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 f380d71..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/AbstractWidgetProvider.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.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 {
-	public static int BORDERTHICK = 2;
-
-	ICSSStyle _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 367ab1e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/BorderUtil.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.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 class BorderUtil {
-	public final static int VERTICAL_BAR = 0;
-
-	public final static int HORIZONTAL_BAR = 1;
-
-	public final static int BOTH = 2;
-
-	public final static int SCROLL_WIDTH = 16;
-
-	public final static int BORDER_THICK = 2;
-
-	/**
-	 * draw a mask to a rectangle
-	 * 
-	 * @param Graphics
-	 * @param Rectangle
-	 * @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);
-	}
-
-	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);
-		}
-	}
-
-	public static void drawScrollBar(Graphics g, int scrollWidth,
-			Rectangle rect, int style) {
-		drawScrollBar(g, scrollWidth, BORDER_THICK, rect, 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);
-		}
-	}
-
-	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._x, box._y, 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._x, box._y, box.getWidth(), box
-					.getHeight()), null);
-		}
-	}
-}
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 e4a8ed8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ButtonWidgetProvider.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.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;
-
-	static final String[] DEFAULTLINES = new String[] { "  " };
-
-	private String _value = "";
-
-	private String[] _lines = DEFAULTLINES;
-
-//	private List _fragments = new ArrayList();
-
-	/**
-	 * @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
-	 */
-	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
-	 * @see TextInputWidgetProvider#getDefaultHeight()
-	 */
-	public int getDefaultHeight() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		ICSSFont font = style.getCSSFont();
-		Font swtfont = font.getSwtFont();
-		int fontHeight = FigureUtilities.getFontMetrics(swtfont).getHeight();
-		return (int) ((fontHeight) * (_lines.length + VERTICAL_PADDING_RATE));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		Object textAlign = style
-				.getStyleProperty(ICSSPropertyID.ATTR_TEXTALIGN);
-		if (ICSSPropertyMeta.NOT_SPECIFIED == textAlign) {
-			textAlign = "center";
-		}
-		Font font = style.getCSSFont().getSwtFont();
-		g.setFont(font);
-		int fontHeight = FigureUtilities.getFontMetrics(font).getHeight();
-
-		Color newColor = null;
-		Object color = style.getColor();
-		if (color instanceof Color) {
-			g.setForegroundColor((Color) color);
-		} else if (color instanceof RGB) {
-			newColor = new Color(Display.getCurrent(), (RGB) color);
-			g.setForegroundColor(newColor);
-		} else {
-			g.setForegroundColor(ColorConstants.black);
-		}
-
-		g.clipRect(rect);
-
-		int y = rect.y + (int) (fontHeight * VERTICAL_PADDING_RATE / 2);
-		if (rect.height > fontHeight * _lines.length) {
-			y = rect.y + (rect.height - fontHeight * _lines.length) / 2;
-		}
-
-		for (int i = 0; i < _lines.length && y < rect.y + rect.height; i++) {
-			int width = FigureUtilities.getTextWidth(_lines[i], font);
-			int x = TextLayoutSupport.getBeginX(textAlign, rect, width);
-			g.drawString(_lines[i], x, y);
-			TextLayoutSupport.paintTextDecoration(g, new Rectangle(x, y, width,
-					fontHeight), ((Integer) getCSSStyle().getStyleProperty(
-					ICSSPropertyID.ATTR_TEXTDECORATION)).intValue());
-			y += fontHeight;
-		}
-
-		if (newColor != null) {
-			newColor.dispose();
-		}
-	}
-
-	public void setValue(String value) {
-		if (value == null) {
-			value = "";
-		}
-		_value = value;
-		_lines = splitValue(_value);
-	}
-
-	/**
-	 * Split the value to multiple lines.
-	 * 
-	 * @param _value2
-	 * @return
-	 */
-	private String[] splitValue(String _value2) {
-		if (_value2 == null || "".equals(_value2)) {
-			return DEFAULTLINES;
-		}
-
-		StringTokenizer tokenizer = new StringTokenizer(_value2, "\r\n");
-		String[] result = new String[tokenizer.countTokens()];
-		for (int i = 0; i < result.length; i++) {
-			result[i] = tokenizer.nextToken().replaceAll("\t", "    ");
-		}
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/CheckboxWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/CheckboxWidgetProvider.java
deleted file mode 100644
index 2bbd8f6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/CheckboxWidgetProvider.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.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;
-
-	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();
-		}
-	}
-
-	public 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;
-	}
-
-	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 cd8720f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ComboWidgetProvider.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and 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
- * @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;
-
-	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
-	 */
-	public 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
-	 * @see TextInputWidgetProvider#getDefaultHeight()
-	 */
-	public int getDefaultHeight() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		ICSSFont font = style.getCSSFont();
-		Font swtfont = font.getSwtFont();
-		int fontSize = FigureUtilities.getFontMetrics(swtfont).getHeight();
-		return fontSize + VERTICAL_PADDING;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		if (this._firstString != null) {
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			ICSSFont font = style.getCSSFont();
-			g.setFont(font.getSwtFont());
-
-			Color newColor = null;
-			Object color = style.getColor();
-			if (color instanceof Color) {
-				g.setForegroundColor((Color) color);
-			} else if (color instanceof RGB) {
-				newColor = new Color(Display.getCurrent(), (RGB) color);
-				g.setForegroundColor(newColor);
-			} else {
-				g.setForegroundColor(ColorConstants.black);
-			}
-			g.clipRect(rect);
-			String label = _label != null ? _label : _firstString;
-			label = label.replaceAll("[ \r\n]+", " ");
-			if (label.endsWith(" ")) {
-				label = label.substring(0, label.length() - 1);
-			}
-			g.drawString(label, rect.x + HORIZONTAL_PADDING / 2, rect.y
-					+ VERTICAL_PADDING / 2);
-			if (newColor != null) {
-				newColor.dispose();
-			}
-
-		}
-
-		BorderUtil.drawBorder(g, rect.x, rect.y, rect.width, rect.height,
-				BORDERTHICK, true);
-		// next the drop down button
-		int width = ARRAWWIDTH;
-		int left = rect.x + rect.width - width - BORDERTHICK;
-		int top = rect.y + BORDERTHICK;
-		int height = rect.height - BORDERTHICK * 2;
-		g.setBackgroundColor(ColorConstants.button);
-		g.fillRectangle(left, top, width, height);
-
-		Rectangle borderRect = new Rectangle(left, top, width, height);
-		BorderUtil.drawBorder(g, borderRect.x, borderRect.y, borderRect.width,
-				borderRect.height, BORDERTHICK, false);
-
-		g.setForegroundColor(ColorConstants.black);
-
-		int decoratorWidth = (width - BORDERTHICK * 2) / 2;
-		int length = decoratorWidth / 2 + 1;
-		int leftX = left + (width - decoratorWidth) / 2 - 1;
-		int topY = top + (height - length) / 2 + 1;
-		for (int i = 0; i < length; i++) {
-			g.drawLine(leftX + i, topY + i, leftX - i + decoratorWidth, topY
-					+ i);
-		}
-	}
-
-	/**
-	 * set the options to be displayed in this combo box. Will calculate out the
-	 * first string and the longest string.
-	 * 
-	 * @param options
-	 */
-	public void setOptions(String[] options) {
-		if (options == null || options.length == 0) {
-			this._firstString = null;
-			this._longestString = null;
-		} else {
-			this._firstString = options[0];
-			this._longestString = (options[0] == null ? "" : options[0]);
-			for (int i = 1; i < options.length; i++) {
-				if (options[i] == null) {
-					continue;
-				}
-				if (options[i].length() > this._longestString.length()) {
-					this._longestString = options[i];
-				}
-			}
-		}
-	}
-
-	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 5d7104f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/HiddenProvider.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.widget;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.style.HiddenElementStyle;
-import org.eclipse.jst.pagedesigner.parts.EditProxyAdapter;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class HiddenProvider extends ImageWidgetProvider {
-	private final static int GAP = 3;
-
-	private String _label = null;
-
-	private boolean _labelVisible = true;
-
-	private FontMetrics _fontMetrics;
-    
-	/**
-	 * @param image
-	 * @param style
-	 */
-	public HiddenProvider(Image image, Element convertedElement) {
-		super(image, new HiddenElementStyle(convertedElement));
-	}
-
-	public HiddenProvider(Image image, ElementEditPart editPart) {
-		super(image, new HiddenElementStyle(new EditProxyAdapter(editPart)));
-	}
-
-	// public HiddenProvider(Image image, String label)
-	// {
-	// this(image);
-	// this._label = label;
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		int preWidth = width;
-		int preHeight = height;
-		_fontMetrics = getFontMetrics();
-		if (width <= 0) {
-			preWidth = getLabelWidth() + _imageWidth;
-		}
-		if (height <= 0) {
-			preHeight = Math.max(getLabelHeight(), _imageHeight);
-		}
-		return new DimensionInfo(preWidth, preHeight, -1);
-	}
-
-	private FontMetrics getFontMetrics() {
-		Font swtfont = Display.getCurrent().getSystemFont();
-		return FigureUtilities.getFontMetrics(swtfont);
-	}
-
-	private int getLabelHeight() {
-		if (_labelVisible && (_label != null) && (!_label.equals(""))
-				&& (_fontMetrics != null)) {
-			return _fontMetrics.getHeight();
-		}
-		return 0;
-	}
-
-	public int getLabelWidth() {
-		if (_labelVisible && _label != null && !_label.equals("")
-				&& _fontMetrics != null) {
-			Font swtfont = Display.getCurrent().getSystemFont();
-			return FigureUtilities.getTextWidth(_label, swtfont) + GAP;
-		}
-		return 0;
-	}
-
-	public void paintFigure(Graphics g,
-			org.eclipse.draw2d.geometry.Rectangle rect) {
-		g.fillRectangle(rect);
-		g.setClip(rect);
-		int imageAreaWidth = Math.min(rect.width, _imageWidth);
-		int imageAreaHeight = Math.min(rect.height, _imageHeight);
-		if (_image != null && !_image.isDisposed()) {
-			g.drawImage(_image, 0, 0, _imageWidth, _imageHeight, rect.x, rect.y
-					+ (rect.height - imageAreaHeight) / 2, imageAreaWidth,
-					imageAreaHeight);
-		}
-		if (_label != null && _labelVisible) {
-			int leading = 0;
-			if (_fontMetrics != null) {
-				leading = _fontMetrics.getLeading();
-			}
-            // TODO: adapt to bg: go lighter on colors that darker() would make black
-			// TODO: color registry
-            Color fg = FigureUtilities.darker(g.getBackgroundColor());
-            g.setForegroundColor(fg);
-            g.drawString(_label, imageAreaWidth + GAP, rect.y
-					+ (rect.height - getLabelHeight()) / 2 + leading);
-            fg.dispose();
-		}
-	}
-
-	public String getLabel() {
-		return _label;
-	}
-
-	public void setLabel(String label) {
-		this._label = label;
-	}
-
-	public boolean isLabelVisible() {
-		return _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 510cf42..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ImageWidgetProvider.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.css2.widget;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author mengbo
- */
-public class ImageWidgetProvider extends AbstractWidgetProvider {
-	private static final String NOPIC_IMAGE_NAME = "PD_nopic.jpg";
-
-	private static Image _noPicImage;
-
-	private static int _noPicWidth;
-
-	private static int _noPicHeight;
-
-	protected Image _image;
-
-	protected int _imageWidth;
-
-	protected int _imageHeight;
-
-	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 c21eb5c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/InputFileWidgetProvider.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.border.CSSBorder;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.MessageFormater;
-
-/**
- * @author mengbo
- */
-public class InputFileWidgetProvider extends AbstractWidgetProvider {
-	private static final String BODER_QUERY_TEMPLETE = "border-{0}-style";
-
-	private static final int GAP = 2;
-
-	private ICSSWidgetProvider _sub1;
-
-	private ICSSWidgetProvider _sub2;
-
-	/**
-	 * @param style
-	 */
-	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 3906425..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ListWidgetProvider.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.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;
-
-	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
-	 */
-	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
-	 * @see TextInputWidgetProvider#getDefaultHeight()
-	 */
-	public int getDefaultHeight() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		ICSSFont font = style.getCSSFont();
-		Font swtfont = font.getSwtFont();
-		int fontHeight = FigureUtilities.getFontMetrics(swtfont).getHeight();
-		return (fontHeight) * _rows + VERTICAL_PADDING;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		BorderUtil.drawBorder(g, rect.x, rect.y, rect.width, rect.height,
-				BORDERTHICK, true);
-		if (_options != null) {
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			ICSSFont font = style.getCSSFont();
-			Font swtfont = font.getSwtFont();
-			g.setFont(swtfont);
-
-			Color newColor = null;
-			Object color = style.getColor();
-			if (color instanceof Color) {
-				g.setForegroundColor((Color) color);
-			} else if (color instanceof RGB) {
-				newColor = new Color(Display.getCurrent(), (RGB) color);
-				g.setForegroundColor(newColor);
-			} else {
-				g.setForegroundColor(ColorConstants.black);
-			}
-			int fontHeight = FigureUtilities.getFontMetrics(swtfont)
-					.getHeight();
-			int x = rect.x + HORIZONTAL_PADDING / 2;
-			int y = rect.y + VERTICAL_PADDING / 2;
-
-			g.clipRect(rect);
-			for (int i = 0; i < _options.length
-					&& (i * fontHeight < rect.height - VERTICAL_PADDING); i++) {
-				g.drawString(_options[i], x, y);
-				y += fontHeight;
-			}
-			if (newColor != null) {
-				newColor.dispose();
-			}
-
-			int borderThick = 2;
-			Rectangle barRect = new Rectangle(rect.x, rect.y + borderThick,
-					rect.width - borderThick, rect.height - 2 * borderThick);
-			BorderUtil.drawVertialBar(g, ARRAWWIDTH, ARROWHEIGHT, borderThick,
-					barRect);
-		}
-	}
-
-	/**
-	 * @param string
-	 * @param x
-	 * @param y
-	 * @return
-	 */
-	private String normalize(String string) {
-		if (string == null) {
-			return "";
-		}
-		int index = string.indexOf('\r');
-		if (index >= 0) {
-			string = string.substring(0, index);
-		}
-		index = string.indexOf('\n');
-		if (index >= 0) {
-			string = string.substring(0, index);
-		}
-		return string;
-	}
-
-	/**
-	 * set the options to be displayed in this combo box.
-	 * 
-	 * @param options
-	 */
-	public void setOptions(String[] options) {
-		this._options = options;
-		if (_options != null) {
-			for (int i = 0; i < _options.length; i++) {
-				_options[i] = normalize(_options[i]);
-			}
-		}
-	}
-
-	/**
-	 * set the default number of rows to be displayed.
-	 * 
-	 * @param rows
-	 */
-	public void setRows(int rows) {
-		_rows = (rows > 0 ? rows : DEFAULTSIZE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#isHandlingBorder()
-	 */
-	public boolean isHandlingBorder() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/RadioWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/RadioWidgetProvider.java
deleted file mode 100644
index 195c860..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/RadioWidgetProvider.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.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;
-
-	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);
-		}
-	}
-
-	public 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;
-	}
-
-	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 e1b1616..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/TextAreaWidgetProvider.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.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;
-	}
-
-	public void setColumns(int columns) {
-		this._columns = (columns > 0 ? columns : DEFAULTCOLUMN);
-	}
-
-	public void setRows(int rows) {
-		this._rows = (rows > 0 ? rows : DEFAULTROWS);
-	}
-
-	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 d4f9508..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/TextInputWidgetProvider.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.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;
-
-	public static final int PWD_SIZE = 18;
-
-	private int DEFAULTSIZE = 20;
-
-	private int _size = DEFAULTSIZE;
-
-	private String _value;
-
-	public TextInputWidgetProvider(ICSSStyle style) {
-		this(style, 20);
-	}
-
-	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;
-	}
-
-	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;
-	}
-
-	public void setSize(int size) {
-		this._size = (size <= 0 ? DEFAULTSIZE : size);
-	}
-
-	/**
-	 * get current value in this text input control
-	 * 
-	 * @return
-	 */
-	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 dcd8b80..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/FeedBackInfo.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;
-
-/**
- * @author mengbo
- */
-public class FeedBackInfo {
-	private String _description;
-
-	private int _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
-	 */
-	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
-	 */
-	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 54cd48b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/ILocalDropHandler.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.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
-	 */
-	public boolean useWizard();
-
-	public boolean useWizard(Object localData, IHTMLGraphicalViewer viewer);
-
-	/**
-	 * 
-	 * @param localData
-	 * @param widget
-	 * @return
-	 */
-	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
-	 */
-	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
-	 */
-	public FeedBackInfo supportInsertElements(Object localData,
-			IDOMPosition position);
-
-	/**
-	 * 
-	 * @param localData
-	 * @param position
-	 * @param viewer
-	 * @return
-	 */
-	public IWizard getWizard(Object localData, IDOMPosition position,
-			IHTMLGraphicalViewer 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 453f10e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/LocalDropRequest.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.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.
-	public static final String REQ_LOCAL_DROP = "Local Drop";
-
-	private Point _location;
-
-	private Object _localObject;
-
-	/**
-	 * 
-	 */
-	public LocalDropRequest() {
-		super(REQ_LOCAL_DROP);
-	}
-
-	/**
-	 * Returns the location of the object to be created.
-	 * 
-	 * @return the location
-	 */
-	public Point getLocation() {
-		return _location;
-	}
-
-	/**
-	 * Sets the location where the new object will be placed.
-	 * 
-	 * @param location
-	 *            the location
-	 */
-	public void setLocation(Point location) {
-		this._location = location;
-	}
-
-	public Object getLocalObject() {
-		return _localObject;
-	}
-
-	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 37a3bec..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerSourceDropTargetListener.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.dnd.internal;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.jst.pagedesigner.commands.PaletteDropInsertCommand;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.ui.texteditor.ITextEditorDropTargetListener;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.internal.ExtendedEditorDropTargetAdapter;
-
-/**
- * @author mengbo
- */
-public class DesignerSourceDropTargetListener extends
-		ExtendedEditorDropTargetAdapter implements
-		ITextEditorDropTargetListener {
-	private int _location;
-
-	private StructuredTextEditor _textEditor;
-
-	public DesignerSourceDropTargetListener(StructuredTextEditor textEditor) {
-		super(false);
-		_textEditor = textEditor;
-		setTextViewer(_textEditor.getTextViewer());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.texteditor.ITextEditorDropTargetListener#getTransfers()
-	 */
-	public Transfer[] getTransfers() {
-		return new Transfer[] { TemplateTransfer.getInstance(),
-				TextTransfer.getInstance() };
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#dragOperationChanged(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void dragOperationChanged(DropTargetEvent event) {
-		super.dragOperationChanged(event);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#dragOver(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void dragOver(DropTargetEvent event) {
-		StyledText text = null;
-		if (_textEditor.getTextViewer() != null) {
-			text = _textEditor.getTextViewer().getTextWidget();
-			if (TemplateTransfer.getInstance().isSupportedType(
-					event.currentDataType)) {
-				if (_textEditor.getTextViewer() != null) {
-					Point p = new Point(event.x, event.y);
-					SourceViewerDragDropHelper.getInstance().updateCaret(
-							_textEditor, p);
-					_location = text.getCaretOffset();
-					if (TemplateTransfer.getInstance().isSupportedType(
-							event.currentDataType)) {
-						_location = SourceViewerDragDropHelper.getInstance()
-								.getValidLocation(_textEditor, _location);
-					}
-					SourceViewerDragDropHelper.getInstance().showCaret(
-							_textEditor, _location);
-				}
-			} else if (TextTransfer.getInstance().isSupportedType(
-					event.currentDataType)) {
-				super.dragOver(event);
-				_location = text.getCaretOffset();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#drop(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void drop(DropTargetEvent event) {
-		StyledText text = null;
-		if (_textEditor.getTextViewer() != null) {
-			text = _textEditor.getTextViewer().getTextWidget();
-		}
-		text.setCaretOffset(_location);
-		Command command = getCommand(event);
-		if (command == null) {
-			return;
-		}
-		command.execute();
-	}
-
-	private Command getCommand(DropTargetEvent event) {
-		if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
-			Object data = event.data;
-			if (data instanceof String) {
-				SourceViewLocalDropCommand command = new SourceViewLocalDropCommand(
-						_textEditor, data, _location);
-				return command;
-			}
-		} else if (TemplateTransfer.getInstance().isSupportedType(
-				event.currentDataType)) {
-			Object data = event.data;
-			PaletteDropInsertCommand command = null;
-			if (data instanceof TagToolPaletteEntry) {
-				TagToolPaletteEntry tagItem = (TagToolPaletteEntry) data;
-				// "Create new item"
-				command = new PaletteDropInsertCommand(
-						PageDesignerResources
-								.getInstance()
-								.getString(
-										"DesignerSourceDropTargetListener.InserCommandLabel"), _textEditor, tagItem, _location); //$NON-NLS-1$
-			}
-			return command;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerSourceMouseTrackAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerSourceMouseTrackAdapter.java
deleted file mode 100644
index 6446e6a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerSourceMouseTrackAdapter.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.gef.EditDomain;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.jst.pagedesigner.commands.PaletteDropInsertCommand;
-import org.eclipse.jst.pagedesigner.commands.SourceViewerCommand;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.internal.ExtendedEditorDropTargetAdapter;
-
-/**
- * @author mengbo
- */
-public class DesignerSourceMouseTrackAdapter extends
-		ExtendedEditorDropTargetAdapter implements MouseListener,
-		MouseMoveListener {
-	private int _location;
-
-	private StructuredTextEditor _textEditor;
-
-	private EditDomain _domain;
-
-	public DesignerSourceMouseTrackAdapter(StructuredTextEditor textEditor,
-			EditDomain domain) {
-		super(false);
-		_textEditor = textEditor;
-		_domain = domain;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.events.MouseMoveListener#mouseMove(org.eclipse.swt.events.MouseEvent)
-	 */
-	public void mouseMove(MouseEvent event) {
-		Object object = getPaletteObject();
-		StyledText text = null;
-		if (_textEditor.getTextViewer() != null) {
-			text = _textEditor.getTextViewer().getTextWidget();
-		} else {
-			return;
-		}
-		if (object == null) {
-            // set to default cusror
-			text.setCursor(null);
-			return;
-		}
-		Point p = new Point(event.x, event.y);
-		p = _textEditor.getTextViewer().getTextWidget().toDisplay(p);
-		SourceViewerDragDropHelper.getInstance().updateCaret(_textEditor, p);
-		_location = text.getCaretOffset();
-		_location = SourceViewerDragDropHelper.getInstance().getValidLocation(
-				_textEditor, _location);
-		_location = SourceViewerDragDropHelper.getInstance().showCaret(
-				_textEditor, _location);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent)
-	 */
-	public void mouseUp(MouseEvent event) {
-		if (event.button != 1) {
-			if (_domain.getPaletteViewer() != null) {
-				_domain.getPaletteViewer().setActiveTool(null);
-			}
-			return;
-		}
-        SourceViewerCommand command = getCommand(event);
-        if (command != null) {
-        	command.execute();
-        	resetPalette();
-        }
-        _location = 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.palette.PaletteListener#activeToolChanged(org.eclipse.gef.ui.palette.PaletteViewer,
-	 *      org.eclipse.gef.palette.ToolEntry)
-	 */
-	public Object getPaletteObject() {
-		if (_domain.getPaletteViewer() != null) {
-			Object tool = _domain.getPaletteViewer().getActiveTool();
-			if (tool instanceof TagToolPaletteEntry) {
-				return tool;
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.events.MouseListener#mouseDoubleClick(org.eclipse.swt.events.MouseEvent)
-	 */
-	public void mouseDoubleClick(MouseEvent e) {
-       // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events.MouseEvent)
-	 */
-	public void mouseDown(MouseEvent e) {
-        // do nothing
-	}
-
-	private PaletteDropInsertCommand getCommand(MouseEvent event) {
-		Object data = getPaletteObject();
-		PaletteDropInsertCommand command = null;
-		if (data instanceof TagToolPaletteEntry) {
-			TagToolPaletteEntry descriptor = (TagToolPaletteEntry) data;
-			// "Create new item"
-			command = new PaletteDropInsertCommand(
-					PageDesignerResources
-							.getInstance()
-							.getString(
-									"DesignerSourceDropTargetListener.InserCommandLabel"),
-					_textEditor, descriptor, _location);
-		}
-		return command;
-	}
-
-	private void resetPalette() {
-		if (_domain.getPaletteViewer() != null) {
-			ToolEntry tool = _domain.getPaletteViewer().getPaletteRoot()
-					.getDefaultEntry();
-			if (tool != null) {
-				_domain.getPaletteViewer().setActiveTool(tool);
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerTemplateTransferDragSourceListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerTemplateTransferDragSourceListener.java
deleted file mode 100644
index c1d3868..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerTemplateTransferDragSourceListener.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.dnd.TemplateTransferDragSourceListener;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-
-/**
- * @author mengbo
- */
-public class DesignerTemplateTransferDragSourceListener extends
-		TemplateTransferDragSourceListener {
-
-	/**
-	 * @param viewer
-	 */
-	public DesignerTemplateTransferDragSourceListener(EditPartViewer viewer) {
-		super(viewer);
-	}
-
-	protected Object getTemplate() {
-		Object object = super.getTemplate();
-		if (object == null) {
-			List selection = getViewer().getSelectedEditParts();
-			if (selection.size() == 1) {
-				EditPart editpart = (EditPart) getViewer()
-						.getSelectedEditParts().get(0);
-				Object model = editpart.getModel();
-				if (model instanceof TagToolPaletteEntry) {
-					return model;
-				}
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DropSelectionWizard.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DropSelectionWizard.java
deleted file mode 100644
index 344ea07..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DropSelectionWizard.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.dnd.internal;
-
-import java.util.Map;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dnd.ILocalDropHandler;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class DropSelectionWizard extends Wizard {
-	private final String INTIAL_DEFAULT_PAGE_IMAGE = "newsuade_wiz.gif";
-
-	private Object _localData;
-
-	private IHTMLGraphicalViewer _viewer;
-
-	private Map _feedbackToHandlers;
-
-	private boolean _updateWidget;
-
-	private Node _widget;
-
-	private IDOMPosition _position;
-
-	private SimpleWizardSelectionPage _firstPage;
-
-	private DropSelectionWizard(IHTMLGraphicalViewer viewer, Object localData,
-			Map handlers) {
-		this.setWindowTitle(Messages.getString("DropSelectionWizard.Title")); //$NON-NLS-1$
-		ImageDescriptor desc = PDPlugin.getDefault().getImageDescriptor(
-				INTIAL_DEFAULT_PAGE_IMAGE);
-		setDefaultPageImageDescriptor(desc);
-		this._viewer = viewer;
-		this._localData = localData;
-		this._feedbackToHandlers = handlers;
-
-		_firstPage = new SimpleWizardSelectionPage(_viewer, _localData,
-				_feedbackToHandlers);
-	}
-
-	/**
-	 * 
-	 */
-	public DropSelectionWizard(IHTMLGraphicalViewer viewer, Object localData,
-			Map handlers, Node widget) {
-		this(viewer, localData, handlers);
-		_updateWidget = true;
-		_widget = widget;
-
-		_firstPage.setWidget(widget);
-	}
-
-	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 ef366ee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalDropCommand.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.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
-	 */
-	public LocalDropCommand(IHTMLGraphicalViewer viewer, Object localObject,
-			Map feedbackHandlers) {
-		_viewer = viewer;
-		_localObject = localObject;
-		_feedbackToHandlers = feedbackHandlers;
-	}
-
-	public void setWidget(Node widget) {
-		_widget = widget;
-	}
-
-	public void setDOMPosition(IDOMPosition position) {
-		_position = position;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		if (_feedbackToHandlers.size() == 1) {
-			// only have one choice.
-			ILocalDropHandler handler = (ILocalDropHandler) _feedbackToHandlers
-					.values().toArray()[0];
-			if (handler.useWizard(_localObject, _viewer)) {
-				IWizard wizard;
-				if (_widget != null) {
-					wizard = handler.getWizard(_localObject, _widget, _viewer);
-				} else {
-					wizard = handler
-							.getWizard(_localObject, _position, _viewer);
-				}
-				CommonWizardDialog wizardDialog = new CommonWizardDialog(
-						getShell(), wizard);
-				wizardDialog.setTitle(Messages
-						.getString("LocalDropCommand.DropHandler"));
-				wizardDialog.create();
-				wizardDialog.open();
-			} else {
-				if (_widget != null) {
-					handler.doUpdateWidget(_localObject, _widget, _viewer);
-				} else {
-					handler.doInsertElements(_localObject, _position, _viewer);
-				}
-			}
-		} else {
-			CommonWizardDialog wizardDialog = new CommonWizardDialog(
-					getShell(), getWizard());
-			wizardDialog.setTitle(Messages
-					.getString("LocalDropCommand.DropHandler"));
-			wizardDialog.setBlockOnOpen(false);
-			wizardDialog.create();
-			wizardDialog.open();
-		}
-	}
-
-	/**
-	 * @return
-	 */
-	private IWizard getWizard() {
-		if (_widget != null) {
-			return new DropSelectionWizard(_viewer, _localObject,
-					_feedbackToHandlers, _widget);
-		}
-        return new DropSelectionWizard(_viewer, _localObject,
-        		_feedbackToHandlers, _position);
-	}
-
-	/**
-	 * @return
-	 */
-	private Shell getShell() {
-		return _viewer.getControl().getShell();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalDropEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalDropEditPolicy.java
deleted file mode 100644
index f1f73fb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalDropEditPolicy.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.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;
-
-	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();
-	}
-
-	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;
-			}
-		}
-	}
-
-	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;
-	}
-
-	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 91ff8b5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalSelectionDropTargetListener.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.dnd.internal;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.dnd.AbstractTransferDropTargetListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.Alerts;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dnd.LocalDropRequest;
-import org.eclipse.jst.pagedesigner.viewer.HTMLGraphicalViewer;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.ui.views.navigator.LocalSelectionTransfer;
-
-/**
- * @author mengbo
- */
-public class LocalSelectionDropTargetListener extends
-		AbstractTransferDropTargetListener {
-	/**
-	 * @param viewer
-	 */
-	public LocalSelectionDropTargetListener(EditPartViewer viewer) {
-		super(viewer, LocalSelectionTransfer.getInstance());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#createTargetRequest()
-	 */
-	protected Request createTargetRequest() {
-		LocalDropRequest request = new LocalDropRequest();
-		request.setLocation(getDropLocation());
-		request.setLocalObject(getCurrentLocalObject());
-		return request;
-	}
-
-	public Object getCurrentLocalObject() {
-		ISelection sel = LocalSelectionTransfer.getInstance().getSelection();
-		if (sel instanceof IStructuredSelection) {
-			return ((IStructuredSelection) sel).getFirstElement();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#updateTargetRequest()
-	 */
-	protected void updateTargetRequest() {
-		LocalDropRequest dropRequest = (LocalDropRequest) getTargetRequest();
-		dropRequest.setLocation(getDropLocation());
-		dropRequest.setLocalObject(getCurrentLocalObject());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#setCurrentEvent(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void setCurrentEvent(DropTargetEvent currentEvent) {
-		super.setCurrentEvent(currentEvent);
-		if (currentEvent != null) {
-			if (currentEvent.detail != DND.DROP_NONE) {
-				currentEvent.detail = DND.DROP_COPY;
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#dragOperationChanged(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void dragOperationChanged(DropTargetEvent event) {
-		// switch the insert or update
-		if ((event.detail & (DND.DROP_COPY)) != 0) {
-			LocalDropEditPolicy.setCheckUpdate(false);
-		} else {
-			LocalDropEditPolicy.setCheckUpdate(true);
-		}
-		super.dragOperationChanged(event);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#drop(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void drop(DropTargetEvent event) {
-		String path = ((HTMLGraphicalViewer) getViewer()).getModel()
-				.getBaseLocation();
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IWorkspaceRoot root = workspace.getRoot();
-		IPath filePath = new Path(path);
-		if (root.getFile(filePath).exists()) {
-			getViewer().getControl().setFocus();
-			super.drop(event);
-			LocalDropEditPolicy.setCheckUpdate(true);
-		} else {
-			Alerts alert = PDPlugin.getAlerts();
-			alert.info("LocalSelectionDropTargetListener.MessageDialog.Title",
-					"LocalSelectionDropTargetListener.MessageDialog.Message");
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/Messages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/Messages.java
deleted file mode 100644
index ade06ab..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/Messages.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.dnd.internal;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-public 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
-	}
-
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/PDTemplateTransferDropTargetListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/PDTemplateTransferDropTargetListener.java
deleted file mode 100644
index a251045..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/PDTemplateTransferDropTargetListener.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.dnd.AbstractTransferDropTargetListener;
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationRequest;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PDTemplateTransferDropTargetListener extends
-		AbstractTransferDropTargetListener {
-
-	/**
-	 * @param viewer
-	 */
-	public PDTemplateTransferDropTargetListener(EditPartViewer viewer) {
-		super(viewer, TemplateTransfer.getInstance());
-	}
-
-	/**
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#createTargetRequest()
-	 */
-	protected Request createTargetRequest() {
-		ItemCreationRequest request = new ItemCreationRequest();
-		/*TODO: nothing is done with this var.  Does the method have a side-effect? TagToolPaletteEntry tagItem =*/TemplateTransfer.getInstance().getTemplate();
-		return request;
-	}
-
-	/**
-	 * A helper method that casts the target Request to a CreateRequest.
-	 * 
-	 * @return CreateRequest
-	 */
-	protected final Request getCreateRequest() {
-		return getTargetRequest();
-	}
-
-	/**
-	 * The purpose of a template is to be copied. Therefore, the drop operation
-	 * can't be anything but <code>DND.DROP_COPY</code>.
-	 * 
-	 * @see AbstractTransferDropTargetListener#handleDragOperationChanged()
-	 */
-	protected void handleDragOperationChanged() {
-		getCurrentEvent().detail = DND.DROP_COPY;
-		super.handleDragOperationChanged();
-	}
-
-	/**
-	 * The purpose of a template is to be copied. Therefore, the Drop operation
-	 * is set to <code>DND.DROP_COPY</code> by default.
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#handleDragOver()
-	 */
-	protected void handleDragOver() {
-		getCurrentEvent().detail = DND.DROP_COPY;
-		getCurrentEvent().feedback = DND.FEEDBACK_SCROLL | DND.FEEDBACK_EXPAND;
-		super.handleDragOver();
-	}
-
-	/**
-	 * Assumes that the target request is a {@link org.eclipse.gef.requests.CreateRequest}.
-	 */
-	protected void updateTargetRequest() {
-		// We should never see request that is not of ItemCreationRequest type,
-		// but there is an error case that Eclipse send out other types
-		// requests.
-		// Add this test to avoid potential error.
-		if (getCreateRequest() instanceof ItemCreationRequest) {
-			ItemCreationRequest request = (ItemCreationRequest) getCreateRequest();
-            Object transferObj = TemplateTransfer.getInstance().getObject();
-            
-            if (transferObj instanceof TagToolPaletteEntry)
-            {
-            	TagToolPaletteEntry tagItem = 
-                    (TagToolPaletteEntry) transferObj;
-
-                request.setTagToolPaletteEntry(tagItem);
-                request.setLocation(getDropLocation());
-            }
-            else
-            {
-                PDPlugin.getLogger(this.getClass()).error("Unexpected transfer object on palette drag:"+transferObj, new Throwable("Artificial throwable for stack tracing"));
-            }
-		}
-	}
-
-	public void drop(DropTargetEvent event) {
-		if (getCreateRequest() instanceof ItemCreationRequest) {
-			getViewer().getControl().setFocus();
-			super.drop(event);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/RegistryReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/RegistryReader.java
deleted file mode 100644
index 3edb8bd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/RegistryReader.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.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;
-
-	public static synchronized ILocalDropHandler[] getAllHandlers() {
-		if (_handlers == null) {
-			_handlers = readAllHandlers();
-		}
-		return _handlers;
-
-	}
-
-	private static ILocalDropHandler[] readAllHandlers() {
-		List result = new ArrayList();
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint(PDPlugin.getPluginId(),
-						IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-		IExtension[] extensions = extensionPoint.getExtensions();
-
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension ext = extensions[i];
-			IConfigurationElement[] dropHandlers = ext
-					.getConfigurationElements();
-
-			for (int j = 0; j < dropHandlers.length; j++) {
-				if (dropHandlers[j].getName().equals(
-						IJMTConstants.LOCAL_DROP_HANDLER)) {
-					dropHandlers[j].getAttribute("class");
-					Object obj;
-					try {
-						obj = dropHandlers[j]
-								.createExecutableExtension("class");
-
-						if (obj instanceof ILocalDropHandler) {
-							result.add(obj);
-						}
-					} catch (CoreException e) {
-						_log.info("CoreException", e);
-					}
-				}
-			}
-		}
-		ILocalDropHandler[] ret = new ILocalDropHandler[result.size()];
-		result.toArray(ret);
-		return ret;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/ResouceDropTargetListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/ResouceDropTargetListener.java
deleted file mode 100644
index c3e0c73..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/ResouceDropTargetListener.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.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 {
-
-	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;
-	}
-
-	public 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 c19ebc7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SimpleWizardSelectionPage.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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 pageName
-	 */
-	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
-	 */
-	protected String getText(Object element) {
-		return ((FeedBackInfo) element).getDescription();
-	}
-
-	/**
-	 * @return
-	 */
-	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
-	 */
-	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 4363916..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SourceViewLocalDropCommand.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.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;
-
-	/**
-	 * 
-	 */
-	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 17d8c35..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SourceViewerDragDropHelper.java
+++ /dev/null
@@ -1,343 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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 class SourceViewerDragDropHelper {
-	private static SourceViewerDragDropHelper _instance;
-
-	public static SourceViewerDragDropHelper getInstance() {
-		if (_instance == null) {
-			_instance = new SourceViewerDragDropHelper();
-		}
-		return _instance;
-	}
-
-	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;
-	}
-
-	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();
-		}
-	}
-
-	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);
-			}
-		}
-	}
-
-	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();
-	}
-
-	protected ModelQuery getModelQuery(Node node) {
-		if (node.getNodeType() == Node.DOCUMENT_NODE) {
-			return ModelQueryUtil.getModelQuery((Document) node);
-		}
-        return ModelQueryUtil.getModelQuery(node.getOwnerDocument());
-	}
-
-	public IDOMPosition findPosition(int caretPos, Node element) {
-		EditValidateUtil.validNode(element);
-		IDOMPosition position = EditModelQuery.getInstance().createDomposition(
-				((IDOMNode) element).getModel(), caretPos, false);
-		return position;
-	}
-
-	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);
-	}
-
-	public void changeCaret(StructuredTextEditor textEditor, boolean reset) {
-		if (reset) {
-			StyledText text = textEditor.getTextViewer().getTextWidget();
-			text.setCursor(new Cursor(null, SWT.CURSOR_IBEAM));
-		}
-	}
-
-	public int getValidLocation(StructuredTextEditor textEditor,
-			int locationOffset) {
-		Node node = getCaretNode(textEditor, locationOffset);
-		if (node == null) {
-			// empty page?
-			return 0;
-		}
-		if (node.getNodeType() == Node.TEXT_NODE) {
-			return locationOffset;
-		}
-		return calculateCaretLocation(node, locationOffset);
-	}
-
-	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;
-	// }
-
-	/**
-	 * IExtendedMarkupEditor method
-	 */
-	public Node getCaretNode(StructuredTextEditor textEditor, int pos) {
-        // TODO: getModel is deprecated
-		IStructuredModel model = textEditor.getModel();
-		// getModel(textEditor);
-		if (model == null) {
-			return null;
-		}
-		IndexedRegion inode = model.getIndexedRegion(pos);
-		if (inode == null) {
-			inode = model.getIndexedRegion(pos - 1);
-		}
-		return (inode instanceof Node) ? (Node) inode : null;
-	}
-
-	/**
-	 * Calculate and adjust the location in compare with Node.
-	 * 
-	 * @param node
-	 * @param location
-	 * @return
-	 */
-	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 bc5abe9..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, 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
-###############################################################################
-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 ce4db59..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/CaretMoveIterator.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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;
-
-	/**
-	 * constructor
-	 */
-	public CaretMoveIterator(NodeIterator nodeIterator,
-			IMovementMediator validator, IDOMPosition position, boolean forward) {
-		super();
-		_nodeIterator = nodeIterator;
-		_validator = validator;
-		_currentPosition = position;
-		_forward = forward;
-	}
-
-	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;
-	}
-
-	public IDOMPosition moveIn(Node node) {
-		IDOMPosition result = null;
-		if (INNER_DEBUG) {
-			_log.info("- Move into: " + node.getLocalName());
-		}
-		if (_validator.isEditable(new Target(node))) {
-			int index;
-			// Transparent text is not editable, so this is not transparent.
-			if (EditModelQuery.isText(node)) {
-				index = (_forward) ? 0 : ((Text) node).getData().length();
-				result = new DOMPosition(node, index);
-				// move ahead one pos.
-				IDOMPosition pos = getNextTextPosition(result);
-				if (pos != null) {
-					result = pos;
-				}
-			} else {
-				if (node.hasChildNodes()) {
-					index = _forward ? 0 : node.getChildNodes().getLength();
-					result = new DOMPosition(node, index); // DOMRefPosition(next,
-					// !_forward);
-				} else {
-					result = new DOMPosition(node, 0);
-				}
-			}
-		} else {
-			if (node.hasChildNodes()) {
-				Node child = _forward ? node.getFirstChild() : node
-						.getLastChild();
-				result = new DOMRefPosition(child, _forward);
-				while (child != null) {
-					if (_validator.allowsMoveIn(new Target(child))) {
-						result = moveIn(child);
-						break;
-					}
-					child = _forward ? child.getNextSibling() : child
-							.getPreviousSibling();
-				}
-			} else {
-				// Should be impposible to reach here.
-				result = new DOMPosition(node, 0);
-			}
-		}
-		return result;
-	}
-
-	private IDOMPosition getNextTextPosition(IDOMPosition position) {
-		IDOMPosition result = null;
-		String value = position.getContainerNode().getNodeValue();
-		int i = position.getOffset();
-		if (_forward) {
-			if (i < value.length()) {
-				if (HTMLUtil.isHTMLWhitespace(value.charAt(i))) {
-					while (i < value.length()
-							&& HTMLUtil.isHTMLWhitespace(value.charAt(i))) {
-						i++;
-					}
-					result = new DOMPosition(position.getContainerNode(), i);
-				} else if (i < value.length()) {
-					result = new DOMPosition(position.getContainerNode(), i + 1);
-				}
-			}
-		} else {
-			if (i > 0) {
-				if (HTMLUtil.isHTMLWhitespace(value.charAt(i - 1))) {
-					while (i > 0
-							&& HTMLUtil.isHTMLWhitespace(value.charAt(i - 1))) {
-						i--;
-					}
-					result = new DOMPosition(position.getContainerNode(), i);
-				} else if (i > 0) {
-					result = new DOMPosition(position.getContainerNode(), i - 1);
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Assume the original position are valid.
-	 * 
-	 * @param position
-	 * @param validator
-	 * @param _forward
-	 * @param referenceImediatly
-	 * @return
-	 */
-	private IDOMPosition moveToNextPosition(IDOMPosition position,
-			IMovementMediator validator) {
-		IDOMPosition currentPosition = null;
-		if (validator.isValidPosition(position) && position.isText()) {
-			currentPosition = getNextTextPosition(position);
-		}
-		if (currentPosition == null) {
-			Node nextNode = EditModelQuery.getInstance().getSibling(position,
-					_forward);
-			while (EditModelQuery.isText(nextNode)
-					&& ((Text) nextNode).getData().length() == 0) {
-				nextNode = EditModelQuery.getInstance().getSibling(nextNode,
-						_forward);
-			}
-			if (nextNode != null) {
-				// move in?
-				if (validator.allowsMoveIn(new Target(nextNode))) {
-					currentPosition = moveIn(nextNode);
-					// Stop when it is in table. For others we continue search
-					// for text.
-					if (!canStopHere(nextNode) && //
-							EditModelQuery.getInstance().getSibling(
-									currentPosition, _forward) != null) {
-						currentPosition = moveToNextPosition(currentPosition,
-								validator);
-					}
-				}
-				// not allowed to move in. e.g. it's empty string.
-				else {
-					currentPosition = new DOMRefPosition(nextNode, _forward);// skip(position);
-				}
-			} else {
-				if (validator.allowsMoveOut(new Target(
-						getNaviContainer(position)))) {
-					currentPosition = moveOut(getNaviContainer(position));
-				}
-			}
-		}
-		currentPosition = EditHelper.ensureDOMPosition(currentPosition);
-		if (currentPosition != null
-				&& !validator.isValidPosition(currentPosition)) {
-			currentPosition = moveToNextPosition(currentPosition, validator);
-		}
-		return currentPosition;
-	}
-
-	/**
-	 * When the tag starts from new line, or in table, then caret can be put at
-	 * 0 offset.
-	 * 
-	 * @param node
-	 * @return
-	 */
-	private boolean canStopHere(Node node) {
-		boolean result = false;
-		if (EditModelQuery.isText(node)) {
-			result = true;
-		} else if (node != null && node.getNodeName() != null) {
-			result |= node.getNodeName().equals(IHTMLConstants.TAG_TD);
-			result |= EditModelQuery.isBlockNode(node);
-		}
-		return result;
-	}
-
-	/**
-	 * Move operation position to next edit position. We may need rule to valid
-	 * it based on operation ID and direction. We need to pack transparent
-	 * string.
-	 * 
-	 * @param operation
-	 * @param currentPosition
-	 * @param forward
-	 * @param validator
-	 * @return
-	 */
-	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 ee50acd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMPosition.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.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;
-
-	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
-	 */
-	public int getOffset() {
-		return _offset;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getNextSiblingNode()
-	 */
-	public Node getNextSiblingNode() {
-		if (isText())
-			return null;
-		NodeList children = _containerNode.getChildNodes();
-		int length = children.getLength();
-		if (_offset >= length || _offset < 0)
-			return null;
-        return children.item(_offset);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getPreviousSiblingNode()
-	 */
-	public Node getPreviousSiblingNode() {
-		if (isText())
-			return null;
-		NodeList children = _containerNode.getChildNodes();
-		int length = children.getLength();
-		if (_offset > length || _offset <= 0)
-			return null;
-        return children.item(_offset - 1);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getContainerNode()
-	 */
-	public Node getContainerNode() {
-		return _containerNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#isText()
-	 */
-	public boolean isText() {
-		return _containerNode instanceof Text;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getSibling(boolean)
-	 */
-	public Node getSibling(boolean forward) {
-		if (forward)
-			return getNextSiblingNode();
-        return getPreviousSiblingNode();
-	}
-
-	public IDOMPosition handleReplacement(Node original, Node replacement) {
-		if (original == this._containerNode) {
-			return new DOMPosition(replacement, this._offset);
-		}
-        return this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return "DOMPosition: (" + _containerNode + " : " + _offset + ")";
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMPositionHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMPositionHelper.java
deleted file mode 100644
index e40e02a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMPositionHelper.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.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 {
-	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
-	 */
-	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
-	 */
-	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
-	 */
-	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
-	 */
-	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
-	 */
-	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
-	 */
-	// 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 textData
-	 * @param displayData
-	 * @param offset
-	 * @return
-	 */
-	// 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 bd80539..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRange.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.dom;
-
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class DOMRange {
-	IDOMPosition _start;
-
-	IDOMPosition _end;
-
-	/**
-	 * 
-	 */
-	public DOMRange(IDOMPosition p1, IDOMPosition p2) {
-		_start = p1;
-		_end = p2;
-	}
-
-	public IDOMPosition getStartPosition() {
-		return _start;
-	}
-
-	public IDOMPosition getEndPosition() {
-		return _end;
-	}
-
-	/**
-	 * @return
-	 */
-	public boolean isEmpty() {
-		return _start.getContainerNode() == _end.getContainerNode()
-				&& _start.getOffset() == _end.getOffset();
-	}
-
-	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 fcc8fb9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRangeHelper.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.dom;
-
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class DOMRangeHelper {
-	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()));
-	}
-
-	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()));
-	}
-
-	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));
-	}
-}
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 b82e145..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRefPosition.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.dom;
-
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * DOMRefPosition is another way to identify a position in the document tree. It
- * has the advantage against the DOMPosition, that even something change in the
- * document, DOMRefPosition may still reference the correct position.
- * 
- * @author mengbo
- */
-public class DOMRefPosition implements IDOMRefPosition {
-	Node _refNode;
-
-	boolean _forward;
-
-	/**
-	 * @param refNode
-	 * @param forward
-	 *            true means the position after refNode. false means the
-	 *            position before refNode
-	 */
-	public DOMRefPosition(Node refNode, boolean forward) {
-		_refNode = refNode;
-		_forward = forward;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getSibling(boolean)
-	 */
-	public Node getSibling(boolean forward) {
-		if (forward != _forward)
-        {
-		    return _refNode;
-        }
-		if (forward)
-        {
-			return _refNode.getNextSibling();
-        }
-        return _refNode.getPreviousSibling();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getNextSiblingNode()
-	 */
-	public Node getNextSiblingNode() {
-		return getSibling(true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getPreviousSiblingNode()
-	 */
-	public Node getPreviousSiblingNode() {
-		return getSibling(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getContainerNode()
-	 */
-	public Node getContainerNode() {
-		return _refNode.getParentNode();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getOffset()
-	 */
-	public int getOffset() {
-		Node parent = _refNode.getParentNode();
-		if (parent == null) {
-			return _forward ? 1 : 0;
-		}
-        NodeList list = parent.getChildNodes();
-        for (int i = 0, n = list.getLength(); i < n; i++) {
-        	if (list.item(i) == _refNode) {
-        		return _forward ? (i + 1) : i;
-        	}
-        }
-        // should not happen.
-        return -1;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#isText()
-	 */
-	public boolean isText() {
-		return false;
-	}
-
-	public IDOMPosition handleReplacement(Node original, Node replacement) {
-		if (this._refNode == original) {
-			return new DOMRefPosition(replacement, this._forward);
-		}
-        return this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return "DOMRefPosition: (" + (_forward ? "after " : "before ")
-				+ _refNode + ")";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMRefPosition#getReferenceNode()
-	 */
-	public Node getReferenceNode() {
-		return _refNode;
-	}
-
-	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 b037fbc..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 replacement
-	 * @param _last2
-	 */
-	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 b9eefd4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMStyleUtil.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.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 class DOMStyleUtil {
-	public static String getInlineStyleProperty(Element original,
-			String cssProperty) {
-		if (original instanceof ElementCSSInlineStyle) {
-			CSSStyleDeclaration styledecl = ((ElementCSSInlineStyle) original)
-					.getStyle();
-			if (styledecl == null) {
-				if (original.getAttribute("style") == null) {
-					return null;
-				}
-				// else mean it has style attribute.
-			}
-
-			if (styledecl != null) {
-				return styledecl.getPropertyValue(cssProperty);
-			}
-		}
-
-		// when we reach here, means we can't use the CSSStyleDeclaration API to
-		// get style, we'll take the
-		// pain to do the parsing and replacing.
-		// normally should not happen. But anyway, we need to have a fail safe
-		// path.
-
-		String oldstyle = original.getAttribute("style");
-		if (oldstyle == null || oldstyle.length() == 0) {
-			return null;
-		}
-		StringTokenizer tokenizer = new StringTokenizer(oldstyle, ";");
-
-		while (tokenizer.hasMoreTokens()) {
-			String token = tokenizer.nextToken().trim();
-			if (token.length() == 0) {
-				continue;
-			}
-			int index = token.indexOf(':');
-			if (index == -1) {
-				continue;
-			}
-			String propertyName = token.substring(0, index).trim();
-			if (cssProperty.equals(propertyName)) {
-				// ok, we found the property
-				return token.substring(index + 1).trim();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * insert style into element
-	 * 
-	 * @param original
-	 * @param map
-	 */
-	public static void insertStyle(Element original, Map map) {
-		if (original instanceof ElementCSSInlineStyle) {
-			CSSStyleDeclaration styledecl = ((ElementCSSInlineStyle) original)
-					.getStyle();
-			if (styledecl == null) {
-				if (original.getAttribute("style") == null) {
-					original.setAttribute("style", "");
-					styledecl = ((ElementCSSInlineStyle) original).getStyle();
-				}
-			}
-
-			if (styledecl != null) {
-				for (Iterator iter = map.keySet().iterator(); iter.hasNext();) {
-					String key = (String) iter.next();
-					String value = (String) map.get(key);
-					if (value == null) {
-						styledecl.removeProperty(key);
-					} else {
-						styledecl.setProperty(key, value, null);
-					}
-				}
-
-				return;
-			}
-		}
-
-		// when we reach here, means we can't use the CSSStyleDeclaration API to
-		// change style, we'll take the
-		// pain to do the parsing and replacing.
-		// normally should not happen. But anyway, we need to have a fail safe
-		// path.
-
-		String oldstyle = original.getAttribute("style");
-		if (oldstyle == null) {
-			oldstyle = "";
-		}
-		StringTokenizer tokenizer = new StringTokenizer(oldstyle, ";");
-
-		StringBuffer buffer = new StringBuffer();
-		while (tokenizer.hasMoreTokens()) {
-			String token = tokenizer.nextToken().trim();
-			if (token.length() == 0) {
-				continue;
-			}
-			int index = token.indexOf(':');
-			if (index == -1) {
-				// wrong property? ignore.
-				buffer.append(token).append("; ");
-				continue;
-			}
-			String propertyName = token.substring(0, index).trim();
-
-			if (map.containsKey(propertyName)) {
-				String propertyValue = (String) map.remove(propertyName);
-				if (propertyValue == null) {
-					// we want to remove this css property. so don't append
-					// anything here
-				} else {
-					buffer.append(propertyName).append(": ").append(
-							propertyValue).append("; ");
-				}
-			} else {
-				buffer.append(token).append("; ");
-			}
-		}
-		// ok, we have loop through existing properties and did replacement.
-		// now _styleProperties only contain those new CSS properties we need to
-		for (Iterator iter = map.keySet().iterator(); iter.hasNext();) {
-			String key = (String) iter.next();
-			String value = (String) map.get(key);
-			if (value != null) {
-				buffer.append(key).append(": ").append(value).append("; ");
-			}
-		}
-		original.setAttribute("style", buffer.toString());
-	}
-
-	/**
-	 * @param ele
-	 * @return
-	 */
-	public static boolean supportStyleAttribute(IDOMElement ele) {
-		CMElementDeclaration decl = CMUtil.getElementDeclaration(ele);
-		if (decl != null && decl.getAttributes().getNamedItem("style") != null) {
-			return true;
-		}
-        return false;
-	}
-
-}
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 b0f3fd8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMUtil.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.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
-	 */
-	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
-	 */
-	public static Node cloneNodeDeepIgnoreError(Document destDoc,
-			Node sourceNode) {
-		switch (sourceNode.getNodeType()) {
-		case Node.ELEMENT_NODE:
-			Element sourceEle = (Element) sourceNode;
-			Element resultEle = destDoc.createElement(sourceEle.getTagName());
-			NamedNodeMap attrs = sourceEle.getAttributes();
-			for (int i = 0, size = attrs.getLength(); i < size; i++) {
-				Attr a = (Attr) attrs.item(i);
-				try {
-					resultEle.setAttribute(a.getName(), a.getValue());
-				} catch (Exception ex) {
-					// ignore
-					_logger.info("Exception", ex);
-				}
-			}
-			NodeList children = sourceEle.getChildNodes();
-			for (int i = 0, size = children.getLength(); i < size; i++) {
-				Node n = children.item(i);
-				Node d = cloneNodeDeepIgnoreError(destDoc, n);
-				if (d != null) {
-					try {
-						resultEle.appendChild(d);
-					} catch (Exception ex) {
-						// ignore
-						_logger.info("Exception", ex);
-					}
-				}
-			}
-			return resultEle;
-		case Node.TEXT_NODE:
-			Text txt = destDoc.createTextNode(sourceNode.getNodeValue());
-			if (txt instanceof IDOMText && sourceNode instanceof IDOMText) {
-				try {
-					((IDOMText) txt).setSource(((IDOMText) sourceNode)
-							.getSource());
-				} catch (Exception ex) {
-					// ignore
-				}
-			}
-			return txt;
-		case Node.CDATA_SECTION_NODE:
-			return destDoc.createCDATASection(sourceNode.getNodeValue());
-		default:
-			return null; // not support.
-		}
-	}
-
-	public static Node cloneNodeDeep(Document destDoc, Node sourceNode) {
-		switch (sourceNode.getNodeType()) {
-		case Node.ELEMENT_NODE:
-			Element sourceEle = (Element) sourceNode;
-			Element resultEle = destDoc.createElement(sourceEle.getTagName());
-			NamedNodeMap attrs = sourceEle.getAttributes();
-			for (int i = 0, size = attrs.getLength(); i < size; i++) {
-				Attr a = (Attr) attrs.item(i);
-				resultEle.setAttribute(a.getName(), a.getValue());
-			}
-			NodeList children = sourceEle.getChildNodes();
-			for (int i = 0, size = children.getLength(); i < size; i++) {
-				Node n = children.item(i);
-				Node d = cloneNodeDeep(destDoc, n);
-				if (d != null) {
-					resultEle.appendChild(d);
-				}
-			}
-			return resultEle;
-		case Node.TEXT_NODE:
-			Text txt = destDoc.createTextNode(sourceNode.getNodeValue());
-			if (txt instanceof IDOMText && sourceNode instanceof IDOMText) {
-				try {
-					((IDOMText) txt).setSource(((IDOMText) sourceNode)
-							.getSource());
-				} catch (Exception ex) {
-					// ignore
-					_logger.info("Exception", ex);
-				}
-			}
-			return txt;
-		case Node.CDATA_SECTION_NODE:
-			return destDoc.createCDATASection(sourceNode.getNodeValue());
-		default:
-			return null; // not support.
-		}
-	}
-
-	/**
-	 * check whether the ancester relationship exist for the two nodes.
-	 * 
-	 * @param ancester
-	 * @param child
-	 * @return
-	 */
-	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 insertPosition
-	 * @param insert
-	 * @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 0c522cb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditHelper.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.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.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-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;
-
-	public final static int OUT_OF_LEFT = 1;
-
-	public final static int LEFT_NAME = 2;
-
-	public final static int IN_MIDDLE = 3;
-
-	public final static int RIGHT_NAME = 4;
-
-	public final static int OUT_OF_RIGHT = 5;
-
-	public static final EditHelper _instance = new EditHelper();
-
-	//private static Logger _log = PDPlugin.getLogger(EditHelper.class);
-
-	private EditHelper() {
-        //  no external instantiation
-	}
-
-	/**
-	 * Move operation position infront of next non-blank and non-transparent
-	 * char. The caller should ensure position's container node is not
-	 * tranparent text node.
-	 * 
-	 * @param position
-	 * @param forward
-	 * @param forEmpty
-	 * @return
-	 */
-	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;
-
-	}
-
-	public static EditHelper getInstance() {
-		return _instance;
-	}
-
-	/**
-	 * This caret from current operation postion to next position, this method
-	 * will convert DesignPosition in to DOMPosition, then call dom function to
-	 * move dom position. Here we might insert some complex rules to see whether
-	 * move is valid.
-	 * 
-	 * @param action
-	 * @param currentPosition
-	 * @param forward
-	 * @return
-	 */
-	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 operation
-	 * @param currentPosition
-	 * @param forward
-	 * @param validator
-	 * @return
-	 */
-	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
-	 */
-	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
-	 */
-	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 forward
-	 * @return
-	 */
-	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
-	 */
-	public static IDOMPosition ensureDOMPosition(IDOMPosition position) {
-		if (position instanceof DOMRefPosition) {
-			return new DOMPosition(position.getContainerNode(), position
-					.getOffset());
-		}
-		return position;
-	}
-
-	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));
-		}
-	}
-
-	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));
-					}
-				}
-			}
-		}
-	}
-
-	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());
-//		}
-//	}
-
-	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;
-	}
-
-	public static IDOMPosition splitNode(IDOMPosition position) {
-		if (EditValidateUtil.validPosition(position)) {
-			Node container = null;
-			// Avoid to split tag at its edge
-			if (position.getOffset() > 0) {
-				if (position.isText()) {
-					container = position.getContainerNode();
-					if (position.getOffset() < ((Text) container).getLength()) {
-						position = DOMPositionHelper.splitText(position);
-					} else {
-						// position = new
-						// DOMRefPosition(position.getContainerNode(), true);
-					}
-				} else {
-					if (position.getNextSiblingNode() != null) {
-						container = position.getContainerNode();
-						Node parent = container.getParentNode();
-
-						Document document = EditModelQuery
-								.getDocumentNode(container);
-						Node newContainer = document.createElement(container
-								.getNodeName());
-						Node node = position.getPreviousSiblingNode();
-						Node refNode = null;
-						while (node != null) {
-							Node prev = node.getPreviousSibling();
-							node = node.getParentNode().removeChild(node);
-
-							newContainer.insertBefore(node, refNode);
-							refNode = node;
-							node = prev;
-						}
-						parent.insertBefore(newContainer, container);
-						// set the newContainer node align attribute to the
-						// original align attribue
-						// copy nodes under container node to container node's
-						// parent node
-						if (container.getNodeName().equalsIgnoreCase(
-								IHTMLConstants.TAG_P)) {
-							Element pNode = (Element) container;
-							String align = pNode
-									.getAttribute(IHTMLConstants.ATTR_ALIGN);
-							if (align != null && !"".equalsIgnoreCase(align)) {
-								((Element) newContainer).setAttribute(
-										IHTMLConstants.ATTR_ALIGN, align);
-							}
-							NodeList nodeList = pNode.getChildNodes();
-							for (int i = 0, size = nodeList.getLength(); i < size; i++) {
-								Node tempNode = nodeList.item(i);
-								parent.insertBefore(tempNode, container);
-							}
-						}
-						return new DOMRefPosition(newContainer, true);
-					}
-//                    position = new
-//                    DOMRefPosition(position.getContainerNode(), true);
-				}
-			} else {
-				// container = position.getContainerNode();
-				// position = new DOMRefPosition(container, false);
-			}
-		}
-		return position;
-	}
-
-	/*
-	 * 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;
-	}
-
-	public static EditPart getPart(Node node) {
-		if (node instanceof INodeNotifier) {
-			((INodeNotifier) node).getAdapterFor(EditPart.class);
-		}
-		return null;
-	}
-}
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 85f43ba..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditModelQuery.java
+++ /dev/null
@@ -1,1775 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.HTMLEditPartsFactory;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.swt.SWT;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class EditModelQuery {
-	private static Logger _log = PDPlugin.getLogger(EditModelQuery.class);
-
-	private static EditModelQuery _instance;
-
-	public static final int START_INDEX_BEFORE_TAG = 1;
-
-	public static final int END_INDEX_WITHIN_TAG = 2;
-
-	public static final HashSet SPECIAL_EMPTY_CHARS = new HashSet();
-
-	public static final HashMap CHAR_NODE_MAP = new HashMap();
-
-	// Cursor can't go outside of these container.
-	public static final HashSet HTML_CONSTRAINED_CONTAINERS = new HashSet();
-
-	public static final HashSet HTML_STYLE_NODES = new HashSet();
-
-	public static final HashSet UNREMOVEBLE_TAGS = new HashSet();
-
-	// Nodes that can hold other nodes.
-	public static final String[] HTML_CONTAINER_NODES = {
-	//
-			IHTMLConstants.TAG_BODY, //
-			IHTMLConstants.TAG_HTML, //
-			IHTMLConstants.TAG_SPAN, //
-			IHTMLConstants.TAG_FORM, //
-			IHTMLConstants.TAG_P,//
-			IHTMLConstants.TAG_SPAN,//
-			IHTMLConstants.TAG_DIV,//
-			IHTMLConstants.TAG_LI,//
-			IHTMLConstants.TAG_OL,//
-			IHTMLConstants.TAG_UL //
-	};
-
-	public static final String[] NON_HTML_CONTAINER_NODES = {
-			IJSFConstants.TAG_VIEW, //
-			IJSFConstants.TAG_PANELGRID, //
-			IJSFConstants.TAG_PANELGROUP, //
-			IJSFConstants.TAG_SUBVIEW };
-	static {
-		UNREMOVEBLE_TAGS.add(IHTMLConstants.TAG_HTML);
-		UNREMOVEBLE_TAGS.add(IHTMLConstants.TAG_HEAD);
-		UNREMOVEBLE_TAGS.add(IHTMLConstants.TAG_BODY);
-		EditModelQuery.CHAR_NODE_MAP.put(new Character(SWT.CR),
-				IHTMLConstants.TAG_BR);
-		EditModelQuery.CHAR_NODE_MAP.put(new Character(SWT.LF),
-				IHTMLConstants.TAG_BR);
-		EditModelQuery.SPECIAL_EMPTY_CHARS.add(" ");
-		EditModelQuery.SPECIAL_EMPTY_CHARS.add("\t");
-		EditModelQuery.SPECIAL_EMPTY_CHARS.add("\r");
-		EditModelQuery.SPECIAL_EMPTY_CHARS.add("\n");
-		EditModelQuery.HTML_CONSTRAINED_CONTAINERS.add(IHTMLConstants.TAG_TD);
-		EditModelQuery.HTML_CONSTRAINED_CONTAINERS.add(IHTMLConstants.TAG_TR);
-		EditModelQuery.HTML_CONSTRAINED_CONTAINERS
-				.add(IHTMLConstants.TAG_TABLE);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_B);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_EM);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H1);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H2);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H3);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H4);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H5);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H6);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_A);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_U);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_I);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_S);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_STRONG);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_TT);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_BIG);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_SMALL);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_FONT);
-	}
-
-	private EditModelQuery() {
-        // no  external instantiation
-	}
-
-	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
-	 */
-	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
-	 */
-	public Node getPreviousLeafNeighbor(Node node) {
-		return getLastLeafChild(getPreviousNeighbor(node));
-	}
-
-	/**
-	 * Get next sibling, or if sibling is null get next neighbor.
-	 * 
-	 * @param node
-	 * @return
-	 */
-	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
-	 */
-	public Node getNextLeafNeighbor(Node node) {
-		return getFirstLeafChild(getNextNeighbor(node));
-	}
-
-	/**
-	 * Get node's rightmost leaf child.
-	 * 
-	 * @param node
-	 * @return
-	 */
-	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
-	 */
-	protected 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'
-	 */
-	public 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
-	 */
-	public 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
-	 */
-	public 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 node
-	 * @param offset
-	 * @param direction
-	 * @return
-	 */
-	public 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
-	 */
-	public 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
-	 */
-	public 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
-	 */
-	public 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
-	 */
-	public 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
-	 */
-	public 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
-	 */
-	public 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
-	 */
-	public 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
-	 * @param lookForChildren
-	 * @return
-	 */
-	public 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
-	 */
-	public 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 model
-	 * @param textSelection
-	 * @return
-	 */
-	public 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
-	 */
-	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
-	 */
-	public static boolean isSame(DOMRange range) {
-		EditValidateUtil.validRange(range);
-		return isSame(range.getStartPosition(), range.getEndPosition());
-	}
-
-	public static boolean isSame(DesignRange range) {
-		return isSame(range.getStartPosition(), range.getEndPosition());
-	}
-
-	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;
-	}
-
-	public 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
-	 */
-	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 node
-	 * @param position
-	 * @return
-	 */
-	public 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
-	 */
-	public boolean isAtNodeNameEdge(int location, Node node, int posType) {
-		int start = getNodeEndNameStartIndex(node);
-		return location == start;
-	}
-
-	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
-	 */
-	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
-	 */
-	public 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
-	 */
-	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
-	 */
-	public 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
-	 */
-	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
-	 */
-	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
-	 */
-	public 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
-	 */
-	public static boolean isBlockNode(Node node) {
-		return !isInline(node);
-	}
-
-	public 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 node
-	 * @return
-	 */
-	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;
-	}
-
-	public static boolean isListItem(Node node) {
-		if (node instanceof INodeNotifier) {
-			Object adapter = ((INodeNotifier) node)
-					.getAdapterFor(ICSSStyle.class);
-			if (adapter != null) {
-				ICSSStyle style = (ICSSStyle) adapter;
-				String display = style.getDisplay();
-				return (display.equalsIgnoreCase(ICSSPropertyID.VAL_LIST_ITEM));
-			}
-		}
-		return false;
-	}
-
-	/**
-     * The net effect of this method is that (subject to flags), true
-     * is returned if 'node' is the descendant (not really a child)
-     * of a tag with a local name in the list of 'names'.
-     * 
-     * TODO C.B: I hate method.  Need to rename and possibly rewrite
-     * 
-	 * @param names -- check this list for valid local names
-	 * @param node -- the node to check
-	 * @param ignoreCase -- if true, each node name has toLowerCase applied to
-     * it before checking for it names.  NOTE: this assumes that names is already
-     * in lowercase.  TODO: this is crappy assumption
-	 * @param noSame -- if true, then node is skipped and only its parent nodes are
-     * checked
-	 * @return true if the local name of node or one of its parents
-     * is in the array of Strings called names.
-	 */
-	public static boolean isChild(final String names[], Node node,
-			boolean ignoreCase, boolean noSame) {
-		if (node == null) {
-			return false;
-		}
-		if (noSame) {
-			node = node.getParentNode();
-		}
-        
-        final List namesAsList = Arrays.asList(names);
-        
-		while (node != null && !isDocument(node)) {
-			String nodeName = node.getLocalName();
-
-			if (nodeName != null)
-            {
-			    if (ignoreCase)
-                {
-			        nodeName = nodeName.toLowerCase();
-                }
-                
-                if (namesAsList.contains(nodeName))
-                {
-                    return true;
-                }
-			}
-            Node oldNode = node;
-			node = node.getParentNode();
-            if (oldNode == node)
-            {
-                throw new IllegalStateException("Infinite loop discovered in DOM tree");
-            }
-		}
-		return false;
-	}
-
-	/**
-	 * Determine whether a node is a child of node that is named as 'name', if
-	 * the node itself is named as 'name' return true also.
-	 * 
-	 * @param name
-	 * @param node
-	 * @return
-	 */
-	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
-	 */
-	public static boolean isChild(Node ancestor, Node node) {
-		if (node == null || ancestor == null) {
-			return false;
-		}
-
-		if (isDocument(ancestor)) {
-			return true;
-		}
-		while (node != null && !isDocument(ancestor)) {
-			if (node == null) {
-				break;
-			}
-			if (node == ancestor) {
-				return true;
-			}
-			node = node.getParentNode();
-		}
-		return false;
-	}
-
-	/**
-	 * Get next sibling node to position's container node.
-	 * 
-	 * @param position
-	 * @return
-	 */
-	public 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
-	 */
-	public Node getPreviousSibling(IDOMPosition position) {
-		if (position.isText()) {
-			return position.getContainerNode().getPreviousSibling();
-		}
-        return position.getPreviousSiblingNode();
-	}
-
-	/**
-	 * Get position's container node's parent.
-	 * 
-	 * @param position
-	 * @return
-	 */
-	public 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
-	 */
-	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
-	 */
-	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
-	 */
-	public 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
-	 */
-	public Text getText(IDOMPosition position) {
-		if (position.isText()) {
-			if (position.getContainerNode() != null) {
-				return (Text) position.getContainerNode();
-			}
-		}
-		return null;
-	}
-
-	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
-	 */
-	public 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
-	 */
-	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
-	 */
-	public static boolean isDocument(Node node) {
-		return node != null && node.getNodeType() == Node.DOCUMENT_NODE;
-	}
-
-    // TODO: dead?
-//	private static boolean isHead(Node node) {
-//		return node.getNodeName().equalsIgnoreCase(IHTMLConstants.TAG_HEAD);
-//	}
-
-	/**
-	 * 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
-	 * @return
-	 */
-	public 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
-	 */
-	public Object getPosNode(IStructuredModel model, int pos) {
-		IndexedRegion inode = model.getIndexedRegion(pos);
-		return inode;
-	}
-
-	/**
-	 * If the pos is at right edge within container.
-	 * 
-	 * @param model
-	 * @param pos
-	 * @return
-	 */
-	public 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
-	 */
-	public 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);
-	}
-
-	public 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 container
-	 * @param position
-	 * @return
-	 */
-	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 container
-	 * @param position
-	 * @return
-	 */
-	public IDOMPosition createDomposition1(IDOMModel model, int position,
-			boolean adjust) {
-		try {
-            // TODO: never read
-//			IMovementMediator validator = new InlineEditingNavigationMediator(
-//					new ActionData(ActionData.INLINE_EDIT, null));
-			// 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
-	 */
-	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
-	 */
-	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
-	 */
-	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 position
-	 * @return
-	 */
-	public 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
-	 */
-	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
-	 */
-	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
-	 */
-	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
-	 */
-	public 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
-	 * @return
-	 */
-	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
-	 */
-	public boolean hasWhitespaceNeighbor(Node node) {
-		node = getNeighbor(node, true);
-		if (isWidget(node)) {
-			return false;
-		}
-        node = getFirstLeafChild(node);
-        return isTransparentText(node);
-
-	}
-
-	/**
-	 * @param host
-	 * @return
-	 */
-	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
-	 */
-	public boolean isRedundantWightspaces(Node node) {
-		if (isTransparentText(node) && hasWhitespaceNeighbor(node)) {
-			return true;
-		}
-        return false;
-	}
-
-	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
-	 */
-	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 name
-	 * @param ignoreCase
-	 * @return
-	 */
-	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
-	 * @return
-	 */
-	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;
-		}
-	}
-
-	public 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
-	 */
-	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
-	 */
-	public 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;
-	}
-
-	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;
-	}
-
-	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);
-				}
-
-			}
-		}
-	}
-
-	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 b6e48a0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditValidateUtil.java
+++ /dev/null
@@ -1,381 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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 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
-	 */
-	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;
-		}
-	}
-
-	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
-	 */
-	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
-	 */
-	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
-	 */
-	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;
-		}
-	}
-
-	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;
-		}
-	}
-
-	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;
-		}
-	}
-
-	public 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("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
-	}
-	
-    // TODO: dead?
-//	private static int getContainerLength(Node node) {
-//		if (node.getNodeType() == Node.TEXT_NODE) {
-//			return ((Text) node).getLength();
-//		} else {
-//			if (node.hasChildNodes()) {
-//				return node.getChildNodes().getLength();
-//			} else {
-//				return 0;
-//			}
-//		}
-//	}
-
-    //TODO: dead?
-//	private static void message(String text) {
-//		// internal debug
-//		_logger.info("+++++ message:" + text);
-//	}
-
-	public static boolean isValidForEditing(IDOMPosition pos, boolean forward) {
-//		try {
-			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;
-        // TODO: not sure what was being caught here
-//		} catch (Exception e) {
-//			return false;
-//		}
-	}
-
-	public static boolean isValidForEditing(Node node) {
-		if (EditModelQuery.isChild(IHTMLConstants.TAG_HEAD, node, true)) {
-			return false;
-		}
-		return true;
-	}
-
-	// 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 bbff706..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/IDOMPosition.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.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
-	 */
-	public Node getSibling(boolean forward);
-
-	public Node getNextSiblingNode();
-
-	public Node getPreviousSiblingNode();
-
-	public Node getContainerNode();
-
-	public int getOffset();
-
-	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
-	 */
-	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 0a57462..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
-	 */
-	public Node getReferenceNode();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/ValidatorSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/ValidatorSupport.java
deleted file mode 100644
index 19fda90..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/ValidatorSupport.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.adapters.IBodyInfo;
-import org.eclipse.jst.pagedesigner.adapters.internal.BodyInfo;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
-import org.eclipse.jst.pagedesigner.utils.CommandUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * Simple utility class.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class ValidatorSupport 
-{
-	/**
-	 * Equivalent to checkContainer(position new QName[]{qname}
-	 * 
-	 * @param position
-	 * @param qname
-	 * @return true if the tag identified by qname is found as a parent
-     * of position.
-	 */
-	public static boolean checkContainer(IDOMPosition position, QName qname) {
-		return checkContainer(position, new QName[] { qname });
-	}
-
-	/**
-	 * Check for any of the containers listed in qname starting from qname and working
-	 * up the DOM parent chain.
-	 * 
-	 * @param position
-	 * @param qname
-	 * @return true if one of the tags identified by qname is found as a parent
-	 * of position.
-	 */
-	public static boolean checkContainer(IDOMPosition position, QName qname[]) {
-		Node node = position.getContainerNode();
-		while (node != null) {
-			if (node instanceof Text) {
-				node = node.getParentNode();
-				continue;
-			}
-			if (node instanceof Element) {
-				Element ele = (Element) node;
-				String url = CMUtil.getElementNamespaceURI(ele);
-				String tag = ele.getLocalName();
-
-				for (int i = 0; i < qname.length; i++) {
-					if (tag.equalsIgnoreCase(qname[i].getLocalPart())) {
-						if (url == null) {
-							// this means something wrong. To be error tolerant,
-							// we treat it
-							// as if url is same
-							return true;
-						} else if (url.equalsIgnoreCase(qname[i].getNamespaceURI())) {
-							return true;
-						}
-					}
-				}
-
-				node = node.getParentNode();
-				continue;
-			}
-			break;
-		}
-		return false;
-	}
-
-	/**
-	 * @param position
-	 * @param container
-	 * @param customizationData 
-	 * @return the new dom position for the inserted container or null if could
-	 * not insert
-	 */
-	public static IDOMPosition insertContainer(IDOMPosition position,
-			QName container, IAdaptable customizationData) {
-		final TaglibPaletteDrawer category = 
-		    PaletteItemManager.getCurrentInstance().findCategoryByURI
-		        (container.getNamespaceURI());
-		if (category != null){
-			final TagToolPaletteEntry tagItem = 
-			    category.getTagPaletteEntryByTagName(container.getLocalPart());
-			final IDOMModel model = 
-			    ((IDOMNode) position.getContainerNode()).getModel();
-			final Element form = CommandUtil.excuteInsertion
-			    (tagItem, model, position, customizationData);
-			if (form != null) {
-				DOMPosition pos = new DOMPosition(form, 0);
-				return pos;
-			}
-		}
-        return null;
-	}
-
-	/**
-	 * @return the body info
-	 */
-	public static IBodyInfo getBodyInfo() {
-	    //TODO: change this to be meta-data driven.
-		return BodyInfo.getInstance();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/ColStructure.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/ColStructure.java
deleted file mode 100644
index b2495a8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/ColStructure.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.dom.html;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ColStructure implements Comparable {
-	private int _column;
-
-	private int _colSpan;
-
-	public ColStructure(int column, int colSpan) {
-		this._column = column;
-		this._colSpan = colSpan;
-	}
-
-	public int getColSpan() {
-		return _colSpan;
-	}
-
-	public void setColSpan(int colSpan) {
-		this._colSpan = colSpan;
-	}
-
-	public int getColumn() {
-		return _column;
-	}
-
-	public void setColumn(int column) {
-		this._column = 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 4edf306..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/TableUtil.java
+++ /dev/null
@@ -1,530 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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
-	 */
-	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
-	 */
-	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
-	 */
-	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
-	 */
-	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
-	 */
-	public List[] getTrCellLists() {
-		return this._trCellLists;
-	}
-
-	/**
-	 * calculate row and column index for tr or td/th
-	 * 
-	 * @param element
-	 *            tr or td/th
-	 * @return
-	 */
-	public TableChildElementPosition getPosition(Node node) {
-		TableChildElementPosition position = new TableChildElementPosition();
-		String tagName = node.getLocalName();
-		if (IHTMLConstants.TAG_TR.equalsIgnoreCase(tagName)) {
-			List list = new ArrayList();
-			getTrElements(this._table, list);
-			for (int i = 0, size = list.size(); i < size; i++) {
-				Element tr = (Element) list.get(i);
-				if (tr == node) {
-					position.setRowIndex(i);
-					break;
-				}
-			}
-		} else if (IHTMLConstants.TAG_TD.equalsIgnoreCase(tagName)
-				|| IHTMLConstants.TAG_TH.equalsIgnoreCase(tagName)) {
-			Element tr = (Element) node.getParentNode();
-			TableChildElementPosition pos = getPosition(tr);
-			position.setRowIndex(pos.getRowIndex());
-			List[] lists = getTrCellLists();
-			List list = lists[pos.getRowIndex()];
-			for (int i = 0, size = list.size(); i < size; i++) {
-				Element td = (Element) list.get(i);
-				if (td == node) {
-					position.setColumnIndex(i);
-					break;
-				}
-			}
-		} else {
-			boolean hasTDParent = false;
-			Node childBackup = node;
-			while (!IHTMLConstants.TAG_TABLE.equalsIgnoreCase(childBackup
-					.getParentNode().getLocalName())) {
-				childBackup = childBackup.getParentNode();
-				String localName = childBackup.getLocalName();
-				if (IHTMLConstants.TAG_TD.equalsIgnoreCase(localName)
-						|| IHTMLConstants.TAG_TH.equalsIgnoreCase(localName)) {
-					hasTDParent = true;
-					break;
-				}
-			}
-			if (hasTDParent) {
-				position = getPosition(childBackup);
-			}
-		}
-		return position;
-	}
-
-	/**
-	 * get column count
-	 * 
-	 * @return
-	 */
-	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
-	 */
-	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
-	 */
-	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
-	 */
-	public List getColumnCells(int columnIndex) {
-		List list = new ArrayList();
-
-		List[] lists = this._trCellLists;
-		for (int i = 0; i < lists.length; i++) {
-			List tempList = lists[i];
-			if (tempList.size() <= columnIndex) {
-				continue;
-			}
-			list.add(tempList.get(columnIndex));
-		}
-		return list;
-	}
-
-	/**
-	 * count max row span in the tr
-	 * 
-	 * @param tr
-	 * @return
-	 */
-	private static int countMaxRowSpan(Element tr) {
-		List list = DOMUtil.getElementChildren(tr);
-		int max = countMaxValue(list, IHTMLConstants.ATTR_ROWSPAN);
-		return max;
-	}
-
-	/**
-	 * count max attr value
-	 * 
-	 * @param list
-	 * @param attr
-	 * @return
-	 */
-	private static int countMaxValue(List list, String attr) {
-		int max = 1;
-		Iterator itr = list.iterator();
-		while (itr.hasNext()) {
-			Element ele = (Element) itr.next();
-			int value = DOMUtil.getIntAttributeIgnoreCase(ele, attr, 1);
-			if (value > max) {
-				max = value;
-			}
-		}
-		return max;
-	}
-
-	/**
-	 * count max col span in a column
-	 * 
-	 * @param list
-	 * @return
-	 */
-	private int countMaxColSpan(List list) {
-		int max = countMaxValue(list, IHTMLConstants.ATTR_COLSPAN);
-		return max;
-	}
-
-	/**
-	 * get fake element to fill tr cell
-	 * 
-	 * @return
-	 */
-	private Element getFakeElement() {
-		if (_fakeCell != null) {
-			return _fakeCell;
-		}
-		_fakeCell = this._table.getOwnerDocument().createElement("fake");
-		return _fakeCell;
-	}
-
-	/**
-	 * initial every tr cells according to th and td under each tr element
-	 * 
-	 * @param trList
-	 * @return
-	 */
-	private List[] initialTrCells(List trList) {
-		int size = trList.size();
-		List[] lists = new ArrayList[size];
-
-		if (trList != null) {
-			for (int i = 0, n = trList.size(); i < n; i++) {
-				lists[i] = new ArrayList();
-				Element tr = (Element) trList.get(i);
-				List domCells = DOMUtil.getElementChildren(tr);
-				Iterator itr = domCells.iterator();
-				while (itr.hasNext()) {
-					Element cell = (Element) itr.next();
-					lists[i].add(cell);
-					int colSpan = DOMUtil.getIntAttributeIgnoreCase(cell,
-							IHTMLConstants.ATTR_COLSPAN, 1);
-					while (--colSpan > 0) {
-						Element fakeElement = getFakeElement();
-						lists[i].add(fakeElement);
-					}
-				}
-			}
-
-		}
-
-		return lists;
-
-	}
-
-	/**
-	 * after initial tr cells,fill tr with fake cells if necessary.
-	 * 
-	 * @return
-	 */
-	private List[] fillTrCells() {
-		List list = new ArrayList();
-		getTrElements(this._table, list);
-
-		List[] lists = initialTrCells(list);
-		int size = lists.length;
-
-		int headRows = countSectionRows(this._table, IHTMLConstants.TAG_THEAD);
-		if (headRows > 0) {
-			List[] headList = new ArrayList[headRows];
-			for (int i = 0; i < headRows; i++) {
-				headList[i] = lists[i];
-			}
-			fillSectionTrCells(headList);
-		}
-
-		int footRows = countSectionRows(this._table, IHTMLConstants.TAG_TFOOT);
-		if (footRows > 0) {
-			List[] footList = new ArrayList[footRows];
-			for (int i = 0; i < footRows; i++) {
-				footList[i] = lists[headRows + i];
-			}
-			fillSectionTrCells(footList);
-		}
-
-		int bodyRows = size - headRows - footRows;
-		if (bodyRows > 0) {
-			int bodyCount = 1;
-			int k = 0;
-			List bodys = new ArrayList();
-			Element tr = (Element) list.get(headRows + footRows);
-			Node node = tr.getParentNode();
-			for (int i = 1; i < bodyRows; i++) {
-				Element tempTr = (Element) list.get(headRows + footRows + i);
-				if (tempTr.getParentNode() != node) {
-					node = tempTr.getParentNode();
-					bodys.add(new Integer(i - k));
-					k = i;
-					bodyCount++;
-				}
-			}
-			bodys.add(new Integer(bodyRows - k));
-
-			for (int j = 0; j < bodyCount; j++) {
-				int num = ((Integer) bodys.get(j)).intValue();
-				List[] bodyList = new ArrayList[num];
-				int m = headRows + footRows;
-
-				for (int i = 0; i < num; i++) {
-					bodyList[i] = lists[m + i];
-				}
-				fillSectionTrCells(bodyList);
-				m = m + num;
-			}
-
-		}
-
-		return lists;
-	}
-
-	/**
-	 * fill tr cells under each table section,like THEAD,TFOOT,TBODY.
-	 * 
-	 * @param lists
-	 */
-	private void fillSectionTrCells(List[] lists) {
-		Element cell = null;
-
-		if (lists != null) {
-			for (int i = 1, size = lists.length; i < size; i++) {
-				List insertPoints = new ArrayList();
-
-				for (int j = 0; j < i; j++) {
-					List list = lists[j];
-					for (int column = 0; column < list.size(); column++) {
-						cell = (Element) list.get(column);
-						if (cell.getTagName().equalsIgnoreCase("fake")) {
-							continue;
-						}
-						int rowSpan = DOMUtil.getIntAttributeIgnoreCase(cell,
-								IHTMLConstants.ATTR_ROWSPAN, 1);
-						if (rowSpan > (i - j)) {
-							int colSpan = DOMUtil.getIntAttributeIgnoreCase(
-									cell, IHTMLConstants.ATTR_COLSPAN, 1);
-							insertPoints.add(new ColStructure(column, colSpan));
-						}
-					}
-				}
-				// there are fake column cell need to be inserted into this tr
-				if (insertPoints.size() > 0) {
-					Collections.sort(insertPoints);
-					List trCells = lists[i];
-
-					Iterator itr = insertPoints.iterator();
-					while (itr.hasNext()) {
-						ColStructure cls = (ColStructure) itr.next();
-						int loop = cls.getColSpan();
-						int column = cls.getColumn();
-						while (loop-- != 0) {
-							trCells.add(column++, getFakeElement());
-						}
-
-					}
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DTManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DTManager.java
deleted file mode 100644
index 5db2db9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DTManager.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager;
-
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.converter.ConverterFactoryRegistry;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.internal.DTTagConverterFactory;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-
-/**
- * DTManager is the top-level entry point for design-time (DT) services, such
- * as tag converters and design-time information.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTManager {
-
-	private static DTManager instance;
-	private IDTInfoFactory dtInfoFactory;
-
-	private DTManager() {
-        // no external instantiation
-	}
-
-	/**
-	 * Gets the singleton DTManager instance.
-	 * 
-	 * @return The singleton DTManager instance.
-	 */
-	public static synchronized DTManager getInstance() {
-		if (instance == null) {
-			instance = new DTManager();
-		}
-		return instance;
-	}
-
-	/**
-	 * Gets an ITagConverter instance for the specified Element and mode.
-	 * 
-	 * @param element Element instance for which to locate and return an
-	 * ITagConverter instance.
-	 * @param mode Mode flag (use IConverterFactory constants).
-	 * @param document Target IDOMDocument instance.
-	 * @return An ITagConverter instance for the specified Element and mode.
-	 */
-	public ITagConverter getTagConverter(Element element, int mode, IDOMDocument document) {
-		ITagConverter tagConverter = null;
-		String nsURI = CMUtil.getElementNamespaceURI(element);
-		//try MD-driven approach
-		IConverterFactory tagConverterFactory = getTagConverterFactory(nsURI);
-		if (tagConverterFactory != null) {
-			tagConverter = tagConverterFactory.createConverter(element, mode);
-			if (tagConverter != null) {
-				tagConverter.setDestDocument(document);
-			} else {
-				//fallback to contributed (non-MD-driven) approach
-				tagConverter = ConverterFactoryRegistry.getInstance().createTagConverter(element, mode, document);
-			}
-		}
-		return tagConverter;
-	}
-
-	/**
-	 * Gets an IConverterFactory instance for the specified namespace URI.
-	 * 
-	 * @param nsURI Namespace URI.
-	 * @return An IConverterFactory instance for the specified namespace URI.
-	 */
-	protected IConverterFactory getTagConverterFactory(String nsURI) {
-		//TODO: future - expand to first look for registered factories
-		return new DTTagConverterFactory();
-	}
-
-	/**
-	 * Gets an IDTInfo instance for the specified Element.
-	 * 
-	 * @param element Element instance for which to locate and return IDTInfo
-	 * instance.
-	 * @return An IDTInfo instance for the specified Element.
-	 */
-	public IDTInfo getDTInfo(Element element) {
-		IDTInfo dtInfo = null;
-		String nsURI = CMUtil.getElementNamespaceURI(element);
-		IDTInfoFactory dtInfoFactory = getDTInfoFactory(nsURI);
-		if (dtInfoFactory != null) {
-			dtInfo = dtInfoFactory.getDTInfo(element);
-		}
-		return dtInfo;
-	}
-
-	/**
-	 * Gets an IDTInfoFactory instance for the specified namespace URI.
-	 * 
-	 * @param nsURI Namespace URI.
-	 * @return An IDTInfoFactory instance for the specified namespace URI.
-	 */
-	protected IDTInfoFactory getDTInfoFactory(String nsURI) {
-		if (dtInfoFactory == null) {
-			dtInfoFactory = new DefaultDTInfoFactory();
-		}
-		return dtInfoFactory;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfo.java
deleted file mode 100644
index 6d57cfc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfo.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-
-/**
- * Default IDTInfo implementation.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class DefaultDTInfo implements IDTInfo {
-
-	private DTInfo dtInfo = null;
-	private Trait trait = null;
-
-	/**
-	 * Constructs an instance that wraps the specified DTInfo instance.
-	 * 
-	 * @param dtInfo DTInfo (EMF model object) instance.
-	 * @param trait Trait instance that was queried to load this data.
-	 */
-	public DefaultDTInfo(DTInfo dtInfo, Trait trait) {
-		this.dtInfo = dtInfo;
-		this.trait = trait;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.internal.provisional.IDTInfo#getTagConvertInfo()
-	 */
-	public TagConvertInfo getTagConvertInfo() {
-		return dtInfo.getTagConvertInfo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.internal.provisional.IDTInfo#getTagDecorateInfos()
-	 */
-	public List getTagDecorateInfos() {
-		return dtInfo.getTagDecorateInfos();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.internal.provisional.IDTInfo#getTagDecorateInfo(java.lang.String)
-	 */
-	public TagDecorateInfo getTagDecorateInfo(String id) {
-		TagDecorateInfo tdInfo = null;
-		EList tdInfos = dtInfo.getTagDecorateInfos();
-		Iterator itTDInfos = tdInfos.iterator();
-		while (itTDInfos.hasNext()) {
-			TagDecorateInfo curTDInfo = (TagDecorateInfo)itTDInfos.next();
-			if (curTDInfo.getId().equals(id)) {
-				tdInfo = curTDInfo;
-				break;
-			}
-		}
-		return tdInfo;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.internal.provisional.IDTInfo#getTrait()
-	 */
-	public Trait getTrait() {
-		return trait;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfoFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfoFactory.java
deleted file mode 100644
index 1a37ec6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfoFactory.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-
-/**
- * Default IDTInfoFactory implementation.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class DefaultDTInfoFactory implements IDTInfoFactory {
-
-	/**
-	 * Key (in metadata) of IDTInfo trait.
-	 */
-	public static final String DTINFO_TRAIT_KEY = "dt-info";
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.internal.provisional.IDTInfoFactory#getDTInfo(org.w3c.dom.Element)
-	 */
-	public IDTInfo getDTInfo(Element element) {
-		IDTInfo dtInfo = null;
-		String nsURI = CMUtil.getElementNamespaceURI(element);
-		IProject project = getProject(element);
-		if (project != null) {
-			ITaglibDomainMetaDataModelContext context = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, nsURI);
-			if (context != null) {
-				Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(context, element.getLocalName(), DTINFO_TRAIT_KEY);
-				if (trait != null) {
-					DTInfo dtInfoModelObject = (DTInfo)trait.getValue();
-					if (dtInfoModelObject != null) {
-						dtInfo = new DefaultDTInfo(dtInfoModelObject, trait);
-					}
-				}
-			}
-		}
-		return dtInfo;
-	}
-
-	/**
-	 * Gets the IProject instance that contains the model of the specified
-	 * Element.
-	 * 
-	 * @param element Element instance.
-	 * @return IProject instance that contains the model of the specified
-	 * Element.
-	 */
-	protected IProject getProject(Element element) {
-		IProject project = null;
-		if (element instanceof IDOMNode) {
-			IDOMModel model = ((IDOMNode)element).getModel();
-			if (model != null) {
-				project = StructuredModelUtil.getProjectFor(model);
-			}
-		}
-		return project;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfo.java
deleted file mode 100644
index 9ce9e07..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfo.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-
-/**
- * Encapsulates design-time (DT) information.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IDTInfo {
-
-	/**
-	 * Gets the encapsulated TagConvertInfo instance.
-	 * 
-	 * @return TagConvertInfo instance.
-	 */
-	public TagConvertInfo getTagConvertInfo();
-
-	/**
-	 * Gets the collection of encapsulated TagDecorateInfo instances.
-	 * 
-	 * @return Collection of TagDecorateInfo instances.
-	 */
-	public List getTagDecorateInfos();
-
-	/**
-	 * Gets an encapsulated TagDecorateInfo instance matching specified ID.
-	 * 
-	 * @param id ID of desired TagDecorateInfo instance.
-	 * @return TagDecorateInfo instance matching specified ID.
-	 */
-	public TagDecorateInfo getTagDecorateInfo(String id);
-
-	/**
-	 * Gets the Trait instance that was queried to load the metadata.
-	 * 
-	 * @return Trait instance that was queried to load the metadata.
-	 */
-	public Trait getTrait();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfoFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfoFactory.java
deleted file mode 100644
index 80f3b6d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfoFactory.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager;
-
-import org.w3c.dom.Element;
-
-/**
- * Factory that provides IDTInfo instances.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IDTInfoFactory {
-
-	/**
-	 * Gets an IDTInfo instance for the specified Element.
-	 * 
-	 * @param element Element instance for which to locate and return IDTInfo
-	 * instance.
-	 * @return An IDTInfo instance for the specified Element.
-	 */
-	public IDTInfo getDTInfo(Element element);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/AbstractTagConverterContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/AbstractTagConverterContext.java
deleted file mode 100644
index b37242b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/AbstractTagConverterContext.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * Abstract ITagConverter implementation of ITagConverterContext.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class AbstractTagConverterContext implements ITagConverterContext {
-
-	/**
-	 * ITagConverter instance.
-	 */
-	protected ITagConverter tagConverter;
-
-	/**
-	 * Instantiates an instance for the specified ITagConverter instance. 
-	 * @param tagConverter ITagConverter instance.
-	 */
-	public AbstractTagConverterContext(ITagConverter tagConverter) {
-		this.tagConverter = tagConverter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#addChild(org.w3c.dom.Node, org.eclipse.jst.pagedesigner.converter.ConvertPosition)
-	 */
-	public abstract void addChild(Node childNode, ConvertPosition position);
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#copyChildren(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public abstract void copyChildren(Element srcElement, Element destElement);
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#createElement(java.lang.String)
-	 */
-	public abstract Element createElement(String tag);
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#createText(java.lang.String)
-	 */
-	public abstract Text createText(String content);
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#getHostElement()
-	 */
-	public Element getHostElement() {
-		Element element = null;
-		if (tagConverter != null) {
-			element = tagConverter.getHostElement(); 
-		}
-		return element;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/IOutputRenderer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/IOutputRenderer.java
deleted file mode 100644
index 30263d7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/IOutputRenderer.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * Produces output rendering for ITagConverter instances.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IOutputRenderer {
-
-	/**
-	 * Uses the ITagConverterContext argument to produce output rendering.
-	 * 
-	 * @param tagConverterContext ITagConverterContext instance providing
-	 * ITagConverter-specific context and functionality.
-	 * @return Element instance representing top Element in resulting output
-	 * tree.
-	 * 
-     * TODO: let's parameterize the return type either with a generic type
-     * or with Object so that sub-classes can co-vary
-	 */
-	public Element render(ITagConverterContext tagConverterContext);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterContext.java
deleted file mode 100644
index b857c4e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterContext.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * Represents ITagConverter-specific context and functionality.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface ITagConverterContext {
-
-	/**
-	 * Gets ITagConverter instance's host Element instance.
-	 * 
-	 * @return ITagConverter instance's host Element instance.
-	 */
-	public Element getHostElement();
-
-	/**
-	 * Creates an Element instance to be used in ITagConverter's Document
-	 * instance.
-	 * 
-	 * @param tag Name of element to be created.
-	 * @return Element instance to be used in ITagConverter's Document
-	 * instance.
-	 */
-	public Element createElement(String tag);
-
-	/**
-	 * Creates a Text node instance to be used in ITagConverter's Document
-	 * instance.
-	 * 
-	 * @param content Textual content of the created text node.
-	 * @return Text node instance to be used in ITagConverter's Document
-	 * instance.
-	 */
-	public Text createText(String content);
-
-	/**
-	 * Adds a child Node instance to ITagConverter's collection of Nodes
-	 * requiring subsequent processing.
-	 * 
-	 * @param childNode Child Node instance requiring subsequent processing.
-	 * @param position ConvertPosition instance describing child Node
-	 * instance's position, relative to another Node instance.
-	 */
-	public void addChild(Node childNode, ConvertPosition position);
-
-	/**
-	 * Add all child Element instances of srcElement to ITagConverter's
-	 * collection of Nodes requiring subsequent processing.
-	 * 
-	 * @param srcElement Source Element instance from which child Elements are
-	 * copied.
-	 * @param destElement Destination Element instance to which child Elements
-	 * will be relative.
-	 */
-	public void copyChildren(Element srcElement, Element destElement);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterDecorator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterDecorator.java
deleted file mode 100644
index 713245f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterDecorator.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-
-/**
- * Decorates an ITagConverter instance as appropriate (generally
- * client-specific decoration performed after tag conversion).
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface ITagConverterDecorator {
-
-	/**
-	 * Decorates the ITagConverter instance as appropriate.
-	 * 
-	 * @param tagConverter ITagConverter instance to be decorated.
-	 */
-	public void decorate(ITagConverter tagConverter);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformOperation.java
deleted file mode 100644
index dfb847a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformOperation.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import java.util.List;
-
-import org.w3c.dom.Element;
-
-/**
- * Defines an operation used during transformation of input Element instances
- * to output Element instances.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- * 
- * TODO: as with ITransformer, I'd like to consider
- * ITransfomOperation<SRC, RESULT>
- */
-public interface ITransformOperation {
-
-	/**
-	 * Transforms an input element instance to an output Element instance.
-	 * 
-	 * @param srcElement Original input Element instance.
-	 * @param curElement Current Element instance.
-	 * @return Resulting transformed Element instance.
-	 */
-	public Element transform(Element srcElement, Element curElement);
-
-	/**
-	 * Sets the ITagConverterContext instance allowing access to context and
-	 * functionality of the current ITagConverter instance.
-	 * 
-	 * @param tagConverterContext ITagConverterContext instance allowing access
-	 * to context and functionality of the current ITagConverter instance.
-     * 
-	 */
-	public void setTagConverterContext(ITagConverterContext tagConverterContext);
-
-	/**
-	 * Appends a child ITransformOperation instance.
-	 * 
-	 * @param operation Child ITransformOperation instance to be appended.
-	 */
-	public void appendChildOperation(ITransformOperation operation);
-
-	/**
-	 * Gets collection of child ITransformOperation instances.
-	 * 
-	 * @return Collection of child ITransformOperation instances (may be null).
-	 */
-	public List getChildOperations();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformer.java
deleted file mode 100644
index 49e99f2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformer.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * Transforms an original input Element instance to an output Element instance
- * by invoking a collection of ITransformOperation instances.  
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface ITransformer {
-
-	/**
-	 * Appends an ITransformOperation instance to the collection.
-	 * 
-	 * @param operation ITransformOperation instance to be appended.
-     * API: does this need to be on the interface or could it be pushed
-     * into the instance constructor (i.e. factory).
-	 */
-	public void appendTransformOperation(ITransformOperation operation);
-
-	/**
-	 * Transforms an original input Element instance to an output Element
-	 * instance, typically by invoking each ITransformOperation instance in
-	 * this instance's collection.
-	 * 
-	 * @param srcElement Original input Element instance.
-	 * @return Transformed output Element instance.
-	 * 
-     * TODO: I'd like to consider templating the generic ITransformer
-     * interface to ITransformer<I,O> and making this a normative instance
-     * case of ITransformer<Element, Element>
-	 */
-	public Element transform(Element srcElement);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTHTMLOutputRenderer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTHTMLOutputRenderer.java
deleted file mode 100644
index c8454e6..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, dtInfo.getTrait());
-			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, dtInfo.getTrait());
-			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 a5cb784..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverter.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.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 Map childVisualPositionMap = Collections.EMPTY_MAP;
-	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 HashMap();
-		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() {
-		if (visualImage != null) {
-			visualImage.dispose();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#getChildModeList()
-	 */
-	public List getChildModeList() {
-		return childNodeList;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#getChildVisualPosition(org.w3c.dom.Node)
-	 */
-	public ConvertPosition getChildVisualPosition(Node childModel) {
-		return (ConvertPosition)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 = visualImageDescriptor.createImage();
-		}
-		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);
-	}
-
-}
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 f292dbd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterDecorator.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.IImageDescriptorProvider;
-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";
-	private static final String DECORATE_INFO_ID_PREVIEW = "vpd-decorate-preview";
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.internal.provisional.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");
-		}
-		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());
-				}
-				if (tdInfo.isSetNonVisualChildElements()) {
-					setNonVisualChildElements(dtTagConverter, srcElement);
-				}
-				dtTagConverter.setWidget(tdInfo.isWidget());
-				dtTagConverter.setMinHeight(tdInfo.getMinHeight());
-				dtTagConverter.setMinWidth(tdInfo.getMinWidth());
-				ResolveAttributeValue resAttrValue = tdInfo.getResolveAttributeValue();
-				if (resAttrValue != null) {
-					String attributeName = resAttrValue.getAttributeName();
-					if (attributeName != null && attributeName.length() > 0) {
-						resolveAttributeValue(dtTagConverter.getResultElement(), attributeName);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Creates a visual representation result Element for an unknown tag.
-	 * 
-	 * @param dtTagConverter DTTagConverter instance.
-	 */
-	protected void createUnknownTagRepresentation(DTTagConverter dtTagConverter) {
-		Element element = dtTagConverter.createElement("span");
-		element.setAttribute("style", "color:red;font-weight:bold;");
-		Text text = dtTagConverter.createText("<" + dtTagConverter.getHostElement().getTagName() + "/>");
-		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.
-	 */
-	protected void resolveChildText(Element srcElement) {
-		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 = (String)PageExpressionContext.getCurrent().evaluateExpression(textNodeValue, String.class, null);
-						if (!textNodeValue.equals(newTextNodeValue)) {
-							textNode.setNodeValue(newTextNodeValue);
-						}
-					} catch(Exception ex) {
-						//ignore - could not resolve, do not change existing value
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Performs simple EL resolution for the value of the specified attribute
-	 * of the specified Element.
-	 * 
-	 * @param srcElement Source Element instance.
-	 * @param attributeName Name of attribute for which the value should be
-	 * resolved.
-	 */
-	protected void resolveAttributeValue(Element srcElement, String attributeName) {
-		if (srcElement != null) {
-			String oldAttributeValue = srcElement.getAttribute(attributeName);
-			if (oldAttributeValue != null && oldAttributeValue.length() > 0) {
-				try {
-					String newAttributeValue = (String)PageExpressionContext.getCurrent().evaluateExpression(oldAttributeValue, String.class, null);
-					if (!oldAttributeValue.equals(newAttributeValue)) {
-						srcElement.setAttribute(attributeName, newAttributeValue);
-					}
-				} catch(Exception ex) {
-					//ignore - could not resolve, do not change existing value
-				}
-			}
-		}
-	}
-
-	/**
-	 * 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 plugin.
-	 */
-	protected void setNonVisual(DTTagConverter dtTagConverter, IDTInfo dtInfo, String imagePath) {
-		dtTagConverter.setVisualByHTML(false);
-		if (imagePath != null && imagePath.length() > 0) {
-			Trait trait = dtInfo.getTrait();
-			IImageDescriptorProvider imgDescProvider = (IImageDescriptorProvider)trait.getSourceModelProvider().getAdapter(IImageDescriptorProvider.class);
-			if (imgDescProvider != null) {
-				ImageDescriptor imageDescriptor = imgDescProvider.getImageDescriptor(imagePath);
-				dtTagConverter.setVisualImageDescriptor(imageDescriptor);
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterFactory.java
deleted file mode 100644
index df40831..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterFactory.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.dtmanager.DTManager;
-import org.eclipse.jst.pagedesigner.dtmanager.IDTInfo;
-import org.w3c.dom.Element;
-
-/**
- * Produces DTTagConverter instances.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTTagConverterFactory implements IConverterFactory {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#createConverter(org.w3c.dom.Element, int)
-	 */
-	public ITagConverter createConverter(Element element, int mode) {
-		ITagConverter tagConverter = null;
-		IDTInfo dtInfo = DTManager.getInstance().getDTInfo(element);
-		if (dtInfo != null) {
-			tagConverter = new DTTagConverter(element);
-			tagConverter.setMode(mode);
-		}
-		return tagConverter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#getSupportedURI()
-	 */
-	public String getSupportedURI() {
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DefaultTransformer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DefaultTransformer.java
deleted file mode 100644
index 4e6ce62..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DefaultTransformer.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformer;
-import org.w3c.dom.Element;
-
-/**
- * Default ITransformer implementation.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DefaultTransformer implements ITransformer {
-
-	private ITagConverterContext tagConverterContext;
-    // synchronization occurs on this object, so it must never
-    // be allowed to be null
-	private final Collection transformOperations = new ArrayList();
-
-	/**
-	 * Instantiates an instance.
-	 * 
-	 * @param context ITagConverterContext instance.
-	 */
-	public DefaultTransformer(ITagConverterContext context) {
-		this.tagConverterContext = context;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformer#appendTransformOperation(org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation)
-	 */
-	public void appendTransformOperation(ITransformOperation operation) {
-		synchronized(transformOperations) {
-			if (operation != null) {
-				operation.setTagConverterContext(tagConverterContext);
-				transformOperations.add(operation);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.internal.provisional.ITransformer#transform(org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement) {
-		Element curElement = null;
-		if (srcElement != null) {
-			synchronized(transformOperations) {
-				if (transformOperations.size() > 0) {
-					curElement = srcElement;
-					Iterator itOperations = transformOperations.iterator();
-					while (itOperations.hasNext()) {
-						ITransformOperation operation = (ITransformOperation)itOperations.next();
-						curElement = operation.transform(srcElement, curElement);
-					}
-				}
-			}
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/AbstractTransformOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/AbstractTransformOperation.java
deleted file mode 100644
index 48f1a80..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/AbstractTransformOperation.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.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;
-
-	/*
-	 * (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 (curNode != 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 363dc58..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/TransformOperationFactory.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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 org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.IClassLoaderProvider;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.AppendChildElementOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.AppendChildTextFromXPathOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.AppendChildTextOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.ConvertAttributeToTextOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CopyAllAttributesOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CopyAttributeOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CopyChildrenOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CreateAttributeFromXPathOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CreateAttributeOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CreateElementOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.IfNotOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.IfOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.IterateOverElementsOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.MakeParentElementCurrentOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.RemoveAttributeOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.RenameAttributeOperation;
-
-/**
- * Factory responsible for producing ITransformOperation instances from a known
- * set.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class TransformOperationFactory {
-
-	/**
-	 * AppendChildElementOperation
-	 */
-	public static final String OP_AppendChildElementOperation = "AppendChildElementOperation";
-	/**
-	 * AppendChildTextFromXPathOperation
-	 */
-	public static final String OP_AppendChildTextFromXPathOperation = "AppendChildTextFromXPathOperation";
-	/**
-	 * AppendChildTextOperation
-	 */
-	public static final String OP_AppendChildTextOperation = "AppendChildTextOperation";
-	/**
-	 * ConvertAttributeToTextOperation
-	 */
-	public static final String OP_ConvertAttributeToTextOperation = "ConvertAttributeToTextOperation";
-	/**
-	 * CopyAllAttributesOperation
-	 */
-	public static final String OP_CopyAllAttributesOperation = "CopyAllAttributesOperation";
-	/**
-	 * CopyAttributeOperation
-	 */
-	public static final String OP_CopyAttributeOperation = "CopyAttributeOperation";
-	/**
-	 * CopyChildrenOperation
-	 */
-	public static final String OP_CopyChildrenOperation = "CopyChildrenOperation";
-	/**
-	 * CreateAttributeFromXPathOperation
-	 */
-	public static final String OP_CreateAttributeFromXPathOperation = "CreateAttributeFromXPathOperation";
-	/**
-	 * CreateAttributeOperation
-	 */
-	public static final String OP_CreateAttributeOperation = "CreateAttributeOperation";
-	/**
-	 * CreateElementOperation
-	 */
-	public static final String OP_CreateElementOperation = "CreateElementOperation";
-	/**
-	 * CustomTransformOperation
-	 */
-	public static final String OP_CustomTransformOperation = "CustomTransformOperation";
-	/**
-	 * IfNotOperation
-	 */
-	public static final String OP_IfNotOperation = "IfNotOperation";
-	/**
-	 * IfOperation
-	 */
-	public static final String OP_IfOperation = "IfOperation";
-	/**
-	 * IterateOverElementsOperation
-	 */
-	public static final String OP_IterateOverElementsOperation = "IterateOverElementsOperation";
-	/**
-	 * MakeParentElementCurrentOperation
-	 */
-	public static final String OP_MakeParentElementCurrentOperation = "MakeParentElementCurrentOperation";
-	/**
-	 * RemoveAttributeOperation
-	 */
-	public static final String OP_RemoveAttributeOperation = "RemoveAttributeOperation";
-	/**
-	 * RenameAttributeOperation
-	 */
-	public static final String OP_RenameAttributeOperation = "RenameAttributeOperation";
-
-	private static TransformOperationFactory instance;
-
-	private Logger log = PDPlugin.getLogger(TransformOperationFactory.class);
-
-	/**
-	 * Instaniates an instance.
-	 */
-	private TransformOperationFactory() {
-		//no external instantiation
-	}
-
-	/**
-	 * 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 Operation ID.
-	 * @param params Parameter array.
-	 * @return ITransformOperation instance (may be null).
-	 */
-	public ITransformOperation getTransformOperation(String opID, String[] params) {
-		return getTransformOperation(opID, params, null);
-	}
-
-	/**
-	 * Gets an ITransformOperation instance for the specified operation ID and
-	 * parameters.
-	 * 
-	 * @param opID Operation ID.
-	 * @param params Parameter array.
-	 * @param trait Trait instance used for classloading of custom operations.
-	 * @return ITransformOperation instance (may be null).
-	 */
-	public ITransformOperation getTransformOperation(String opID, String[] params, Trait trait) {
-		ITransformOperation operation = null;
-		if (opID.equals(OP_AppendChildElementOperation)) {
-			if (params.length < 1) {
-				log.error("Warning.TransformOperationFactory.TooFewParameters", opID);
-			} else if (params.length < 2) {
-				String elementName = params[0];
-				operation = new AppendChildElementOperation(elementName);
-			} else {
-				String elementName = params[0];
-				boolean makeChildCurrent = Boolean.valueOf(params[1]).booleanValue();
-				operation = new AppendChildElementOperation(elementName, makeChildCurrent);
-			}
-		} else if (opID.equals(OP_AppendChildTextFromXPathOperation)) {
-			if (params.length < 1) {
-				log.error("Warning.TransformOperationFactory.TooFewParameters", opID);
-			} else {
-				String xPathExpression = params[0];
-				operation = new AppendChildTextFromXPathOperation(xPathExpression);
-			}
-		} else if (opID.equals(OP_AppendChildTextOperation)) {
-			if (params.length < 1) {
-				log.error("Warning.TransformOperationFactory.TooFewParameters", opID);
-			} else {
-				String content = params[0];
-				operation = new AppendChildTextOperation(content);
-			}
-		} else if (opID.equals(OP_ConvertAttributeToTextOperation)) {
-			if (params.length < 1) {
-				log.error("Warning.TransformOperationFactory.TooFewParameters", opID);
-			} else if (params.length < 2) {
-				String attrName = params[0];
-				operation = new ConvertAttributeToTextOperation(attrName);
-			} else {
-				String attrName = params[0];
-				boolean removeAttr = Boolean.valueOf(params[1]).booleanValue();
-				operation = new ConvertAttributeToTextOperation(attrName, removeAttr);
-			}
-		} else if (opID.equals(OP_CopyAllAttributesOperation)) {
-			operation = new CopyAllAttributesOperation();
-		} else if (opID.equals(OP_CopyAttributeOperation)) {
-			if (params.length < 1) {
-				log.error("Warning.TransformOperationFactory.TooFewParameters", opID);
-			} else if (params.length < 3) {
-				String attrName = params[0];
-				operation = new CopyAttributeOperation(attrName);
-			} else {
-				String attrName = params[0];
-				boolean create = Boolean.valueOf(params[1]).booleanValue();
-				String newAttrValue = params[2];
-				operation = new CopyAttributeOperation(attrName, create, newAttrValue);
-			}
-		} else if (opID.equals(OP_CopyChildrenOperation)) {
-			operation = new CopyChildrenOperation();
-		} else if (opID.equals(OP_CreateAttributeFromXPathOperation)) {
-			if (params.length < 2) {
-				log.error("Warning.TransformOperationFactory.TooFewParameters", opID);
-			} else {
-				String attrName = params[0];
-				String xPathExpression = params[1];
-				operation = new CreateAttributeFromXPathOperation(attrName, xPathExpression);
-			}
-		} else if (opID.equals(OP_CreateAttributeOperation)) {
-			if (params.length < 2) {
-				log.error("Warning.TransformOperationFactory.TooFewParameters", opID);
-			} else {
-				String attrName = params[0];
-				String attrValue = params[1];
-				operation = new CreateAttributeOperation(attrName, attrValue);
-			}
-		} else if (opID.equals(OP_CreateElementOperation)) {
-			if (params.length < 1) {
-				log.error("Warning.TransformOperationFactory.TooFewParameters", opID);
-			} else {
-				String elementName = params[0];
-				operation = new CreateElementOperation(elementName);
-			}
-		} else if (opID.equals(OP_CustomTransformOperation)) {
-			if (params.length < 1) {
-				log.error("Warning.TransformOperationFactory.TooFewParameters", opID);
-			} else {
-				String className = params[0];
-				if (trait == null) {
-					log.error("Warning.TransformOperationFactory.ClassNotFound", className);
-				} else {
-					try {
-						IClassLoaderProvider classLoaderProvider = (IClassLoaderProvider)trait.getSourceModelProvider().getAdapter(IClassLoaderProvider.class);
-						if (classLoaderProvider != null) {
-							Class opClass = classLoaderProvider.loadClass(className);
-							if (opClass != null) {
-								Object opObject = opClass.newInstance();
-								if (opObject instanceof ITransformOperation) {
-									operation = (ITransformOperation)opObject;
-								} else {
-									log.error("Warning.TransformOperationFactory.NotITransformOperation", className);
-								}
-							} else {
-								log.error("Warning.TransformOperationFactory.ClassNotFound", className);
-							}
-						}
-					} catch(IllegalAccessException iae) {
-						log.error("Warning.TransformOperationFactory.IllegalAccess", className, iae);
-					} catch(InstantiationException ie) {
-						log.error("Warning.TransformOperationFactory.Instantiation", className, ie);
-					}
-				}
-			}
-		} else if (opID.equals(OP_IfNotOperation)) {
-			if (params.length < 1) {
-				log.error("Warning.TransformOperationFactory.TooFewParameters", opID);
-			} else {
-				String xPathExpression = params[0];
-				operation = new IfNotOperation(xPathExpression);
-			}
-		} else if (opID.equals(OP_IfOperation)) {
-			if (params.length < 1) {
-				log.error("Warning.TransformOperationFactory.TooFewParameters", opID);
-			} else {
-				String xPathExpression = params[0];
-				operation = new IfOperation(xPathExpression);
-			}
-		} else if (opID.equals(OP_IterateOverElementsOperation)) {
-			if (params.length < 1) {
-				log.error("Warning.TransformOperationFactory.TooFewParameters", opID);
-			} else {
-				String xPathExpression = params[0];
-				operation = new IterateOverElementsOperation(xPathExpression);
-			}
-		} else if (opID.equals(OP_MakeParentElementCurrentOperation)) {
-			operation = new MakeParentElementCurrentOperation();
-		} else if (opID.equals(OP_RemoveAttributeOperation)) {
-			if (params.length < 1) {
-				log.error("Warning.TransformOperationFactory.TooFewParameters", opID);
-			} else {
-				String attrName = params[0];
-				operation = new RemoveAttributeOperation(attrName);
-			}
-		} else if (opID.equals(OP_RenameAttributeOperation)) {
-			if (params.length < 2) {
-				log.error("Warning.TransformOperationFactory.TooFewParameters", opID);
-			} else {
-				String oldAttrName = params[0];
-				String newAttrName = params[1];
-				operation = new RenameAttributeOperation(oldAttrName, newAttrName);
-			}
-		} else {
-			log.error("Warning.TransformOperationFactory.UnknownOperationID", opID);
-		}
-		return operation;
-	}
-
-}
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 dd03f01..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildElementOperation.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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 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;
-
-	/**
-	 * Constructs an instance with the specified tag name, and defaults to
-	 * making the new child Element current.
-	 * 
-	 * @param tagName Name of child Element to be created.
-	 */
-	public AppendChildElementOperation(String tagName) {
-		this(tagName, true);
-	}
-
-	/**
-	 * Constructs an instance with the specified tag name and optionally makes
-	 * the new child Element current.
-	 * 
-	 * @param tagName Name of child Element to be created.
-	 * @param makeChildCurrent If true, make new child Element current.
-	 */
-	public AppendChildElementOperation(String tagName, boolean makeChildCurrent) {
-		this.tagName = tagName;
-		this.makeChildCurrent = makeChildCurrent;
-	}
-
-	/*
-	 * (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 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 f20d608..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildTextFromXPathOperation.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.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;
-
-	/**
-	 * Constructs an instance with the specified XPath expression.
-	 * 
-	 * @param xPathExpression XPath expression to be evaluated against the
-	 * source Element instance.
-	 */
-	public AppendChildTextFromXPathOperation(String xPathExpression) {
-		this.xPathExpression = 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 (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 df9e939..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildTextOperation.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.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;
-
-	/**
-	 * Constructs an instance with the specified content.
-	 * 
-	 * @param content Content of child Text to be created.
-	 */
-	public AppendChildTextOperation(String content) {
-		this.content = 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 (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 314c308..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/ConvertAttributeToTextOperation.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.operations.internal;
-
-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;
-
-	/**
-	 * Constructs an instance with the specified attribute name, and defaults
-	 * to removing the attribute.
-	 * 
-	 * @param attributeName Name of attribute to be converted to a child Text
-	 * Node.
-	 */
-	public ConvertAttributeToTextOperation(String attributeName) {
-		this(attributeName, true);
-	}
-
-	/**
-	 * Constructs an instance with the specified attribute name and optionally
-	 * removes the attribute.
-	 * 
-	 * @param attributeName Name of attribute to be converted to a child Text
-	 * Node.
-	 * @param removeAttribute It true, attribute is removed after child Text
-	 * Node is created.
-	 */
-	public ConvertAttributeToTextOperation(String attributeName, boolean removeAttribute) {
-		this.attributeName = attributeName;
-		this.removeAttribute = removeAttribute;
-	}
-
-	/*
-	 * (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 && 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 5d77840..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAttributeOperation.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-/**
- * 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;
-
-	/**
-	 * Constructs an instance with the specified attribute name, and defaults
-	 * to not creating an attribute unless the named attribute exists on the
-	 * source Element instance.
-	 * 
-	 * @param attributeName Name of attribute to be copied.
-	 */
-	public CopyAttributeOperation(String attributeName) {
-		this(attributeName, false, null);
-	}
-
-	/**
-	 * Constructs an instance with the specified attribute name and optionally
-	 * forces creation of a new attribute on the current Element even if the
-	 * named attribute does not exist on the source Element instance.
-	 * 
-	 * @param attributeName Name of attribute to be copied.
-	 * @param create If true, create attribute on the current Element even if
-	 * the named attribute does not exist on the source Element.
-	 * @param newAttributeValue Value to set for the new attribute if not found
-	 * on the source Element. 
-	 */
-	public CopyAttributeOperation(String attributeName, boolean create, String newAttributeValue) {
-		this.attributeName = attributeName;
-		this.create = create;
-		this.newAttributeValue = 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 (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/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 480428d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateAttributeFromXPathOperation.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that creates a new attribute on the
- * current Element by getting a value from the specified XPath expression.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CreateAttributeFromXPathOperation extends AbstractTransformOperation {
-
-	private String attributeName;
-	private String xPathExpression;
-
-	/**
-	 * Constructs an instance with the specified XPath expression.
-	 * 
-	 * @param attributeName Name of attribute to be created.
-	 * @param xPathExpression XPath expression to be evaluated against the
-	 * source Element instance.
-	 */
-	public CreateAttributeFromXPathOperation(String attributeName, String xPathExpression) {
-		this.attributeName = attributeName;
-		this.xPathExpression = 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 (srcElement != null) {
-			XPath xPath = XPathFactory.newInstance().newXPath();
-			try {
-				Object resultObject = xPath.evaluate(xPathExpression, srcElement, XPathConstants.STRING);
-				if (resultObject instanceof String && curElement != null) {
-					curElement.setAttribute(attributeName, (String)resultObject);
-				}
-			} catch(XPathExpressionException xee) {
-				//could not evaluate - return curElement
-			}
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateAttributeOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateAttributeOperation.java
deleted file mode 100644
index 9b5d260..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.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;
-
-	/**
-	 * Constructs an instance with the specified attribute name and value.
-	 * 
-	 * @param attributeName Name of attribute to be created.
-	 * @param attributeValue Value of attribute to be set.
-	 */
-	public CreateAttributeOperation(String attributeName, String attributeValue) {
-		this.attributeName = attributeName;
-		this.attributeValue = 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 (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 c8d98a2..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.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;
-
-	/**
-	 * Constructs an instance with the specified Element name.
-	 * 
-	 * @param tagName Name of Element to be created.
-	 */
-	public CreateElementOperation(String tagName) {
-		this.tagName = 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) {
-		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 a83b896..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.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;
-
-	/**
-	 * Constructs an instance with the specified XPath expression.
-	 * 
-	 * @param xPathExpression XPath expression to be evaluated against the
-	 * source Element instance.
-	 */
-	public IfNotOperation(String xPathExpression) {
-		this.xPathExpression = 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) {
-		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 3d94bc7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IfOperation.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.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;
-
-	/**
-	 * Constructs an instance with the specified XPath expression.
-	 * 
-	 * @param xPathExpression XPath expression to be evaluated against the
-	 * source Element instance.
-	 */
-	public IfOperation(String xPathExpression) {
-		this.xPathExpression = 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) {
-		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 f72afe0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IterateOverElementsOperation.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * ITransformOperation implementation that executes child ITransformOperation
- * instances for each Element in the NodeList returned by the XPath expression,
- * which is evaluated against the source Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class IterateOverElementsOperation extends AbstractTransformOperation {
-
-	private String xPathExpression;
-
-	/**
-	 * Constructs an instance with the specified XPath expression.
-	 * 
-	 * @param xPathExpression XPath expression to be evaluated against the
-	 * source Element instance.
-	 */
-	public IterateOverElementsOperation(String xPathExpression) {
-		this.xPathExpression = 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) {
-		Element retElement = curElement;
-		if (srcElement != null) {
-			XPath xPath = XPathFactory.newInstance().newXPath();
-			try {
-				Object resultObject = xPath.evaluate(xPathExpression, srcElement, XPathConstants.NODESET);
-				if (resultObject instanceof NodeList) {
-					NodeList nodes = (NodeList)resultObject;
-					for (int i = 0; i < nodes.getLength(); i++) {
-						Node node = nodes.item(i);
-						if (node instanceof Element) {
-							retElement = executeChildOperations((Element)node, retElement);
-						}
-					}
-				}
-			} catch(XPathExpressionException xee) {
-				//could not evaluate - return curElement
-			}
-		}
-		return retElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/MakeParentElementCurrentOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/MakeParentElementCurrentOperation.java
deleted file mode 100644
index b0e32af..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/MakeParentElementCurrentOperation.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * ITransformOperation implementation that makes the current Element's parent
- * Element the new current Element.
- * 
- * @author Ian Trimble - Oracle
- */
-public class MakeParentElementCurrentOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		Element resultElement = null;
-		if (curElement != null) {
-			Node parentNode = curElement.getParentNode();
-			while (parentNode != null && parentNode.getNodeType() != Node.DOCUMENT_NODE) {
-				if (parentNode.getNodeType() == Node.ELEMENT_NODE) {
-					resultElement = (Element)parentNode;
-					break;
-				}
-                parentNode = parentNode.getParentNode();
-			}
-		}
-		return resultElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/RemoveAttributeOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/RemoveAttributeOperation.java
deleted file mode 100644
index 689d019..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.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;
-
-	/**
-	 * Constructs an instance with the specified attribute name.
-	 * 
-	 * @param attributeName Name of attribute to be removed.
-	 */
-	public RemoveAttributeOperation(String attributeName) {
-		this.attributeName = 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 (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 420ff1d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/RenameAttributeOperation.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-/**
- * ITransformOperation implementation that renames an attribute of the current
- * Element.
- * 
- * @author Ian Trimble - Oracle
- */
-public class RenameAttributeOperation extends AbstractTransformOperation {
-
-	private String oldAttributeName;
-	private String newAttributeName;
-
-	/**
-	 * Constructs an instance with the specified old and new attribute names.
-	 * 
-	 * @param oldAttributeName Old name of the attribute to be renamed.
-	 * @param newAttributeName New name of the attribute to be renamed.
-	 */
-	public RenameAttributeOperation(String oldAttributeName, String newAttributeName) {
-		this.oldAttributeName = oldAttributeName;
-		this.newAttributeName = newAttributeName;
-	}
-
-	/*
-	 * (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 (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/dtinfo/DTInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfo.java
deleted file mode 100644
index ca2ce46..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfo.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>DT Info</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagConvertInfo <em>Tag Convert Info</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagDecorateInfos <em>Tag Decorate Infos</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getDTInfo()
- * @model
- * @generated
- */
-public interface DTInfo extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Tag Convert Info</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Tag Convert Info</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Tag Convert Info</em>' containment reference.
-	 * @see #setTagConvertInfo(TagConvertInfo)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getDTInfo_TagConvertInfo()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='tag-convert-info'"
-	 * @generated
-	 */
-	TagConvertInfo getTagConvertInfo();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagConvertInfo <em>Tag Convert Info</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Tag Convert Info</em>' containment reference.
-	 * @see #getTagConvertInfo()
-	 * @generated
-	 */
-	void setTagConvertInfo(TagConvertInfo value);
-
-	/**
-	 * Returns the value of the '<em><b>Tag Decorate Infos</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Tag Decorate Infos</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Tag Decorate Infos</em>' containment reference list.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getDTInfo_TagDecorateInfos()
-	 * @model type="org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.provisional.TagDecorateInfo" containment="true"
-	 *        extendedMetaData="kind='element' name='tag-decorate-info'"
-	 * @generated
-	 */
-	EList getTagDecorateInfos();
-
-} // DTInfo
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoFactory.java
deleted file mode 100644
index 71f5b13..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoFactory.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage
- * @generated
- */
-public interface DTInfoFactory extends EFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	DTInfoFactory eINSTANCE = org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoFactoryImpl.init();
-
-	/**
-	 * Returns a new object of class '<em>DT Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>DT Info</em>'.
-	 * @generated
-	 */
-	DTInfo createDTInfo();
-
-	/**
-	 * Returns a new object of class '<em>Tag Convert Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Tag Convert Info</em>'.
-	 * @generated
-	 */
-	TagConvertInfo createTagConvertInfo();
-
-	/**
-	 * Returns a new object of class '<em>Operation</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Operation</em>'.
-	 * @generated
-	 */
-	Operation createOperation();
-
-	/**
-	 * Returns a new object of class '<em>Parameter</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Parameter</em>'.
-	 * @generated
-	 */
-	Parameter createParameter();
-
-	/**
-	 * Returns a new object of class '<em>Tag Decorate Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Tag Decorate Info</em>'.
-	 * @generated
-	 */
-	TagDecorateInfo createTagDecorateInfo();
-
-	/**
-	 * Returns a new object of class '<em>Resolve Attribute Value</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Resolve Attribute Value</em>'.
-	 * @generated
-	 */
-	ResolveAttributeValue createResolveAttributeValue();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	DTInfoPackage getDTInfoPackage();
-
-} //DTInfoFactory
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoPackage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoPackage.java
deleted file mode 100644
index 2c46c80..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoPackage.java
+++ /dev/null
@@ -1,891 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoFactory
- * @model kind="package"
- * @generated
- */
-public interface DTInfoPackage extends EPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "dtinfo";
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://org.eclipse.jsf.pagedesigner/dtinfo.ecore";
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "dti";
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	DTInfoPackage eINSTANCE = org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl <em>DT Info</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getDTInfo()
-	 * @generated
-	 */
-	int DT_INFO = 0;
-
-	/**
-	 * The feature id for the '<em><b>Tag Convert Info</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DT_INFO__TAG_CONVERT_INFO = 0;
-
-	/**
-	 * The feature id for the '<em><b>Tag Decorate Infos</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DT_INFO__TAG_DECORATE_INFOS = 1;
-
-	/**
-	 * The number of structural features of the '<em>DT Info</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DT_INFO_FEATURE_COUNT = 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagConvertInfoImpl <em>Tag Convert Info</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagConvertInfoImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getTagConvertInfo()
-	 * @generated
-	 */
-	int TAG_CONVERT_INFO = 1;
-
-	/**
-	 * The feature id for the '<em><b>Operations</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CONVERT_INFO__OPERATIONS = 0;
-
-	/**
-	 * The number of structural features of the '<em>Tag Convert Info</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CONVERT_INFO_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl <em>Operation</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getOperation()
-	 * @generated
-	 */
-	int OPERATION = 2;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OPERATION__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Parameters</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OPERATION__PARAMETERS = 1;
-
-	/**
-	 * The feature id for the '<em><b>Operations</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OPERATION__OPERATIONS = 2;
-
-	/**
-	 * The number of structural features of the '<em>Operation</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OPERATION_FEATURE_COUNT = 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ParameterImpl <em>Parameter</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ParameterImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getParameter()
-	 * @generated
-	 */
-	int PARAMETER = 3;
-
-	/**
-	 * The feature id for the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PARAMETER__VALUE = 0;
-
-	/**
-	 * The number of structural features of the '<em>Parameter</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PARAMETER_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl <em>Tag Decorate Info</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getTagDecorateInfo()
-	 * @generated
-	 */
-	int TAG_DECORATE_INFO = 4;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Min Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__MIN_HEIGHT = 1;
-
-	/**
-	 * The feature id for the '<em><b>Min Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__MIN_WIDTH = 2;
-
-	/**
-	 * The feature id for the '<em><b>Multi Level</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__MULTI_LEVEL = 3;
-
-	/**
-	 * The feature id for the '<em><b>Need Border Decorator</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__NEED_BORDER_DECORATOR = 4;
-
-	/**
-	 * The feature id for the '<em><b>Need Table Decorator</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__NEED_TABLE_DECORATOR = 5;
-
-	/**
-	 * The feature id for the '<em><b>Non Visual</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__NON_VISUAL = 6;
-
-	/**
-	 * The feature id for the '<em><b>Non Visual Image Path</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH = 7;
-
-	/**
-	 * The feature id for the '<em><b>Resolve Child Text</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT = 8;
-
-	/**
-	 * The feature id for the '<em><b>Resolve Attribute Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE = 9;
-
-	/**
-	 * The feature id for the '<em><b>Set Non Visual Child Elements</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS = 10;
-
-	/**
-	 * The feature id for the '<em><b>Widget</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__WIDGET = 11;
-
-	/**
-	 * The number of structural features of the '<em>Tag Decorate Info</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO_FEATURE_COUNT = 12;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ResolveAttributeValueImpl <em>Resolve Attribute Value</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ResolveAttributeValueImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getResolveAttributeValue()
-	 * @generated
-	 */
-	int RESOLVE_ATTRIBUTE_VALUE = 5;
-
-	/**
-	 * The feature id for the '<em><b>Attribute Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME = 0;
-
-	/**
-	 * The number of structural features of the '<em>Resolve Attribute Value</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOLVE_ATTRIBUTE_VALUE_FEATURE_COUNT = 1;
-
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo <em>DT Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>DT Info</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo
-	 * @generated
-	 */
-	EClass getDTInfo();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagConvertInfo <em>Tag Convert Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Tag Convert Info</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagConvertInfo()
-	 * @see #getDTInfo()
-	 * @generated
-	 */
-	EReference getDTInfo_TagConvertInfo();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagDecorateInfos <em>Tag Decorate Infos</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Tag Decorate Infos</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagDecorateInfos()
-	 * @see #getDTInfo()
-	 * @generated
-	 */
-	EReference getDTInfo_TagDecorateInfos();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo <em>Tag Convert Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Tag Convert Info</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo
-	 * @generated
-	 */
-	EClass getTagConvertInfo();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo#getOperations <em>Operations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Operations</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo#getOperations()
-	 * @see #getTagConvertInfo()
-	 * @generated
-	 */
-	EReference getTagConvertInfo_Operations();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation <em>Operation</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Operation</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation
-	 * @generated
-	 */
-	EClass getOperation();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getId()
-	 * @see #getOperation()
-	 * @generated
-	 */
-	EAttribute getOperation_Id();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getParameters <em>Parameters</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Parameters</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getParameters()
-	 * @see #getOperation()
-	 * @generated
-	 */
-	EReference getOperation_Parameters();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getOperations <em>Operations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Operations</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getOperations()
-	 * @see #getOperation()
-	 * @generated
-	 */
-	EReference getOperation_Operations();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter <em>Parameter</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Parameter</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter
-	 * @generated
-	 */
-	EClass getParameter();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter#getValue()
-	 * @see #getParameter()
-	 * @generated
-	 */
-	EAttribute getParameter_Value();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo <em>Tag Decorate Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Tag Decorate Info</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo
-	 * @generated
-	 */
-	EClass getTagDecorateInfo();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getId()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_Id();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinHeight <em>Min Height</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Min Height</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinHeight()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_MinHeight();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinWidth <em>Min Width</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Min Width</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinWidth()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_MinWidth();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isMultiLevel <em>Multi Level</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Multi Level</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isMultiLevel()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_MultiLevel();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedBorderDecorator <em>Need Border Decorator</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Need Border Decorator</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedBorderDecorator()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_NeedBorderDecorator();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedTableDecorator <em>Need Table Decorator</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Need Table Decorator</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedTableDecorator()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_NeedTableDecorator();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNonVisual <em>Non Visual</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Non Visual</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNonVisual()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_NonVisual();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getNonVisualImagePath <em>Non Visual Image Path</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Non Visual Image Path</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getNonVisualImagePath()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_NonVisualImagePath();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isResolveChildText <em>Resolve Child Text</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Resolve Child Text</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isResolveChildText()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_ResolveChildText();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getResolveAttributeValue <em>Resolve Attribute Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Resolve Attribute Value</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getResolveAttributeValue()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EReference getTagDecorateInfo_ResolveAttributeValue();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isSetNonVisualChildElements <em>Set Non Visual Child Elements</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Set Non Visual Child Elements</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isSetNonVisualChildElements()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_SetNonVisualChildElements();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isWidget <em>Widget</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Widget</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isWidget()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_Widget();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue <em>Resolve Attribute Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Resolve Attribute Value</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue
-	 * @generated
-	 */
-	EClass getResolveAttributeValue();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue#getAttributeName <em>Attribute Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Attribute Name</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue#getAttributeName()
-	 * @see #getResolveAttributeValue()
-	 * @generated
-	 */
-	EAttribute getResolveAttributeValue_AttributeName();
-
-	/**
-	 * Returns the factory that creates the instances of the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	DTInfoFactory getDTInfoFactory();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Defines literals for the meta objects that represent
-	 * <ul>
-	 *   <li>each class,</li>
-	 *   <li>each feature of each class,</li>
-	 *   <li>each enum,</li>
-	 *   <li>and each data type</li>
-	 * </ul>
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	interface Literals {
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl <em>DT Info</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getDTInfo()
-		 * @generated
-		 */
-		EClass DT_INFO = eINSTANCE.getDTInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Tag Convert Info</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DT_INFO__TAG_CONVERT_INFO = eINSTANCE.getDTInfo_TagConvertInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Tag Decorate Infos</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DT_INFO__TAG_DECORATE_INFOS = eINSTANCE.getDTInfo_TagDecorateInfos();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagConvertInfoImpl <em>Tag Convert Info</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagConvertInfoImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getTagConvertInfo()
-		 * @generated
-		 */
-		EClass TAG_CONVERT_INFO = eINSTANCE.getTagConvertInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Operations</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TAG_CONVERT_INFO__OPERATIONS = eINSTANCE.getTagConvertInfo_Operations();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl <em>Operation</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getOperation()
-		 * @generated
-		 */
-		EClass OPERATION = eINSTANCE.getOperation();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute OPERATION__ID = eINSTANCE.getOperation_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Parameters</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference OPERATION__PARAMETERS = eINSTANCE.getOperation_Parameters();
-
-		/**
-		 * The meta object literal for the '<em><b>Operations</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference OPERATION__OPERATIONS = eINSTANCE.getOperation_Operations();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ParameterImpl <em>Parameter</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ParameterImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getParameter()
-		 * @generated
-		 */
-		EClass PARAMETER = eINSTANCE.getParameter();
-
-		/**
-		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PARAMETER__VALUE = eINSTANCE.getParameter_Value();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl <em>Tag Decorate Info</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getTagDecorateInfo()
-		 * @generated
-		 */
-		EClass TAG_DECORATE_INFO = eINSTANCE.getTagDecorateInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__ID = eINSTANCE.getTagDecorateInfo_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Min Height</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__MIN_HEIGHT = eINSTANCE.getTagDecorateInfo_MinHeight();
-
-		/**
-		 * The meta object literal for the '<em><b>Min Width</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__MIN_WIDTH = eINSTANCE.getTagDecorateInfo_MinWidth();
-
-		/**
-		 * The meta object literal for the '<em><b>Multi Level</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__MULTI_LEVEL = eINSTANCE.getTagDecorateInfo_MultiLevel();
-
-		/**
-		 * The meta object literal for the '<em><b>Need Border Decorator</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__NEED_BORDER_DECORATOR = eINSTANCE.getTagDecorateInfo_NeedBorderDecorator();
-
-		/**
-		 * The meta object literal for the '<em><b>Need Table Decorator</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__NEED_TABLE_DECORATOR = eINSTANCE.getTagDecorateInfo_NeedTableDecorator();
-
-		/**
-		 * The meta object literal for the '<em><b>Non Visual</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__NON_VISUAL = eINSTANCE.getTagDecorateInfo_NonVisual();
-
-		/**
-		 * The meta object literal for the '<em><b>Non Visual Image Path</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH = eINSTANCE.getTagDecorateInfo_NonVisualImagePath();
-
-		/**
-		 * The meta object literal for the '<em><b>Resolve Child Text</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT = eINSTANCE.getTagDecorateInfo_ResolveChildText();
-
-		/**
-		 * The meta object literal for the '<em><b>Resolve Attribute Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE = eINSTANCE.getTagDecorateInfo_ResolveAttributeValue();
-
-		/**
-		 * The meta object literal for the '<em><b>Set Non Visual Child Elements</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS = eINSTANCE.getTagDecorateInfo_SetNonVisualChildElements();
-
-		/**
-		 * The meta object literal for the '<em><b>Widget</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__WIDGET = eINSTANCE.getTagDecorateInfo_Widget();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ResolveAttributeValueImpl <em>Resolve Attribute Value</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ResolveAttributeValueImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getResolveAttributeValue()
-		 * @generated
-		 */
-		EClass RESOLVE_ATTRIBUTE_VALUE = eINSTANCE.getResolveAttributeValue();
-
-		/**
-		 * The meta object literal for the '<em><b>Attribute Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME = eINSTANCE.getResolveAttributeValue_AttributeName();
-
-	}
-
-} //DTInfoPackage
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Operation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Operation.java
deleted file mode 100644
index 5e9cd87..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Operation.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Operation</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getParameters <em>Parameters</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getOperations <em>Operations</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getOperation()
- * @model
- * @generated
- */
-public interface Operation extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getOperation_Id()
-	 * @model id="true" required="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Parameters</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Parameters</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Parameters</em>' containment reference list.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getOperation_Parameters()
-	 * @model type="org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.provisional.Parameter" containment="true"
-	 *        extendedMetaData="kind='element' name='parameter'"
-	 * @generated
-	 */
-	EList getParameters();
-
-	/**
-	 * Returns the value of the '<em><b>Operations</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Operations</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Operations</em>' containment reference list.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getOperation_Operations()
-	 * @model type="org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.provisional.Operation" containment="true"
-	 *        extendedMetaData="kind='element' name='operation'"
-	 * @generated
-	 */
-	EList getOperations();
-
-} // Operation
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Parameter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Parameter.java
deleted file mode 100644
index b396a2a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Parameter.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Parameter</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getParameter()
- * @model
- * @generated
- */
-public interface Parameter extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value</em>' attribute.
-	 * @see #setValue(String)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getParameter_Value()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter#getValue <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' attribute.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(String value);
-
-} // Parameter
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/ResolveAttributeValue.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/ResolveAttributeValue.java
deleted file mode 100644
index 6ed698f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/ResolveAttributeValue.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Resolve Attribute Value</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue#getAttributeName <em>Attribute Name</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getResolveAttributeValue()
- * @model
- * @generated
- */
-public interface ResolveAttributeValue extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Attribute Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute Name</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attribute Name</em>' attribute.
-	 * @see #setAttributeName(String)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getResolveAttributeValue_AttributeName()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getAttributeName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue#getAttributeName <em>Attribute Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Attribute Name</em>' attribute.
-	 * @see #getAttributeName()
-	 * @generated
-	 */
-	void setAttributeName(String value);
-
-} // ResolveAttributeValue
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagConvertInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagConvertInfo.java
deleted file mode 100644
index 7ef7c07..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagConvertInfo.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag Convert Info</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo#getOperations <em>Operations</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagConvertInfo()
- * @model
- * @generated
- */
-public interface TagConvertInfo extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Operations</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Operations</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Operations</em>' containment reference list.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagConvertInfo_Operations()
-	 * @model type="org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.provisional.Operation" containment="true"
-	 *        extendedMetaData="kind='element' name='operation'"
-	 * @generated
-	 */
-	EList getOperations();
-
-} // TagConvertInfo
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagDecorateInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagDecorateInfo.java
deleted file mode 100644
index 67d9b8d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagDecorateInfo.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag Decorate Info</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinHeight <em>Min Height</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinWidth <em>Min Width</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isMultiLevel <em>Multi Level</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedBorderDecorator <em>Need Border Decorator</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedTableDecorator <em>Need Table Decorator</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNonVisual <em>Non Visual</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getNonVisualImagePath <em>Non Visual Image Path</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isResolveChildText <em>Resolve Child Text</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getResolveAttributeValue <em>Resolve Attribute Value</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isSetNonVisualChildElements <em>Set Non Visual Child Elements</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isWidget <em>Widget</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo()
- * @model
- * @generated
- */
-public interface TagDecorateInfo extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_Id()
-	 * @model id="true" required="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Min Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Min Height</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Min Height</em>' attribute.
-	 * @see #setMinHeight(int)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_MinHeight()
-	 * @model
-	 * @generated
-	 */
-	int getMinHeight();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinHeight <em>Min Height</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Min Height</em>' attribute.
-	 * @see #getMinHeight()
-	 * @generated
-	 */
-	void setMinHeight(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Min Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Min Width</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Min Width</em>' attribute.
-	 * @see #setMinWidth(int)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_MinWidth()
-	 * @model
-	 * @generated
-	 */
-	int getMinWidth();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinWidth <em>Min Width</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Min Width</em>' attribute.
-	 * @see #getMinWidth()
-	 * @generated
-	 */
-	void setMinWidth(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Multi Level</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Multi Level</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Multi Level</em>' attribute.
-	 * @see #setMultiLevel(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_MultiLevel()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isMultiLevel();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isMultiLevel <em>Multi Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Multi Level</em>' attribute.
-	 * @see #isMultiLevel()
-	 * @generated
-	 */
-	void setMultiLevel(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Need Border Decorator</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Need Border Decorator</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Need Border Decorator</em>' attribute.
-	 * @see #setNeedBorderDecorator(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_NeedBorderDecorator()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isNeedBorderDecorator();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedBorderDecorator <em>Need Border Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Need Border Decorator</em>' attribute.
-	 * @see #isNeedBorderDecorator()
-	 * @generated
-	 */
-	void setNeedBorderDecorator(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Need Table Decorator</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Need Table Decorator</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Need Table Decorator</em>' attribute.
-	 * @see #setNeedTableDecorator(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_NeedTableDecorator()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isNeedTableDecorator();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedTableDecorator <em>Need Table Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Need Table Decorator</em>' attribute.
-	 * @see #isNeedTableDecorator()
-	 * @generated
-	 */
-	void setNeedTableDecorator(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Non Visual</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Non Visual</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Non Visual</em>' attribute.
-	 * @see #setNonVisual(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_NonVisual()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isNonVisual();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNonVisual <em>Non Visual</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Non Visual</em>' attribute.
-	 * @see #isNonVisual()
-	 * @generated
-	 */
-	void setNonVisual(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Non Visual Image Path</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Non Visual Image Path</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Non Visual Image Path</em>' attribute.
-	 * @see #setNonVisualImagePath(String)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_NonVisualImagePath()
-	 * @model
-	 * @generated
-	 */
-	String getNonVisualImagePath();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getNonVisualImagePath <em>Non Visual Image Path</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Non Visual Image Path</em>' attribute.
-	 * @see #getNonVisualImagePath()
-	 * @generated
-	 */
-	void setNonVisualImagePath(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Resolve Child Text</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Resolve Child Text</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Resolve Child Text</em>' attribute.
-	 * @see #setResolveChildText(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_ResolveChildText()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isResolveChildText();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isResolveChildText <em>Resolve Child Text</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Resolve Child Text</em>' attribute.
-	 * @see #isResolveChildText()
-	 * @generated
-	 */
-	void setResolveChildText(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Resolve Attribute Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Resolve Attribute Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Resolve Attribute Value</em>' containment reference.
-	 * @see #setResolveAttributeValue(ResolveAttributeValue)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_ResolveAttributeValue()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='resolve-attribute-value'"
-	 * @generated
-	 */
-	ResolveAttributeValue getResolveAttributeValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getResolveAttributeValue <em>Resolve Attribute Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Resolve Attribute Value</em>' containment reference.
-	 * @see #getResolveAttributeValue()
-	 * @generated
-	 */
-	void setResolveAttributeValue(ResolveAttributeValue value);
-
-	/**
-	 * Returns the value of the '<em><b>Set Non Visual Child Elements</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Set Non Visual Child Elements</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Set Non Visual Child Elements</em>' attribute.
-	 * @see #setSetNonVisualChildElements(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_SetNonVisualChildElements()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isSetNonVisualChildElements();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isSetNonVisualChildElements <em>Set Non Visual Child Elements</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Set Non Visual Child Elements</em>' attribute.
-	 * @see #isSetNonVisualChildElements()
-	 * @generated
-	 */
-	void setSetNonVisualChildElements(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Widget</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Widget</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Widget</em>' attribute.
-	 * @see #setWidget(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_Widget()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isWidget();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isWidget <em>Widget</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Widget</em>' attribute.
-	 * @see #isWidget()
-	 * @generated
-	 */
-	void setWidget(boolean value);
-
-} // TagDecorateInfo
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoFactoryImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoFactoryImpl.java
deleted file mode 100644
index ad64f06..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoFactoryImpl.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.*;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class DTInfoFactoryImpl extends EFactoryImpl implements DTInfoFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Creates the default factory implementation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static DTInfoFactory init() {
-		try {
-			DTInfoFactory theDTInfoFactory = (DTInfoFactory)EPackage.Registry.INSTANCE.getEFactory("http://org.eclipse.jsf.pagedesigner/dtinfo.ecore"); 
-			if (theDTInfoFactory != null) {
-				return theDTInfoFactory;
-			}
-		}
-		catch (Exception exception) {
-			EcorePlugin.INSTANCE.log(exception);
-		}
-		return new DTInfoFactoryImpl();
-	}
-
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfoFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case DTInfoPackage.DT_INFO: return createDTInfo();
-			case DTInfoPackage.TAG_CONVERT_INFO: return createTagConvertInfo();
-			case DTInfoPackage.OPERATION: return createOperation();
-			case DTInfoPackage.PARAMETER: return createParameter();
-			case DTInfoPackage.TAG_DECORATE_INFO: return createTagDecorateInfo();
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE: return createResolveAttributeValue();
-			default:
-				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfo createDTInfo() {
-		DTInfoImpl dtInfo = new DTInfoImpl();
-		return dtInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagConvertInfo createTagConvertInfo() {
-		TagConvertInfoImpl tagConvertInfo = new TagConvertInfoImpl();
-		return tagConvertInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Operation createOperation() {
-		OperationImpl operation = new OperationImpl();
-		return operation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Parameter createParameter() {
-		ParameterImpl parameter = new ParameterImpl();
-		return parameter;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagDecorateInfo createTagDecorateInfo() {
-		TagDecorateInfoImpl tagDecorateInfo = new TagDecorateInfoImpl();
-		return tagDecorateInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResolveAttributeValue createResolveAttributeValue() {
-		ResolveAttributeValueImpl resolveAttributeValue = new ResolveAttributeValueImpl();
-		return resolveAttributeValue;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfoPackage getDTInfoPackage() {
-		return (DTInfoPackage)getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- 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 98c4828..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>DT Info</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl#getTagConvertInfo <em>Tag Convert Info</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl#getTagDecorateInfos <em>Tag Decorate Infos</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DTInfoImpl extends EObjectImpl implements DTInfo {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached value of the '{@link #getTagConvertInfo() <em>Tag Convert Info</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTagConvertInfo()
-	 * @generated
-	 * @ordered
-	 */
-	protected TagConvertInfo tagConvertInfo;
-
-	/**
-	 * The cached value of the '{@link #getTagDecorateInfos() <em>Tag Decorate Infos</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTagDecorateInfos()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList tagDecorateInfos;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DTInfoImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.DT_INFO;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagConvertInfo getTagConvertInfo() {
-		return tagConvertInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- 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 1bb41f7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoPackageImpl.java
+++ /dev/null
@@ -1,562 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoFactory;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class DTInfoPackageImpl extends EPackageImpl implements DTInfoPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass dtInfoEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass tagConvertInfoEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass operationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass parameterEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass tagDecorateInfoEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass resolveAttributeValueEClass = null;
-
-	/**
-	 * Creates an instance of the model <b>Package</b>, registered with
-	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-	 * package URI value.
-	 * <p>Note: the correct way to create the package is via the static
-	 * factory method {@link #init init()}, which also performs
-	 * initialization of the package, or returns the registered package,
-	 * if one already exists.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.emf.ecore.EPackage.Registry
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private DTInfoPackageImpl() {
-		super(eNS_URI, DTInfoFactory.eINSTANCE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static boolean isInited = false;
-
-	/**
-	 * Creates, registers, and initializes the <b>Package</b> for this
-	 * model, and for any others upon which it depends.  Simple
-	 * dependencies are satisfied by calling this method on all
-	 * dependent packages before doing anything else.  This method drives
-	 * initialization for interdependent packages directly, in parallel
-	 * with this package, itself.
-	 * <p>Of this package and its interdependencies, all packages which
-	 * have not yet been registered by their URI values are first created
-	 * and registered.  The packages are then initialized in two steps:
-	 * meta-model objects for all of the packages are created before any
-	 * are initialized, since one package's meta-model objects may refer to
-	 * those of another.
-	 * <p>Invocation of this method will not affect any packages that have
-	 * already been initialized.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static DTInfoPackage init() {
-		if (isInited) return (DTInfoPackage)EPackage.Registry.INSTANCE.getEPackage(DTInfoPackage.eNS_URI);
-
-		// Obtain or create and register package
-		DTInfoPackageImpl theDTInfoPackage = (DTInfoPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof DTInfoPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new DTInfoPackageImpl());
-
-		isInited = true;
-
-		// Create package meta-data objects
-		theDTInfoPackage.createPackageContents();
-
-		// Initialize created meta-data
-		theDTInfoPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theDTInfoPackage.freeze();
-
-		return theDTInfoPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDTInfo() {
-		return dtInfoEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDTInfo_TagConvertInfo() {
-		return (EReference)dtInfoEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDTInfo_TagDecorateInfos() {
-		return (EReference)dtInfoEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTagConvertInfo() {
-		return tagConvertInfoEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTagConvertInfo_Operations() {
-		return (EReference)tagConvertInfoEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOperation() {
-		return operationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOperation_Id() {
-		return (EAttribute)operationEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOperation_Parameters() {
-		return (EReference)operationEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOperation_Operations() {
-		return (EReference)operationEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getParameter() {
-		return parameterEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getParameter_Value() {
-		return (EAttribute)parameterEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTagDecorateInfo() {
-		return tagDecorateInfoEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_Id() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_MinHeight() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_MinWidth() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_MultiLevel() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_NeedBorderDecorator() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_NeedTableDecorator() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_NonVisual() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_NonVisualImagePath() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_ResolveChildText() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTagDecorateInfo_ResolveAttributeValue() {
-		return (EReference)tagDecorateInfoEClass.getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_SetNonVisualChildElements() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_Widget() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getResolveAttributeValue() {
-		return resolveAttributeValueEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResolveAttributeValue_AttributeName() {
-		return (EAttribute)resolveAttributeValueEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfoFactory getDTInfoFactory() {
-		return (DTInfoFactory)getEFactoryInstance();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isCreated = false;
-
-	/**
-	 * Creates the meta-model objects for the package.  This method is
-	 * guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void createPackageContents() {
-		if (isCreated) return;
-		isCreated = true;
-
-		// Create classes and their features
-		dtInfoEClass = createEClass(DT_INFO);
-		createEReference(dtInfoEClass, DT_INFO__TAG_CONVERT_INFO);
-		createEReference(dtInfoEClass, DT_INFO__TAG_DECORATE_INFOS);
-
-		tagConvertInfoEClass = createEClass(TAG_CONVERT_INFO);
-		createEReference(tagConvertInfoEClass, TAG_CONVERT_INFO__OPERATIONS);
-
-		operationEClass = createEClass(OPERATION);
-		createEAttribute(operationEClass, OPERATION__ID);
-		createEReference(operationEClass, OPERATION__PARAMETERS);
-		createEReference(operationEClass, OPERATION__OPERATIONS);
-
-		parameterEClass = createEClass(PARAMETER);
-		createEAttribute(parameterEClass, PARAMETER__VALUE);
-
-		tagDecorateInfoEClass = createEClass(TAG_DECORATE_INFO);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__ID);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__MIN_HEIGHT);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__MIN_WIDTH);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__MULTI_LEVEL);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__NEED_BORDER_DECORATOR);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__NEED_TABLE_DECORATOR);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__NON_VISUAL);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT);
-		createEReference(tagDecorateInfoEClass, TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__WIDGET);
-
-		resolveAttributeValueEClass = createEClass(RESOLVE_ATTRIBUTE_VALUE);
-		createEAttribute(resolveAttributeValueEClass, RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isInitialized = false;
-
-	/**
-	 * Complete the initialization of the package and its meta-model.  This
-	 * method is guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void initializePackageContents() {
-		if (isInitialized) return;
-		isInitialized = true;
-
-		// Initialize package
-		setName(eNAME);
-		setNsPrefix(eNS_PREFIX);
-		setNsURI(eNS_URI);
-
-		// Add supertypes to classes
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(dtInfoEClass, DTInfo.class, "DTInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getDTInfo_TagConvertInfo(), this.getTagConvertInfo(), null, "tagConvertInfo", null, 1, 1, DTInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getDTInfo_TagDecorateInfos(), this.getTagDecorateInfo(), null, "tagDecorateInfos", null, 0, -1, DTInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(tagConvertInfoEClass, TagConvertInfo.class, "TagConvertInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getTagConvertInfo_Operations(), this.getOperation(), null, "operations", null, 0, -1, TagConvertInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(operationEClass, Operation.class, "Operation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getOperation_Id(), ecorePackage.getEString(), "id", null, 1, 1, Operation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getOperation_Parameters(), this.getParameter(), null, "parameters", null, 0, -1, Operation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getOperation_Operations(), this.getOperation(), null, "operations", null, 0, -1, Operation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(parameterEClass, Parameter.class, "Parameter", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getParameter_Value(), ecorePackage.getEString(), "value", null, 1, 1, Parameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(tagDecorateInfoEClass, TagDecorateInfo.class, "TagDecorateInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getTagDecorateInfo_Id(), ecorePackage.getEString(), "id", null, 1, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagDecorateInfo_MinHeight(), ecorePackage.getEInt(), "minHeight", null, 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagDecorateInfo_MinWidth(), ecorePackage.getEInt(), "minWidth", null, 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagDecorateInfo_MultiLevel(), ecorePackage.getEBoolean(), "multiLevel", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagDecorateInfo_NeedBorderDecorator(), ecorePackage.getEBoolean(), "needBorderDecorator", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagDecorateInfo_NeedTableDecorator(), ecorePackage.getEBoolean(), "needTableDecorator", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagDecorateInfo_NonVisual(), ecorePackage.getEBoolean(), "nonVisual", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagDecorateInfo_NonVisualImagePath(), ecorePackage.getEString(), "nonVisualImagePath", null, 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagDecorateInfo_ResolveChildText(), ecorePackage.getEBoolean(), "resolveChildText", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getTagDecorateInfo_ResolveAttributeValue(), this.getResolveAttributeValue(), null, "resolveAttributeValue", null, 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagDecorateInfo_SetNonVisualChildElements(), ecorePackage.getEBoolean(), "setNonVisualChildElements", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagDecorateInfo_Widget(), ecorePackage.getEBoolean(), "widget", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(resolveAttributeValueEClass, ResolveAttributeValue.class, "ResolveAttributeValue", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getResolveAttributeValue_AttributeName(), ecorePackage.getEString(), "attributeName", null, 1, 1, ResolveAttributeValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		// Create resource
-		createResource(eNS_URI);
-
-		// Create annotations
-		// http:///org/eclipse/emf/ecore/util/ExtendedMetaData
-		createExtendedMetaDataAnnotations();
-	}
-
-	/**
-	 * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void createExtendedMetaDataAnnotations() {
-		String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData";		
-		addAnnotation
-		  (getDTInfo_TagConvertInfo(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "tag-convert-info"
-		   });		
-		addAnnotation
-		  (getDTInfo_TagDecorateInfos(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "tag-decorate-info"
-		   });		
-		addAnnotation
-		  (getTagConvertInfo_Operations(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "operation"
-		   });		
-		addAnnotation
-		  (getOperation_Parameters(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "parameter"
-		   });		
-		addAnnotation
-		  (getOperation_Operations(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "operation"
-		   });		
-		addAnnotation
-		  (getTagDecorateInfo_ResolveAttributeValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "resolve-attribute-value"
-		   });
-	}
-
-} //DTInfoPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/OperationImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/OperationImpl.java
deleted file mode 100644
index 5ae2756..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/OperationImpl.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Operation</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl#getParameters <em>Parameters</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl#getOperations <em>Operations</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class OperationImpl extends EObjectImpl implements Operation {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getParameters() <em>Parameters</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getParameters()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList parameters;
-
-	/**
-	 * The cached value of the '{@link #getOperations() <em>Operations</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOperations()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList operations;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OperationImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.OPERATION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.OPERATION__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getParameters() {
-		if (parameters == null) {
-			parameters = new EObjectContainmentEList(Parameter.class, this, DTInfoPackage.OPERATION__PARAMETERS);
-		}
-		return parameters;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getOperations() {
-		if (operations == null) {
-			operations = new EObjectContainmentEList(Operation.class, this, DTInfoPackage.OPERATION__OPERATIONS);
-		}
-		return operations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case DTInfoPackage.OPERATION__PARAMETERS:
-				return ((InternalEList)getParameters()).basicRemove(otherEnd, msgs);
-			case DTInfoPackage.OPERATION__OPERATIONS:
-				return ((InternalEList)getOperations()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.OPERATION__ID:
-				return getId();
-			case DTInfoPackage.OPERATION__PARAMETERS:
-				return getParameters();
-			case DTInfoPackage.OPERATION__OPERATIONS:
-				return getOperations();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.OPERATION__ID:
-				setId((String)newValue);
-				return;
-			case DTInfoPackage.OPERATION__PARAMETERS:
-				getParameters().clear();
-				getParameters().addAll((Collection)newValue);
-				return;
-			case DTInfoPackage.OPERATION__OPERATIONS:
-				getOperations().clear();
-				getOperations().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.OPERATION__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case DTInfoPackage.OPERATION__PARAMETERS:
-				getParameters().clear();
-				return;
-			case DTInfoPackage.OPERATION__OPERATIONS:
-				getOperations().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.OPERATION__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case DTInfoPackage.OPERATION__PARAMETERS:
-				return parameters != null && !parameters.isEmpty();
-			case DTInfoPackage.OPERATION__OPERATIONS:
-				return operations != null && !operations.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: ");
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //OperationImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ParameterImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ParameterImpl.java
deleted file mode 100644
index 7d9dbe9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ParameterImpl.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Parameter</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ParameterImpl#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ParameterImpl extends EObjectImpl implements Parameter {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VALUE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected String value = VALUE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ParameterImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.PARAMETER;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(String newValue) {
-		String oldValue = value;
-		value = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.PARAMETER__VALUE, oldValue, value));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.PARAMETER__VALUE:
-				return getValue();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.PARAMETER__VALUE:
-				setValue((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.PARAMETER__VALUE:
-				setValue(VALUE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.PARAMETER__VALUE:
-				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (value: ");
-		result.append(value);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ParameterImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ResolveAttributeValueImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ResolveAttributeValueImpl.java
deleted file mode 100644
index 186ca38..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ResolveAttributeValueImpl.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Resolve Attribute Value</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ResolveAttributeValueImpl#getAttributeName <em>Attribute Name</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ResolveAttributeValueImpl extends EObjectImpl implements ResolveAttributeValue {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The default value of the '{@link #getAttributeName() <em>Attribute Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttributeName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ATTRIBUTE_NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getAttributeName() <em>Attribute Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttributeName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String attributeName = ATTRIBUTE_NAME_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ResolveAttributeValueImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.RESOLVE_ATTRIBUTE_VALUE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getAttributeName() {
-		return attributeName;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAttributeName(String newAttributeName) {
-		String oldAttributeName = attributeName;
-		attributeName = newAttributeName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME, oldAttributeName, attributeName));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME:
-				return getAttributeName();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME:
-				setAttributeName((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME:
-				setAttributeName(ATTRIBUTE_NAME_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME:
-				return ATTRIBUTE_NAME_EDEFAULT == null ? attributeName != null : !ATTRIBUTE_NAME_EDEFAULT.equals(attributeName);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (attributeName: ");
-		result.append(attributeName);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ResolveAttributeValueImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagConvertInfoImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagConvertInfoImpl.java
deleted file mode 100644
index f6f9e4a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagConvertInfoImpl.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag Convert Info</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagConvertInfoImpl#getOperations <em>Operations</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagConvertInfoImpl extends EObjectImpl implements TagConvertInfo {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached value of the '{@link #getOperations() <em>Operations</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOperations()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList operations;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TagConvertInfoImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.TAG_CONVERT_INFO;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getOperations() {
-		if (operations == null) {
-			operations = new EObjectContainmentEList(Operation.class, this, DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS);
-		}
-		return operations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS:
-				return ((InternalEList)getOperations()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS:
-				return getOperations();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS:
-				getOperations().clear();
-				getOperations().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS:
-				getOperations().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS:
-				return operations != null && !operations.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //TagConvertInfoImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagDecorateInfoImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagDecorateInfoImpl.java
deleted file mode 100644
index f133d22..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagDecorateInfoImpl.java
+++ /dev/null
@@ -1,788 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag Decorate Info</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#getMinHeight <em>Min Height</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#getMinWidth <em>Min Width</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isMultiLevel <em>Multi Level</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isNeedBorderDecorator <em>Need Border Decorator</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isNeedTableDecorator <em>Need Table Decorator</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isNonVisual <em>Non Visual</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#getNonVisualImagePath <em>Non Visual Image Path</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isResolveChildText <em>Resolve Child Text</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#getResolveAttributeValue <em>Resolve Attribute Value</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isSetNonVisualChildElements <em>Set Non Visual Child Elements</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isWidget <em>Widget</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagDecorateInfoImpl extends EObjectImpl implements TagDecorateInfo {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getMinHeight() <em>Min Height</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinHeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int MIN_HEIGHT_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getMinHeight() <em>Min Height</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinHeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected int minHeight = MIN_HEIGHT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getMinWidth() <em>Min Width</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinWidth()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int MIN_WIDTH_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getMinWidth() <em>Min Width</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinWidth()
-	 * @generated
-	 * @ordered
-	 */
-	protected int minWidth = MIN_WIDTH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isMultiLevel() <em>Multi Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMultiLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean MULTI_LEVEL_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isMultiLevel() <em>Multi Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMultiLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean multiLevel = MULTI_LEVEL_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isNeedBorderDecorator() <em>Need Border Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNeedBorderDecorator()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean NEED_BORDER_DECORATOR_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isNeedBorderDecorator() <em>Need Border Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNeedBorderDecorator()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean needBorderDecorator = NEED_BORDER_DECORATOR_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isNeedTableDecorator() <em>Need Table Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNeedTableDecorator()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean NEED_TABLE_DECORATOR_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isNeedTableDecorator() <em>Need Table Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNeedTableDecorator()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean needTableDecorator = NEED_TABLE_DECORATOR_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isNonVisual() <em>Non Visual</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNonVisual()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean NON_VISUAL_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isNonVisual() <em>Non Visual</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNonVisual()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean nonVisual = NON_VISUAL_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getNonVisualImagePath() <em>Non Visual Image Path</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNonVisualImagePath()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NON_VISUAL_IMAGE_PATH_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getNonVisualImagePath() <em>Non Visual Image Path</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNonVisualImagePath()
-	 * @generated
-	 * @ordered
-	 */
-	protected String nonVisualImagePath = NON_VISUAL_IMAGE_PATH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isResolveChildText() <em>Resolve Child Text</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isResolveChildText()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean RESOLVE_CHILD_TEXT_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isResolveChildText() <em>Resolve Child Text</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isResolveChildText()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean resolveChildText = RESOLVE_CHILD_TEXT_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getResolveAttributeValue() <em>Resolve Attribute Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getResolveAttributeValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected ResolveAttributeValue resolveAttributeValue;
-
-	/**
-	 * The default value of the '{@link #isSetNonVisualChildElements() <em>Set Non Visual Child Elements</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetNonVisualChildElements()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean SET_NON_VISUAL_CHILD_ELEMENTS_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isSetNonVisualChildElements() <em>Set Non Visual Child Elements</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetNonVisualChildElements()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean setNonVisualChildElements = SET_NON_VISUAL_CHILD_ELEMENTS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isWidget() <em>Widget</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isWidget()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean WIDGET_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isWidget() <em>Widget</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isWidget()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean widget = WIDGET_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TagDecorateInfoImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.TAG_DECORATE_INFO;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getMinHeight() {
-		return minHeight;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMinHeight(int newMinHeight) {
-		int oldMinHeight = minHeight;
-		minHeight = newMinHeight;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__MIN_HEIGHT, oldMinHeight, minHeight));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getMinWidth() {
-		return minWidth;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMinWidth(int newMinWidth) {
-		int oldMinWidth = minWidth;
-		minWidth = newMinWidth;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__MIN_WIDTH, oldMinWidth, minWidth));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isMultiLevel() {
-		return multiLevel;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMultiLevel(boolean newMultiLevel) {
-		boolean oldMultiLevel = multiLevel;
-		multiLevel = newMultiLevel;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__MULTI_LEVEL, oldMultiLevel, multiLevel));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isNeedBorderDecorator() {
-		return needBorderDecorator;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNeedBorderDecorator(boolean newNeedBorderDecorator) {
-		boolean oldNeedBorderDecorator = needBorderDecorator;
-		needBorderDecorator = newNeedBorderDecorator;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__NEED_BORDER_DECORATOR, oldNeedBorderDecorator, needBorderDecorator));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isNeedTableDecorator() {
-		return needTableDecorator;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNeedTableDecorator(boolean newNeedTableDecorator) {
-		boolean oldNeedTableDecorator = needTableDecorator;
-		needTableDecorator = newNeedTableDecorator;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__NEED_TABLE_DECORATOR, oldNeedTableDecorator, needTableDecorator));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isNonVisual() {
-		return nonVisual;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNonVisual(boolean newNonVisual) {
-		boolean oldNonVisual = nonVisual;
-		nonVisual = newNonVisual;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL, oldNonVisual, nonVisual));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getNonVisualImagePath() {
-		return nonVisualImagePath;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNonVisualImagePath(String newNonVisualImagePath) {
-		String oldNonVisualImagePath = nonVisualImagePath;
-		nonVisualImagePath = newNonVisualImagePath;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH, oldNonVisualImagePath, nonVisualImagePath));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isResolveChildText() {
-		return resolveChildText;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setResolveChildText(boolean newResolveChildText) {
-		boolean oldResolveChildText = resolveChildText;
-		resolveChildText = newResolveChildText;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT, oldResolveChildText, resolveChildText));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResolveAttributeValue getResolveAttributeValue() {
-		return resolveAttributeValue;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetResolveAttributeValue(ResolveAttributeValue newResolveAttributeValue, NotificationChain msgs) {
-		ResolveAttributeValue oldResolveAttributeValue = resolveAttributeValue;
-		resolveAttributeValue = newResolveAttributeValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE, oldResolveAttributeValue, newResolveAttributeValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setResolveAttributeValue(ResolveAttributeValue newResolveAttributeValue) {
-		if (newResolveAttributeValue != resolveAttributeValue) {
-			NotificationChain msgs = null;
-			if (resolveAttributeValue != null)
-				msgs = ((InternalEObject)resolveAttributeValue).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE, null, msgs);
-			if (newResolveAttributeValue != null)
-				msgs = ((InternalEObject)newResolveAttributeValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE, null, msgs);
-			msgs = basicSetResolveAttributeValue(newResolveAttributeValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE, newResolveAttributeValue, newResolveAttributeValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetNonVisualChildElements() {
-		return setNonVisualChildElements;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSetNonVisualChildElements(boolean newSetNonVisualChildElements) {
-		boolean oldSetNonVisualChildElements = setNonVisualChildElements;
-		setNonVisualChildElements = newSetNonVisualChildElements;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS, oldSetNonVisualChildElements, setNonVisualChildElements));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isWidget() {
-		return widget;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWidget(boolean newWidget) {
-		boolean oldWidget = widget;
-		widget = newWidget;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__WIDGET, oldWidget, widget));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE:
-				return basicSetResolveAttributeValue(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_DECORATE_INFO__ID:
-				return getId();
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_HEIGHT:
-				return new Integer(getMinHeight());
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_WIDTH:
-				return new Integer(getMinWidth());
-			case DTInfoPackage.TAG_DECORATE_INFO__MULTI_LEVEL:
-				return isMultiLevel() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_BORDER_DECORATOR:
-				return isNeedBorderDecorator() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_TABLE_DECORATOR:
-				return isNeedTableDecorator() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL:
-				return isNonVisual() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH:
-				return getNonVisualImagePath();
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT:
-				return isResolveChildText() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE:
-				return getResolveAttributeValue();
-			case DTInfoPackage.TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS:
-				return isSetNonVisualChildElements() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__WIDGET:
-				return isWidget() ? Boolean.TRUE : Boolean.FALSE;
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_DECORATE_INFO__ID:
-				setId((String)newValue);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_HEIGHT:
-				setMinHeight(((Integer)newValue).intValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_WIDTH:
-				setMinWidth(((Integer)newValue).intValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MULTI_LEVEL:
-				setMultiLevel(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_BORDER_DECORATOR:
-				setNeedBorderDecorator(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_TABLE_DECORATOR:
-				setNeedTableDecorator(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL:
-				setNonVisual(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH:
-				setNonVisualImagePath((String)newValue);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT:
-				setResolveChildText(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE:
-				setResolveAttributeValue((ResolveAttributeValue)newValue);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS:
-				setSetNonVisualChildElements(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__WIDGET:
-				setWidget(((Boolean)newValue).booleanValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_DECORATE_INFO__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_HEIGHT:
-				setMinHeight(MIN_HEIGHT_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_WIDTH:
-				setMinWidth(MIN_WIDTH_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MULTI_LEVEL:
-				setMultiLevel(MULTI_LEVEL_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_BORDER_DECORATOR:
-				setNeedBorderDecorator(NEED_BORDER_DECORATOR_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_TABLE_DECORATOR:
-				setNeedTableDecorator(NEED_TABLE_DECORATOR_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL:
-				setNonVisual(NON_VISUAL_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH:
-				setNonVisualImagePath(NON_VISUAL_IMAGE_PATH_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT:
-				setResolveChildText(RESOLVE_CHILD_TEXT_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE:
-				setResolveAttributeValue((ResolveAttributeValue)null);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS:
-				setSetNonVisualChildElements(SET_NON_VISUAL_CHILD_ELEMENTS_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__WIDGET:
-				setWidget(WIDGET_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_DECORATE_INFO__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_HEIGHT:
-				return minHeight != MIN_HEIGHT_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_WIDTH:
-				return minWidth != MIN_WIDTH_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__MULTI_LEVEL:
-				return multiLevel != MULTI_LEVEL_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_BORDER_DECORATOR:
-				return needBorderDecorator != NEED_BORDER_DECORATOR_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_TABLE_DECORATOR:
-				return needTableDecorator != NEED_TABLE_DECORATOR_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL:
-				return nonVisual != NON_VISUAL_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH:
-				return NON_VISUAL_IMAGE_PATH_EDEFAULT == null ? nonVisualImagePath != null : !NON_VISUAL_IMAGE_PATH_EDEFAULT.equals(nonVisualImagePath);
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT:
-				return resolveChildText != RESOLVE_CHILD_TEXT_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE:
-				return resolveAttributeValue != null;
-			case DTInfoPackage.TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS:
-				return setNonVisualChildElements != SET_NON_VISUAL_CHILD_ELEMENTS_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__WIDGET:
-				return widget != WIDGET_EDEFAULT;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: ");
-		result.append(id);
-		result.append(", minHeight: ");
-		result.append(minHeight);
-		result.append(", minWidth: ");
-		result.append(minWidth);
-		result.append(", multiLevel: ");
-		result.append(multiLevel);
-		result.append(", needBorderDecorator: ");
-		result.append(needBorderDecorator);
-		result.append(", needTableDecorator: ");
-		result.append(needTableDecorator);
-		result.append(", nonVisual: ");
-		result.append(nonVisual);
-		result.append(", nonVisualImagePath: ");
-		result.append(nonVisualImagePath);
-		result.append(", resolveChildText: ");
-		result.append(resolveChildText);
-		result.append(", setNonVisualChildElements: ");
-		result.append(setNonVisualChildElements);
-		result.append(", widget: ");
-		result.append(widget);
-		result.append(')');
-		return result.toString();
-	}
-
-} //TagDecorateInfoImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoAdapterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoAdapterFactory.java
deleted file mode 100644
index fc18398..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoAdapterFactory.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage
- * @generated
- */
-public class DTInfoAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static DTInfoPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfoAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = DTInfoPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Returns whether this factory is applicable for the type of the object.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-	 * <!-- end-user-doc -->
-	 * @return whether this factory is applicable for the type of the object.
-	 * @generated
-	 */
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject)object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch the delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DTInfoSwitch modelSwitch =
-		new DTInfoSwitch() {
-			public Object caseDTInfo(DTInfo object) {
-				return createDTInfoAdapter();
-			}
-			public Object caseTagConvertInfo(TagConvertInfo object) {
-				return createTagConvertInfoAdapter();
-			}
-			public Object caseOperation(Operation object) {
-				return createOperationAdapter();
-			}
-			public Object caseParameter(Parameter object) {
-				return createParameterAdapter();
-			}
-			public Object caseTagDecorateInfo(TagDecorateInfo object) {
-				return createTagDecorateInfoAdapter();
-			}
-			public Object caseResolveAttributeValue(ResolveAttributeValue object) {
-				return createResolveAttributeValueAdapter();
-			}
-			public Object defaultCase(EObject object) {
-				return createEObjectAdapter();
-			}
-		};
-
-	/**
-	 * Creates an adapter for the <code>target</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param target the object to adapt.
-	 * @return the adapter for the <code>target</code>.
-	 * @generated
-	 */
-	public Adapter createAdapter(Notifier target) {
-		return (Adapter)modelSwitch.doSwitch((EObject)target);
-	}
-
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo <em>DT Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo
-	 * @generated
-	 */
-	public Adapter createDTInfoAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo <em>Tag Convert Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo
-	 * @generated
-	 */
-	public Adapter createTagConvertInfoAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation <em>Operation</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation
-	 * @generated
-	 */
-	public Adapter createOperationAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter <em>Parameter</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter
-	 * @generated
-	 */
-	public Adapter createParameterAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo <em>Tag Decorate Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo
-	 * @generated
-	 */
-	public Adapter createTagDecorateInfoAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue <em>Resolve Attribute Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue
-	 * @generated
-	 */
-	public Adapter createResolveAttributeValueAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for the default case.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createEObjectAdapter() {
-		return null;
-	}
-
-} //DTInfoAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoSwitch.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoSwitch.java
deleted file mode 100644
index b736952..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoSwitch.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage
- * @generated
- */
-public class DTInfoSwitch {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static DTInfoPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfoSwitch() {
-		if (modelPackage == null) {
-			modelPackage = DTInfoPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	public Object doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-		else {
-			List eSuperTypes = theEClass.getESuperTypes();
-			return
-				eSuperTypes.isEmpty() ?
-					defaultCase(theEObject) :
-					doSwitch((EClass)eSuperTypes.get(0), theEObject);
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @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/editors/DesignerStructuredTextEditorJSP.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/DesignerStructuredTextEditorJSP.java
deleted file mode 100644
index dc84c35..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/DesignerStructuredTextEditorJSP.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jst.pagedesigner.dnd.internal.DesignerSourceDropTargetListener;
-import org.eclipse.ui.texteditor.ITextEditorDropTargetListener;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-
-/**
- * @author mengbo
- */
-public class DesignerStructuredTextEditorJSP extends StructuredTextEditor {
-	protected void initializeDrop(ITextViewer textViewer) {
-		// It seems if we don't skip this method, our drag drop listener will
-		// can't be enabled.
-	}
-
-	public IAction getAction(String actionID) {
-		try {
-			return super.getAction(actionID);
-		} catch (Exception e) {
-			return null;
-		}
-	}
-
-	public Object getAdapter(Class required) {
-		if (ITextEditorDropTargetListener.class.equals(required)) {
-			DesignerSourceDropTargetListener listener = new DesignerSourceDropTargetListener(
-					this);
-			return listener;
-		}
-        return super.getAdapter(required);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/HTMLEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/HTMLEditor.java
deleted file mode 100644
index 98f516f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/HTMLEditor.java
+++ /dev/null
@@ -1,1039 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.internal.resources.ResourceException;
-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.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.ui.palette.PaletteViewerProvider;
-import org.eclipse.gef.ui.views.palette.PalettePage;
-import org.eclipse.gef.ui.views.palette.PaletteViewerPage;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.viewers.IPostSelectionProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dnd.internal.DesignerSourceMouseTrackAdapter;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IDocumentPageVariableAdapter;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.preview.PreviewHandlerNew;
-import org.eclipse.jst.pagedesigner.preview.WindowsIEBrowser;
-import org.eclipse.jst.pagedesigner.tools.RangeSelectionTool;
-import org.eclipse.jst.pagedesigner.ui.common.PartActivationHandler;
-import org.eclipse.jst.pagedesigner.ui.common.sash.SashEditorPart;
-import org.eclipse.jst.pagedesigner.utils.PreviewUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.IStorageEditorInput;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.ide.IGotoMarker;
-import org.eclipse.ui.part.MultiPageSelectionProvider;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.wst.common.ui.properties.internal.provisional.ITabbedPropertySheetPageContributor;
-import org.eclipse.wst.common.ui.provisional.editors.PostMultiPageEditorSite;
-import org.eclipse.wst.common.ui.provisional.editors.PostMultiPageSelectionProvider;
-import org.eclipse.wst.common.ui.provisional.editors.PostSelectionMultiPageEditorPart;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.internal.IExtendedMarkupEditor;
-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;
-import org.w3c.dom.Node;
-
-/**
- * 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 class HTMLEditor extends PostSelectionMultiPageEditorPart implements
-		IPropertyListener, ITabbedPropertySheetPageContributor {
-	// private static final String PAGE_NAME_DESIGN = "Design"; //$NON-NLS-1$
-	// private static final String PAGE_NAME_SOURCE = "Source"; //$NON-NLS-1$
-	private final static String CONTRIBUTOR_ID = "org.eclipse.jst.pagedesigner.pageDesigner.tabPropertyContributor"; //$NON-NLS-1$
-
-	// four different modes for the designer when displayed in a sash editor.
-	public static final int MODE_SASH_VERTICAL = 0;
-
-	public static final int MODE_SASH_HORIZONTAL = 1;
-
-	public static final int MODE_DESIGNER = 2;
-
-	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 List PREVIEW_FILES_LIST = new ArrayList();
-
-    // 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());
-//		}
-//	}
-
-	public HTMLEditor() {
-		super();
-	}
-
-	/*
-	 * This method is just to make firePropertyChanged accessbible from some
-	 * (anonomous) inner classes.
-	 */
-	protected void _firePropertyChange(int property) {
-		super.firePropertyChange(property);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.xtools.common.ui.properties.ITabbedPropertySheetPageContributor#getContributorId()
-	 */
-	public String getContributorId() {
-		return CONTRIBUTOR_ID;
-	}
-
-	private void connectSashPage() {
-		ISelectionProvider selectionProvider = _sashEditorPart.getSite()
-				.getSelectionProvider();
-		if (selectionProvider instanceof IPostSelectionProvider) {
-			((IPostSelectionProvider) selectionProvider)
-					.addPostSelectionChangedListener(new ISelectionChangedListener() {
-						public void selectionChanged(SelectionChangedEvent event) {
-							((PostMultiPageSelectionProvider) getSite()
-									.getSelectionProvider())
-									.firePostSelectionChanged(event);
-						}
-					});
-		} else {
-			selectionProvider
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-						public void selectionChanged(SelectionChangedEvent event) {
-							((MultiPageSelectionProvider) getSite()
-									.getSelectionProvider())
-									.fireSelectionChanged(event);
-						}
-					});
-		}
-	}
-
-	/**
-	 * Creates the source page of the multi-page editor.
-	 */
-	protected void sash_createAndAddDesignSourcePage() throws PartInitException {
-		// create source page
-		_textEditor = createTextEditor();
-		_textEditor.setEditorPart(this);
-		_textEditor.addPropertyListener(this);
-		// create design page
-		_designViewer = new SimpleGraphicalEditor(this, getEditDomain());
-
-		// create SashEditor
-		_sashEditorPart = new SashEditorPart() {
-			protected void createPages() throws PartInitException {
-				addPage(_designViewer, getEditorInput());
-				addPage(_textEditor, getEditorInput());
-			}
-		};
-		int sashIndex = addPage(_sashEditorPart, getEditorInput());
-
-		setPageText(sashIndex, PDPlugin.getResourceString("HTMLEditor.Design"));
-
-		// the update's critical, to get viewer selection manager and
-		// highlighting to work
-		_textEditor.update();
-
-		firePropertyChange(PROP_TITLE);
-
-		// Changes to the Text Viewer's document instance should also force an
-		// input refresh
-		// _textEditor.getTextViewer().addTextInputListener(new
-		// TextInputListener());
-		connectSashPage();
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.MultiPageEditorPart#createSite(org.eclipse.ui.IEditorPart)
-	 */
-	protected IEditorSite createSite(IEditorPart editor) {
-		return new PostMultiPageEditorSite(this, editor);
-	}
-
-	protected void tabbed_createAndAddDesignSourcePage()
-			throws PartInitException {
-		// create source page
-		_textEditor = createTextEditor();
-		_textEditor.setEditorPart(this);
-		_textEditor.addPropertyListener(this);
-
-		// create design page
-		SimpleGraphicalEditor editor = new SimpleGraphicalEditor(this,
-				getEditDomain());
-
-		// add design page
-		int designPageIndex = addPage(editor, null);
-
-		_designViewer = editor;
-		// // note: By adding the design page as a Control instead of an
-		// // IEditorPart, page switches will indicate
-		// // a "null" active editor when the design page is made active
-		setPageText(designPageIndex, PDPlugin
-				.getResourceString("HTMLEditor.Design"));
-
-		// add source page
-		int sourcePageIndex = addPage(_textEditor, getEditorInput());
-		setPageText(sourcePageIndex, PDPlugin
-				.getResourceString("HTMLEditor.Source"));
-		// the update's critical, to get viewer selection manager and
-		// highlighting to work
-		_textEditor.update();
-
-		firePropertyChange(PROP_TITLE);
-
-		// Changes to the Text Viewer's document instance should also force an
-		// input refresh
-		// _textEditor.getTextViewer().addTextInputListener(new
-		// TextInputListener());
-	}
-
-	protected void createAndAddPreviewPage() {
-		Composite composite = new Composite(getContainer(), 0);
-		FillLayout filllayout = new FillLayout();
-		composite.setLayout(filllayout);
-		_browser = new WindowsIEBrowser();
-		if (_browser != null) {
-			_browser.create(composite, SWT.NONE);
-			_previewPageIndex = addPage(composite);
-			// JSPSourceEditor.Page.Preview.PageText=Preview
-			setPageText(_previewPageIndex, PageDesignerResources.getInstance()
-					.getString("JSPSourceEditor.Page.Preview.PageText")); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * 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();
-	}
-
-	protected void disconnectDesignPage() {
-		if (_designViewer != null) {
-			_designViewer.setModel(null);
-		}
-	}
-
-	public void dispose() {
-
-		deletePreviewFiles();
-
-		disconnectDesignPage();
-
-		IWorkbenchWindow window = getSite().getWorkbenchWindow();
-		window.getPartService().removePartListener(_partListener);
-		window.getShell().removeShellListener(_partListener);
-		getSite().getPage().removePartListener(_partListener);
-
-		if (_textEditor != null) {
-			_textEditor.removePropertyListener(this);
-		}
-
-		// moved to last when added window ... seems like
-		// we'd be in danger of losing some data, like site,
-		// or something.
-		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];
-				// FIXME: WTF?
-				if (coreException instanceof ResourceException) {
-					// I'm assuming this is always 'does not exist'
-					// we'll refresh local go mimic behavior of default
-					// editor, where the
-					// troublesome file is refreshed (and will cause it to
-					// 'disappear' from Navigator.
-					try {
-						((IFileEditorInput) input).getFile()
-								.refreshLocal(IResource.DEPTH_ZERO,
-										new NullProgressMonitor());
-					} catch (CoreException ce) {
-						if (_log != null) {
-							_log.error("Error.HTMLEditor.0", ce); //$NON-NLS-1$
-						}
-					}
-					throw new PartInitException("Resource " + input.getName()
-							+ " does not exist.");
-				}
-                throw new PartInitException("Editor could not be open on "
-                		+ input.getName());
-			}
-		} else if (input instanceof IStorageEditorInput) {
-			InputStream contents = null;
-			try {
-				contents = ((IStorageEditorInput) input).getStorage()
-						.getContents();
-			} catch (CoreException noStorageExc) {
-				// Error in geting storage contents
-				_log.error("Error.HTMLEditor.1", noStorageExc); //$NON-NLS-1$
-			}
-			if (contents == null) {
-				// throw new
-				// PartInitException(ResourceHandler.getString("32concat_EXC_",
-				// (new Object[] {
-				// input.getName()}))); //$NON-NLS-1$
-				throw new PartInitException("Editor could not be open on "
-						+ input.getName());
-			}
-            ResourceUtils.ensureClosed(contents);
-		}
-	}
-
-	/*
-	 * (non-Javadoc) 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>
-	 */
-	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 {
-				if (input != null) {
-					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;
-	}
-
-	/**
-	 * IExtendedMarkupEditor method XXX:No reference to the method.
-	 */
-	public Node getCaretNode() {
-		if (getTextEditor() == null) {
-			return null;
-		}
-
-		ISourceEditingTextTools adapter = (ISourceEditingTextTools) _textEditor
-				.getAdapter(ISourceEditingTextTools.class);
-		if (adapter instanceof IDOMSourceEditingTextTools) {
-			IDOMSourceEditingTextTools domTools = (IDOMSourceEditingTextTools) adapter;
-			try {
-				return domTools.getNode(domTools.getCaretOffset());
-			} catch (BadLocationException e) {
-				_log.error("BadLocationException", e);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * IExtendedSimpleEditor method
-	 */
-	public int getCaretPosition() {
-		if (getTextEditor() == null) {
-			return -1;
-		}
-
-		// return getExtendedTextEditor().getCaretPosition();
-		Object apapter = _textEditor.getAdapter(ISourceEditingTextTools.class);
-		if (apapter != null) {
-			return ((ISourceEditingTextTools) apapter).getCaretOffset();
-		}
-		return -1;
-	}
-
-	/**
-	 * IExtendedSimpleEditor method
-	 */
-	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
-	 */
-	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
-	 */
-	public IEditorPart getEditorPart() {
-		return this;
-	}
-
-	public IStructuredModel getModel() {
-		IStructuredModel model = null;
-		if (_textEditor != null) {
-			model = ((DesignerStructuredTextEditorJSP) _textEditor).getModel();
-		}
-		return model;
-	}
-
-	/**
-	 * IExtendedMarkupEditor method
-	 */
-	public List getSelectedNodes() {
-		if (getTextEditor() == null) {
-			return null;
-		}
-		// FIXME: when designer as current view, what to return?
-		return getExtendedTextEditor().getSelectedNodes();
-	}
-
-	public StructuredTextEditor getTextEditor() {
-		return _textEditor;
-	}
-
-	public IExtendedMarkupEditor getExtendedTextEditor() {
-		if (_textEditor instanceof IExtendedMarkupEditor) {
-			return (IExtendedMarkupEditor) _textEditor;
-		}
-		return null;
-	}
-
-	/*
-	 * (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;
-	}
-
-	/*
-	 * (non-Javadoc) Sets the cursor and selection state for this editor to the
-	 * passage defined by the given marker. <p> Subclasses may override. For
-	 * greater details, see <code> IEditorPart </code></p>
-	 * 
-	 * @see IEditorPart
-	 */
-	public void gotoMarker(IMarker marker) {
-		// (pa) 20020217 this was null when opening an editor that was
-		// already open
-		if (_textEditor != null) {
-			IGotoMarker markerGotoer = (IGotoMarker) _textEditor
-					.getAdapter(IGotoMarker.class);
-			markerGotoer.gotoMarker(marker);
-		}
-	}
-
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		super.init(site, input);
-		editorInputIsAcceptable(input);
-		try {
-			// super.init(site, input);
-			// setSite(site);
-			setInput(input);
-			if (_partListener == null) {
-				_partListener = new PartActivationHandler(this) {
-					public void handleActivation() {
-						safelySanityCheckState();
-					}
-				};
-			}
-			// we want to listen for our own activation
-			IWorkbenchWindow window = getSite().getWorkbenchWindow();
-			window.getPartService().addPartListener(_partListener);
-			window.getShell().addShellListener(_partListener);
-			
-			// TODO: is this the right place to do this?
-			// enable our editor context
-			IContextService contextService = (IContextService) getSite()
-			  .getService(IContextService.class);
-			contextService.activateContext("org.eclipse.jst.pagedesigner.editorContext");
-
-		} catch (Exception e) {
-			// Error in editor initialization
-			_log.error("Error.HTMLEditor.5", e); //$NON-NLS-1$
-		}
-		setPartName(input.getName());
-	}
-
-	/*
-	 * (non-Javadoc) Returns whether the "save as" operation is supported by
-	 * this editor. <p> Subclasses must override this method to implement the
-	 * open-save-close lifecycle for an editor. For greater details, see <code>
-	 * IEditorPart </code></p>
-	 * 
-	 * @see IEditorPart
-	 */
-	public boolean isSaveAsAllowed() {
-		return _textEditor != null && _textEditor.isSaveAsAllowed();
-	}
-
-	/*
-	 * (non-Javadoc) Returns whether the contents of this editor should be saved
-	 * when the editor is closed. <p> This method returns <code> true </code> if
-	 * and only if the editor is dirty ( <code> isDirty </code> ). </p>
-	 */
-	public boolean isSaveOnCloseNeeded() {
-		// overriding super class since it does a lowly isDirty!
-		if (_textEditor != null) {
-			return _textEditor.isSaveOnCloseNeeded();
-		}
-		return isDirty();
-	}
-
-	/**
-	 * Posts the update code "behind" the running operation.
-	 */
-	protected 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;
-		}
-		}
-
-	}
-
-	protected 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();
-	}
-
-	protected IPropertySheetPage getPropertySheetPage() {
-		return new org.eclipse.jst.pagedesigner.properties.DesignerTabbedPropertySheetPage(
-				this, this);
-	}
-
-	protected PaletteViewerPage getPaletteViewerPage() {
-		if (null == _paletteViewerPage) {
-			DefaultEditDomain editDomain = getEditDomain();
-			PaletteItemManager manager = PaletteItemManager
-					.getInstance(getCurrentProject(getEditorInput()));
-			manager.reset();
-            PaletteRoot paletteRoot = _designViewer.getPaletteRoot();
-            editDomain.setPaletteRoot(paletteRoot);
-            
-            _paletteViewerPage = (PaletteViewerPage) _designViewer.getAdapter(PalettePage.class);
-            // if possible, try to use the 
-            if (_paletteViewerPage == null)
-            {
-                PaletteViewerProvider provider = _designViewer.getPaletteViewerProvider2();
-                _paletteViewerPage = new PaletteViewerPage(provider);
-            }
-		}
-		return _paletteViewerPage;
-	}
-
-	/**
-	 * @return
-	 */
-	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);
-				_browser.loadFile(file);
-			} else {
-				_browser.getBrowser().setUrl("about:blank"); //$NON-NLS-1$
-			}
-		}
-	}
-
-	/**
-	 * @return Returns the _designViewer.
-	 */
-	public IDesignViewer getDesignViewer() {
-		return _designViewer;
-	}
-
-	/**
-	 * @param mode
-	 */
-	public void setDesignerMode(int mode) {
-		if (_sashEditorPart != null) {
-			switch (mode) {
-			case MODE_SASH_HORIZONTAL:
-				_sashEditorPart.setOrientation(SWT.HORIZONTAL);
-				break;
-			case MODE_DESIGNER:
-				_sashEditorPart.setMaximizedEditor(this._designViewer);
-				break;
-			case MODE_SOURCE:
-				_sashEditorPart.setMaximizedEditor(this._textEditor);
-				break;
-			case MODE_SASH_VERTICAL:
-			default:
-				_sashEditorPart.setOrientation(SWT.VERTICAL);
-			}
-		}
-		this._mode = mode;
-	}
-
-	public int getDesignerMode() {
-		return this._mode;
-	}
-
-	private IProject getCurrentProject(IEditorInput input) {
-		IProject curProject = null;
-		IFile inputFile = null;
-		if (input instanceof IFileEditorInput) {
-			inputFile = ((IFileEditorInput) input).getFile();
-			curProject = inputFile.getProject();
-		}
-		return curProject;
-	}
-
-	public IEditorPart getActiveEditor() {
-		IEditorPart result = null;
-		if (_sash) {
-			result = _sashEditorPart.getActiveEditor();
-		} else {
-			if (_designViewer.getGraphicViewer().getControl().isFocusControl()) {
-				result = _designViewer;
-			} else if (_textEditor.getTextViewer().getControl()
-					.isFocusControl()) {
-				result = _textEditor;
-			}
-		}
-		return result;
-	}
-
-	public String getPartName() {
-		if (_textEditor != null) {
-			return _textEditor.getPartName();
-		}
-        return super.getPartName();
-	}
-
-	private void deletePreviewFiles() {
-		Iterator itPreviewFiles = PREVIEW_FILES_LIST.iterator();
-		while (itPreviewFiles.hasNext()) {
-			File file = (File)itPreviewFiles.next();
-			if (file != null && file.exists()) {
-				file.delete();
-			}
-		}
-		PREVIEW_FILES_LIST.clear();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/IDesignViewer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/IDesignViewer.java
deleted file mode 100644
index 83f37be..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/IDesignViewer.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.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 {
-	String getTitle();
-
-	void setModel(IStructuredModel model);
-
-	// void setViewerSelectionManager(ViewerSelectionManager
-	// viewerSelectionManager);
-
-	/**
-	 * @return
-	 */
-	public IHTMLGraphicalViewer getGraphicViewer();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/OutlineConfiguration.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/OutlineConfiguration.java
deleted file mode 100644
index c667b04..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/OutlineConfiguration.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.editors;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jst.jsp.ui.views.contentoutline.JSPContentOutlineConfiguration;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-
-public class OutlineConfiguration extends JSPContentOutlineConfiguration {
-	private Object[] _selections = new Object[0];
-
-	public ISelection getSelection(TreeViewer viewer, ISelection selection) {
-		if ((viewer.getInput() instanceof IStructuredModel)
-				&& (selection instanceof ITextSelection)) {
-			_selections = getSelectedObjects((IStructuredModel) viewer
-					.getInput(), (ITextSelection) selection);
-			if (_selections != null) {
-				return super.getSelection(viewer, new StructuredSelection(
-						_selections));
-			}
-		}
-		return super.getSelection(viewer, new StructuredSelection(_selections));
-	}
-
-	private Object[] getSelectedObjects(IStructuredModel model,
-			ITextSelection selection) {
-		Object[] selectedStructures = null;
-		if (model != null) {
-			IndexedRegion region = model
-					.getIndexedRegion(selection.getOffset());
-			int end = selection.getOffset() + selection.getLength();
-			if (region != null) {
-				if (end <= region.getEndOffset()) {
-					// single selection
-					selectedStructures = new Object[1];
-					selectedStructures[0] = region;
-				} else {
-					// multiple selection
-					int maxLength = model.getStructuredDocument().getLength();
-					List structures = new ArrayList(2);
-					while (region != null && region.getEndOffset() <= end
-							&& region.getEndOffset() < maxLength) {
-						structures.add(region);
-						region = model
-								.getIndexedRegion(region.getEndOffset() + 1);
-					}
-					selectedStructures = structures.toArray();
-				}
-			}
-		}
-		if (selectedStructures == null) {
-			selectedStructures = new Object[0];
-		}
-		return selectedStructures;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/PageDesignerActionConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/PageDesignerActionConstants.java
deleted file mode 100644
index 6f9c12f..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 styleSubmenu
-     */
-    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 bea341f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SelectionSynchronizer.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.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;
-	}
-
-	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.
-	 */
-	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 5865a27..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SimpleGraphicalEditor.java
+++ /dev/null
@@ -1,735 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.editparts.ScalableRootEditPart;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.ui.actions.ActionRegistry;
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.gef.ui.palette.PaletteViewer;
-import org.eclipse.gef.ui.palette.PaletteViewerProvider;
-import org.eclipse.gef.ui.palette.FlyoutPaletteComposite.FlyoutPreferences;
-import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette;
-import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.container.ContainerActionGroup;
-import org.eclipse.jst.pagedesigner.actions.menuextension.CustomedContextMenuActionGroup;
-import org.eclipse.jst.pagedesigner.actions.range.RangeActionGroup;
-import org.eclipse.jst.pagedesigner.actions.single.SingleElementActionGroup;
-import org.eclipse.jst.pagedesigner.commands.CopyAction;
-import org.eclipse.jst.pagedesigner.commands.CutAction;
-import org.eclipse.jst.pagedesigner.commands.DeleteAction;
-import org.eclipse.jst.pagedesigner.commands.PasteAction;
-import org.eclipse.jst.pagedesigner.dnd.internal.DesignerTemplateTransferDragSourceListener;
-import org.eclipse.jst.pagedesigner.dnd.internal.LocalSelectionDropTargetListener;
-import org.eclipse.jst.pagedesigner.dnd.internal.PDTemplateTransferDropTargetListener;
-import org.eclipse.jst.pagedesigner.dnd.internal.ResouceDropTargetListener;
-import org.eclipse.jst.pagedesigner.editors.actions.ActionsMessages;
-import org.eclipse.jst.pagedesigner.editors.actions.DesignerUndoRedoAction;
-import org.eclipse.jst.pagedesigner.editors.actions.RelatedViewActionGroup;
-import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteCustomizer;
-import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteViewerProvider;
-import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteRootFactory;
-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.HTMLGraphicalViewer;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
-import org.eclipse.wst.sse.core.internal.PropagatingAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.IModelStateListener;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.undo.IDocumentSelectionMediator;
-import org.eclipse.wst.sse.core.internal.undo.UndoDocumentEvent;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-
-/**
- * @author mengbo
- */
-public class SimpleGraphicalEditor extends GraphicalEditorWithFlyoutPalette implements
-		IDesignViewer, IDocumentSelectionMediator {
-
-    private HTMLEditor _delegate;
-
-	private HTMLGraphicalViewer _viewer;
-
-	private IStructuredModel _model;
-
-	/** Palette component, holding the tools and shapes. */
-	private PaletteRoot _palette;
-
-	private SelectionSynchronizer _synchronizer = new SelectionSynchronizer(
-			this);
-
-	private IModelStateListener _internalModelListener = new IModelStateListener() {
-		public void modelAboutToBeChanged(IStructuredModel model) {
-            // do nothing
-		}
-
-		public void modelChanged(IStructuredModel model) {
-			updateActionsWhenModelChange();
-		}
-
-		public void modelDirtyStateChanged(IStructuredModel model,
-				boolean isDirty) {
-            // do nothing
-		}
-
-		public void modelResourceDeleted(IStructuredModel model) {
-            // do nothing
-		}
-
-		public void modelResourceMoved(IStructuredModel oldModel,
-				IStructuredModel newModel) {
-            // do nothing
-		}
-
-		public void modelAboutToBeReinitialized(IStructuredModel structuredModel) {
-            // do nothing
-		}
-
-		public void modelReinitialized(IStructuredModel structuredModel) {
-            // do nothing
-		}
-	};
-
-	public SimpleGraphicalEditor(HTMLEditor delegate,
-			DefaultEditDomain editdomain) {
-		_delegate = delegate;
-		this.setEditDomain(editdomain);
-	}
-
-	protected void createGraphicalViewer(Composite parent) {
-		_viewer = new HTMLGraphicalViewer(this);
-		Control control = _viewer.createControl(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(control,
-				PDPlugin.getResourceString("SimpleGraphicalEditor.help.id"));
-		setGraphicalViewer(_viewer);
-		configureGraphicalViewer();
-		hookGraphicalViewer();
-		initializeGraphicalViewer();
-		initializeContextMenu();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditor#dispose()
-	 */
-	public void dispose() {
-		if (_model != null) {
-			_model.getUndoManager().disconnect(this);
-		}
-
-		super.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditor#initializeGraphicalViewer()
-	 */
-	protected void initializeGraphicalViewer() {
-		ScalableRootEditPart rootEditPart = new ScalableRootEditPart();
-		_viewer.setRootEditPart(rootEditPart);
-
-		_viewer.getViewport().setContentsTracksWidth(true);
-
-		_viewer.setKeyHandler(new GraphicalViewerKeyHandler(_viewer));
-
-		// initialize the viewer with input
-		// IStructuredModel sModel =
-		// StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(ContentTypeIdForHTML.ContentTypeID_HTML);
-		// IDOMDocument designDoc = ((IDOMModel)sModel).getDocument();
-		// HTMLEditPartsFactory factory = new HTMLEditPartsFactory(designDoc);
-		HTMLEditPartsFactory factory = new HTMLEditPartsFactory(null);
-
-		_viewer.setEditPartFactory(factory);
-
-		// for sync with source view.
-
-		_viewer.addDropTargetListener(new LocalSelectionDropTargetListener(
-				_viewer));
-		_viewer.addDropTargetListener(new PDTemplateTransferDropTargetListener(
-				_viewer));
-		_viewer.addDropTargetListener(new ResouceDropTargetListener(_viewer));
-
-		// add double click support.
-		_viewer.getControl().addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				try {
-					getSite().getPage().showView(IPageLayout.ID_PROP_SHEET);
-				} catch (PartInitException e1) {
-					// ignore
-				}
-			}
-		});
-        
-        super.initializeGraphicalViewer();
-	}
-
-	protected void initializeContextMenu() {
-		Control gviewer = _viewer.getControl();
-		MenuManager menuMgr = new MenuManager();
-		menuMgr.setRemoveAllWhenShown(true);
-		Menu menu = menuMgr.createContextMenu(gviewer);
-		gviewer.setMenu(menu);
-		menuMgr.addMenuListener(new ContextMenuListener());
-		getSite().registerContextMenu(
-				"HTMLVisualEditor.contextMenu", menuMgr, _viewer); //$NON-NLS-1$
-	}
-
-	private void updateActionsWhenModelChange() {
-		// update undo/redo action
-		IAction action = this.getAction(IWorkbenchActionDefinitionIds.UNDO);
-		((UpdateAction) action).update();
-
-		action = this.getAction(IWorkbenchActionDefinitionIds.REDO);
-		((UpdateAction) action).update();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditor#createActions()
-	 */
-	protected void createActions() {
-		super.createActions();
-		ActionRegistry registry = getActionRegistry();
-		ISharedImages sharedImages = PlatformUI.getWorkbench()
-				.getSharedImages();
-
-		IAction action;
-
-		action = new DesignerUndoRedoAction(true, this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_UNDO));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_UNDO_DISABLED));
-		action.setActionDefinitionId(IWorkbenchActionDefinitionIds.UNDO);
-		action.setId(IWorkbenchActionDefinitionIds.UNDO);
-		getSite().getKeyBindingService().registerAction(action);
-		registry.registerAction(action);
-
-		action = new DesignerUndoRedoAction(false, this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_REDO));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_REDO_DISABLED));
-		action.setActionDefinitionId(IWorkbenchActionDefinitionIds.REDO);
-		action.setId(IWorkbenchActionDefinitionIds.REDO);
-		getSite().getKeyBindingService().registerAction(action);
-		registry.registerAction(action);
-
-		action = new DeleteAction(this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE_DISABLED));
-		action.setActionDefinitionId(IWorkbenchActionDefinitionIds.DELETE);
-		action.setId(IWorkbenchActionDefinitionIds.DELETE);
-		getSite().getKeyBindingService().registerAction(action);
-		this.getSelectionActions().add(action.getId());
-		registry.registerAction(action);
-
-		action = new CopyAction(this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_COPY_DISABLED));
-		action.setActionDefinitionId(IWorkbenchActionDefinitionIds.COPY);
-		action.setId(IWorkbenchActionDefinitionIds.COPY);
-		getSite().getKeyBindingService().registerAction(action);
-		this.getSelectionActions().add(action.getId());
-		registry.registerAction(action);
-
-		action = new CutAction(this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_CUT));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_CUT_DISABLED));
-		action.setActionDefinitionId(IWorkbenchActionDefinitionIds.CUT);
-		action.setId(IWorkbenchActionDefinitionIds.CUT);
-		getSite().getKeyBindingService().registerAction(action);
-		this.getSelectionActions().add(action.getId());
-		registry.registerAction(action);
-
-		action = new PasteAction(this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE_DISABLED));
-		action.setActionDefinitionId(IWorkbenchActionDefinitionIds.PASTE);
-		action.setId(IWorkbenchActionDefinitionIds.PASTE);
-		getSite().getKeyBindingService().registerAction(action);
-		this.getSelectionActions().add(action.getId());
-		registry.registerAction(action);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		if (_delegate != null) {
-			_delegate.doSave(monitor);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#doSaveAs()
-	 */
-	public void doSaveAs() {
-		if (_delegate != null) {
-			_delegate.doSaveAs();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#isDirty()
-	 */
-	public boolean isDirty() {
-		if (_delegate != null) {
-			return _delegate.isDirty();
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		if (_delegate != null) {
-			return _delegate.isSaveAsAllowed();
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.html.editor.IDesignViewer#setModel(com.ibm.sse.model.IStructuredModel)
-	 */
-	public void setModel(IStructuredModel model) {
-		if (_model != null) {
-			if (_model.getUndoManager() != null)
-				_model.getUndoManager().disconnect(this);
-			_model.removeModelStateListener(_internalModelListener);
-		}
-
-		this._model = model;
-
-		if (_model != null) {
-			_model.addModelStateListener(_internalModelListener);
-			if (_model.getUndoManager() != null) {
-				_model.getUndoManager().connect(this);
-				updateActionsWhenModelChange();
-			}
-		}
-
-		if (model instanceof IDOMModel) {
-			IDOMDocument doc = ((IDOMModel) model).getDocument();
-			PropagatingAdapter adapter = (PropagatingAdapter) doc
-					.getAdapterFor(PropagatingAdapter.class);
-			if (adapter != null) {
-				INodeAdapterFactory factory = RefresherFactory.getInstance();
-				adapter.addAdaptOnCreateFactory(factory);
-				adapter.initializeForFactory(factory, doc);
-				// CSSStyleAdapterFactory fac2 =
-				// CSSStyleAdapterFactory.getInstance();
-				// adapter.addAdaptOnCreateFactory(fac2);
-				// adapter.initializeForFactory(fac2, doc);
-			}
-			((IDOMModel) model).getFactoryRegistry().addFactory(
-					CSSStyleAdapterFactory.getInstance());
-
-			// _viewer.getDestDocumentForDesign().getModel().getFactoryRegistry().addFactory(CSSStyleAdapterFactory.getInstance());
-			((IDOMModel) model).getFactoryRegistry().addFactory(
-					new PageVariableAdapterFactory());
-			doc.addAdapter(new DocumentPageVariableAdapter(doc));
-			_viewer.setContents(((IDOMModel) model).getDocument());
-		} else {
-			_viewer.setContents((EditPart) null);
-		}
-	}
-
-	protected SelectionSynchronizer getSynchronizer() {
-		return _synchronizer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.sse.model.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditor#updateActions(java.util.List)
-	 */
-	protected void updateActions(List actionIds) {
-		super.updateActions(actionIds);
-	}
-
-	public IAction getAction(Object id) {
-		// lium: following lines commented out, see comments in
-		// DesignerUndoRedoAction
-		// if (ITextEditorActionConstants.UNDO.equals(id) ||
-		// ITextEditorActionConstants.REDO.equals(id))
-		// {
-		// return _delegate.getTextEditor().getAction((String) id);
-		// }
-		return getActionRegistry().getAction(id);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#getPalettePreferences()
-	 */
-	protected FlyoutPreferences getPalettePreferences() {
-		return DesignerPaletteRootFactory.createPalettePreferences();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#getPaletteRoot()
-	 */
-	protected PaletteRoot getPaletteRoot() {
-		if (_palette == null) {
-			_palette = DesignerPaletteRootFactory
-					.createPaletteRoot(getCurrentProject(_delegate.getEditorInput()));
-		}
-		return _palette;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#createPaletteViewerProvider()
-	 */
-	protected PaletteViewerProvider createPaletteViewerProvider() {
-		return new DesignerPaletteViewerProvider(getEditDomain()) {
-			protected void configurePaletteViewer(PaletteViewer viewer) {
-				super.configurePaletteViewer(viewer);
-				viewer.setCustomizer(new DesignerPaletteCustomizer());
-
-				// create a drag source listener for this palette viewer
-				// together with an appropriate transfer drop target listener,
-				// this will enable
-				// model element creation by dragging a
-				// CombinatedTemplateCreationEntries
-				// from the palette into the editor
-				// @see ShapesEditor#createTransferDropTargetListener()
-				viewer
-						.addDragSourceListener(new DesignerTemplateTransferDragSourceListener(
-								viewer));
-			}
-		};
-	}
-
-    PaletteViewerProvider getPaletteViewerProvider2()
-    {
-        return getPaletteViewerProvider();
-    }
-    
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editors.IDesignViewer#getGraphicViewer()
-	 */
-	public IHTMLGraphicalViewer getGraphicViewer() {
-		return _viewer;
-	}
-
-	public HTMLEditor getHTMLEditor() {
-		return _delegate;
-	}
-
-	private IProject getCurrentProject(IEditorInput input) {
-		IProject curProject = null;
-		IFile inputFile = null;
-		if (input instanceof IFileEditorInput) {
-			inputFile = ((IFileEditorInput) input).getFile();
-			curProject = inputFile.getProject();
-		}
-		return curProject;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		if (_viewer != null) {
-			GraphicalViewer viewerViewer = getGraphicalViewer();
-			if (viewerViewer != null && viewerViewer.getControl() != null
-					&& viewerViewer.getControl().isFocusControl()) {
-				updateActions(getSelectionActions());
-				if (selection instanceof IStructuredSelection && //
-						!(((IStructuredSelection) selection).getFirstElement() instanceof DocumentEditPart)) {
-					((HTMLGraphicalViewer) viewerViewer)
-							.updateRangeSelection(selection);
-				}
-			}
-		} else {
-			super.selectionChanged(part, selection);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.undo.IDocumentSelectionMediator#getDocument()
-	 */
-	public IDocument getDocument() {
-		if (_model != null) {
-			return _model.getStructuredDocument();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.undo.IDocumentSelectionMediator#undoOperationSelectionChanged(org.eclipse.wst.sse.core.internal.undo.UndoDocumentEvent)
-	 */
-	public void undoOperationSelectionChanged(UndoDocumentEvent event) {
-		IDocumentSelectionMediator requester = event.getRequester();
-		if (this == requester) {
-			// ok, the undo/redo operation is initialized by designer page.
-			// we should set selection in designer.
-			// However, when this method is called, the modelChanged event is
-			// not fired yet, so the
-			// editpart hasn't refreshed yet. So we register a
-			// modelStateListener, and do the selection
-			// in modelChangedEvent. (lium)
-			final int offset = event.getOffset();
-			final int length = event.getLength();
-
-			_model.addModelStateListener(new IModelStateListener() {
-				public void modelAboutToBeChanged(IStructuredModel model) {
-                    // nothing to do
-				}
-
-				public void modelChanged(IStructuredModel model) {
-					_model.removeModelStateListener(this);
-					ISelection sel = SelectionHelper
-							.convertToDesignerSelection(getGraphicViewer(),
-									offset, length);
-					if (sel != null) {
-						getGraphicViewer().setSelection(sel);
-					}
-				}
-
-				public void modelDirtyStateChanged(IStructuredModel model,
-						boolean isDirty) {
-                    // do  nothing
-				}
-
-				public void modelResourceDeleted(IStructuredModel model) {
-                    // do nothign
-				}
-
-				public void modelResourceMoved(IStructuredModel oldModel,
-						IStructuredModel newModel) {
-                    // do nothing
-				}
-
-				public void modelAboutToBeReinitialized(
-						IStructuredModel structuredModel) {
-                    // do nothing
-				}
-
-				public void modelReinitialized(IStructuredModel structuredModel) {
-                    // do nothing
-				}
-			});
-		}
-	}
- 
-    private final class ContextMenuListener implements IMenuListener 
-    {
-        public void menuAboutToShow(IMenuManager menuMgr1) 
-        {
-            // add standarized sub-menus
-            addEditSubMenu(menuMgr1);
-            addSelectSubMenu(menuMgr1);
-            addInsertSubMenu(menuMgr1);
-            addNavigateSubMenu(menuMgr1);
-            addStyleSubMenu(menuMgr1);
-            
-            // add separators that mark standard append locations in the main
-            // context menu
-            PageDesignerActionConstants.addStandardActionGroups(menuMgr1);
-
-            // TODO: Run/Debug?
-            
-            // insert ElementEdit contributed menu items
-            final ContainerActionGroup containerActionGroup = 
-                new ContainerActionGroup();
-            ActionContext context = new ActionContext(_viewer
-                    .getSelection());
-            context.setInput(_viewer);
-            containerActionGroup.setContext(context);
-            containerActionGroup.fillContextMenu(menuMgr1);
-            containerActionGroup.setContext(null);
-
-            // TODO: TableActionGroup
-
-            // if on a text context, (instead of a ElementEditPart),
-            // add text styling actions
-            final RangeActionGroup rangeActionGroup = new RangeActionGroup();
-            context = new ActionContext(_viewer.getSelection());
-            context.setInput(_viewer);
-            rangeActionGroup.setContext(context);
-            rangeActionGroup.fillContextMenu(menuMgr1);
-            rangeActionGroup.setContext(null);
-
-            // Add actions for single ElementEditPart's that are common
-            // to all
-            final SingleElementActionGroup singleActionGroup = 
-                new SingleElementActionGroup();
-            singleActionGroup.setContext(new ActionContext(_viewer
-                    .getSelection()));
-            singleActionGroup.fillContextMenu(menuMgr1);
-            singleActionGroup.setContext(null);
-
-            // add "Show In" actions...
-            final RelatedViewActionGroup viewMenu = new RelatedViewActionGroup(getEditDomain());
-            context = new ActionContext(_viewer.getSelection());
-            viewMenu.setContext(context);
-            viewMenu.fillContextMenu(menuMgr1);
-
-            // add extension point contributed menu actions
-            CustomedContextMenuActionGroup customedMenu = new CustomedContextMenuActionGroup();
-            customedMenu.setContext(new ActionContext(_viewer
-                    .getSelection()));
-            customedMenu.setModel(_model);
-            customedMenu.setParentControl(_viewer.getControl());
-            customedMenu.fillContextMenu(menuMgr1);
-            customedMenu.setContext(null);
-            customedMenu.setParentControl(null);
-            customedMenu.setModel(null);
-        }
-        
-        private void addNavigateSubMenu(IMenuManager menu) {
-            final IMenuManager  navigateSubmenu = 
-                new MenuManager(ActionsMessages.getString("Navigate.Menu")  //$NON-NLS-1$
-                        , PageDesignerActionConstants.NAVIGATE_SUBMENU_ID);
-            menu.add(navigateSubmenu);
-            PageDesignerActionConstants.addStandardNavigateActionGroups(navigateSubmenu);
-        }
-
-        private void addEditSubMenu(IMenuManager menu)
-        {
-            final IMenuManager  editSubmenu 
-                = new MenuManager(ActionsMessages.getString("Edit.Menu")  //$NON-NLS-1$
-                        , PageDesignerActionConstants.EDIT_SUBMENU_ID);
-            menu.add(editSubmenu);
-            PageDesignerActionConstants.addStandardEditActionGroups(editSubmenu);
-            
-            // FIXME: for UNDO/REDO, maybe need also wrap them in
-            // DesignerCommand.
-            // otherwise don't have validate() called after the source
-            // change.
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_UNDO,
-                    getAction(IWorkbenchActionDefinitionIds.UNDO));
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_UNDO,
-                    getAction(IWorkbenchActionDefinitionIds.REDO));
-
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_EDIT,
-                    getAction(IWorkbenchActionDefinitionIds.CUT));
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_EDIT,
-                    getAction(IWorkbenchActionDefinitionIds.COPY));
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_EDIT,
-                    getAction(IWorkbenchActionDefinitionIds.PASTE));
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_EDIT,
-                    getAction(IWorkbenchActionDefinitionIds.DELETE));
-
-        }
-        
-        private void addStyleSubMenu(IMenuManager menu)
-        {
-            final IMenuManager  styleSubmenu = 
-                new MenuManager(ActionsMessages.getString("Style.Menu")  //$NON-NLS-1$
-                        , PageDesignerActionConstants.STYLE_SUBMENU_ID);
-            menu.add(styleSubmenu);
-            PageDesignerActionConstants.addStandardStyleActionGroups(styleSubmenu);
-        }
-        private void addInsertSubMenu(IMenuManager menu) {
-            final IMenuManager  insertSubmenu = 
-                new MenuManager(ActionsMessages.getString("Insert.Menu")  //$NON-NLS-1$
-                        , PageDesignerActionConstants.INSERT_SUBMENU_ID);
-            menu.add(insertSubmenu);
-            PageDesignerActionConstants.addStandardInsertActionGroups(insertSubmenu);
-        }
-        
-        private void addSelectSubMenu(IMenuManager menu)
-        {
-            final IMenuManager  selectSubMenu = 
-                new MenuManager(ActionsMessages.getString("Select.Menu")  //$NON-NLS-1$
-                        , PageDesignerActionConstants.SELECT_SUBMENU_ID);
-            menu.add(selectSubMenu);
-            PageDesignerActionConstants.addStandardSelectActionGroups(selectSubMenu);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.java
deleted file mode 100644
index 4d0e649..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.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.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
-	}
-
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.properties
deleted file mode 100644
index 6944ae3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.properties
+++ /dev/null
@@ -1,43 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-DesignActionBarFactory.Underline=Underline
-DesignActionBarFactory.Italic=Italic
-DesignActionBarFactory.Bold=Bold
-DesignActionBarFactory.Small=Small
-DesignActionBarFactory.Big=Big
-DesignActionBarFactory.Paragraph=Paragraph
-DesignActionBarFactory.Underline.Text=Underline
-DesignActionBarFactory.Italic.Text=Italic
-DesignActionBarFactory.Bold.Text=Bold
-DesignActionBarFactory.Small.Text=Small
-DesignActionBarFactory.Big.Text=Big
-PaletteViewAction.Menu.PaletteView=Palette
-RelatedViewActionGroup.Menu.ShowView=Show
-PropertiesViewAction.Menu.Properties=Properties
-DataBindingViewAction.Menu.DataBinding=DataBinding
-OutlineViewAction.Menu.OutlineView=Outline
-DesignerStyleActionGroup.CommandLabel.V=V
-DesignerStyleActionGroup.CommandLabel.H=H
-DesignerStyleActionGroup.CommandLabel.D=D
-DesignerStyleActionGroup.CommandLabel.S=S
-DesignerStyleActionGroup.CommandLabel.V.Tooltip=Show Design Page and Source Page as Horizontal Panes
-DesignerStyleActionGroup.CommandLabel.H.Tooltip=Show Design Page and Source Page as Vertical Panes
-DesignerStyleActionGroup.CommandLabel.D.Tooltip=Only Show Design Page
-DesignerStyleActionGroup.CommandLabel.S.Tooltip=Only Show Source Page
-DesignerUndoRedoAction.UNDO=Undo
-DesignerUndoRedoAction.REDO=Redo
-DesignerUndoRedoAction.UNDO_LABEL=Undo {0}
-DesignerUndoRedoAction.REDO_LABEL=Redo {0}
-Select.Menu=Select
-Edit.Menu=Edit
-Navigate.Menu=Navigate
-Style.Menu=Style
-Insert.Menu=Insert
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ChangeStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ChangeStyleAction.java
deleted file mode 100644
index 2a2e784..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ChangeStyleAction.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.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.IHTMLGraphicalViewer;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewerListener;
-import org.eclipse.ui.texteditor.IUpdate;
-
-/**
- * @author mengbo
- */
-public abstract class ChangeStyleAction extends Action implements IUpdate {
-	protected IHTMLGraphicalViewer _viewer;
-
-	String _expectedTag;
-
-	String _expectedCSSProperty;
-
-	String _expectedCSSPropertyValue;
-
-	IHTMLGraphicalViewerListener _listener = new IHTMLGraphicalViewerListener() {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewerListener#selectionAboutToChange()
-		 */
-		public void selectionAboutToChange() {
-            // do nothing
-		}
-
-		/*
-		 * (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 image
-	 */
-	public ChangeStyleAction(String text, String name, ImageDescriptor image,
-			int style) {
-		super(text, style);
-		_expectedTag = name;
-		this.setImageDescriptor(image);
-	}
-
-	public void setViewer(IHTMLGraphicalViewer viewer) {
-		if (viewer == _viewer) {
-			return;
-		}
-		if (_viewer != null) {
-			_viewer.removeSelectionChangedListener(_listener);
-		}
-		_viewer = viewer;
-		if (_viewer != null) {
-			_viewer.addSelectionChangedListener(_listener);
-		}
-		update();
-	}
-
-	/**
-	 * 
-	 */
-	public void update() {
-		if (_viewer == null) {
-			this.setChecked(false);
-			this.setEnabled(false);
-			return;
-		}
-		if (!_viewer.isInRangeMode()) {
-			// XXX: later we may support in range mode.
-			this.setChecked(false);
-			this.setEnabled(false);
-			return;
-		}
-		DesignRange range = _viewer.getRangeSelection();
-		if (range == null || !range.isValid()) {
-			this.setChecked(false);
-			this.setEnabled(false);
-			return;
-		}
-		updateStatus(RangeUtil.normalize(range));
-	}
-
-	/**
-	 * @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
-	 */
-	protected abstract String getExpectedCSSPropertyValue();
-
-	/**
-	 * @return
-	 */
-	protected abstract String getExpectedCSSProperty();
-
-	/**
-	 * @return
-	 */
-	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 a3350c8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DataBindingViewAction.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.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 {
-	public final static String ID = "org.eclipse.jst.pagedesigner.editors.actions.DataBindingViewAction"; //$NON-NLS-1$
-
-	private static Logger _log = PDPlugin
-			.getLogger(DataBindingViewAction.class);
-
-	public DataBindingViewAction() {
-		setText(ActionsMessages
-				.getString("DataBindingViewAction.Menu.DataBinding")); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		try {
-			getPage().showView(
-					"org.eclipse.jst.pagedesigner.databinding.ui.views.DataBindingsView");//$NON-NLS-1$
-		} catch (PartInitException e) {
-			_log.error("Error opening the DataBindingView");
-		}
-	}
-
-	private IWorkbenchPage getPage() {
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-		return window.getActivePage();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignActionBarFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignActionBarFactory.java
deleted file mode 100644
index 03fb36c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignActionBarFactory.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.range.ChangeStyleAction;
-import org.eclipse.jst.pagedesigner.actions.range.DesignerToolBarAction;
-import org.eclipse.jst.pagedesigner.actions.range.HTagsInsertGroupAction;
-
-/**
- * @author mengbo
- */
-public class DesignActionBarFactory {
-	private static DesignActionBarFactory _instance;
-
-	private DesignActionBarFactory() {
-        // no external instantiation
-	}
-
-	public static DesignActionBarFactory getInstance() {
-		if (_instance == null) {
-			_instance = new DesignActionBarFactory();
-		}
-		return _instance;
-	}
-
-	public DesignerToolBarAction getStyleAction(String name) {
-		DesignerToolBarAction action = null;
-
-		if (name.equals(IHTMLConstants.TAG_U)) {
-			action = new ChangeStyleAction(ActionsMessages
-					.getString("DesignActionBarFactory.Underline.Text"), name,
-					PDPlugin.getDefault().getImageDescriptor(
-							"PD_Toolbar_underline.gif"), PDPlugin.getDefault()
-							.getImageDescriptor(
-									"PD_Toolbar_underline_disabled.gif"),
-					IAction.AS_CHECK_BOX);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Underline"));
-		} else if (name.equals(IHTMLConstants.TAG_I)) {
-			action = new ChangeStyleAction(ActionsMessages
-					.getString("DesignActionBarFactory.Italic.Text"), name,
-					PDPlugin.getDefault().getImageDescriptor(
-							"PD_Toolbar_italic.gif"), PDPlugin.getDefault()
-							.getImageDescriptor(
-									"PD_Toolbar_italic_disabled.gif"),
-					IAction.AS_CHECK_BOX);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Italic"));
-		} else if (name.equals(IHTMLConstants.TAG_B)) {
-			action = new ChangeStyleAction(ActionsMessages
-					.getString("DesignActionBarFactory.Bold.Text"), name,
-					PDPlugin.getDefault().getImageDescriptor(
-							"PD_Toolbar_bold.gif"),
-					PDPlugin.getDefault().getImageDescriptor(
-							"PD_Toolbar_bold_disabled.gif"),
-					IAction.AS_CHECK_BOX);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Bold"));
-		} else if (name.equals(IHTMLConstants.TAG_SMALL)) {
-			action = new ChangeStyleAction(ActionsMessages
-					.getString("DesignActionBarFactory.Small.Text"), name,
-					PDPlugin.getDefault().getImageDescriptor(
-							"PD_Toolbar_smallfont.gif"), PDPlugin.getDefault()
-							.getImageDescriptor(
-									"PD_Toolbar_smallfont_disabled.gif"),
-					IAction.AS_CHECK_BOX);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Small"));
-		} else if (name.equals(IHTMLConstants.TAG_BIG)) {
-			action = new ChangeStyleAction(ActionsMessages
-					.getString("DesignActionBarFactory.Big.Text"), name,
-					PDPlugin.getDefault().getImageDescriptor(
-							"PD_Toolbar_largefont.gif"), PDPlugin.getDefault()
-							.getImageDescriptor(
-									"PD_Toolbar_largefont_disabled.gif"),
-					IAction.AS_CHECK_BOX);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Big"));
-		} else if (name
-				.equalsIgnoreCase(DesignPageActionContributor.PARAGRAPH_ACTION_ID)) {
-			action = new HTagsInsertGroupAction(PDPlugin.getDefault()
-					.getImageDescriptor("PD_Toolbar_paragraph.gif"),
-					IAction.AS_DROP_DOWN_MENU);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Paragraph"));
-		}
-
-		return action;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignPageActionContributor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignPageActionContributor.java
deleted file mode 100644
index e6fd7cd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignPageActionContributor.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.editors.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IContributionManager;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.range.DesignerToolBarAction;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.editors.SimpleGraphicalEditor;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.part.EditorActionBarContributor;
-import org.eclipse.ui.texteditor.ITextEditorActionConstants;
-import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
-
-/**
- * sub action contributor for the designer page.
- * 
- * @author mengbo
- */
-public class DesignPageActionContributor extends EditorActionBarContributor {
-	private static final Logger _log = PDPlugin
-			.getLogger(DesignPageActionContributor.class);
-
-	public static final String PARAGRAPH_ACTION_ID = "paragraph";
-
-	protected IEditorPart _editorPart;
-
-	protected void doRemove(IContributionManager manager, String id) {
-		try {
-			if (manager.find(id) != null) {
-				manager.remove(id);
-			}
-		} catch (Exception e) {
-			_log.info("Error:", e);
-		}
-	}
-
-	public void init(IActionBars bars, IWorkbenchPage page) {
-		super.init(bars);
-		init(bars);
-	}
-
-	public void init(IActionBars bars) {
-		IToolBarManager toolbar = bars.getToolBarManager();
-		initToolbar(toolbar);
-	}
-
-	/**
-	 * @param toolbar
-	 */
-	private void initToolbar(IToolBarManager toolbar) {
-		DesignActionBarFactory factory = DesignActionBarFactory.getInstance();
-
-		Action action = factory.getStyleAction(IHTMLConstants.TAG_U);
-		toolbar.add(action);
-
-		action = factory.getStyleAction(IHTMLConstants.TAG_B);
-		toolbar.add(action);
-
-		action = factory.getStyleAction(IHTMLConstants.TAG_I);
-		toolbar.add(action);
-
-		action = factory.getStyleAction(IHTMLConstants.TAG_SMALL);
-		toolbar.add(action);
-
-		action = factory.getStyleAction(IHTMLConstants.TAG_BIG);
-		toolbar.add(action);
-		// action = factory.getStyleAction(PARAGRAPH_ACTION_ID);
-		// toolbar.add(action);
-	}
-
-	protected void addActionWithId(IMenuManager menuManager, Action action,
-			String id) {
-		action.setId(id);
-		menuManager.add(action);
-	}
-
-	public void setViewerSpecificContributionsEnabled(boolean enabled) {
-		HTMLEditor htmlEditor = null;
-		if (_editorPart instanceof HTMLEditor) {
-			htmlEditor = (HTMLEditor) _editorPart;
-		} else if (_editorPart instanceof SimpleGraphicalEditor) {
-			htmlEditor = ((SimpleGraphicalEditor) _editorPart).getHTMLEditor();
-		}
-
-		if (htmlEditor == null)
-			return;
-
-		SimpleGraphicalEditor graphicalEditor = (SimpleGraphicalEditor) htmlEditor
-				.getDesignViewer();
-		IWorkbenchPartSite site = htmlEditor.getSite();
-		if (site instanceof IEditorSite) {
-			IActionBars actionBars = ((IEditorSite) site).getActionBars();
-
-			if (enabled) {
-				// // we always let the text editor to handle UNDO and REDO
-				// actionBars.setGlobalActionHandler(ITextEditorActionConstants.UNDO,
-				// textEditor
-				// .getAction(ITextEditorActionConstants.UNDO));
-				// actionBars.setGlobalActionHandler(ITextEditorActionConstants.REDO,
-				// textEditor
-				// .getAction(ITextEditorActionConstants.REDO));
-				// lium: the above behavior changed, since we now use
-				// DesignerUndoRedoAction.
-				// see comments in DesignerUndoRedoAction
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.UNDO, graphicalEditor
-								.getAction(IWorkbenchActionDefinitionIds.UNDO));
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.REDO, graphicalEditor
-								.getAction(IWorkbenchActionDefinitionIds.REDO));
-
-				// cut/copy/paste is delegated to design actions
-				actionBars
-						.setGlobalActionHandler(
-								ITextEditorActionConstants.DELETE,
-								graphicalEditor
-										.getAction(IWorkbenchActionDefinitionIds.DELETE));
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.CUT, graphicalEditor
-								.getAction(IWorkbenchActionDefinitionIds.CUT));
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.COPY, graphicalEditor
-								.getAction(IWorkbenchActionDefinitionIds.COPY));
-				actionBars
-						.setGlobalActionHandler(
-								ITextEditorActionConstants.PASTE,
-								graphicalEditor
-										.getAction(IWorkbenchActionDefinitionIds.PASTE));
-			} else {
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.UNDO, null);
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.REDO, null);
-
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.DELETE, null);
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.CUT, null);
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.COPY, null);
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.PASTE, null);
-			}
-		}
-	}
-
-	/**
-	 * The active editor passed in could be the following: HTMLEditor,
-	 * SimpleGraphicalEditor, null.
-	 */
-	public void setActiveEditor(IEditorPart targetEditor) {
-		_editorPart = targetEditor;
-
-		// temp code.
-		if (targetEditor instanceof SimpleGraphicalEditor) {
-			IHTMLGraphicalViewer viewer = ((SimpleGraphicalEditor) targetEditor)
-					.getGraphicViewer();
-			setViewerOnActions(viewer);
-		} else if (targetEditor instanceof HTMLEditor) {
-			IHTMLGraphicalViewer viewer = ((HTMLEditor) targetEditor)
-					.getDesignViewer().getGraphicViewer();
-			setViewerOnActions(viewer);
-		} else {
-			setViewerOnActions(null);
-		}
-
-		// TODO... uncomment this and investigate NPE
-		//
-		// add the cut/copy/paste for text fields
-		// ActionHandlerPlugin.connectPart(editorPart);
-	}
-
-	private void setViewerOnActions(IHTMLGraphicalViewer viewer) {
-		IContributionItem[] items = getActionBars().getToolBarManager()
-				.getItems();
-		if (items != null) {
-			for (int i = 0; i < items.length; i++) {
-				if (items[i] instanceof ActionContributionItem) {
-					IAction action = ((ActionContributionItem) items[i])
-							.getAction();
-					if (action instanceof DesignerToolBarAction) {
-						((DesignerToolBarAction) action).setViewer(viewer);
-					}
-				}
-			}
-		}
-
-	}
-
-	/**
-	 * @see org.eclipse.ui.IEditorActionBarContributor#dispose()
-	 */
-	public void dispose() {
-        // TODO: anything to dispose?
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerStyleActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerStyleActionGroup.java
deleted file mode 100644
index a3d6fa9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerStyleActionGroup.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import java.util.HashMap;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IKeyBindingService;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DesignerStyleActionGroup {
-	private static HashMap IMAGE_NAMES = new HashMap();
-
-	private static final String VERTICAL = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.V"); //$NON-NLS-1$
-
-	private static final String HORIZONTAL = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.H"); //$NON-NLS-1$
-
-	private static final String DESIGN = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.D"); //$NON-NLS-1$
-
-	private static final String SOURCE = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.S"); //$NON-NLS-1$
-
-	private static final String VERTICAL_TOOLTIP = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.V.Tooltip"); //$NON-NLS-1$
-
-	private static final String HORIZONTAL_TOOLTIP = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.H.Tooltip"); //$NON-NLS-1$
-
-	private static final String DESIGN_TOOLTIP = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.D.Tooltip"); //$NON-NLS-1$
-
-	private static final String SOURCE_TOOLTIP = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.S.Tooltip"); //$NON-NLS-1$
-	static {
-		IMAGE_NAMES.put(VERTICAL, "PD_Toolbar_vsplit.gif"); //$NON-NLS-1$
-		IMAGE_NAMES.put(HORIZONTAL, "PD_Toolbar_hsplit.gif"); //$NON-NLS-1$
-		IMAGE_NAMES.put(DESIGN, "PD_Toolbar_designer.gif"); //$NON-NLS-1$
-		IMAGE_NAMES.put(SOURCE, "PD_Toolbar_source.gif"); //$NON-NLS-1$
-	}
-
-	class ChangeDesignerStyleAction extends Action {
-		int _mode;
-
-		ChangeDesignerStyleAction(String text, ImageDescriptor image, int mode) {
-			super(text, IAction.AS_RADIO_BUTTON);
-			this.setImageDescriptor(image);
-			_mode = mode;
-		}
-
-		public int getMode() {
-			return _mode;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			if (_htmlEditor != null) {
-				_htmlEditor.setDesignerMode(_mode);
-				updateActionBars();
-			}
-		}
-	};
-
-	HTMLEditor _htmlEditor;
-
-	ChangeDesignerStyleAction[] _actions = null;
-
-	{
-		ChangeDesignerStyleAction _verAction = new ChangeDesignerStyleAction(
-				VERTICAL, PDPlugin.getDefault().getImageDescriptor(
-						(String) IMAGE_NAMES.get(VERTICAL)),
-				HTMLEditor.MODE_SASH_VERTICAL);
-		_verAction.setId("org.eclipse.jst.pagedesigner.vertical");
-		_verAction
-				.setActionDefinitionId("org.eclipse.jst.pagedesigner.vertical");
-		_verAction.setToolTipText(VERTICAL_TOOLTIP);
-
-		ChangeDesignerStyleAction _horAction = new ChangeDesignerStyleAction(
-				HORIZONTAL, PDPlugin.getDefault().getImageDescriptor(
-						(String) IMAGE_NAMES.get(HORIZONTAL)),
-				HTMLEditor.MODE_SASH_HORIZONTAL);
-		_horAction.setId("org.eclipse.jst.pagedesigner.horizotal");
-		_horAction
-				.setActionDefinitionId("org.eclipse.jst.pagedesigner.horizotal");
-		_horAction.setToolTipText(HORIZONTAL_TOOLTIP);
-
-		ChangeDesignerStyleAction _designAction = new ChangeDesignerStyleAction(
-				DESIGN, PDPlugin.getDefault().getImageDescriptor(
-						(String) IMAGE_NAMES.get(DESIGN)),
-				HTMLEditor.MODE_DESIGNER);
-		_designAction.setId("org.eclipse.jst.pagedesigner.design");
-		_designAction
-				.setActionDefinitionId("org.eclipse.jst.pagedesigner.design");
-		_designAction.setToolTipText(DESIGN_TOOLTIP);
-
-		ChangeDesignerStyleAction _sourceAction = new ChangeDesignerStyleAction(
-				SOURCE, PDPlugin.getDefault().getImageDescriptor(
-						(String) IMAGE_NAMES.get(SOURCE)),
-				HTMLEditor.MODE_SOURCE);
-		_sourceAction.setId("org.eclipse.jst.pagedesigner.source");
-		_sourceAction
-				.setActionDefinitionId("org.eclipse.jst.pagedesigner.source");
-		_sourceAction.setToolTipText(SOURCE_TOOLTIP);
-
-		_actions = new ChangeDesignerStyleAction[] { _verAction, _horAction,
-				_designAction, _sourceAction };
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#updateActionBars()
-	 */
-	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());
-			}
-		}
-	}
-
-	public void setHTMLEditor(HTMLEditor editor) {
-		this._htmlEditor = editor;
-		if (editor != null) {
-			IKeyBindingService keyBindingService = editor.getSite()
-					.getKeyBindingService();
-			for (int i = 0; i < _actions.length; i++) {
-				keyBindingService.registerAction(_actions[i]);
-			}
-		}
-		updateActionBars();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillActionBars(org.eclipse.ui.IActionBars)
-	 */
-	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());
-	}
-
-	public void dispose() {
-		if (_htmlEditor != null) {
-			IKeyBindingService keyBindingService = _htmlEditor.getSite()
-					.getKeyBindingService();
-			for (int i = 0; i < _actions.length; i++) {
-				keyBindingService.unregisterAction(_actions[i]);
-			}
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerUndoRedoAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerUndoRedoAction.java
deleted file mode 100644
index c441f64..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerUndoRedoAction.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.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 SimpleGraphicalEditor _designer;
-
-	/**
-	 * 
-	 */
-	public DesignerUndoRedoAction(boolean undo, SimpleGraphicalEditor designer) {
-		this._undo = undo;
-		this._designer = designer;
-
-		if (undo) {
-			setText(ActionsMessages.getString("DesignerUndoRedoAction.UNDO")); //$NON-NLS-1$
-		} else {
-			setText(ActionsMessages.getString("DesignerUndoRedoAction.REDO")); //$NON-NLS-1$
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.actions.UpdateAction#update()
-	 */
-	public void update() {
-		IStructuredTextUndoManager undoManager = _designer.getHTMLEditor()
-				.getModel().getUndoManager();
-		if (_undo) {
-			Command c = undoManager.getUndoCommand();
-			this.setEnabled(undoManager.undoable());
-			if (c != null) {
-				String label = c.getLabel();
-				this
-						.setText(MessageFormat
-								.format(
-										ActionsMessages
-												.getString("DesignerUndoRedoAction.UNDO_LABEL"), new Object[] { label })); //$NON-NLS-1$
-			} else {
-				this.setText(ActionsMessages
-						.getString("DesignerUndoRedoAction.UNDO")); //$NON-NLS-1$
-			}
-		} else {
-			Command c = undoManager.getRedoCommand();
-			this.setEnabled(undoManager.redoable());
-			if (c != null) {
-				String label = c.getLabel();
-				this
-						.setText(MessageFormat
-								.format(
-										ActionsMessages
-												.getString("DesignerUndoRedoAction.REDO_LABEL"), new Object[] { label })); //$NON-NLS-1$
-			} else {
-				this.setText(ActionsMessages
-						.getString("DesignerUndoRedoAction.REDO")); //$NON-NLS-1$
-			}
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		IStructuredTextUndoManager undoManager = _designer.getHTMLEditor()
-				.getModel().getUndoManager();
-		if (_undo) {
-			undoManager.undo(_designer);
-		} else {
-			undoManager.redo(_designer);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/OutlineViewAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/OutlineViewAction.java
deleted file mode 100644
index 030626d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/OutlineViewAction.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.ui.IPageLayout;
-
-public class OutlineViewAction extends ShowViewAction 
-{
-    public final static String ID = "org.eclipse.jst.pagedesigner.editors.actions.OutlineViewAction"; //$NON-NLS-1$
-
-    public OutlineViewAction() 
-    {
-        super(ActionsMessages
-                .getString("OutlineViewAction.Menu.OutlineView")
-              , IPageLayout.ID_OUTLINE); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PageDesignerActionBarContributor2.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PageDesignerActionBarContributor2.java
deleted file mode 100644
index d5bbe2d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PageDesignerActionBarContributor2.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.pagedesigner.editors.actions;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.editors.SimpleGraphicalEditor;
-import org.eclipse.jst.pagedesigner.ui.common.sash.NestedEditorActionBarContributor;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.internal.ExtendedEditorActionBuilder;
-import org.eclipse.wst.sse.ui.internal.IExtendedContributor;
-import org.eclipse.wst.sse.ui.internal.ISourceViewerActionBarContributor;
-
-/**
- * This is the actionbar contributor for HTML Editor. As HTMLEditor is
- * multipaged, so this contributor will also handle on which page currently is
- * activated.
- * 
- * @author mengbo
- */
-public class PageDesignerActionBarContributor2 extends
-		NestedEditorActionBarContributor implements IExtendedContributor {
-
-	protected DesignPageActionContributor _designViewerActionBarContributor = null;
-
-	protected ISourceViewerActionBarContributor _sourceViewerActionContributor = null;
-
-	protected HTMLEditor _htmlEditor = null;
-
-	// EditorExtension
-	private static final String EDITOR_ID = IJMTConstants.EDITORID_HTML;
-
-	private IExtendedContributor _extendedContributor;
-
-	DesignerStyleActionGroup _group = new DesignerStyleActionGroup();
-
-//	private IHTMLGraphicalViewer _viewer = null;
-//
-//	private IStructuredModel _model = null;
-
-//	private final static Action action = new Action() {
-//        
-//	};
-
-	public PageDesignerActionBarContributor2() {
-		super();
-
-		_sourceViewerActionContributor = new SourcePageActionContributor();
-		_designViewerActionBarContributor = new DesignPageActionContributor();
-
-		// Read action extensions.
-		ExtendedEditorActionBuilder builder = new ExtendedEditorActionBuilder();
-		_extendedContributor = builder.readActionExtensions(EDITOR_ID);
-	}
-
-	public void init(IActionBars actionBars) {
-		super.init(actionBars);
-
-		if (actionBars != null) {
-			initCommonActionBarContributor(actionBars);
-			initDesignViewerActionBarContributor(actionBars);
-			initSourceViewerActionContributor(actionBars);
-		}
-	}
-
-	/**
-	 * @param actionBars
-	 */
-	private void initCommonActionBarContributor(IActionBars actionBars) {
-		_group.fillActionBars(actionBars);
-	}
-
-	protected void initDesignViewerActionBarContributor(IActionBars actionBars) {
-		if (_designViewerActionBarContributor != null)
-			_designViewerActionBarContributor.init(actionBars, getPage());
-	}
-
-	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);
-	}
-
-	protected 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();
-		}
-	}
-
-	/**
-	 * 
-	 */
-	protected void deactivateSourceAndDesignPage(IEditorPart activeEditor) {
-		if (_designViewerActionBarContributor != null) {
-			_designViewerActionBarContributor.setActiveEditor(_htmlEditor);
-			_designViewerActionBarContributor
-					.setViewerSpecificContributionsEnabled(false);
-		}
-		if (_sourceViewerActionContributor != null) {
-			_sourceViewerActionContributor.setActiveEditor(_htmlEditor);
-			_sourceViewerActionContributor
-					.setViewerSpecificContributionsEnabled(false);
-		}
-	}
-
-	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);
-		}
-	}
-
-	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 f04b3b1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PaletteViewAction.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.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 {
-	public final static String ID = "org.eclipse.jst.pagedesigner.editors.actions.PaletteViewAction"; //$NON-NLS-1$
-	// TODO: dead?
-	//private final Element   _element;
-    //private final EditDomain _editDomain;
-    
-	public PaletteViewAction(Element element, EditDomain editDomain) {
-        super(ActionsMessages.getString("PaletteViewAction.Menu.PaletteView")
-                , PaletteView.ID); //$NON-NLS-1$
-        //_element = element;
-        //_editDomain = editDomain;
-	}
-    
-    /** 
-     * Add to default behavior because pallete view doesn't automatically track
-     * selection to currently selected edit part
-     */
-    public void run()
-    {
-        super.run();
-        
-        //TODO: for some reason getting a palette item to select doesn't work
-//        if (_element != null && _editDomain != null)
-//        {
-//            PaletteItemManager manager = PaletteItemManager
-//                                          .getInstance(getProject(_element));
-//            if (manager != null) {
-//                IPaletteItemCategory category = manager.findOrCreateCategory(CMUtil
-//                        .getElementNamespaceURI(_element), null);
-//                
-//              if (category != null) {
-//                  String name = _element.getLocalName();
-//                  if (category.getURI().equals(IJMTConstants.URI_JSP)) {
-//                      name = _element.getTagName();
-//                  }
-//                  IPaletteItemDescriptor descriptor = category
-//                      .getItemByTagName(name);
-//                  if (descriptor != null)
-//                  {
-//                      PaletteEntry paletteEntry = descriptor.getPaletteEntry();
-//                      final RootEditPart editPart = 
-//                          _editDomain.getPaletteViewer().getRootEditPart();
-//                      EditPart newSelection = findMatchingPart(editPart.getContents(), paletteEntry);
-//
-//                      if (newSelection != null)
-//                      {
-//                          _editDomain.getPaletteViewer().setSelection(new StructuredSelection(newSelection));
-//                      }
-//                   }
-//                }
-//            }
-//        }
-    }
-    
-//    private EditPart findMatchingPart(EditPart curPart, PaletteEntry paletteEntry)
-//    {
-//        EditPart match = null;
-//
-//        if (curPart.getModel() == paletteEntry)
-//        {
-//            return curPart;
-//        }
-//        
-//        for (final Iterator it = curPart.getChildren().iterator(); it.hasNext();)
-//        {
-//            match = findMatchingPart((EditPart)it.next(), paletteEntry);
-//            
-//            if (match != null)
-//            {
-//                break;
-//            }
-//        }
-//        
-//        return match;
-//    }
-//    private IProject getProject(Element element) {
-//        if (element instanceof IDOMElement) {
-//            IDOMModel model = ((IDOMElement) element).getModel();
-//            IFile file = StructuredModelUtil.getFileFor(model);
-//            if (file != null) {
-//                return file.getProject();
-//            }
-//        }
-//        return null;
-//    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PropertiesViewAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PropertiesViewAction.java
deleted file mode 100644
index 77a085d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PropertiesViewAction.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.editors.actions;
-
-import org.eclipse.ui.IPageLayout;
-
-/**
- * @author mengbo
- */
-public class PropertiesViewAction extends ShowViewAction {
-	public final static String ID = "org.eclipse.jst.pagedesigner.editors.actions.PropertiesViewAction"; //$NON-NLS-1$
-
-	public PropertiesViewAction() 
-    {
-		super(ActionsMessages
-				.getString("PropertiesViewAction.Menu.Properties")
-              , IPageLayout.ID_PROP_SHEET); //$NON-NLS-1$
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/RelatedViewActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/RelatedViewActionGroup.java
deleted file mode 100644
index 4434cf4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/RelatedViewActionGroup.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.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;
-    
-    public RelatedViewActionGroup(EditDomain editDomain)
-    {
-        _editDomain = editDomain;
-    }
-    
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		super.fillContextMenu(menu);
-
-		final IMenuManager viewMgr = new MenuManager(ActionsMessages
-				.getString("RelatedViewActionGroup.Menu.ShowView"),//$NON-NLS-1$
-				PageDesignerActionConstants.SHOWVIEW_SUBMENU_ID);
-		viewMgr.add(new Action() {
-		    // add noop action; TODO: why?
-		});
-		viewMgr.setRemoveAllWhenShown(true);
-        final ActionContext context = getContext();
-		viewMgr.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-                // TODO: don't like this at all
-				String[] views = { "org.eclipse.ui.views.PropertySheet",
-						"org.eclipse.gef.ui.palette_view", "org.eclipse.ui.views.ContentOutline"};
-
-                Map icons = getIconForView(views);
-                // TODO: is this the best way to do this?
-				if (manager.find(PropertiesViewAction.ID) == null) {
-					Action action = new PropertiesViewAction();
-					action.setId(PropertiesViewAction.ID);
-					action.setImageDescriptor((ImageDescriptor) icons
-							.get(views[0]));
-					manager.add(action);
-				}
-                    ISelection selection = context.getSelection();
-                    if (manager.find(PaletteViewAction.ID) == null) {
-                    if (selection instanceof IStructuredSelection)
-                    {
-                        IStructuredSelection strucSelection = 
-                            (IStructuredSelection) selection;
-                        Action action = null;
-                        
-                        if (strucSelection.getFirstElement() instanceof ElementEditPart)
-                        {                      
-                            Element selectedElem = (Element)
-                                ((ElementEditPart) strucSelection.getFirstElement()).getModel();
-        					action = new PaletteViewAction(selectedElem, _editDomain);
-                        }
-                        else
-                        {
-                            // if can't determine, just default open the palette
-                            action = new PaletteViewAction(null, null);
-                        }
-                        action.setId(PaletteViewAction.ID);
-                        action.setImageDescriptor((ImageDescriptor) icons
-                                .get(views[1]));
-                        manager.add(action);
-                    }
-				}
-                if (manager.find(OutlineViewAction.ID) == null)
-                {
-                    Action action = new OutlineViewAction();
-                    action.setId(OutlineViewAction.ID);
-                    action.setImageDescriptor((ImageDescriptor) icons
-                            .get(views[2]));
-                    manager.add(action);
-                }
-                
-			}
-		});
-		menu.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, viewMgr);
-	}
-
-	private Map getIconForView(String[] viewids) {
-		List views = Arrays.asList(viewids);
-		Map icons = new HashMap();
-
-		IConfigurationElement[] elements = Platform.getExtensionRegistry()
-				.getConfigurationElementsFor("org.eclipse.ui.views");
-		for (int i = 0; i < elements.length; i++) {
-			String name = elements[i].getName();
-			String id = elements[i].getAttribute("id");
-			if ("view".equals(name) && views.contains(id)) {
-				String iconPath = elements[i].getAttribute("icon");
-				if (iconPath != null) {
-					icons.put(id, AbstractUIPlugin.imageDescriptorFromPlugin(
-							elements[i].getDeclaringExtension().getContributor().getName(),
-							iconPath));
-				} else {
-					icons.put(id, null);
-				}
-				if (icons.size() == viewids.length) {
-					break;
-				}
-			}
-		}
-		return icons;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ShowViewAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ShowViewAction.java
deleted file mode 100644
index 52f0b0a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ShowViewAction.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-    
-    public ShowViewAction(String text, String viewId) 
-    {
-        _viewId = viewId;
-        setText(text); //$NON-NLS-1$
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.action.IAction#run()
-     */
-    public void run() {
-        try {
-            getPage().showView(_viewId);
-        } catch (PartInitException e) {
-            _log.info("Open the view: "+_viewId, e);
-        }
-
-    }
-
-    private IWorkbenchPage getPage() {
-        IWorkbench workbench = PlatformUI.getWorkbench();
-        IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-        return window.getActivePage();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/SourcePageActionContributor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/SourcePageActionContributor.java
deleted file mode 100644
index 7d48737..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/SourcePageActionContributor.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.ui.texteditor.ITextEditorActionConstants;
-import org.eclipse.wst.xml.ui.internal.actions.ActionContributorXML;
-
-/**
- * SourcePageActionContributor
- * 
- * This class is for multi page editor's source page contributor.
- * 
- * Use XMLEditorActionContributor for single page editor.
- */
-public class SourcePageActionContributor extends ActionContributorXML {
-
-	private IActionBars fBars;
-
-	/**
-	 * This method calls:
-	 * <ul>
-	 * <li><code>contributeToMenu</code> with <code>bars</code>' menu
-	 * manager</li>
-	 * <li><code>contributeToToolBar</code> with <code>bars</code>' tool
-	 * bar manager</li>
-	 * <li><code>contributeToStatusLine</code> with <code>bars</code>'
-	 * status line manager</li>
-	 * </ul>
-	 * The given action bars are also remembered and made accessible via
-	 * <code>getActionBars</code>.
-	 * 
-	 * @param bars
-	 *            the action bars
-	 * 
-	 */
-	public void init(IActionBars bars) {
-		fBars = bars;
-		contributeToMenu(bars.getMenuManager());
-		contributeToToolBar(bars.getToolBarManager());
-		contributeToStatusLine(bars.getStatusLineManager());
-	}
-
-	/**
-	 * Returns this contributor's action bars.
-	 * 
-	 * @return the action bars
-	 */
-	public IActionBars getActionBars() {
-		return fBars;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.ui.internal.ISourceViewerActionBarContributor#setViewerSpecificContributionsEnabled(boolean)
-	 */
-	public void setViewerSpecificContributionsEnabled(boolean enabled) {
-		super.setViewerSpecificContributionsEnabled(enabled);
-		IEditorPart editor = getActiveEditorPart();
-		ITextEditor targetEditor = null;
-		if (editor instanceof ITextEditor) {
-			targetEditor = (ITextEditor) editor;
-		} else if (editor instanceof HTMLEditor) {
-			targetEditor = ((HTMLEditor) editor).getTextEditor();
-		}
-		if (targetEditor != null) {
-			if (enabled) {
-				getActionBars()
-						.setGlobalActionHandler(
-								ITextEditorActionConstants.UNDO,
-								targetEditor
-										.getAction(ITextEditorActionConstants.UNDO));
-				getActionBars()
-						.setGlobalActionHandler(
-								ITextEditorActionConstants.REDO,
-								targetEditor
-										.getAction(ITextEditorActionConstants.REDO));
-			} else {
-				getActionBars().setGlobalActionHandler(
-						ITextEditorActionConstants.UNDO, null);
-				getActionBars().setGlobalActionHandler(
-						ITextEditorActionConstants.REDO, null);
-			}
-
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/DelegatingZoomManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/DelegatingZoomManager.java
deleted file mode 100644
index bc15858..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/DelegatingZoomManager.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.pagedesigner;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.draw2d.ScalableFigure;
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.editparts.ZoomListener;
-import org.eclipse.gef.editparts.ZoomManager;
-
-/**
- * A delegating ZoomManager.
- */
-public class DelegatingZoomManager extends ZoomManager implements ZoomListener {
-	/** the current ZoomManager all work is delegated to */
-	private final static int DEFAULT_ZOOM = 1;
-
-	private final static String ZOOM_AS_TEXT = "100%";
-
-	private final static String ZOOM_LEVEL_AS_TEXT = "100%";
-
-	private ZoomManager _currentZoomManager;
-
-	/** listeners */
-	private ListenerList _zoomListeners = new ListenerList(ListenerList.IDENTITY);
-
-	/**
-	 * Creates a new DelegatingZoomManager instance.
-	 */
-	public DelegatingZoomManager() {
-		super((ScalableFigure) null, (Viewport) null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomListener#zoomChanged(double)
-	 */
-	public void zoomChanged(double zoom) {
-		Object[] listeners = _zoomListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			((ZoomListener) listeners[i]).zoomChanged(zoom);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#addZoomListener(org.eclipse.gef.editparts.ZoomListener)
-	 */
-	public void addZoomListener(ZoomListener listener) {
-		_zoomListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#removeZoomListener(org.eclipse.gef.editparts.ZoomListener)
-	 */
-	public void removeZoomListener(ZoomListener listener) {
-		_zoomListeners.remove(listener);
-	}
-
-	/**
-	 * Sets the ZoomManager all work should be delegated to.
-	 * 
-	 * @param zoomManager
-	 */
-	public void setCurrentZoomManager(ZoomManager zoomManager) {
-		if (null != _currentZoomManager) {
-			_currentZoomManager.removeZoomListener(this);
-		}
-
-		_currentZoomManager = zoomManager;
-		if (null != _currentZoomManager) {
-			_currentZoomManager.addZoomListener(this);
-			zoomChanged(_currentZoomManager.getZoom());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#canZoomIn()
-	 */
-	public boolean canZoomIn() {
-		if (null == _currentZoomManager) {
-			return false;
-		}
-		return _currentZoomManager.canZoomIn();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#canZoomOut()
-	 */
-	public boolean canZoomOut() {
-		if (null == _currentZoomManager) {
-			return false;
-		}
-		return _currentZoomManager.canZoomOut();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getMaxZoom()
-	 */
-	public double getMaxZoom() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-
-		return _currentZoomManager.getMaxZoom();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getMinZoom()
-	 */
-	public double getMinZoom() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-		return _currentZoomManager.getMinZoom();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getNextZoomLevel()
-	 */
-	public double getNextZoomLevel() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-		return _currentZoomManager.getNextZoomLevel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getPreviousZoomLevel()
-	 */
-	public double getPreviousZoomLevel() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-		return _currentZoomManager.getPreviousZoomLevel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getScalableFigure()
-	 */
-	public ScalableFigure getScalableFigure() {
-		if (null == _currentZoomManager) {
-			return null;
-		}
-
-		return _currentZoomManager.getScalableFigure();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getUIMultiplier()
-	 */
-	public double getUIMultiplier() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-
-		return _currentZoomManager.getUIMultiplier();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getViewport()
-	 */
-	public Viewport getViewport() {
-		if (null == _currentZoomManager) {
-			return null;
-		}
-
-		return _currentZoomManager.getViewport();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getZoom()
-	 */
-	public double getZoom() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-
-		return _currentZoomManager.getZoom();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getZoomAsText()
-	 */
-	public String getZoomAsText() {
-		if (null == _currentZoomManager) {
-			return ZOOM_AS_TEXT;
-		}
-		//$NON-NLS-1$
-
-		return _currentZoomManager.getZoomAsText();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getZoomLevels()
-	 */
-	public double[] getZoomLevels() {
-		if (null == _currentZoomManager) {
-			return new double[] { DEFAULT_ZOOM };
-		}
-
-		return _currentZoomManager.getZoomLevels();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getZoomLevelsAsText()
-	 */
-	public String[] getZoomLevelsAsText() {
-		if (null == _currentZoomManager) {
-			return new String[] { ZOOM_LEVEL_AS_TEXT };
-		}
-
-		return _currentZoomManager.getZoomLevelsAsText();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setUIMultiplier(double)
-	 */
-	public void setUIMultiplier(double multiplier) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setUIMultiplier(multiplier);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setViewLocation(org.eclipse.draw2d.geometry.Point)
-	 */
-	public void setViewLocation(Point p) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setViewLocation(p);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setZoom(double)
-	 */
-	public void setZoom(double zoom) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setZoom(zoom);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setZoomAnimationStyle(int)
-	 */
-	public void setZoomAnimationStyle(int style) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setZoomAnimationStyle(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setZoomAsText(java.lang.String)
-	 */
-	public void setZoomAsText(String zoomString) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setZoomAsText(zoomString);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setZoomLevels(double[])
-	 */
-	public void setZoomLevels(double[] zoomLevels) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setZoomLevels(zoomLevels);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#zoomIn()
-	 */
-	public void zoomIn() {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.zoomIn();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#zoomOut()
-	 */
-	public void zoomOut() {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.zoomOut();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#zoomTo(org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void zoomTo(Rectangle rect) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.zoomTo(rect);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/IPageDesignerConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/IPageDesignerConstants.java
deleted file mode 100644
index 911d9d2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/IPageDesignerConstants.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.editors.pagedesigner;
-
-public interface IPageDesignerConstants {
-	/**
-	 * JSP UI Component Tag Node
-	 */
-	public static final String DEFAULT_TAG_NAME = "tagname";
-
-	public static final String ATTR_TYPE_CDATA = "CDATA";
-
-	public static final String ATTR_LOADBUNDLE_1 = "basename";
-
-	public static final String ATTR_LOADBUNDLE_2 = "var";
-
-	public static final String ATTR_PANELGRID_1 = "columns";
-
-	public static final String ATTR_PANELGRID_2 = "summary";
-
-	public static final String ATTR_PANELGRID_3 = "title";
-
-	public static final String ATTR_BUTTON_1 = "action";
-
-	public static final String ATTR_BUTTON_2 = "value";
-
-	public static final String ATTR_GRAPHICIMAGE_1 = "url";
-
-	public static final String ATTR_GRAPHICIMAGE_2 = "binding";
-
-	public static final String ATTR_OUTPUTTEXT_1 = "binding";
-
-	public static final String ATTR_OUTPUTTEXT_2 = "value";
-
-	public static final String ATTR_OUTPUTTEXT_3 = "styleClass";
-
-	public static final String ATTR_DATAWINDOW_1 = "dataWindowBean";
-
-	public static final String ATTR_DATAWINDOW_2 = "scriptName";
-
-	public static final String ATTR_INCLUDE = "page";
-
-	public static final String ATTR_TAGLIB_1 = "prefix";
-
-	public static final String ATTR_TAGLIB_2 = "uri";
-
-	public static final String RESOURCE_BUNDLE_MARK = "bundle";
-
-	public static final String ATTR_RESOURCE_BUNDLE = "value";
-
-	public static final String ATTR_FACET = "value";
-
-	public static final String TAG_VIEW_TYPE = "view";
-
-	public static final String TAG_FORM_TYPE = "form";
-
-	public static final String TAG_TEXT_TYPE = "text";
-
-	public static final String TAG_LOADBUNDLE_TYPE = "loadBundle";
-
-	public static final String TAG_PANELGRID_TYPE = "panelGrid";
-
-	public static final String TAG_IMAGE_TYPE = "image";
-
-	public String TAG_OUTPUTTEXT_TYPE = "outputText";
-
-	public String TAG_BUTTON_TYPE = "button";
-
-	public String TAG_DATAWINDOW_TYPE = "datawindow";
-
-	public String TAG_TAGLIB_TYPE = "taglib";
-
-	public String TAG_INCLUDE_TYPE = "include";
-
-	public String TAG_OTHERS_TYPE = "";
-
-	public String TAG_NAME_VIEW = "view";
-
-	public String TAG_NAME_FORM = "form";
-
-	public String TAG_NAME_PANELGRID = "panelGrid";
-
-	public String TAG_NAME_PANELGROUP = "panelGroup";
-
-	public String TAG_NAME_FACET = "facet";
-
-	public String TAG_NAME_DATAWINDOW = "dataWindow";
-
-	public String TAG_NAME_OUTPUTTEXT = "outputText";
-
-	public String TAG_NAME_INCLUDE = "include";
-
-	public String TAG_NAME_LOADBUNDLE = "loadBundle";
-
-	public String TAG_NAME_TAGLIB = "taglib";
-
-	public String TAG_NAME_GRAPHICIMAGE = "graphicImage";
-
-	public String TAG_NAME_COMMANDBUTTON = "commandButton";
-
-	public String REQUEST_TYPE_SELECT = "selection";
-
-	public static final int EOF = -1;
-
-	public char CHAR_TAB = '\t';
-
-	public char CHAR_N_RETURN = '\n';
-
-	public String STRING_N_RETURN = "\n";
-
-	public String STRING_BLANK = " ";
-
-	public char CHAR_BLANK = ' ';
-
-	public String FONT_NAME_HELVETICA = "Helvetica";
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/JSPEditorMessages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/JSPEditorMessages.properties
deleted file mode 100644
index cddf40c..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, 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
-###############################################################################
-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 d9beaae..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/MessageFormater.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.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 class MessageFormater {
-	private static Logger _log = PDPlugin.getLogger(MessageFormater.class);
-
-	/**
-	 * *
-	 * 
-	 * @param message:
-	 *            the parts for filling is {number}
-	 * @param o1
-	 * @return
-	 */
-	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 "";
-		}
-	}
-
-	public static String format(String message, Object o1, Object o2) {
-		try {
-			Object[] args = new Object[] { o1, o2 };
-			MessageFormat formatter = new MessageFormat(message);
-			return formatter.format(args);
-		} catch (Exception e) {
-			_log.error("Log.Error.MessageFormater.Format0", e);
-			return "";
-		}
-	}
-
-	public static String format(String message, Object o1, Object o2, Object o3) {
-		try {
-			Object[] args = new Object[] { o1, o2, o3 };
-			MessageFormat formatter = new MessageFormat(message);
-			return formatter.format(args);
-		} catch (Exception e) {
-			_log.error("Log.Error.MessageFormater.Format0", e);
-			return "";
-		}
-	}
-
-	public static String format(String message, Object o[]) {
-		try {
-			MessageFormat formater = new MessageFormat(message);
-			return formater.format(o);
-		} catch (Exception e) {
-			_log.error("Log.Error.MessageFormater.Format0", e);
-			return "";
-		}
-	}
-}
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 763273a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/PageDesignerResources.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.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);
-	}
-
-	public static PageDesignerResources getInstance() {
-		if (_resource == null) {
-			_resource = new PageDesignerResources();
-		}
-		return _resource;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizationsHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizationsHelper.java
deleted file mode 100644
index 7235c12..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizationsHelper.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Iterator;
-
-import javax.xml.parsers.DocumentBuilder;
-
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.gef.ui.palette.PaletteCustomizer;
-import org.eclipse.gef.ui.palette.PaletteViewer;
-import org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog;
-import org.eclipse.jface.preference.IPersistentPreferenceStore;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
-import org.eclipse.jst.pagedesigner.utils.XMLUtil;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-/**
- * Helper class that all clients should use when dealing with palette customizations 
- */
-public final class DesignerPaletteCustomizationsHelper {
-	private static final String PREFS_TAGLIBHIDE_PREFIX = "hidden_taglib:";
-
-	private static Logger _log = PDPlugin.getLogger(DesignerPaletteCustomizationsHelper.class);
-	
-	/**
-	 * @return new DesignerPaletteCustomizer
-	 */
-	public static DesignerPaletteCustomizer getNewCustomizer(){
-		return new DesignerPaletteCustomizer();
-	}
-	
-	/**
-	 * @param paletteViewer
-	 * @param paletteCustomizer
-	 * @return new DesignerPaletteCustomizerDialog
-	 */
-	public static PaletteCustomizerDialog getNewCustomizerDialog(PaletteViewer paletteViewer, PaletteCustomizer paletteCustomizer){
-		return new DesignerPaletteCustomizerDialog(
-				paletteViewer.getControl().getShell(), paletteCustomizer, paletteViewer.getPaletteRoot());
-
-	}
-	
-	/**
-	 * Save palette item customizations
-	 * @param paletteRoot
-	 */
-	public static void save(DesignerPaletteRoot paletteRoot) {
-		IPersistentPreferenceStore prefs = getPreferenceStore();
-
-		for (Iterator it=paletteRoot.getChildren().iterator();it.hasNext();){
-			PaletteEntry entry = (PaletteEntry)it.next();
-			if (entry instanceof TaglibPaletteDrawer){
-				TaglibPaletteDrawer pd = (TaglibPaletteDrawer)entry;
-				prefs.putValue(PREFS_TAGLIBHIDE_PREFIX + pd.getURI(), Boolean.toString(! pd.isVisible()));
-			}
-		}
-		PaletteItemManager.notifyPaletteItemManagersOfCustomizationsUpdate(paletteRoot.getPaletteManager());
-		
-	}
-	
-	/**
-	 * Load user customizations
-	 * @param paletteItemManager
-	 */
-	public static void loadUserCustomizations(IPaletteItemManager paletteItemManager) {
-		IPreferenceStore store = getPreferenceStore();
-		for (Iterator it=paletteItemManager.getAllCategories().iterator();it.hasNext();){
-			TaglibPaletteDrawer tld = (TaglibPaletteDrawer)it.next();
-			if (store.contains(PREFS_TAGLIBHIDE_PREFIX+tld.getURI())){
-				tld.setVisible( ! store.getBoolean(PREFS_TAGLIBHIDE_PREFIX+tld.getURI()));
-			}
-		}
-	}
-	
-	/**
-	 * Hide a category (TaglibPaletteDrawer) that will be persisted as a customization
-	 * @param taglibPaletteDrawer
-	 */
-	public static void hideTaglibDrawer(TaglibPaletteDrawer taglibPaletteDrawer){
-		IPersistentPreferenceStore prefs = getPreferenceStore();
-		taglibPaletteDrawer.setVisible(false);
-		prefs.putValue(PREFS_TAGLIBHIDE_PREFIX + taglibPaletteDrawer.getURI(), Boolean.TRUE.toString());
-		save((DesignerPaletteRoot)taglibPaletteDrawer.getParent());
-	}
-	
-	private static IPersistentPreferenceStore getPreferenceStore() {
-		return (IPersistentPreferenceStore)PDPlugin.getDefault().getPreferenceStore();
-	}
-	
-	/**
-	 * Exports the current state of customizations of the current palette instance.
-	 * 
-	 * Unsaved data will be exported.
-	 * 
-	 * Currently only the "hide" flag of a category is exported.  All categories are exported.
-	 * 
-	 * @param paletteItemManager
-	 * @param filename
-	 */
-	public static void exportCustomizations(IPaletteItemManager paletteItemManager, String filename){
-
-		Document document = XMLUtil.getDocumentBuilder().getDOMImplementation()
-			.createDocument(null, IPaletteConstants.ROOT, null);
-		try {
-			FileOutputStream ostream = null;
-			int index = filename.lastIndexOf(File.separator);
-			String foldername = filename.substring(0, index); 
-			File folder = new File(foldername);
-			if (folder != null && !folder.exists()) {
-				folder.mkdir();
-			}
-			
-			ostream = new FileOutputStream(filename);
-
-			for (Iterator iter = paletteItemManager.getAllCategories().iterator(); iter.hasNext();) {
-				TaglibPaletteDrawer category = (TaglibPaletteDrawer) iter
-						.next();	
-				if (category == null) continue;
-
-				Element categoryElement = document.createElement(IPaletteConstants.CATEGORY_TAG);
-				categoryElement.setAttribute(IPaletteConstants.ID, category.getURI());
-				categoryElement.setAttribute(IPaletteConstants.ISHIDDEN, Boolean.toString(! category.isVisible()));
-				document.getDocumentElement().appendChild(categoryElement);
-			}
-			XMLUtil.serialize(document, ostream);
-			ostream.close();
-		} catch (IOException e) {
-			_log.error("DesignerPaletteCustomizationsHelper.save.error.IOException", e); //$NON-NLS-1$
-		}
-	}
-	
-	/**
-	 * Imports a palette customization export file.
-	 * 
-	 * If there are entries matching in the existing workspace customizations, they will be overridden.
-	 * 
-	 * @param customizer 
-	 * @param filename
-	 */
-	public static void importCustomizations(DesignerPaletteCustomizer customizer, String filename){
-		Document document = null;
-		try {
-			DocumentBuilder builder = XMLUtil.getDocumentBuilder();
-			if (builder != null) {
-				document = builder.parse(filename);
-			} else {
-				_log.error("DesignerPaletteCustomizationsHelper.importCustomizations.error.getDocumentBuilderFail");// $NON-NLS-1$
-			}
-		} catch (FileNotFoundException e) {
-			//should never get here as user chose file thru a file chooser dialog
-			_log.error(
-					"DesignerPaletteCustomizationsHelper.importCustomizations.error.FileNotFoundException");// $NON-NLS-1$
-			document = null;
-		} catch (IOException e) {
-			_log.error(
-					"DesignerPaletteCustomizationsHelper.importCustomizations.error.IOException", e.toString(), e); //$NON-NLS-1$
-		} catch (SAXException e) {
-			_log.error(
-					"DesignerPaletteCustomizationsHelper.importCustomizations.error.SAXException", e.toString(), e); //$NON-NLS-1$
-		}
-		if (document != null) {
-			Element root = document.getDocumentElement();
-			if (root != null) {
-				NodeList catetorylist = root.getChildNodes();
-				for (int i = 0, n = catetorylist.getLength(); i < n; i++) {
-					Node childNode = catetorylist.item(i);
-					if (childNode.getNodeType() == Node.ELEMENT_NODE
-							&& childNode.getNodeName().equals(
-									IPaletteConstants.CATEGORY_TAG)) {
-						
-						Element categoryElement = (Element) childNode;
-						//only checking for hidden flag currently
-						if (categoryElement.hasAttribute(IPaletteConstants.ISHIDDEN)){
-							boolean isHidden =Boolean.valueOf(categoryElement.getAttribute(IPaletteConstants.ISHIDDEN)).booleanValue();
-							
-							String uri = categoryElement.getAttribute(IPaletteConstants.ID);
-							applyImport(customizer, uri, isHidden);							
-						}
-						
-						
-					}
-				}
-			}
-		}
-	}
-
-	private static void applyImport(
-			DesignerPaletteCustomizer customizer, String uri, boolean isHidden) {
-		//apply the isHidden exported flag to the paletteRoot child if present 
-		for (Iterator it=customizer.getDesignerPaletteRoot().getChildren().iterator();it.hasNext();){
-			Object o = it.next();
-			if (o instanceof TaglibPaletteDrawer){
-				TaglibPaletteDrawer pd = (TaglibPaletteDrawer)o;
-				if (uri.equals(pd.getURI())){
-					pd.setVisible(! isHidden);
-					break;
-				}
-			}
-		}	
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizer.java
deleted file mode 100644
index 9656cd1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizer.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.gef.ui.palette.PaletteCustomizer;
-import org.eclipse.gef.ui.palette.customize.PaletteSeparatorFactory;
-import org.eclipse.gef.ui.palette.customize.PaletteStackFactory;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-
-/**
- * @author mengbo
- */
-public class DesignerPaletteCustomizer extends PaletteCustomizer {
-
-	
-	private DesignerPaletteRoot root;
-
-	/**
-	 * Set the palette root.   Must be set before the customizer can be used
-	 * @param root
-	 */
-	public void setPaletteRoot(DesignerPaletteRoot root){
-		this.root = root;
-	}
-	
-	/**
-	 * Return the palette root for this customizer
-	 * @return DesignerPaletteRoot
-	 */
-	public DesignerPaletteRoot getDesignerPaletteRoot(){
-		return root;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#canMoveDown(org.eclipse.gef.palette.PaletteEntry)
-	 */
-	public boolean canMoveDown(PaletteEntry entry) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#canMoveUp(org.eclipse.gef.palette.PaletteEntry)
-	 */
-	public boolean canMoveUp(PaletteEntry entry) {
-		return false;
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#canMoveDown(org.eclipse.gef.palette.PaletteEntry)
-	 */
-//	public boolean canMoveDown(PaletteEntry entry) {
-//		if (!(entry instanceof PaletteDrawer)) {
-//			return false;
-//		}
-//		return super.canMoveDown(entry);
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#canMoveUp(org.eclipse.gef.palette.PaletteEntry)
-	 */
-//	public boolean canMoveUp(PaletteEntry entry) {
-//		if (!(entry instanceof PaletteDrawer)) {
-//			return false;
-//		}
-//		if (entry.getParent().getChildren().indexOf(entry) == 1) {
-//			return false;
-//		}
-//		return super.canMoveUp(entry);
-//	}
-
-//	/*
-//	 * (non-Javadoc)
-//	 * 
-//	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#performMoveDown(org.eclipse.gef.palette.PaletteEntry)
-//	 */
-//	public void performMoveDown(PaletteEntry entry) {
-//		if (entry instanceof PaletteDrawer) {
-//			String id = entry.getId();
-//			TaglibPaletteDrawer cat = PaletteItemManager.getCurrentInstance().getTaglibPalletteDrawer(id);
-//			movedown(PaletteItemManager.getCurrentInstance(), cat);
-//			super.performMoveDown(entry);
-//		}
-//	}
-//	private void moveup(PaletteItemManager paletteItemManager, TaglibPaletteDrawer cat) {
-//		int i = paletteItemManager.getAllCategories().indexOf(cat);
-//		TaglibPaletteDrawer upCat = (TaglibPaletteDrawer) paletteItemManager.getAllCategories()
-//				.get(i - 1);
-//		movedown(paletteItemManager, upCat);
-//	}
-//
-//	private void movedown(PaletteItemManager paletteItemManager, TaglibPaletteDrawer cat) {
-//		int i = paletteItemManager.getAllCategories().indexOf(cat);
-//		paletteItemManager.getAllCategories().add(i + 2, cat);
-//		paletteItemManager.getAllCategories().remove(i);
-//	}
-//	/*
-//	 * (non-Javadoc)
-//	 * 
-//	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#performMoveUp(org.eclipse.gef.palette.PaletteEntry)
-//	 */
-//	public void performMoveUp(PaletteEntry entry) {
-//		if (entry instanceof PaletteDrawer) {
-//			String id = entry.getId();
-//			TaglibPaletteDrawer cat = PaletteItemManager.getCurrentInstance().getTaglibPalletteDrawer(id);
-//			moveup(PaletteItemManager.getCurrentInstance(), cat);
-//			super.performMoveUp(entry);
-//		}
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#canDelete(org.eclipse.gef.palette.PaletteEntry)
-	 */
-	public boolean canDelete(PaletteEntry entry) {
-		return false;
-	}
-
-	public List getNewEntryFactories() {
-		List list = new ArrayList(4);
-		list.add(new PaletteSeparatorFactory());
-		list.add(new PaletteStackFactory());
-		return list;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#revertToSaved()
-	 */
-	public void revertToSaved() {
-		//note that reset is not currently part of IPaletteItemManager interface...
-		((PaletteItemManager)root.getPaletteManager()).reset();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#save()
-	 */
-	public void save() {
-		DesignerPaletteCustomizationsHelper.save(root);
-//		PaletteItemManager.getCurrentInstance().reset();
-	}
-
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizerDialog.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizerDialog.java
deleted file mode 100644
index 2f64b2b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizerDialog.java
+++ /dev/null
@@ -1,363 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.ui.palette.PaletteCustomizer;
-import org.eclipse.gef.ui.palette.customize.PaletteCustomizationAction;
-import org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.common.ui.internal.utils.PluginImageHelper;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Customization dialog for Web Page Designer palette items
- * @author mengbo
- * @version 1.5
- */
-public class DesignerPaletteCustomizerDialog extends PaletteCustomizerDialog {
-	private static final String DEFAULT_CUSTOMIZATIONS_EXPORT_FILENAME = "WPDPaletteCustomizations.xml";
-	
-	private static String DEFAULTEXTENSION = ".xml";//$NON-NLS-1$ 
-
-	/**
-	 * Constructor
-	 * @param shell
-	 * @param customizer
-	 * @param root
-	 */
-	public DesignerPaletteCustomizerDialog(Shell shell,
-			PaletteCustomizer customizer, PaletteRoot root) {
-		super(shell, customizer, root);
-
-	}
-
-	private PropertyChangeListener applyButtonUpdater = new PropertyChangeListener() {
-
-
-		public void propertyChange(PropertyChangeEvent evt) {
-			Button applyButton = getButton(PaletteCustomizerDialog.APPLY_ID);
-			if (applyButton == null) {
-				return;
-			}
-			applyButton.setEnabled(true);
-		}
-	};
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.window.Window#open()
-	 */
-	public int open() {
-		// save the current state before open
-		// save();
-		return super.open();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog#setActiveEntry(org.eclipse.gef.palette.PaletteEntry)
-	 */
-	protected void setActiveEntry(PaletteEntry entry) {
-		//remove listener on previous entry before adding to new entry
-		PaletteEntry pre = getSelectedPaletteEntry();
-		if (pre != null) {
-			pre.removePropertyChangeListener(applyButtonUpdater);
-		} else {
-			getButton(APPLY_ID).setEnabled(false);
-		}
-		
-		if (entry != null)
-			entry.addPropertyChangeListener(applyButtonUpdater);
-		
-		super.setActiveEntry(entry);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog#save()
-	 */
-	protected void save() {
-		super.save();
-		Button applyButton = getButton(PaletteCustomizerDialog.APPLY_ID);
-		if (applyButton != null) {
-			applyButton.setEnabled(false);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		super.createButtonsForButtonBar(parent);
-		getButton(APPLY_ID).setEnabled(false);
-		// save();
-	}
-
-	/* (non-Javadoc)
-	 * Export action
-	 *
-	 */
-	private class ExportAction extends PaletteCustomizationAction {
-		
-		/**
-		 * Constructor
-		 */
-		public ExportAction() {
-			setEnabled(true);
-			setText(PageDesignerResources.getInstance().getString(
-					"DesignerPaletteCustomizerDialog.label.export")); //$NON-NLS-1$
-			setImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_ELCL_EXPORT,
-							PDPlugin.getPluginId()));
-			setDisabledImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_DLCL_EXPORT,
-							PDPlugin.getPluginId()));
-			setHoverImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_CLCL_EXPORT,
-							PDPlugin.getPluginId()));
-		}
-
-		private void handleExport() {
-			final FileDialog fileDialog = new FileDialog(PDPlugin
-					.getActiveWorkbenchShell());
-			fileDialog.setFileName(DEFAULT_CUSTOMIZATIONS_EXPORT_FILENAME); //$NON-NLS-1$
-			String[] filterExtensions = new String[2];
-			filterExtensions[0] = "*.xml"; //$NON-NLS-1$
-			filterExtensions[1] = "*.*"; //$NON-NLS-1$
-			fileDialog.setFilterExtensions(filterExtensions);
-			fileDialog.setText("Export Palette Customizations");
-			String filename = fileDialog.open();
-			if (filename != null) {
-				if (!filename.endsWith(DEFAULTEXTENSION)) {
-					filename = filename + DEFAULTEXTENSION;
-				}
-				DesignerPaletteCustomizationsHelper
-					.exportCustomizations(PaletteItemManager.getCurrentInstance(), filename);
-
-
-				updateActions();
-			}
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			handleExport();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizationAction#update()
-		 */
-		public void update() {
-			//boolean enabled = false;
-			PaletteEntry entry = getSelectedPaletteEntry();
-			if (entry != null) {
-				// if (getCustomizer() instanceof DesignerPaletteCustomizer)
-				// enabled = ((DesignerPaletteCustomizer)
-				// getCustomizer()).canExport(entry);
-			}
-			setEnabled(true);
-		}
-
-	}
-
-	/* (non-Javadoc)
-	 * Import action
-	 */
-	private class ImportAction extends PaletteCustomizationAction {
-		private DesignerPaletteCustomizerDialog designerPaletteCustomizerDialog;
-		
-		/**
-		 * Constructor
-		 * @param designerPaletteCustomizerDialog
-		 */
-		public ImportAction(DesignerPaletteCustomizerDialog designerPaletteCustomizerDialog) {
-			super();
-			this.designerPaletteCustomizerDialog = designerPaletteCustomizerDialog;
-			setEnabled(true);
-			setText(PageDesignerResources.getInstance().getString(
-					"DesignerPaletteCustomizerDialog.label.import")); //$NON-NLS-1$
-			setImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_ELCL_IMPORT,
-							PDPlugin.getPluginId()));
-			setDisabledImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_DLCL_IMPORT,
-							PDPlugin.getPluginId()));
-			setHoverImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_CLCL_IMPORT,
-							PDPlugin.getPluginId()));
-			
-		}
-
-		private void handleImport() {
-//			PaletteEntry entry = designerPaletteCustomizerDialog.getSelectedPaletteEntry();
-			final FileDialog fileDialog = new FileDialog(PDPlugin
-					.getActiveWorkbenchShell());
-			fileDialog.setFileName(DEFAULT_CUSTOMIZATIONS_EXPORT_FILENAME); //$NON-NLS-1$
-			String[] filterExtensions = new String[2];
-			filterExtensions[0] = "*.xml"; //$NON-NLS-1$
-			filterExtensions[1] = "*.*"; //$NON-NLS-1$
-			fileDialog.setFilterExtensions(filterExtensions);
-			fileDialog.setText("Import Palette Customizations");
-			String filename = fileDialog.open();
-			if (filename != null) {		
-					//deselect current entry first
-					designerPaletteCustomizerDialog.close();		
-					
-//					getCustomizer().revertToSaved();
-					DesignerPaletteCustomizationsHelper
-						.importCustomizations((DesignerPaletteCustomizer)getCustomizer(), filename);
-					
-//					designerPaletteCustomizerDialog.setActiveEntry(entry);
-					((DesignerPaletteCustomizer)getCustomizer()).getDesignerPaletteRoot().refresh();
-					designerPaletteCustomizerDialog.open();
-//					designerPaletteCustomizerDialog.setActiveEntry(entry);
-			}
-		}
-
-		public void run() {
-			handleImport();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizationAction#update()
-		 */
-		public void update() {
-			//nothing to do
-		}
-	}
-
-	/**
-	 * @return import action
-	 */
-	public Action getImportAction() {
-		return new ImportAction(this);
-	}
-
-	/**
-	 * @return export action
-	 */
-	public Action getExportAction() {
-		return new ExportAction();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog#createOutlineActions()
-	 */
-	protected List createOutlineActions() {
-		List actions = super.createOutlineActions();
-		actions.remove(0);// remove new action
-		actions.remove(0);// remove delete action
-		actions.add(new ImportAction(this));
-		actions.add(new ExportAction());
-
-		return actions;
-	}
-	
-	@Override
-	protected TreeViewer createOutlineTreeViewer(Composite composite) {
-		TreeViewer viewer = super.createOutlineTreeViewer(composite);
-		viewer.setContentProvider(new DesignerPaletteContentProvider());
-		return viewer;
-	}
-
-	
-	/**
-	 * Content provider for dialog.
-	 * Displays only {@link TaglibPaletteDrawer}s
-	 */
-	private class DesignerPaletteContentProvider implements ITreeContentProvider {
-
-		public Object[] getChildren(Object parentElement) {
-			if (parentElement instanceof DesignerPaletteRoot){
-				List libs = new ArrayList();
-				List children = ((DesignerPaletteRoot)parentElement).getChildren();				
-				if (!children.isEmpty()) {
-					for (Iterator it=children.iterator();it.hasNext();){
-						PaletteEntry entry = (PaletteEntry)it.next();
-						if (entry instanceof TaglibPaletteDrawer)
-							libs.add(entry);
-					}
-					if (!libs.isEmpty())
-						return libs.toArray();
-				}
-			}
-			return null;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object element) {
-			return ((PaletteEntry)element).getParent();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-		 */
-		public boolean hasChildren(Object element) {
-			return false;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			Object[] elements = new Object[0];
-			if (inputElement instanceof DesignerPaletteRoot){
-				elements = getChildren(inputElement);
-				if (elements == null) {
-					elements = new Object[0];
-				}
-			}
-			return elements;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-			//nothing to do
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			//won't change			
-		}
-
-		
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteImages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteImages.java
deleted file mode 100644
index 3b1d7e1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteImages.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-/**
- * Palette Image constants
- * @author mengbo
- */
-public class DesignerPaletteImages {
-	/**
-	 * Import hover image
-	 */
-	public static final String IMG_CLCL_IMPORT = "icons/palette/GENERIC/small/PD_Palette_Import_Hover.gif";
-
-	/**
-	 * Export hover image
-	 */
-	public static final String IMG_CLCL_EXPORT = "icons/palette/GENERIC/small/PD_Palette_Export_Hover.gif";
-
-	/**
-	 * Import disabled image
-	 */
-	public static final String IMG_DLCL_IMPORT = "icons/palette/GENERIC/small/PD_Palette_Import_Disabled.gif";
-
-	/**
-	 * Export disabled image
-	 */
-	public static final String IMG_DLCL_EXPORT = "icons/palette/GENERIC/small/PD_Palette_Export_Disabled.gif";
-
-	/**
-	 * Import image
-	 */
-	public static final String IMG_ELCL_IMPORT = "icons/palette/GENERIC/small/PD_Palette_Import.gif";
-
-	/**
-	 * Export image
-	 */
-	public static final String IMG_ELCL_EXPORT = "icons/palette/GENERIC/small/PD_Palette_Export.gif";
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRoot.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRoot.java
deleted file mode 100644
index 31c9d03..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRoot.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gef.Tool;
-import org.eclipse.gef.palette.MarqueeToolEntry;
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.gef.palette.PaletteGroup;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.palette.SelectionToolEntry;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.tools.RangeSelectionTool;
-
-/**
- * @author mengbo
- */
-public class DesignerPaletteRoot extends PaletteRoot {
-	private IPaletteItemManager _manager;
-    
-	/**
-	 * Creates a new DesignerPaletteRoot instance.
-	 * @param manager 
-	 */
-	public DesignerPaletteRoot(IPaletteItemManager manager) {
-		// create root
-		super();
-
-		this._manager = manager;
-		setupBasicItems();
-		loadItems();
-
-		// TODO: register listener on the manager for toolpalette change event.
-
-	}
-
-	/**
-	 * @return IPaletteItemManager instance for this root
-	 */
-	public IPaletteItemManager getPaletteManager() {
-		return this._manager;
-	}
-
-	private void setupBasicItems() {
-		// Preferences prefs = PDPlugin.getDefault().getPluginPreferences();
-		// _showAll = prefs.getBoolean(IJMTConstants.PREF_PALETTE_SHOW_ALL);
-
-		// a group of default control tools
-		// JSFPalette.DefaultGroup.LabelJSFPallete=Controls
-		PaletteGroup controls = new PaletteGroup(PageDesignerResources
-				.getInstance().getString(
-						"JSFPalette.DefaultGroup.LabelJSFPallete")); //$NON-NLS-1$
-		add(controls);
-		// the selection tool
-		ToolEntry tool = new SelectionToolEntry() {
-			public Tool createTool() {
-				return new RangeSelectionTool();
-			}
-		};
-		controls.add(tool);
-
-		// use selection tool as default entry
-		setDefaultEntry(tool);
-
-		// the marquee selection tool
-		controls.add(new MarqueeToolEntry());
-	}
-
-	private void loadItems() {
-		// _showAll =
-		// PDPlugin.getDefault().getPluginPreferences().getBoolean(IJMTConstants.PREF_PALETTE_SHOW_ALL);
-		// remove other things first.
-		removeItems();
-
-		List categories = _manager.getAllCategories();
-		this.addAll(categories);
-	}
-
-	/**
-	 * remove everything from the paletteroot
-	 * 
-	 */
-	protected void removeItems() {
-		// we try to remove anything other than the basic
-		// group that have the selectentry and marqeeentry
-		List children1 = new ArrayList(getChildren());
-		children1.remove(0); // remove the first one
-		for (int i = 0, n = children1.size(); i < n; i++) {
-			this.remove((PaletteEntry) children1.get(i));
-		}
-	}
-
-	/**
-	 * refresh the palette, normally caused by preference change.
-	 */
-	public void refresh() {
-		loadItems();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRootFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRootFactory.java
deleted file mode 100644
index 3f81a7f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRootFactory.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.ui.palette.FlyoutPaletteComposite.FlyoutPreferences;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-
-/**
- * Factory for creating DesignerPaletteRoots
- * @author mengbo 
- */
-public class DesignerPaletteRootFactory {
-	/** Default palette size. */
-	private static final int DEFAULT_PALETTE_SIZE = 125;
-
-	/** Preference ID used to persist the palette location. */
-	private static final String PALETTE_DOCK_LOCATION = "DesignerPaletteRootFactory.Location";
-
-	/** Preference ID used to persist the palette size. */
-	private static final String PALETTE_SIZE = "DesignerPaletteRootFactory.Size";
-
-	/** Preference ID used to persist the flyout palette's state. */
-	private static final String PALETTE_STATE = "DesignerPaletteRootFactory.State";
-
-	/**
-	 * Return a {@link FlyoutPreferences} instance used to save/load the preferences of
-	 * a flyout palette.
-	 * @return FlyoutPreferences
-	 */
-	public static FlyoutPreferences createPalettePreferences() {
-		// set default flyout palette preference values, in case the preference
-		// store
-		// does not hold stored values for the given preferences
-		getPreferenceStore().setDefault(PALETTE_DOCK_LOCATION, -1);
-		getPreferenceStore().setDefault(PALETTE_STATE, -1);
-		getPreferenceStore().setDefault(PALETTE_SIZE, DEFAULT_PALETTE_SIZE);
-
-		return new FlyoutPreferences() {
-			public int getDockLocation() {
-				return getPreferenceStore().getInt(PALETTE_DOCK_LOCATION);
-			}
-
-			public int getPaletteState() {
-				return getPreferenceStore().getInt(PALETTE_STATE);
-			}
-
-			public int getPaletteWidth() {
-				return getPreferenceStore().getInt(PALETTE_SIZE);
-			}
-
-			public void setDockLocation(int location) {
-				getPreferenceStore().setValue(PALETTE_DOCK_LOCATION, location);
-			}
-
-			public void setPaletteState(int state) {
-				getPreferenceStore().setValue(PALETTE_STATE, state);
-			}
-
-			public void setPaletteWidth(int width) {
-				getPreferenceStore().setValue(PALETTE_SIZE, width);
-			}
-		};
-	}
-
-	/**
-	 * Returns the preference store for the PDPlugin.
-	 * 
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#getPreferenceStore()
-	 */
-	private static IPreferenceStore getPreferenceStore() {
-		return PDPlugin.getDefault().getPreferenceStore();
-	}
-
-	/**
-	 * Creates the PaletteRoot and adds all palette elements. Use this factory
-	 * method to create a new palette for your graphical editor.
-	 * @param project 
-	 * @return a new PaletteRoot
-	 */
-	public static PaletteRoot createPaletteRoot(IProject project) {
-		PaletteItemManager manager = PaletteItemManager.getInstance(project);
-		if (manager == null) {
-			return null;
-		}
-		manager.reset();
-		PaletteRoot palette = new DesignerPaletteRoot(manager);
-		return palette;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewer.java
deleted file mode 100644
index d25c94f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewer.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.core.runtime.Preferences.PropertyChangeEvent;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.ui.palette.PaletteCustomizer;
-import org.eclipse.gef.ui.palette.PaletteViewer;
-import org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * XXX: currently create this class is just for add/remove listener to
- * preference change, so can refresh the palette.
- * 
- * @author mengbo
- * @author mengbo
- * @version 1.5
- */
-public class DesignerPaletteViewer extends PaletteViewer {
-
-	private PaletteCustomizerDialog _customizerDialog = null;
-
-	private DesignerPaletteCustomizer _customizer;
-
-	/**
-	 * 
-	 */
-	public DesignerPaletteViewer() {
-		super();
-
-		this.enableVerticalScrollbar(true);
-	}
-
-	Preferences.IPropertyChangeListener listener = new Preferences.IPropertyChangeListener() {
-		public void propertyChange(PropertyChangeEvent event) {
-			PaletteRoot root = getPaletteRoot();
-			if (root instanceof DesignerPaletteRoot) {
-//				((DesignerPaletteRoot) root).refresh();
-				// XXX: setActiveTool to null to workaround GEF bug of NPE
-				// setActiveTool(null);
-			}
-		}
-	};
-	
-	IEntryChangeListener _paletteModelListener = new IEntryChangeListener() {
-
-		public void modelChanged(List oldDefinitions, List newDefinitions) {
-			final PaletteRoot root = getPaletteRoot();
-			if (root instanceof DesignerPaletteRoot) {
-                Control viewerControl = getControl();
-                
-                if (viewerControl != null && !viewerControl.isDisposed())
-                {
-                    Display  display = viewerControl.getDisplay();
-                    
-                    if (display != null && !display.isDisposed())
-                    {
-                        // this updates the UI, so it must be run on
-                        // the display thread
-                        display.asyncExec(new Runnable()
-                        {
-                            public void run() {
-                                ((DesignerPaletteRoot) root).refresh();
-                            }
-                        });
-                    }
-                }
-			}
-		}
-
-	};
-
-//
-//	IResourceChangeListener _resourceChangeListener = new IResourceChangeListener() {
-//
-//		public void resourceChanged(IResourceChangeEvent event) {
-//			IResourceDeltaVisitor visitor = new IResourceDeltaVisitor() {
-//				public boolean visit(IResourceDelta delta) throws CoreException {
-//					IResource resource = delta.getResource();
-//					// FIXME need make performance better
-//					if (resource.getType() == IResource.FILE
-//							&& (delta.getFlags() & IResourceDelta.CONTENT) != 0) {
-//						String ext = ((IFile) resource).getFileExtension();
-//						// resource.getFullPath().
-//						if (ext != null
-//								&& ("tld".equalsIgnoreCase(ext) || "jar"
-//										.equalsIgnoreCase(ext))) {
-//							PaletteRoot root = getPaletteRoot();
-//							if (root instanceof DesignerPaletteRoot) {
-//								IPaletteItemManager imanager = ((DesignerPaletteRoot) root)
-//										.getPaletteManager();
-//								if (imanager instanceof PaletteItemManager) {
-//									PaletteItemManager manager = (PaletteItemManager) imanager;
-//									manager.reset();
-//								}
-//
-//							}
-//						}
-//					}
-//					return true;
-//				}
-//			};
-//			try {
-//				IResourceDelta delta = event.getDelta();
-//				if (delta != null) {
-//					delta.accept(visitor);
-//				}
-//			} catch (CoreException e) {
-//				// ignore
-//			}
-//		}
-//
-//	};
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteViewer#hookControl()
-	 */
-	protected void hookControl() {
-		super.hookControl();
-		PDPlugin.getDefault().getPluginPreferences().addPropertyChangeListener(
-				listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteViewer#unhookControl()
-	 */
-	protected void unhookControl() {
-		PDPlugin.getDefault().getPluginPreferences()
-				.removePropertyChangeListener(listener);
-		// remove palette model change listener
-		PaletteRoot root = getPaletteRoot();
-		if (root instanceof DesignerPaletteRoot) {
-			if (_customizer != null){
-				_customizer.setPaletteRoot(null);
-			}
-			IPaletteItemManager imanager = ((DesignerPaletteRoot) root)
-					.getPaletteManager();
-			if (imanager instanceof PaletteItemManager) {
-				PaletteItemManager manager = (PaletteItemManager) imanager;
-//				ResourcesPlugin.getWorkspace().removeResourceChangeListener(
-//						_resourceChangeListener);
-				manager.removeEntryChangeListener(_paletteModelListener);
-				PaletteItemManager.clearPaletteItemManager();
-			}
-		}
-		super.unhookControl();
-	}
-
-	public PaletteCustomizerDialog getCustomizerDialog() {
-		if (_customizerDialog == null){
-			_customizerDialog = DesignerPaletteCustomizationsHelper.getNewCustomizerDialog(this, getCustomizer() );	
-		}
-		return _customizerDialog;
-	}
-
-	public PaletteCustomizer getCustomizer() {
-		if (_customizer == null){
-			_customizer = DesignerPaletteCustomizationsHelper.getNewCustomizer();
-			_customizer.setPaletteRoot((DesignerPaletteRoot)this.getPaletteRoot());
-		}
-		return _customizer;
-	}
-	
-	public void setPaletteRoot(PaletteRoot root) {
-		super.setPaletteRoot(root);
-		// add palette model change listener
-		// PaletteRoot root = getPaletteRoot();
-		if (root instanceof DesignerPaletteRoot) {
-			((DesignerPaletteRoot) root).getPaletteManager()
-					.addEntryChangeListener(_paletteModelListener);
-//			ResourcesPlugin.getWorkspace().addResourceChangeListener(
-//					_resourceChangeListener);
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewerProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewerProvider.java
deleted file mode 100644
index b836d30..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewerProvider.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.gef.EditDomain;
-import org.eclipse.gef.internal.ui.palette.editparts.DrawerEditPart;
-import org.eclipse.gef.ui.palette.PaletteContextMenuProvider;
-import org.eclipse.gef.ui.palette.PaletteViewer;
-import org.eclipse.gef.ui.palette.PaletteViewerProvider;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dnd.internal.DesignerTemplateTransferDragSourceListener;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @author mengbo
- */
-public class DesignerPaletteViewerProvider extends PaletteViewerProvider {
-	/**
-	 * @param graphicalViewerDomain
-	 */
-	public DesignerPaletteViewerProvider(EditDomain graphicalViewerDomain) {
-		super(graphicalViewerDomain);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteViewerProvider#configurePaletteViewer(org.eclipse.gef.ui.palette.PaletteViewer)
-	 */
-	protected void configurePaletteViewer(PaletteViewer viewer) {
-		// super.configurePaletteViewer(viewer);
-		viewer.setContextMenu(new PaletteContextMenuProvider(viewer) {
-			public void buildContextMenu(IMenuManager menu) {
-				StructuredSelection sel = (StructuredSelection)getViewer().getSelection();
-				if (sel != null 
-						&& sel.getFirstElement() instanceof DrawerEditPart
-						&& ((DrawerEditPart)sel.getFirstElement()).getDrawer() instanceof TaglibPaletteDrawer)
-					menu.add(new HideTagLibAction((DrawerEditPart)sel.getFirstElement(), "Hide"));
-				super.buildContextMenu(menu);
-			}
-		});
-
-		// XXX: should only use the following when we use Template
-		viewer
-				.addDragSourceListener(new DesignerTemplateTransferDragSourceListener(
-						viewer));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteViewerProvider#createPaletteViewer(org.eclipse.swt.widgets.Composite)
-	 */
-	public PaletteViewer createPaletteViewer(Composite parent) {
-		PaletteViewer pViewer = new DesignerPaletteViewer();
-		pViewer.createControl(parent);
-		configurePaletteViewer(pViewer);
-		pViewer.setCustomizer(new DesignerPaletteCustomizer());
-		hookPaletteViewer(pViewer);
-
-		PlatformUI
-				.getWorkbench()
-				.getHelpSystem()
-				.setHelp(
-						parent,
-						PDPlugin
-								.getResourceString("DesignerPaletteViewerProvider.help.id"));
-
-		return pViewer;
-	}
-	
-	private class HideTagLibAction extends Action {
-		private DrawerEditPart tagLib;
-		
-		/**
-		 * Constructor
-		 * @param tagLibDrawer
-		 * @param string
-		 */
-		public HideTagLibAction(DrawerEditPart tagLibDrawer, String string) {
-			super(string);
-			this.tagLib = tagLibDrawer;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			TaglibPaletteDrawer pd = (TaglibPaletteDrawer)tagLib.getDrawer();
-			pd.setVisible(false);
-			DesignerPaletteCustomizationsHelper.hideTaglibDrawer(pd);
-		}		
-		
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IEntryChangeListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IEntryChangeListener.java
deleted file mode 100644
index 2f4667e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IEntryChangeListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.List;
-
-/**
- * @author mengbo
- */
-public interface IEntryChangeListener {
-	/**
-	 * @param oldDefinitions
-	 *            the old taglib definitions
-	 * @param newDefinitions
-	 *            the new taglib definitions
-	 */
-	void modelChanged(List oldDefinitions, List newDefinitions);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteConstants.java
deleted file mode 100644
index dcbf651..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteConstants.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-/**
- * Constants used by palette customizations persistence
- * 
- * @author mengbo
- */
-public interface IPaletteConstants {
-	/**
-	 * 
-	 */
-	public static final String BUNDLE_ID = "org.eclipse.jst.pagedesigner"; //$NON-NLS-1$
-
-	/**
-	 * contant for palett-item element name
-	 */
-	public static final String ROOT = "palette-item"; //$NON-NLS-1$
-
-	/**
-	 * constant for uri attribute
-	 */
-	public static final String URI = "uri"; //$NON-NLS-1$
-
-	/**
-	 * Constant for hidden attribute
-	 */
-	public static final String ISHIDDEN = "hidden"; //$NON-NLS-1$
-
-	/**
-	 * constant for id attribute
-	 */
-	public static final String ID = "id"; //$NON-NLS-1$
-	
-	/**
-	 * constant for category element name
-	 */
-	public static final String CATEGORY_TAG = "category"; //$NON-NLS-1$
-	
-//OLD - no longer/currently used
-
-//	public static final String EXTENSION_POINT_ID = "ResourceContributions"; //$NON-NLS-1$
-//	public static final String FILENAME = "/tag.xml"; //$NON-NLS-1$
-//	public static final String TAGNAME = "tagName"; //$NON-NLS-1$
-//	public static final String ITEM_TAG = "item"; //$NON-NLS-1$
-//	public static final String EXPERT = "expert"; //$NON-NLS-1$
-//	public static final String LARGEICON = "largeIcon"; //$NON-NLS-1$
-//	public static final String SMALLICON = "smallIcon"; //$NON-NLS-1$
-//	public static final String LABEL = "label"; //$NON-NLS-1$
-//	public static final String INITIALSTATE = "initialState"; //$NON-NLS-1$
-//	public static final String SHORTDESC = "shortDesc"; //$NON-NLS-1$
-//	public static final String ATTRIBUTE_TAG = "attribute"; //$NON-NLS-1$
-//	public static final String NAME = "name"; //$NON-NLS-1$
-//	public static final String VALUE = "value"; //$NON-NLS-1$
-//	public static final String ICONPREFIX = "iconPrefix"; //$NON-NLS-1$
-//	public static final String TAGLIBEXT = "capability"; //$NON-NLS-1$
-//	public static final String JARPROTO = "jar:file://"; //$NON-NLS-1$
-//	public static final String FILEPROTO = "file://"; //$NON-NLS-1$
-//	public static final String REQUIREHFORM = "requireHForm"; //$NON-NLS-1$
-//	public static final String JSFCOMPONENTCATEGORY = "jsfComponentCategory"; //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteItemManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteItemManager.java
deleted file mode 100644
index aa047ff..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteItemManager.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
-
-/**
- * PaletteItemManager interface.
- * 
- * NOT intended to be implemented by clients
- * 
- * @author mengbo
- */
-public interface IPaletteItemManager {
-	/**
-	 * @return IProject
-	 */
-	public IProject getProject();
-	
-	/**
-	 * @return list of {@link TaglibPaletteDrawer}s being managed for this project 
-	 */
-	public List/*TaglibPaletteDrawer*/ getAllCategories();
-
-	/**
-	 * Create a TaglibPaletteDrawer with given label for given id
-	 * 
-	 * @param id
-	 * @param label 
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer createTaglibPaletteDrawer(String id, String label);
-
-	/**
-	 * Retrieve the TaglibPaletteDrawer by id.  May be null.
-	 * 
-	 * @param id
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer getTaglibPalletteDrawer(String id);
-
-	/**
-	 * Locate by id, and if not found,  create a TaglibPaletteDrawer using label and id
-	 * 
-	 * @param id
-	 * @param label
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer findOrCreateCategory(String id, String label);
-
-	/**
-	 * Adds a listener to the list of those notified when the model contents are
-	 * replaced
-	 * 
-	 * @param listener -
-	 *            the listener to add
-	 */
-	void addEntryChangeListener(IEntryChangeListener listener);
-
-	/**
-	 * Adds a listener to the list of those notified when the model contents are
-	 * replaced
-	 * 
-	 * @param listener -
-	 *            the listener to remove
-	 */
-	void removeEntryChangeListener(IEntryChangeListener listener);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/ShowAllAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/ShowAllAction.java
deleted file mode 100644
index f115bfe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/ShowAllAction.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- */
-public class ShowAllAction extends Action {
-	Preferences _preferences = null;
-
-	/**
-	 * @param pluginPreferences
-	 */
-	public ShowAllAction(Preferences pluginPreferences) {
-		super(PDPlugin.getResourceString("ShowAllAction.ActionLabel.ShowAll")); //$NON-NLS-1$
-		_preferences = pluginPreferences;
-		boolean showAll = _preferences
-				.getBoolean(IJMTConstants.PREF_PALETTE_SHOW_ALL);
-		this.setChecked(showAll);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		boolean showAll = _preferences
-				.getBoolean(IJMTConstants.PREF_PALETTE_SHOW_ALL);
-		// toggle the show all status. preference will fire out change event,
-		// and palettes
-		// receive this event will refresh
-		_preferences.setValue(IJMTConstants.PREF_PALETTE_SHOW_ALL, !showAll);
-		this.setChecked(!showAll);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagToolPaletteEntry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagToolPaletteEntry.java
deleted file mode 100644
index 7f14afb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagToolPaletteEntry.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.gef.Tool;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationTool;
-
-/**
- * Represents a tag palette item entry in the web page designer palette
- *
- */
-public class TagToolPaletteEntry extends ToolEntry {
-
-	private String tagName;
-	
-	/**
-	 * Constructor
-	 * @param tagName
-	 * @param label
-	 * @param shortDescription
-	 * @param iconSmall
-	 * @param iconLarge
-	 */
-	public TagToolPaletteEntry(String tagName, String label, String shortDescription,
-			ImageDescriptor iconSmall, ImageDescriptor iconLarge) {
-		super(label, shortDescription, iconSmall, iconLarge);
-		this.tagName = tagName;
-	}
-
-	/**
-	 * @return tagName
-	 */
-	public String getTagName(){
-		return tagName;
-	}
-	
-	/**
-	 * Convenience method returning the tag libraries default prefix, if applicable
-	 * @return default prefix 
-	 */
-	public String getDefaultPrefix(){
-		return ((TaglibPaletteDrawer)getParent()).getDefaultPrefix();
-	}
-
-	/**
-	 * @return uri of the tag's library
-	 */
-	public String getURI(){
-		return ((TaglibPaletteDrawer)getParent()).getURI();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.palette.ToolEntry#createTool()
-	 */
-	public Tool createTool() {
-		return new ItemCreationTool(this);
-	}
-	
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteElementTemplateHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteElementTemplateHelper.java
deleted file mode 100644
index 314787e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteElementTemplateHelper.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette.impl;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationInfo;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-import org.xml.sax.SAXException;
-
-/**
- * 
- * @author mengbo
- */
-public class PaletteElementTemplateHelper {
-	//private static final String TEMPLATE_ITEM_NAME = "template";
-
-	private static final String PREFIX_ATTRIBUTE = "_uri_";
-
-//	private static Logger _log = PDPlugin
-//			.getLogger(PaletteElementTemplateHelper.class);
-
-	/**
-	 * This method is used to process template element which is read from .xmi
-	 * file and generate default element.
-	 * 
-	 * @param model
-	 * @param element
-	 * @param tagItem
-	 * @param tagCreationInfo 
-	 */
-	public static void applyTemplate(IDOMModel model, Element element,
-			TagToolPaletteEntry tagItem, TagCreationInfo tagCreationInfo) {
-		if (element == null || element.getLocalName() == null) {
-			return;
-		}
-		
-		Node[] templateNodes = getTemplateNodes(model,  tagCreationInfo);
-		if (templateNodes != null) {
-			for (int i=0;i<templateNodes.length;i++){
-				Node anode = templateNodes[i];
-				element.appendChild(anode);				
-			}
-		}
-	}
-
-	private static Node[] getTemplateNodes(IDOMModel model,
-			TagCreationInfo tagCreationInfo) {
-
-		if (tagCreationInfo == null)
-			return null;
-		
-		String template = (String)tagCreationInfo.getTemplate();
-		if (template != null){
-			
-			final String nodeStr = prepareNode(template);//(String)template.getTemplate();
-			final Logger logger = PDPlugin.getLogger(PaletteElementTemplateHelper.class); 
-			try {
-				DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-				factory.setNamespaceAware(true);
-				factory.setValidating(false);
-				DocumentBuilder builder = factory.newDocumentBuilder();
-				Document doc = builder.parse(new ByteArrayInputStream( nodeStr.getBytes()));
-				Node beginNode = doc.getFirstChild();
-				Node templateNode = beginNode.cloneNode(true);//model.getDocument().importNode(beginNode, true);
-				Node[] templateNodes = applyPrefixes(model, tagCreationInfo, templateNode.getChildNodes(), model.getDocument());
-				return templateNodes;
-			} catch (ParserConfigurationException e) {
-			    logger.error(e);
-			} catch (SAXException e) {
-                logger.error(e);
-			} catch (IOException e) {
-                logger.error(e);
-			} catch (Exception e){
-                logger.error(e);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param template
-	 * @return xml as String wrapped by a <begin> node as template may not have a single root element
-	 */
-	private static String prepareNode(String template) {
-		StringBuffer buf = new StringBuffer("<begin>");
-		buf.append(template);
-		buf.append("</begin>");
-		return buf.toString();
-	}
-
-	/**
-	 * Use the actrual prefixs of jsf html and jsf core to set the prefix of
-	 * each node declared in template.
-	 * @param model 
-	 * @param info 
-	 * @param templateNodes 
-	 * @param document 
-	 * @return Node[]
-	 * 
-	 */
-	public static Node[] applyPrefixes(IDOMModel model, TagCreationInfo info,
-			NodeList templateNodes, Document document) {
-		List result = new ArrayList();
-		for (int i = 0, n = templateNodes.getLength(); i < n; i++) {
-			Node node = cloneNodeDeep(model, document, templateNodes.item(i));
-			if (node instanceof Element) {
-				result.add(node);
-			}
-		}
-		return (Node[]) result.toArray(new Node[result.size()]);
-	}
-
-	/**
-	 * TODO: Later we may add some logic to reference the tld file through tag
-	 * name to resolve the prefixs directly.
-	 */
-	private static void internalApplyPrefixes(IDOMModel model, Element refNode, Element node) {
-		if (node != null && refNode != null) {
-			String uri = refNode.getAttribute(PREFIX_ATTRIBUTE); //$NON-NLS-1$
-			if (uri != null) {
-				String prefix = JSPUtil.getOrCreatePrefix(model, uri, null);
-				node.setPrefix(prefix);
-			}
-		}
-	}
-
-
-	/**
-	 * A deep clone of the sourceNode
-	 * @param model
-	 * @param destDoc
-	 * @param sourceNode
-	 * @return Node
-	 */
-	public static Node cloneNodeDeep(IDOMModel model, Document destDoc, Node sourceNode) {
-		switch (sourceNode.getNodeType()) {
-		case Node.ELEMENT_NODE:
-			Element sourceEle = (Element) sourceNode;
-			Element resultEle = destDoc.createElement(sourceEle.getTagName());
-			internalApplyPrefixes(model, sourceEle, resultEle);
-			NamedNodeMap attrs = sourceEle.getAttributes();
-			for (int i = 0, size = attrs.getLength(); i < size; i++) {
-				Attr a = (Attr) attrs.item(i);
-				if (!PREFIX_ATTRIBUTE.equalsIgnoreCase(a.getNodeName())) {
-					resultEle.setAttribute(a.getName(), a.getValue());
-				}
-			}
-			NodeList children = sourceEle.getChildNodes();
-			for (int i = 0, size = children.getLength(); i < size; i++) {
-				Node n = children.item(i);
-				Node d = cloneNodeDeep(model, destDoc, n);
-				if (d != null) {
-					resultEle.appendChild(d);
-				}
-			}
-			return resultEle;
-		case Node.TEXT_NODE:
-			Text txt = destDoc.createTextNode(sourceNode.getNodeValue());
-			if (txt instanceof IDOMText && sourceNode instanceof IDOMText) {
-				try {
-					((IDOMText) txt).setSource(((IDOMText) sourceNode)
-							.getSource());
-				} catch (Exception ex) {
-					// ignore
-				}
-			}
-			return txt;
-		case Node.CDATA_SECTION_NODE:
-			return destDoc.createCDATASection(sourceNode.getNodeValue());
-		default:
-			return null; // not support.
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteHelper.java
deleted file mode 100644
index 525578d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteHelper.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.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.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.IPaletteItemManager;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfos;
-import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocument;
-import org.eclipse.wst.html.core.internal.contentmodel.JSPCMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
-
-/**
- * Helper class.
- * 
- * @author mengbo
- */
-public class PaletteHelper {
-	
-    // pattern to strip all <x> and </x> HTML tags
-    final private static Pattern removeHTMLTags = Pattern.compile("<[/?\\w\\s=\"\\.\\#]+>");
-    
-    // pattern to find all runs of spaces longer than one
-    final private static Pattern trimInteriorWhitespace = Pattern.compile("[ ]+");
-    
-    // pattern to find all new lines for removal
-    final private static Pattern removeNewLines = Pattern.compile("[\n]");
-    
-	private final static ImageDescriptor DEFAULT_SMALL_ICON = PDPlugin
-		.getDefault().getImageDescriptor(
-			"palette/GENERIC/small/PD_Palette_Default.gif");
-
-	private final static ImageDescriptor DEFAULT_LARGE_ICON = PDPlugin
-		.getDefault().getImageDescriptor(
-				"palette/GENERIC/large/PD_Palette_Default.gif");
-
-
-
-// how many characters to truncate a palette item's description to.
-// TODO: add preference?
-// the soft length is the ideal length we try to truncate to. We first
-// try to find a period (end of sentence; TODO: should have a character class)
-// inside the first SOFT_LENGTH chars at which to truncate a description string.
-// if we can't find one then we search for the first one between SOFT_LENGTH
-// and min(HARD_LENGTH, str.length()).  If found, we truncate there.  If not,
-// we truncate to HARD_LENGTH-" ...".length() and append the ellipsis.
-// In all cases the truncated description string returned should <= HARD_LENGTH.
-//	private final static int  DESCRIPTION_TRUNCATE_SOFT_LENGTH = 150;
-	private final static int  DESCRIPTION_TRUNCATE_HARD_LENGTH = 250;
-	
-	
-	/**
-	 * Creates a TaglibPaletteDrawer with TagTool palette entries for each tag from the CMDocument
-	 * @param manager
-	 * @param project
-	 * @param doc
-	 * @return TaglibPaletteDrawer
-	 */
-	public static TaglibPaletteDrawer configPaletteItemsByTLD(IPaletteItemManager manager, IProject project,
-			CMDocument doc) {
-		//bit of a hack... could be greatly improved		
-		String tldURI = null;
-		if (doc instanceof TLDDocument){
-			tldURI = ((TLDDocument)doc).getUri();
-		}
-		else if (doc instanceof HTMLCMDocument){
-			tldURI = CMDocType.HTML_DOC_TYPE;
-		}
-		else if (doc instanceof JSPCMDocument){
-			tldURI = CMDocType.JSP11_DOC_TYPE;
-		}
-		
-		if (tldURI == null) 
-			return null;
-			
-		TaglibPaletteDrawer category = findCategory(manager, tldURI);
-		if (category != null) 
-			return category;
-		
-		ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, tldURI);
-		Model model = TaglibDomainMetaDataQueryHelper.getModel(modelContext);
-		category = createTaglibPaletteDrawer(manager, doc, model);
-		
-		if (category != null){		
-			loadTags(category, doc, model);		
-			sortTags(category.getChildren());
-		}
-		return category;
-	}
-
-	private static void sortTags(List tags) {
-		//note that once we store ordering customizations, we will need to do something different
-		//it will also be complicated if we decide to do 181958 and 181866
-		Collections.sort(tags, new Comparator(){
-
-			public int compare(Object o1, Object o2) {
-				String label1 = ((PaletteEntry)o1).getLabel();
-				String label2 = ((PaletteEntry)o2).getLabel();
-				
-				return label1.compareTo(label2);
-			}
-			
-		});
-		
-	}
-
-	private static void loadTags(TaglibPaletteDrawer category,
-			CMDocument doc,Model model) {
-		
-		if (model != null) {//load from metadata - should always drop in here
-			Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model, "paletteInfos");
-			if (trait != null){
-				PaletteInfos tags = (PaletteInfos)trait.getValue();
-				for (Iterator it=tags.getInfos().iterator();it.hasNext();){
-					PaletteInfo tag = (PaletteInfo)it.next();
-					createTagEntry(category, tag);
-				}
-			} else {
-				for (Iterator it=model.getChildEntities().iterator();it.hasNext();){
-					Entity tagAsEntity = (Entity)it.next();
-					createTagEntry(category, tagAsEntity);
-				}
-			}
-		}
-		else {//fail safe loading from cmDoc... should no longer go in here 
-			loadFromCMDocument(category, doc);
-		}
-		
-	}
-
-	private static TaglibPaletteDrawer createTaglibPaletteDrawer(IPaletteItemManager manager,
-			CMDocument doc, Model model) {
-		
-		TaglibPaletteDrawer	 category = null;
-		if (model != null){
-			//do we create it?
-			boolean isHidden = getBooleanTagTraitValue(model, "hidden", false);			
-			if (isHidden){
-				return null;
-			}
-						
-			String label = getStringTagTraitValue(model, "display-label", model.getId());
-			label = label.equals("") ? model.getId() : label;
-			category = manager.createTaglibPaletteDrawer(model.getId(), label);
-			
-			String desc = getStringTagTraitValue(model, "description", model.getId());
-			category.setDescription(formatDescription(desc));
-			
-			ImageDescriptor largeIconImage = getImageDescriptorFromTagTraitValueAsString(model, "small-icon", null);
-			if (largeIconImage != null)
-				category.setLargeIcon(largeIconImage);			
-			
-			String prefix = getStringTagTraitValue(model, "default-prefix", null);
-			category.setDefaultPrefix(prefix);
-			
-			boolean isVisible = !(getBooleanTagTraitValue(model, "expert", false));
-			category.setVisible(isVisible);
-			
-			category.setInitialState(PaletteDrawer.INITIAL_STATE_CLOSED);
-		
-		}
-		return category;
-	}
-
-	private static TaglibPaletteDrawer findCategory(IPaletteItemManager manager,
-			String tldURI) {
-		TaglibPaletteDrawer lib = null;
-		for (Iterator it = manager.getAllCategories().iterator();it.hasNext();){
-			lib = (TaglibPaletteDrawer)it.next();
-			if (tldURI.equals(lib.getURI()))
-				return lib;					
-		}
-		return null;
-	}
-
-	/* (non-JavaDoc)
-	 * This method will read information from the CMDocument to create the tag entries. It will
-	 * check the existing items in the registry. If the corresponding tag is not
-	 * in palette manager, then it will create one, and mark the newly created
-	 * item as "expert". Otherwise, it will check whether the tld contains more
-	 * information than the palette manager, and adding those information to it
-	 * (such as description, icons for tags)
-	 * 
-	 * @param category 
-	 * @param cmdoc
-	 */
-	private static void loadFromCMDocument(TaglibPaletteDrawer category,
-			CMDocument cmdoc) {
-		
-		CMNamedNodeMap nodeMap = cmdoc.getElements();
-		for (int i = 0, size = nodeMap.getLength(); i < size; i++) {
-			CMElementDeclaration eledecl = (CMElementDeclaration) nodeMap
-					.item(i);
-			String tagName = eledecl.getElementName();
-			TagToolPaletteEntry item;
-			if (tagName.equalsIgnoreCase(IHTMLConstants.TAG_INPUT)) {//TODO:  fix this nonsense!
-				StringBuffer name = new StringBuffer(category.getURI());
-				name.append(":").append(tagName).append(":").append(tagName);
-				item = category.getTagPaletteEntryById(name.toString());
-			} else {
-				item = category.getTagPaletteEntryByTagName(tagName);
-			}
-			if (item == null) {
-				createTagEntry(category, eledecl);
-
-			}
-		}
-	}
-	
-	private static void createTagEntry(TaglibPaletteDrawer category,
-			PaletteInfo info) {
-		
-		Boolean hidden = info.getHidden();
-		if ((hidden != null) && (hidden.booleanValue()))//do not create a palette entry
-			return; 
-		
-		IMetaDataSourceModelProvider sourceProvider = ((Trait)info.eContainer().eContainer()).getSourceModelProvider();
-		String tagName = info.getTag();
-		String id = info.getId();		
-		String label = info.getDisplayLabel();
-		String desc = formatDescription(info.getDescription());		
-		ImageDescriptor smallIcon = getImageDescriptorFromString(sourceProvider, info.getSmallIcon(), DEFAULT_SMALL_ICON);
-		ImageDescriptor largeIcon = getImageDescriptorFromString(sourceProvider, info.getLargeIcon(), DEFAULT_LARGE_ICON);
-		Boolean expert = info.getExpert();
-				
-		internalCreateTagEntry(category, id, tagName, label, desc, smallIcon, largeIcon, (expert !=null && expert.booleanValue()));		
-		
-	}
-
-	private static void createTagEntry(TaglibPaletteDrawer category,
-			Entity entity) {
-		
-		boolean hidden = getBooleanTagTraitValue(entity, "hidden", false);
-		if (hidden)//do not create a palette entry
-			return; 
-		
-		String tagName = entity.getId();
-		String label = getStringTagTraitValue(entity, "display-label", tagName);
-		String desc = formatDescription(getStringTagTraitValue(entity, "description", tagName));		
-		ImageDescriptor smallIcon = getImageDescriptorFromTagTraitValueAsString(entity, "small-icon", DEFAULT_SMALL_ICON);
-		ImageDescriptor largeIcon = getImageDescriptorFromTagTraitValueAsString(entity, "large-icon", DEFAULT_LARGE_ICON);
-		boolean expert = getBooleanTagTraitValue(entity, "expert", false);
-				
-		internalCreateTagEntry(category, tagName, tagName, label, desc, smallIcon, largeIcon, expert);
-		
-	}
-
-	private static TagToolPaletteEntry internalCreateTagEntry(TaglibPaletteDrawer category, String id, String tagName, String label, String desc, ImageDescriptor smallIcon, ImageDescriptor largeIcon, boolean expert){
-		TagToolPaletteEntry item = new TagToolPaletteEntry(tagName, label, desc, smallIcon, largeIcon);
-		item.setId(id);
-		
-		item.setVisible(!expert);
-		category.getChildren().add(item);
-		item.setParent(category);
-		
-		return item;
-	}
-
-	private static boolean getBooleanTagTraitValue(Entity entity,
-			String key, boolean defaultValue) {
-		Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(entity, key);
-		if (trait != null){
-			return TraitValueHelper.getValueAsBoolean(trait);
-		}
-		return defaultValue;	
-	}
-
-	private static String getStringTagTraitValue(Entity entity, String key, String defaultValue){
-		Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(entity, key);
-		if (trait != null){
-			return TraitValueHelper.getValueAsString(trait);
-		}
-		return defaultValue;		
-	}
-
-	private static ImageDescriptor getImageDescriptorFromTagTraitValueAsString(Entity entity, String key, ImageDescriptor defaultValue){
-		Trait t = TaglibDomainMetaDataQueryHelper.getTrait(entity, key);
-		if (t != null){
-			String imgDesc = TraitValueHelper.getValueAsString(t);
-			return getImageDescriptorFromString(t.getSourceModelProvider(), imgDesc, defaultValue);
-		}
-		return defaultValue;
-	}
-	
-	private static ImageDescriptor getImageDescriptorFromString(IMetaDataSourceModelProvider sourceModelProvider,  String imgDesc, ImageDescriptor defaultValue){
-		ImageDescriptor image = defaultValue;
-		IImageDescriptorProvider imageProvider = (IImageDescriptorProvider)sourceModelProvider.getAdapter(IImageDescriptorProvider.class);			
-		if (imageProvider != null){
-			image = imageProvider.getImageDescriptor(imgDesc);
-		}
-		return image;
-	}
-	
-	private static void createTagEntry(TaglibPaletteDrawer category,
-			CMElementDeclaration eledecl) {
-		
-		String tagName = eledecl.getElementName();
-		String label = null;
-		String desc = null;
-
-		if (eledecl instanceof TLDElementDeclaration){
-			TLDElementDeclaration tag = (TLDElementDeclaration)eledecl;			
-			label = tag.getDisplayName();			
-			desc = tag.getDescription();						
-		}
-		
-		if (label == null || label.equals(""))
-			label = tagName;
-		
-		if (desc == null )
-			desc = "";
-		else
-			desc = formatDescription(desc);
-		
-		TagToolPaletteEntry item = internalCreateTagEntry(category, tagName, tagName, label, desc, getDefaultSmallIcon(), getDefaultLargeIcon(), false);
-		item.setToolProperty("CMElementDeclaration", eledecl);
-		
-	}
-	
-	/**
-	 * @return DEFAULT_LARGE_ICON
-	 */
-	private static ImageDescriptor getDefaultLargeIcon() {
-		return DEFAULT_LARGE_ICON;
-	}
-
-	/**
-	 * @return DEFAULT_SMALL_ICON
-	 */
-	private static ImageDescriptor getDefaultSmallIcon() {
-		return DEFAULT_SMALL_ICON;
-	}
-	
-	private static String formatDescription(final String desc) {
-		//TODO: modify and use a formatter in the future?
-		String aDesc = filterConvertString(desc);
-		if (aDesc != null){
-			if (aDesc.length() > DESCRIPTION_TRUNCATE_HARD_LENGTH) {
-				StringBuffer result = new StringBuffer(aDesc.substring(0, DESCRIPTION_TRUNCATE_HARD_LENGTH));
-				result.append("...");
-				return result.toString();
-			}
-			return aDesc;
-
-		}
-		return "";
-	}
-	
-	private static String filterConvertString(String text) {
-		if (text == null) {
-			return "";
-		}
-         
-		String result = removeHTMLTags.matcher(text).replaceAll("");
-		result = removeNewLines.matcher(result).replaceAll(" ");
-        result = trimInteriorWhitespace.matcher(result).replaceAll(" ");        
-
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteItemManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteItemManager.java
deleted file mode 100644
index bf2fe03..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteItemManager.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.pagedesigner.editors.palette.impl;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.CMDocumentFactoryTLD;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.taglib.ITaglibRecord;
-import org.eclipse.jst.jsp.core.taglib.TaglibIndex;
-import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteCustomizationsHelper;
-import org.eclipse.jst.pagedesigner.editors.palette.IEntryChangeListener;
-import org.eclipse.jst.pagedesigner.editors.palette.IPaletteConstants;
-import org.eclipse.jst.pagedesigner.editors.palette.IPaletteItemManager;
-import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocumentFactory;
-import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
-
-/**
- * TODO: C.B.: parts of this class need a re-write.  This is very complex.
- *  
- * @author mengbo
- */
-public class PaletteItemManager implements IPaletteItemManager,
-		IPaletteConstants {
-	
-	private static Map _managers = new HashMap();
-	private List _categories = new ArrayList();
-	
-	// if _curProject is null, then is the default manager.
-	private IProject _curProject = null;
-	private IEntryChangeListener[] _listeners;
-
-	// the default manager is for those _curProject == null
-	private static PaletteItemManager _defaultManager = null;
-	private static PaletteItemManager _currentInstance;
-
-
-	/**
-	 * Return singleton paletteItemManager for a given project
-	 * @param project
-	 * @return PaletteItemManager
-	 */
-	public static synchronized PaletteItemManager getInstance(IProject project) {
-		if (project == null) {
-			// sometimes when the editor is editing a file in jar file, may not
-			// be able to
-			// get the project.
-			return getDefaultPaletteItemManager();
-		}
-		PaletteItemManager manager = (PaletteItemManager) _managers
-				.get(project);
-		if (manager == null) {
-			manager = new PaletteItemManager(project);
-			_managers.put(project, manager);
-		}
-		_currentInstance = manager;
-		
-		return manager;
-	}
-	
-	/**
-	 * @return current PaletteItemManager instance.  May return null
-	 */
-	public static synchronized PaletteItemManager getCurrentInstance(){
-		return _currentInstance != null ? _currentInstance : null;
-	}
-
-	private IProject getCurProject() {
-		return _curProject;
-	}
-
-	/**
-	 * Removes an intstance of a paletteItemManager from the system
-	 * @param manager
-	 */
-	public static synchronized void removePaletteItemManager(
-			PaletteItemManager manager) {
-		// FIXME: does nothing? manager.dispose();
-		_managers.remove(manager.getCurProject());
-	}
-
-
-	/**
-	 * 
-	 */
-	public static synchronized void clearPaletteItemManager() {
-		_managers.clear();
-	}
-
-	/**
-	 * @return
-	 */
-	private static PaletteItemManager getDefaultPaletteItemManager() {
-		if (_defaultManager == null) {
-			_defaultManager = new PaletteItemManager(null);
-			
-		}
-		return _defaultManager;
-	}
-
-	/**
-	 * 
-	 */
-	private PaletteItemManager(IProject project) {
-		_curProject = project;
-
-		init();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.pagedesigner.editors.palette.IPaletteItemManager#getAllCategories()
-	 */
-	public List getAllCategories() {
-		if (_categories == null) {
-			_categories = new ArrayList();
-		}
-		return _categories;
-	}
-
-	/**
-	 * Initializes the palette items for the current project
-	 */
-	protected synchronized void init() {
-		getAllCategories().clear();
-		initFromProject(_curProject);
-
-		DesignerPaletteCustomizationsHelper.loadUserCustomizations(this);
-		
-		sortCategories();
-		
-	}
-
-	private void sortCategories() {
-		//note that once we store ordering customizations, we will need to do something different
-		Collections.sort(getAllCategories(), new Comparator(){
-
-			public int compare(Object o1, Object o2) {
-				String label1 = ((PaletteEntry)o1).getLabel();
-				String label2 = ((PaletteEntry)o2).getLabel();
-				
-				return label1.compareTo(label2);
-			}
-			
-		});
-
-	}
-
-	/**
-	 * Reinitializes the palatteItemManager and informs all palette roots that use the manager to refresh
-	 */
-	public void reset() {
-		init();
-		fireModelChanged(null, null);
-	}
-
-	private void initFromProject(IProject project) {
-		registerHTMLCategory();
-		registerJSPCategory();
-		registerTldFromClasspath(project);
-	}
-
-	private void registerHTMLCategory() {
-		PaletteHelper.configPaletteItemsByTLD(this, getCurProject(), HTMLCMDocumentFactory
-				.getCMDocument(CMDocType.HTML_DOC_TYPE));
-	}
-
-	private void registerJSPCategory() {
-		PaletteHelper.configPaletteItemsByTLD(this, getCurProject(), HTMLCMDocumentFactory
-				.getCMDocument(CMDocType.JSP11_DOC_TYPE));		
-	}
-
-	/**
-	 * Search Classpath entry list to find if the entry is jar libraray and the
-	 * libray have the tld descriptor, if have ,build a palette category mapping
-	 * the tld descriptor.
-	 * 
-	 * @param project
-	 */
-	private void registerTldFromClasspath(IProject project) {
-		ITaglibRecord[] tldrecs = TaglibIndex.getAvailableTaglibRecords(project.getFullPath());
-		CMDocumentFactoryTLD factory = new CMDocumentFactoryTLD();
-		for (int i=0;i<tldrecs.length;i++){
-			TLDDocument doc = (TLDDocument)factory.createCMDocument(tldrecs[i]);
-			PaletteHelper.configPaletteItemsByTLD(this, getCurProject(), doc);			
-		}
-		
-	}
-
-	/**
-	 * @param id (most likely the uri)
-	 * @param label 
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer findOrCreateCategory(String id, String label) {
-		TaglibPaletteDrawer category;
-		for (Iterator iter = getAllCategories().iterator(); iter.hasNext();) {
-			category = (TaglibPaletteDrawer) iter.next();
-			if (id.equals(category.getId())) {
-				return category;
-			}
-		}
-		category = createTaglibPaletteDrawer(id, label);
-		return category;
-	}
-
-	/**
-	 * @param uri
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer findCategoryByURI(String uri) {
-		TaglibPaletteDrawer category;
-		for (Iterator iter = getAllCategories().iterator(); iter.hasNext();) {
-			category = (TaglibPaletteDrawer) iter.next();
-			if (uri.equals(category.getURI())) {
-				return category;
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.pagedesigner.editors.palette.IPaletteItemManager#createCategory(java.lang.String)
-	 */
-	public TaglibPaletteDrawer createTaglibPaletteDrawer(String uri, String label) {
-		TaglibPaletteDrawer r = new TaglibPaletteDrawer(uri, label);
-		getAllCategories().add(r);
-		return r;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.pagedesigner.editors.palette.IPaletteItemManager#getCategoryByURI(java.lang.String)
-	 */
-	public TaglibPaletteDrawer getTaglibPalletteDrawer(String uri) {
-		for (Iterator iter = getAllCategories().iterator(); iter.hasNext();) {
-			TaglibPaletteDrawer cat = (TaglibPaletteDrawer) iter.next();
-			if (uri.equals(cat.getId())) {
-				return cat;
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.pagedesigner.editors.palette.IPaletteItemManager#addEntryChangeListener(com.sybase.stf.jmt.pagedesigner.editors.palette.IEntryChangeListener)
-	 */
-	public void addEntryChangeListener(IEntryChangeListener listener) {
-
-		if (_listeners == null) {
-			_listeners = new IEntryChangeListener[] { listener };
-		} else {
-			IEntryChangeListener[] newListeners = new IEntryChangeListener[_listeners.length + 1];
-			newListeners[0] = listener;
-			System.arraycopy(_listeners, 0, newListeners, 1, _listeners.length);
-			_listeners = newListeners;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.pagedesigner.editors.palette.IPaletteItemManager#removeEntryChangeListener(com.sybase.stf.jmt.pagedesigner.editors.palette.IEntryChangeListener)
-	 */
-	public void removeEntryChangeListener(IEntryChangeListener listener) {
-		if (_listeners == null) {
-			return;
-		}
-		if (_listeners.length == 1) {
-			_listeners = null;
-		} else {
-			List newListenersList = new ArrayList(Arrays.asList(_listeners));
-			newListenersList.remove(listener);
-			IEntryChangeListener[] newListeners = new IEntryChangeListener[newListenersList
-					.size() - 1];
-			newListeners = (IEntryChangeListener[]) newListenersList
-					.toArray(newListeners);
-			_listeners = newListeners;
-		}
-	}
-
-	/**
-	 * Notify model change event
-	 * 
-	 * @param oldDefinitions
-	 * @param newDefinitions
-	 */
-	private void fireModelChanged(List oldDefinitions, List newDefinitions) {
-		if (_listeners == null) {
-			return;
-		}
-		for (int i = 0; i < _listeners.length; i++) {
-			_listeners[i].modelChanged(oldDefinitions, newDefinitions);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.IPaletteItemManager#getProject()
-	 */
-	public IProject getProject() {
-		return getCurProject();
-	}
-	
-	/**
-	 * Informs all paletteItemManagers, except the notifying paletteManager, of updates to the customizations
-	 * All palette viewer roots will be notifed of possible updates
-	 * @param notifyingManager 
-	 */
-	public static void notifyPaletteItemManagersOfCustomizationsUpdate(IPaletteItemManager notifyingManager){
-		for (Iterator it=_managers.values().iterator();it.hasNext();){
-			PaletteItemManager mgr = (PaletteItemManager)it.next();
-			if (mgr != null && notifyingManager != mgr)
-				mgr.reset();
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/TaglibPaletteDrawer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/TaglibPaletteDrawer.java
deleted file mode 100644
index 5f7ba74..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/TaglibPaletteDrawer.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette.impl;
-
-import java.util.Iterator;
-
-import org.eclipse.gef.palette.PaletteDrawer;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-
-/**
- * Palette Drawer for Tag lib items
- *
- */
-public class TaglibPaletteDrawer extends PaletteDrawer {
-	private String prefix;	
-
-	/**
-	 * Constructor
-	 * @param uri
-	 * @param label
-	 */
-	public TaglibPaletteDrawer(String uri, String label) {
-		super(label);
-		super.setId(uri);
-		setDrawerType(ToolEntry.PALETTE_TYPE_TOOL);
-	}
-	
-	/**
-	 * @return default prefix for tag during creation
-	 */
-	public String getDefaultPrefix() {
-		return prefix;
-	}
-
-	/**
-	 * Set the default prefix for use during item creation
-	 * @param prefix
-	 */
-	public void setDefaultPrefix(String prefix) {
-		this.prefix = prefix;
-	}
-
-	/**
-	 * @return uri identifying the library of tags
-	 */
-	public String getURI(){
-		return getId();
-	}
-	
-	/**
-	 * @param uri for the libary of tags
-	 */
-	public void setURI(String uri){
-		setId(uri);
-	}
-	
-	/**
-	 * @param id
-	 * @return TagToolPaletteEntry for the tag using the id
-	 */
-	public TagToolPaletteEntry getTagPaletteEntryById(String id){
-		for (Iterator it=getChildren().iterator();it.hasNext();){
-			TagToolPaletteEntry tag = (TagToolPaletteEntry)it.next();
-			if (tag.getId().equals(id))
-				return tag;
-		}
-		return null;
-	}
-	
-	/**
-	 * @param tagName
-	 * @return TagToolPaletteEntry using the tag name
-	 */
-	public TagToolPaletteEntry getTagPaletteEntryByTagName(String tagName){
-		for (Iterator it=getChildren().iterator();it.hasNext();){
-			TagToolPaletteEntry tag = (TagToolPaletteEntry)it.next();
-			if (tag.getTagName().equalsIgnoreCase(tagName))
-				return tag;
-		}
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.palette.PaletteDrawer#acceptsType(java.lang.Object)
-	 */
-	public boolean acceptsType(Object object){
-			return true;
-	}
-	
-	/**
-	 * @return PERMISSION_HIDE_ONLY
-	 * @see org.eclipse.gef.palette.PaletteEntry#getUserModificationPermission()
-	 */
-	public int getUserModificationPermission() {
-		return PERMISSION_HIDE_ONLY;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/internal/metadata/HTMLContentModelMetaDataTranslator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/internal/metadata/HTMLContentModelMetaDataTranslator.java
deleted file mode 100644
index 2c24cec..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/internal/metadata/HTMLContentModelMetaDataTranslator.java
+++ /dev/null
@@ -1,50 +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.editors.palette.internal.metadata;
-
-import org.eclipse.jst.jsf.common.metadata.internal.AbstractTagLibDomainContentModelMetaDataTranslator;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataTranslator;
-import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-
-/**
- * Translates the HTML CMDocument to standard metadata model entities and traits
- */
-public class HTMLContentModelMetaDataTranslator extends AbstractTagLibDomainContentModelMetaDataTranslator implements IMetaDataTranslator {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataTranslator#translate(org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant)
-	 */
-	public void translate(final IMetaDataModelMergeAssistant assistant) {
-		_assistant = assistant;
-		CMDocument doc = getSourceModel();
-		if (doc!= null && doc instanceof HTMLCMDocument){
-			doTranslate(doc);			
-		}
-	}
-
-	/**
-	 *  @return getURIDisplayLabel()
-	 */
-	protected String getURIDescription() {
-		return getURIDisplayLabel();
-	}
-
-	/**
-	 * return "HTML 4.0"
-	 */
-	protected String getURIDisplayLabel() {
-		return "HTML 4.0";
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/PaletteInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/PaletteInfo.java
deleted file mode 100644
index c65cdeb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/PaletteInfo.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.editors.palette.paletteinfos;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Palette Info</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getTag <em>Tag</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getDisplayLabel <em>Display Label</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getExpert <em>Expert</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getHidden <em>Hidden</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getSmallIcon <em>Small Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getLargeIcon <em>Large Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getTagCreation <em>Tag Creation</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage#getPaletteInfo()
- * @model
- * @generated
- */
-public interface PaletteInfo extends EObject {
-	public static final String TRAIT_ID				= "paletteInfo";
-	public static final String TRAIT_DISPLAY_LABEL 	= "display-label";
-	public static final String TRAIT_DESCRIPTION 	= "description";
-	public static final String TRAIT_IS_EXPERT 		= "expert";
-	public static final String TRAIT_IS_HIDDEN 		= "hidden";
-	public static final String TRAIT_SMALL_ICON 	= "small-icon";
-	public static final String TRAIT_LARGE_ICON 	= "large-icon";
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage#getPaletteInfo_Id()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Tag</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Tag</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Tag</em>' attribute.
-	 * @see #setTag(String)
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage#getPaletteInfo_Tag()
-	 * @model
-	 * @generated
-	 */
-	String getTag();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getTag <em>Tag</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Tag</em>' attribute.
-	 * @see #getTag()
-	 * @generated
-	 */
-	void setTag(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Display Label</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Label</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Label</em>' attribute.
-	 * @see #setDisplayLabel(String)
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage#getPaletteInfo_DisplayLabel()
-	 * @model extendedMetaData="kind='element' name='display-label'"
-	 * @generated
-	 */
-	String getDisplayLabel();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getDisplayLabel <em>Display Label</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Display Label</em>' attribute.
-	 * @see #getDisplayLabel()
-	 * @generated
-	 */
-	void setDisplayLabel(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' attribute.
-	 * @see #setDescription(String)
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage#getPaletteInfo_Description()
-	 * @model extendedMetaData="kind='element'"
-	 * @generated
-	 */
-	String getDescription();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getDescription <em>Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Description</em>' attribute.
-	 * @see #getDescription()
-	 * @generated
-	 */
-	void setDescription(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Expert</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Expert</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Expert</em>' attribute.
-	 * @see #setExpert(Boolean)
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage#getPaletteInfo_Expert()
-	 * @model extendedMetaData="kind='element'"
-	 * @generated
-	 */
-	Boolean getExpert();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getExpert <em>Expert</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Expert</em>' attribute.
-	 * @see #getExpert()
-	 * @generated
-	 */
-	void setExpert(Boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Hidden</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Hidden</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Hidden</em>' attribute.
-	 * @see #setHidden(Boolean)
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage#getPaletteInfo_Hidden()
-	 * @model extendedMetaData="kind='element'"
-	 * @generated
-	 */
-	Boolean getHidden();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getHidden <em>Hidden</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Hidden</em>' attribute.
-	 * @see #getHidden()
-	 * @generated
-	 */
-	void setHidden(Boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Small Icon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Small Icon</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Small Icon</em>' attribute.
-	 * @see #setSmallIcon(String)
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage#getPaletteInfo_SmallIcon()
-	 * @model extendedMetaData="kind='element' name='small-icon'"
-	 * @generated
-	 */
-	String getSmallIcon();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getSmallIcon <em>Small Icon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Small Icon</em>' attribute.
-	 * @see #getSmallIcon()
-	 * @generated
-	 */
-	void setSmallIcon(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Large Icon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Large Icon</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Large Icon</em>' attribute.
-	 * @see #setLargeIcon(String)
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage#getPaletteInfo_LargeIcon()
-	 * @model extendedMetaData="kind='element' name='large-icon'"
-	 * @generated
-	 */
-	String getLargeIcon();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getLargeIcon <em>Large Icon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Large Icon</em>' attribute.
-	 * @see #getLargeIcon()
-	 * @generated
-	 */
-	void setLargeIcon(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Tag Creation</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Tag Creation</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Tag Creation</em>' reference.
-	 * @see #setTagCreation(TagCreationInfo)
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage#getPaletteInfo_TagCreation()
-	 * @model extendedMetaData="kind='element' name='tag-create'"
-	 * @generated
-	 */
-	TagCreationInfo getTagCreation();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getTagCreation <em>Tag Creation</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Tag Creation</em>' reference.
-	 * @see #getTagCreation()
-	 * @generated
-	 */
-	void setTagCreation(TagCreationInfo value);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model kind="operation"
-	 * @generated
-	 */
-	boolean isExpert();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model kind="operation"
-	 * @generated
-	 */
-	boolean isHidden();
-
-} // PaletteInfo
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/PaletteInfos.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/PaletteInfos.java
deleted file mode 100644
index 684a78d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/PaletteInfos.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.editors.palette.paletteinfos;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Palette Infos</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfos#getInfos <em>Infos</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage#getPaletteInfos()
- * @model
- * @generated
- */
-public interface PaletteInfos extends EObject {
-	public static final String TRAIT_ID				= "paletteInfos";
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Infos</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Infos</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>Infos</em>' containment reference list.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage#getPaletteInfos_Infos()
-	 * @model type="org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.provisional.PaletteInfo" containment="true"
-	 *        extendedMetaData="kind='element' name='item'"
-	 * @generated
-	 */
-	EList getInfos();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model idRequired="true"
-	 * @generated
-	 */
-	PaletteInfo findPaletteInfoById(String id);
-
-} // PaletteInfos
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/PaletteInfosFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/PaletteInfosFactory.java
deleted file mode 100644
index 53d1c87..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/PaletteInfosFactory.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.editors.palette.paletteinfos;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage
- * @generated
- */
-public interface PaletteInfosFactory extends EFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	PaletteInfosFactory eINSTANCE = org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfosFactoryImpl.init();
-
-	/**
-	 * Returns a new object of class '<em>Palette Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Palette Info</em>'.
-	 * @generated
-	 */
-	PaletteInfo createPaletteInfo();
-
-	/**
-	 * Returns a new object of class '<em>Tag Creation Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Tag Creation Info</em>'.
-	 * @generated
-	 */
-	TagCreationInfo createTagCreationInfo();
-
-	/**
-	 * Returns a new object of class '<em>Tag Creation Template</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Tag Creation Template</em>'.
-	 * @generated
-	 */
-	TagCreationTemplate createTagCreationTemplate();
-
-	/**
-	 * Returns a new object of class '<em>Tag Creation Attribute</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Tag Creation Attribute</em>'.
-	 * @generated
-	 */
-	TagCreationAttribute createTagCreationAttribute();
-
-	/**
-	 * Returns a new object of class '<em>Palette Infos</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Palette Infos</em>'.
-	 * @generated
-	 */
-	PaletteInfos createPaletteInfos();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	PaletteInfosPackage getPaletteInfosPackage();
-
-} //PaletteInfosFactory
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/PaletteInfosPackage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/PaletteInfosPackage.java
deleted file mode 100644
index ec8258d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/PaletteInfosPackage.java
+++ /dev/null
@@ -1,710 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.editors.palette.paletteinfos;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosFactory
- * @model kind="package"
- * @generated
- */
-public interface PaletteInfosPackage extends EPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "paletteinfos";
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore";
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "pi";
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	PaletteInfosPackage eINSTANCE = org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfosPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfoImpl <em>Palette Info</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfoImpl
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfosPackageImpl#getPaletteInfo()
-	 * @generated
-	 */
-	int PALETTE_INFO = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfosImpl <em>Palette Infos</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfosImpl
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfosPackageImpl#getPaletteInfos()
-	 * @generated
-	 */
-	int PALETTE_INFOS = 0;
-
-	/**
-	 * The feature id for the '<em><b>Infos</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFOS__INFOS = 0;
-
-	/**
-	 * The number of structural features of the '<em>Palette Infos</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFOS_FEATURE_COUNT = 1;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFO__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Tag</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFO__TAG = 1;
-
-	/**
-	 * The feature id for the '<em><b>Display Label</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFO__DISPLAY_LABEL = 2;
-
-	/**
-	 * The feature id for the '<em><b>Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFO__DESCRIPTION = 3;
-
-	/**
-	 * The feature id for the '<em><b>Expert</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFO__EXPERT = 4;
-
-	/**
-	 * The feature id for the '<em><b>Hidden</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFO__HIDDEN = 5;
-
-	/**
-	 * The feature id for the '<em><b>Small Icon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFO__SMALL_ICON = 6;
-
-	/**
-	 * The feature id for the '<em><b>Large Icon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFO__LARGE_ICON = 7;
-
-	/**
-	 * The feature id for the '<em><b>Tag Creation</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFO__TAG_CREATION = 8;
-
-	/**
-	 * The number of structural features of the '<em>Palette Info</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PALETTE_INFO_FEATURE_COUNT = 9;
-
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.TagCreationInfoImpl <em>Tag Creation Info</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.TagCreationInfoImpl
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfosPackageImpl#getTagCreationInfo()
-	 * @generated
-	 */
-	int TAG_CREATION_INFO = 2;
-
-	/**
-	 * The feature id for the '<em><b>Attributes</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CREATION_INFO__ATTRIBUTES = 0;
-
-	/**
-	 * The feature id for the '<em><b>Template</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CREATION_INFO__TEMPLATE = 1;
-
-	/**
-	 * The number of structural features of the '<em>Tag Creation Info</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CREATION_INFO_FEATURE_COUNT = 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.TagCreationTemplateImpl <em>Tag Creation Template</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.TagCreationTemplateImpl
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfosPackageImpl#getTagCreationTemplate()
-	 * @generated
-	 */
-	int TAG_CREATION_TEMPLATE = 3;
-
-	/**
-	 * The feature id for the '<em><b>Template</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CREATION_TEMPLATE__TEMPLATE = 0;
-
-	/**
-	 * The number of structural features of the '<em>Tag Creation Template</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CREATION_TEMPLATE_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.TagCreationAttributeImpl <em>Tag Creation Attribute</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.TagCreationAttributeImpl
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfosPackageImpl#getTagCreationAttribute()
-	 * @generated
-	 */
-	int TAG_CREATION_ATTRIBUTE = 4;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CREATION_ATTRIBUTE__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CREATION_ATTRIBUTE__VALUE = 1;
-
-	/**
-	 * The number of structural features of the '<em>Tag Creation Attribute</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CREATION_ATTRIBUTE_FEATURE_COUNT = 2;
-
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo <em>Palette Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Palette Info</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo
-	 * @generated
-	 */
-	EClass getPaletteInfo();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getId()
-	 * @see #getPaletteInfo()
-	 * @generated
-	 */
-	EAttribute getPaletteInfo_Id();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getTag <em>Tag</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Tag</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getTag()
-	 * @see #getPaletteInfo()
-	 * @generated
-	 */
-	EAttribute getPaletteInfo_Tag();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getDisplayLabel <em>Display Label</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Display Label</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getDisplayLabel()
-	 * @see #getPaletteInfo()
-	 * @generated
-	 */
-	EAttribute getPaletteInfo_DisplayLabel();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Description</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getDescription()
-	 * @see #getPaletteInfo()
-	 * @generated
-	 */
-	EAttribute getPaletteInfo_Description();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getExpert <em>Expert</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Expert</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getExpert()
-	 * @see #getPaletteInfo()
-	 * @generated
-	 */
-	EAttribute getPaletteInfo_Expert();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getHidden <em>Hidden</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Hidden</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getHidden()
-	 * @see #getPaletteInfo()
-	 * @generated
-	 */
-	EAttribute getPaletteInfo_Hidden();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getSmallIcon <em>Small Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Small Icon</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getSmallIcon()
-	 * @see #getPaletteInfo()
-	 * @generated
-	 */
-	EAttribute getPaletteInfo_SmallIcon();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getLargeIcon <em>Large Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Large Icon</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getLargeIcon()
-	 * @see #getPaletteInfo()
-	 * @generated
-	 */
-	EAttribute getPaletteInfo_LargeIcon();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getTagCreation <em>Tag Creation</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Tag Creation</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo#getTagCreation()
-	 * @see #getPaletteInfo()
-	 * @generated
-	 */
-	EReference getPaletteInfo_TagCreation();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationInfo <em>Tag Creation Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Tag Creation Info</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationInfo
-	 * @generated
-	 */
-	EClass getTagCreationInfo();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationInfo#getTemplate <em>Template</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Template</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationInfo#getTemplate()
-	 * @see #getTagCreationInfo()
-	 * @generated
-	 */
-	EAttribute getTagCreationInfo_Template();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationInfo#getAttributes <em>Attributes</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Attributes</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationInfo#getAttributes()
-	 * @see #getTagCreationInfo()
-	 * @generated
-	 */
-	EReference getTagCreationInfo_Attributes();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationTemplate <em>Tag Creation Template</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Tag Creation Template</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationTemplate
-	 * @generated
-	 */
-	EClass getTagCreationTemplate();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationTemplate#getTemplate <em>Template</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Template</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationTemplate#getTemplate()
-	 * @see #getTagCreationTemplate()
-	 * @generated
-	 */
-	EReference getTagCreationTemplate_Template();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationAttribute <em>Tag Creation Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Tag Creation Attribute</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationAttribute
-	 * @generated
-	 */
-	EClass getTagCreationAttribute();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationAttribute#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationAttribute#getId()
-	 * @see #getTagCreationAttribute()
-	 * @generated
-	 */
-	EAttribute getTagCreationAttribute_Id();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationAttribute#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationAttribute#getValue()
-	 * @see #getTagCreationAttribute()
-	 * @generated
-	 */
-	EAttribute getTagCreationAttribute_Value();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfos <em>Palette Infos</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Palette Infos</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfos
-	 * @generated
-	 */
-	EClass getPaletteInfos();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfos#getInfos <em>Infos</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Infos</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfos#getInfos()
-	 * @see #getPaletteInfos()
-	 * @generated
-	 */
-	EReference getPaletteInfos_Infos();
-
-	/**
-	 * Returns the factory that creates the instances of the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	PaletteInfosFactory getPaletteInfosFactory();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Defines literals for the meta objects that represent
-	 * <ul>
-	 *   <li>each class,</li>
-	 *   <li>each feature of each class,</li>
-	 *   <li>each enum,</li>
-	 *   <li>and each data type</li>
-	 * </ul>
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	interface Literals {
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfoImpl <em>Palette Info</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfoImpl
-		 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfosPackageImpl#getPaletteInfo()
-		 * @generated
-		 */
-		EClass PALETTE_INFO = eINSTANCE.getPaletteInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PALETTE_INFO__ID = eINSTANCE.getPaletteInfo_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Tag</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PALETTE_INFO__TAG = eINSTANCE.getPaletteInfo_Tag();
-
-		/**
-		 * The meta object literal for the '<em><b>Display Label</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PALETTE_INFO__DISPLAY_LABEL = eINSTANCE.getPaletteInfo_DisplayLabel();
-
-		/**
-		 * The meta object literal for the '<em><b>Description</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PALETTE_INFO__DESCRIPTION = eINSTANCE.getPaletteInfo_Description();
-
-		/**
-		 * The meta object literal for the '<em><b>Expert</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PALETTE_INFO__EXPERT = eINSTANCE.getPaletteInfo_Expert();
-
-		/**
-		 * The meta object literal for the '<em><b>Hidden</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PALETTE_INFO__HIDDEN = eINSTANCE.getPaletteInfo_Hidden();
-
-		/**
-		 * The meta object literal for the '<em><b>Small Icon</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PALETTE_INFO__SMALL_ICON = eINSTANCE.getPaletteInfo_SmallIcon();
-
-		/**
-		 * The meta object literal for the '<em><b>Large Icon</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PALETTE_INFO__LARGE_ICON = eINSTANCE.getPaletteInfo_LargeIcon();
-
-		/**
-		 * The meta object literal for the '<em><b>Tag Creation</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PALETTE_INFO__TAG_CREATION = eINSTANCE.getPaletteInfo_TagCreation();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.TagCreationInfoImpl <em>Tag Creation Info</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.TagCreationInfoImpl
-		 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfosPackageImpl#getTagCreationInfo()
-		 * @generated
-		 */
-		EClass TAG_CREATION_INFO = eINSTANCE.getTagCreationInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Template</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_CREATION_INFO__TEMPLATE = eINSTANCE.getTagCreationInfo_Template();
-
-		/**
-		 * The meta object literal for the '<em><b>Attributes</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TAG_CREATION_INFO__ATTRIBUTES = eINSTANCE.getTagCreationInfo_Attributes();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.TagCreationTemplateImpl <em>Tag Creation Template</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.TagCreationTemplateImpl
-		 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfosPackageImpl#getTagCreationTemplate()
-		 * @generated
-		 */
-		EClass TAG_CREATION_TEMPLATE = eINSTANCE.getTagCreationTemplate();
-
-		/**
-		 * The meta object literal for the '<em><b>Template</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TAG_CREATION_TEMPLATE__TEMPLATE = eINSTANCE.getTagCreationTemplate_Template();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.TagCreationAttributeImpl <em>Tag Creation Attribute</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.TagCreationAttributeImpl
-		 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfosPackageImpl#getTagCreationAttribute()
-		 * @generated
-		 */
-		EClass TAG_CREATION_ATTRIBUTE = eINSTANCE.getTagCreationAttribute();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_CREATION_ATTRIBUTE__ID = eINSTANCE.getTagCreationAttribute_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_CREATION_ATTRIBUTE__VALUE = eINSTANCE.getTagCreationAttribute_Value();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfosImpl <em>Palette Infos</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfosImpl
-		 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfosPackageImpl#getPaletteInfos()
-		 * @generated
-		 */
-		EClass PALETTE_INFOS = eINSTANCE.getPaletteInfos();
-
-		/**
-		 * The meta object literal for the '<em><b>Infos</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PALETTE_INFOS__INFOS = eINSTANCE.getPaletteInfos_Infos();
-
-	}
-
-} //PaletteInfosPackage
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/TagCreationAttribute.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/TagCreationAttribute.java
deleted file mode 100644
index 40f6358..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/TagCreationAttribute.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.editors.palette.paletteinfos;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag Creation Attribute</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationAttribute#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationAttribute#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage#getTagCreationAttribute()
- * @model
- * @generated
- */
-public interface TagCreationAttribute extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage#getTagCreationAttribute_Id()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationAttribute#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value</em>' attribute.
-	 * @see #setValue(String)
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage#getTagCreationAttribute_Value()
-	 * @model
-	 * @generated
-	 */
-	String getValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationAttribute#getValue <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' attribute.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(String value);
-
-} // TagCreationAttribute
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/TagCreationInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/TagCreationInfo.java
deleted file mode 100644
index 5ce6f92..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/TagCreationInfo.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.editors.palette.paletteinfos;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag Creation Info</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationInfo#getAttributes <em>Attributes</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationInfo#getTemplate <em>Template</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage#getTagCreationInfo()
- * @model
- * @generated
- */
-public interface TagCreationInfo extends EObject {
-	public static final String TRAIT_ID = "tag-create";
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Template</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Template</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Template</em>' attribute.
-	 * @see #setTemplate(Object)
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage#getTagCreationInfo_Template()
-	 * @model dataType="org.eclipse.emf.ecore.xml.type.AnySimpleType"
-	 * @generated
-	 */
-	Object getTemplate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationInfo#getTemplate <em>Template</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Template</em>' attribute.
-	 * @see #getTemplate()
-	 * @generated
-	 */
-	void setTemplate(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Attributes</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationAttribute}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attributes</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attributes</em>' containment reference list.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage#getTagCreationInfo_Attributes()
-	 * @model type="org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.provisional.TagCreationAttribute" containment="true"
-	 *        extendedMetaData="kind='element' name='attribute'"
-	 * @generated
-	 */
-	EList getAttributes();
-
-} // TagCreationInfo
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/TagCreationTemplate.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/TagCreationTemplate.java
deleted file mode 100644
index c3ab285..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/TagCreationTemplate.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.editors.palette.paletteinfos;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag Creation Template</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationTemplate#getTemplate <em>Template</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage#getTagCreationTemplate()
- * @model
- * @generated
- */
-public interface TagCreationTemplate extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Template</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Template</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Template</em>' containment reference.
-	 * @see #setTemplate(EObject)
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage#getTagCreationTemplate_Template()
-	 * @model containment="true"
-	 * @generated
-	 */
-	EObject getTemplate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationTemplate#getTemplate <em>Template</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Template</em>' containment reference.
-	 * @see #getTemplate()
-	 * @generated
-	 */
-	void setTemplate(EObject value);
-
-} // TagCreationTemplate
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfoImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfoImpl.java
deleted file mode 100644
index 37f4f93..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfoImpl.java
+++ /dev/null
@@ -1,729 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: PaletteInfoImpl.java,v 1.5 2007/04/16 19:55:08 itrimble Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl;
-
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Palette Info</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfoImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfoImpl#getTag <em>Tag</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfoImpl#getDisplayLabel <em>Display Label</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfoImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfoImpl#getExpert <em>Expert</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfoImpl#getHidden <em>Hidden</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfoImpl#getSmallIcon <em>Small Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfoImpl#getLargeIcon <em>Large Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfoImpl#getTagCreation <em>Tag Creation</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PaletteInfoImpl extends EObjectImpl implements PaletteInfo {	
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getTag() <em>Tag</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTag()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TAG_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTag() <em>Tag</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTag()
-	 * @generated
-	 * @ordered
-	 */
-	protected String tag = TAG_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getDisplayLabel() <em>Display Label</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayLabel()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String DISPLAY_LABEL_EDEFAULT = null;
-
-
-
-	/**
-	 * The cached value of the '{@link #getDisplayLabel() <em>Display Label</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayLabel()
-	 * @generated
-	 * @ordered
-	 */
-	protected String displayLabel = DISPLAY_LABEL_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getDescription() <em>Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String DESCRIPTION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected String description = DESCRIPTION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getExpert() <em>Expert</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExpert()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Boolean EXPERT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getExpert() <em>Expert</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExpert()
-	 * @generated
-	 * @ordered
-	 */
-	protected Boolean expert = EXPERT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getHidden() <em>Hidden</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHidden()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Boolean HIDDEN_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getHidden() <em>Hidden</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHidden()
-	 * @generated
-	 * @ordered
-	 */
-	protected Boolean hidden = HIDDEN_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getSmallIcon() <em>Small Icon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSmallIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SMALL_ICON_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getSmallIcon() <em>Small Icon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSmallIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected String smallIcon = SMALL_ICON_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getLargeIcon() <em>Large Icon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLargeIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String LARGE_ICON_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getLargeIcon() <em>Large Icon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLargeIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected String largeIcon = LARGE_ICON_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getTagCreation() <em>Tag Creation</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTagCreation()
-	 * @generated
-	 * @ordered
-	 */
-	protected TagCreationInfo tagCreation = null;
-
-	private Entity _tag;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PaletteInfoImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PaletteInfosPackage.Literals.PALETTE_INFO;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.PALETTE_INFO__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getTag() {
-		return tag != null ? tag : getId();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTag(String newTag) {
-		String oldTag = tag;
-		tag = newTag;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.PALETTE_INFO__TAG, oldTag, tag));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getDisplayLabel() {
-		if (displayLabel == null){
-			return getTagTraitValueAsString(getTag(), TRAIT_DISPLAY_LABEL);
-		}
-		return getNLSedValue(displayLabel);
-	}
-
-	private String getNLSedValue(final String rawValue) {		
-		String value = TraitValueHelper.getNLSValue((Trait)this.eContainer.eContainer(), rawValue);								
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	private String getTagTraitValueAsString(final String _id, final String traitKey) {
-		EObject obj = getTagTraitValue(getTag(), traitKey);
-		if (obj != null){
-			return TraitValueHelper.getValueAsString((Trait)obj.eContainer());
-		}
-		return null;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	private EObject getTagTraitValue(final String tagName, final String traitKey) {
-		Entity tag = getTag(tagName);
-		if (tag != null){
-			for (Iterator it=tag.getTraits().iterator();it.hasNext();){
-				Trait trait = (Trait)it.next();
-				if (traitKey.equals(trait.getId()))
-					return trait.getValue(); 	
-			}
-		}
-		return null;
-	}
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	private Entity getTag(String tagName) {
-		if (_tag == null){
-			//rely on PaletteInfos objects being inside a Model trait only			
-			try {
-				Model model = (Model)this.eContainer().eContainer().eContainer();
-				//we could probably do better than this... oh well
-                //FIXME: C.B: this is really bad! We could probably do better than
-                // write code that expects to throw ClassCastExceptions and then hides them?  I hope so!
-				_tag = findTag(model, tagName);
-			} catch (ClassCastException e) {		
-			    PDPlugin.getLogger(getClass()).error(e);
-				return null;
-			}
-		}
-		return _tag;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	private Entity findTag(Model model, String tagid) {
-		for (Iterator it=model.getChildEntities().iterator();it.hasNext();){
-			Entity tag = (Entity)it.next();
-			if (tagid.equals(tag.getId()))
-					return tag;
-		}
-		return null;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDisplayLabel(String newDisplayLabel) {
-		String oldDisplayLabel = displayLabel;
-		displayLabel = newDisplayLabel;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.PALETTE_INFO__DISPLAY_LABEL, oldDisplayLabel, displayLabel));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getDescription() {
-		if (description == null){
-			return getTagTraitValueAsString(getId(), TRAIT_DESCRIPTION);
-		}
-		return getNLSedValue(description);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDescription(String newDescription) {
-		String oldDescription = description;
-		description = newDescription;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.PALETTE_INFO__DESCRIPTION, oldDescription, description));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Boolean getExpert() {
-		return expert;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setExpert(Boolean newExpert) {
-		Boolean oldExpert = expert;
-		expert = newExpert;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.PALETTE_INFO__EXPERT, oldExpert, expert));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Boolean getHidden() {
-		return hidden;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHidden(Boolean newHidden) {
-		Boolean oldHidden = hidden;
-		hidden = newHidden;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.PALETTE_INFO__HIDDEN, oldHidden, hidden));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getSmallIcon() {
-		if (smallIcon == null){
-			return getTagTraitValueAsString(getId(), TRAIT_SMALL_ICON);
-		}
-		return smallIcon;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSmallIcon(String newSmallIcon) {
-		String oldSmallIcon = smallIcon;
-		smallIcon = newSmallIcon;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.PALETTE_INFO__SMALL_ICON, oldSmallIcon, smallIcon));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getLargeIcon() {
-		if (largeIcon == null){
-			return getTagTraitValueAsString(getId(), TRAIT_LARGE_ICON);
-		}
-		return largeIcon;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLargeIcon(String newLargeIcon) {
-		String oldLargeIcon = largeIcon;
-		largeIcon = newLargeIcon;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.PALETTE_INFO__LARGE_ICON, oldLargeIcon, largeIcon));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public TagCreationInfo getTagCreation() {
-		if (tagCreation != null && tagCreation.eIsProxy()) {
-			InternalEObject oldTagCreation = (InternalEObject)tagCreation;
-			tagCreation = (TagCreationInfo)eResolveProxy(oldTagCreation);
-			if (tagCreation != oldTagCreation) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, PaletteInfosPackage.PALETTE_INFO__TAG_CREATION, oldTagCreation, tagCreation));
-			}
-		}
-		else if (tagCreation == null){
-			//delegate to entity if it exists
-			return (TagCreationInfo)getTagTraitValue(getTag(), "tag-create");
-		}
-		return tagCreation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagCreationInfo basicGetTagCreation() {
-		return tagCreation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTagCreation(TagCreationInfo newTagCreation) {
-		TagCreationInfo oldTagCreation = tagCreation;
-		tagCreation = newTagCreation;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.PALETTE_INFO__TAG_CREATION, oldTagCreation, tagCreation));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean isExpert() {
-		if (expert == null){
-			String val = getTagTraitValueAsString(getId(), "expert");
-			return Boolean.valueOf(val).booleanValue();			
-		}
-		return expert.booleanValue();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean isHidden() {
-		if (hidden == null){
-			String val = getTagTraitValueAsString(getId(), "hidden");
-			return Boolean.valueOf(val).booleanValue();	
-		}
-		return hidden.booleanValue();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case PaletteInfosPackage.PALETTE_INFO__ID:
-				return getId();
-			case PaletteInfosPackage.PALETTE_INFO__TAG:
-				return getTag();
-			case PaletteInfosPackage.PALETTE_INFO__DISPLAY_LABEL:
-				return getDisplayLabel();
-			case PaletteInfosPackage.PALETTE_INFO__DESCRIPTION:
-				return getDescription();
-			case PaletteInfosPackage.PALETTE_INFO__EXPERT:
-				return getExpert();
-			case PaletteInfosPackage.PALETTE_INFO__HIDDEN:
-				return getHidden();
-			case PaletteInfosPackage.PALETTE_INFO__SMALL_ICON:
-				return getSmallIcon();
-			case PaletteInfosPackage.PALETTE_INFO__LARGE_ICON:
-				return getLargeIcon();
-			case PaletteInfosPackage.PALETTE_INFO__TAG_CREATION:
-				if (resolve) return getTagCreation();
-				return basicGetTagCreation();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case PaletteInfosPackage.PALETTE_INFO__ID:
-				setId((String)newValue);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__TAG:
-				setTag((String)newValue);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__DISPLAY_LABEL:
-				setDisplayLabel((String)newValue);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__DESCRIPTION:
-				setDescription((String)newValue);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__EXPERT:
-				setExpert((Boolean)newValue);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__HIDDEN:
-				setHidden((Boolean)newValue);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__SMALL_ICON:
-				setSmallIcon((String)newValue);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__LARGE_ICON:
-				setLargeIcon((String)newValue);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__TAG_CREATION:
-				setTagCreation((TagCreationInfo)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case PaletteInfosPackage.PALETTE_INFO__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__TAG:
-				setTag(TAG_EDEFAULT);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__DISPLAY_LABEL:
-				setDisplayLabel(DISPLAY_LABEL_EDEFAULT);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__DESCRIPTION:
-				setDescription(DESCRIPTION_EDEFAULT);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__EXPERT:
-				setExpert(EXPERT_EDEFAULT);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__HIDDEN:
-				setHidden(HIDDEN_EDEFAULT);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__SMALL_ICON:
-				setSmallIcon(SMALL_ICON_EDEFAULT);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__LARGE_ICON:
-				setLargeIcon(LARGE_ICON_EDEFAULT);
-				return;
-			case PaletteInfosPackage.PALETTE_INFO__TAG_CREATION:
-				setTagCreation((TagCreationInfo)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case PaletteInfosPackage.PALETTE_INFO__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case PaletteInfosPackage.PALETTE_INFO__TAG:
-				return TAG_EDEFAULT == null ? tag != null : !TAG_EDEFAULT.equals(tag);
-			case PaletteInfosPackage.PALETTE_INFO__DISPLAY_LABEL:
-				return DISPLAY_LABEL_EDEFAULT == null ? displayLabel != null : !DISPLAY_LABEL_EDEFAULT.equals(displayLabel);
-			case PaletteInfosPackage.PALETTE_INFO__DESCRIPTION:
-				return DESCRIPTION_EDEFAULT == null ? description != null : !DESCRIPTION_EDEFAULT.equals(description);
-			case PaletteInfosPackage.PALETTE_INFO__EXPERT:
-				return EXPERT_EDEFAULT == null ? expert != null : !EXPERT_EDEFAULT.equals(expert);
-			case PaletteInfosPackage.PALETTE_INFO__HIDDEN:
-				return HIDDEN_EDEFAULT == null ? hidden != null : !HIDDEN_EDEFAULT.equals(hidden);
-			case PaletteInfosPackage.PALETTE_INFO__SMALL_ICON:
-				return SMALL_ICON_EDEFAULT == null ? smallIcon != null : !SMALL_ICON_EDEFAULT.equals(smallIcon);
-			case PaletteInfosPackage.PALETTE_INFO__LARGE_ICON:
-				return LARGE_ICON_EDEFAULT == null ? largeIcon != null : !LARGE_ICON_EDEFAULT.equals(largeIcon);
-			case PaletteInfosPackage.PALETTE_INFO__TAG_CREATION:
-				return tagCreation != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: ");
-		result.append(id);
-		result.append(", tag: ");
-		result.append(tag);
-		result.append(", displayLabel: ");
-		result.append(displayLabel);
-		result.append(", description: ");
-		result.append(description);
-		result.append(", expert: ");
-		result.append(expert);
-		result.append(", hidden: ");
-		result.append(hidden);
-		result.append(", smallIcon: ");
-		result.append(smallIcon);
-		result.append(", largeIcon: ");
-		result.append(largeIcon);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PaletteInfoImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfosFactoryImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfosFactoryImpl.java
deleted file mode 100644
index 4d68fe7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfosFactoryImpl.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: PaletteInfosFactoryImpl.java,v 1.3 2007/04/16 19:55:08 itrimble Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.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.editors.palette.paletteinfos.PaletteInfo;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfos;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosFactory;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationAttribute;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationInfo;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationTemplate;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class PaletteInfosFactoryImpl extends EFactoryImpl implements PaletteInfosFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Creates the default factory implementation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static PaletteInfosFactory init() {
-		try {
-			PaletteInfosFactory thePaletteInfosFactory = (PaletteInfosFactory)EPackage.Registry.INSTANCE.getEFactory("http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore"); 
-			if (thePaletteInfosFactory != null) {
-				return thePaletteInfosFactory;
-			}
-		}
-		catch (Exception exception) {
-			EcorePlugin.INSTANCE.log(exception);
-		}
-		return new PaletteInfosFactoryImpl();
-	}
-
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PaletteInfosFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case PaletteInfosPackage.PALETTE_INFOS: return createPaletteInfos();
-			case PaletteInfosPackage.PALETTE_INFO: return createPaletteInfo();
-			case PaletteInfosPackage.TAG_CREATION_INFO: return createTagCreationInfo();
-			case PaletteInfosPackage.TAG_CREATION_TEMPLATE: return createTagCreationTemplate();
-			case PaletteInfosPackage.TAG_CREATION_ATTRIBUTE: return createTagCreationAttribute();
-			default:
-				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PaletteInfo createPaletteInfo() {
-		PaletteInfoImpl paletteInfo = new PaletteInfoImpl();
-		return paletteInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagCreationInfo createTagCreationInfo() {
-		TagCreationInfoImpl tagCreationInfo = new TagCreationInfoImpl();
-		return tagCreationInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagCreationTemplate createTagCreationTemplate() {
-		TagCreationTemplateImpl tagCreationTemplate = new TagCreationTemplateImpl();
-		return tagCreationTemplate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagCreationAttribute createTagCreationAttribute() {
-		TagCreationAttributeImpl tagCreationAttribute = new TagCreationAttributeImpl();
-		return tagCreationAttribute;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PaletteInfos createPaletteInfos() {
-		PaletteInfosImpl paletteInfos = new PaletteInfosImpl();
-		return paletteInfos;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PaletteInfosPackage getPaletteInfosPackage() {
-		return (PaletteInfosPackage)getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @deprecated
-	 * @generated
-	 */
-	public static PaletteInfosPackage getPackage() {
-		return PaletteInfosPackage.eINSTANCE;
-	}
-
-} //PaletteInfosFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfosImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfosImpl.java
deleted file mode 100644
index 925039e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfosImpl.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: PaletteInfosImpl.java,v 1.3 2007/04/16 19:55:08 itrimble Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfos;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Palette Infos</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfosImpl#getInfos <em>Infos</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PaletteInfosImpl extends EObjectImpl implements PaletteInfos {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached value of the '{@link #getInfos() <em>Infos</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getInfos()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList infos = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PaletteInfosImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PaletteInfosPackage.Literals.PALETTE_INFOS;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getInfos() {
-		if (infos == null) {
-			infos = new EObjectContainmentEList(PaletteInfo.class, this, PaletteInfosPackage.PALETTE_INFOS__INFOS);
-		}
-		return infos;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public PaletteInfo findPaletteInfoById(String id) {
-		for (Iterator it=getInfos().iterator();it.hasNext();){
-			PaletteInfo info = (PaletteInfo)it.next();
-			if (id.equals(info.getId()))
-				return info;
-		}
-		return null;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case PaletteInfosPackage.PALETTE_INFOS__INFOS:
-				return ((InternalEList)getInfos()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case PaletteInfosPackage.PALETTE_INFOS__INFOS:
-				return getInfos();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case PaletteInfosPackage.PALETTE_INFOS__INFOS:
-				getInfos().clear();
-				getInfos().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case PaletteInfosPackage.PALETTE_INFOS__INFOS:
-				getInfos().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case PaletteInfosPackage.PALETTE_INFOS__INFOS:
-				return infos != null && !infos.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //PaletteInfosImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfosPackageImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfosPackageImpl.java
deleted file mode 100644
index 53bebb0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfosPackageImpl.java
+++ /dev/null
@@ -1,517 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: PaletteInfosPackageImpl.java,v 1.3 2007/04/16 19:55:08 itrimble Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.emf.ecore.xml.type.XMLTypePackage;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfos;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosFactory;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationAttribute;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationInfo;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationTemplate;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class PaletteInfosPackageImpl extends EPackageImpl implements PaletteInfosPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass paletteInfoEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass tagCreationInfoEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass tagCreationTemplateEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass tagCreationAttributeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass paletteInfosEClass = 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.palette.paletteinfos.PaletteInfosPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private PaletteInfosPackageImpl() {
-		super(eNS_URI, PaletteInfosFactory.eINSTANCE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static boolean isInited = false;
-
-	/**
-	 * Creates, registers, and initializes the <b>Package</b> for this
-	 * model, and for any others upon which it depends.  Simple
-	 * dependencies are satisfied by calling this method on all
-	 * dependent packages before doing anything else.  This method drives
-	 * initialization for interdependent packages directly, in parallel
-	 * with this package, itself.
-	 * <p>Of this package and its interdependencies, all packages which
-	 * have not yet been registered by their URI values are first created
-	 * and registered.  The packages are then initialized in two steps:
-	 * meta-model objects for all of the packages are created before any
-	 * are initialized, since one package's meta-model objects may refer to
-	 * those of another.
-	 * <p>Invocation of this method will not affect any packages that have
-	 * already been initialized.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static PaletteInfosPackage init() {
-		if (isInited) return (PaletteInfosPackage)EPackage.Registry.INSTANCE.getEPackage(PaletteInfosPackage.eNS_URI);
-
-		// Obtain or create and register package
-		PaletteInfosPackageImpl thePaletteInfosPackage = (PaletteInfosPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof PaletteInfosPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new PaletteInfosPackageImpl());
-
-		isInited = true;
-
-		// Initialize simple dependencies
-		XMLTypePackage.eINSTANCE.eClass();
-
-		// Create package meta-data objects
-		thePaletteInfosPackage.createPackageContents();
-
-		// Initialize created meta-data
-		thePaletteInfosPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		thePaletteInfosPackage.freeze();
-
-		return thePaletteInfosPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPaletteInfo() {
-		return paletteInfoEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPaletteInfo_Id() {
-		return (EAttribute)paletteInfoEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPaletteInfo_Tag() {
-		return (EAttribute)paletteInfoEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPaletteInfo_DisplayLabel() {
-		return (EAttribute)paletteInfoEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPaletteInfo_Description() {
-		return (EAttribute)paletteInfoEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPaletteInfo_Expert() {
-		return (EAttribute)paletteInfoEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPaletteInfo_Hidden() {
-		return (EAttribute)paletteInfoEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPaletteInfo_SmallIcon() {
-		return (EAttribute)paletteInfoEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPaletteInfo_LargeIcon() {
-		return (EAttribute)paletteInfoEClass.getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPaletteInfo_TagCreation() {
-		return (EReference)paletteInfoEClass.getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTagCreationInfo() {
-		return tagCreationInfoEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagCreationInfo_Template() {
-		return (EAttribute)tagCreationInfoEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTagCreationInfo_Attributes() {
-		return (EReference)tagCreationInfoEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTagCreationTemplate() {
-		return tagCreationTemplateEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTagCreationTemplate_Template() {
-		return (EReference)tagCreationTemplateEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTagCreationAttribute() {
-		return tagCreationAttributeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagCreationAttribute_Id() {
-		return (EAttribute)tagCreationAttributeEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagCreationAttribute_Value() {
-		return (EAttribute)tagCreationAttributeEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPaletteInfos() {
-		return paletteInfosEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPaletteInfos_Infos() {
-		return (EReference)paletteInfosEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PaletteInfosFactory getPaletteInfosFactory() {
-		return (PaletteInfosFactory)getEFactoryInstance();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isCreated = false;
-
-	/**
-	 * Creates the meta-model objects for the package.  This method is
-	 * guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void createPackageContents() {
-		if (isCreated) return;
-		isCreated = true;
-
-		// Create classes and their features
-		paletteInfosEClass = createEClass(PALETTE_INFOS);
-		createEReference(paletteInfosEClass, PALETTE_INFOS__INFOS);
-
-		paletteInfoEClass = createEClass(PALETTE_INFO);
-		createEAttribute(paletteInfoEClass, PALETTE_INFO__ID);
-		createEAttribute(paletteInfoEClass, PALETTE_INFO__TAG);
-		createEAttribute(paletteInfoEClass, PALETTE_INFO__DISPLAY_LABEL);
-		createEAttribute(paletteInfoEClass, PALETTE_INFO__DESCRIPTION);
-		createEAttribute(paletteInfoEClass, PALETTE_INFO__EXPERT);
-		createEAttribute(paletteInfoEClass, PALETTE_INFO__HIDDEN);
-		createEAttribute(paletteInfoEClass, PALETTE_INFO__SMALL_ICON);
-		createEAttribute(paletteInfoEClass, PALETTE_INFO__LARGE_ICON);
-		createEReference(paletteInfoEClass, PALETTE_INFO__TAG_CREATION);
-
-		tagCreationInfoEClass = createEClass(TAG_CREATION_INFO);
-		createEReference(tagCreationInfoEClass, TAG_CREATION_INFO__ATTRIBUTES);
-		createEAttribute(tagCreationInfoEClass, TAG_CREATION_INFO__TEMPLATE);
-
-		tagCreationTemplateEClass = createEClass(TAG_CREATION_TEMPLATE);
-		createEReference(tagCreationTemplateEClass, TAG_CREATION_TEMPLATE__TEMPLATE);
-
-		tagCreationAttributeEClass = createEClass(TAG_CREATION_ATTRIBUTE);
-		createEAttribute(tagCreationAttributeEClass, TAG_CREATION_ATTRIBUTE__ID);
-		createEAttribute(tagCreationAttributeEClass, TAG_CREATION_ATTRIBUTE__VALUE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isInitialized = false;
-
-	/**
-	 * Complete the initialization of the package and its meta-model.  This
-	 * method is guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void initializePackageContents() {
-		if (isInitialized) return;
-		isInitialized = true;
-
-		// Initialize package
-		setName(eNAME);
-		setNsPrefix(eNS_PREFIX);
-		setNsURI(eNS_URI);
-
-		// Obtain other dependent packages
-		XMLTypePackage theXMLTypePackage = (XMLTypePackage)EPackage.Registry.INSTANCE.getEPackage(XMLTypePackage.eNS_URI);
-
-		// Add supertypes to classes
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(paletteInfosEClass, PaletteInfos.class, "PaletteInfos", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getPaletteInfos_Infos(), this.getPaletteInfo(), null, "infos", null, 0, -1, PaletteInfos.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		EOperation op = addEOperation(paletteInfosEClass, this.getPaletteInfo(), "findPaletteInfoById", 0, 1);
-		addEParameter(op, ecorePackage.getEString(), "id", 1, 1);
-
-		initEClass(paletteInfoEClass, PaletteInfo.class, "PaletteInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPaletteInfo_Id(), ecorePackage.getEString(), "id", null, 1, 1, PaletteInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPaletteInfo_Tag(), ecorePackage.getEString(), "tag", null, 0, 1, PaletteInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPaletteInfo_DisplayLabel(), ecorePackage.getEString(), "displayLabel", null, 0, 1, PaletteInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPaletteInfo_Description(), ecorePackage.getEString(), "description", null, 0, 1, PaletteInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPaletteInfo_Expert(), ecorePackage.getEBooleanObject(), "expert", null, 0, 1, PaletteInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPaletteInfo_Hidden(), ecorePackage.getEBooleanObject(), "hidden", null, 0, 1, PaletteInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPaletteInfo_SmallIcon(), ecorePackage.getEString(), "smallIcon", null, 0, 1, PaletteInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPaletteInfo_LargeIcon(), ecorePackage.getEString(), "largeIcon", null, 0, 1, PaletteInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getPaletteInfo_TagCreation(), this.getTagCreationInfo(), null, "tagCreation", null, 0, 1, PaletteInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		op = addEOperation(paletteInfoEClass, ecorePackage.getEBoolean(), "isExpert", 0, 1);
-
-		op = addEOperation(paletteInfoEClass, ecorePackage.getEBoolean(), "isHidden", 0, 1);
-
-		initEClass(tagCreationInfoEClass, TagCreationInfo.class, "TagCreationInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getTagCreationInfo_Attributes(), this.getTagCreationAttribute(), null, "attributes", null, 0, -1, TagCreationInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagCreationInfo_Template(), theXMLTypePackage.getAnySimpleType(), "template", null, 0, 1, TagCreationInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(tagCreationTemplateEClass, TagCreationTemplate.class, "TagCreationTemplate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getTagCreationTemplate_Template(), ecorePackage.getEObject(), null, "template", null, 0, 1, TagCreationTemplate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(tagCreationAttributeEClass, TagCreationAttribute.class, "TagCreationAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getTagCreationAttribute_Id(), ecorePackage.getEString(), "id", null, 1, 1, TagCreationAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagCreationAttribute_Value(), ecorePackage.getEString(), "value", null, 0, 1, TagCreationAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		// Create resource
-		createResource(eNS_URI);
-
-		// Create annotations
-		// http:///org/eclipse/emf/ecore/util/ExtendedMetaData
-		createExtendedMetaDataAnnotations();
-	}
-
-	/**
-	 * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void createExtendedMetaDataAnnotations() {
-		String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData";		
-		addAnnotation
-		  (getPaletteInfos_Infos(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "item"
-		   });		
-		addAnnotation
-		  (getPaletteInfo_DisplayLabel(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-label"
-		   });		
-		addAnnotation
-		  (getPaletteInfo_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element"
-		   });		
-		addAnnotation
-		  (getPaletteInfo_Expert(), 
-		   source, 
-		   new String[] {
-			 "kind", "element"
-		   });		
-		addAnnotation
-		  (getPaletteInfo_Hidden(), 
-		   source, 
-		   new String[] {
-			 "kind", "element"
-		   });		
-		addAnnotation
-		  (getPaletteInfo_SmallIcon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "small-icon"
-		   });		
-		addAnnotation
-		  (getPaletteInfo_LargeIcon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "large-icon"
-		   });		
-		addAnnotation
-		  (getPaletteInfo_TagCreation(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "tag-create"
-		   });		
-		addAnnotation
-		  (getTagCreationInfo_Attributes(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute"
-		   });
-	}
-
-} //PaletteInfosPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/TagCreationAttributeImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/TagCreationAttributeImpl.java
deleted file mode 100644
index 583be6c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/TagCreationAttributeImpl.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TagCreationAttributeImpl.java,v 1.2 2007/04/16 19:55:08 itrimble Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.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.palette.paletteinfos.PaletteInfosPackage;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationAttribute;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag Creation Attribute</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.TagCreationAttributeImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.TagCreationAttributeImpl#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagCreationAttributeImpl extends EObjectImpl implements TagCreationAttribute {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VALUE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected String value = VALUE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TagCreationAttributeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PaletteInfosPackage.Literals.TAG_CREATION_ATTRIBUTE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.TAG_CREATION_ATTRIBUTE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(String newValue) {
-		String oldValue = value;
-		value = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.TAG_CREATION_ATTRIBUTE__VALUE, oldValue, value));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_ATTRIBUTE__ID:
-				return getId();
-			case PaletteInfosPackage.TAG_CREATION_ATTRIBUTE__VALUE:
-				return getValue();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_ATTRIBUTE__ID:
-				setId((String)newValue);
-				return;
-			case PaletteInfosPackage.TAG_CREATION_ATTRIBUTE__VALUE:
-				setValue((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_ATTRIBUTE__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case PaletteInfosPackage.TAG_CREATION_ATTRIBUTE__VALUE:
-				setValue(VALUE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_ATTRIBUTE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case PaletteInfosPackage.TAG_CREATION_ATTRIBUTE__VALUE:
-				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: ");
-		result.append(id);
-		result.append(", value: ");
-		result.append(value);
-		result.append(')');
-		return result.toString();
-	}
-
-} //TagCreationAttributeImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/TagCreationInfoImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/TagCreationInfoImpl.java
deleted file mode 100644
index c25ce3b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/TagCreationInfoImpl.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TagCreationInfoImpl.java,v 1.3 2007/04/16 19:55:08 itrimble Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.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.editors.palette.paletteinfos.PaletteInfosPackage;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationAttribute;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag Creation Info</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.TagCreationInfoImpl#getAttributes <em>Attributes</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.TagCreationInfoImpl#getTemplate <em>Template</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagCreationInfoImpl extends EObjectImpl implements TagCreationInfo {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached value of the '{@link #getAttributes() <em>Attributes</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttributes()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList attributes = null;
-
-	/**
-	 * The default value of the '{@link #getTemplate() <em>Template</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTemplate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object TEMPLATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTemplate() <em>Template</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTemplate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object template = TEMPLATE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TagCreationInfoImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PaletteInfosPackage.Literals.TAG_CREATION_INFO;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getTemplate() {
-		return template;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTemplate(Object newTemplate) {
-		Object oldTemplate = template;
-		template = newTemplate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.TAG_CREATION_INFO__TEMPLATE, oldTemplate, template));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getAttributes() {
-		if (attributes == null) {
-			attributes = new EObjectContainmentEList(TagCreationAttribute.class, this, PaletteInfosPackage.TAG_CREATION_INFO__ATTRIBUTES);
-		}
-		return attributes;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_INFO__ATTRIBUTES:
-				return ((InternalEList)getAttributes()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_INFO__ATTRIBUTES:
-				return getAttributes();
-			case PaletteInfosPackage.TAG_CREATION_INFO__TEMPLATE:
-				return getTemplate();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_INFO__ATTRIBUTES:
-				getAttributes().clear();
-				getAttributes().addAll((Collection)newValue);
-				return;
-			case PaletteInfosPackage.TAG_CREATION_INFO__TEMPLATE:
-				setTemplate(newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_INFO__ATTRIBUTES:
-				getAttributes().clear();
-				return;
-			case PaletteInfosPackage.TAG_CREATION_INFO__TEMPLATE:
-				setTemplate(TEMPLATE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_INFO__ATTRIBUTES:
-				return attributes != null && !attributes.isEmpty();
-			case PaletteInfosPackage.TAG_CREATION_INFO__TEMPLATE:
-				return TEMPLATE_EDEFAULT == null ? template != null : !TEMPLATE_EDEFAULT.equals(template);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (template: ");
-		result.append(template);
-		result.append(')');
-		return result.toString();
-	}
-
-} //TagCreationInfoImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/TagCreationTemplateImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/TagCreationTemplateImpl.java
deleted file mode 100644
index 1250ab1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/TagCreationTemplateImpl.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TagCreationTemplateImpl.java,v 1.3 2007/04/16 19:55:08 itrimble Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationTemplate;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag Creation Template</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.TagCreationTemplateImpl#getTemplate <em>Template</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagCreationTemplateImpl extends EObjectImpl implements TagCreationTemplate {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached value of the '{@link #getTemplate() <em>Template</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTemplate()
-	 * @generated
-	 * @ordered
-	 */
-	protected EObject template = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TagCreationTemplateImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PaletteInfosPackage.Literals.TAG_CREATION_TEMPLATE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject getTemplate() {
-		return template;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetTemplate(EObject newTemplate, NotificationChain msgs) {
-		EObject oldTemplate = template;
-		template = newTemplate;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.TAG_CREATION_TEMPLATE__TEMPLATE, oldTemplate, newTemplate);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTemplate(EObject newTemplate) {
-		if (newTemplate != template) {
-			NotificationChain msgs = null;
-			if (template != null)
-				msgs = ((InternalEObject)template).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - PaletteInfosPackage.TAG_CREATION_TEMPLATE__TEMPLATE, null, msgs);
-			if (newTemplate != null)
-				msgs = ((InternalEObject)newTemplate).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - PaletteInfosPackage.TAG_CREATION_TEMPLATE__TEMPLATE, null, msgs);
-			msgs = basicSetTemplate(newTemplate, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, PaletteInfosPackage.TAG_CREATION_TEMPLATE__TEMPLATE, newTemplate, newTemplate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_TEMPLATE__TEMPLATE:
-				return basicSetTemplate(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_TEMPLATE__TEMPLATE:
-				return getTemplate();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_TEMPLATE__TEMPLATE:
-				setTemplate((EObject)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_TEMPLATE__TEMPLATE:
-				setTemplate((EObject)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case PaletteInfosPackage.TAG_CREATION_TEMPLATE__TEMPLATE:
-				return template != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //TagCreationTemplateImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/util/PaletteInfosAdapterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/util/PaletteInfosAdapterFactory.java
deleted file mode 100644
index 1e6428e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/util/PaletteInfosAdapterFactory.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: PaletteInfosAdapterFactory.java,v 1.2 2007/04/16 19:55:16 itrimble Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.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.palette.paletteinfos.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage
- * @generated
- */
-public class PaletteInfosAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static PaletteInfosPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PaletteInfosAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = PaletteInfosPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Returns whether this factory is applicable for the type of the object.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-	 * <!-- end-user-doc -->
-	 * @return whether this factory is applicable for the type of the object.
-	 * @generated
-	 */
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject)object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch the delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PaletteInfosSwitch modelSwitch =
-		new PaletteInfosSwitch() {
-			public Object casePaletteInfos(PaletteInfos object) {
-				return createPaletteInfosAdapter();
-			}
-			public Object casePaletteInfo(PaletteInfo object) {
-				return createPaletteInfoAdapter();
-			}
-			public Object caseTagCreationInfo(TagCreationInfo object) {
-				return createTagCreationInfoAdapter();
-			}
-			public Object caseTagCreationTemplate(TagCreationTemplate object) {
-				return createTagCreationTemplateAdapter();
-			}
-			public Object caseTagCreationAttribute(TagCreationAttribute object) {
-				return createTagCreationAttributeAdapter();
-			}
-			public Object defaultCase(EObject object) {
-				return createEObjectAdapter();
-			}
-		};
-
-	/**
-	 * Creates an adapter for the <code>target</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param target the object to adapt.
-	 * @return the adapter for the <code>target</code>.
-	 * @generated
-	 */
-	public Adapter createAdapter(Notifier target) {
-		return (Adapter)modelSwitch.doSwitch((EObject)target);
-	}
-
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo <em>Palette Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo
-	 * @generated
-	 */
-	public Adapter createPaletteInfoAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationInfo <em>Tag Creation Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationInfo
-	 * @generated
-	 */
-	public Adapter createTagCreationInfoAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationTemplate <em>Tag Creation Template</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationTemplate
-	 * @generated
-	 */
-	public Adapter createTagCreationTemplateAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationAttribute <em>Tag Creation Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationAttribute
-	 * @generated
-	 */
-	public Adapter createTagCreationAttributeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfos <em>Palette Infos</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfos
-	 * @generated
-	 */
-	public Adapter createPaletteInfosAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for the default case.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createEObjectAdapter() {
-		return null;
-	}
-
-} //PaletteInfosAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/util/PaletteInfosSwitch.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/util/PaletteInfosSwitch.java
deleted file mode 100644
index 0a980ac..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/util/PaletteInfosSwitch.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: PaletteInfosSwitch.java,v 1.2 2007/04/16 19:55:16 itrimble Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfosPackage
- * @generated
- */
-public class PaletteInfosSwitch {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static PaletteInfosPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PaletteInfosSwitch() {
-		if (modelPackage == null) {
-			modelPackage = PaletteInfosPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	public Object doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-		else {
-			List eSuperTypes = theEClass.getESuperTypes();
-			return
-				eSuperTypes.isEmpty() ?
-					defaultCase(theEObject) :
-					doSwitch((EClass)eSuperTypes.get(0), theEObject);
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected Object doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-			case PaletteInfosPackage.PALETTE_INFOS: {
-				PaletteInfos paletteInfos = (PaletteInfos)theEObject;
-				Object result = casePaletteInfos(paletteInfos);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case PaletteInfosPackage.PALETTE_INFO: {
-				PaletteInfo paletteInfo = (PaletteInfo)theEObject;
-				Object result = casePaletteInfo(paletteInfo);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case PaletteInfosPackage.TAG_CREATION_INFO: {
-				TagCreationInfo tagCreationInfo = (TagCreationInfo)theEObject;
-				Object result = caseTagCreationInfo(tagCreationInfo);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case PaletteInfosPackage.TAG_CREATION_TEMPLATE: {
-				TagCreationTemplate tagCreationTemplate = (TagCreationTemplate)theEObject;
-				Object result = caseTagCreationTemplate(tagCreationTemplate);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case PaletteInfosPackage.TAG_CREATION_ATTRIBUTE: {
-				TagCreationAttribute tagCreationAttribute = (TagCreationAttribute)theEObject;
-				Object result = caseTagCreationAttribute(tagCreationAttribute);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			default: return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Palette Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Palette Info</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePaletteInfo(PaletteInfo object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Tag Creation Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Tag Creation Info</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTagCreationInfo(TagCreationInfo object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Tag Creation Template</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Tag Creation Template</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTagCreationTemplate(TagCreationTemplate object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Tag Creation Attribute</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Tag Creation Attribute</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTagCreationAttribute(TagCreationAttribute object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Palette Infos</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Palette Infos</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePaletteInfos(PaletteInfos object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of 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;
-	}
-
-} //PaletteInfosSwitch
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 da4688f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/AbsolutePointLocator.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-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;
-    
-    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
-     */
-    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 56c6ce3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/BasicLabelToolTip.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-public class BasicLabelToolTip extends Label
-{
-    public BasicLabelToolTip(Image i) {
-        super(i);
-        initialize();
-    }
-
-    public BasicLabelToolTip(String s, Image i) {
-        super(s, i);
-        initialize();
-    }
-
-    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 99aa806..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;
-    }
-    
-	public 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 7aefa77..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ColumnResizableEditPolicy.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.editpolicies;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Locator;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Handle;
-import org.eclipse.gef.SharedCursors;
-import org.eclipse.gef.handles.MoveHandle;
-import org.eclipse.gef.handles.ResizeHandle;
-import org.eclipse.gef.handles.SquareHandle;
-import org.eclipse.gef.tools.DragEditPartsTracker;
-import org.eclipse.gef.tools.SelectEditPartTracker;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class ColumnResizableEditPolicy extends ElementResizableEditPolicy {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#createSelectionHandles()
-	 */
-	protected List createSelectionHandles() {
-		String elementName = ((Element) getHost().getModel()).getLocalName();
-		if ("column".equalsIgnoreCase(elementName)) {
-			List list = new ArrayList();
-
-			GraphicalEditPart part = (GraphicalEditPart) getHost();
-            
-            {
-    			MoveHandle borderhandle = new MoveHandle(part, new ColumnBorderHandleLocator(
-    					part));
-    			list.add(borderhandle);
-            }
-            
-            {
-    			MyMoveHandle cornerHandle = new MyMoveHandle(part, new ColumnHandleLocator(part, getHostFigure(),
-    					PositionConstants.NORTH_WEST));
-    			list.add(cornerHandle);
-            }
-            
-			SelectEditPartTracker tracker = new SelectEditPartTracker(getHost());
-			list.add(createHandle(part, PositionConstants.SOUTH_EAST, tracker,
-					SharedCursors.ARROW));
-			list.add(createHandle(part, PositionConstants.SOUTH_WEST, tracker,
-					SharedCursors.ARROW));
-			list.add(createHandle(part, PositionConstants.NORTH_WEST, tracker,
-					SharedCursors.ARROW));
-			list.add(createHandle(part, PositionConstants.NORTH_EAST, tracker,
-					SharedCursors.ARROW));
-			return list;
-
-		}
-		return super.createSelectionHandles();
-	}
-
-	private Handle createHandle(GraphicalEditPart owner, int direction,
-			DragTracker tracker, Cursor cursor) {
-		ResizeHandle handle = new ResizeHandle(owner, new ColumnCornerLocator(
-				owner, direction), cursor);
-		handle.setCursor(cursor);
-		handle.setDragTracker(tracker);
-		return handle;
-	}
-
-    private class ColumnHandleLocator extends CornerRelativeHandleLocator {
-		private GraphicalEditPart editPart;
-
-		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 reference
-		 *            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;
-
-        public ColumnBorderHandleLocator(GraphicalEditPart editPart) {
-            this.editPart = editPart;
-        }
-
-        public void relocate(IFigure target) {
-            target.setBounds(ColumnHelper.getColumnBounds(editPart, target));
-        }
-    }
-    
-    private static class MyMoveHandle extends SquareHandle
-    {
-        public MyMoveHandle(GraphicalEditPart owner, Locator loc) {
-            super(owner, loc);
-            setCursor(SharedCursors.SIZEALL);
-        }
-
-        protected void init() {
-            setPreferredSize(16,16);
-        }
-
-        protected Color getBorderColor() {
-            return ColorConstants.black;
-        }
-
-        protected Color getFillColor() {
-            return ColorConstants.white;
-        }
-
-        protected DragTracker createDragTracker() {
-            DragTracker tracker = new DragEditPartsTracker(getOwner());
-            
-            return tracker;
-        }
-
-        public void paintFigure(Graphics graphics) {
-            super.paintFigure(graphics);
-            final  Image moveImage = PDPlugin.getDefault().getImage("MoveHandle.png");
-            Point topLeft = getBounds().getTopLeft().getCopy();
-            topLeft.performTranslate(3,3);
-            graphics.drawImage(moveImage, topLeft);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/CornerRelativeHandleLocator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/CornerRelativeHandleLocator.java
deleted file mode 100644
index e9e31d8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/CornerRelativeHandleLocator.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.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;
-
-class CornerRelativeHandleLocator extends RelativeHandleLocator
-{
-    protected double relativeX = 0;
-    protected double relativeY = 0;
-    protected double offsetXMultiplier = 0;
-    protected double offsetYMultiplier = 0;
-    
-    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;
-    }
-    
-    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 9b52a6c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DropEditPolicy.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.editpolicies.GraphicalEditPolicy;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.gef.requests.GroupRequest;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.jst.pagedesigner.elementedit.ElementEditFactoryRegistry;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationRequest;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData.DropData;
-import org.eclipse.jst.pagedesigner.viewer.DefaultDropLocationStrategy;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-
-public abstract class DropEditPolicy extends GraphicalEditPolicy 
-{
-    protected 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;
-    }
-    
-    protected abstract DesignPosition findPosition(DropRequest r);
-    
-    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;
-    }
-    
-    protected DropData createDropData(DropRequest request)
-    {
-        if (request instanceof GroupRequest)
-        {
-            List editParts = ((GroupRequest)request).getEditParts();
-            
-            // TODO: currently we only support one drop item
-            if (editParts.size() > 0)
-            {
-                EditPart part = (EditPart) editParts.get(0);
-                if (part instanceof NodeEditPart)
-                {
-                    NodeEditPart nodePart = (NodeEditPart) part;
-                    TagIdentifier tagId = nodePart.getTagIdentifier();
-                    if (tagId != null)
-                    {
-                        List tagIds = new ArrayList();
-                        tagIds.add(tagId);
-                        return new DropData(tagIds);
-                    }
-                }
-            }
-        }
-        else if (request instanceof ItemCreationRequest)
-        {
-        	TagToolPaletteEntry desc = ((ItemCreationRequest)request).getTagToolPaletteEntry();
-            TagIdentifier tagId = 
-                TagIdentifierFactory.
-                    createJSPTagWrapper(desc.getURI(), desc.getTagName());
-            List tagIds = new ArrayList();
-            tagIds.add(tagId);
-            return new DropData(tagIds);
-        }
-        
-        return null;
-    }
-    
-    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 035a6fa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementDecoratorSquareHandle.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.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;
-
-public class ElementDecoratorSquareHandle extends SquareHandle {
-
-    
-    public ElementDecoratorSquareHandle(GraphicalEditPart owner, Locator loc,
-            Cursor c) {
-        super(owner, loc, c);
-    }
-    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;
-    }
-
-    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 912d937..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementMenuBar.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.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;
-
-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;
-
-    public ElementMenuBar(ElementEditPart hostPart)
-    {
-        hostPart.getViewer().addSelectionChangedListener(this);
-        
-        _hostPart = hostPart;
-        ToolbarLayout layout = new ToolbarLayout(false);
-        layout.setSpacing(4);
-        setLayoutManager(layout);
-    }
-
-    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;
-    }
-    
-    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());
-        }
-    }
-
-    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 4165511..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementResizableEditPolicy.java
+++ /dev/null
@@ -1,488 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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
-	 */
-	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 width
-	 * @param height
-	 * @return
-	 */
-	protected Command getResizeCommand(IDOMElement element, int width,
-			int height) {
-		Map map = new HashMap();
-		if (width > 0) {
-			map.put("width", width + "px");
-		}
-		if (height > 0) {
-			map.put("height", height + "px");
-		}
-		if (!map.isEmpty()) {
-            return new ChangeStyleCommand(element, map);
-		}
-        return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#getResizeCommand(org.eclipse.gef.requests.ChangeBoundsRequest)
-	 */
-	protected Command getResizeCommand(ChangeBoundsRequest request) {
-		ElementEditPart part = (ElementEditPart) this.getHost();
-
-		Rectangle rect = part.getFigure().getBounds();
-		rect = request.getTransformedRectangle(rect);
-		int width = rect.width;
-		int height = rect.height;
-
-		// since the user dragged rectangle included border/padding of the
-		// element. And if the element's
-		// width/height style setting don't include border padding, then we need
-		// to set the element's width/height
-		// style property a little smaller.
-		if (part.getFigure() instanceof CSSFigure) {
-			CSSFigure cssfigure = (CSSFigure) part.getFigure();
-			ICSSStyle style = cssfigure.getCSSStyle();
-			if (style != null && !style.isSizeIncludeBorderPadding()) {
-				width -= (style.getBorderInsets().getWidth() + style
-						.getPaddingInsets().getWidth());
-				height -= (style.getBorderInsets().getHeight() + style
-						.getPaddingInsets().getHeight());
-			}
-		}
-
-		//make sure to only change the dimensions for the direction of the resize request.
-		int resizeDirection = request.getResizeDirection();
-		switch (resizeDirection) {
-			case PositionConstants.EAST:
-			case PositionConstants.WEST:
-				//resizing, only the width, so set the height to -1;
-				height = -1;
-				break;
-			case PositionConstants.NORTH:
-			case PositionConstants.SOUTH:
-				//resizing only the height, so set the width to -1
-				width = -1;
-				break;
-			default:
-				//all others are changing both directions...
-		}
-		return getResizeCommand((IDOMElement) part.getIDOMNode(), width, height);
-	}
-
-	/**
-	 * Shows or updates feedback for a change bounds request.
-	 * 
-	 * @param request
-	 *            the request
-	 */
-	protected void showChangeBoundsFeedback(ChangeBoundsRequest request) {
-		IFigure feedback = getDragSourceFeedbackFigure();
-
-		PrecisionRectangle rect = new PrecisionRectangle(
-				getInitialFeedbackBounds().getCopy());
-		getHostFigure().translateToAbsolute(rect);
-		rect.translate(request.getMoveDelta());
-		rect.resize(request.getSizeDelta());
-
-		// to avoid enlarge feedback pane.
-		// when draging a editpart inside designer to move/copy it, we do not
-		// want to
-		// enlarge the canvas, since that may resulting in relayout.
-		rect = (PrecisionRectangle) rect.intersect(getFeedbackLayer()
-				.getBounds());
-
-		feedback.translateToRelative(rect);
-		feedback.setBounds(rect);
-	}
-
-    public Cursor getSelectionToolCursor(Point mouseLocation) {
-        // by default return null to indicate system default.  
-        // sub-classes should override to customize
-        return null;
-    }
-
-    protected DragTracker getSelectionTracker(LocationRequest request)
-    {
-        // by default, return null
-        // sub-classes should override to customize
-        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 3857c35..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/FragmentHandle.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.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 {
-	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;
-	}
-
-	public void refresh() {
-		// TODO: not ref Insets insets = getOwnerFigure().getInsets();
-		// TODO: not ref Rectangle bounds;
-
-		// 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._x, box._y, 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._x,
-				referencebox._y, 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);
-	}
-
-	public 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();
-		}
-	}
-
-	public static class BorderFigure extends Figure {
-		public static final int INNER_PAD = 2;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.draw2d.IFigure#containsPoint(int, int)
-		 */
-		public boolean containsPoint(int x, int y) {
-			if (!super.containsPoint(x, y))
-				return false;
-			return !Rectangle.SINGLETON.setBounds(getBounds()).shrink(
-					INNER_PAD, INNER_PAD).contains(x, y);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/IEnhancedSelectionEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/IEnhancedSelectionEditPolicy.java
deleted file mode 100644
index bb9e99c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/IEnhancedSelectionEditPolicy.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.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 
-{
-    /**
-     * @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 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 82e9a34..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ITableEditAdapter.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.editpolicies;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface ITableEditAdapter {
-	public int getColumnCount();
-
-	public int getRowCount();
-
-	public void insertColumn(int atPosition);
-
-	public void insertRow(int rowPosition);
-
-	/**
-	 * @param columnIndex
-	 * @return
-	 */
-	public int getColumnResizeStart(int columnIndex);
-
-	/**
-	 * @return
-	 */
-	public int getColumnResizeWidth();
-
-	/**
-	 * @param columnIndex
-	 * @return
-	 */
-	public int getColumnStart(int columnIndex);
-
-	/**
-	 * @param columnIndex
-	 * @return
-	 */
-	public int getColumnWidth(int columnIndex);
-
-	/**
-	 * @param rowIndex
-	 * @return
-	 */
-	public int getRowStart(int rowIndex);
-
-	/**
-	 * @param rowIndex
-	 * @return
-	 */
-	public int getRowHeight(int rowIndex);
-
-	/**
-	 * @param rowIndex
-	 * @return
-	 */
-	public int getRowResizeStart(int rowIndex);
-
-	/**
-	 * @return
-	 */
-	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 14af9bd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/JSFDropEditPolicy.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.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;
-
-	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 657067f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/LocationHelper.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.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 class LocationHelper {
-	/**
-	 * @param p
-	 * @param result
-	 * @param tagName
-	 * @param skip
-	 * @return
-	 */
-	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
-	 */
-	public static Rectangle getAbsoluteBounds(IFigure figure, FlowBox box) {
-		Rectangle r = new Rectangle(box._x, box._y, box.getWidth(), box
-				.getHeight());
-		figure.translateToAbsolute(r);
-		return r;
-	}
-
-	/**
-	 * @param child
-	 * @return
-	 */
-	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;
-	}
-
-	protected static ModelQuery getModelQuery(Node node) {
-        Document doc = node.getOwnerDocument();
-        
-		if (node.getNodeType() == Node.DOCUMENT_NODE) {
-            doc = (Document) node;
-		}
-        return ModelQueryUtil.getModelQuery(doc);
-	}
-
-}
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 216c676..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/MouseSelectableChildDecorator.java
+++ /dev/null
@@ -1,592 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-class MouseSelectableChildDecorator extends NonVisualChildDecorator
-{
-    // no visual or affordance showing
-    private static final int           STATE_START = 0;
-    
-    // the host is showing hover feedback, but is not selected
-    private static final int           STATE_HOST_HOVER = 1;
-    
-    // the host has primary selection
-    private static final int           STATE_HOST_SELECTED = 2;
-    
-    // the selection handle for the decorator has mouse hover
-    private static final int           STATE_HANDLE_HOVER = 3;
-    
-    // the selection handle has been selected (is showing)
-    private static final int           STATE_HANDLE_MENU_BAR_SHOWING = 4;
-    
-    // the menu bar has hover
-    private static final int           STATE_HANDLE_MENU_BAR_HOVER = 5;
-    
-    // the menu bar has primary selection
-    private static final int           STATE_HANDLE_MENU_BAR_SELECTED = 6;
-    
-    public static final int           EVENT_HOST_HOVER_RECEIVED = 31;
-    public static final int           EVENT_HOST_HOVER_LOST = 32;
-    public static final int           EVENT_HOST_SELECTION_RECEIVED = 33;
-    public static final int           EVENT_HOST_SELECTION_LOST = 34;
-    private static final int          EVENT_HANDLE_HOVER_RECEIVED = 35;
-    private static final int          EVENT_HANDLE_HOVER_LOST = 36;
-    private static final int          EVENT_HANDLE_SELECTED = 37;
-    private static final int          EVENT_ALL_SELECTION_LOST = 38;
-    private static final int          EVENT_MENU_BAR_SELECTION_RECEIVED = 39;
-    
-    private MouseMotionListener      _motionListener;
-    private MouseListener            _mouseListener;
-    private boolean                  _isMouseOver = false;
-    private ElementMenuBar           _elementMenuBar;
-
-    private DisplayStateMachine      _stateMachine;
-    private VerticalMenuLocator      _menuLocator;
-    private AnimatedHideLocator      _hideLocator;
-    private IFigure                  _hoverParent;
-    private IFigure                  _selectionParent;
-
-    private ISelectionChangedListener _menuSelectionListener;
-    
-    MouseSelectableChildDecorator(final GraphicalEditPart hostPart, int location, 
-            IFigure hoverParent, IFigure selectionParent) {
-        super(hostPart, location);
-        _menuLocator = new VerticalMenuLocator(hostPart, this);
-        _hideLocator = new AnimatedHideLocator();
-        _elementMenuBar = ((ElementEditPart)hostPart).getElementMenuBar();
-        _stateMachine = new DisplayStateMachine();
-        _hoverParent = hoverParent;
-        _selectionParent = selectionParent;
-        
-        _motionListener = new MouseMotionListener.Stub()
-        {
-            public void mouseEntered(MouseEvent me) {
-                _isMouseOver = true;
-                updateState(EVENT_HANDLE_HOVER_RECEIVED);
-            }
-    
-            public void mouseExited(MouseEvent me) {
-                _isMouseOver = false;
-                updateState(EVENT_HANDLE_HOVER_LOST);
-            }
-        };
-        addMouseMotionListener(_motionListener);
-            
-        _mouseListener = new MouseListener.Stub()
-        {
-            public void mousePressed(MouseEvent me) {
-                updateState(EVENT_HANDLE_SELECTED);
-            }
-        };
-        addMouseListener(_mouseListener);
-        
-        _menuSelectionListener = new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event) {
-                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                if (selection.size() == 0)
-                {
-                    // if the host part has been given back selection, then
-                    // we have a host selection event
-                    if (getOwner().getSelected() == EditPart.SELECTED_PRIMARY)
-                    {
-                        updateState(EVENT_HOST_SELECTION_RECEIVED);
-                    }
-                    // otherwise, both the host and the non-visual children are lost,
-                    // so fire all selection lost
-                    else
-                    {
-                        updateState(EVENT_ALL_SELECTION_LOST);
-                    }
-                }
-                // otherwise, one or more non-visual children have selection
-                else
-                {
-                    updateState(EVENT_MENU_BAR_SELECTION_RECEIVED);
-                }
-            }
-        };
-        _elementMenuBar.addSelectionChangedListener(_menuSelectionListener);
-    }
-    
-    public void paintFigure(Graphics g) {
-        // TODO: could we use an image label toggle button here instead?    
-        Image  arrowImage = null;
-        
-        if (_stateMachine.isMenuShowing())
-        {
-            arrowImage = PDPlugin.getDefault().getImage("pin_down.gif");
-        }
-        else
-        {
-            arrowImage = PDPlugin.getDefault().getImage("pin_up.gif");
-        }
-        
-        Rectangle r = getBounds();
-        g.setAlpha(75);
-        g.setBackgroundColor(getFillColor());
-        g.fillRectangle(r.x, r.y, r.width, r.height);
-        g.setAlpha(getAlpha());
-        g.drawImage(arrowImage, r.x+1, r.y+1);
-        g.setForegroundColor(getBorderColor()); 
-        g.drawRectangle(r.x, r.y, r.width-1, r.height-1);
-    }
-
-    /**
-     * @param newState
-     */
-    public void updateState(int event)
-    {
-        int oldState = _stateMachine.doTransition(event);
-        updateVisual(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;
-        
-        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;
-        }
-
-        public boolean isMenuShowing()
-        {
-            return isMenuShowing(_curState);
-        }
-
-        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 978ac51..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
-	 */
-	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
-	 */
-	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
-	 */
-	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 dfa02d4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/NonVisualChildGraphicalEditPolicy.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-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;
-    
-    
-    protected BasicLabelToolTip   _toolTip;
-    protected 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();
-    }
-
-    protected 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);
-        }
-    }
-    
-    protected String getTooltipText() {
-        Element element = (Element) ((NonVisualComponentEditPart)getHost()).getDOMNode();
-        StringBuffer text = new StringBuffer(element.getTagName());
-        return text.toString();
-    }
-    
-    protected 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);
-    }
-    
-    protected void removeMouseOverBorder()
-    {
-        if (_mouseOverBorder != null) {
-            removeFeedback(_mouseOverBorder);
-            _mouseOverBorder = null;
-        }
-    }
-    
-    protected List createSelectionHandles() {
-//        return super.createSelectionHandles();
-        return Collections.EMPTY_LIST;  
-    }
-
-    protected 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 48f4076..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PDEditPolicy.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.editpolicies;
-
-/**
- * @author mengbo
- */
-public interface PDEditPolicy {
-	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 2496013..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PolicyHelper.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.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.HTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class PolicyHelper {
-	private static Logger _log = PDPlugin.getLogger(PolicyHelper.class);
-
-	public static IStatusLineManager getStatusLineManager(EditPart part) {
-		EditPartViewer v = part.getViewer();
-		if (v instanceof HTMLGraphicalViewer) {
-			HTMLGraphicalViewer htmlviewer = (HTMLGraphicalViewer) v;
-			IStatusLineManager m = htmlviewer.getStatusLineManager();
-			if (m == null) {
-				_log.info("Warn.PolicyHelper.0", (String) null); //$NON-NLS-1$
-			}
-			return m;
-		}
-		_log.info("Warn.PolicyHelper.1", (String)null); //$NON-NLS-1$
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEdit.java
deleted file mode 100644
index ac2c123..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEdit.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit;
-
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.itemcreation.ITagCreator;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.AbstractDropCustomizer;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.IDropCustomizer;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.w3c.dom.Element;
-
-/**
- * <p><b>Provisional API - subject to change</b></p>
- * @author mengbo
- * @version 1.5
- */
-// TODO: should this be abstract?
-public class AbstractElementEdit implements IElementEdit {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-	 */
-	public void createEditPolicies(ElementEditPart part) {
-        // do nothing; sub-classes should override to add edit policies a part
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#handleModelChange(org.w3c.dom.Element,
-	 *      org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-	 */
-	public boolean handleModelChange(Element ele, ElementEditPart part,
-			boolean recursive) {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager,
-	 *      org.w3c.dom.Element)
-	 */
-	public void fillContextMenu(IMenuManager contextMenu, Element ele) {
-		// default do nothing, child class could override.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContainerContextMenu(org.eclipse.jface.action.IMenuManager,
-	 *      org.eclipse.jst.pagedesigner.parts.ElementEditPart,
-	 *      org.eclipse.jst.pagedesigner.parts.NodeEditPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public boolean fillContainerContextMenu(IMenuManager contextMenu,
-			ElementEditPart elePart, NodeEditPart nodePart,
-			ISelection innerSelection) {
-		return false;
-	}
-
-	/**
-	 * Child class should override this method if they have different way for
-	 * resizing. e.g. DataWindow use "width/height" attribute, not "style".
-	 * Also, the default ResizeCommand will adjust "style", so if child class
-	 * override this method, they should also use different command.
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy#getResizeCommand(org.eclipse.gef.requests.ChangeBoundsRequest)
-	 */
-	public boolean isResizable(Element ele) {
-		CMElementDeclaration decl = CMUtil.getElementDeclaration(ele);
-		if (decl != null) {
-			// XXX: default implementation, if this element support "style"
-			// attribute,
-			// then we think it support resize.
-			return decl.getAttributes().getNamedItem("style") != null;
-		}
-		return true;
-	}
-
-    /** 
-     * By default, return null to signal caller should use its default strategy
-     */
-    public IDropLocationStrategy getDropRequestorLocationStrategy(TagIdentifier tag, EditPartViewer viewer) {
-        return null;
-    }
-
-    private final static IDropCustomizer   DEFAULT_DROP_CUSTOMIZER = 
-        new AbstractDropCustomizer(){/* do nothing; use defaults */};
-    
-    public IDropCustomizer getDropCustomizer(TagIdentifier tagId) 
-    {
-        return DEFAULT_DROP_CUSTOMIZER;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#getTagCreator(org.eclipse.jst.jsf.common.dom.TagIdentifier)
-     */
-    public ITagCreator getTagCreator(TagIdentifier tagId) 
-    {
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEditFactory.java
deleted file mode 100644
index b778788..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEditFactory.java
+++ /dev/null
@@ -1,31 +0,0 @@
-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 5e91f07..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFacRegistryReader.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.elementedit;
-
-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;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ElementEditFacRegistryReader {
-	static IElementEditFactory[] _handlers = null;
-
-	/**
-	 * @return all available handers for the ext-pt
-	 */
-	public static synchronized IElementEditFactory[] getAllHandlers() {
-		if (_handlers == null) {
-			_handlers = readAllHandlers();
-		}
-		return _handlers;
-
-	}
-
-	private static IElementEditFactory[] readAllHandlers() {
-		List result = new ArrayList();
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint(PDPlugin.getPluginId(),
-						IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-		IExtension[] extensions = extensionPoint.getExtensions();
-
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension ext = extensions[i];
-			IConfigurationElement[] dropHandlers = ext
-					.getConfigurationElements();
-
-			for (int j = 0; j < dropHandlers.length; j++) {
-				if (dropHandlers[j].getName().equals(
-						IJMTConstants.ELEMENT_EDIT_FACTORY)) {
-					dropHandlers[j].getAttribute("class");
-					Object obj;
-					try {
-						obj = dropHandlers[j]
-								.createExecutableExtension("class");
-
-						if (obj instanceof IElementEditFactory) {
-							result.add(obj);
-						}
-					} catch (CoreException e) {
-						// ignore the exception
-						e.printStackTrace();
-					}
-				}
-			}
-		}
-		IElementEditFactory[] ret = new IElementEditFactory[result.size()];
-		result.toArray(ret);
-		return ret;
-	}
-
-}
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 198a4c3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFactoryRegistry.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.elementedit;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.elementedit.html.HTMLElementEditFactory;
-import org.eclipse.jst.pagedesigner.elementedit.jsp.JSPElementEditFactory;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ElementEditFactoryRegistry {
-	List _factories = new ArrayList();
-
-	private static ElementEditFactoryRegistry _instance;
-
-	/**
-	 * 
-	 */
-	private ElementEditFactoryRegistry() {
-		addFactory(new HTMLElementEditFactory());
-        addFactory(new JSPElementEditFactory());
-
-		IElementEditFactory facs[] = ElementEditFacRegistryReader
-				.getAllHandlers();
-		if (facs != null) {
-			for (int i = 0; i < facs.length; i++) {
-				addFactory(facs[i]);
-			}
-		}
-	}
-
-	/**
-	 * Add a factory to list available.
-	 * 
-	 * @param fac
-	 */
-	public void addFactory(IElementEditFactory fac) {
-		_factories.add(fac);
-	}
-
-    /**
-     * @param tagIdentifier 
-     * @return an IElementEdit constructed for the tag uniquely identified
-     * by the ns uri (tag uri for JSP tags) and tagName (element name) or null
-     * if the system can't create one.
-     */
-    public IElementEdit createElementEdit(final TagIdentifier tagIdentifier)
-    {
-        final String uri = tagIdentifier.getUri();
-        
-        // first round, match uri
-        for (int i = 0, size = _factories.size(); i < size; i++) {
-            IElementEditFactory fac = (IElementEditFactory) _factories.get(i);
-            String facuri = fac.getSupportedURI();
-            if (facuri != null && facuri.equals(uri)) {
-                IElementEdit elementEdit = fac.createElementEdit(tagIdentifier);
-                if (elementEdit != null) {
-                    return elementEdit;
-                }
-            }
-        }
-        // second round
-        for (int i = 0, size = _factories.size(); i < size; i++) {
-            IElementEditFactory fac = (IElementEditFactory) _factories.get(i);
-            String facuri = fac.getSupportedURI();
-            if (facuri == null) {
-                IElementEdit elementEdit = fac.createElementEdit(tagIdentifier);
-                if (elementEdit != null) {
-                    return elementEdit;
-                }
-            }
-        }
-        return null;
-    }
-    
-	/**
-     * Convenience method for createElementEdit(uri, tagName) that takes
-     * a tag element.
-     * 
-	 * @param ele
-	 * @return an element edit
-	 */
-	public IElementEdit createElementEdit(Element ele) {
-		final TagIdentifier tagIdentifier = TagIdentifierFactory.createDocumentTagWrapper(ele);
-        return createElementEdit(tagIdentifier);
-	}
-
-	/**
-	 * @return the single instance of the factory registry
-	 */
-	public static ElementEditFactoryRegistry getInstance() {
-		if (_instance == null) {
-			_instance = new ElementEditFactoryRegistry();
-		}
-		return _instance;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEdit.java
deleted file mode 100644
index bdd91a3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEdit.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit;
-
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.itemcreation.ITagCreator;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.IDropCustomizer;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-import org.w3c.dom.Element;
-
-/**
- * IElementEdit support additional edit support to an element.
- * 
- * This interface should not be extended by clients.  Extend AbstractElementEdit
- * instead.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IElementEdit 
-{
-	/**
-	 * override default edit policies on part
-	 * @param part
-	 */
-	public void createEditPolicies(ElementEditPart part);
-
-	/**
-	 * The element (or its decendent) changed.
-	 * 
-	 * @param ele
-	 * @param part
-	 * @param recursive 
-	 * @return handle model changes on part.
-	 */
-	public boolean handleModelChange(Element ele, ElementEditPart part,
-			boolean recursive);
-
-	/**
-	 * Add special menu items for the particular element to the context menu.
-	 * 
-	 * @param contextMenu
-	 * @param ele 
-	 */
-	public void fillContextMenu(IMenuManager contextMenu, Element ele);
-
-	/**
-	 * This method is called when current selection is inside "ele". And this
-	 * method should fill in menu items relating to the "ele" context and the
-	 * current "innerSelection". For example, this "ele" could be a table,
-	 * "innerSelection" could be something inside a cell. Then could fill in
-	 * actions relating to the table and the cell, such as "add row before",
-	 * "delete current column", etc.
-	 * 
-	 * @param contextMenu
-	 * @param elePart
-	 *            the elementeditpart corresponding to this ElementEdit
-	 * @param nodePart
-	 *            the smallest part covers the current selection. nodePart will
-	 *            always be a decedent of the elePart.
-	 * @param innerSelection
-	 *            the selection
-	 * @return true if added actions.
-	 */
-	public boolean fillContainerContextMenu(IMenuManager contextMenu,
-			ElementEditPart elePart, NodeEditPart nodePart,
-			ISelection innerSelection);
-
-	/**
-	 * whether the corresponding element support resize. If it does, then the
-	 * corresponding policy installed through <code>createEditPolicies</code>
-	 * should handle resize.
-	 * @param ele 
-	 * 
-	 * @return true if ele has resize support
-	 */
-	public boolean isResizable(Element ele);
-    
-    /**
-     * @param tag the element to return a drop location strategy for.
-     * This is the requesting element (being dropped), not the drop target
-     * 
-     * @param viewer is the viewer where the new strategy will optionally
-     * add feedback
-     * 
-     * @return the strategy to be used to use to find a drop location when
-     * the corresponding element is being dropped (the source part).  May
-     * be null signalling that the caller should use its default strategy.
-     * 
-     */
-     public IDropLocationStrategy getDropRequestorLocationStrategy(TagIdentifier tag, EditPartViewer viewer);
-
-    /**
-     * @param tagId 
-     * @return the drop customizer for this edit's element.  May return null.
-     * Returning null and returning a IDropCustomizer whose runCustomizer always returns
-     * OK and getDropCustomizationData always returns null will be considered 
-     * equivalent by the framework.
-     */
-    public IDropCustomizer getDropCustomizer(TagIdentifier tagId);
-    
-    /**
-     * @param tagId
-     * @return a tag creator for the indicated tag or null to indicate that the
-     * system should use it's default tag creator
-     */
-    public ITagCreator getTagCreator(TagIdentifier tagId);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEditFactory.java
deleted file mode 100644
index 052275a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEditFactory.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-
-
-/**
- * @author mengbo
- * @version 1.5
- * 
- * Clients should not implement this interface.  Extend AbstractElementEditFactory instead.
- */
-public interface IElementEditFactory {
-	/**
-	 * 
-	 * @param tag
-	 * @return null if this factory don't support this element
-	 */
-	public IElementEdit createElementEdit(TagIdentifier tag);
-
-	/**
-	 * get the URI namespace that this factory support. "null" means this
-	 * factory can be used as default factory.
-	 * 
-	 * @return null if this factory don't have a specific URI to support.
-	 */
-	public String getSupportedURI();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HTMLElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HTMLElementEditFactory.java
deleted file mode 100644
index f4804c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HTMLElementEditFactory.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.html;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class HTMLElementEditFactory implements IElementEditFactory 
-{
-    final static TagIdentifier HTMLTABLE_TAG_IDENTIFIER =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_HTML, IHTMLConstants.TAG_TABLE);
-    
-    /*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#createElementEdit(org.w3c.dom.Element)
-	 */
-	public IElementEdit createElementEdit(TagIdentifier tagIdentifier) {
-		if (HTMLTABLE_TAG_IDENTIFIER.isSameTagType(tagIdentifier)) {
-			return new TableElementEdit();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#getSupportedURI()
-	 */
-	public String getSupportedURI() {
-		return ITLDConstants.URI_HTML;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/TableElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/TableElementEdit.java
deleted file mode 100644
index 31b9127..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/TableElementEdit.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.html;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.single.SelectEditPartAction;
-import org.eclipse.jst.pagedesigner.commands.html.TableDeleteColumnCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableDeleteHeaderFooterCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableDeleteRowCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableInsertColumnCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableInsertHeaderFooterCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableInsertRowCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableResizeColumnCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableResizeRowCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableChildElementPosition;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.tableedit.DeleteHeaderFooterAction;
-import org.eclipse.jst.pagedesigner.tableedit.DeleteHeaderFooterRequest;
-import org.eclipse.jst.pagedesigner.tableedit.DeleteRowColumnAction;
-import org.eclipse.jst.pagedesigner.tableedit.InsertHeaderFooterAction;
-import org.eclipse.jst.pagedesigner.tableedit.InsertHeaderFooterRequest;
-import org.eclipse.jst.pagedesigner.tableedit.InsertRowColumnAction;
-import org.eclipse.jst.pagedesigner.tableedit.TableInsertRequest;
-import org.eclipse.jst.pagedesigner.tableedit.TableResizableEditPolicy;
-import org.eclipse.jst.pagedesigner.tableedit.TableResizeRequest;
-import org.eclipse.jst.pagedesigner.tableedit.TableRowColumnDeleteRequest;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableElementEdit extends AbstractElementEdit {
-	private final static Action action = new Action() {
-        // TODO: what's this for?
-	};
-
-	private static int FAKE_INDEX = -10;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager,
-	 *      org.w3c.dom.Element)
-	 */
-	public void fillContextMenu(IMenuManager contextMenu, Element ele) {
-		final IMenuManager tableMenu = new MenuManager(PDPlugin
-				.getResourceString("ElementEdit.Submenu.Table"));//$NON-NLS-1$
-		tableMenu.add(action);
-		final ElementEditPart tablePart = (ElementEditPart) ((IDOMElement) ele)
-				.getAdapterFor(EditPart.class);
-		// ok, we passed the checking, now let's create the actions.
-		tableMenu.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				tableMenu.removeAll();
-				fillTableMenu(tablePart, FAKE_INDEX, FAKE_INDEX, tableMenu);
-			}
-		});
-
-		contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER,
-				tableMenu);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#fillContainerContextMenu(org.eclipse.jface.action.IMenuManager,
-	 *      org.eclipse.jst.pagedesigner.parts.ElementEditPart,
-	 *      org.eclipse.jst.pagedesigner.parts.NodeEditPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public boolean fillContainerContextMenu(IMenuManager contextMenu,
-			final ElementEditPart tablePart, NodeEditPart nodePart,
-			ISelection innerSelection) {
-		super.fillContainerContextMenu(contextMenu,
-				tablePart, nodePart, innerSelection);
-
-		Element table = (Element) tablePart.getModel();
-		Node node = (Node) nodePart.getModel();
-
-		TableChildElementPosition position = new TableUtil(table)
-				.getPosition(node);
-		final int cellRow = position.getRowIndex();
-		final int cellColumn = position.getColumnIndex();
-
-		final IMenuManager tableMenu = new MenuManager(PDPlugin
-				.getResourceString("ElementEdit.Submenu.Table"));//$NON-NLS-1$
-		tableMenu.add(action);
-		// ok, we passed the checking, now let's create the actions.
-		tableMenu.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				tableMenu.removeAll();
-				fillTableMenu(tablePart, cellRow, cellColumn, tableMenu);
-			}
-		});
-
-		contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER,
-				tableMenu);
-		return true;
-	}
-
-	/**
-	 * @param tablePart
-	 * @param cellRow
-	 * @param cellColumn
-	 * @param tableMenu
-	 */
-	private void fillTableMenu(ElementEditPart tablePart, int cellRow,
-			int cellColumn, IMenuManager tableMenu) {
-		SelectEditPartAction action1 = SelectEditPartAction.create(
-				PDPlugin.getResourceString("ElementEdit.Submenu.SelectTable"), tablePart);//$NON-NLS-1$
-		tableMenu.add(action1);
-
-		tableMenu.add(new Separator());
-
-		{
-			InsertRowColumnAction insertRowBeforeAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertRowBefore"),//$NON-NLS-1$
-					tablePart, cellRow, true, true);
-			tableMenu.add(insertRowBeforeAction);
-
-			InsertRowColumnAction insertRowAfterAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertRowAfter"),//$NON-NLS-1$
-					tablePart, cellRow, true, false);
-			tableMenu.add(insertRowAfterAction);
-
-			tableMenu.add(new Separator());
-		}
-
-		{
-			InsertRowColumnAction insertColumnBeforeAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertColumnBefore"),//$NON-NLS-1$
-					tablePart, cellColumn, false, true);
-			tableMenu.add(insertColumnBeforeAction);
-
-			InsertRowColumnAction insertColumnAfterAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertColumnAfter"),//$NON-NLS-1$
-					tablePart, cellColumn, false, false);
-			tableMenu.add(insertColumnAfterAction);
-
-			tableMenu.add(new Separator());
-		}
-
-		{
-			DeleteRowColumnAction deleteRowAction = new DeleteRowColumnAction(
-					PDPlugin.getResourceString("ElementEdit.Submenu.DeleteRow"),//$NON-NLS-1$
-					tablePart, cellRow, true);
-			tableMenu.add(deleteRowAction);
-
-			DeleteRowColumnAction deleteColumnAction = new DeleteRowColumnAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.DeleteColumn"),//$NON-NLS-1$
-					tablePart, cellColumn, false);
-			tableMenu.add(deleteColumnAction);
-			tableMenu.add(new Separator());
-		}
-
-		{
-			InsertHeaderFooterAction headerAction = new InsertHeaderFooterAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertHeader"), tablePart, true);//$NON-NLS-1$
-			tableMenu.add(headerAction);
-			InsertHeaderFooterAction footerAction = new InsertHeaderFooterAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertFooter"), tablePart, false);//$NON-NLS-1$
-			tableMenu.add(footerAction);
-			DeleteHeaderFooterAction delHeaderAction = new DeleteHeaderFooterAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.DeleteHeader"), tablePart, true);//$NON-NLS-1$
-			tableMenu.add(delHeaderAction);
-			DeleteHeaderFooterAction delFooterAction = new DeleteHeaderFooterAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.DeleteFooter"), tablePart, false);//$NON-NLS-1$
-			tableMenu.add(delFooterAction);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-	 */
-	public void createEditPolicies(ElementEditPart part) {
-		part.installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE,
-				new TableResizePolicy(part));
-	}
-
-	static class TableResizePolicy extends TableResizableEditPolicy {
-		ElementEditPart _part;
-
-		/**
-		 * @param part
-		 */
-		public TableResizePolicy(ElementEditPart part) {
-			_part = part;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#getCommand(org.eclipse.gef.Request)
-		 */
-		public Command getCommand(Request request) {
-			IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) _part
-					.getViewer();
-			Element table = (Element) _part.getIDOMNode();
-			if (request instanceof TableResizeRequest) {
-				TableResizeRequest trq = (TableResizeRequest) request;
-				if (trq.isRow()) {
-					return new TableResizeRowCommand(viewer, table, trq
-							.getIndex(), trq.getDelta());
-				}
-                return new TableResizeColumnCommand(viewer, table, trq
-                		.getIndex(), trq.getDelta());
-			} else if (request instanceof TableInsertRequest) {
-				TableInsertRequest tableInsertRequest = (TableInsertRequest) request;
-				int index = tableInsertRequest.getIndex()
-						+ (tableInsertRequest.isBefore() ? 0 : 1);
-				if (tableInsertRequest.isRow()) {
-					return new TableInsertRowCommand(viewer, table, index,
-							tableInsertRequest.isBefore());
-				}
-                return new TableInsertColumnCommand(viewer, table, index);
-			} else if (request instanceof TableRowColumnDeleteRequest) {
-				TableRowColumnDeleteRequest deleteReq = (TableRowColumnDeleteRequest) request;
-				if (deleteReq.isRow()) {
-					return new TableDeleteRowCommand(viewer, table, deleteReq
-							.getIndex());
-				}
-                return new TableDeleteColumnCommand(viewer, table,
-                		deleteReq.getIndex());
-			} else if (request instanceof InsertHeaderFooterRequest) {
-				InsertHeaderFooterRequest hfRequest = (InsertHeaderFooterRequest) request;
-				return new TableInsertHeaderFooterCommand(viewer, table,
-						hfRequest.isHeader());
-			} else if (request instanceof DeleteHeaderFooterRequest) {
-				DeleteHeaderFooterRequest hfRequest = (DeleteHeaderFooterRequest) request;
-				return new TableDeleteHeaderFooterCommand(viewer, table,
-						hfRequest.isHeader());
-			}
-			return super.getCommand(request);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/JSPElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/JSPElementEditFactory.java
deleted file mode 100644
index 9dc4f9e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/JSPElementEditFactory.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.jsp;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSPElementEditFactory implements IElementEditFactory 
-{
-    final static TagIdentifier TAG_DIRECTIVE_TAGLIB_TAG_IDENTIFIER =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSP, IJSPCoreConstants.TAG_DIRECTIVE_TAGLIB);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#createElementEdit(org.w3c.dom.Element)
-	 */
-	public IElementEdit createElementEdit(TagIdentifier tagIdentifier) {
-		if (TAG_DIRECTIVE_TAGLIB_TAG_IDENTIFIER.isSameTagType(tagIdentifier)) {
-			return new TaglibElementEdit();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#getSupportedURI()
-	 */
-	public String getSupportedURI() {
-		return ITLDConstants.URI_JSP;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibElementEdit.java
deleted file mode 100644
index 9c82880..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibElementEdit.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.jsp;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TaglibElementEdit extends AbstractElementEdit {
-	private TaglibURIAction action;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager,
-	 *      org.w3c.dom.Element)
-	 */
-	public void fillContextMenu(IMenuManager contextMenu, Element ele) {
-		super.fillContextMenu(contextMenu, ele);
-
-		TaglibURIAction action1 = getAction();
-
-		action1.setURI(ele.getAttribute(ICSSPropertyID.ATTR_URI));
-
-		action1.setElement(ele);
-
-        contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_SPECIAL,
-				action1);
-	}
-
-	private TaglibURIAction getAction() {
-		if (action == null) {
-			action = new TaglibURIAction();
-		}
-		return action;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibURIAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibURIAction.java
deleted file mode 100644
index 5ec429a..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 51dd66d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/IContextMenuItemContributor.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.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 {
-	void setURI(String uri);
-
-	String getURI();
-
-	void fillContextMenu(IMenuManager manager, ISelection selection,
-			IStructuredModel model, Control parentUI);
-}
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 eb93312..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/AbstractFigureHandler.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.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?
-	}
-
-	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;
-	}
-
-	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 78f3fec..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/BRFigureHandler.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.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 {
-	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 82406a2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/FigureFactory.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.pagedesigner.PDPlugin;
-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.utils.HTMLUtil;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-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 class FigureFactory {
-	// public static IFigure createFigure(Element ele, boolean deep)
-	// {
-	// IFigureHandler handler = createAndAdapt(ele);
-	// IFigure figure = handler.createFigure(ele);
-	//
-	// if (deep && !handler.isWidget())
-	// {
-	// NodeList children = ele.getChildNodes();
-	// for (int i = 0, size = children.getLength(); i < size; i++)
-	// {
-	// createFigureDeep(figure, children.item(i));
-	// }
-	// }
-	// return figure;
-	// }
-
-	/**
-	 * @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);
-		}
-	}
-
-	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;
-	}
-
-	public static void updateNonDeepFigure(Element ele, CSSFigure figure) {
-		IFigureHandler handler = getHandler(ele);
-		if (handler == null) {
-			handler = createAndAdapt(ele);
-		}
-		handler.updateFigure(ele, figure);
-	}
-
-	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);
-			}
-		}
-	}
-
-	static void disposeAndUnadapt(Element ele) {
-		IFigureHandler handler = getHandler(ele);
-		if (handler != null) {
-			handler.dispose();
-			((IDOMElement) ele).removeAdapter(handler);
-		}
-	}
-
-	static IFigureHandler getHandler(Element ele) {
-		if (ele instanceof IDOMElement) {
-			IDOMElement xmlele = (IDOMElement) ele;
-			return (IFigureHandler) xmlele.getAdapterFor(IFigureHandler.class);
-		}
-		return null;
-	}
-
-	static IFigureHandler createAndAdapt(Element ele) {
-		IFigureHandler handler = createFigureHandler(ele);
-		if (ele instanceof IDOMElement) {
-			((IDOMElement) ele).addAdapter(handler);
-		}
-		return handler;
-	}
-
-	static IFigureHandler createFigureHandler(Element ele) {
-		String tag = ele.getTagName();
-		if ("input".equalsIgnoreCase(tag)) {
-			return new InputFigureHandler();
-		} else if ("select".equalsIgnoreCase(tag)) {
-			return new SelectFigureHandler();
-		} else if ("img".equalsIgnoreCase(tag)) {
-			return new ImgFigureHandler();
-		} else if ("object".equalsIgnoreCase(tag)) {
-			return new ObjectFigureHandler();
-		} else if ("textarea".equalsIgnoreCase(tag)) {
-			return new TextareaFigureHandler();
-		} else if ("br".equalsIgnoreCase(tag)) {
-			return new BRFigureHandler();
-		} else if (!HTMLUtil.isVisualHtmlElement(tag)) {
-			return new HiddenFigureHandler(getSharedHTMLImage(tag));
-		} else {
-			return new DefaultFigureHandler();
-		}
-	}
-
-	/**
-	 * @param tag
-	 * @return
-	 */
-	private static Image getSharedHTMLImage(String tag) {
-		Image image = PDPlugin.getDefault().getImage(
-				"palette/HTML/small/HTML_" + tag.toUpperCase() + ".gif");
-		ImageData imageData = image.getImageData();
-		if (imageData.width < 16 || imageData.height < 16) {
-			return PDPlugin.getDefault().getImage(
-					"palette/GENERIC/small/PD_Palette_Default.gif");
-		}
-		return image;
-	}
-}
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 0d94757..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/HiddenFigureHandler.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.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
- */
-public class HiddenFigureHandler extends WidgetFigureHandler {
-	Image _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 8283a48..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/IFigureHandler.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.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 {
-	public void updateFigure(Element node, CSSFigure oldFigure);
-
-	public void dispose();
-
-	public boolean isWidget();
-
-	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 46ca9ac..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/ImgFigureHandler.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.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
- */
-public class ImgFigureHandler extends WidgetFigureHandler {
-	protected Image _image;
-
-	/**
-	 * child class can override this method.
-	 * 
-	 * @param node
-	 */
-	protected void initializeImage(Element node) {
-		if (_image != null) {
-			_image.dispose();
-		}
-		_image = ImageResolver.initializeImage(node, "src");
-	}
-
-	public void dispose() {
-		if (_image != null) {
-			_image.dispose();
-			_image = null;
-		}
-	}
-
-	protected ICSSWidgetProvider initializeWidgetProvider(Element ele) {
-		initializeImage(ele);
-		ImageWidgetProvider provider = new ImageWidgetProvider(_image,
-				getCSSStyle(ele));
-		return provider;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/InputFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/InputFigureHandler.java
deleted file mode 100644
index 68c6d49..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/InputFigureHandler.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.PDPlugin;
-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
- */
-public class InputFigureHandler extends WidgetFigureHandler {
-	private Image _image;
-
-	void initializeImage(Element node) {
-		if (_image != null) {
-			_image.dispose();
-		}
-		_image = ImageResolver.initializeImage(node, "src");
-	}
-
-	ImageWidgetProvider getImageProvider(Element node) {
-		initializeImage(node);
-		ImageWidgetProvider provider = new ImageWidgetProvider(_image,
-				getCSSStyle(node));
-		return provider;
-	}
-
-	ICSSWidgetProvider getButtonProvider(Element node) {
-		ButtonWidgetProvider provider = new ButtonWidgetProvider(
-				getCSSStyle(node));
-		provider.setValue(getButtonValue(node));
-		return provider;
-	}
-
-	ICSSWidgetProvider getFileProvider(Element node) {
-		// ICSSWidgetProvider textprovider = getTextInputProvider();
-		// // XXX: should we use the defaultstyle for the button?
-		// ButtonWidgetProvider browsebutton = new
-		// ButtonWidgetProvider(getCSSStyle());
-		// browsebutton.setValue("Browse...");
-		// CompositeWidgetProvider provider = new
-		// CompositeWidgetProvider(getCSSStyle(), textprovider, browsebutton,
-		// false);
-		// return provider;
-		ICSSWidgetProvider textprovider = getTextInputProvider(node);
-		// XXX: should we use the defaultstyle for the button?
-		ButtonWidgetProvider browsebutton = new ButtonWidgetProvider(
-				getCSSStyle(node));
-		browsebutton.setValue("Browse...");
-		InputFileWidgetProvider provider = new InputFileWidgetProvider(
-				getCSSStyle(node), textprovider, browsebutton);
-		return provider;
-	}
-
-	/**
-	 * should not return null
-	 * 
-	 * @return
-	 */
-	protected Image getHiddenImage() {
-		return PDPlugin.getDefault().getImage(
-				"palette/GENERIC/small/PD_Palette_Default.gif");
-	}
-
-	ICSSWidgetProvider getHiddenProvider(Element node) {
-		return new HiddenProvider(getHiddenImage(), node);
-	}
-
-	ICSSWidgetProvider getPasswordProvider(Element node) {
-		TextInputWidgetProvider provider = new TextInputWidgetProvider(
-				getCSSStyle(node), TextInputWidgetProvider.PWD_SIZE);
-		provider.setSize(getSize(node));
-		provider.setValue("********");
-		return provider;
-	}
-
-	ICSSWidgetProvider getTextInputProvider(Element node) {
-		TextInputWidgetProvider provider = new TextInputWidgetProvider(
-				getCSSStyle(node));
-		provider.setSize(getSize(node));
-		provider.setValue(getValue(node));
-		return provider;
-	}
-
-	private int getSize(Element node) {
-		String s = DOMUtil.getAttributeIgnoreCase(node, "size");
-		try {
-			if (s != null) {
-				return Integer.parseInt(s);
-			}
-		} catch (NumberFormatException  ex) {
-            // suppress and fall-through; return 0
-		}
-        return 0;
-	}
-
-	/**
-	 * @return
-	 */
-	private String getValue(Element node) {
-		return DOMUtil.getAttributeIgnoreCase(node, "value");
-	}
-
-	private String getButtonValue(Element node) {
-		String value = getValue(node);
-		if (value == null) {
-			String type = DOMUtil.getAttributeIgnoreCase(node,
-					ICSSPropertyID.ATTR_TYPE);
-			if (type.equalsIgnoreCase(ICSSPropertyID.VAL_SUBMIT)) {
-				return "Submit Query";
-			} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_RESET)) {
-				return "Reset";
-			}
-		}
-		return value;
-	}
-
-	/**
-	 * @return
-	 */
-	protected ICSSWidgetProvider initializeWidgetProvider(Element node) {
-		reset();
-
-		String type = DOMUtil.getAttributeIgnoreCase(node,
-				ICSSPropertyID.ATTR_TYPE);
-
-		if (type == null) {
-			return getTextInputProvider(node);
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_SUBMIT)
-				|| type.equalsIgnoreCase(ICSSPropertyID.VAL_RESET)
-				|| type.equalsIgnoreCase(ICSSPropertyID.VAL_BUTTON)) {
-			return getButtonProvider(node);
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_IMAGE)) {
-			return getImageProvider(node);
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_FILE)) {
-			return getFileProvider(node);
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_RADIO)) {
-			RadioWidgetProvider provider = new RadioWidgetProvider(
-					getCSSStyle(node));
-			provider.setChecked(node.hasAttribute("checked"));
-			return provider;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_CHECKBOX)) {
-			CheckboxWidgetProvider provider = new CheckboxWidgetProvider(
-					getCSSStyle(node));
-			provider.setChecked(node.hasAttribute("checked"));
-			return provider;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_HIDDEN)) {
-			return getHiddenProvider(node);
-		}
-		if (type.equalsIgnoreCase(ICSSPropertyID.VAL_PASSWORD)) {
-			return getPasswordProvider(node);
-		}
-        return getTextInputProvider(node);
-	}
-
-	/**
-	 * 
-	 */
-	private void reset() {
-		if (_image != null) {
-			_image.dispose();
-			_image = null;
-		}
-	}
-
-	public void dispose() {
-		reset();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/ObjectFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/ObjectFigureHandler.java
deleted file mode 100644
index a608387..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/ObjectFigureHandler.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.figurehandler;
-
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ObjectFigureHandler extends ImgFigureHandler {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.figurehandler.ImgFigureHandler#initializeImage()
-	 */
-	protected void initializeImage(Element node) {
-		if (_image == null) {
-			_image = new Image(null, PDPlugin.getDefault().getImage(
-					"palette/HTML/small/HTML_OBJECT.gif").getImageData());
-		}
-	}
-}
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 35b65eb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/SelectFigureHandler.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.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
- */
-public class SelectFigureHandler extends WidgetFigureHandler {
-
-	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;
-	}
-
-	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;
-	}
-
-	protected boolean isMultiple(Element node) {
-		return DOMUtil
-				.getAttributeIgnoreCase(node, ICSSPropertyID.VAL_MULTIPLE) != null;
-	}
-
-	/**
-	 * @return
-	 */
-	protected 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 d92eee6..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
- */
-public class TextareaFigureHandler extends WidgetFigureHandler {
-	protected ICSSWidgetProvider initializeWidgetProvider(Element node) {
-		TextAreaWidgetProvider provider = new TextAreaWidgetProvider(
-				getCSSStyle(node));
-		String s = DOMUtil.getAttributeIgnoreCase(node, "cols");
-		if (s != null) {
-			try {
-				provider.setColumns(Integer.parseInt(s));
-			} catch (Exception ex) {
-				// ignore
-			}
-		}
-		s = DOMUtil.getAttributeIgnoreCase(node, "rows");
-		if (s != null) {
-			try {
-				provider.setRows(Integer.parseInt(s));
-			} catch (Exception ex) {
-				// ignore
-			}
-		}
-		s = DOMUtil.getTextElementValue(node);
-		if (s != null) {
-			provider.setValue(s);
-		}
-		return provider;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/WidgetFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/WidgetFigureHandler.java
deleted file mode 100644
index 3f3fa28..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/WidgetFigureHandler.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.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;
-
-public abstract class WidgetFigureHandler extends AbstractFigureHandler {
-
-	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));
-	}
-
-	protected abstract ICSSWidgetProvider initializeWidgetProvider(Element ele);
-
-	public boolean isWidget() {
-		return true;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/AbstractTagCreationAdvisor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/AbstractTagCreationAdvisor.java
deleted file mode 100644
index 6f05ef6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/AbstractTagCreationAdvisor.java
+++ /dev/null
@@ -1,116 +0,0 @@
-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 nnecessary 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 98b747f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/AbstractTagCreator.java
+++ /dev/null
@@ -1,126 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * The abstract class from which all client ITagCreator instances
- * should be derived.
- * 
- * The createTag method enforces a set of steps required by the framework
- * to create a new tag.  However, it allows you to configure some of the steps
- * by providing an ITagCreationAdvisor through the doSelectCreationAdvisor.
- *
- * <p><b>Provisional API - subject to change</b></p>
- *
- * @author cbateman
- *
- */
-public abstract class AbstractTagCreator implements ITagCreator 
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.ITagCreator#createTag(org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry, org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel, org.eclipse.jst.pagedesigner.dom.IDOMPosition)
-     */
-    public final Element createTag(final CreationData creationData) 
-    {
-        final ITagCreationAdvisor  advisor = selectCreationAdvisor(creationData);
-        
-        // adjust the creation position to accommodate required containers
-        final IDOMPosition position = 
-            advisor.checkAndApplyNecessaryContainers(creationData.getModel(), creationData.getDomPosition());
-        
-        if (position == null) return null;//throw exception?
-
-        creationData.setAdjustedPosition(position);
-        
-        // create the element
-        final Element ele =  createElement(creationData);
-        if (ele == null) return null;//throw exception?
-
-        // apply tag customization
-        advisor.applyCustomization(creationData.getModel(), ele);
-
-        // ensure that any attributes required by the tag's definition
-        // is initialized.
-        // TODO: a drawback of this approach is that it leaves the tag in
-        // a state where there are no error flags to tell the user something is
-        // missing, but may initialize the tag with an (empty) invalid value
-        //ensureRequiredAttrs(ele, creationData);
-
-        addTagToContainer(position, ele);
-
-        return ele;
-    }
-
-    private ITagCreationAdvisor selectCreationAdvisor(CreationData creationData)
-    {
-        ITagCreationAdvisor advisor  = doSelectCreationAdvisor(creationData);
-
-        // enforce that the advisor must be an AbstractTagCreationAdvisor to 
-        // avoid using the default (not this case also covers advisor == null)
-        if (! (advisor instanceof AbstractTagCreationAdvisor))
-        {
-            advisor = new DefaultTagCreationAdvisor(creationData);
-        }
-
-        return advisor;
-    }
-    
-    /**
-     * @param creationData
-     * @return a tag creation advisor or null to indicate the use of the system default
-     */
-    protected abstract ITagCreationAdvisor doSelectCreationAdvisor(CreationData creationData);
-
-    /**
-     * @param creationData 
-     * @return {@link Element}
-     */
-    protected final Element createElement(final CreationData creationData)
-    {
-        Element ele =  creationData.getModel().getDocument().createElement(creationData.getTagName());
-        if (ele == null) return null;
-
-        //ugly... fix me
-        
-        // TODO: move this into an ensure method?
-        // XXX: we are using "startsWith("directive.")" to test whether
-        // should setJSPTag, this
-        // maybe is not the best way. Need check whether SSE have special
-        // API for it.
-        if (ITLDConstants.URI_JSP.equals(creationData.getUri())
-                && (ele.getLocalName().startsWith("directive.")
-                        || "declaration".equals(ele.getLocalName())
-                        || "expression".equals(ele.getLocalName()) || "scriptlet"
-                        .equals(ele.getLocalName()))) {
-            // it is a jsp tag
-            ((IDOMElement) ele).setJSPTag(true);
-        }
-
-        if (creationData.getPrefix() != null)
-        {
-            ele.setPrefix(creationData.getPrefix());
-        }
-
-        return ele;
-    }
-
-    /**
-     * @param position
-     * @param tagElement
-     */
-    private void addTagToContainer(final IDOMPosition position, final Element tagElement) {
-        if (position == null || position.getContainerNode() == null) {
-            return;
-        }
-
-        if (position.getNextSiblingNode() == null) {
-            position.getContainerNode().appendChild(tagElement);
-        } else {
-            position.getContainerNode().insertBefore(tagElement,
-                    position.getNextSiblingNode());
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/CreationData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/CreationData.java
deleted file mode 100644
index 9499c9e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/CreationData.java
+++ /dev/null
@@ -1,251 +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.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.TagToolPaletteEntry;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfo;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.PaletteInfos;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationInfo;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-
-/**
- * Value object that wraps creation data
- *  
- * <p><b>Provisional API - subject to change</b></p>
- *  
- * @author cbateman
- *
- */
-public final class CreationData
-{
-    private final TagToolPaletteEntry   _tagEntry;
-    private final String                _prefix; 
-    private final IDOMPosition          _domPosition;
-    private final IDOMModel             _model;
-    private final IAdaptable            _customizationData;
-    
-    private TagIdentifier               _tagId; // = null; lazy init on creation 
-    
-    /**
-     * The tag {@link Entity} being created
-     */
-    private Entity _tagEntity; // = null; lazy load because derived from
-                               // potentially expensive meta-data search
-    
-    /**
-     * The {@link ITaglibDomainMetaDataModelContext} for the tag creation
-     */
-    private final ITaglibDomainMetaDataModelContext _taglibMetaDataContext;
-
-    // mutable because it may be changed from the original _domPosition
-    private IDOMPosition _adjustedPosition;
-
-    
-    /**
-     * @param tagEntry  TODO: remove this direct dependence on the palette
-     * @param model 
-     * @param domPosition 
-     * @param taglibMetaDataContext 
-     * @param customizationData 
-     */
-    public CreationData(final TagToolPaletteEntry tagEntry, final IDOMModel model, final IDOMPosition domPosition, final ITaglibDomainMetaDataModelContext taglibMetaDataContext, final IAdaptable customizationData) 
-    {
-        super();
-        this._tagEntry = tagEntry;
-        this._prefix = getPrefix(getUri(), model, getDefaultPrefix());
-        this._taglibMetaDataContext = taglibMetaDataContext;
-        this._domPosition = domPosition;
-        this._adjustedPosition = _domPosition;
-        this._model = model;
-        this._customizationData = customizationData; 
-    }
-
-    /**
-     * Returns the ns prefix for the tag and also creates taglib reference if necessary
-     * @param uri
-     * @param model
-     * @param suggested
-     * @return prefix to use
-     */
-    protected static String getPrefix(String uri, IDOMModel model,
-            String suggested) {
-        // TODO: this shouldn't really add to the document
-        if (ITLDConstants.URI_HTML.equalsIgnoreCase(uri)
-                || ITLDConstants.URI_JSP.equalsIgnoreCase(uri)
-                || CMDocType.JSP11_DOC_TYPE.equalsIgnoreCase(uri)) {
-            return null;
-        }
-
-        // now handles custom tag lib
-        return JSPUtil.getOrCreatePrefix(model, uri, suggested);
-    }
-    
-    /**
-     * @return the tag identifier uri
-     */
-    public String getUri() {
-        return _tagEntry.getURI();
-    }
-
-    /**
-     * @return the default prefix
-     */
-    public String getDefaultPrefix() {
-        return _tagEntry.getDefaultPrefix();
-    }
-
-    /**
-     * @return the local prefix for the  tag
-     */
-    public String getPrefix() {
-        return _prefix;
-    }
-
-    /**
-     * @return the tag name
-     */
-    public String getTagName() {
-        return _tagEntry.getTagName();
-    }
-
-    /**
-     * @return the id
-     */
-    private String getItemId() {
-        return _tagEntry.getId();
-    }
-
-    /**
-     * @return the palette entry that this creation info is based on
-     */
-    public TagToolPaletteEntry getTagEntry() {
-        return _tagEntry;
-    }
-    
-    /**
-     * @return {@link TagCreationInfo} for the tag entity
-     */
-    public TagCreationInfo getTagCreationInfo(){
-        Model model = TaglibDomainMetaDataQueryHelper.getModel(_taglibMetaDataContext);
-        if (model != null){
-            Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model, PaletteInfos.TRAIT_ID);
-            if (trait != null){
-                PaletteInfos pis = (PaletteInfos)trait.getValue();
-                PaletteInfo pi = pis.findPaletteInfoById(getItemId());
-                if (pi != null){
-                    return pi.getTagCreation();                 
-                }
-            }
-            //tag-creation trait on entity directly?
-            Entity tag = getTagEntity();
-            if (tag != null){//metadata exists
-                trait = TaglibDomainMetaDataQueryHelper.getTrait(tag, "tag-create");
-                if (trait != null && trait.getValue() != null){
-                    return (TagCreationInfo)trait.getValue();                   
-                }
-            }
-        }
-        return null;
-    }
-
-    
-    /**
-     * @return the {@link Entity} for this tag element being created
-     */
-    public Entity getTagEntity() {
-        if (_tagEntity == null){
-            _tagEntity = TaglibDomainMetaDataQueryHelper.getEntity(_taglibMetaDataContext, getTagName());
-            
-        }
-        return _tagEntity;
-    }
-    
-    /**
-     * @return flag indicating that html form container ancestor is required
-     */
-    public boolean isHTMLFormRequired() {
-        Trait t = TaglibDomainMetaDataQueryHelper.getTrait(getTagEntity(), "requires-html-form");
-        if (t != null)
-            return TraitValueHelper.getValueAsBoolean(t);
-        
-        return false;
-    }
-    
-    /**
-     * @return flag indicating that jsf component
-     */
-    public boolean isJSFComponent() {      
-        Model model = TaglibDomainMetaDataQueryHelper.getModel(_taglibMetaDataContext);
-        Trait t = TaglibDomainMetaDataQueryHelper.getTrait(model, "is-jsf-component-library");
-        if (t != null)
-            return TraitValueHelper.getValueAsBoolean(t);
-        
-        return false;
-    }
-
-    /**
-     * @return the metadata context for the tag
-     */
-    public ITaglibDomainMetaDataModelContext getTaglibMetaDataContext() {
-        return _taglibMetaDataContext;
-    }
-
-    /**
-     * @return the original dom position of the tag creation
-     */
-    public IDOMPosition getDomPosition() {
-        return _domPosition;
-    }
-
-    /**
-     * @return the dom model
-     */
-    public IDOMModel getModel() 
-    {
-        return _model;
-    }
-
-    /**
-     * @return the adjusted position (calculated to account for containers etc.)
-     */
-    public IDOMPosition getAdjustedPosition() {
-        return _adjustedPosition;
-    }
-
-    /**
-     * @param adjustedPosition
-     */
-    /*package*/ void setAdjustedPosition(IDOMPosition adjustedPosition) {
-        _adjustedPosition = adjustedPosition;
-    }
-
-    /**
-     * @return the TagIdentifer for the tag to be created
-     */
-    public TagIdentifier getTagId() 
-    {
-        if (_tagId == null)
-        {
-            _tagId = TagIdentifierFactory.createJSPTagWrapper(getUri(), getTagName());
-        }
-        return _tagId;
-    }
-
-    /**
-     * @return the customization data passed in from the tool.  May be null.
-     */
-    public IAdaptable getDropCustomizationData() {
-        return _customizationData;
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/DefaultTagCreationAdvisor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/DefaultTagCreationAdvisor.java
deleted file mode 100644
index 4517801..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/DefaultTagCreationAdvisor.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.itemcreation.command.ContainerCreationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.command.ElementCustomizationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.command.SingletonContainerCreationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.command.TagContainerCreationCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * The default advisor.
- * 
- * Clients may extend this class.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class DefaultTagCreationAdvisor extends AbstractTagCreationAdvisor 
-{
-    /**
-     * @param creationData
-     */
-    public DefaultTagCreationAdvisor(CreationData creationData) 
-    {
-        super(creationData);
-    }
-
-    
-    @Override
-    protected ElementCustomizationCommand getElementCustomizationCommand(
-            IDOMModel model, Element tagElement) {
-        return new ElementCustomizationCommand(model, tagElement, _creationData);
-    }
-
-    /**
-     * @param position the initial drop position
-     * @return position after creating required containers
-     */
-    protected ContainerCreationCommand getContainerCreationCommand(final IDOMPosition position) {
-        if (_creationData.isJSFComponent()) {
-            return getJSFContainerCommand(position);
-        }
-        else if (_creationData.isHTMLFormRequired()){
-            return getHtmlFormCommand(position);
-        }
-        return null;
-    }
-    
-    /**
-     * @param position
-     * @return the default container creation command for a JSF tag
-     */
-    protected ContainerCreationCommand getJSFContainerCommand(final IDOMPosition position)
-    {
-        ContainerCreationCommand command = 
-            new SingletonContainerCreationCommand(position, IJSFConstants.TAG_IDENTIFIER_VIEW, _creationData.getTagId());
-        
-        if (_creationData.isHTMLFormRequired())
-        {
-            command.chain(new TagContainerCreationCommand(position, IJSFConstants.TAG_IDENTIFIER_FORM, _creationData.getTagId()));
-        }
-        
-        return command;
-    }
-    
-    /**
-     * @param position
-     * @return the default container creation command for an HTML form tag
-     */
-    protected ContainerCreationCommand getHtmlFormCommand(final IDOMPosition position)
-    {
-        return new TagContainerCreationCommand(position, IHTMLConstants.TAG_IDENTIFIER_HTML_FORM, _creationData.getTagId());
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreationAdvisor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreationAdvisor.java
deleted file mode 100644
index 92ff5c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreationAdvisor.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * An advisor object that allows customization of tag creation in an ITagCreator
- * 
- * Clients should *not* implement this interface.  Extend AbstractTagCreationAdvisor
- * or DefaultTagCreationAdvisor instead.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public interface ITagCreationAdvisor
-{
-    /**
-     * @param model
-     * @param domPosition
-     * @return a new IDOMPosition adjust for required containers or domPosition
-     * if no adjust is required.  ???May return null???
-     */
-    IDOMPosition checkAndApplyNecessaryContainers(IDOMModel model,
-            IDOMPosition domPosition);
-
-    /**
-     * Apply customization to tagElement.  May use to modify
-     * attributes and child elements of the tag.
-     * 
-     * @param model
-     * @param tagElement
-     * @param tagToolItem
-     */
-    void applyCustomization(IDOMModel model, Element tagElement);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreator.java
deleted file mode 100644
index c8d56e0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreator.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.w3c.dom.Element;
-
-/**
- * The interface type of all tag creators.
- * 
- * Clients should *not* implement this interface.  Extend AbstractTagCreator instead.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface ITagCreator {
-	/**
-	 * @param creationData 
-	 * @return W3C Element for the  tag at the correct position in the DOM.   May be null if creation cannot occur.
-	 */
-	public Element createTag(final CreationData creationData);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationEditPolicy.java
deleted file mode 100644
index 96929a0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationEditPolicy.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.CreateItemCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editpolicies.DropEditPolicy;
-import org.eclipse.jst.pagedesigner.tools.ExposeHelper;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.DnDPositionValidator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData.DropData;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class ItemCreationEditPolicy extends DropEditPolicy 
-{
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getCommand(org.eclipse.gef.Request)
-	 */
-	public Command getCommand(Request request) {
-		if (request instanceof ItemCreationRequest) {
-			ItemCreationRequest r = (ItemCreationRequest) request;
-			DesignPosition position = findPosition((ItemCreationRequest)request);
-            
-			if (position == null) {
-				return null;
-			}
-            IDOMPosition domposition = DOMPositionHelper.toDOMPosition(position);
-			if (domposition == null) {
-				return null;
-			}
-			return new CreateItemCommand(
-					PDPlugin
-							.getResourceString("ItemCreationEditPolicy.CommandLabel.CreateItem"),//$NON-NLS-1$
-					getViewer(getHost()).getModel(), domposition, r.getTagToolPaletteEntry());
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getTargetEditPart(org.eclipse.gef.Request)
-	 */
-	public EditPart getTargetEditPart(Request request) {
-		if (request instanceof ItemCreationRequest) {
-			DesignPosition position = findPosition((ItemCreationRequest)request);
-
-			if (position == null) {
-				return null;
-			}
-
-			EditPart container = position.getContainerPart();
-			return container;
-		}
-		return null;
-	}
-
-	/**
-	 * @param host
-	 * @return
-	 */
-	private IHTMLGraphicalViewer getViewer(EditPart host) {
-		return (IHTMLGraphicalViewer) ((GraphicalEditPart) host).getViewer();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#showTargetFeedback(org.eclipse.gef.Request)
-	 */
-	public void showTargetFeedback(Request request) 
-    {
-        if (request instanceof DropRequest 
-                && request.getType() == ItemCreationRequest.REQ_ITEM_CREATION)
-        {
-            super.showTargetFeedback(request);
-            if (getHost() instanceof GraphicalEditPart) {
-                ExposeHelper exposeHelper = new ExposeHelper(
-                        getViewer(getHost()));
-                exposeHelper.adjustVertical(((DropRequest)request).getLocation());
-            }
-        }
-	}
-
-	protected DesignPosition findPosition(DropRequest request) {
-        final IPositionMediator mediator = getDropChildValidator(request);
-        if (mediator == null)
-        {
-            return null;
-        }
-        
-        final IDropLocationStrategy dropStrategy = createDropLocationStrategy(request);
-        final DesignPosition position = 
-            dropStrategy.calculateDesignPosition(getHost(), request.getLocation(), mediator);
-        
-        // verify that the drop strategy has honoured it's contract that our
-        // mediator be respected
-        if (position != null)
-        {
-            if (!mediator.isValidPosition(position))
-            {
-                // if our mediator says no go, then veto the requestor
-                // there is no drop location
-                return null;
-            }
-        }
-        return position;
-    }
-
-    protected final IPositionMediator createDefaultDropChildValidator(DropData data) {
-        return new DnDPositionValidator(new DropActionData(
-                ActionData.PALETTE_DND, data));    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationRequest.java
deleted file mode 100644
index 27715c6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationRequest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-
-/**
- * Tag tool item creation request class
- * 
- * @author mengbo
- */
-public class ItemCreationRequest extends Request implements DropRequest {
-	/**
-	 * Constant used for item creation request
-	 */
-	public static final String REQ_ITEM_CREATION = "Item Creation";
-	/**
-	 * Constant used for tag tool item
-	 */
-	public static final String TAG_TOOL_PALETTE_ENTRY = "TagToolPaletteEntry";
-	/**
-	 * Constant used for location during creation request
-	 */
-	public static final String LOCATION = "location";
-	
-
-	/**
-	 * Constructor
-	 */
-	public ItemCreationRequest() {
-		super(REQ_ITEM_CREATION);
-	}
-
-	/**
-	 * Constructor
-	 * @param type
-	 */
-	public ItemCreationRequest(Object type) {
-		super(type);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.requests.DropRequest#getLocation()
-	 */
-	public Point getLocation() {
-		return (Point)getExtendedData().get(LOCATION);
-	}
-
-	/**
-	 * Sets the location where the new object will be placed.
-	 * 
-	 * @param location
-	 *            the location
-	 */
-	public void setLocation(Point location) {
-		getExtendedData().remove(LOCATION);
-		getExtendedData().put(LOCATION, location);
-	}
-
-	/**
-	 * Set the tag tool item for creation request
-	 * @param tagToolPaletteEntryItem
-	 */
-	public void setTagToolPaletteEntry(TagToolPaletteEntry tagToolPaletteEntryItem) {
-		getExtendedData().remove(TAG_TOOL_PALETTE_ENTRY);
-		getExtendedData().put(TAG_TOOL_PALETTE_ENTRY, tagToolPaletteEntryItem);
-	}
-
-	/**
-	 * @return {@link TagToolPaletteEntry} requesting creation
-	 */
-	public TagToolPaletteEntry getTagToolPaletteEntry() {
-		return (TagToolPaletteEntry)getExtendedData().get(TAG_TOOL_PALETTE_ENTRY);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationTool.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationTool.java
deleted file mode 100644
index 6a5fe6c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationTool.java
+++ /dev/null
@@ -1,325 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.SharedCursors;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.tools.TargetingTool;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.commands.CreateItemCommand;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.jst.pagedesigner.elementedit.ElementEditFactoryRegistry;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.IDropCustomizer;
-import org.eclipse.swt.graphics.Cursor;
-
-/**
- * This Tool is used to create items. It is to replace the default CreationTool
- * of GEF. We are not using CreationToolEntry for creating item, since the
- * default GEF implementation require creating of the object before drop into
- * the view. We do not want to create the XML element (and possibly its taglib
- * declaration) before the drop is really performed.)
- * 
- * @author mengbo
- */
-public class ItemCreationTool extends TargetingTool {
-	TagToolPaletteEntry _tagPaletteItem; //can we get rid of this?
-
-	/**
-	 * Default constructor. Sets the default and disabled cursors.
-	 * @param tagToolPaletteEntryItem 
-	 */
-	public ItemCreationTool(TagToolPaletteEntry tagToolPaletteEntryItem) {
-		setDefaultCursor(SharedCursors.CURSOR_TREE_ADD);
-		setDisabledCursor(SharedCursors.NO);
-
-		this._tagPaletteItem = tagToolPaletteEntryItem;  
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#calculateCursor()
-	 */
-	protected Cursor calculateCursor() {
-		/*
-		 * Fix for Bug# 66010 The following two lines of code were added for the
-		 * case where a tool is activated via the keyboard (that code hasn't
-		 * been released yet). However, they were causing a problem as described
-		 * in 66010. Since the keyboard activation code is not being released
-		 * for 3.0, the following lines are being commented out.
-		 */
-		// if (isInState(STATE_INITIAL))
-		// return getDefaultCursor();
-		return super.calculateCursor();
-	}
-
-	/**
-	 * Creates a {@link ItemCreationRequest}and sets this tool's factory on the
-	 * request.
-	 * 
-	 * @see org.eclipse.gef.tools.TargetingTool#createTargetRequest()
-	 */
-	protected Request createTargetRequest() {
-		ItemCreationRequest request = new ItemCreationRequest();
-		request.setTagToolPaletteEntry(_tagPaletteItem);
-		return request;
-	}
-
-	/**
-	 * @see org.eclipse.gef.Tool#deactivate()
-	 */
-	public void deactivate() {
-		super.deactivate();
-		// TODO: never read helper = null;
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#getCommandName()
-	 */
-	protected String getCommandName() {
-		return ItemCreationRequest.REQ_ITEM_CREATION;
-	}
-
-	/**
-	 * Cast the target request to a CreateRequest and returns it.
-	 * 
-	 * @return the target request as a CreateRequest
-	 * @see TargetingTool#getTargetRequest()
-	 */
-	protected ItemCreationRequest getCreateRequest() {
-		return (ItemCreationRequest) getTargetRequest();
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#getDebugName()
-	 */
-	protected String getDebugName() {
-		return "Item Creation Tool";//$NON-NLS-1$
-	}
-
-	/**
-	 * The creation tool only works by clicking mouse button 1 (the left mouse
-	 * button in a right-handed world). If any other button is pressed, the tool
-	 * goes into an invalid state. Otherwise, it goes into the drag state,
-	 * updates the request's location and calls
-	 * {@link TargetingTool#lockTargetEditPart(EditPart)}with the edit part
-	 * that was just clicked on.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleButtonDown(int)
-	 */
-	protected boolean handleButtonDown(int button) {
-		if (button != 1) {
-			setState(STATE_INVALID);
-			handleInvalidInput();
-			return true;
-		}
-		if (stateTransition(STATE_INITIAL, STATE_DRAG)) {
-			if (getTargetEditPart() != null) {
-				getCreateRequest().setLocation(getLocation());
-				lockTargetEditPart(getTargetEditPart());
-				// Snap only when size on drop is employed
-				// TODO: never read helper = (SnapToHelper) getTargetEditPart().getAdapter(
-				//SnapToHelper.class);
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * If the tool is currently in a drag or drag-in-progress state, it goes
-	 * into the terminal state, performs some cleanup (erasing feedback,
-	 * unlocking target edit part), and then calls {@link #performCreation(int)}.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleButtonUp(int)
-	 */
-	protected boolean handleButtonUp(int button) 
-	{
-		if (stateTransition(STATE_DRAG | STATE_DRAG_IN_PROGRESS, STATE_TERMINAL)) 
-		{
-			eraseTargetFeedback();
-			unlockTargetEditPart();
-			
-			// customizer may cancel the drop
-			customizeDropAndMaybeExecute(button);
-		}
-		
-		setState(STATE_TERMINAL);
-		handleFinished();
-
-		return true;
-	}
-
-	/**
-	 * @param button
-	 */
-	protected void customizeDropAndMaybeExecute(final int button)
-	{
-        Command command = getCurrentCommand();
-        
-        int status = IStatus.OK;
-        if (command instanceof CreateItemCommand)
-        {
-            status = performCustomization((CreateItemCommand)command);
-        }
-        
-        if (status == IStatus.OK)
-        {
-            performCreation(button);
-        }
-	}
-
-	private int performCustomization(CreateItemCommand command)
-	{
-	    IStatus status = Status.OK_STATUS;
-	    TagIdentifier tagId = 
-	        TagIdentifierFactory.createJSPTagWrapper
-	            (_tagPaletteItem.getURI(), _tagPaletteItem.getTagName());
-	    
-	    IElementEdit elementEdit = ElementEditFactoryRegistry.getInstance().createElementEdit(tagId);
-
-	    if (elementEdit != null)
-	    {
-	        IDropCustomizer customizer = elementEdit.getDropCustomizer(tagId);
-    	    
-    	    if (customizer != null)
-    	    {
-        	    status = customizer.runCustomizer();
-        	    
-        	    if (status.getSeverity() == IStatus.OK)
-        	    {
-        	        command.setCustomizationData(customizer.getDropCustomizationData());
-        	    }
-    	    }
-	    }
-	    return status.getSeverity();
-	}
-
-	/**
-	 * Updates the request, sets the current command, and asks to show feedback.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleDragInProgress()
-	 */
-	protected boolean handleDragInProgress() {
-		if (isInState(STATE_DRAG_IN_PROGRESS)) {
-			updateTargetRequest();
-			setCurrentCommand(getCommand());
-			showTargetFeedback();
-		}
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#handleDragStarted()
-	 */
-	protected boolean handleDragStarted() {
-		return stateTransition(STATE_DRAG, STATE_DRAG_IN_PROGRESS);
-	}
-
-	/**
-	 * If the user is in the middle of creating a new edit part, the tool erases
-	 * feedback and goes into the invalid state when focus is lost.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleFocusLost()
-	 */
-	protected boolean handleFocusLost() {
-		if (isInState(STATE_DRAG | STATE_DRAG_IN_PROGRESS)) {
-			eraseTargetFeedback();
-			setState(STATE_INVALID);
-			handleFinished();
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.TargetingTool#handleHover()
-	 */
-	protected boolean handleHover() {
-		if (isInState(STATE_INITIAL))
-			updateAutoexposeHelper();
-		return true;
-	}
-
-	/**
-	 * Updates the request and mouse target, gets the current command and asks
-	 * to show feedback.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleMove()
-	 */
-	protected boolean handleMove() {
-		updateTargetRequest();
-		updateTargetUnderMouse();
-		setCurrentCommand(getCommand());
-		showTargetFeedback();
-		return true;
-	}
-
-	/**
-	 * Executes the current command and selects the newly created object. The
-	 * button that was released to cause this creation is passed in, but since
-	 * {@link #handleButtonDown(int)}goes into the invalid state if the button
-	 * pressed is not button 1, this will always be button 1.
-	 * 
-	 * @param button
-	 *            the button that was pressed
-	 */
-	protected void performCreation(int button) {
-		executeCurrentCommand();
-		// selectAddedObject();
-	}
-
-	// /*
-	// * Add the newly created object to the viewer's selected objects.
-	// */
-	// private void selectAddedObject() {
-	// final Object model = getCreateRequest().getNewObject();
-	// if (model == null)
-	// return;
-	// EditPartViewer viewer = getCurrentViewer();
-	// Object editpart = viewer.getEditPartRegistry().get(model);
-	// if (editpart instanceof EditPart) {
-	// viewer.flush();
-	// viewer.select((EditPart)editpart);
-	// }
-	// }
-
-	/**
-	 * Sets the location (and size if the user is performing size-on-drop) of
-	 * the request.
-	 * 
-	 * @see org.eclipse.gef.tools.TargetingTool#updateTargetRequest()
-	 */
-	protected void updateTargetRequest() {
-		ItemCreationRequest req = getCreateRequest();
-		req.setLocation(getLocation());
-		// if (isInState(STATE_DRAG_IN_PROGRESS)) {
-		// Point loq = getStartLocation();
-		// req.setLocation(bounds.getLocation());
-		// req.getExtendedData().clear();
-		// if (!getCurrentInput().isAltKeyDown() && helper != null) {
-		// PrecisionRectangle baseRect = new PrecisionRectangle(bounds);
-		// PrecisionRectangle result = baseRect.getPreciseCopy();
-		// helper.snapRectangle(req, PositionConstants.NSEW,
-		// baseRect, result);
-		// req.setLocation(result.getLocation());
-		// req.setSize(result.getSize());
-		// }
-		// } else {
-		// req.setLocation(getLocation());
-		// }
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ContainerCreationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ContainerCreationCommand.java
deleted file mode 100644
index bf2f60d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ContainerCreationCommand.java
+++ /dev/null
@@ -1,134 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.command;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.itemcreation.internal.AbstractCreationCommand;
-
-/**
- * Command for creating containers.
- * 
- *  * <p><b>Provisional API - subject to change</b></p>
- *  
- *  Clients may sub-class, but is preferable to use {@link SingletonContainerCreationCommand}
- *  or {@link TagContainerCreationCommand} instead.
- *  
- * @author cbateman
- *
- */
-public abstract class ContainerCreationCommand extends AbstractCreationCommand 
-{
-    private final IDOMPosition          _originalDomPosition;
-    private final TagIdentifier         _containerTag;
-    private final TagIdentifier         _tagBeingCreated;
-    private IDOMPosition                _domPosition;
-    private ContainerCreationCommand    _nextCommand = null;
-    
-    /**
-     * @param domPosition
-     * @param containerTag
-     */
-    /*package*/ ContainerCreationCommand(IDOMPosition domPosition, TagIdentifier containerTag, TagIdentifier tagBeingCreated)
-    {
-        _domPosition = domPosition;
-        _originalDomPosition = domPosition;
-        _containerTag = containerTag;
-        _tagBeingCreated = tagBeingCreated;
-    }
-    
-    @Override
-    public final void execute() 
-    {
-        _domPosition = doExecute();
-        
-        if (_nextCommand != null)
-        {
-            _nextCommand.setDomPosition(_domPosition);
-            _nextCommand.execute();
-            // update the dom position
-            _domPosition = _nextCommand.getDomPosition();
-        }
-    }
-
-    @Override
-    public final Collection<IDOMPosition> getResult() 
-    {
-        return Collections.singletonList(_domPosition);
-    }
-
-    /**
-     * @return the new dom position after the container insert
-     */
-    protected abstract IDOMPosition doExecute();
-
-    @Override
-    public final ContainerCreationCommand chain(Command command) 
-    {
-        if (!(command instanceof ContainerCreationCommand))
-        {
-            throw new IllegalArgumentException("Can only chain ContainerCreationCommand's");
-        }
-        
-        if (_nextCommand == null)
-        {
-            _nextCommand = (ContainerCreationCommand) command;
-        }
-        else
-        {
-            _nextCommand.chain(command);
-        }
-        
-        return this;
-    }
-
-    /**
-     * Update the domPosition
-     * 
-     * @param domPosition
-     */
-    public final void setDomPosition(final IDOMPosition domPosition)
-    {
-        if (_domPosition.getContainerNode().getOwnerDocument() == 
-                domPosition.getContainerNode().getOwnerDocument())
-        {
-            _domPosition = domPosition;
-        }
-        else
-        {
-            // if not in same document, then error
-            throw new IllegalArgumentException("New domPosition must be in same document as old domPosition");
-        }
-    }
-
-    /**
-     * @return the dom position
-     */
-    protected final IDOMPosition getDomPosition() {
-        return _domPosition;
-    }
-
-    /**
-     * @return the original dom position that this container creation command
-     * was created with.
-     */
-    protected final IDOMPosition getOriginalDomPosition() {
-        return _originalDomPosition;
-    }
-
-    /**
-     * @return the container tag to be created
-     */
-    protected final TagIdentifier getContainerTag() {
-        return _containerTag;
-    }
-
-    /**
-     * @return the tag that is being created for which we are adding the container
-     */
-    protected final TagIdentifier getTagBeingCreated() {
-        return _tagBeingCreated;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ElementCustomizationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ElementCustomizationCommand.java
deleted file mode 100644
index 2b6c005..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ElementCustomizationCommand.java
+++ /dev/null
@@ -1,145 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.command;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteElementTemplateHelper;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationAttribute;
-import org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.TagCreationInfo;
-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, CreationData creationData)
-    {
-        _model = model;
-        _element = element;
-        _creationData = creationData;
-    }
-
-    @Override
-    public void execute() 
-    {
-       applyChildElementCustomization();
-       applyAttributeCustomization();
-    }
-
-    @Override
-    protected boolean prepare() 
-    {
-        // do nothing by default; return true to indicate can execute
-        return true;
-    }
-
-    /**
-     * Override to customize the children of the tag being created
-     * 
-     * Default implementation uses meta-data to load a template.
-     * This is the prefered method for static child values (i.e. those
-     * that are not calculated dynamically at runtime).
-     */
-    protected void applyChildElementCustomization()
-    {
-        TagCreationInfo tagCreationInfo = _creationData.getTagCreationInfo();
-        if (tagCreationInfo != null)
-        {
-            PaletteElementTemplateHelper.applyTemplate(_model, _element, _creationData.getTagEntry(), tagCreationInfo);
-        }
-    }
-    
-    /**
-     * Add required attributes and default values, if set, to the created tag element
-     * 
-     * To customize the attributes that get added, use TagCreationInfo metadata
-     * 
-     * This method is provided as a utility for clients.  It is not used by default
-     * 
-     * @param element
-     * @param creationData 
-     */
-    protected final void ensureRequiredAttrs(final Element element, final CreationData creationData) 
-    {
-        CMElementDeclaration ed = CMUtil.getTLDElementDeclaration(creationData.getUri(), creationData.getTagName(), creationData.getModel().getDocument().getStructuredDocument());
-
-        if (ed != null)
-        {
-            for (Iterator it=ed.getAttributes().iterator();it.hasNext();){
-                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()
-    {
-        TagCreationInfo info = _creationData.getTagCreationInfo();
-        if (info != null){
-            EList list = info.getAttributes();
-            if (list != null) {
-                for (Iterator it = list.iterator(); it.hasNext();) {
-                    TagCreationAttribute attr = (TagCreationAttribute)it.next();
-                    _element.setAttribute(attr.getId(), (attr.getValue() == null ? "" : attr.getValue()));
-                }
-            }
-        }
-    }
-    
-    @Override
-    public final Command chain(Command command) {
-        return super.chain(command);
-    }
-
-    @Override
-    public final Collection<Element> getResult() 
-    {
-        return Collections.singletonList(_element);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/SingletonContainerCreationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/SingletonContainerCreationCommand.java
deleted file mode 100644
index edaee8d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/SingletonContainerCreationCommand.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.command;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.utils.BodyHelper;
-import org.eclipse.jst.pagedesigner.validation.caret.JSFRootContainerPositionRule;
-import org.w3c.dom.Document;
-
-/**
- * Used to create a container that should only occur once per document. Typically
- * used for HTML body and JSF f:view tags.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * Clients may reference but not sub-class.
- * @author cbateman
- *
- */
-public final class SingletonContainerCreationCommand extends ContainerCreationCommand 
-{
-    private static final int  MAX_DEPTH_TO_SEARCH_FOR_CONTAINER = 10;
-
-    /**
-     * @param domPosition
-     * @param containerTag
-     * @param tagBeingCreated 
-     */
-    public SingletonContainerCreationCommand(IDOMPosition domPosition,
-            TagIdentifier containerTag, TagIdentifier tagBeingCreated) 
-    {
-        super(domPosition, containerTag, tagBeingCreated);
-    }
-
-    @Override
-    protected IDOMPosition doExecute() 
-    {
-       return insertSingletonIfNotPresent();
-    }
-    
-    private IDOMPosition insertSingletonIfNotPresent()
-    {
-        IDOMPosition domPosition = getDomPosition();
-        final TagIdentifier containerTag = getContainerTag();
-        final TagIdentifier tagBeingCreated = getTagBeingCreated();
-        
-        final Document document = EditModelQuery.getDocumentNode(domPosition
-                .getContainerNode());
-        
-        final boolean isContainerAlreadyPresent =
-            JSFRootContainerPositionRule.hasBasicContainers
-                (document, MAX_DEPTH_TO_SEARCH_FOR_CONTAINER);
-
-        if (isContainerAlreadyPresent) 
-        {
-            // if the container and element to be created are the same,
-            // then return null indicating to abort
-            if (containerTag.equals(tagBeingCreated))
-            {
-                domPosition =  null;
-            }
-            // otherwise, simply fall through keeping domPosition unchanged
-        }
-        // if the container isn't already present
-        else
-        {
-            
-            if (!containerTag.equals(tagBeingCreated)) 
-            {
-            // if the container is different and doesn't exist, then add it.
-                domPosition = BodyHelper.insertBody(domPosition, containerTag.asQName(), "f");
-            }
-            // otherwise, fall through leaving domPosition unchanged
-        }
-
-        return domPosition;
-    }
-
-    @Override
-    protected boolean prepare()
-    {
-        throw new UnsupportedOperationException("don't use");
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/TagContainerCreationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/TagContainerCreationCommand.java
deleted file mode 100644
index 162f97f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/TagContainerCreationCommand.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.command;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.dom.ValidatorSupport;
-
-/**
- * @author cbateman
- * 
- *  * <p><b>Provisional API - subject to change</b></p>
- *  
- *  Clients may sub-class
- *
- */
-public class TagContainerCreationCommand extends ContainerCreationCommand {
-
-    /**
-     * @param domPosition
-     * @param containerTag
-     * @param tagBeingCreated
-     */
-    public TagContainerCreationCommand(IDOMPosition domPosition,
-            TagIdentifier containerTag, TagIdentifier tagBeingCreated) 
-    {
-        super(domPosition, containerTag, tagBeingCreated);
-    }
-
-    @Override
-    protected IDOMPosition doExecute() 
-    {
-        final IDOMPosition domPosition = getDomPosition();
-        final QName  containerQName = getContainerTag().asQName();
-        boolean hasform = ValidatorSupport.checkContainer(domPosition, containerQName);
-        IDOMPosition newPosition = domPosition;
-        if (!hasform) {
-            newPosition = ValidatorSupport
-                    .insertContainer(domPosition, containerQName, getContainerCustomizationData());
-            if (newPosition == null) {
-                newPosition = domPosition;
-            }
-        }
-        return newPosition;
-    }
-
-    /**
-     * Override to inject customization data into the tag creation
-     * @return a customization data for the container.
-     */
-    protected IAdaptable getContainerCustomizationData()
-    {
-        return null;
-    }
-    
-    @Override
-    protected final boolean prepare()
-    {
-        throw new UnsupportedOperationException("don't use");
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/AbstractDropCustomizer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/AbstractDropCustomizer.java
deleted file mode 100644
index a41bf5d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/AbstractDropCustomizer.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.customizer;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * Clients should extend to implement their own IDropCustomizer.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDropCustomizer implements IDropCustomizer 
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.IDropCustomizer#getDropCustomizationData()
-     */
-    public IAdaptable getDropCustomizationData() 
-    {
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.IDropCustomizer#runCustomizer()
-     */
-    public IStatus runCustomizer() 
-    {
-        return Status.OK_STATUS;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/IDropCustomizer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/IDropCustomizer.java
deleted file mode 100644
index 2f93062..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/IDropCustomizer.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.customizer;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * Interface used to declare an object that customizes tag creation data prior
- * to a drop.  The drop customizer should be used to illicit data on per-drop basis.
- * 
- * Clients should not implement this interface.  Extend AbstractDropCustomizer instead.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author cbateman
- *
- */
-public interface IDropCustomizer 
-{
-    /**
-     * Executed when the user performs a drop gesture for a tag, but before the
-     * command is dispatched to create the tag in the target document.  Implementers
-     * may do calculations or raise customization UI.  There return value is used
-     * to decide whether to continue.  Values other than OK and CANCEL are currently
-     * ignored.  If the return value has a severity of CANCEL, then the drop will
-     * be aborted.  If the return severity is OK, then getDropCustomizationData will
-     * be called and it's value will be passed to the ITagCreator framework through
-     * the CreationData object.
-     * 
-     * NOTE: This method may be called on the UI thread, although this is not guaranteed.
-     * Implementer should ensure that anything that is long-running (such as a dialog)
-     * is user-cancellable and that any UI code is run on the display thread.
-     * 
-     * @return the status condition of the customizer
-     */
-    public IStatus runCustomizer();
-
-    /**
-     * @return the customization data.  This method will only be called after runCustomizer
-     * and only if runCustomizer returns IStatus.OK in its severity.  The adaptable will
-     * be passed to the ITagCreator framework through the CreationData value object.  You
-     * may return null even if runCustomizer() returns OK.
-     */
-    public IAdaptable getDropCustomizationData();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/AbstractCreationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/AbstractCreationCommand.java
deleted file mode 100644
index d088496..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/AbstractCreationCommand.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.internal;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.common.command.Command;
-
-/**
- * Internal super-class of all tag creation commands.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractCreationCommand extends AbstractCommand implements
-        ICreationCommand 
-{
-    public abstract void execute(); 
-
-    public final void redo() 
-    {
-        throw new UnsupportedOperationException("don't use");
-    }
-
-    @Override
-    public final boolean canExecute() 
-    {
-        return super.canExecute();
-    }
-
-    @Override
-    public final boolean canUndo() {
-        return super.canUndo();
-    }
-
-    @Override
-    public Command chain(Command command) {
-        if (command instanceof ICreationCommand)
-        {
-            return super.chain(command);
-        }
-        throw new IllegalArgumentException("command must an ICreationCommand");
-    }
-
-    @Override
-    public final void dispose() 
-    {
-        throw new UnsupportedOperationException("don't use");
-    }
-
-    @Override
-    public final Collection<?> getAffectedObjects() {
-        return super.getAffectedObjects();
-    }
-
-    @Override
-    public final String getDescription() 
-    {
-        return super.getDescription();
-    }
-
-    @Override
-    public final String getLabel() 
-    {
-        return super.getLabel();
-    }
-
-    @Override
-    public Collection<?> getResult() 
-    {
-        return Collections.EMPTY_LIST;
-    }
-
-    @Override
-    protected abstract boolean prepare(); 
-
-    @Override
-    public final void setDescription(String description) 
-    {
-        super.setDescription(description);
-    }
-
-    @Override
-    public final void setLabel(String label) 
-    {
-        super.setLabel(label);
-    }
-
-    @Override
-    public final void undo() 
-    {
-        // for now, there is no undo
-        super.undo();
-    }
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/DefaultTagCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/DefaultTagCreator.java
deleted file mode 100644
index 0ae21ad..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/DefaultTagCreator.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.itemcreation.internal;
-
-import org.eclipse.jst.pagedesigner.itemcreation.AbstractTagCreator;
-import org.eclipse.jst.pagedesigner.itemcreation.CreationData;
-import org.eclipse.jst.pagedesigner.itemcreation.ITagCreationAdvisor;
-import org.eclipse.jst.pagedesigner.itemcreation.ITagCreator;
-
-/**
- * {@link 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 37be020..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/ICreationCommand.java
+++ /dev/null
@@ -1,17 +0,0 @@
-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 7f62239..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/TagCreationFactory.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.editors.palette.TagToolPaletteEntry;
-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 ITagCreator}s for a the given {@link TagToolPaletteEntry}
- * (Eventually) Will use TagCreavtorFactories registered using org.eclipse.jst.jsf.pagedesigner.tagcreationfactories ext-pt.  
- * Currently only using DefaultTagCreator.
- */
-public class TagCreationFactory {
-	private static TagCreationFactory INSTANCE = null;
-	
-	/**
-	 * @return singleton instance
-	 */
-	public synchronized static TagCreationFactory getInstance(){
-		if (INSTANCE == null){
-			INSTANCE = new TagCreationFactory();
-		}
-		return INSTANCE;
-	}
-
-	/**
-	 * Using the TagToolPaletteEntry, locate the factory to use for tag creation
-	 * @param tagId 
-	 * 
-	 * @return ITagCreator
-	 */
-	public ITagCreator createTagCreator(final TagIdentifier tagId) 
-	{
-	    
-	    IElementEdit elementEdit = ElementEditFactoryRegistry.getInstance().createElementEdit(tagId);
-
-	    if (elementEdit != null)
-	    {
-//    	    for (ITagCreatorFactory factory : factories)
-//    	    {
-    	        ITagCreator tagCreator = null;
-    	        try
-    	        {
-    	            tagCreator = elementEdit.getTagCreator(tagId);
-    	        }
-    	        catch (Exception e)
-    	        {
-    	            PDPlugin.getLogger(getClass()).error
-    	                ("Error.ProblemLoadingTagCreatorFactory"
-    	                 ,elementEdit.getClass().toString(), e);  
-    	        }
-    	        
-    	        if (tagCreator != null)
-    	        {
-    	            if (tagCreator instanceof AbstractTagCreator)
-    	            {
-    	                return tagCreator;
-    	            }
-    	            // if non-null, skipped, log the issue
-	                PDPlugin.getLogger(getClass()).error
-	                   ("Error.ProblemLoadingTagCreatorFactory",
-	                   "Tag creator must extend AbstractTagCreator", new Throwable());
-	        }
-	    }
-	    
-	    // all else fails, use the internal default
-		return new DefaultTagCreator();	
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/TagCreatorFactoryRegistryReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/TagCreatorFactoryRegistryReader.java
deleted file mode 100644
index 1dcde61..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/TagCreatorFactoryRegistryReader.java
+++ /dev/null
@@ -1,193 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.internal;
-
-
-/**
- * A registry reader that lazy initializes a list of uri-sensitive
- * extensions
- * 
- * @author cbateman
- *
- */
-public final class TagCreatorFactoryRegistryReader 
-{
-    // TODO: move this logic into the ElementEditFacRegistryReader
-//    private static Map<String, List<ITagCreatorFactory>> _handlers = null;
-//
-//    /**
-//     * @param uri the uri to get a list of factories for
-//     * @return all available handers for the ext-pt
-//     */
-//    public static synchronized List<ITagCreatorFactory> getAllHandlers(final String uri) 
-//    {
-//        if (_handlers == null) {
-//            _handlers = readAllHandlers();
-//        }
-//        return _handlers.get(uri);
-//    }
-//
-//    private static Map<String, List<ITagCreatorFactory>> readAllHandlers() 
-//    {
-//        final Map<String, List<ExtElement>>  map = 
-//            new HashMap<String, List<ExtElement>>();
-//
-//        IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-//                .getExtensionPoint(PDPlugin.getPluginId(),
-//                        IJMTConstants.TAG_CREATOR_FACTORY_EXT_NAME);
-//        IExtension[] extensions = extensionPoint.getExtensions();
-//
-//        for (int i = 0; i < extensions.length; i++) 
-//        {
-//            IExtension ext = extensions[i];
-//            IConfigurationElement[] tagCreationHandlers = ext
-//                    .getConfigurationElements();
-//
-//            for (int j = 0; j < tagCreationHandlers.length; j++) {
-//                if (tagCreationHandlers[j].getName().equals(
-//                        IJMTConstants.TAG_CREATOR_FACTORY_ELEMENT_NAME)) 
-//                {
-//                    try
-//                    {
-//                        final ExtElement extElement = 
-//                            new ExtElement(tagCreationHandlers[j]);
-//                        List<ExtElement> elements = 
-//                            map.get(extElement.getUri());
-//                        
-//                        if (elements == null)
-//                        {
-//                            elements = new ArrayList<ExtElement>();
-//                            map.put(extElement.getUri(), elements);
-//                        }
-//                        
-//                        elements.add(extElement);
-//                    }
-//                    catch (CoreException ce)
-//                    {
-//                        PDPlugin.getLogger(ExtElement.class)
-//                            .error("Error.ProblemLoadingExtensionPoint", ce);
-//                    }
-//                }
-//            }
-//        }
-//        
-//        final Map<String, List<ITagCreatorFactory>> handlers = 
-//            new HashMap<String, List<ITagCreatorFactory>>();
-//        
-//        // now loop through the extensions, looking for collisions
-//        // on the same uri
-//        for (String uri : map.keySet())
-//        {
-//            List<ExtElement>  elements = map.get(uri);
-//            
-//            if (elements.size() > 1)
-//            {
-//                Collections.sort(elements);
-//                
-//                MultiStatus chainedStatus = new MultiStatus(PDPlugin.getPluginId(), 0, "Collision detected in ITagCreatorFactory extensions for uri: "+uri+". Factories will be queried in the following order with the first contender to provide a ITagCreator winning",
-//                        new Throwable());
-//                
-//                for (ExtElement element : elements)
-//                {
-//                    IStatus status = 
-//                        new Status(IStatus.WARNING, PDPlugin.getPluginId(), element.getClassName());
-//                    chainedStatus.add(status);
-//                }
-//                
-//                PDPlugin.log(chainedStatus);
-//            }
-//            
-//            List<ITagCreatorFactory>  factories = 
-//                new ArrayList<ITagCreatorFactory>();
-//
-//            for (ExtElement element : elements)
-//            {
-//                factories.add(element.getFactoryInstance());
-//            }
-//            
-//            handlers.put(uri, factories);
-//        }
-//
-//        return handlers;
-//    }
-//
-//    private static class ExtElement implements Comparable<ExtElement>
-//    {
-//        private final IConfigurationElement  _element;
-//        
-//        private final ITagCreatorFactory  _factoryInstance;
-//        
-//        ExtElement(IConfigurationElement element) throws CoreException
-//        {
-//            _element = element;
-//            
-//            final String uri = getUri();
-//            final String factory = getClassName();
-//            
-//            if (uri == null || factory == null)
-//            {
-//                throw new CoreException(new Status(IStatus.ERROR,PDPlugin.getPluginId(), "uri and factory must not be null: uri="+uri+", factory="+factory));
-//            }
-//            
-//            Object obj = _element.createExecutableExtension("factory");
-//
-//            if (obj instanceof ITagCreatorFactory) 
-//            {
-//                _factoryInstance = (ITagCreatorFactory) obj;
-//            }
-//            else
-//            {
-//                throw new CoreException(new Status(IStatus.ERROR,PDPlugin.getPluginId(), "Factory must be instanceof ITagCreatorFactory"));
-//            }
-//        }
-//
-//        /**
-//         * @return the uri
-//         */
-//        public String getUri() {
-//            return _element.getAttribute("uri");
-//        }
-//
-//        /**
-//         * @return the class name
-//         */
-//        public String getClassName() {
-//            return _element.getAttribute("factory");
-//        }
-//
-//        /**
-//         * @return the factory instance or null
-//         */
-//        public ITagCreatorFactory getFactoryInstance() 
-//        {
-//            return _factoryInstance;
-//        }
-//
-//        /* 
-//         * Two elements compare by the canonical comparision of their
-//         * contributor's bundle name string
-//         */
-//        public int compareTo(ExtElement o)
-//        {
-//            return _element.getContributor().getName().compareTo
-//                (o._element.getContributor().getName());
-//        }
-//
-//        @Override
-//        public boolean equals(Object obj) 
-//        {
-//            // ensure that x.equals(y) iff x.compareTo(y) == 0
-//            if (obj instanceof ExtElement)
-//            {
-//                return compareTo((ExtElement) obj) == 0;
-//            }
-//            
-//            return false;
-//        }
-//
-//        @Override
-//        public int hashCode() 
-//        {
-//            // ensure that x.equals(y) => x.hashCode == y.hashCode
-//            return _element.getContributor().getName().hashCode();
-//        }
-//    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/AttributeDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/AttributeDescriptor.java
deleted file mode 100644
index 724deca..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/AttributeDescriptor.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.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
- */
-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();
-	}
-
-	public AttributeDescriptor(String attrName) {
-		this.setAttributeName(attrName);
-	}
-
-	public void setAttributeName(String attributeName) {
-		this._attributeName = attributeName;
-	}
-
-	public void setCategory(String category) {
-		this._category = category;
-	}
-
-	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;
-	}
-
-	public void setDescription(String description) {
-		_description = description;
-	}
-
-	public void setOptions(Map map, String defaultValue) {
-		_options = map;
-		_defaultValue = defaultValue;
-	}
-
-	/**
-	 * @return Returns the typeParameter.
-	 */
-	public String getTypeParameter() {
-		return _typeParameter;
-	}
-
-	/**
-	 * @param typeParameter
-	 *            The typeParameter to set.
-	 */
-	public void setTypeParameter(String typeParameter) {
-		this._typeParameter = typeParameter;
-		_parameterMap = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor#getLabelString()
-	 */
-	public String getLabelString() {
-		if (_labelString == null) {
-			_labelString = StringUtil.splitVariable(getAttributeName());
-		}
-		return _labelString;
-	}
-
-	/**
-	 * @param labelString
-	 *            The labelString to set.
-	 */
-	public void setLabelString(String labelString) {
-		this._labelString = labelString;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor#getParameterByName(java.lang.String)
-	 */
-	public String getParameterByName(String name) {
-		if (_parameterMap == null) {
-			parseParameter();
-		}
-		Object value = _parameterMap.get(name);
-		return value == null ? "" : value.toString();
-	}
-
-	/**
-	 * 
-	 */
-	private void parseParameter() {
-		_parameterMap = new HashMap();
-		if (_typeParameter == null) {
-			return;
-		}
-		StringTokenizer tokenizer = new StringTokenizer(_typeParameter, "||");
-		while (tokenizer.hasMoreTokens()) {
-			String parameterEntry = tokenizer.nextToken();
-			int index = parameterEntry.indexOf('=');
-			if (index != -1) {
-				_parameterMap.put(parameterEntry.substring(0, index),
-						parameterEntry.substring(index + 1));
-			}
-		}
-	}
-
-	public String getDefaultValue() {
-		return _defaultValue;
-	}
-
-	public void setDefaultValue(String value) {
-		_defaultValue = value;
-	}
-
-	public boolean isRequired() {
-		return _required;
-	}
-
-	public void setRequired(boolean required) {
-		this._required = required;
-	}
-}
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 ec88bcf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/BindingHandlerDelegate.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.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
- */
-public class BindingHandlerDelegate implements IBindingHandler {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IBindingHandler#handleBinding(org.eclipse.swt.widgets.Shell,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement,
-	 *      java.lang.String)
-	 */
-	public String handleBinding(Shell shell, IDOMNode ancester,
-			IDOMElement element, String currentValue) {
-		IBindingHandler handler = getDelegatedHandler(ancester, element);
-		if (handler != null) {
-			return handler
-					.handleBinding(shell, ancester, element, currentValue);
-		}
-        return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IBindingHandler#isEnabled(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement)
-	 */
-	// public boolean isEnabled(IDOMNode ancester, IDOMElement element)
-	// {
-	// IBindingHandler handler = getDelegatedHandler(ancester, element);
-	// return (handler == null) ? false : handler.isEnabled(ancester, element);
-	// }
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IBindingHandler#isEnabled(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor)
-	 */
-	public boolean isEnabled(IDOMNode ancester, IDOMElement element,
-			String uri, String tagName, IAttributeDescriptor attr) {
-		IBindingHandler handler = getDelegatedHandler(ancester, element);
-		return (handler == null) ? false : handler.isEnabled(ancester, element,
-				uri, tagName, attr);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IBindingHandler#getImage()
-	 */
-	public Image getImage() {
-		return PDPlugin.getDefault().getImage("PD_Binding.gif");
-	}
-
-	public Image getDisabledImage() {
-		return PDPlugin.getDefault().getImage("PD_Binding_disabled.gif");
-	}
-
-	private IBindingHandler getDelegatedHandler(IDOMNode ancester,
-			IDOMElement element) {
-		IProject project = getProject(ancester, element);
-		if (project != null) {
-			Object obj = project.getAdapter(IBindingHandler.class);
-			if (obj instanceof IBindingHandler) {
-				return (IBindingHandler) obj;
-			}
-		}
-
-		return null;
-	}
-
-	private IProject getProject(IDOMNode ancester, IDOMElement element) {
-		IDOMModel model = getModel(ancester, element);
-		if (model != null) {
-			return StructuredModelUtil.getProjectFor(model);
-		}
-        return null;
-	}
-
-	private IDOMModel getModel(IDOMNode ancester, IDOMElement element) {
-		if (ancester != null) {
-			return ancester.getModel();
-		} else if (element != null) {
-			return element.getModel();
-		} else {
-			return null;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/EditorCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/EditorCreator.java
deleted file mode 100644
index c436fdb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/EditorCreator.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.meta;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.pagedesigner.meta.internal.DefaultEditorCreator;
-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;
-
-	static IBindingHandler _defaultHandler = new BindingHandlerDelegate();
-
-	public static interface CellEditorHolder {
-		public CellEditor createCellEditor(Composite parent);
-	}
-
-	/**
-	 * Create a dialog field without databinding using the specified attribute
-	 * descriptor.
-	 * 
-	 * @param attr
-	 * @return
-	 */
-	public abstract DialogField createDialogField(IAttributeDescriptor attr);
-
-	/**
-	 * Create a dialog field that will have databinding support. Basically, this
-	 * method will create a normal dialog field using the attribute descriptor,
-	 * then make a wrapper on it.
-	 * 
-	 * @param uri
-	 *            the namespace uri
-	 * @param tagName
-	 *            the local tag name
-	 * @param attr
-	 * @param handler
-	 *            if null, system default mechanism will be used.
-	 * @return
-	 */
-	public abstract DialogField createDialogFieldWithWrapper(String uri,
-			String tagName, IAttributeDescriptor attr, IBindingHandler handler);
-
-	/**
-	 * Create a cell editor.
-	 * 
-	 * @param parent
-	 * @param attr
-	 * @param element
-	 * @return
-	 */
-	public abstract CellEditor createCellEditor(Composite parent,
-			IAttributeDescriptor attr, IDOMElement element);
-
-	/**
-	 * Create a cell editor that will have databinding support.
-	 * 
-	 * @param parent
-	 * @param attr
-	 * @param element
-	 * @param handler
-	 *            if null, system default mechanism will be used.
-	 * @return
-	 */
-	public abstract CellEditor createCellEditorWithWrapper(Composite parent,
-			IAttributeDescriptor attr, IDOMElement element,
-			IBindingHandler handler);
-
-	/**
-	 * Create a cell edtior that will have databinding support. This method
-	 * don't provide an attribute descriptor, but it provide a CellEditorHolder
-	 * to create whatever normal cell editor it wants.
-	 * 
-	 * @param parent
-	 * @param attr
-	 *            could be null
-	 * @param holder
-	 * @param element
-	 * @param handler
-	 *            if null, system default mechanism will be used.
-	 * @return
-	 */
-	public abstract CellEditor createCellEditorWithWrapper(Composite parent,
-			IAttributeDescriptor attr, CellEditorHolder holder,
-			IDOMElement element, IBindingHandler handler);
-
-	public static EditorCreator getInstance() {
-		if (_instance == null) {
-			_instance = new DefaultEditorCreator();
-		}
-		return _instance;
-	}
-
-	public IBindingHandler getSystemDefaultBindingHandler() {
-		return _defaultHandler;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeCellEditorFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeCellEditorFactory.java
deleted file mode 100644
index 105395a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeCellEditorFactory.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.meta;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.swt.widgets.Composite;
-import org.w3c.dom.Element;
-
-/**
- * Factory for creating CellEditors to edit element attributes.
- * 
- * @author mengbo
- */
-public interface IAttributeCellEditorFactory {
-	/**
-	 * create cell editor
-	 * 
-	 * @param parent
-	 * @param attr
-	 * @param ele
-	 * @return null means failed to create cell editor
-	 */
-	public CellEditor createCellEditor(Composite parent,
-			IAttributeDescriptor attr, Element ele);
-
-	/**
-	 * Normally, the DialogField for an attribute may appear in the following
-	 * places.
-	 * <ol>
-	 * <li>In the Quick Editor properties view, used to edit an element.
-	 * <li>In a dialog to edit an element
-	 * <li>In a dialog, to create an element
-	 * </ol>
-	 * 
-	 * It is the caller's responsibility to add valueChanged listener to the
-	 * dialog field to decide how to apply the value.
-	 * 
-	 * It is also the caller's responsibility to set the initial value of the
-	 * field.
-	 * 
-	 * The field should always be an instanceof <code>ISupportTextValue</code>,
-	 * it could also optionally implement <code>IElementContextable</code>
-	 * 
-	 * @param attr
-	 *            the attribute descriptor, meta data
-	 * @return A dialog field. null means this factory can't create one.
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue
-	 */
-	public DialogField createDialogField(IAttributeDescriptor attr);
-
-	/**
-	 * The value types supported by this factory.
-	 * 
-	 * @return null means this factory can behave as default factory.
-	 */
-	public String[] getSupportedValueTypes();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeDescriptor.java
deleted file mode 100644
index 1653219..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeDescriptor.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.meta;
-
-import java.util.Map;
-
-/**
- * 
- * @author mengbo
- */
-public interface IAttributeDescriptor {
-	public static final String PARAMETER_SUFFIX = "suffix";
-
-	public static final String PARAMETER_STYLE = "style";
-
-	public static final String PARAMETER_SUPER_TYPE = "superType";
-
-	public static final String PARAMETER_SEPARATOR = "separator";
-
-	public static final String PARAMETER_DEFAULT = "default";
-
-	/**
-	 * get the name of the attribute.
-	 * 
-	 * @return
-	 */
-	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
-	 */
-	public String getCategory();
-
-	/**
-	 * value type is used to construct the cell editor.
-	 * 
-	 * @return
-	 */
-	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();
-
-	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
-	 */
-	public Map getOptions();
-
-	/**
-	 * Gets the default value of Options
-	 * 
-	 * @return
-	 */
-	public String getDefaultValue();
-
-	/**
-	 * A human readable string as the label of the attribute.
-	 * 
-	 * @return
-	 */
-	public String getLabelString();
-
-	/**
-	 * Indicate whether the attribute is required.
-	 * 
-	 * @return
-	 */
-	public boolean isRequired();
-}
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 a93a780..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IBindingHandler.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.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
- */
-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
-	 */
-	public boolean isEnabled(IDOMNode ancester, IDOMElement element,
-			String uri, String tagName, IAttributeDescriptor 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
-	 */
-	public Image getImage();
-
-	public Image getDisabledImage();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/ICMRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/ICMRegistry.java
deleted file mode 100644
index 060795a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/ICMRegistry.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.meta;
-
-/**
- * 
- * @author mengbo
- */
-public interface ICMRegistry {
-	/**
-	 * get the URI supported by this registry.
-	 * 
-	 * @return null if this is the global registry that support all the URI.
-	 */
-	public String getSupportedURI();
-
-	/**
-	 * get element descriptor by URI and tagname.
-	 * 
-	 * @param uri
-	 * @param tagname
-	 * @return
-	 */
-	public IElementDescriptor getElementDescriptor(String uri, String tagname);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IElementDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IElementDescriptor.java
deleted file mode 100644
index 78a819c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IElementDescriptor.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.meta;
-
-/**
- * 
- * @author mengbo
- */
-public interface IElementDescriptor {
-	/**
-	 * get the tagname
-	 * 
-	 * @return
-	 */
-	public String getTagName();
-
-	/**
-	 * get the namespace URI
-	 * 
-	 * @return
-	 */
-	public String getNamespaceURI();
-
-	/**
-	 * get all attribute descriptors
-	 * 
-	 * @return
-	 */
-	public IAttributeDescriptor[] getAttributeDescriptors();
-
-	public IAttributeDescriptor getAttributeDescriptor(String attributeName);
-
-	/**
-	 * get attribute descriptor by name
-	 * 
-	 * @param attrname
-	 * @return
-	 */
-	// public IAttributeDescriptor getAttributeDescriptor(String attrname);
-	/**
-	 * get reference. The ElementDescriptor being referenced may provide more
-	 * information. For example, &lt;h:inputText&gt; may reference
-	 * &lt;input&gt;. So those attribute descriptor not provided by
-	 * &lt;h:inputText&gt; could still be provided by &lt;input&gt;.
-	 * 
-	 * @return
-	 */
-	public IElementDescriptor getReference();
-
-	/**
-	 * if this element have eclipse help topic, then could use this method to
-	 * return a context id.
-	 * 
-	 * @return could be null
-	 */
-	public String getHelpContextID();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IValueType.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IValueType.java
deleted file mode 100644
index f6e930c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IValueType.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.meta;
-
-/**
- * All value types will be upcased.
- * 
- * @author mengbo
- */
-public interface IValueType {
-	// shared for html and jsf
-	public static final String CSSSTYLE = "CSSSTYLE";
-
-	public static final String CSSCLASS = "CSSCLASS";
-
-	public static final String CSSID = "CSSID";
-
-	public static final String ENUMERATED = "ENUMERATED";
-
-	public static final String BOOLEAN = "BOOLEAN";
-
-	public static final String RELATIVEPATH = "RELATIVEPATH";
-
-	public static final String WEBPATH = "WEBPATH";
-
-	public static final String COLOR = "COLOR";
-
-	public static final String NAMED_BOOLEAN = "NAMED-BOOLEAN";
-
-	// for jsf only
-	public static final String METHODBINDING = "METHODBINDING";
-
-	public static final String CLASSNAME = "CLASSNAME";
-
-	// new types
-	public static final String LINK = "LINK";
-
-	public static final String JAVASCRIPT = "JAVASCRIPT";
-
-	public static final String PROPERTYBINDING = "PROPERTYBINDING";
-
-	public static final String TIMEZONE = "TIMEZONE";
-
-	public static final String CLASSPATH_RESOURCE = "CLASSPATH_RESOURCE";
-
-	public static final String CURRENCYCODE = "CURRENCYCODE";
-
-	public static final String LOCALE = "LOCALE";
-
-	public static final String MULTICHOICE = "MULTICHOICE";
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CMRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CMRegistry.java
deleted file mode 100644
index 4230957..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CMRegistry.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.meta.internal;
-
-import java.lang.reflect.InvocationTargetException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.meta.ICMRegistry;
-import org.eclipse.jst.pagedesigner.meta.IElementDescriptor;
-import org.osgi.framework.Bundle;
-
-/**
- * XXX: temp implementation. In the future, will need add more things to allow
- * other plugins to contribute things.
- * 
- * @author mengbo
- */
-public class CMRegistry implements ICMRegistry {
-	static Logger _log = PDPlugin.getLogger(CMRegistry.class);
-
-	private Map _htmlMap = new HashMap();
-
-	private Map _jspMap = new HashMap();
-
-	private List _contributedRegistries = new ArrayList();
-
-	private static CMRegistry _instance = null;
-
-	public static ICMRegistry getInstance() {
-		if (_instance == null) {
-			_instance = new CMRegistry();
-		}
-		return _instance;
-	}
-
-	/**
-	 * 
-	 */
-	private CMRegistry() {
-		ProgressMonitorDialog progress = new ProgressMonitorDialog(null);
-		try {
-			progress.run(true, false, new IRunnableWithProgress() {
-				public void run(IProgressMonitor monitor)
-						throws InvocationTargetException {
-					try {
-						monitor
-								.beginTask(
-										PDPlugin
-												.getResourceString("CMRegistry.ReadConfigration"),
-										IProgressMonitor.UNKNOWN);
-						monitor
-								.subTask(PDPlugin
-										.getResourceString("CMRegistry.HTMLConfigration"));
-						loadCM("configs/cm/html.xml", _htmlMap);
-						monitor
-								.subTask(PDPlugin
-										.getResourceString("CMRegistry.JSPConfigration"));
-						loadCM("configs/cm/jsp.xml", _jspMap);
-						monitor
-								.subTask(PDPlugin
-										.getResourceString("CMRegistry.OtherConfigration"));
-						readExtensions();
-					} finally {
-						monitor.done();
-					}
-				}
-			});
-		} catch (InvocationTargetException e) {
-			// ignore
-		} catch (InterruptedException e) {
-			// ignore
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void readExtensions() {
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint(PDPlugin.getPluginId(),
-						IJMTConstants.EXTENSION_POINT_CMREGISTRY);
-		IConfigurationElement[] eles = extensionPoint
-				.getConfigurationElements();
-
-		for (int i = 0; i < eles.length; i++) {
-			if (eles[i].getName().equals("registry")) {
-				String uri = eles[i].getAttribute("uri");
-				if (uri == null || uri.length() == 0) {
-					// no uri, skip
-					continue;
-				}
-				String configFile = eles[i].getAttribute("configFile");
-				if (configFile != null && configFile.length() > 0) {
-					String bundleName = eles[i].getDeclaringExtension()
-							.getContributor().getName();
-					try {
-						Bundle bundle = Platform.getBundle(bundleName);
-						URL cmFileUrl = bundle.getEntry(configFile);
-						SimpleCMRegistry reg = new SimpleCMRegistry(uri,
-								cmFileUrl);
-						_contributedRegistries.add(reg);
-					} catch (Exception ex) {
-						// will not happen. skip
-						ex.printStackTrace();
-					}
-				}
-				String className = eles[i].getAttribute("class");
-				if (className != null && className.length() > 0) {
-					try {
-						Object obj = eles[i].createExecutableExtension("class");
-
-						if (obj instanceof ICMRegistry) {
-							_contributedRegistries.add(obj);
-						}
-					} catch (CoreException e) {
-						// ignore the exception
-						e.printStackTrace();
-					}
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.ICMRegistry#getSupportedURI()
-	 */
-	public String getSupportedURI() {
-		return null;
-	}
-
-	private void loadCM(String fileName, Map map) {
-		try {
-			URL url = PDPlugin.getDefault().getBundle().getEntry(fileName);
-			ElementDescReader reader = new ElementDescReader(url);
-			reader.readElements(map);
-		} catch (Exception e) {
-			_log.error("Error loading " + fileName + ": " + e.getMessage());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.ICMRegistry#getElementDescriptor(java.lang.String,
-	 *      java.lang.String)
-	 */
-	public IElementDescriptor getElementDescriptor(String uri, String tagname) {
-		if (uri == null) {
-			uri = ITLDConstants.URI_HTML;
-		}
-		if (ITLDConstants.URI_HTML.equals(uri)) {
-			IElementDescriptor desc = getHTMLElementDescriptor(tagname);
-			if (desc != null) {
-				return desc;
-			}
-		}
-		if (ITLDConstants.URI_JSP.equals(uri)) {
-			return getJSPElementDescriptor(tagname);
-		}
-		for (int i = 0, size = _contributedRegistries.size(); i < size; i++) {
-			ICMRegistry reg = (ICMRegistry) _contributedRegistries.get(i);
-			if (uri.equals(reg.getSupportedURI())) {
-				IElementDescriptor ret = reg.getElementDescriptor(uri, tagname);
-				if (ret != null) {
-					return ret;
-				}
-			}
-		}
-
-		return null;
-	}
-
-	private IElementDescriptor getHTMLElementDescriptor(String tagname) {
-		return (IElementDescriptor) _htmlMap.get(tagname.toLowerCase());
-	}
-
-	private IElementDescriptor getJSPElementDescriptor(String tagname) {
-		return (IElementDescriptor) _jspMap.get(tagname.toLowerCase());
-	}
-}
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 1696c7c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CategoryNameComparator.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.meta.internal;
-
-import java.util.Comparator;
-import java.util.HashSet;
-
-import org.eclipse.jst.pagedesigner.properties.ITabbedPropertiesConstants;
-
-/**
- * @author mengbo
- */
-public class CategoryNameComparator implements Comparator {
-	static HashSet _pairs = new HashSet();
-
-	private 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;
-		}
-	}
-
-	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;
-
-		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 1;
-	}
-
-	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 20b98a9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CellEditorFacRegistryReader.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.meta.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.meta.IAttributeCellEditorFactory;
-
-/**
- * Read the registry to find out all the CellEditorFactory.
- * 
- * @author mengbo
- */
-public class CellEditorFacRegistryReader {
-	static IAttributeCellEditorFactory[] _factories = null;
-
-	public static synchronized IAttributeCellEditorFactory[] getAllFactories() {
-		if (_factories == null) {
-			_factories = readAllFactories();
-		}
-		return _factories;
-
-	}
-
-	private static IAttributeCellEditorFactory[] readAllFactories() {
-		List result = new ArrayList();
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint(PDPlugin.getPluginId(),
-						IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-		IExtension[] extensions = extensionPoint.getExtensions();
-
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension ext = extensions[i];
-			IConfigurationElement[] facs = ext.getConfigurationElements();
-
-			for (int j = 0; j < facs.length; j++) {
-				if (facs[j].getName().equals(
-						IJMTConstants.ATTRIBUTE_CELLEDITOR_FACTORY)) {
-					facs[j].getAttribute("class");
-					Object obj;
-					try {
-						obj = facs[j].createExecutableExtension("class");
-
-						if (obj instanceof IAttributeCellEditorFactory) {
-							result.add(obj);
-						}
-					} catch (CoreException e) {
-						// ignore the exception
-						e.printStackTrace();
-					}
-				}
-			}
-		}
-		IAttributeCellEditorFactory[] ret = new IAttributeCellEditorFactory[result
-				.size()];
-		result.toArray(ret);
-		return ret;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CellEditorFactoryRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CellEditorFactoryRegistry.java
deleted file mode 100644
index 158c98d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CellEditorFactoryRegistry.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.meta.internal;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.meta.IAttributeCellEditorFactory;
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.jst.pagedesigner.meta.IValueType;
-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.
- * 
- * @author mengbo
- */
-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();
-
-	public static CellEditorFactoryRegistry getInstance() {
-		if (_instance == null) {
-			_instance = new CellEditorFactoryRegistry();
-		}
-		return _instance;
-	}
-
-	private CellEditorFactoryRegistry() {
-		IAttributeCellEditorFactory[] facs = CellEditorFacRegistryReader
-				.getAllFactories();
-		if (facs != null) {
-			for (int i = 0; i < facs.length; i++) {
-				addCellEditorFactory(facs[i]);
-			}
-		}
-		addCellEditorFactory(new CellEditorFactory());
-	}
-
-	public void addCellEditorFactory(IAttributeCellEditorFactory fac) {
-		String[] types = fac.getSupportedValueTypes();
-		if (types == null || types.length == 0) {
-			_defaultFactories.add(fac);
-		} else {
-			for (int i = 0; i < types.length; i++) {
-				_factoryMap.put(types[i].toUpperCase(), fac);
-			}
-		}
-	}
-
-	public CellEditor createCellEditor(Composite parent,
-			IAttributeDescriptor attr, Element element) {
-		String type = attr.getValueType();
-		if (type == null || type.length() == 0)
-			return null;
-		type = type.toUpperCase();
-
-		CellEditor result = null;
-		IAttributeCellEditorFactory fac = (IAttributeCellEditorFactory) _factoryMap
-				.get(type);
-		if (fac != null) {
-			result = fac.createCellEditor(parent, attr, element);
-		}
-		if (result == null) {
-			for (int i = 0, size = _defaultFactories.size(); i < size; i++) {
-				result = ((IAttributeCellEditorFactory) _defaultFactories
-						.get(i)).createCellEditor(parent, attr, element);
-				if (result != null)
-					break;
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * 
-	 * @param attr
-	 * @param context
-	 * @param ele
-	 * @return will never be null
-	 */
-	public DialogField createDialogField(IAttributeDescriptor attr) {
-		String type = attr.getValueType();
-		if (type == null || type.length() == 0) {
-			DialogField result = createTextDialogField(attr);
-			result.setLabelText(attr.getLabelString() + ":"); //$NON-NLS-1$
-			return result;
-		}
-		type = type.toUpperCase();
-
-		DialogField result = null;
-		IAttributeCellEditorFactory fac = (IAttributeCellEditorFactory) _factoryMap
-				.get(type);
-		if (fac != null) {
-			result = fac.createDialogField(attr);
-		}
-		if (result == null) {
-			for (int i = 0, size = _defaultFactories.size(); i < size; i++) {
-				result = ((IAttributeCellEditorFactory) _defaultFactories
-						.get(i)).createDialogField(attr);
-				if (result != null) {
-					break;
-				}
-			}
-		}
-		if (result == null) {
-			result = createTextDialogField(attr);
-		}
-		if (!(result instanceof ISupportTextValue)) {
-			result = createTextDialogField(attr);
-		}
-		result.setLabelText(attr.getLabelString() + ":"); //$NON-NLS-1$
-		return result;
-	}
-
-	/**
-	 * @param attr
-	 * @param context
-	 * @param ele
-	 * @return
-	 */
-	public DialogField createTextDialogField(IAttributeDescriptor attr) {
-		StringDialogField field = new StringDialogField();
-		field.setLabelText(attr.getLabelString());
-		field.setRequired(attr.isRequired());
-		field.setToolTip(attr.getDescription());
-		return field;
-	}
-
-	/**
-	 * This is NOT a product method. It should only be used by testing code.
-	 * 
-	 * @return
-	 */
-	public String[] getAllValueTypes() {
-		Set valueTypes = new HashSet();
-		for (Iterator iter = _factoryMap.values().iterator(); iter.hasNext();) {
-			IAttributeCellEditorFactory fac = (IAttributeCellEditorFactory) iter
-					.next();
-			String[] supportedTypes = fac.getSupportedValueTypes();
-
-			if (supportedTypes != null) {
-				for (int i = 0; i < supportedTypes.length; i++) {
-					valueTypes.add(supportedTypes[i]);
-				}
-			}
-		}
-		// add those default ones.
-		Field[] fields = IValueType.class.getFields();
-		for (int i = 0; i < fields.length; i++) {
-			int modifiers = fields[i].getModifiers();
-			if (Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers)) {
-				if (fields[i].getType() == String.class) {
-					try {
-						valueTypes.add(fields[i].get(null));
-					} catch (IllegalArgumentException ex) {
-						// "Error in fields retrieving:"
-						_log.info("CellEditorFactoryRegistry.Info.2", ex); //$NON-NLS-1$
-					} catch (IllegalAccessException ex) {
-						// "Error in fields retrieving:"
-						_log.info("CellEditorFactoryRegistry.Info.3", ex); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-		String[] ret = new String[valueTypes.size()];
-		valueTypes.toArray(ret);
-		return ret;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/DefaultEditorCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/DefaultEditorCreator.java
deleted file mode 100644
index 71fbc24..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/DefaultEditorCreator.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta.internal;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.meta.EditorCreator;
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.jst.pagedesigner.meta.IBindingHandler;
-import org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper;
-import org.eclipse.jst.pagedesigner.ui.dialogfields.DialogFieldWrapper;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DefaultEditorCreator extends EditorCreator {
-	static IAttributeDescriptor _staticAttr;
-
-	static IDOMElement _staticElement;
-
-	static IBindingHandler _staticHandler;
-
-	static CellEditorHolder _staticHolder;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createCellEditor(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor,
-	 *      org.w3c.dom.Element)
-	 */
-	public CellEditor createCellEditor(Composite parent,
-			IAttributeDescriptor attr, IDOMElement element) {
-		return CellEditorFactoryRegistry.getInstance().createCellEditor(parent,
-				attr, element);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createDialogField(org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor)
-	 */
-	public DialogField createDialogField(IAttributeDescriptor attr) {
-		return CellEditorFactoryRegistry.getInstance().createDialogField(attr);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createCellEditorWithWrapper(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor,
-	 *      org.w3c.dom.Element,
-	 *      org.eclipse.jst.pagedesigner.meta.IBindingHandler,
-	 *      org.eclipse.swt.graphics.Image)
-	 */
-	public CellEditor createCellEditorWithWrapper(Composite parent,
-			IAttributeDescriptor attr, final IDOMElement element,
-			IBindingHandler handler1) {
-		final IBindingHandler handler = (handler1 == null ? getSystemDefaultBindingHandler()
-				: handler1);
-		String uri = CMUtil.getElementNamespaceURI(element);
-		String tagName = element.getLocalName();
-		if (!handler.isEnabled(element, element, uri, tagName, attr)) {
-			// should not enabled, so directly return original cell editor
-			return createCellEditor(parent, attr, element);
-		}
-		try {
-			// since "createWrappedCellEditor()" and "getBindingImage()" is
-			// called from the constructor of CellEditorWrapper, at that time,
-			// can't reference this 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.IAttributeDescriptor,
-	 *      org.eclipse.jst.pagedesigner.meta.EditorCreator.CellEditorHolder,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement,
-	 *      org.eclipse.jst.pagedesigner.meta.IBindingHandler)
-	 */
-	public CellEditor createCellEditorWithWrapper(Composite parent,
-			IAttributeDescriptor attr, CellEditorHolder holder,
-			final IDOMElement element, IBindingHandler handler1) {
-		final IBindingHandler handler = (handler1 == null ? getSystemDefaultBindingHandler()
-				: handler1);
-		String uri = CMUtil.getElementNamespaceURI(element);
-		String tagName = element.getLocalName();
-		if (!handler.isEnabled(element, element, uri, tagName, attr)) {
-			// should not enabled, so directly return original cell editor
-			return holder.createCellEditor(parent);
-		}
-		try {
-			// since "createWrappedCellEditor()" and "getBindingImage()" is
-			// called from the constructor of CellEditorWrapper, at that time,
-			// can't reference this 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.IAttributeDescriptor,
-	 *      org.eclipse.jst.pagedesigner.meta.IBindingHandler)
-	 */
-	public DialogField createDialogFieldWithWrapper(String uri, String tagName,
-			IAttributeDescriptor attr, IBindingHandler handler1) {
-		final IBindingHandler handler = (handler1 == null ? getSystemDefaultBindingHandler()
-				: handler1);
-		DialogField field = createDialogField(attr);
-		// if (field instanceof StringButtonDialogField)
-		// {
-		// ((StringButtonDialogField) field).setButtonLabel("...");
-		// }
-		DialogFieldWrapper wrapper = new DialogFieldWrapper(field, handler
-				.getImage(), handler.getDisabledImage(), uri, tagName, attr,
-				handler);
-		wrapper.setDatabindingEnabled(true);
-
-		return wrapper;
-	}
-
-	private String convertToString(Object value) {
-		if (value == null) {
-			return null;
-		}
-        return value.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/ElementDescReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/ElementDescReader.java
deleted file mode 100644
index 7fc1765..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/ElementDescReader.java
+++ /dev/null
@@ -1,433 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta.internal;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.PropertyResourceBundle;
-import java.util.ResourceBundle;
-import java.util.Set;
-import java.util.StringTokenizer;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.FactoryConfigurationError;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.meta.AttributeDescriptor;
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-/**
- * @author mengbo
- */
-public class ElementDescReader {
-	private static Logger _log = PDPlugin.getLogger(ElementDescReader.class);
-
-	private Map _definedCategoryMap = new HashMap();
-
-	private Map _definedAttributeMap = new HashMap();
-
-	private URL _url;
-
-	private String[] _optimizedLocales = null;
-
-	public ElementDescReader(URL url) {
-		this._url = url;
-	}
-
-	/**
-	 * Read xml information and fill the map
-	 * 
-	 * @param stream
-	 *            xml file stream
-	 * @param map
-	 * @throws ParserConfigurationException
-	 * @throws FactoryConfigurationError
-	 * @throws SAXException
-	 * @throws IOException
-	 */
-	public void readElements(Map map) throws ParserConfigurationException,
-			FactoryConfigurationError, SAXException, IOException {
-		DocumentBuilder builder = DocumentBuilderFactory.newInstance()
-				.newDocumentBuilder();
-		InputStream stream = this._url.openStream();
-		Document doc = builder.parse(stream);
-		ResourceUtils.ensureClosed(stream);
-
-		Element taglib = doc.getDocumentElement();
-		String nameSpace = taglib.getAttribute("uri");
-
-		NodeList list = doc.getElementsByTagName("tag");
-		if (list != null && list.getLength() != 0) {
-			int size = list.getLength();
-			for (int i = 0; i < size; i++) {
-				Element tag = (Element) list.item(i);
-				ElementDescriptor desc = new ElementDescriptor();
-				desc.setTagName(tag.getAttribute("name"));
-				desc.setNamespaceURI(nameSpace);
-
-				// support for help context id.
-				desc.setHelpContextID(tag.getAttribute("helpContextId"));
-
-				NodeList children = tag.getChildNodes();
-				// first calculate category and refered category quantity
-				NodeList cateNodes = tag.getElementsByTagName("category");
-				NodeList referedCateNodes = tag
-						.getElementsByTagName("referedcategory");
-				int cateNum = 0;
-				if (cateNodes != null) {
-					cateNum += cateNodes.getLength();
-				}
-				if (referedCateNodes != null) {
-					cateNum += referedCateNodes.getLength();
-				}
-
-				if (cateNum > 0) {
-					int length = children.getLength();
-					String[] cates = new String[cateNum];
-					List attrList = new ArrayList();
-					int realCate = 0;
-					for (int j = 0; j < length; j++) {
-						Node node = children.item(j);
-						if (node.getNodeType() == Node.ELEMENT_NODE) {
-							Element element = (Element) node;
-							String tagName = element.getTagName();
-							if ("category".equals(tagName)
-									|| "referedcategory".equals(tagName)) {
-								String categoryName = element
-										.getAttribute("name");
-								if (categoryName != null
-										&& !"".equals(categoryName)) {
-									cates[realCate++] = categoryName;
-									parseCategory(element, element, attrList);
-								} else {
-									Element definedCategory = handleReference(
-											doc, element, true);
-									String labelKey = definedCategory
-											.getAttribute("displaylabel");
-									if (labelKey != null
-											&& !"".equals(labelKey)) {
-										cates[realCate++] = getValue(labelKey);
-									} else {
-										cates[realCate++] = calculateDisplayLabel(definedCategory);
-									}
-
-									parseCategory(element, definedCategory,
-											attrList);
-								}
-							}
-						}
-
-					}
-
-					// for sort categories
-					for (int m = 0, len = cates.length; m < len; m++) {
-						for (int j = m + 1; j < len; j++) {
-							CategoryNameComparator.addPair(cates[m], cates[j]);
-						}
-					}
-					desc.setAttributeDescriptors(attrList);
-				}
-
-				map.put(desc.getTagName(), desc);
-			}
-		}
-	}
-
-	private String calculateDisplayLabel(Element definedElement) {
-		String label = definedElement.getAttribute("displaylabel");
-		return getValue(label);
-	}
-
-	private void parseCategory(Element category, Element definedCategory,
-			List attrList) {
-		String cateLabel = calculateDisplayLabel(definedCategory);
-		// if the category is a referedcategory tag
-		if (category != definedCategory) {
-			String labelKey = category.getAttribute("displaylabel");
-			if (labelKey != null && !"".equals(labelKey)) {
-				cateLabel = getValue(labelKey);
-			}
-		}
-		handleAttributes(definedCategory, cateLabel, attrList);
-		if (category == definedCategory) {
-			return;
-		}
-
-		// the category should be a referedcategory tag
-		// include/add more attributes to category
-		NodeList includes = category.getElementsByTagName("includeattrs");
-		if (includes != null && includes.getLength() != 0) {
-			Element includeAttrsTag = (Element) includes.item(0);
-			handleAttributes(includeAttrsTag, cateLabel, attrList);
-
-			// handle attribute override
-			HashMap tempMap = new HashMap();
-			Iterator itor = attrList.iterator();
-			while (itor.hasNext()) {
-				AttributeDescriptor adp = (AttributeDescriptor) itor.next();
-				tempMap.put(adp.getAttributeName(), adp);
-			}
-			int listSize = attrList.size();
-			int mapSize = tempMap.size();
-			if (listSize != mapSize) {
-				attrList.clear();
-				Set set = tempMap.keySet();
-				Iterator setor = set.iterator();
-				while (setor.hasNext()) {
-					String atName = (String) setor.next();
-					AttributeDescriptor ad = (AttributeDescriptor) tempMap
-							.get(atName);
-					attrList.add(ad);
-				}
-			}
-
-		}
-
-		// exclude attributes from category
-		NodeList excludes = category.getElementsByTagName("excludeattrs");
-		if (excludes != null && excludes.getLength() != 0) {
-			String displayNames = ((Element) excludes.item(0))
-					.getAttribute("refs");
-			StringTokenizer tokenizer = new StringTokenizer(displayNames, ", ");
-
-			while (tokenizer.hasMoreTokens()) {
-				String name = tokenizer.nextToken();
-				Iterator itr = attrList.iterator();
-				while (itr.hasNext()) {
-					IAttributeDescriptor atr = (IAttributeDescriptor) itr
-							.next();
-					String atrName = atr.getAttributeName();
-					if (name.equals(atrName)) {
-						attrList.remove(atr);
-						break;
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * handle all attribute element and referedattribute element under the root
-	 * element
-	 * 
-	 * @param root
-	 * @param cateLabel
-	 * @param list
-	 */
-	private void handleAttributes(Element root, String cateLabel, List attrList) {
-		NodeList allNodes = root.getChildNodes();
-		NodeList attrNodes = root.getElementsByTagName("attribute");
-		NodeList referedattrNodes = root
-				.getElementsByTagName("referedattribute");
-		int attrNum = 0;
-		if (attrNodes != null) {
-			attrNum += attrNodes.getLength();
-		}
-		if (referedattrNodes != null) {
-			attrNum += referedattrNodes.getLength();
-		}
-
-		if (attrNum > 0) {
-			int incAttrLength = allNodes.getLength();
-			for (int i = 0; i < incAttrLength; i++) {
-				Node node = allNodes.item(i);
-				if (node.getNodeType() == Node.ELEMENT_NODE) {
-					Element incAttr = (Element) node;
-					String tagName = incAttr.getTagName();
-					if ("attribute".equals(tagName)
-							|| "referedattribute".equals(tagName)) {
-						String incAtrName = incAttr.getAttribute("name");
-						Element refAttr = incAttr;
-						if (incAtrName == null || "".equals(incAtrName)) {
-							incAttr = handleReference(root.getOwnerDocument(),
-									incAttr, false);
-						}
-						AttributeDescriptor attrDesc = parseAttribute(
-								cateLabel, incAttr);
-						String overrideName = refAttr
-								.getAttribute("overridename");
-						if (overrideName != null
-								&& !"".equalsIgnoreCase(overrideName)) {
-							attrDesc.setAttributeName(overrideName);
-						}
-						String ovDisplayLabel = refAttr
-								.getAttribute("displaylabel");
-						if (ovDisplayLabel != null
-								&& !"".equalsIgnoreCase(ovDisplayLabel)) {
-							attrDesc.setLabelString(getValue(ovDisplayLabel));
-						}
-						attrList.add(attrDesc);
-					}
-
-				}
-
-			}
-		}
-	}
-
-	private Element handleReference(Document doc, Element refElment,
-			boolean isCategory) {
-		String refName = refElment.getAttribute("ref");
-		if (isCategory) {
-			if (_definedCategoryMap.get(refName) != null) {
-				Element definedCategory = (Element) _definedCategoryMap
-						.get(refName);
-				return definedCategory;
-			}
-		} else {
-			if (_definedAttributeMap.get(refName) != null) {
-				Element definedAttribute = (Element) _definedAttributeMap
-						.get(refName);
-				return definedAttribute;
-			}
-		}
-
-		NodeList catgs = null;
-		if (isCategory) {
-			NodeList defineCates = doc.getElementsByTagName("categories");
-			Element firstCate = (Element) defineCates.item(0);
-			catgs = firstCate.getElementsByTagName("category");
-		} else {
-			NodeList defineCates = doc.getElementsByTagName("attributes");
-			Element firstCate = (Element) defineCates.item(0);
-			catgs = firstCate.getElementsByTagName("attribute");
-		}
-		int cateLen = catgs.getLength();
-		Element definedElement = null;
-		for (int n = 0; n < cateLen; n++) {
-			String cateName = ((Element) catgs.item(n)).getAttribute("name");
-			if (refName.equals(cateName) && !"".equals(refName)) {
-				definedElement = (Element) catgs.item(n);
-				break;
-			}
-		}
-		if (isCategory) {
-			_definedCategoryMap.put(refName, definedElement);
-		} else {
-			_definedAttributeMap.put(refName, definedElement);
-		}
-		return definedElement;
-	}
-
-	private AttributeDescriptor parseAttribute(String categoryName,
-			Element attribute) {
-		AttributeDescriptor attrDesc = new AttributeDescriptor();
-		attrDesc.setCategory(categoryName);
-
-		attrDesc.setAttributeName(attribute.getAttribute("name"));
-		attrDesc.setDescription(attribute.getAttribute("description"));
-		attrDesc.setValueType(attribute.getAttribute("type"));
-		attrDesc.setRequired(attribute.hasAttribute("required"));
-		attrDesc.setTypeParameter(attribute.getAttribute("typeparam"));
-		String labelKey = attribute.getAttribute("displaylabel");
-		attrDesc.setLabelString(getValue(labelKey));
-
-		NodeList optionNodes = attribute.getElementsByTagName("option");
-		if (optionNodes != null && optionNodes.getLength() != 0) {
-			HashMap optionMap = new HashMap();
-			int opLength = optionNodes.getLength();
-			String defaultValue = null;
-			for (int m = 0; m < opLength; m++) {
-				Element optNode = (Element) optionNodes.item(m);
-				String key = optNode.getAttribute("key");
-				String value = optNode.getAttribute("value");
-				if (value == null || value.length() == 0) {
-					value = key;
-				}
-				if (optNode.hasAttribute("default")) {
-					defaultValue = value;
-				}
-				optionMap.put(key, value);
-			}
-			attrDesc.setOptions(optionMap, defaultValue);
-		}
-
-		return attrDesc;
-	}
-
-	private String getValue(String key) {
-		if (key != null && key.startsWith("%")) {
-			String cmStr = this._url.toString();
-			String propBaseStr = cmStr.substring(0, cmStr.lastIndexOf("."));
-
-			String[] localeOptions = LocaleFallback.fallBack(Locale
-					.getDefault());
-			String[] options = localeOptions;
-			if (_optimizedLocales != null) {
-				options = _optimizedLocales;
-			}
-			for (int i = 0, size = options.length; i < size; i++) {
-				StringBuffer sb = new StringBuffer();
-				sb.append(propBaseStr);
-				sb.append(options[i]);
-				sb.append(".properties");
-				String str = sb.toString();
-
-				ResourceBundle rb = null;
-				try {
-					URL propUrl = new URL(str);
-					rb = new PropertyResourceBundle(propUrl.openStream());
-				} catch (Exception e1) {
-					// we don't handle the exception here,since it is in a
-					// fallback route,it is possible of not exist
-					// _log.info("Info.ElementDescReader.ReadPropertyFile",
-					// str);
-					continue;
-				}
-				if (_optimizedLocales == null) {
-					setOptimizedLocales(localeOptions, i);
-				}
-
-				String rbKey = key.substring(1);
-				String value = null;
-				try {
-					value = rb.getString(rbKey);
-				} catch (Exception e) {
-					_log.info("Info.ElementDescReader.ReadPropertyFile.Key",
-							rbKey, str, null);
-					continue;
-				}
-
-				if (value != null) {
-					return value;
-				}
-
-			}
-			return null;
-		}
-		return key;
-	}
-
-	private void setOptimizedLocales(String[] originalLocales, int startPoint) {
-		int size = originalLocales.length - startPoint;
-		_optimizedLocales = new String[size];
-		for (int i = 0; i < size; i++) {
-			_optimizedLocales[i] = originalLocales[i + startPoint];
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/ElementDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/ElementDescriptor.java
deleted file mode 100644
index 8a87c00..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/ElementDescriptor.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.meta.internal;
-
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.jst.pagedesigner.meta.IElementDescriptor;
-
-/**
- * @author mengbo
- */
-public class ElementDescriptor implements IElementDescriptor {
-	String _tagName;
-
-	String _namespaceURI;
-
-	IAttributeDescriptor[] _attrs;
-
-	private String _helpContextID;
-
-	/**
-	 * 
-	 */
-	public ElementDescriptor() {
-		super();
-		// TODO Auto-generated constructor stub
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IElementDescriptor#getTagName()
-	 */
-	public String getTagName() {
-		return _tagName;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IElementDescriptor#getNamespaceURI()
-	 */
-	public String getNamespaceURI() {
-		return _namespaceURI;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IElementDescriptor#getAttributeDescriptors()
-	 */
-	public IAttributeDescriptor[] getAttributeDescriptors() {
-		return _attrs;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IElementDescriptor#getReference()
-	 */
-	public IElementDescriptor getReference() {
-		return null;
-	}
-
-	public void setNamespaceURI(String namespaceURI) {
-		this._namespaceURI = namespaceURI;
-	}
-
-	public void setTagName(String tagName) {
-		this._tagName = tagName;
-	}
-
-	public void setAttributeDescriptors(List attrs) {
-		if (attrs == null || attrs.isEmpty()) {
-			_attrs = new IAttributeDescriptor[0];
-		} else {
-			_attrs = new IAttributeDescriptor[attrs.size()];
-			attrs.toArray(_attrs);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IElementDescriptor#getAttributeDescriptor(java.lang.String)
-	 */
-	public IAttributeDescriptor getAttributeDescriptor(String attributeName) {
-		if (_attrs != null) {
-			for (int i = 0; i < _attrs.length; i++) {
-				IAttributeDescriptor descriptor = _attrs[i];
-				if (descriptor.getAttributeName().equalsIgnoreCase(
-						attributeName)) {
-					return descriptor;
-				}
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IElementDescriptor#getHelpContextID()
-	 */
-	public String getHelpContextID() {
-		return _helpContextID;
-	}
-
-	public void setHelpContextID(String contextid) {
-		_helpContextID = contextid;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/LocaleFallback.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/LocaleFallback.java
deleted file mode 100644
index fa62e94..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/LocaleFallback.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.meta.internal;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class LocaleFallback {
-	private static Map map = new HashMap();
-
-	public static synchronized String[] fallBack(Locale locale) {
-		if (map.get(locale) != null) {
-			return (String[]) map.get(locale);
-		}
-		// first compute the fallback locales according to the input locale
-		List inputLocaleList = calculateLocaleNames(locale);
-		String[] ins = reverseList(inputLocaleList);
-		// then compute the fallback locales accroding to the system default
-		// locale
-		int defsSize = 0;
-		String[] defs = null;
-		if (!locale.equals(Locale.getDefault())) {
-			List defLocaleList = calculateLocaleNames(Locale.getDefault());
-			defs = reverseList(defLocaleList);
-			defsSize = defs.length;
-		}
-
-		int insSize = ins.length;
-		int size = insSize + defsSize;
-
-		String[] options = new String[size + 1];
-		for (int i = 0; i < size; i++) {
-			if (i < insSize) {
-				options[i] = ins[i];
-			} else {
-				options[i] = defs[i - insSize];
-			}
-		}
-		// last add blank string in order to search the base file
-		options[size] = "";
-		map.put(locale, options);
-
-		return options;
-
-	}
-
-	private static List calculateLocaleNames(Locale locale) {
-		List list = new ArrayList();
-		StringBuffer item;
-
-		String language = locale.getLanguage();
-		String country = locale.getCountry();
-		String variant = locale.getVariant();
-
-		int languageLength = language.length();
-		int countryLength = country.length();
-		int variantLength = variant.length();
-
-		if (languageLength == 0 && countryLength == 0 && variantLength == 0) {
-			// The locale is "", "", "".
-			return list;
-		}
-        item = new StringBuffer();
-        item = item.append('_').append(language);
-        list.add(item.toString());
-
-		if (countryLength == 0 && variantLength == 0) {
-			return list;
-		}
-        item.append('_').append(country);
-        list.add(item.toString());
-
-		if (variantLength == 0) {
-			return list;
-		}
-        item.append('_').append(variantLength);
-        list.add(item.toString());
-
-		return list;
-	}
-
-	private static String[] reverseList(List list) {
-		int size = list.size();
-		String[] vals = new String[size];
-		for (int i = 0; i < size; i++) {
-			vals[i] = (String) list.get(size - 1 - i);
-		}
-		return vals;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/SimpleCMRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/SimpleCMRegistry.java
deleted file mode 100644
index 6c198f4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/SimpleCMRegistry.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.meta.internal;
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.xml.parsers.FactoryConfigurationError;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.eclipse.jst.pagedesigner.meta.ICMRegistry;
-import org.eclipse.jst.pagedesigner.meta.IElementDescriptor;
-import org.xml.sax.SAXException;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class SimpleCMRegistry implements ICMRegistry {
-	String _uri;
-
-	Map _map = new HashMap();
-
-	/**
-	 * @throws IOException
-	 * @throws SAXException
-	 * @throws FactoryConfigurationError
-	 * @throws ParserConfigurationException
-	 * 
-	 */
-	public SimpleCMRegistry(String uri, URL cmFileUrl)
-			throws ParserConfigurationException, FactoryConfigurationError,
-			SAXException, IOException {
-		this._uri = uri;
-		ElementDescReader reader = new ElementDescReader(cmFileUrl);
-		reader.readElements(_map);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.ICMRegistry#getSupportedURI()
-	 */
-	public String getSupportedURI() {
-		return _uri;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.ICMRegistry#getElementDescriptor(java.lang.String,
-	 *      java.lang.String)
-	 */
-	public IElementDescriptor getElementDescriptor(String uri, String tagname) {
-		if (uri.equals(_uri)) {
-			return (IElementDescriptor) _map.get(tagname);
-		}
-		return null;
-	}
-
-}
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 3e0eee9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/CSSStyleAdapterFactory.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.style.AbstractStyle;
-import org.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CSSStyleAdapterFactory extends AbstractAdapterFactory {
-	static Class ADAPTERKEY = ICSSStyle.class;
-
-	// TODO: dead? private static CSSStyleAdapterFactory _instance = new CSSStyleAdapterFactory();
-
-	private CSSStyleAdapterFactory() {
-		super(ADAPTERKEY, true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @seeorg.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory#createAdapter(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier)
-	 */
-	protected INodeAdapter createAdapter(INodeNotifier target) {
-		if (target instanceof Element) {
-			return new AbstractStyle((Element) target);
-		}
-        return null;
-	}
-
-	/**
-	 * @return
-	 */
-	public static CSSStyleAdapterFactory getInstance() {
-        // TODO: this 'singleton' is broken
-		return new CSSStyleAdapterFactory();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/DocumentEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/DocumentEditPart.java
deleted file mode 100644
index 71a4214..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/DocumentEditPart.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowPage;
-import org.eclipse.wst.css.core.internal.event.ICSSStyleListener;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSSelector;
-import org.eclipse.wst.html.core.internal.htmlcss.StyleListener;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- */
-public class DocumentEditPart extends NodeEditPart implements StyleListener,
-		ICSSStyleListener {
-	boolean _refreshing = false;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren()
-	 */
-	protected List getModelChildren() {
-		List list = new ArrayList();
-		Node model = (Node) getModel();
-		if (model == null) {
-			return list;
-		}
-
-		NodeList children1 = model.getChildNodes();
-		for (int i = 0, n = children1.getLength(); i < n; i++) {
-			Node node = children1.item(i);
-			if (node.getNodeType() != Node.TEXT_NODE
-					&& node.getNodeType() != Node.ELEMENT_NODE) {
-				continue;
-			}
-			list.add(node);
-		}
-		return list;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		FlowPage f = new FlowPage();
-		return f;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		refresh();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#refresh()
-	 */
-	public void refresh() {
-		if (_refreshing) {
-			return;
-		}
-		_refreshing = true;
-		try {
-			super.refresh();
-		} finally {
-			_refreshing = false;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#refreshChildren()
-	 */
-	protected void refreshChildren() {
-		super.refreshChildren();
-		List children1 = getChildren();
-		for (int i = 0, size = children1.size(); i < size; i++) {
-			((EditPart) children1.get(i)).refresh();
-		}
-	}
-
-	// protected void removeChildVisual(EditPart childEditPart)
-	// {
-	// if (childEditPart instanceof SubNodeEditPart)
-	// {
-	// Node node = ((SubNodeEditPart) childEditPart).getNodeForFigure();
-	// if (node != null)
-	// {
-	// getDestDocumentForDesign().removeChild(node);
-	// }
-	// }
-	// super.removeChildVisual(childEditPart);
-	// }
-	//    
-	// protected void addChildVisual(EditPart childEditPart, int index)
-	// {
-	// if (childEditPart instanceof SubNodeEditPart)
-	// {
-	// Node node = ((SubNodeEditPart) childEditPart).getNodeForFigure();
-	// if (node != null)
-	// {
-	// NodeList nodeList = getDestDocumentForDesign().getChildNodes();
-	// if (nodeList.getLength() > index)
-	// {
-	// getDestDocumentForDesign().insertBefore(node, nodeList.item(index));
-	// }
-	// else
-	// {
-	// getDestDocumentForDesign().appendChild(node);
-	// }
-	// }
-	// }
-	// super.addChildVisual(childEditPart, index);
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.html.core.internal.htmlcss.StyleListener#styleChanged()
-	 */
-	public void styleChanged() {
-		// refresh the whole document when style change (<style> or <link>)
-		this.refreshStyle();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.css.core.internal.event.ICSSStyleListener#styleChanged(org.eclipse.wst.css.core.internal.provisional.document.ICSSModel,
-	 *      org.eclipse.wst.css.core.document.ICSSSelector[],
-	 *      org.eclipse.wst.css.core.document.ICSSSelector[], java.lang.String)
-	 */
-	public void styleChanged(ICSSModel srcModel, ICSSSelector[] removed,
-			ICSSSelector[] added, String media) {
-		if ((removed != null && removed.length > 0) || added != null
-				&& added.length > 0) {
-			this.refreshStyle();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.css.core.internal.event.ICSSStyleListener#styleUpdate(org.eclipse.wst.css.core.internal.provisional.document.ICSSModel)
-	 */
-	public void styleUpdate(ICSSModel srcModel) {
-		this.refreshStyle();
-	}
-
-	/**
-	 * 
-	 */
-	private void refreshStyle() {
-		List childParts = this.getChildren();
-		for (Iterator iter = childParts.iterator(); iter.hasNext();) {
-			EditPart part = (EditPart) iter.next();
-			if (part instanceof ElementEditPart) {
-				IDOMNode node = (IDOMNode) ((ElementEditPart) part)
-						.getNodeForFigure();
-				if (node != null) {
-					refreshChildStyles(node);
-				}
-			}
-		}
-		getFigure().revalidate();
-		// getFigure().repaint();
-	}
-
-	/**
-	 * @param node
-	 */
-	private void refreshChildStyles(IDOMNode node) {
-		NodeList childNodes = node.getChildNodes();
-		for (int i = 0, size = childNodes.getLength(); i < size; i++) {
-			refreshChildStyles((IDOMNode) childNodes.item(i));
-		}
-		if (node instanceof IDOMElement) {
-			// only refresh style on element.
-			ICSSStyle a = (ICSSStyle) node.getAdapterFor(ICSSStyle.class);
-			if (a != null) {
-				a.reset();
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/EditProxyAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/EditProxyAdapter.java
deleted file mode 100644
index 9cd7ff0..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;
-
-	/**
-	 * 
-	 */
-	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 be35c7d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/ElementEditPart.java
+++ /dev/null
@@ -1,631 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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());
-		}
-	}
-
-	/**
-	 * @param node
-	 * @return
-	 */
-	public IElementEdit getElementEdit() {
-		// XXX: should we cache it?
-		return ElementEditFactoryRegistry.getInstance().createElementEdit(
-				_elementNode);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.NodeEditPart#addNotify()
-	 */
-	public void addNotify() {
-		if (_tagConverter == null) {
-			_tagConverter = getTagConverter(_elementNode);
-			_tagConverter.convertRefresh(null);
-			adaptEditProxy();
-		}
-		super.addNotify();
-	}
-
-	/**
-	 * @param node
-	 * @return
-	 */
-	private ITagConverter getTagConverter(Element node) {
-		return DTManager.getInstance().getTagConverter(node,
-				IConverterFactory.MODE_DESIGNER,
-				this.getDestDocumentForDesign());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#removeNotify()
-	 */
-	public void removeNotify() {
-		super.removeNotify();
-		// if (_tagConverter != null)
-		// {
-		// _tagConverter.dispose();
-		// _tagConverter = null;
-		// }
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren()
-	 */
-	protected List getModelChildren() {
-		List children = new ArrayList(_tagConverter.getChildModeList());
-        
-        for (Iterator it = _tagConverter.getNonVisualChildren().iterator(); it.hasNext();)
-        {
-            Element nonVisualChild = (Element) it.next();
-            children.add(DTManager.getInstance().getTagConverter(nonVisualChild,
-                IConverterFactory.MODE_DESIGNER,
-                this.getDestDocumentForDesign()));
-        }
-        return children;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		// if (_tagConverter.isVisualByHTML())
-		// {
-		// Element result = _tagConverter.getResultElement();
-		// return FigureFactory.createFigure(result,
-		// true);//_tagConverter.isMultiLevel());
-		// }
-		// else
-		// {
-		// CSSWidgetFigure figure = new CSSWidgetFigure(this._elementNode,
-		// createHiddenProvider());
-		// return figure;
-		// }
-		return new CSSFigure();
-	}
-
-	/**
-	 * @return
-	 */
-	private HiddenProvider createHiddenProvider() {
-		Element result = _tagConverter.getHostElement();
-		String localName = result.getLocalName();
-		String appendString = localName;
-		if (localName.equalsIgnoreCase(IJSPCoreConstants.TAG_DIRECTIVE_TAGLIB)) {
-			appendString = ((IDOMElement) result)
-					.getAttribute(IJSPCoreConstants.ATTR_URI);
-			if (appendString == null) {
-				appendString = "";
-			}
-		}
-		Image image = _tagConverter.getVisualImage();
-		HiddenProvider provider = new HiddenProvider(image, this);
-		((CSSFigure) getFigure()).setCSSStyle(provider.getCSSStyle());
-		provider.setLabel(appendString);
-		return provider;
-	}
-
-	/**
-	 * called by the
-	 * 
-	 */
-	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);
-	}
-
-	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
-	 */
-	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
-	 */
-	public boolean canHaveDirectTextChild() {
-		return CMUtil.canHaveDirectTextChild(this._elementNode);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.NodeEditPart#isResizable()
-	 */
-	public boolean isResizable() {
-		if (!_tagConverter.isVisualByHTML()) {
-			return false;
-		}
-		IElementEdit edit = this.getElementEdit();
-		if (edit != null) {
-			return edit.isResizable(this._elementNode);
-		}
-        CMElementDeclaration decl = CMUtil
-        		.getElementDeclaration(this._elementNode);
-        if (decl != null) {
-        	// XXX: default implementation, if this element support "style"
-        	// attribute,
-        	// then we think it support resize.
-        	return decl.getAttributes().getNamedItem("style") != null;
-        }
-        return true;
-	}
-
-	/**
-	 * @param parent
-	 * @return
-	 */
-	private IFigure getFigure(Node parent) {
-		if (parent instanceof INodeNotifier) {
-			IFigureHandler handler = (IFigureHandler) ((INodeNotifier) parent)
-					.getAdapterFor(IFigureHandler.class);
-			if (handler != null) {
-				return handler.getFigure();
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#addChildVisual(org.eclipse.gef.EditPart,
-	 *      int)
-	 */
-	protected void addChildVisual(EditPart childEditPart, int index) {
-        
-        boolean figureAdded = false;
-
-        if (childEditPart instanceof NonVisualComponentEditPart)
-        {
-            getNonVisualElementBar().addNonVisualChild(((NonVisualComponentEditPart) childEditPart));
-            figureAdded = true;
-            //TODO: need better flow of control.
-            return;
-        }
-        
-		Node childNode = (Node) childEditPart.getModel();
-		IFigure childFigure = ((GraphicalEditPart) childEditPart).getFigure();
-		ConvertPosition position = _tagConverter
-				.getChildVisualPosition(childNode);
-		if (position != null) {
-			Node parent = position.getParentNode();
-			// link up figure.
-			IFigure parentFigure = getFigure(parent);
-			if (parentFigure != null) {
-				parentFigure.add(childFigure, position.getIndex());
-				figureAdded = true;
-			}
-			// link up style
-			if (parent instanceof INodeNotifier) {
-				ICSSStyle parentStyle = (ICSSStyle) ((INodeNotifier) parent)
-						.getAdapterFor(ICSSStyle.class);
-				if (parentStyle != null) {
-					ICSSStyle childStyle = (ICSSStyle) ((INodeNotifier) childNode)
-							.getAdapterFor(ICSSStyle.class);
-					if (childStyle instanceof AbstractStyle) {
-						((AbstractStyle) childStyle)
-								.setParentStyle(parentStyle);
-					}
-				}
-			}
-			// link up the nodeForFigure
-			if (childEditPart instanceof SubNodeEditPart) {
-				Node nodeForFigure = ((SubNodeEditPart) childEditPart)
-						.getNodeForFigure();
-				if (nodeForFigure != null /*
-											 * && !(nodeForFigure instanceof
-											 * PseudoElement)
-											 */) {
-					parent.appendChild(nodeForFigure);
-				}
-			}
-		} else {
-		    _log.error("getChildVisualPosition() return null");
-		}
-
-		if (!figureAdded) {
-			super.addChildVisual(childEditPart, index);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#removeChildVisual(org.eclipse.gef.EditPart)
-	 */
-	protected void removeChildVisual(EditPart childEditPart) {
-        // remove figure
-        IFigure childFigure = ((GraphicalEditPart) childEditPart).getFigure();
-        IFigure parent = childFigure.getParent();
-
-		if (parent != null) {
-			parent.remove(childFigure);
-		}
-        
-        if (childEditPart instanceof NonVisualComponentEditPart)
-        {
-            _nonVisualElementBar.removeNonVisualChild((NonVisualComponentEditPart) childEditPart);
-        }
-        // this only applies to visual edit parts
-        else
-        {
-    		// de-link style
-    		Node childNode = (Node) childEditPart.getModel();
-    		ICSSStyle childStyle = (ICSSStyle) ((INodeNotifier) childNode)
-    				.getAdapterFor(ICSSStyle.class);
-    		if (childStyle instanceof AbstractStyle) {
-    			((AbstractStyle) childStyle).setParentStyle(null);
-    		}
-    		// de-link nodeForFigure
-    		if (childEditPart instanceof SubNodeEditPart) {
-    			Node nodeForFigure = ((SubNodeEditPart) childEditPart)
-    					.getNodeForFigure();
-    			if (nodeForFigure != null && nodeForFigure.getParentNode() != null) {
-    				nodeForFigure.getParentNode().removeChild(nodeForFigure);
-    			}
-    		}
-        }
-	}
-
-	/**
-	 * @return
-	 */
-	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
-	 */
-	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;
-    }
-
-    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 ec44b37..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/HTMLEditPartsFactory.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.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;
-
-	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 8b122db..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NodeEditPart.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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;
-	}
-
-	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
-	 */
-	public IDOMNode getIDOMNode() {
-		return ((IDOMNode) getModel());
-	}
-
-    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
-	 */
-	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
-	 */
-	public boolean allowSelectionRangeAcross() {
-		return true;
-	}
-
-	/**
-	 * @return
-	 */
-	public boolean isResizable() {
-		return false;
-	}
-    
-    public boolean isDragActive() {
-        return _isDragActive;
-    }
-    
-    public void setDragActive(boolean newValue)
-    {
-        _isDragActive = newValue;
-    }
-    
-    /**
-     * @param defaultCursor
-     * @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 1bc6b08..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NonVisualComponentEditPart.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-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);
-    }
-
-    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;
-    }
-    
-    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 3f6f120..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.HTMLGraphicalViewer;
-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) {
-				((HTMLGraphicalViewer) 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 04aa76e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/RefresherFactory.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.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 {
-	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();
-
-	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 dc4ec9d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/TextEditPart.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.parts;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.SharedCursors;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSTextFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.jst.pagedesigner.editpolicies.LinkEditPolicy;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class TextEditPart extends SubNodeEditPart implements ICSSTextProvider {
-	private String _cachedData;
-
-	private Text _textNode;
-
-	private Text _textNodeForFigure;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.EditPart#setModel(java.lang.Object)
-	 */
-	public void setModel(Object model) {
-		super.setModel(model);
-		_textNode = (Text) model;
-		_cachedData = _textNode.getData();
-		_textNodeForFigure = getDestDocumentForDesign().createTextNode(
-				_cachedData);
-	}
-
-	protected IFigure createFigure() {
-		// XXX: currently creating of CSSTextFigure is distributed both here
-		// and FigureFactory. We may want to unify them later.
-		return new CSSTextFigure(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		super.createEditPolicies();
-		this.installEditPolicy("link editpolicy", new LinkEditPolicy());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.SubNodeEditPart#getNodeForFigure()
-	 */
-	public Node getNodeForFigure() {
-		return _textNodeForFigure;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.sse.model.INodeAdapter#notifyChanged(com.ibm.sse.model.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		_cachedData = _textNode.getData();
-		_textNodeForFigure.setData(_cachedData);
-		if (eventType == INodeNotifier.CHANGE) {
-			getFigure().revalidate();
-		} else {
-			// XXX: been removed? parent EditPart should have handled it.
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider#getCSSStyle()
-	 */
-	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
-	 * @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
-	 */
-	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 9e26c21..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PageExpressionContext.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.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;
-	}
-
-	public static void reset() {
-		_current = null;
-	}
-
-	public static void initialize(IProject prj) {
-		_current = new PageExpressionContext(prj);
-	}
-
-	public static PageExpressionContext getCurrent() {
-		return _current;
-	}
-
-	public void pushPageVarProvider(IPageVariablesProvider provider) {
-		_pageVarProviders.add(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 pageVars
-	 * @param jspFile
-	 * @param options
-	 *            XXX: not used today. In the future, we may support things like
-	 *            locale in options
-	 * @return
-	 */
-	public Object evaluateExpression(String expression, Class expectedClass,
-			Map options) throws ELException {
-		expression = JSFELParserHelper.toJspElExpression(expression);
-		ExpressionEvaluatorImpl evaluator = new ExpressionEvaluatorImpl();
-		FunctionMapper mapper = new EmptyFunctionMapper();
-
-		return evaluator.evaluate(expression, expectedClass, resolver, mapper);
-	}
-
-	class SimpleVariableResolver implements VariableResolver {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see javax.servlet.jsp.el.VariableResolver#resolveVariable(java.lang.String)
-		 */
-		public Object resolveVariable(String varName) throws ELException {
-			// reverse order.
-			for (int k = _pageVarProviders.size() - 1; k >= 0; k--) {
-				IPageVariablesProvider _pageVars = (IPageVariablesProvider) _pageVarProviders
-						.get(k);
-				if (_pageVars != null) {
-					IVariableInfo[] vars = _pageVars.getBeanInfos();
-					if (vars != null) {
-						for (int i = 0; i < vars.length; i++) {
-							if (varName.equals(vars[i].getName())) {
-								// ok we found.
-								if (vars[i].getMode() == IVariableInfo.RESOURCEBUNDLE) {
-									String resourceName = vars[i]
-											.getTypeInfoString();
-									IStorage s = null;
-									try {
-										s = LoadBundleUtil
-												.getLoadBundleResource(_prj,
-														resourceName);
-									} catch (CoreException ex) {
-										// "Error"
-										_log
-												.info(
-														"PageExpressionContext.Info.0", ex); //$NON-NLS-1$
-									}
-									if (s == null) {
-										throw new ELException();
-									}
-									InputStream input = null;
-									try {
-										input = new BufferedInputStream(s
-												.getContents());
-										Properties p = new Properties();
-										p.load(input);
-										return p;
-									} catch (CoreException e) {
-										throw new ELException(e);
-									} catch (IOException e) {
-										throw new ELException(e);
-									} finally {
-										ResourceUtils.ensureClosed(input);
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-			throw new ELException("Can't find: " + varName); //$NON-NLS-1$
-		}
-
-	}
-
-	static class EmptyFunctionMapper implements FunctionMapper {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see javax.servlet.jsp.el.FunctionMapper#resolveFunction(java.lang.String,
-		 *      java.lang.String)
-		 */
-		public Method resolveFunction(String arg0, String arg1) {
-			return null;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewConvertContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewConvertContext.java
deleted file mode 100644
index 4c0b2f7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewConvertContext.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.preview;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.dtmanager.DTManager;
-import org.eclipse.wst.xml.core.internal.document.InvalidCharacterException;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PreviewConvertContext {
-	private Logger _log = PDPlugin.getLogger(PreviewConvertContext.class);
-
-	private IDOMDocument _destDocument;
-
-	/**
-	 * Instantiates an instance for the specified IDOMDocument.
-	 * 
-	 * @param destDocument IDOMDocument instance.
-	 */
-	public PreviewConvertContext(IDOMDocument destDocument) {
-		this._destDocument = destDocument;
-	}
-
-	/**
-	 * Converts specified Node for preview.
-	 * 
-	 * @param ele Node instance to convert.
-	 * @return Converted Node instance.
-	 */
-	public Node previewConvert(Node ele) {
-		if (ele instanceof Element) {
-			return previewConvertElement((Element) ele);
-		} else if (ele instanceof Text) {
-			return createText((Text) ele);
-		} else {
-			// XXX: we'll support other node like doctype etc in the future.
-			// so they should also be rendered into preview.
-
-			return null;
-		}
-	}
-
-	/**
-	 * @param text
-	 * @return
-	 */
-	private Node createText(Text text) {
-		Text previewText = this._destDocument.createTextNode(text.getData());
-		try {
-			((IDOMText) previewText).setSource(((IDOMText) text).getSource());
-		} catch (InvalidCharacterException e) {
-			// "Error"
-			_log.info("PreviewConvertContext.Error.0", e); //$NON-NLS-1$
-		}
-		return previewText;
-	}
-
-	/**
-	 * Converts specified Element instance for preview.
-	 * 
-	 * @param ele Element instance to be converted.
-	 * @return Converted Node instance.
-	 */
-	protected Node previewConvertElement(Element ele) {
-		ITagConverter converter = createTagConverter(ele);
-		if (!converter.isVisualByHTML()) {
-			return null;
-		}
-		converter.convertRefresh(null);
-		Element result = converter.getResultElement();
-		List children = converter.getChildModeList();
-		if (children != null) {
-			for (int i = 0, size = children.size(); i < size; i++) {
-				Node child = (Node) children.get(i);
-				if (child != null) {
-					Node childPreview = previewConvert(child);
-					if (childPreview != null) {
-						ConvertPosition position = converter
-								.getChildVisualPosition(child);
-						if (position != null) {
-							/* FIX for bug #179403
-							// FIXME: not using index here, need fix.
-							position.getParentNode().appendChild(childPreview);
-							*/
-							NodeList childNodes = position.getParentNode().getChildNodes();
-							if (childNodes.getLength() > position.getIndex()) {
-								Node item = childNodes.item(position.getIndex());
-								position.getParentNode().insertBefore(childPreview, item);
-							} else {
-								position.getParentNode().appendChild(childPreview);
-							}
-						}
-					}
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param ele
-	 * @return
-	 */
-	private ITagConverter createTagConverter(Element ele) {
-		return DTManager.getInstance().getTagConverter(ele,
-				IConverterFactory.MODE_PREVIEW, _destDocument);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewHandlerNew.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewHandlerNew.java
deleted file mode 100644
index 16c5a34..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewHandlerNew.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.preview;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IDocumentPageVariableAdapter;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.utils.PreviewUtil;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.html.core.internal.provisional.contenttype.ContentTypeIdForHTML;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.xml.core.internal.document.XMLGeneratorImpl;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.ISourceGenerator;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PreviewHandlerNew {
-	//private static Logger _log = PDPlugin.getLogger(PreviewHandlerNew.class);
-
-	/**
-	 * @param part
-	 * @param result
-	 */
-	public static void generatePreview(DocumentEditPart part,
-			StringBuffer result) {
-		try {
-			IProject prj = StructuredModelUtil.getProjectFor(part.getIDOMNode()
-					.getModel());
-			PageExpressionContext.initialize(prj);
-
-			IDOMDocument doc = (IDOMDocument) part.getIDOMNode();
-			Object obj = doc.getAdapterFor(IDocumentPageVariableAdapter.class);
-			if (obj instanceof IPageVariablesProvider) {
-				((IPageVariablesProvider) obj).refresh();
-				PageExpressionContext.getCurrent().pushPageVarProvider(
-						(IPageVariablesProvider) obj);
-			} else {
-				PageExpressionContext.getCurrent().pushPageVarProvider(null);
-			}
-
-			// IDOMModel previewModel =
-			// (IDOMModel)StructuredModelManager.getModelManager().createNewInstance(doc.getModel());
-			// IDOMDocument previewDoc = previewModel.getDocument();
-
-			// CR400625: creating XML model here instead of HTML model. Since
-			// for HTML model, there are checking enforced
-			// by WTP to make sure the HTML content model is not invalidated.
-			// And sometimes, the converted HTML may not fully
-			// comply with HTML content model.
-			// Use XML instead to workaround the content model validation.
-
-			// CR403449: But if we use XML, then system can't recogonize special
-			// tag such as "script", "style", they
-			// support <!-- --> in them.
-			// So we are still using HTML model, but in TagConverter, we are
-			// always caling DOMUtil.cloneNodeDeepIgnoreError
-			// to try to skip the errors.
-			// Hopefully in later version of SSE, the famous "br" problem is
-			// fixed, and we won't met error when doing
-			// deep clone.
-			// IStructuredModel sModel =
-			// StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(IContentTypeIdentifier.ContentTypeID_XML);
-			// FIXME: if is not jsp, should use original contentType, if is jsp,
-			// should use the corresponding
-			// content type
-			IStructuredModel sModel = StructuredModelManager.getModelManager()
-					.createUnManagedStructuredModelFor(
-							ContentTypeIdForHTML.ContentTypeID_HTML);
-
-			IDOMDocument previewDoc = ((IDOMModel) sModel).getDocument();
-			PreviewConvertContext context = new PreviewConvertContext(
-					previewDoc);
-
-			ISourceGenerator generator = XMLGeneratorImpl.getInstance();
-			List subeditparts = part.getChildren();
-			for (int i = 0, size = subeditparts.size(); i < size; i++) {
-				NodeEditPart subpart = (NodeEditPart) subeditparts.get(i);
-				Node node = context.previewConvert(subpart.getIDOMNode());
-
-				PreviewUtil.previewNode(node);
-
-				if (node != null) {
-					result.append(generator.generateSource(node));
-				}
-
-			}
-			sModel.releaseFromEdit();
-		} finally {
-			PageExpressionContext.reset();
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.java
deleted file mode 100644
index bae36d9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.preview;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- */
-public class PreviewResources extends ResourceUtils {
-	/** Create the logger for this class */
-	private static Logger _log = PDPlugin.getLogger(PreviewResources.class);
-
-	private static PreviewResources _resource; // singleton
-
-	private static final String BUNDLE = "org.eclipse.jst.pagedesigner.preview.PreviewResources";
-
-	/**
-	 * Empty Constructor.
-	 * 
-	 * @return WizardsResources
-	 */
-
-	public static PreviewResources getInstance() {
-		if (_resource == null) {
-			_resource = new PreviewResources();
-		}
-		return _resource;
-	}
-
-	/**
-	 * The constructor create a resource bundle
-	 */
-	protected PreviewResources() {
-		try {
-			_resources = ResourceBundle.getBundle(BUNDLE);
-			// NOTE: this throws a runtime "MissingResourceException".
-		} catch (MissingResourceException ee) {
-			_log
-					.error(
-							"Log.Error.PreviewResources.ResouceNotFound", BUNDLE, ee); //$NON-NLS-1$
-		}
-		setBundle(_resources, BUNDLE);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.properties
deleted file mode 100644
index 28cc1a2..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, 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
-###############################################################################
-####################################################
-# 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 6bf32d5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/WindowsIEBrowser.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.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;
-
-public class WindowsIEBrowser implements ProgressListener {
-	private Browser _browser;
-
-	private File _file;
-
-	public void create(Composite composite, int i) {
-		_browser = new Browser(composite, i);
-		_browser.addProgressListener(this);
-	}
-
-	public synchronized void loadFile(File file) {
-		if (_browser == null) {
-			return;
-		}
-        _file = file;
-        String s = "file:" + file.getAbsolutePath();
-        _browser.setUrl(s);
-        return;
-	}
-
-	public void dispose() {
-		if (_browser == null) {
-			return;
-		}
-        _browser.dispose();
-        _browser = null;
-        return;
-	}
-
-	public void changed(ProgressEvent progressevent) {
-        // do nothing
-	}
-
-	public synchronized void completed(ProgressEvent progressevent) {
-		if (_file != null) {
-			// XXX: don't delete, for debug purpose.
-			// _file.delete();
-			// _file = null;
-		}
-	}
-
-	/**
-	 * 
-	 */
-	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 f69e35e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AllPropertySection.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.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.wst.common.ui.properties.internal.provisional.AbstractPropertySection;
-import org.eclipse.wst.common.ui.properties.internal.provisional.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 MyPropertySheetPage page;
-
-	protected IPropertySourceProvider _provider;
-
-	protected IDOMElement _element;
-
-	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();
-		}
-	};
-
-	/**
-	 * 
-	 */
-	public AllPropertySection() {
-		this.setPropertySourceProvider(new AttributePropertySourceProvider());
-	}
-
-	/**
-	 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-		Composite composite = getWidgetFactory()
-				.createFlatFormComposite(parent);
-		page = new MyPropertySheetPage();
-		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);
-	}
-
-	/**
-	 * @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);
-		page.selectionChanged(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);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.wst.common.ui.properties.view.ISection#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-
-		if (_element != null) {
-			_element.removeAdapter(_adapter);
-		}
-		if (page != null) {
-			page.dispose();
-			page = null;
-		}
-	}
-
-	/**
-	 * @see org.eclipse.wst.common.ui.properties.view.ISection#refresh()
-	 */
-	public void refresh() {
-		page.refresh();
-	}
-
-	/**
-	 * @see org.eclipse.wst.common.ui.properties.view.ISection#shouldUseExtraSpace()
-	 */
-	public boolean shouldUseExtraSpace() {
-		return true;
-	}
-
-	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/AttributePropertyDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertyDescriptor.java
deleted file mode 100644
index 8a5f9c2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertyDescriptor.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.properties;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jst.pagedesigner.meta.EditorCreator;
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * This is the PropertyDescriptor for an attribute. Getting information from a
- * IAttributeDescriptor and an IPropertyDescriptor.
- * 
- * @author mengbo
- */
-public class AttributePropertyDescriptor implements IPropertyDescriptor {
-	private IAttributeDescriptor _attr;
-
-	private IPropertyDescriptor _inner; // this could be null
-
-	private Element _element;
-
-	/**
-	 * @param element
-	 *            the owner of the attribute.
-	 * @param descriptor
-	 *            can't be null
-	 * @param desc
-	 *            could be null
-	 */
-	public AttributePropertyDescriptor(Element element,
-			IAttributeDescriptor descriptor, IPropertyDescriptor desc) {
-		_element = element;
-		_attr = descriptor;
-		_inner = desc;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#createPropertyEditor(org.eclipse.swt.widgets.Composite)
-	 */
-	public CellEditor createPropertyEditor(Composite parent) {
-		CellEditor editor;
-		editor = EditorCreator.getInstance().createCellEditorWithWrapper(
-				parent, _attr, (IDOMElement) _element, null);
-
-		if (editor != null) {
-			return editor;
-		}
-        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) {
-        		if (_inner != null) {
-        			return _inner.createPropertyEditor(parent1);
-        		}
-                return new TextCellEditor(parent1);
-        	}
-        };
-        return EditorCreator.getInstance().createCellEditorWithWrapper(
-        		parent, _attr, holder, (IDOMElement) _element, null);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getCategory()
-	 */
-	public String getCategory() {
-		String cat = _attr.getCategory();
-		if (cat != null) {
-			return cat;
-		}
-        return ITabbedPropertiesConstants.OTHER_CATEGORY;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getDescription()
-	 */
-	public String getDescription() {
-		String s = _attr.getDescription();
-		if (s == null && _inner != null) {
-			return _inner.getDescription();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getDisplayName()
-	 */
-	public String getDisplayName() {
-		return _attr.getAttributeName();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getFilterFlags()
-	 */
-	public String[] getFilterFlags() {
-		if (_inner != null) {
-			return _inner.getFilterFlags();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getHelpContextIds()
-	 */
-	public Object getHelpContextIds() {
-		if (_inner != null) {
-			return _inner.getHelpContextIds();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getId()
-	 */
-	public Object getId() {
-		return _attr.getAttributeName();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getLabelProvider()
-	 */
-	public ILabelProvider getLabelProvider() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#isCompatibleWith(org.eclipse.ui.views.properties.IPropertyDescriptor)
-	 */
-	public boolean isCompatibleWith(IPropertyDescriptor anotherProperty) {
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySource.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySource.java
deleted file mode 100644
index 3979b46..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySource.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.properties;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.jst.pagedesigner.meta.ICMRegistry;
-import org.eclipse.jst.pagedesigner.meta.IElementDescriptor;
-import org.eclipse.jst.pagedesigner.meta.internal.CMRegistry;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-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;
-
-	public AttributePropertySource(Element ele, IPropertySource source) {
-		_element = (IDOMElement) ele;
-		_innerSource = source;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
-	 */
-	public Object getEditableValue() {
-		return _innerSource.getEditableValue();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
-	 */
-	public Object getPropertyValue(Object id) {
-		// CR377844: when the attribute in source is "a&gt;b", we would like to
-		// display
-		// "a>b" in cell editor. But _innerSource.getPropertyValue(id) will
-		// return the source
-		// of the attribute, so can't use that here.
-		// read QTS log for detail.
-		// return _innerSource.getPropertyValue(id);
-		if (id == null) {
-			return null;
-		}
-		String name = id.toString();
-		String value = _element.getAttribute(name);
-		if (value == null) {
-			value = ""; //$NON-NLS-1$
-		}
-		return value;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
-	 */
-	public boolean isPropertySet(Object id) {
-		return _innerSource.isPropertySet(id);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
-	 */
-	public void resetPropertyValue(Object id) {
-		_innerSource.resetPropertyValue(id);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object,
-	 *      java.lang.Object)
-	 */
-	public void setPropertyValue(final Object id, final Object value) {
-		Object oldValue = getPropertyValue(id);
-		if (oldValue == value || (oldValue != null && oldValue.equals(value))) {
-			return;
-		}
-		Command c = new ChangeAttributeCommand(
-				PDPlugin
-						.getResourceString("AttributePropertySource.CommandLabel.ChangeAttribute"), _element, (String) id, (String) value); //$NON-NLS-1$
-		c.execute();
-	}
-
-	/**
-	 * the major job of this wrapper is to provide
-	 */
-	public IPropertyDescriptor[] getPropertyDescriptors() {
-		IElementDescriptor elementDescriptor = getElementDescriptor();
-		List result = new ArrayList();
-
-		if (elementDescriptor == null) {
-			IPropertyDescriptor[] original = _innerSource
-					.getPropertyDescriptors();
-			for (int i = 0; i < original.length; i++) {
-				result
-						.add(new PropertyDescriptorWrapper(_element,
-								original[i]));
-			}
-		} else {
-			// put the inner property descriptors into a map.
-			Map map = new HashMap();
-			IPropertyDescriptor[] descs = _innerSource.getPropertyDescriptors();
-			if (descs != null) {
-				for (int i = 0; i < descs.length; i++) {
-					map.put(descs[i].getId(), descs[i]);
-				}
-			}
-
-			IAttributeDescriptor[] attrs = elementDescriptor
-					.getAttributeDescriptors();
-			if (attrs != null) {
-				for (int i = 0; i < attrs.length; i++) {
-					IPropertyDescriptor desc = (IPropertyDescriptor) map
-							.remove(attrs[i].getAttributeName());
-					result.add(new AttributePropertyDescriptor(_element,
-							attrs[i], desc));
-				}
-			}
-			// ok, we have handled all attributes declared in ElementDescriptor,
-			// let's see the remaining
-			for (Iterator iter = map.values().iterator(); iter.hasNext();) {
-				IPropertyDescriptor desc = (IPropertyDescriptor) iter.next();
-				IAttributeDescriptor attr = findReferencedAttribute(
-						elementDescriptor, desc);
-				if (attr != null) {
-					result.add(new AttributePropertyDescriptor(_element, attr,
-							desc));
-				} else {
-					result.add(new PropertyDescriptorWrapper(
-							_element, desc));
-				}
-			}
-		}
-		IPropertyDescriptor[] ret = new IPropertyDescriptor[result.size()];
-		result.toArray(ret);
-		return ret;
-	}
-
-	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());
-	}
-
-}
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 bdaa011..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySourceProvider.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.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 {
-	public AttributePropertySourceProvider() {
-        // do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertySourceProvider#getPropertySource(java.lang.Object)
-	 */
-	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 d77d4ed..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/BaseCustomSection.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.wst.common.ui.properties.internal.provisional.AbstractPropertySection;
-import org.eclipse.wst.common.ui.properties.internal.provisional.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 {
-
-	public static final Status OKSTATUS = new Status(IStatus.OK, PDPlugin
-			.getPluginId(), 0, "", null);
-
-	private DesignerTabbedPropertySheetPage _propertySheetPage;
-
-	private boolean _visible = false;
-
-	protected IDOMElement _element;
-
-	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);
-			}
-		}
-	}
-
-	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 = (DesignerTabbedPropertySheetPage) 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.
-	 * 
-	 */
-	public 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?");
-			}
-		}
-	}
-
-	public void gotoNode(Node node) {
-		_propertySheetPage.internalChangeSelection(node, node);
-	}
-
-	public IStatusLineManager getStatusLineManager() {
-		if (_propertySheetPage != null) {
-			IActionBars bar = _propertySheetPage.getSite().getActionBars();
-			if (bar != null) {
-				return bar.getStatusLineManager();
-			}
-		}
-		return null;
-	}
-
-	public 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());
-		}
-	}
-
-	public void setErrorMessage(String message) {
-		IStatusLineManager s = getStatusLineManager();
-		if (s != null) {
-			s.setErrorMessage(message);
-		}
-	}
-
-	public Status createErrorStatus(String message) {
-		return new Status(IStatus.ERROR, PDPlugin.getPluginId(), 0, message,
-				null);
-	}
-
-	public void aboutToBeHidden() {
-		applyStatus(null);
-		_visible = false;
-		super.aboutToBeHidden();
-	}
-
-	public void aboutToBeShown() {
-		super.aboutToBeShown();
-		_visible = true;
-	}
-
-	public 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);
-		}
-	}
-
-	public 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 3a209fb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/DesignerPropertyTool.java
+++ /dev/null
@@ -1,410 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.document.ElementImpl;
-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 {
-	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;
-	}
-
-	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()]);
-	}
-
-	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 part
-	 * @param selection
-	 * @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;
-	}
-
-	// /**
-	// * 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 and #4.
-	// *
-	// * @param part
-	// * @param selection
-	// * @return null if can't normalize.
-	// */
-	// public static ISelection normalizeSelection(IWorkbenchPart selectingPart,
-	// ISelection selection)
-	// {
-	// // On Attr nodes, select the owner Element. On Text nodes, select the
-	// parent Element.
-	// ISelection preferredSelection = null;
-	// if (selection instanceof ITextSelection)
-	// {
-	// // FIXME: currently always normalize to a single node. should also
-	// consider change into DesignRange
-	// // on text selection, find the appropriate Node
-	// ITextSelection textSel = (ITextSelection) selection;
-	// IStructuredModel model = null;
-	// if (selectingPart instanceof HTMLEditor)
-	// {
-	// model = ((HTMLEditor) selectingPart).getModel();
-	//
-	// Object inode = model.getIndexedRegion(textSel.getOffset());
-	// if (inode instanceof Node)
-	// {
-	// Node node = (Node) inode;
-	// // replace Attribute Node with its owner
-	// if (node.getNodeType() == Node.ATTRIBUTE_NODE)
-	// inode = ((Attr) node).getOwnerElement();
-	// // replace Text Node with its parent
-	// else if ((node.getNodeType() == Node.TEXT_NODE || (node.getNodeType() ==
-	// Node.CDATA_SECTION_NODE)) && node.getParentNode() != null)
-	// {
-	// inode = node.getParentNode();
-	// }
-	// }
-	// if (inode != null)
-	// {
-	// return new StructuredSelection(inode);
-	// }
-	// else
-	// {
-	// return null;
-	// }
-	// }
-	// else
-	// {
-	// return null;
-	// }
-	// }
-	// else if (selection instanceof IStructuredSelection)
-	// {
-	// if (((IStructuredSelection) selection).isEmpty())
-	// {
-	// return null;
-	// }
-	//
-	// IStructuredSelection structuredSel = (IStructuredSelection) selection;
-	// List inputList = new ArrayList(structuredSel.size());
-	// for (Iterator iter = structuredSel.iterator(); iter.hasNext();)
-	// {
-	// Object inode = iter.next();
-	// if (inode instanceof NodeEditPart)
-	// {
-	// inode = ((NodeEditPart) inode).getModel();
-	// }
-	//
-	// if (inode instanceof Node)
-	// {
-	// inputList.add(inode);
-	// }
-	// }
-	// if (inputList.isEmpty())
-	// {
-	// return null;
-	// }
-	// else
-	// {
-	// return new StructuredSelection(inputList);
-	// }
-	// }
-	// else if (selection instanceof DesignRange)
-	// {
-	// return selection;
-	// }
-	// else
-	// {
-	// return null;
-	// }
-	// }
-
-	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;
-	}
-
-	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
-	 */
-	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
-	 */
-	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$
-	// }
-
-	public static boolean isMultiSelection(Element element) {
-		if (element.getNodeName().equalsIgnoreCase(IHTMLConstants.TAG_OPTION)) {
-			return element.getAttribute(ICSSPropertyID.ATTR_MULTIPLE) != null;
-		}
-		return false;
-	}
-
-	public static String getElementTextSource(Element element) {
-		if (element == null) {
-			return null;
-		}
-		if (element instanceof ElementImpl) {
-			return ((ElementImpl) element).getSource();
-		}
-		return null;
-	}
-
-	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;
-	}
-
-	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/DesignerTabbedPropertySheetPage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/DesignerTabbedPropertySheetPage.java
deleted file mode 100644
index 456f731..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/DesignerTabbedPropertySheetPage.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.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.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.wst.common.ui.properties.internal.provisional.ITabbedPropertySheetPageContributor;
-import org.eclipse.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @author mengbo
- */
-public class DesignerTabbedPropertySheetPage 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);
-
-	/**
-	 * @param tabbedPropertySheetPageContributor
-	 */
-	public DesignerTabbedPropertySheetPage(
-			ITabbedPropertySheetPageContributor tabbedPropertySheetPageContributor,
-			HTMLEditor editor) {
-		super(tabbedPropertySheetPageContributor);
-		_htmlEditor = editor;
-	}
-
-	protected IStructuredModel getModel() {
-		return _htmlEditor.getModel();
-	}
-
-	/*
-	 * (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 (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);
-					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 node
-	 */
-	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));
-	}
-
-	public EditorPart getEditor() {
-		return this._htmlEditor;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.Page#init(org.eclipse.ui.part.IPageSite)
-	 */
-	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(new ISelectionListener() {
-					public void selectionChanged(IWorkbenchPart part,
-							ISelection selection) {
-						DesignerTabbedPropertySheetPage.this.selectionChanged(
-								part, selection);
-					}
-				});
-	}
-
-	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("DesignerTabbedPropertySheetPage.help.id"));
-	}
-}
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 3294ba4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/ISectionFilter.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;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface ISectionFilter {
-
-	/**
-	 * @param node
-	 * @return
-	 */
-	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 ab11aa2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/ITabbedPropertiesConstants.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;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface ITabbedPropertiesConstants {
-	static final String GENERAL_TAB_ID = "org.eclipse.jst.pagedesigner.tabQuickEdit";
-
-	static final String ALL_TAB_ID = "org.eclipse.jst.pagedesigner.tabAttributes";
-
-	static final String DEBUG_TAB_ID = "org.eclipse.jst.pagedesigner.pageDesignerTabDebug";
-
-	public String ACCCESSIBILITY_SECTION_ID = "section.accessibility";
-
-	public String ALL_PROPERTY_SECTION_ID = "section.allproperty";
-
-	/** jsf core tags */
-	public String JSF_CORE_ActionListener = "section.jsf_core_actionListener";
-
-	public String JSF_CORE_Attribute = "section.jsf_core_attribute";
-
-	public String JSF_CORE_ConvertDateTime = "section.jsf_core_convertDateTime";
-
-	public String JSF_CORE_Converter = "section.jsf_core_converter";
-
-	public String JSF_CORE_ConvertNumber = "section.jsf_core_convertNumber";
-
-	public String JSF_CORE_Facet = "section.jsf_core_facet";
-
-	public String JSF_CORE_LoadBundle = "section.jsf_core_loadBundle";
-
-	public String JSF_CORE_Param = "section.jsf_core_param";
-
-	public String JSF_CORE_SelectItem = "section.jsf_core_selectItem";
-
-	public String JSF_CORE_SelectItems = "section.jsf_core_selectItems";
-
-	public String JSF_CORE_Subview = "section.jsf_core_subview";
-
-	public String JSF_CORE_ValidateDoubleRange = "section.jsf_core_validateDoubleRange";
-
-	public String JSF_CORE_ValidateLength = "section.jsf_core_validateLength";
-
-	public String JSF_CORE_ValidateLongRange = "section.jsf_core_validateLongRange";
-
-	public String JSF_CORE_Validator = "section.jsf_core_validator";
-
-	public String JSF_CORE_ValueChangeListener = "section.jsf_core_valueChangeListener";
-
-	public String JSF_CORE_Verbatim = "section.jsf_core_verbatim";
-
-	public String JSF_CORE_View = "section.jsf_core_view";
-
-	/** jsf html tags */
-	public String JSF_HTML_Column = "section.jsf_html_column";
-
-	public String JSF_HTML_CommandButton = "section.jsf_html_commandButton";
-
-	public String JSF_HTML_CommandLink = "section.jsf_html_commandLink";
-
-	public String JSF_HTML_DataTable = "section.jsf_html_dataTable";
-
-	public String JSF_HTML_Form = "section.jsf_html_form";
-
-	public String JSF_HTML_GraphicImage = "section.jsf_html_graphicImage";
-
-	public String JSF_HTML_InputHidden = "section.jsf_html_inputHidden";
-
-	public String JSF_HTML_InputSecret = "section.jsf_html_inputSecret";
-
-	public String JSF_HTML_InputText = "section.jsf_html_inputText";
-
-	public String JSF_HTML_InputTextarea = "section.jsf_html_inputTextarea";
-
-	public String JSF_HTML_Message = "section.jsf_html_message";
-
-	public String JSF_HTML_Messages = "section.jsf_html_messages";
-
-	public String JSF_HTML_OutputFormat = "section.jsf_html_outputFormat";
-
-	public String JSF_HTML_OutputLabel = "section.jsf_html_outputLabel";
-
-	public String JSF_HTML_OutputLink = "section.jsf_html_outputLink";
-
-	public String JSF_HTML_OutputText = "section.jsf_html_outputText";
-
-	public String JSF_HTML_PanelGrid = "section.jsf_html_panelGrid";
-
-	public String JSF_HTML_PanelGroup = "section.jsf_html_panelGroup";
-
-	public String JSF_HTML_SelectBooleanCheckbox = "section.jsf_html_selectBooleanCheckbox";
-
-	public String JSF_HTML_SelectManyCheckbox = "section.jsf_html_selectManyCheckbox";
-
-	public String JSF_HTML_SelectManyListbox = "section.jsf_html_selectManyListbox";
-
-	public String JSF_HTML_SelectManyMenu = "section.jsf_html_selectManyMenu";
-
-	public String JSF_HTML_SelectOneListbox = "section.jsf_html_selectOneListbox";
-
-	public String JSF_HTML_SelectOneMenu = "section.jsf_html_selectOneMenu";
-
-	public String JSF_HTML_SelectOneRadio = "section.jsf_html_selectOneRadio";
-
-	/** sybase datawindow */
-	public String DW_DataWindow = "section.dw_dataWindow";
-
-	public String DW_Objectlink = "section.dw_objectlink";
-
-	// FIXME: when return null, will in fact using "Misc". This may not garantee
-	// it be the
-	// last category, since is sorted by string order.
-	static final String OTHER_CATEGORY = "Other";
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/MyPropertySheetPage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/MyPropertySheetPage.java
deleted file mode 100644
index 439cb4b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/MyPropertySheetPage.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.properties;
-
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.meta.internal.CategoryNameComparator;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-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 MyPropertySheetPage extends PropertySheetPage {
-	/**
-	 * 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);
-		}
-	}
-
-	public MyPropertySheetPage() {
-		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/NavigationHiearchyAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/NavigationHiearchyAction.java
deleted file mode 100644
index cca5ca5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/NavigationHiearchyAction.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;
-
-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 DesignerTabbedPropertySheetPage _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;
-		}
-	}
-
-	public NavigationHiearchyAction(DesignerTabbedPropertySheetPage propertyPage) {
-		super("");
-		setEnabled(true);
-		setMenuCreator(new MenuCreator());
-		this._propertyPage = propertyPage;
-	}
-
-	protected void changeSelection(Node selectedNode, Node startNode) {
-		this._propertyPage.internalChangeSelection(selectedNode, startNode);
-		this._currentNode = selectedNode;
-		this._startNode = startNode;
-		this.setText(this._currentNode.getNodeName());
-	}
-
-	protected void refresh(Node currentNode, Node startNode) {
-		this._currentNode = currentNode;
-		this._startNode = startNode;
-		if (!(_currentNode instanceof Text)
-				&& !(_currentNode instanceof Element)) {
-			this.setText("---");
-			this.setEnabled(false);
-		} else {
-			this.setText(_currentNode.getNodeName());
-			this.setEnabled(true);
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	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 633be51..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/PropertyDescriptorWrapper.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.CellEditor;
-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;
-
-	/**
-	 * 
-	 */
-	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) {
-				if (_inner != null) {
-					return _inner.createPropertyEditor(parent1);
-				}
-                return new TextCellEditor(parent1);
-			}
-		};
-		return EditorCreator.getInstance().createCellEditorWithWrapper(parent,
-				null, holder, _element, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getCategory()
-	 */
-	public String getCategory() {
-		return 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);
-	}
-
-	public IPropertyDescriptor getInner() {
-		return _inner;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/AttributeGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/AttributeGroup.java
deleted file mode 100644
index abfe285..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/AttributeGroup.java
+++ /dev/null
@@ -1,342 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.attrgroup;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldChangeListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue;
-import org.eclipse.jst.pagedesigner.meta.AttributeDescriptor;
-import org.eclipse.jst.pagedesigner.meta.EditorCreator;
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.jst.pagedesigner.meta.IElementDescriptor;
-import org.eclipse.jst.pagedesigner.meta.internal.CMRegistry;
-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.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
- */
-public class AttributeGroup extends DialogFieldGroup {
-	private static final Object KEY_ATTR = "KEY_ATTR"; //$NON-NLS-1$
-
-	private String _uri;
-
-	private String _tagName;
-
-	private IAttributeDescriptor[] _attrs;
-
-	private String _helpContextId;
-
-	private List _dialogFields = null;
-
-	private IDOMElement _ownerElement;
-
-	/**
-	 * @param pageName
-	 * @param title
-	 * @param titleImage
-	 */
-	public AttributeGroup(String uri, String tagName, String[] attrNames) {
-		this._uri = uri;
-		this._tagName = tagName;
-		this._attrs = prepareAttributeDescriptors(uri, tagName, attrNames);
-	}
-
-	public String getTagName() {
-		return this._tagName;
-	}
-
-	/**
-	 * @return
-	 */
-	public String getURI() {
-		return this._uri;
-	}
-
-	/**
-	 * @param uri
-	 * @param tagName
-	 * @param attrNames
-	 */
-	private IAttributeDescriptor[] prepareAttributeDescriptors(String uri,
-			String tagName, String[] attrNames) {
-		IAttributeDescriptor[] attrs;
-		IElementDescriptor eleDesc = CMRegistry.getInstance()
-				.getElementDescriptor(uri, tagName);
-		if (eleDesc != null) {
-			_helpContextId = eleDesc.getHelpContextID();
-			if (attrNames == null) {
-				attrs = eleDesc.getAttributeDescriptors();
-			} else {
-				attrs = new IAttributeDescriptor[attrNames.length];
-				for (int i = 0; i < attrs.length; i++) {
-					attrs[i] = eleDesc.getAttributeDescriptor(attrNames[i]);
-					if (attrs[i] == null) {
-						attrs[i] = new AttributeDescriptor(attrNames[i]);
-					}
-				}
-			}
-		} else {
-			if (attrNames == null) {
-				attrs = new IAttributeDescriptor[0];
-			} else {
-				attrs = new IAttributeDescriptor[attrNames.length];
-				for (int i = 0; i < attrs.length; i++) {
-					attrs[i] = new AttributeDescriptor(attrNames[i]);
-				}
-			}
-		}
-		return attrs;
-	}
-
-	public IAttributeDescriptor getAttributeDescriptor(DialogField field) {
-		Object obj = field.getAttachedData(KEY_ATTR);
-		if (obj instanceof IAttributeDescriptor) {
-			return (IAttributeDescriptor) obj;
-		}
-        return null;
-	}
-
-	/**
-	 * Child class could override this method to create customized dialogField.
-	 * Otherwise, system will use meta data to create default dailog field.
-	 * 
-	 * @param uri
-	 * @param tag
-	 * @param attr
-	 * @return if null, system will create default dialog field.
-	 */
-	protected DialogField createDialogField(String uri, String tag,
-			IAttributeDescriptor attr) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-		if (_dialogFields == null) {
-			_dialogFields = new ArrayList();
-
-			IAttributeDescriptor[] descriptors = _attrs;
-
-			for (int i = 0; i < descriptors.length; i++) {
-				DialogField field;
-				field = createDialogField(this._uri, this._tagName,
-						descriptors[i]);
-				if (field == null) {
-					EditorCreator creator = EditorCreator.getInstance();
-					field = creator.createDialogFieldWithWrapper(this._uri,
-							this._tagName, descriptors[i], null);
-				}
-
-				field.putAttachedData(KEY_ATTR, descriptors[i]);
-
-				IDialogFieldApplyListener applyListener = getDialogFieldApplyListener(
-						this._uri, this._tagName, descriptors[i]);
-				if (applyListener == null) {
-					applyListener = getDefaultApplyListener();
-				}
-				field.setDialogFieldApplyListener(applyListener);
-
-				IDialogFieldChangeListener changeListener = getDialogFieldChangeListener(
-						this._uri, this._tagName, descriptors[i]);
-				if (changeListener == null) {
-					changeListener = getDefaultChangeListener();
-				}
-				field.setDialogFieldChangeListener(changeListener);
-				_dialogFields.add(field);
-			}
-		}
-	}
-
-	/**
-	 * Child class can override the method to provide listener implementation
-	 * 
-	 * @param uri
-	 * @param tag
-	 * @param attr
-	 * @return
-	 */
-	public IDialogFieldApplyListener getDialogFieldApplyListener(String uri,
-			String tag, IAttributeDescriptor attr) {
-		return null;
-	}
-
-	/**
-	 * Child class can override the method to provide listener implementation
-	 * 
-	 * @param uri
-	 * @param tag
-	 * @param attr
-	 * @return
-	 */
-	public IDialogFieldChangeListener getDialogFieldChangeListener(String uri,
-			String tag, IAttributeDescriptor attr) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#refreshData()
-	 */
-	public void refreshData() {
-		if (_ownerElement == null) {
-			return;
-		}
-		initialize();
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = (DialogField) _dialogFields.get(i);
-
-			ISupportTextValue textValue = (ISupportTextValue) field;
-			IAttributeDescriptor attr = (IAttributeDescriptor) field
-					.getAttachedData(KEY_ATTR);
-			String attrName = attr.getAttributeName();
-			String attrValue = _ownerElement.getAttribute(attrName);
-			textValue.setTextWithoutUpdate(attrValue);
-		}
-	}
-
-	public IDOMElement getElement() {
-		return _ownerElement;
-	}
-
-	public void setElementContext(IDOMNode context, IDOMElement owner) {
-		initialize();
-		this._ownerElement = owner;
-		if (context != null) {
-			for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-				DialogField field = (DialogField) _dialogFields.get(i);
-				if (field instanceof IElementContextable) {
-					((IElementContextable) field).setElementContext(context,
-							owner);
-				}
-			}
-		}
-		refreshData();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#layoutDialogFields(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public void layoutDialogFields(FormToolkit toolkit, Composite parent) {
-		Composite top;
-		if (toolkit == null) {
-			top = new Composite(parent, SWT.NONE);
-		} else {
-			top = toolkit.createComposite(parent);
-		}
-		FillLayout fillLayout = new FillLayout(SWT.VERTICAL);
-		parent.setLayout(fillLayout);
-
-		if (this._helpContextId != null && this._helpContextId.length() > 0) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(top,
-					_helpContextId);
-		}
-
-		GridLayout layout = new GridLayout();
-		int numColumns = getNumColumns();
-		layout.numColumns = numColumns;
-		top.setLayout(layout);
-
-		initialize();
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = (DialogField) _dialogFields.get(i);
-			field.doFillIntoGrid(toolkit, top, numColumns);
-		}
-
-		DialogField maxColumnField = null;
-		int maxColumn = 0;
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = (DialogField) _dialogFields.get(i);
-			int c = field.getNumberOfControls();
-			if (c > maxColumn) {
-				maxColumn = c;
-				maxColumnField = field;
-			}
-		}
-		if (maxColumnField != null) {
-			maxColumnField.handleGrabHorizontal();
-		}
-	}
-
-	/**
-	 * @return
-	 */
-	public int getNumColumns() {
-		int columns = 1;
-		initialize();
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = (DialogField) _dialogFields.get(i);
-			columns = Math.max(columns, field.getNumberOfControls());
-		}
-		return columns;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#validateDialogFields()
-	 */
-	public IStatus[] validateDialogFields() {
-		return null;
-	}
-
-	/**
-	 * @return
-	 */
-	public DialogField[] getDialogFields() {
-		initialize();
-		DialogField[] ret = new DialogField[_dialogFields.size()];
-		_dialogFields.toArray(ret);
-		return ret;
-	}
-
-	/**
-	 * get the dialogfield for the corresponding attribute.
-	 * 
-	 * @param attrName
-	 *            case sensitive attribute name.
-	 * @return null if fail to find.
-	 */
-	public DialogField getDialogField(String attrName) {
-		initialize();
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = (DialogField) _dialogFields.get(i);
-			IAttributeDescriptor attr = this.getAttributeDescriptor(field);
-			if (attr != null && attr.getAttributeName().equals(attrName)) {
-				return field;
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/AttributeGroupMessages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/AttributeGroupMessages.java
deleted file mode 100644
index 1fa6dc7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/AttributeGroupMessages.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.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
-	}
-
-	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/AttributeGroupSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/AttributeGroupSection.java
deleted file mode 100644
index 8ec170f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/AttributeGroupSection.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.properties.attrgroup;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage;
-import org.eclipse.wst.common.ui.properties.internal.provisional.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 IAttributeDescriptor && _element != null) {
-				ISupportTextValue textValue = (ISupportTextValue) field;
-				ChangeAttributeCommand c = new ChangeAttributeCommand(
-						AttributeGroupMessages
-								.getString("AttributeGroupSection.changeAttribute"), _element, ((IAttributeDescriptor) attr).getAttributeName(), textValue.getText()); //$NON-NLS-1$
-				c.execute();
-			}
-		}
-	};
-
-	protected AttributeGroup _group;
-
-	/**
-	 * create the section with a default AttributeGroup. In default
-	 * AttributeGroup, there is no relationship between fields.
-	 * 
-	 * @param uri
-	 * @param tagName
-	 * @param attrNames
-	 */
-	public AttributeGroupSection(String uri, String tagName, String[] attrNames) {
-		this(new AttributeGroup(uri, tagName, attrNames));
-	}
-
-	/**
-	 * In case the group is not a default group (e.g. you may add some
-	 * customized relationship between the fields).
-	 * 
-	 * @param group
-	 */
-	public AttributeGroupSection(AttributeGroup group) {
-		_group = group;
-		_group.setDefaultApplyListener(_fieldApplyListener);
-		_group.initialize();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.AbstractPropertySection#setInput(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-		_group.setElementContext(_element, _element);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.integration.properties.section.AbstractCustomSection#createControls(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage aTabbedPropertySheetPage) {
-		super.createControls(parent, aTabbedPropertySheetPage);
-		TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage
-				.getWidgetFactory();
-		_group.layoutDialogFields(factory, parent);
-	}
-
-	protected void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		if (_group != null) {
-			_group.refreshData();
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/DialogUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/DialogUtil.java
deleted file mode 100644
index a4dfb6c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/DialogUtil.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.properties.attrgroup;
-
-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.meta.IAttributeDescriptor;
-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, null);
-		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++) {
-					IAttributeDescriptor desc = group
-							.getAttributeDescriptor(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);
-						}
-					}
-				}
-				AddSubNodeCommand addSubCommand = new AddSubNodeCommand(
-						AttributeGroupMessages
-								.getString(
-										"DialogUtil.createCommandLabel", group.getTagName()), parent, group.getTagName(), group.getURI(), map); //$NON-NLS-1$
-				addSubCommand.execute();
-				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;
-	}
-
-	/**
-	 * 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 c71ff05..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, 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
-###############################################################################
-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 f0c361e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CSSDialogCellEditor.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.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.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;
-
-public class CSSDialogCellEditor extends EditableDialogCellEditor {
-	private IDOMElement _element;
-
-	/**
-	 * @param parent
-	 */
-	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();
-
-		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();
-			}
-		}
-
-		String style = (_element == null ? null : _element
-				.getAttribute(IJSFConstants.ATTR_STYLE));
-		return style == null ? "" : style;
-	}
-}
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 f5f9dad..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CellEditorFactory.java
+++ /dev/null
@@ -1,483 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.TimeZone;
-import java.util.TreeMap;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ComboDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StyleComboDialogField;
-import org.eclipse.jst.pagedesigner.css2.CSSUtil;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.jst.pagedesigner.meta.IAttributeCellEditorFactory;
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.jst.pagedesigner.meta.IValueType;
-import org.eclipse.jst.pagedesigner.ui.dialogfields.ContextableClasspathResourceButtonDialogField;
-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 IAttributeCellEditorFactory {
-	private static String[] CURRENCYCODES = { "AED", // United Arab Emirates,
-			// Dirhams //$NON-NLS-1$
-			"AFA", // Afghanistan, Afghanis //$NON-NLS-1$
-			"ALL", // Albania, Leke //$NON-NLS-1$
-			"AMD", // Armenia, Drams //$NON-NLS-1$
-			"ANG", // Netherlands Antilles, Guilders (also called Florins)
-			// //$NON-NLS-1$
-			"AOA", // Angola, Kwanza //$NON-NLS-1$
-			"ARS", // Argentina, Pesos //$NON-NLS-1$
-			"AUD", // Australia, Dollars //$NON-NLS-1$
-			"AWG", // Aruba, Guilders (also called Florins) //$NON-NLS-1$
-			"AZM", // Azerbaijan, Manats //$NON-NLS-1$
-			"BAM", // Bosnia and Herzegovina, Convertible Marka //$NON-NLS-1$
-			"BBD", // Barbados, Dollars //$NON-NLS-1$
-			"BDT", // Bangladesh, Taka //$NON-NLS-1$
-			"BGN", // Bulgaria, Leva //$NON-NLS-1$
-			"BHD", // Bahrain, Dinars //$NON-NLS-1$
-			"BIF", // Burundi, Francs //$NON-NLS-1$
-			"BMD", // Bermuda, Dollars //$NON-NLS-1$
-			"BND", // Brunei Darussalam, Dollars //$NON-NLS-1$
-			"BOB", // Bolivia, Bolivianos //$NON-NLS-1$
-			"BRL", // Brazil, Brazil Real //$NON-NLS-1$
-			"BSD", // Bahamas, Dollars //$NON-NLS-1$
-			"BTN", // Bhutan, Ngultrum //$NON-NLS-1$
-			"BWP", // Botswana, Pulas //$NON-NLS-1$
-			"BYR", // Belarus, Rubles //$NON-NLS-1$
-			"BZD", // Belize, Dollars //$NON-NLS-1$
-			"CAD", // Canada, Dollars //$NON-NLS-1$
-			"CDF", // Congo/Kinshasa, Congolese Francs //$NON-NLS-1$
-			"CHF", // Switzerland, Francs //$NON-NLS-1$
-			"CLP", // Chile, Pesos //$NON-NLS-1$
-			"CNY", // China, Yuan Renminbi //$NON-NLS-1$
-			"COP", // Colombia, Pesos //$NON-NLS-1$
-			"CRC", // Costa Rica, Colones //$NON-NLS-1$
-			"CSD", // Serbia, Dinars //$NON-NLS-1$
-			"CUP", // Cuba, Pesos //$NON-NLS-1$
-			"CVE", // Cape Verde, Escudos //$NON-NLS-1$
-			"CYP", // Cyprus, Pounds //$NON-NLS-1$
-			"CZK", // Czech Republic, Koruny //$NON-NLS-1$
-			"DJF", // Djibouti, Francs //$NON-NLS-1$
-			"DKK", // Denmark, Kroner //$NON-NLS-1$
-			"DOP", // Dominican Republic, Pesos //$NON-NLS-1$
-			"DZD", // Algeria, Algeria Dinars //$NON-NLS-1$
-			"EEK", // Estonia, Krooni //$NON-NLS-1$
-			"EGP", // Egypt, Pounds //$NON-NLS-1$
-			"ERN", // Eritrea, Nakfa //$NON-NLS-1$
-			"ETB", // Ethiopia, Birr //$NON-NLS-1$
-			"EUR", // Euro Member Countries, Euro //$NON-NLS-1$
-			"FJD", // Fiji, Dollars //$NON-NLS-1$
-			"FKP", // Falkland Islands (Malvinas), Pounds //$NON-NLS-1$
-			"GBP", // United Kingdom, Pounds //$NON-NLS-1$
-			"GEL", // Georgia, Lari //$NON-NLS-1$
-			"GGP", // Guernsey, Pounds //$NON-NLS-1$
-			"GHC", // Ghana, Cedis //$NON-NLS-1$
-			"GIP", // Gibraltar, Pounds //$NON-NLS-1$
-			"GMD", // Gambia, Dalasi //$NON-NLS-1$
-			"GNF", // Guinea, Francs //$NON-NLS-1$
-			"GTQ", // Guatemala, Quetzales //$NON-NLS-1$
-			"GYD", // Guyana, Dollars //$NON-NLS-1$
-			"HKD", // Hong Kong, Dollars //$NON-NLS-1$
-			"HNL", // Honduras, Lempiras //$NON-NLS-1$
-			"HRK", // Croatia, Kuna //$NON-NLS-1$
-			"HTG", // Haiti, Gourdes //$NON-NLS-1$
-			"HUF", // Hungary, Forint //$NON-NLS-1$
-			"IDR", // Indonesia, Rupiahs //$NON-NLS-1$
-			"ILS", // Israel, New Shekels //$NON-NLS-1$
-			"IMP", // Isle of Man, Pounds //$NON-NLS-1$
-			"INR", // India, Rupees //$NON-NLS-1$
-			"IQD", // Iraq, Dinars //$NON-NLS-1$
-			"IRR", // Iran, Rials //$NON-NLS-1$
-			"ISK", // Iceland, Kronur //$NON-NLS-1$
-			"JEP", // Jersey, Pounds //$NON-NLS-1$
-			"JMD", // Jamaica, Dollars //$NON-NLS-1$
-			"JOD", // Jordan, Dinars //$NON-NLS-1$
-			"JPY", // Japan, Yen //$NON-NLS-1$
-			"KES", // Kenya, Shillings //$NON-NLS-1$
-			"KGS", // Kyrgyzstan, Soms //$NON-NLS-1$
-			"KHR", // Cambodia, Riels //$NON-NLS-1$
-			"KMF", // Comoros, Francs //$NON-NLS-1$
-			"KPW", // Korea (North), Won //$NON-NLS-1$
-			"KRW", // Korea (South), Won //$NON-NLS-1$
-			"KWD", // Kuwait, Dinars //$NON-NLS-1$
-			"KYD", // Cayman Islands, Dollars //$NON-NLS-1$
-			"KZT", // Kazakhstan, Tenge //$NON-NLS-1$
-			"LAK", // Laos, Kips //$NON-NLS-1$
-			"LBP", // Lebanon, Pounds //$NON-NLS-1$
-			"LKR", // Sri Lanka, Rupees //$NON-NLS-1$
-			"LRD", // Liberia, Dollars //$NON-NLS-1$
-			"LSL", // Lesotho, Maloti //$NON-NLS-1$
-			"LTL", // Lithuania, Litai //$NON-NLS-1$
-			"LVL", // Latvia, Lati //$NON-NLS-1$
-			"LYD", // Libya, Dinars //$NON-NLS-1$
-			"MAD", // Morocco, Dirhams //$NON-NLS-1$
-			"MDL", // Moldova, Lei //$NON-NLS-1$
-			"MGA", // Madagascar, Ariary //$NON-NLS-1$
-			"MKD", // Macedonia, Denars //$NON-NLS-1$
-			"MMK", // Myanmar (Burma), Kyats //$NON-NLS-1$
-			"MNT", // Mongolia, Tugriks //$NON-NLS-1$
-			"MOP", // Macau, Patacas //$NON-NLS-1$
-			"MRO", // Mauritania, Ouguiyas //$NON-NLS-1$
-			"MTL", // Malta, Liri //$NON-NLS-1$
-			"MUR", // Mauritius, Rupees //$NON-NLS-1$
-			"MVR", // Maldives (Maldive Islands), Rufiyaa //$NON-NLS-1$
-			"MWK", // Malawi, Kwachas //$NON-NLS-1$
-			"MXN", // Mexico, Pesos //$NON-NLS-1$
-			"MYR", // Malaysia, Ringgits //$NON-NLS-1$
-			"MZM", // Mozambique, Meticais //$NON-NLS-1$
-			"NAD", // Namibia, Dollars //$NON-NLS-1$
-			"NGN", // Nigeria, Nairas //$NON-NLS-1$
-			"NIO", // Nicaragua, Cordobas //$NON-NLS-1$
-			"NOK", // Norway, Krone //$NON-NLS-1$
-			"NPR", // Nepal, Nepal Rupees //$NON-NLS-1$
-			"NZD", // New Zealand, Dollars //$NON-NLS-1$
-			"OMR", // Oman, Rials //$NON-NLS-1$
-			"PAB", // Panama, Balboa //$NON-NLS-1$
-			"PEN", // Peru, Nuevos Soles //$NON-NLS-1$
-			"PGK", // Papua New Guinea, Kina //$NON-NLS-1$
-			"PHP", // Philippines, Pesos //$NON-NLS-1$
-			"PKR", // Pakistan, Rupees //$NON-NLS-1$
-			"PLN", // Poland, Zlotych //$NON-NLS-1$
-			"PYG", // Paraguay, Guarani //$NON-NLS-1$
-			"QAR", // Qatar, Rials //$NON-NLS-1$
-			"ROL", // Romania, Lei //$NON-NLS-1$
-			"RUB", // Russia, Rubles //$NON-NLS-1$
-			"RWF", // Rwanda, Rwanda Francs //$NON-NLS-1$
-			"SAR", // Saudi Arabia, Riyals //$NON-NLS-1$
-			"SBD", // Solomon Islands, Dollars //$NON-NLS-1$
-			"SCR", // Seychelles, Rupees //$NON-NLS-1$
-			"SDD", // Sudan, Dinars //$NON-NLS-1$
-			"SEK", // Sweden, Kronor //$NON-NLS-1$
-			"SGD", // Singapore, Dollars //$NON-NLS-1$
-			"SHP", // Saint Helena, Pounds //$NON-NLS-1$
-			"SIT", // Slovenia, Tolars //$NON-NLS-1$
-			"SKK", // Slovakia, Koruny //$NON-NLS-1$
-			"SLL", // Sierra Leone, Leones //$NON-NLS-1$
-			"SOS", // Somalia, Shillings //$NON-NLS-1$
-			"SPL", // Seborga, Luigini //$NON-NLS-1$
-			"SRD", // Suriname, Dollars //$NON-NLS-1$
-			"STD", // S?o Tome and Principe, Dobras //$NON-NLS-1$
-			"SVC", // El Salvador, Colones //$NON-NLS-1$
-			"SYP", // Syria, Pounds //$NON-NLS-1$
-			"SZL", // Swaziland, Emalangeni //$NON-NLS-1$
-			"THB", // Thailand, Baht //$NON-NLS-1$
-			"TJS", // Tajikistan, Somoni //$NON-NLS-1$
-			"TMM", // Turkmenistan, Manats //$NON-NLS-1$
-			"TND", // Tunisia, Dinars //$NON-NLS-1$
-			"TOP", // Tonga, Pa'anga //$NON-NLS-1$
-			"TRL", // Turkey, Liras [being phased out] //$NON-NLS-1$
-			"TRY", // Turkey, New Lira //$NON-NLS-1$
-			"TTD", // Trinidad and Tobago, Dollars //$NON-NLS-1$
-			"TVD", // Tuvalu, Tuvalu Dollars //$NON-NLS-1$
-			"TWD", // Taiwan, New Dollars //$NON-NLS-1$
-			"TZS", // Tanzania, Shillings //$NON-NLS-1$
-			"UAH", // Ukraine, Hryvnia //$NON-NLS-1$
-			"UGX", // Uganda, Shillings //$NON-NLS-1$
-			"USD", // United States of America, Dollars //$NON-NLS-1$
-			"UYU", // Uruguay, Pesos //$NON-NLS-1$
-			"UZS", // Uzbekistan, Sums //$NON-NLS-1$
-			"VEB", // Venezuela, Bolivares //$NON-NLS-1$
-			"VND", // Viet Nam, Dong //$NON-NLS-1$
-			"VUV", // Vanuatu, Vatu //$NON-NLS-1$
-			"WST", // Samoa, Tala //$NON-NLS-1$
-			"XAF", // Communaut�� Financi��re Africaine BEAC, Francs
-			// //$NON-NLS-1$
-			"XAG", // Silver, Ounces //$NON-NLS-1$
-			"XAU", // Gold, Ounces //$NON-NLS-1$
-			"XCD", // East Caribbean Dollars //$NON-NLS-1$
-			"XDR", // International Monetary Fund (IMF) Special Drawing Rights
-			// //$NON-NLS-1$
-			"XOF", // Communaut�� Financi��re Africaine BCEAO, Francs
-			// //$NON-NLS-1$
-			"XPD", // Palladium Ounces //$NON-NLS-1$
-			"XPF", // Comptoirs Fran?ais du Pacifique Francs //$NON-NLS-1$
-			"XPT", // Platinum, Ounces //$NON-NLS-1$
-			"YER", // Yemen, Rials //$NON-NLS-1$
-			"ZAR", // South Africa, Rand //$NON-NLS-1$
-			"ZMK", // Zambia, Kwacha //$NON-NLS-1$
-			"ZWD" // Zimbabwe, Zimbabwe Dollars //$NON-NLS-1$
-	};
-
-	public CellEditor createCellEditor(Composite parent,
-			IAttributeDescriptor attr, Element element) {
-		String type = attr.getValueType();
-
-		if (IValueType.ENUMERATED.equalsIgnoreCase(type)) {
-			Map map = new HashMap(attr.getOptions());
-			String defaultValue = attr.getDefaultValue();
-			if (defaultValue == null) {
-				return LabeledComboBoxCellEditor.newInstance(parent, map,
-						SWT.NONE);
-			}
-            return LabeledStyleComboCellEditor.newInstance(parent, map,
-            		defaultValue, SWT.NONE);
-		} else if (IValueType.LOCALE.equalsIgnoreCase(type)) {
-			Map map = new HashMap();
-			Locale[] locales = Locale.getAvailableLocales();
-			for (int i = 0, size = locales.length; i < size; i++) {
-				map.put(locales[i].toString(), locales[i].toString());
-			}
-			return LabeledComboBoxCellEditor.newInstance(parent, map, SWT.NONE);
-		} else if (IValueType.TIMEZONE.equalsIgnoreCase(type)) {
-			Map map = new HashMap();
-			String[] ids = TimeZone.getAvailableIDs();
-			for (int i = 0, size = ids.length; i < size; i++) {
-				map.put(ids[i], ids[i]);
-			}
-			return LabeledComboBoxCellEditor.newInstance(parent, map, SWT.NONE);
-		} else if (IValueType.RELATIVEPATH.equalsIgnoreCase(type)
-				|| IValueType.WEBPATH.equalsIgnoreCase(type)) {
-			IProject project = getProject(element);
-			if (project != null) {
-				ResourceDialogCellEditor cellEditor = new ResourceDialogCellEditor(
-						parent);
-				cellEditor.setSuffixs(attr.getParameterByName(
-						IAttributeDescriptor.PARAMETER_SUFFIX).split(";"));
-				cellEditor
-						.setSeparator(attr
-								.getParameterByName(IAttributeDescriptor.PARAMETER_SEPARATOR));
-				cellEditor.setProject(project);
-				cellEditor.setReferredFile(getFile(element));
-				if ("".equalsIgnoreCase(cellEditor.getSeparator())) {
-					cellEditor.setResourceDescription(ResourceBoundle
-							.getString("FileCellEditor.Msg"));
-				} else {
-					cellEditor.setResourceDescription(ResourceBoundle
-							.getString("FileCellEditor.Msg1"));
-				}
-				if (IValueType.WEBPATH.equalsIgnoreCase(type)) {
-					cellEditor.setWebPath(true);
-				}
-
-				if (IJSPCoreConstants.TAG_DIRECTIVE_INCLUDE.equals(element
-						.getLocalName())
-						|| IJSPCoreConstants.TAG_INCLUDE.equals(element
-								.getLocalName())) {
-					cellEditor.setTransformJSPURL(false);
-				}
-				return cellEditor;
-			}
-		} else if (IValueType.CLASSPATH_RESOURCE.equalsIgnoreCase(type)) {
-			return new LoadbundleSelectionCellEditor(parent,
-					getProject(element));
-		} else if (IValueType.CSSID.equalsIgnoreCase(type)) {
-		    // TODO: missing case?
-		} else if (IValueType.CSSCLASS.equalsIgnoreCase(type)) {
-			String cssclasses[] = CSSUtil.getCSSClasses(element
-					.getOwnerDocument());
-			Map map = new HashMap();
-			if (cssclasses != null) {
-				for (int i = 0; i < cssclasses.length; i++) {
-					map.put(cssclasses[i], cssclasses[i]);
-				}
-			}
-			return LabeledComboBoxCellEditor.newInstance(parent, map, SWT.NONE);
-		} else if (IValueType.BOOLEAN.equalsIgnoreCase(type)) {
-			String defaultValue = attr
-					.getParameterByName(IAttributeDescriptor.PARAMETER_DEFAULT);
-			Map booleanMap = new HashMap();
-			booleanMap.put(Boolean.TRUE.toString(), Boolean.TRUE.toString());
-			booleanMap.put(Boolean.FALSE.toString(), Boolean.FALSE.toString());
-			if (defaultValue == null) {
-				return LabeledComboBoxCellEditor.newInstance(parent,
-						booleanMap, SWT.NONE);
-			}
-            return LabeledStyleComboCellEditor.newInstance(parent,
-            		booleanMap, defaultValue, SWT.NONE);
-		} else if (IValueType.CSSSTYLE.equalsIgnoreCase(type)) {
-			String param = attr
-					.getParameterByName(IAttributeDescriptor.PARAMETER_STYLE);
-			if (!param.equalsIgnoreCase("STYLE")) {
-				return null;
-			}
-			CSSDialogCellEditor cellEditor = new CSSDialogCellEditor(parent,
-					(IDOMElement) element);
-			return cellEditor;
-		} else if (IValueType.NAMED_BOOLEAN.equalsIgnoreCase(type)) {
-			return NamedBooleanCellEditor.newInstance(parent, SWT.NONE,
-					(IDOMElement) element, attr);
-		} else if (IValueType.CURRENCYCODE.equalsIgnoreCase(type)) {
-			Map map = new HashMap();
-			for (int i = 0, n = CURRENCYCODES.length; i < n; i++) {
-				map.put(CURRENCYCODES[i], CURRENCYCODES[i]);
-			}
-
-			return LabeledComboBoxCellEditor.newInstance(parent, map, SWT.NONE);
-		}
-
-		// if there is no type or type unknonw, then we just return null. and
-		// system will
-		// create default (text cell editor).
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IAttributeCellEditorFactory#createDialogField(org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor,
-	 *      org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public DialogField createDialogField(IAttributeDescriptor attr) {
-		String type = attr.getValueType();
-
-		if (IValueType.ENUMERATED.equalsIgnoreCase(type)
-				|| IValueType.LOCALE.equalsIgnoreCase(type)
-				|| IValueType.TIMEZONE.equalsIgnoreCase(type)) {
-			Map map = new HashMap();
-			if (IValueType.ENUMERATED.equalsIgnoreCase(type)) {
-				map = attr.getOptions();
-			} else if (IValueType.LOCALE.equalsIgnoreCase(type)) {
-				Locale[] locales = Locale.getAvailableLocales();
-				for (int i = 0, size = locales.length; i < size; i++) {
-					map.put(locales[i].toString(), locales[i].toString());
-				}
-			} else {
-				String[] ids = TimeZone.getAvailableIDs();
-				for (int i = 0, size = ids.length; i < size; i++) {
-					map.put(ids[i], ids[i]);
-				}
-			}
-			if (map != null && !map.isEmpty()) {
-				String defaultValue = attr.getDefaultValue();
-				if (defaultValue == null || "".equals(defaultValue)) {
-					attr
-							.getParameterByName(IAttributeDescriptor.PARAMETER_DEFAULT);
-				}
-				StyleComboDialogField field = new StyleComboDialogField(
-						SWT.NONE);
-				field.setDefaultValue(defaultValue);
-				field.setLabelText(attr.getLabelString());
-				field.setEntryMap(new TreeMap(map));
-				field.setRequired(attr.isRequired());
-				field.setToolTip(attr.getDescription());
-				return field;
-			}
-			// eles the config is incorrect. fall through, will return null.
-		} else if (IValueType.RELATIVEPATH.equalsIgnoreCase(type)) {
-			String param = attr.getTypeParameter();
-			ContextableResourceButtonDialogField field = new ContextableResourceButtonDialogField();
-			field.setLabelText(attr.getLabelString());
-			if (param != null) {
-				field.setSuffixs(attr.getParameterByName(
-						IAttributeDescriptor.PARAMETER_SUFFIX).split(";"));
-			}
-			field.setResourceDescription(ResourceBoundle
-					.getString("FileCellEditor.Msg"));
-			field.setRequired(attr.isRequired());
-			field.setToolTip(attr.getDescription());
-			return field;
-		} else if (IValueType.WEBPATH.equalsIgnoreCase(type)) {
-			String param = attr.getTypeParameter();
-			ContextableResourceButtonDialogField field = new ContextableResourceButtonDialogField();
-			field.setLabelText(attr.getLabelString());
-			if (param != null) {
-				field.setSuffixs(attr.getParameterByName(
-						IAttributeDescriptor.PARAMETER_SUFFIX).split(";"));
-				field
-						.setSeparator(attr
-								.getParameterByName(IAttributeDescriptor.PARAMETER_SEPARATOR));
-			}
-			if ("".equalsIgnoreCase(field.getSeparator())) {
-				field.setResourceDescription(ResourceBoundle
-						.getString("FileCellEditor.Msg"));
-			} else {
-				field.setResourceDescription(ResourceBoundle
-						.getString("FileCellEditor.Msg1"));
-			}
-			field.setWebPath(true);
-			field.setRequired(attr.isRequired());
-			field.setToolTip(attr.getDescription());
-			return field;
-		} else if (IValueType.CLASSPATH_RESOURCE.equals(type)) {
-			ContextableClasspathResourceButtonDialogField field = new ContextableClasspathResourceButtonDialogField();
-			field.setRequired(attr.isRequired());
-			field.setToolTip(attr.getDescription());
-			return field;
-		} else if (IValueType.BOOLEAN.equalsIgnoreCase(type)) {
-			String defaultValue = attr
-					.getParameterByName(IAttributeDescriptor.PARAMETER_DEFAULT);
-			StyleComboDialogField field = new StyleComboDialogField(SWT.NONE);
-			TreeMap map = new TreeMap();
-			map.put("", "");
-			map.put(Boolean.FALSE.toString(), Boolean.FALSE.toString());
-			map.put(Boolean.TRUE.toString(), Boolean.TRUE.toString());
-			field.setEntryMap(map);
-			field.setDefaultValue(defaultValue);
-			field.setLabelText(attr.getLabelString());
-			field.setRequired(attr.isRequired());
-			field.setToolTip(attr.getDescription());
-			return field;
-		} else if (IValueType.CSSSTYLE.equalsIgnoreCase(type)) {
-			String param = attr
-					.getParameterByName(IAttributeDescriptor.PARAMETER_STYLE);
-			if (!"STYLE".equalsIgnoreCase(param)) {
-				return null;
-			}
-			StyleButtonDialogField field = new StyleButtonDialogField();
-			field.setRequired(attr.isRequired());
-			field.setToolTip(attr.getDescription());
-			return field;
-		} else if (IValueType.CURRENCYCODE.equalsIgnoreCase(type)) {
-			ComboDialogField field = new ComboDialogField(SWT.NONE);
-			field.setLabelText(attr.getLabelString());
-			field.setItems(CURRENCYCODES);
-			field.setRequired(attr.isRequired());
-			field.setToolTip(attr.getDescription());
-			return field;
-		}
-
-		// if there is no type or type unknonw, then we just return null. and
-		// system will
-		// create default (text cell editor).
-		return null;
-	}
-
-	private IProject getProject(Element element) {
-		if (element instanceof IDOMElement) {
-			IDOMModel model = ((IDOMElement) element).getModel();
-			IFile file = StructuredModelUtil.getFileFor(model);
-			if (file != null) {
-				return file.getProject();
-			}
-		}
-		return null;
-	}
-
-	public String[] getSupportedValueTypes() {
-		return null;
-	}
-
-	private IFile getFile(Element element) {
-		if (element instanceof IDOMElement) {
-			IDOMModel model = ((IDOMElement) element).getModel();
-			IFile file = StructuredModelUtil.getFileFor(model);
-			return file;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CellEditorWrapper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CellEditorWrapper.java
deleted file mode 100644
index 65ba998..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CellEditorWrapper.java
+++ /dev/null
@@ -1,358 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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
-	 */
-	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 reimplement. If you reimplement this method, you should
-	 * also reimplement <code>updateContents</code>.
-	 * </p>
-	 * 
-	 * @param cell
-	 *            the control for this cell editor
-	 */
-	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
-	 */
-	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 1bbaa02..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LabeledComboBoxCellEditor.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.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;
-
-	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);
-	}
-
-	/**
-	 * @param parent
-	 * @param items
-	 */
-	public LabeledComboBoxCellEditor(Composite parent, Object[] values,
-			String[] labels) {
-		this(parent, values, labels, SWT.NONE);
-	}
-
-	/**
-	 * @param parent
-	 * @param items
-	 * @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 a6fbb10..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LabeledStyleComboCellEditor.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.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.jst.jsf.common.ui.internal.utils.StyleCombo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.sse.ui.internal.Logger;
-
-public class LabeledStyleComboCellEditor extends StyleComboCellEditor {
-	private boolean _fSettingValue = false;
-
-	private Object[] _values;
-
-	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);
-	}
-
-	/**
-	 * @param parent
-	 * @param items
-	 * @param style
-	 */
-	public LabeledStyleComboCellEditor(Composite parent, Object[] values,
-			String[] labels, String defaultValue, int style) {
-		super(parent, labels, style);
-		StyleCombo combo = (StyleCombo) getControl();
-		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);
-				}
-			}
-		}
-	}
-}
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 a8659c3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LoadbundleSelectionCellEditor.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.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
-	 */
-	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"));
-		dialog.setSuffixs(PROPERTIES_FILES_SUFFIXS);
-		dialog.open();
-		if (dialog.getResult() != null) {
-			_value = (String) dialog.getResult()[0];
-		}
-		return _value;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/NamedBooleanCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/NamedBooleanCellEditor.java
deleted file mode 100644
index 159e3ec..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/NamedBooleanCellEditor.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.properties.celleditors;
-
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class NamedBooleanCellEditor extends LabeledComboBoxCellEditor {
-	/**
-	 * @param parent
-	 * @param items
-	 * @param style
-	 */
-	private NamedBooleanCellEditor(Composite parent, Object[] values,
-			String[] labels, int style) {
-		super(parent, values, labels, style);
-	}
-
-	public static NamedBooleanCellEditor newInstance(Composite parent,
-			int style, IDOMElement element, IAttributeDescriptor attribute) {
-		String[] values = new String[] { "", attribute.getAttributeName() };
-		return new NamedBooleanCellEditor(parent, values, values, style);
-	}
-}
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 7f00ed6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/ResourceBoundle.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.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
-	}
-
-	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 894ebd3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/ResourceDialogCellEditor.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.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-Javadoc)
-	 * 
-	 * @see DialogCellEditor#DialogCellEditor()
-	 */
-	public ResourceDialogCellEditor() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see DialogCellEditor#DialogCellEditor(Composite parent)
-	 */
-	public ResourceDialogCellEditor(Composite parent) {
-		super(parent);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see DialogCellEditor#DialogCellEditor(Composite parent, int style)
-	 */
-	public ResourceDialogCellEditor(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.DialogCellEditor#openDialogBox(org.eclipse.swt.widgets.Control)
-	 */
-	protected Object openDialogBox(Control cellEditorWindow) {
-		Shell shell = cellEditorWindow.getShell();
-		int style = "".equals(_separator) ? SWT.NONE : SWT.MULTI | SWT.H_SCROLL
-				| SWT.V_SCROLL;
-		CommonResourceDialog dialog = new CommonResourceDialog(shell, _project,
-				style);
-		dialog.setTitle(ResourceBoundle.getString("FileCellEditor.Title"));
-		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() {
-		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;
-	}
-
-	public void setTransformJSPURL(boolean needTransform) {
-		this._needTransformJSPURL = needTransform;
-	}
-
-	public String getSeparator() {
-		return _separator;
-	}
-
-	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 037f5cb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/StyleComboCellEditor.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.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;
-
-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;
-
-	public StyleComboCellEditor() {
-		setStyle(defaultStyle);
-	}
-
-	public StyleComboCellEditor(Composite parent, String[] items) {
-		this(parent, items, defaultStyle);
-	}
-
-	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 7399ca5..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, 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
-###############################################################################
-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/internal/DesignerSectionDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/DesignerSectionDescriptor.java
deleted file mode 100644
index f95a3fb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/DesignerSectionDescriptor.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.properties.internal;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.utils.StringUtil;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.properties.DesignerPropertyTool;
-import org.eclipse.jst.pagedesigner.properties.ISectionFilter;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.AttributeGroup;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.AttributeGroupSection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.wst.common.ui.properties.internal.provisional.ISection;
-import org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor;
-import org.eclipse.wst.common.ui.properties.internal.provisional.ITypeMapper;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DesignerSectionDescriptor implements ISectionDescriptor {
-	private static final String ATT_ID = "id"; //$NON-NLS-1$
-
-	private static final String ATT_TARGET_TAB = "tab"; //$NON-NLS-1$
-
-	private static final String ATT_AFTER_SECTION = "afterSection"; //$NON-NLS-1$  
-
-	private static final String ATT_CLASS = "class"; //$NON-NLS-1$ 
-
-	private static final String ATT_FILTER = "filter"; //$NON-NLS-1$
-
-	private static final String TOP = "top"; //$NON-NLS-1$
-
-	private static final String TAGFILTER = "tagFilter";
-
-	private static final String CASESENSITIVE = "caseSensitive";
-
-	private static final String TAGNAME = "tagName";
-
-	private static final String URI = "uri";
-
-	private String _id;
-
-	private String _targetTab;
-
-	private String _afterSection;
-
-	private ISectionFilter _sectionFilter;
-
-	private IConfigurationElement _configurationElement;
-
-	private TagFilter[] _tagFilters;
-
-	private static class TagFilter {
-		public String uri;
-
-		public String tag;
-
-		public boolean caseSensitive = false;
-	}
-
-	/**
-	 * Constructor for the section descriptor.
-	 * 
-	 * @param configurationElement
-	 *            the configuration element for the section descriptor.
-	 */
-	public DesignerSectionDescriptor(IConfigurationElement configurationElement) {
-		_configurationElement = configurationElement;
-
-		_id = getConfigurationElement().getAttribute(ATT_ID);
-		_targetTab = getConfigurationElement().getAttribute(ATT_TARGET_TAB);
-		_afterSection = getConfigurationElement().getAttribute(
-				ATT_AFTER_SECTION);
-
-		if (_id == null || _targetTab == null) {
-			// the section id and tab are mandatory - log error
-			handleSectionError(null);
-		}
-		if (getAfterSection() == null) {
-			_afterSection = TOP;
-		}
-
-		String filterClass = getConfigurationElement().getAttribute(ATT_FILTER);
-		if (filterClass != null) {
-			try {
-				Object obj = getConfigurationElement()
-						.createExecutableExtension(ATT_FILTER);
-				if (obj instanceof ISectionFilter) {
-					_sectionFilter = (ISectionFilter) obj;
-				}
-			} catch (CoreException ex) {
-				handleSectionError(ex);
-			}
-		}
-
-		IConfigurationElement[] elements = getConfigurationElement()
-				.getChildren(TAGFILTER);
-		if (elements != null && elements.length > 0) {
-			_tagFilters = new TagFilter[elements.length];
-			for (int i = 0; i < _tagFilters.length; i++) {
-				_tagFilters[i] = new TagFilter();
-				_tagFilters[i].uri = elements[i].getAttribute(URI);
-				_tagFilters[i].tag = elements[i].getAttribute(TAGNAME);
-				_tagFilters[i].caseSensitive = Boolean.TRUE.toString()
-						.equalsIgnoreCase(
-								elements[i].getAttribute(CASESENSITIVE));
-			}
-		}
-	}
-
-	/**
-	 * 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(DesignerSectionDescriptor.class).error("error",
-				exception);
-		exception.printStackTrace();
-		// String pluginId = PDPlugin.getPluginId();
-		// String message = MessageFormat.format(SECTION_ERROR, new Object[] {
-		// pluginId});
-		// IStatus status = new Status(IStatus.ERROR, pluginId,
-		// CommonUIPropertiesStatusCodes.GENERAL_UI_FAILURE, message,
-		// exception);
-		// CommonUIPropertiesPlugin.getPlugin().getLog().log(status);
-	}
-
-	/**
-	 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySectionDescriptor#getId()
-	 */
-	public String getId() {
-		return _id;
-	}
-
-	/**
-	 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySectionDescriptor#getTargetTab()
-	 */
-	public String getTargetTab() {
-		return _targetTab;
-	}
-
-	/**
-	 * @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) {
-		Element node = DesignerPropertyTool.getElement(part, selection);
-		if (node == null) {
-			return false;
-		}
-		if (_tagFilters != null) {
-			String uri = CMUtil.getElementNamespaceURI(node);
-			String tag = node.getLocalName();
-			for (int i = 0; i < _tagFilters.length; i++) {
-				if (!match(uri, tag, _tagFilters[i])) {
-					return false;
-				}
-			}
-		}
-		if (_sectionFilter != null) {
-			if (!_sectionFilter.appliesTo(node)) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * @param uri2
-	 * @param tag
-	 * @param filter
-	 * @return
-	 */
-	private boolean match(String uri, String tag, TagFilter filter) {
-		if (!StringUtil.isSameString(uri, filter.uri)) {
-			return false;
-		}
-		if (uri != null && filter.uri != null && !uri.equals(filter.uri)) {
-			return false;
-		}
-		if (filter.caseSensitive) {
-			return tag.equals(filter.tag);
-		}
-        return tag.equalsIgnoreCase(filter.tag);
-	}
-
-	/**
-	 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySectionDescriptor#getAfterSection()
-	 */
-	public String getAfterSection() {
-		return _afterSection;
-	}
-
-	/**
-	 * Creates an instance of a section described by this descriptor
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySectionDescriptor#getSectionClass()
-	 */
-	public ISection getSectionClass() {
-		ISection section = null;
-		try {
-			Object secOrGroup = getConfigurationElement()
-					.createExecutableExtension(ATT_CLASS);
-			if (secOrGroup instanceof ISection) {
-				section = (ISection) secOrGroup;
-			} else if (secOrGroup instanceof AttributeGroup) {
-				section = new AttributeGroupSection((AttributeGroup) secOrGroup);
-			}
-		} catch (CoreException exception) {
-			handleSectionError(exception);
-		}
-
-		return section;
-	}
-
-	/**
-	 * Gets the input types that are valid for this section.
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySectionDescriptor#getInputTypes()
-	 */
-	public List getInputTypes() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return getId();
-	}
-
-	/**
-	 * @return Returns the configurationElement.
-	 */
-	private IConfigurationElement getConfigurationElement() {
-		return _configurationElement;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getFilter()
-	 */
-	public ITypeMapper getFilter() {
-		return null;
-	}
-
-	public int getEnablesFor() {
-		return 1;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/DesignerTabPropertySectionDescriptorProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/DesignerTabPropertySectionDescriptorProvider.java
deleted file mode 100644
index 81276e8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/DesignerTabPropertySectionDescriptorProvider.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.properties.internal;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor;
-import org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptorProvider;
-
-/**
- * The DesignerTagPropertySectionDescriptorProvider will provide the section
- * descriptiors. Now section descriptor come from two sources.
- * 
- * One is reading from the "org.eclipse.jst.pagedesigner.propertyContributor"
- * extension point. This extension point will contribute additional section
- * providers, which provides a set of sections.
- * 
- * One is reading from the "org.eclipse.jst.pagedesigner.propertySections"
- * extension point. This extension provide a single section.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DesignerTabPropertySectionDescriptorProvider implements
-		ISectionDescriptorProvider {
-	private static final String EXTPT_SECTIONS = "propertySections"; //$NON-NLS-1$
-
-	private static final String ELEMENT_SECTION = "propertySection"; //$NON-NLS-1$
-
-	private static final String EXTPT_SECTIONDESCRIPTORPROVIDER = "propertyContributor";
-
-	private static final String ELEMENT_PROPERTYCONTRIBUTOR = "propertyContributor";
-
-	private static final String ATTR_SECTIONDESCRIPTORPROVIDER = "sectionDescriptorProvider";
-
-	ISectionDescriptor[] _descriptors = null;
-
-	/**
-	 * 
-	 */
-	public DesignerTabPropertySectionDescriptorProvider() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptorProvider#getSectionDescriptors()
-	 */
-	public ISectionDescriptor[] getSectionDescriptors() {
-		if (_descriptors == null) {
-			List result = new ArrayList();
-			List contributedSections = readSectionDescriptors();
-			result.addAll(contributedSections);
-
-			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;
-	}
-
-	protected List readAdditionalSectionDescriptorProviders() {
-		List result = new ArrayList();
-		IConfigurationElement[] extensions = getConfigurationElements(EXTPT_SECTIONDESCRIPTORPROVIDER);
-		for (int i = 0; i < extensions.length; i++) {
-			IConfigurationElement extension = extensions[i];
-			if (ELEMENT_PROPERTYCONTRIBUTOR.equals(extension.getName())) {
-				IConfigurationElement contributor = extension;
-				try {
-					Object obj = contributor
-							.createExecutableExtension(ATTR_SECTIONDESCRIPTORPROVIDER);
-					if (obj instanceof ISectionDescriptorProvider) {
-						result.add(obj);
-					}
-				} catch (CoreException ex) {
-					ex.printStackTrace();
-				}
-			}
-		}
-		return result;
-	}
-
-	protected List readSectionDescriptors() {
-		List result = new ArrayList();
-		IConfigurationElement[] extensions = getConfigurationElements(EXTPT_SECTIONS);
-		for (int i = 0; i < extensions.length; i++) {
-			IConfigurationElement extension = extensions[i];
-			IConfigurationElement[] sections = extension
-					.getChildren(ELEMENT_SECTION);
-			for (int j = 0; j < sections.length; j++) {
-				IConfigurationElement section = sections[j];
-				ISectionDescriptor descriptor = new DesignerSectionDescriptor(
-						section);
-				result.add(descriptor);
-			}
-		}
-		return result;
-	}
-
-	public static IConfigurationElement[] getConfigurationElements(
-			String extensionPointId) {
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint(PDPlugin.getPluginId(), extensionPointId);
-
-		if (extensionPoint == null) {
-			return null;
-		}
-		return extensionPoint.getConfigurationElements();
-	}
-}
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 9febaaa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/range/RangeUtil.java
+++ /dev/null
@@ -1,367 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.TextPosition;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.DocumentFragment;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @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
-	 */
-	public 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);
-	}
-
-	public 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
-	 */
-	public 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
-	 */
-	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);
-	}
-
-	public 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
-	 */
-	public 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
-	 */
-	public 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;
-	}
-
-	public static void insertDocumentFragment(DesignPosition position,
-			DocumentFragment fragment) {
-		// FIXME: NOT DONE.
-	}
-
-	/**
-	 * Test whether the range intersect with the part.
-	 * 
-	 * @param range
-	 * @param part
-	 */
-	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
-	 */
-	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.
-	 */
-	public 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
-	 */
-	public 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;
-		}
-
-	}
-
-	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 3f720f0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/LocationModifierRequest.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.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);
-	}
-
-	public boolean isControlKeyPressed() {
-		return _controlKeyDown;
-	}
-
-	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 e08dd21..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/NodeCreationFactory.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.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 {
-	String _tagName;
-
-	String _uri;
-
-	String _suggestedPrefix;
-
-	Map _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
-	 */
-	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)
-	 */
-	public 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 69f1f4b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/PageDesignerRequestConstants.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.requests;
-
-public final class PageDesignerRequestConstants 
-{
-    /**
-     * sent to an edit part to request a selection drag tracker
-     */
-    public final static String REQ_SELECTION_TRACKER = "selection.tracker.request";
-    
-    private PageDesignerRequestConstants()
-    {
-        // no instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/ColumnHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/ColumnHandle.java
deleted file mode 100644
index 85c6e5c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/ColumnHandle.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.tableedit;
-
-import org.eclipse.gef.GraphicalEditPart;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ColumnHandle extends TableSideItemHandle {
-
-	/**
-	 * @param owner
-	 * @param isRow
-	 * @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 92496e1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/ColumnResizeHandle.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.tableedit;
-
-import org.eclipse.gef.GraphicalEditPart;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ColumnResizeHandle extends TableSideResizeHandle {
-	// 0 means before first column
-	int _columnIndex;
-
-	/**
-	 * 
-	 */
-	public ColumnResizeHandle(GraphicalEditPart owner, int index) {
-		super(owner, false, index);
-		_columnIndex = 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 7ce481a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteHeaderFooterAction.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.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
-	 */
-	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 3a48173..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteHeaderFooterRequest.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.tableedit;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DeleteHeaderFooterRequest extends Request {
-	private boolean _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 e56fe3f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteRowColumnAction.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 DeleteRowColumnAction extends Action {
-	private Command _command;
-
-	/**
-	 * @param text
-	 */
-	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 4d0000e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertHeaderFooterAction.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.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
-	 */
-	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 2f86799..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertHeaderFooterRequest.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.tableedit;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertHeaderFooterRequest extends Request {
-	private boolean _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 ebd835d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertRowColumnAction.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.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
-	 */
-	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 8cd08d2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/RowHandle.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.tableedit;
-
-import org.eclipse.gef.GraphicalEditPart;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RowHandle extends TableSideItemHandle {
-
-	/**
-	 * @param owner
-	 * @param isRow
-	 * @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 10682ff..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/RowResizeHandle.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.tableedit;
-
-import org.eclipse.gef.GraphicalEditPart;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RowResizeHandle extends TableSideResizeHandle {
-	// 0 means before first row
-	int _rowIndex;
-
-	/**
-	 * 
-	 */
-	public RowResizeHandle(GraphicalEditPart owner, int index) {
-		super(owner, true, index);
-
-		_rowIndex = 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 9816f93..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 ref
-	 */
-	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 54b714a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditConst.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.tableedit;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface TableEditConst {
-	public static final int HEIGHT = 10;
-
-	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 f1b4a85..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
-	 */
-	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 d7c9fae..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableInsertRequest.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.tableedit;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableInsertRequest extends TableRowColumnRequest {
-	public static final String TABLE_INSERT_REQUEST = "Table Insert";
-
-	boolean _before;
-
-	/**
-	 * 
-	 */
-	public TableInsertRequest(boolean row, int index, boolean before) {
-		super(TABLE_INSERT_REQUEST, row, index);
-		this._before = before;
-	}
-
-	public boolean isBefore() {
-		return _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 b4dbef7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableResizeRequest.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.tableedit;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableResizeRequest extends Request {
-	public static final String TABLE_RESIZE_REQ = "Table Resize";
-
-	private boolean _row;
-
-	private int _index;
-
-	private int _delta;
-
-	/**
-	 * 
-	 */
-	public TableResizeRequest(boolean isrow, int index) {
-		super(TABLE_RESIZE_REQ);
-		this._row = isrow;
-		this._index = index;
-	}
-
-	public int getIndex() {
-		return _index;
-	}
-
-	public void setIndex(int index) {
-		this._index = index;
-	}
-
-	public boolean isRow() {
-		return _row;
-	}
-
-	public void setRow(boolean row) {
-		this._row = row;
-	}
-
-	public int getDelta() {
-		return _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 aa86052..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowColumnDeleteRequest.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.tableedit;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableRowColumnDeleteRequest extends TableRowColumnRequest {
-	public static final String TABLE_ROWCOLUMN_DELETE = "Table RowColumn Delete";
-
-	/**
-	 * @param type
-	 * @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 0a5b33a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowColumnRequest.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.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableRowColumnRequest extends Request {
-	int _index;
-
-	boolean _row;
-
-	/**
-	 * @param type
-	 */
-	public TableRowColumnRequest(Object type, boolean row, int index) {
-		super(type);
-		this._row = row;
-		this._index = index;
-	}
-
-	public int getIndex() {
-		return _index;
-	}
-
-	public void setIndex(int index) {
-		this._index = index;
-	}
-
-	public boolean isRow() {
-		return _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 d1c2a9e..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 ref
-	 */
-	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 ab53c87..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideHandle.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.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;
-	}
-
-	public GraphicalEditPart getTableEditPart() {
-		return this.getOwner();
-	}
-
-	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 201b1ff..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideItemHandle.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.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;
-
-	/**
-	 * 
-	 */
-	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);
-	}
-
-	public int getIndex() {
-		return _index;
-	}
-
-	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 abfe878..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideResizeDragTracker.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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
-	 */
-	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;
-		}
-	}
-
-	protected 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 af5d8ec..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideResizeHandle.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;
-
-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;
-
-	/**
-	 * 
-	 */
-	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 6e1c24b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/ExposeHelper.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.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 owner
-	 */
-	public ExposeHelper(IHTMLGraphicalViewer viewer) {
-		_viewer = viewer;
-	}
-
-	/**
-	 * Expose rectangle. (non-Javadoc)
-	 * 
-	 * @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);
-		}
-	}
-
-	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);
-			}
-		}
-	}
-
-	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);
-		}
-	}
-
-	public Point getViewpostLocation() {
-		if (_viewer != null) {
-			Viewport port = _viewer.getViewport();
-
-			if (port != null) {
-				return port.getViewLocation();
-			}
-		}
-		return null;
-	}
-
-	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;
-	}
-
-	public 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 162c499..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.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.HTMLGraphicalViewer;
-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. */
-	protected static final int FLAG_SELECTION_PERFORMED = TargetingTool.MAX_FLAG << 1;
-
-	/** Max flag */
-	protected static final int MAX_FLAG = FLAG_SELECTION_PERFORMED;
-
-	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;
-	}
-
-	/**
-	 * Calls {@link #performSelection()}if the source is not selected. 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 was already selected, {@link #performDirectEdit()}is called. If the
-	 * edit part is newly selected and not completely visible,
-	 * {@link 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(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;
-	}
-
-	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.
-		EditPart editPart = getCurrentViewer().findObjectAtExcluding(
-				getLocation(), Collections.EMPTY_LIST);
-		IPositionMediator positionMediator = new InlineEditingPositionMediator(
-				new ActionData(ActionData.INLINE_EDIT, null));
-		ExposeHelper exposeHelper = new ExposeHelper(getHTMLGraphicalViewer());
-		exposeHelper.adjustVertical(getCurrentInput().getMouseLocation());
-		DesignPosition position = EditPartPositionHelper.findEditPartPosition(
-				editPart, getCurrentInput().getMouseLocation(),
-				positionMediator);
-		if (b) {
-			getHTMLGraphicalViewer().setRangeEndPosition(position);
-		} else {
-			getHTMLGraphicalViewer().setRange(position, position);
-		}
-		if (getHTMLGraphicalViewer() instanceof HTMLGraphicalViewer) {
-			((HTMLGraphicalViewer) getHTMLGraphicalViewer())
-					.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 c5da846..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeSelectionTool.java
+++ /dev/null
@@ -1,344 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.HTMLGraphicalViewer;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.graphics.Cursor;
-
-/**
- * @author mengbo
- */
-public class RangeSelectionTool extends SelectionTool 
-{
-	private LocationRequest _hoverRequest;
-    
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.SelectionTool#handleKeyDown(org.eclipse.swt.events.KeyEvent)
-	 */
-	protected boolean handleKeyDown(KeyEvent e) {
-		// resetHover() is not visible.
-		if (isHoverActive()) {
-			handleHoverStop();
-		}
-		setHoverActive(false);
-
-		if ((e.stateMask & SWT.ALT) != 0) {
-			return false;
-		}
-		Command command = null;
-		KeyboardData keyCode = null;
-		switch (e.keyCode) {
-		case SWT.F2:
-			command = new SwitchSelectionCommand((IHTMLGraphicalViewer) this
-					.getCurrentViewer());
-
-			break;
-		case SWT.ARROW_UP:
-			command = new VerticalMoveCommand((IHTMLGraphicalViewer) this
-					.getCurrentViewer(), true, (e.stateMask & SWT.SHIFT) != 0);
-			break;
-		case SWT.ARROW_DOWN:
-			command = new VerticalMoveCommand((IHTMLGraphicalViewer) this
-					.getCurrentViewer(), false, (e.stateMask & SWT.SHIFT) != 0);
-			break;
-		case SWT.ARROW_LEFT:
-			command = new HorizontalMoveCommand((IHTMLGraphicalViewer) this
-					.getCurrentViewer(), false, (e.stateMask & SWT.SHIFT) != 0);
-			break;
-		case SWT.ARROW_RIGHT:
-			command = new HorizontalMoveCommand((IHTMLGraphicalViewer) this
-					.getCurrentViewer(), true, (e.stateMask & SWT.SHIFT) != 0);
-			break;
-		case SWT.DEL:
-			if ((e.stateMask & SWT.SHIFT) == 0) {
-				if (getCurrentViewer().getSelection() != null) {
-					ISelection selection = getCurrentViewer().getSelection();
-					if (selection instanceof StructuredSelection) {
-						Object object = ((StructuredSelection) selection)
-								.getFirstElement();
-						if (!(object instanceof DocumentEditPart)) {
-							// "delete node"
-							command = new DeleteNodeCommand(
-									(IHTMLGraphicalViewer) getCurrentViewer());
-						}
-					}
-				}
-				if (command == null) {
-					// "delete"
-					command = new DeleteCommand(true,
-							(IHTMLGraphicalViewer) this.getCurrentViewer()); //$NON-NLS-1$
-				}
-			} else {
-				// "cut"
-				command = new CutCommand((IHTMLGraphicalViewer) this
-						.getCurrentViewer()); //$NON-NLS-1$
-				e.doit = false;
-			}
-			break;
-		case SWT.BS:
-			// "delete"
-			command = new DeleteCommand(false, (IHTMLGraphicalViewer) this
-					.getCurrentViewer()); //$NON-NLS-1$
-			e.doit = false;
-			break;
-		case SWT.INSERT:
-			if ((e.stateMask & SWT.SHIFT) != 0) {
-				// "paste"
-				command = new PasteCommand((IHTMLGraphicalViewer) this
-						.getCurrentViewer()); //$NON-NLS-1$
-				e.doit = false;
-				break;
-			} else if ((e.stateMask & SWT.CONTROL) != 0) {
-				// "copy"
-				command = new CopyCommand((IHTMLGraphicalViewer) this
-						.getCurrentViewer()); //$NON-NLS-1$
-				e.doit = false;
-				break;
-			}
-			break;
-		case SWT.LF:
-		case SWT.CR:
-			// "insert"
-			keyCode = new KeyboardData(e.character, e.stateMask,
-					(IHTMLGraphicalViewer) getCurrentViewer());
-			command = new InsertCommand(
-					PageDesignerResources.getInstance().getString(
-							"RangeSelectionTool.CommandLabel.Insert"), (IHTMLGraphicalViewer) this.getCurrentViewer(), keyCode); //$NON-NLS-1$
-			e.doit = false;
-			break;
-		default:
-			if (e.keyCode == 'a' && (e.stateMask & SWT.CTRL) != 0) {
-				command = new SelectAllCommand("selectAll",
-						(IHTMLGraphicalViewer) this.getCurrentViewer());
-				e.doit = false;
-			} else {
-				if (getCurrentViewer() instanceof HTMLGraphicalViewer
-						&& ((HTMLGraphicalViewer) 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 HTMLGraphicalViewer) {
-					((HTMLGraphicalViewer) 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);
-	// }
-
-	/**
-	 * For inner debuging.
-	 * 
-	 * @param e
-	 */
-    
-    // TODO: dead?
-//	private void dumpKey(KeyEvent e) {
-//		String message = "code:" + Integer.toBinaryString(e.keyCode) + "char:" + e.character + "key:" + Integer.toBinaryString(e.stateMask); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-//		_log.info(message);
-//	}
-//
-//	/**
-//	 * @param content
-//	 */
-//	private boolean handleRangeModeContentChar(char content) {
-//		IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) this
-//				.getCurrentViewer();
-//		ContentCommand c = new ContentCommand(viewer, content);
-//		c.execute();
-//		return true;
-//	}
-
-	/*
-	 * (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 527270b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/CommonResourceDialog.java
+++ /dev/null
@@ -1,407 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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,
- * 
- * @author mengbo
- */
-public 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 ITreeContentProvider#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 ITreeContentProvider#hasChildren
-		 */
-		public boolean hasChildren(Object element) {
-			return getChildren(element).length > 0;
-		}
-
-		/**
-		 * @see IContentProvider#inputChanged
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-            // do nothing
-		}
-
-	}
-
-	// The default resource filter
-	class CommonResourceFilter extends ViewerFilter {
-		private String _suffixs[] = { IFileFolderConstants.EXT_PROPERTIES };
-
-		Logger _log = 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;
-		}
-
-		public CommonResourceFilter(IProject project) {
-			_project = project;
-		}
-
-		/**
-		 * @param _project
-		 *            The _project to set.
-		 */
-		public void setProject(IProject project) {
-			this._project = project;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public boolean select(Viewer viewer, Object parentElement,
-				Object element) {
-			// TODO: This logic can be improved by add caching mechanism
-			if (element instanceof IWorkspace) {
-				return true;
-			} else if (element instanceof IFile) {
-				if (Arrays.asList(_suffixs).contains(
-						((IFile) element).getFileExtension())) {
-					return true;
-				}
-			} else if (element instanceof IContainer) {
-				if (!((IContainer) element).isAccessible()) {
-					return false;
-				}
-				if (element instanceof IProject) {
-					IProject container = (IProject) element;
-					if (isWebAppProject(container)
-							&& this.isSameProject(container, _project)) {
-						return true;
-					}
-                    return false;
-				} else if (element instanceof IFolder) {
-					IContainer container = (IContainer) element;
-					try {
-						if (container.getName().equals(
-								IFileFolderConstants.FOLDER_WEBINF)
-								|| container.getName().equals(
-										IFileFolderConstants.FOLDER_METAINF)) {
-							return false;
-						}
-						IResource[] members = container.members();
-						for (int i = 0; i < members.length; i++) {
-							{
-								if (select(viewer, members[i].getParent(),
-										members[i])) {
-									return true;
-								}
-							}
-						}
-					} catch (CoreException e) {
-						// "Error.ImgFileFilter.0" = "Error in filtering the
-						// tree", "Error.ImgFileFilter.2 = ""CoreException is
-						// thrown, please refer to error log for details"
-						// "Error.ProjectFileDialogContentProvider.0" = core
-						// error, show alert dialog to user.
-						PDPlugin
-								.getAlerts()
-								.detailError(
-										"Error.ImgFileFilter.0", "Error.ImgFileFilter.2"); //$NON-NLS-2$
-						_log.error(
-								"Error.ProjectFileDialogContentProvider.0", e); //$NON-NLS-1$
-						return false;
-					}
-				}
-			}
-			// we don't select any other types of resources.
-			return false;
-		}
-
-		/**
-		 * Determines if a project is a Web Application project by the presence
-		 * of an associated Web Application Nature.
-		 * 
-		 * @return boolean - True, when project is a Web Application project
-		 */
-		private boolean isWebAppProject(IProject project) {
-			return WebrootUtil.isValidWebProject(project);
-		}
-
-		private boolean isSameProject(IProject orig, IProject dst) {
-			String currentProjectName = orig.getFullPath()
-					.toString().trim();
-			String projectName = dst.getFullPath().toString().trim();
-			return projectName.equalsIgnoreCase(currentProjectName);
-		}
-	}
-
-	/**
-	 * This is a dialog for common resource selection, the resouce supported
-	 * include IFolder, IProject, IFile, user can provide
-	 * 
-	 * @param parentShell
-	 * @param project
-	 */
-	public CommonResourceDialog(Shell parentShell, IProject project) {
-		super(parentShell, STATUS_MESSAGE);
-		setContentProvider(new ProjectFileDialogContentProvider());
-		setLabelProvider(WorkbenchLabelProvider
-				.getDecoratingWorkbenchLabelProvider());
-		_filter = new CommonResourceFilter(project);
-		setFilter(_filter);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#findInputElement()
-	 */
-	protected Object findInputElement() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#isValidSelection(java.lang.Object)
-	 */
-	protected boolean isValidSelection(Object selection) {
-		if (getContainerFullPath(selection) == null) {
-			return false;
-		}
-        int depth = getContainerFullPath(selection).segmentCount();
-        // The location is within WEBROOT PATH?
-        if ((selection instanceof IFile) && depth >= WEBROOT_FOLDER_DEPTH) {
-        	// Null means no filter is set
-        	if (_suffixs == null) {
-        		return true;
-        	}
-        	// The extension is supported?
-        	else if (_suffixs != null
-        			&& Arrays.asList(_suffixs).contains(
-        					((IFile) selection).getFileExtension())) {
-        		return true;
-        	}
-        }
-        // None of above conditions, invalid.
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.SelectionDialog#getResult()
-	 */
-	public Object[] getResult() {
-		Object[] objects = super.getResult();
-		if (objects == null || objects.length == 0) {
-			return null;
-		}
-		// Only one element is set by us.
-		IPath returnValue = getWebRelatedPath(objects[0]);
-		if (returnValue != null) {
-			if (!(returnValue.toString().startsWith(
-					IFileFolderConstants.PATH_SEPARATOR) || returnValue
-					.toString().startsWith("\\"))) {
-				Path tempPath = new Path(IFileFolderConstants.PATH_SEPARATOR
-						+ returnValue.toString());
-				returnValue = tempPath;
-			}
-		}
-		return new Object[] { returnValue };
-	}
-
-	public 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;
-	}
-
-	public 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;
-	}
-
-	/**
-	 * @param _suffixs
-	 *            The _suffixs to set.
-	 */
-	public void setSuffixs(String[] suffixs) {
-		this._suffixs = suffixs;
-		_filter.setSuffixs(suffixs);
-	}
-}
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 8cc2087..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/PartActivationHandler.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.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;
-
-	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 8f33ee0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/ResourceOnClasspathDialog.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.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.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.internal.core.JarEntryFile;
-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;
-
-		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;
-			}
-			// XXX: JarEntryFile is for internal use.
-			if (element instanceof JarEntryFile) {
-				String ext = ((JarEntryFile) element).getFullPath()
-						.getFileExtension();
-				if (ext != null && Arrays.asList(_suffixs).contains(ext)) {
-					return true;
-				}
-                return false;
-			}
-			if (!(element instanceof IJavaElement)) {
-				return false;
-			}
-			if (((_javaProject != null) && !_javaProject
-					.isOnClasspath((IJavaElement) element))) {
-				return false;
-			}
-			IJavaElement javaElement = (IJavaElement) element;
-			Object[] children = null;
-			switch (javaElement.getElementType()) {
-			case IJavaElement.PACKAGE_FRAGMENT_ROOT:
-				children = _javaContentProvider.getChildren(javaElement);
-				break;
-			case IJavaElement.IMPORT_CONTAINER:
-				return true;
-			case IJavaElement.PACKAGE_FRAGMENT:
-				children = _javaContentProvider.getChildren(javaElement);
-				break;
-			case IJavaElement.CLASS_FILE:
-				if (Arrays.asList(_suffixs).contains(
-						IFileFolderConstants.EXT_CLASS)) {
-					return true;
-				} 
-				return false;
-			case IJavaElement.COMPILATION_UNIT:
-				String ext = javaElement.getPath().getFileExtension();
-				if (ext != null && Arrays.asList(_suffixs).contains(ext)) {
-					return true;
-				} 
-				return false;
-			default:
-				return false;
-			}
-
-			for (int i = 0; i < children.length; i++) {
-				if (select(viewer, javaElement, children[i])) {
-					return true;
-				}
-			}
-			// Either the resouce or its children are not for displaying.
-			return false;
-		}
-	}
-
-	/**
-	 * Set the suffixs of files need to be selected.
-	 * 
-	 * @param suffixs
-	 */
-	public void setSuffixs(String suffixs[]) {
-		_suffixs = suffixs;
-		_filter.setSuffixs(suffixs);
-	}
-
-	/**
-	 * @param parentShell
-	 * @param project
-	 */
-	public ResourceOnClasspathDialog(Shell parentShell, IJavaProject project) {
-		super(parentShell, STATUS_MESSAGE);
-		// set provider and filter
-		StandardJavaElementContentProvider contentProvider = new StandardJavaElementContentProvider();
-		setContentProvider(contentProvider);
-		setLabelProvider(new JavaElementLabelProvider());
-		_filter = new ResourceOnClasspathFilter(contentProvider);
-		setFilter(_filter);
-		// store the project
-		_javaProject = project;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.SelectionDialog#getResult()
-	 */
-	public Object[] getResult() {
-		Object[] objects = super.getResult();
-		if (objects == null || objects.length == 0) {
-			return null;
-		}
-		IPath path = JavaUtil.getPathOnClasspath(_javaProject, objects[0]);
-		String result = null;
-		if (path.segmentCount() == 0) {
-			return new Object[] { "" };
-		}
-		path = path.removeFileExtension();
-		result = path.toOSString();
-		result = result.replace(File.separatorChar, '.');
-		return new Object[] { result };
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#isValidSelection()
-	 */
-	protected boolean isValidSelection(Object selection) {
-		String extension = JavaUtil.getPathOnClasspath(_javaProject, selection)
-				.getFileExtension();
-		return (extension != null && Arrays.asList(_suffixs)
-				.contains(extension));
-	}
-
-	protected Object findInputElement() {
-		Object input = ResourcesPlugin.getWorkspace();
-		if (input instanceof IWorkspace) {
-			return JavaCore.create(((IWorkspace) input).getRoot());
-		} else if (input instanceof IContainer) {
-			IJavaElement element = JavaCore.create((IContainer) input);
-			if (element != null && element.exists())
-				return element;
-			return input;
-		}
-		return JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/TreeViewerSelectionDialog.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/TreeViewerSelectionDialog.java
deleted file mode 100644
index 0197559..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/TreeViewerSelectionDialog.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.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
- */
-public 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 */
-	public static final int STYLE_NONE = 0;
-
-	public static final int STYLE_INFORMATION = 1;
-
-	public static final int STYLE_ERROR = 2;
-
-	public 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
-	 */
-	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 heightHint -
-	 *            height hint for the drill down composite
-	 */
-	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.
-	 */
-	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 container -
-	 *            the current selected container.
-	 */
-	public void setSelectedElement(Object selection) {
-		// Expand to and select the specified container
-		if (_selection != null) {
-			_treeViewer.expandToLevel(_selection, 1);
-		}
-		List itemsToExpand = new ArrayList();
-		Object parent = _contentProvider.getParent(selection);
-		if (parent == null) {
-			return;
-		}
-		while (parent != null) {
-			itemsToExpand.add(0, parent);
-			parent = _contentProvider.getParent(parent);
-		}
-		_treeViewer.setExpandedElements(itemsToExpand.toArray());
-		_treeViewer.setSelection(new StructuredSelection(selection), true);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Dialog.
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite area = (Composite) super.createDialogArea(parent);
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 2;
-		area.setLayout(gridLayout);
-
-		// Container treeviewer composite
-		createTreeViewerComposite(area);
-
-		_statusImage = SWTUtils.createLabelImage(area,
-				getMessageImage(STYLE_ERROR), 1, null);
-		_statusLabel = SWTUtils.createLabel(area, "", 1);
-		// Link to model
-		setTreeViewerProviders();
-
-		return dialogArea;
-	}
-
-	private Object getSelectedElement(IStructuredSelection selection) {
-		return selection.getFirstElement();
-	}
-
-	/**
-	 * @param provider
-	 *            The _contentProvider to set.
-	 */
-	public void setContentProvider(ITreeContentProvider provider) {
-		_contentProvider = provider;
-	}
-
-	/**
-	 * @param provider
-	 *            The _labelProvider to set.
-	 */
-	public void setLabelProvider(ILabelProvider provider) {
-		_labelProvider = provider;
-	}
-
-	/**
-	 * @param filter
-	 *            The _filter to set.
-	 */
-	public void setFilter(ViewerFilter filter) {
-		this._filter = filter;
-	}
-
-	public void setStatusMessage(String message) {
-		_statusMessage = message;
-	}
-
-	/**
-	 * Update the status message
-	 */
-	private void updateStatus() {
-		if (isValidSelection(_selection)) {
-			_statusImage.setImage(getMessageImage(STYLE_NONE));
-			_statusLabel.setText("");
-			getOkButton().setEnabled(true);
-		} else {
-			_statusImage.setImage(getMessageImage(STYLE_ERROR));
-			_statusLabel.setText(_statusMessage);
-			getOkButton().setEnabled(false);
-		}
-	}
-
-	/**
-	 * Get the different message according the message type.
-	 * 
-	 * @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;
-	}
-
-	protected abstract boolean isValidSelection(Object selection);
-
-	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 d1dcae1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorPart.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.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.internal.WorkbenchPlugin;
-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 index
-	 *            the index at which to add the page (0-based)
-	 * @param editor
-	 *            the nested editor
-	 * @param input
-	 *            the input for the nested editor
-	 * @exception PartInitException
-	 *                if a new page could not be created
-	 * @see 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);
-	}
-
-	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;
-	}
-
-	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 newPageIndex
-	 *            the index of the activated page
-	 */
-	protected void activeEditorChanged(IEditorPart activeEditor) {
-		setActiveEditor(activeEditor);
-		setFocus();
-
-		IEditorSite site = getEditorSite();
-		while (site != null) {
-			IEditorActionBarContributor contributor = site
-					.getActionBarContributor();
-			if (contributor != null
-					&& 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 pageIndex
-	 *            the index of the page to be activated; the index must be valid
-	 */
-	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;
-	}
-
-	public void setOrientation(int orientation) {
-		this._orientation = orientation;
-		if (_sashForm != null && !_sashForm.isDisposed()) {
-			_sashForm.setMaximizedControl(null);
-			_sashForm.setOrientation(_orientation);
-		}
-	}
-
-	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 229043a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorSelectionProvider.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.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.
-	 */
-	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 31cec57..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorSite.java
+++ /dev/null
@@ -1,439 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchPartSite#progressEnd()
-	 */
-	public void progressEnd(Job job) {
-		// Do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchPartSite#progressStart()
-	 */
-	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) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public void registerContextMenu(String menuId, MenuManager menuManager,
-			ISelectionProvider selectionProvider, boolean includeEditorInput) {
-		// TODO Auto-generated method stub
-
-	}
-
-	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.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ContextableClasspathResourceButtonDialogField.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ContextableClasspathResourceButtonDialogField.java
deleted file mode 100644
index fca73e6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ContextableClasspathResourceButtonDialogField.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.dialogfields;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClasspathResourceButtonDialogField;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
-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.IDOMNode;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ContextableClasspathResourceButtonDialogField extends
-		ClasspathResourceButtonDialogField implements IElementContextable {
-	/**
-	 * @param project
-	 */
-	public ContextableClasspathResourceButtonDialogField() {
-		super(null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.attributegroup.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) {
-		IProject prj = StructuredModelUtil.getProjectFor(ancester.getModel());
-		this.setProject(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 ac658fc..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 {
-
-	/**
-	 * @param project
-	 */
-	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 ef17dd8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/DialogFieldWrapper.java
+++ /dev/null
@@ -1,411 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.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.
-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;
-
-	/**
-	 * 
-	 */
-	public DialogFieldWrapper(DialogField field, Image image,
-			Image disabledImage, String uri, String tagName,
-			IAttributeDescriptor attr, IBindingHandler handler) {
-		super();
-		if (!(field instanceof ISupportTextValue)) {
-			throw new IllegalArgumentException(
-					"Field must be ISupportTextValue");
-		}
-		_wrapped = field;
-		this._image = image;
-		this._disabledImage = disabledImage;
-		this._uri = uri;
-		this._tagName = tagName;
-		this._attr = attr;
-		this._handler = handler;
-
-		setDatabindingPressedHandler(new IStringButtonAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter#changeControlPressed(org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField)
-			 */
-			public void changeControlPressed(DialogField field1) {
-				Shell shell = field1.getLabelControl(null, null).getShell();
-				DialogFieldWrapper wrapper = (DialogFieldWrapper) field1;
-				String result = _handler
-						.handleBinding(shell, wrapper.getAncester(), wrapper
-								.getElement(), wrapper.getText());
-				if (result != null) {
-					wrapper.setText(result);
-				}
-			}
-		});
-	}
-
-	public 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 = _handler.isEnabled(_ancester, _element, _uri,
-				_tagName, _attr);
-		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) {
-			Assert.isNotNull(parent,
-					"uncreated control requested with composite null"); //$NON-NLS-1$
-			if (toolkit != null) {
-				_databindingButton = toolkit.createButton(parent, "", SWT.PUSH);
-				_databindingButton.setImage(getImage());
-			} else {
-				_databindingButton = new Button(parent, SWT.PUSH);
-				_databindingButton.setImage(getImage());
-			}
-			_databindingButton.addPaintListener(new PaintListener() {
-				public void paintControl(PaintEvent e) {
-					if (!_databindingButton.isEnabled()
-							&& getDisabledImage() != null) {
-						Rectangle buttonBounds = _databindingButton.getBounds();
-						Rectangle imageBounds = getDisabledImage().getBounds();
-						e.gc.drawImage(getDisabledImage(),
-								(buttonBounds.width - imageBounds.width) / 2,
-								(buttonBounds.height - imageBounds.height) / 2);
-					}
-				}
-			});
-			_databindingButton.setEnabled(isEnabled() && _databindingEnabled);
-			_databindingButton.addSelectionListener(new SelectionListener() {
-				public void widgetDefaultSelected(SelectionEvent e) {
-					databindingControlPressed();
-				}
-
-				public void widgetSelected(SelectionEvent e) {
-					databindingControlPressed();
-				}
-			});
-
-		}
-		return _databindingButton;
-	}
-
-	/**
-	 * @return
-	 */
-	private Image getImage() {
-		return _image;
-	}
-
-	private Image getDisabledImage() {
-		return _disabledImage;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#getLabelControl(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public Control getLabelControl(FormToolkit _formToolkit, Composite parent) {
-		return _wrapped.getLabelControl(_formToolkit, parent);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setHyperLink(org.eclipse.ui.forms.events.IHyperlinkListener)
-	 */
-	public void setHyperLink(IHyperlinkListener listener) {
-		_wrapped.setHyperLink(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setLabelText(java.lang.String)
-	 */
-	public void setLabelText(String labeltext) {
-		_wrapped.setLabelText(labeltext);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setDialogFieldChangeListener(org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldChangeListener)
-	 */
-	public void setDialogFieldChangeListener(IDialogFieldChangeListener listener) {
-		_wrapped.setDialogFieldChangeListener(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setDialogFieldApplyListener(org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener)
-	 */
-	public void setDialogFieldApplyListener(IDialogFieldApplyListener listener) {
-		_wrapped.setDialogFieldApplyListener(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setFocus()
-	 */
-	public boolean setFocus() {
-		return _wrapped.setFocus();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#getNumberOfControls()
-	 */
-	public int getNumberOfControls() {
-		return _wrapped.getNumberOfControls() + 1;
-	}
-
-	public void setDatabindingEnabled(boolean enabled) {
-		this._databindingEnabled = enabled;
-		updateDatabindingControl();
-	}
-
-	public boolean isDatabindingEnabled() {
-		return _databindingEnabled;
-	}
-
-	/*
-	 * (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);
-	}
-
-	protected 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();
-	}
-
-	public IDOMNode getAncester() {
-		return _ancester;
-	}
-
-	public IDOMElement getElement() {
-		return _element;
-	}
-
-	public DialogField getWrappedDialogField() {
-		return _wrapped;
-	}
-
-	public boolean isRequired() {
-		return _wrapped.isRequired();
-	}
-
-	public void setToolTip(String toolTip) {
-		_wrapped.setToolTip(toolTip);
-	}
-}
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 52c1b0e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ExtendedResourceButtonDialogField.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.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 {
-	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 c8b9d8e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/StyleButtonDialogField.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.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;
-
-	public StyleButtonDialogField() {
-		this(null);
-	}
-
-	public StyleButtonDialogField(IDOMElement element) {
-		this(null, element);
-		setStringButtonAdapter(new IStringButtonAdapter() {
-			public void changeControlPressed(DialogField field) {
-				browseButtonPressed();
-			}
-		});
-		setButtonLabel(DialogsMessages.getString("StyleButtonDialogField.Edit"));//$NON-NLS-1$ 
-	}
-
-	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);
-			}
-		}
-	}
-
-	public void setElement(IDOMElement element) {
-		_element = element;
-	}
-}
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 20aaec7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BackgroudPreferenceNode.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.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;
-
-	public BackgroudPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new BackgroundPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        //TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Background";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("BackgroundPreferenceNode.LabelText");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BackgroundPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BackgroundPreferencePage.java
deleted file mode 100644
index a15b9bb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BackgroundPreferencePage.java
+++ /dev/null
@@ -1,316 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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;
-
-	public BackgroundPreferencePage(IDOMElement element,
-			CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("BackgroundPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(3, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		_backgroundColorField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_backgroundColorField.setLabelText(DialogsMessages
-				.getString("BackgroundBoxPreferencePage.BackgroundColor"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_backgroundColorField.getLabelControl(null, top).setLayoutData(data);
-
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_backgroundColorField.getComboControl(null, top).setLayoutData(data);
-
-		data = new GridData();
-		_backgroundColorField.getChangeControl(null, top).setLayoutData(data);
-		_backgroundColorField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _backgroundColorField.getText();
-
-						_style.setBackgroundColor(color);
-					}
-				});
-
-		Label backgroundImageLabel = new Label(top, SWT.NONE);
-		backgroundImageLabel.setText(DialogsMessages
-				.getString("BackgroundBoxPreferencePage.BackgroundImage")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		backgroundImageLabel.setLayoutData(data);
-
-		_backgroundImageCombo = new StyleCombo(top, SWT.NONE);
-		_backgroundImageCombo.setItems(IStyleConstants.NONE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_backgroundImageCombo.setLayoutData(data);
-		_backgroundImageCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String image = _backgroundImageCombo.getText();
-
-				_style.setBackgroundImage(image);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label backgroundRepeatLabel = new Label(top, SWT.NONE);
-		backgroundRepeatLabel
-				.setText(DialogsMessages
-						.getString("BackgroundBoxPreferencePage.BackgroundRepeatLabel")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		backgroundRepeatLabel.setLayoutData(data);
-
-		_backgroundRepeatCombo = new StyleCombo(top, SWT.NONE);
-		_backgroundRepeatCombo.setItems(IStyleConstants.REPEAT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_backgroundRepeatCombo.setLayoutData(data);
-		_backgroundRepeatCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String repeat = _backgroundRepeatCombo.getText();
-
-				_style.setBackgroundRepeat(repeat);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label backgroundAttachmentLabel = new Label(top, SWT.NONE);
-		backgroundAttachmentLabel
-				.setText(DialogsMessages
-						.getString("BackgroundBoxPreferencePage.BackgroundAttachmentLabel")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		backgroundAttachmentLabel.setLayoutData(data);
-
-		_backgroundAttachmentCombo = new StyleCombo(top, SWT.NONE);
-		_backgroundAttachmentCombo.setItems(IStyleConstants.ATTACHMENT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_backgroundAttachmentCombo.setLayoutData(data);
-		_backgroundAttachmentCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String attachment = _backgroundAttachmentCombo.getText();
-
-				_style.setBackgroundAttachment(attachment);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label backgroundHorizontalLabel = new Label(top, SWT.NONE);
-		backgroundHorizontalLabel.setText(DialogsMessages
-				.getString("BackgroundBoxPreferencePage.HorizontalLabel")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		backgroundHorizontalLabel.setLayoutData(data);
-
-		_horizontalNumberCombo = new StyleCombo(top, SWT.NONE);
-		_horizontalNumberCombo.setItems(IStyleConstants.POSITION);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_horizontalNumberCombo.setLayoutData(data);
-		_horizontalNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_horizontalUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_horizontalNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_horizontalUnitCombo.setEnabled(false);
-				}
-
-				String position = _horizontalNumberCombo.getText();
-				if (_horizontalUnitCombo.isEnabled()) {
-					position += _horizontalUnitCombo.getText();
-				}
-
-				_style.setBackgroundPositionX(position);
-			}
-		});
-
-		_horizontalUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_horizontalUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL);
-		_horizontalUnitCombo.setLayoutData(data);
-		_horizontalUnitCombo.select(0);
-		_horizontalUnitCombo.setEnabled(false);
-		_horizontalUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String position = _horizontalNumberCombo.getText();
-				if (_horizontalUnitCombo.isEnabled()) {
-					position += _horizontalUnitCombo.getText();
-				}
-
-				_style.setBackgroundPositionX(position);
-
-			}
-		});
-
-		Label backgroundVerticalLabel = new Label(top, SWT.NONE);
-		backgroundVerticalLabel.setText(DialogsMessages
-				.getString("BackgroundBoxPreferencePage.VerticalLabel")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		backgroundVerticalLabel.setLayoutData(data);
-
-		_verticalNumberCombo = new StyleCombo(top, SWT.NONE);
-		_verticalNumberCombo.setItems(IStyleConstants.POSITION);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_verticalNumberCombo.setLayoutData(data);
-		_verticalNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_verticalUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_verticalNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_verticalUnitCombo.setEnabled(false);
-				}
-
-				String position = _verticalNumberCombo.getText();
-				if (_verticalUnitCombo.isEnabled()) {
-					position += _verticalUnitCombo.getText();
-				}
-
-				_style.setBackgroundPositionY(position);
-			}
-		});
-
-		_verticalUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_verticalUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL);
-		_verticalUnitCombo.setLayoutData(data);
-		_verticalUnitCombo.select(0);
-		_verticalUnitCombo.setEnabled(false);
-		_verticalUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String position = _verticalNumberCombo.getText();
-				if (_verticalUnitCombo.isEnabled()) {
-					position += _verticalUnitCombo.getText();
-				}
-
-				_style.setBackgroundPositionY(position);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// background-color
-		String color = _style.getBackgroundColor();
-		if (!isEmptyString(color)) {
-			_backgroundColorField.setTextWithoutUpdate(color);
-		}
-
-		// background-image
-		String image = _style.getBackgroundImage();
-		if (!isEmptyString(image)) {
-			int index = _backgroundImageCombo.indexOf(image);
-			if (index != -1) {
-				_backgroundImageCombo.select(index);
-			} else {
-				_backgroundImageCombo.setText(image);
-			}
-		}
-
-		// background-repeat
-		String repeat = _style.getBackgroundRepeat();
-		if (!isEmptyString(repeat)) {
-			int index = _backgroundRepeatCombo.indexOf(repeat);
-			if (index != -1) {
-				_backgroundRepeatCombo.select(index);
-			} else {
-				_backgroundRepeatCombo.setText(repeat);
-			}
-		}
-
-		// background-attachment
-		String attachment = _style.getBackgroundAttachment();
-		if (!isEmptyString(attachment)) {
-			int index = _backgroundAttachmentCombo.indexOf(repeat);
-			if (index != -1) {
-				_backgroundAttachmentCombo.select(index);
-			} else {
-				_backgroundAttachmentCombo.setText(attachment);
-			}
-		}
-
-		// background-position
-		String position = _style.getBackgroundPositionX();
-		if (!isEmptyString(position)) {
-			int index = _horizontalNumberCombo.indexOf(position);
-			if (index != -1) {
-				_horizontalNumberCombo.select(index);
-			} else {
-				_horizontalNumberCombo.setText(position);
-			}
-		}
-		position = _style.getBackgroundPositionY();
-		if (!isEmptyString(position)) {
-			int index = _verticalNumberCombo.indexOf(position);
-			if (index != -1) {
-				_verticalNumberCombo.select(index);
-			} else {
-				_verticalNumberCombo.setText(position);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferenceNode.java
deleted file mode 100644
index 988295f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferenceNode.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.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;
-
-	public BlockPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new BlockPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Block";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("BlockPreferenceNode.LabelText");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferencePage.java
deleted file mode 100644
index 8d5215c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferencePage.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.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;
-
-	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 e3a4feb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BorderPreferenceNode.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.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;
-
-	public BorderPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new BorderPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Border";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("BorderPreferenceNode.LabelText");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BorderPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BorderPreferencePage.java
deleted file mode 100644
index adc769f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BorderPreferencePage.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.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;
-
-	public BorderPreferencePage(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("BorderPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(1, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Group styleGroup = new Group(top, SWT.NONE);
-		styleGroup.setText(DialogsMessages
-				.getString("BorderPreferencePage.Style"));
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		styleGroup.setLayoutData(data);
-		layout = new GridLayout(2, false);
-		styleGroup.setLayout(layout);
-
-		Label styleTopLabel = new Label(styleGroup, SWT.NONE);
-		styleTopLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Top"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		styleTopLabel.setLayoutData(data);
-
-		_styleTopCombo = new StyleCombo(styleGroup, SWT.NONE);
-		_styleTopCombo.setItems(IStyleConstants.BORDER_STYLE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_styleTopCombo.setLayoutData(data);
-		_styleTopCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String style = _styleTopCombo.getText();
-				_style.setBorderTopStyle(style);
-			}
-		});
-
-		Label styleRightLabel = new Label(styleGroup, SWT.NONE);
-		styleRightLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Right"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		styleRightLabel.setLayoutData(data);
-
-		_styleRightCombo = new StyleCombo(styleGroup, SWT.NONE);
-		_styleRightCombo.setItems(IStyleConstants.BORDER_STYLE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_styleRightCombo.setLayoutData(data);
-		_styleRightCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String style = _styleRightCombo.getText();
-				_style.setBorderRightStyle(style);
-			}
-		});
-
-		Label styleBottomLabel = new Label(styleGroup, SWT.NONE);
-		styleBottomLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Bottom"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		styleBottomLabel.setLayoutData(data);
-
-		_styleBottomCombo = new StyleCombo(styleGroup, SWT.NONE);
-		_styleBottomCombo.setItems(IStyleConstants.BORDER_STYLE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_styleBottomCombo.setLayoutData(data);
-		_styleBottomCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String style = _styleBottomCombo.getText();
-				_style.setBorderBottomStyle(style);
-			}
-		});
-
-		Label styleLeftLabel = new Label(styleGroup, SWT.NONE);
-		styleLeftLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Left"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		styleLeftLabel.setLayoutData(data);
-
-		_styleLeftCombo = new StyleCombo(styleGroup, SWT.NONE);
-		_styleLeftCombo.setItems(IStyleConstants.BORDER_STYLE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_styleLeftCombo.setLayoutData(data);
-		_styleLeftCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String style = _styleLeftCombo.getText();
-				_style.setBorderLeftStyle(style);
-			}
-		});
-
-		Group colorGroup = new Group(top, SWT.NONE);
-		colorGroup.setText(DialogsMessages
-				.getString("BorderPreferencePage.Color"));
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		colorGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		colorGroup.setLayout(layout);
-
-		_colorTopField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_colorTopField.setLabelText(DialogsMessages
-				.getString("BorderPreferencePage.Top"));
-
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_colorTopField.getLabelControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_colorTopField.getComboControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData();
-		_colorTopField.getChangeControl(null, colorGroup).setLayoutData(data);
-		_colorTopField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _colorTopField.getText();
-						_style.setBorderTopColor(color);
-					}
-				});
-
-		_colorRightField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_colorRightField.setLabelText(DialogsMessages
-				.getString("BorderPreferencePage.Right"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_colorRightField.getLabelControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_colorRightField.getComboControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData();
-		_colorRightField.getChangeControl(null, colorGroup).setLayoutData(data);
-		_colorRightField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _colorRightField.getText();
-						_style.setBorderRightColor(color);
-					}
-				});
-
-		_colorBottomField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_colorBottomField.setLabelText(DialogsMessages
-				.getString("BorderPreferencePage.Bottom"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_colorBottomField.getLabelControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_colorBottomField.getComboControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData();
-		_colorBottomField.getChangeControl(null, colorGroup)
-				.setLayoutData(data);
-		_colorBottomField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _colorBottomField.getText();
-						_style.setBorderBottomColor(color);
-					}
-				});
-
-		_colorLeftField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_colorLeftField.setLabelText(DialogsMessages
-				.getString("BorderPreferencePage.Left"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_colorLeftField.getLabelControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_colorLeftField.getComboControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData();
-		_colorLeftField.getChangeControl(null, colorGroup).setLayoutData(data);
-		_colorLeftField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _colorLeftField.getText();
-						_style.setBorderLeftColor(color);
-					}
-				});
-
-		Group widthGroup = new Group(top, SWT.NONE);
-		widthGroup.setText(DialogsMessages
-				.getString("BorderPreferencePage.Width"));
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		widthGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		widthGroup.setLayout(layout);
-
-		Label widthTopLabel = new Label(widthGroup, SWT.NONE);
-		widthTopLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Top"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthTopLabel.setLayoutData(data);
-
-		_widthTopNumberCombo = new StyleCombo(widthGroup, SWT.NONE);
-		_widthTopNumberCombo.setItems(IStyleConstants.BORDER_WIDTH);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthTopNumberCombo.setLayoutData(data);
-		_widthTopNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthTopUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthTopNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthTopUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthTopNumberCombo.getText();
-				if (_widthTopUnitCombo.isEnabled()) {
-					width += _widthTopUnitCombo.getText();
-				}
-
-				_style.setBorderTopWidth(width);
-			}
-		});
-
-		_widthTopUnitCombo = new StyleCombo(widthGroup, SWT.READ_ONLY);
-		_widthTopUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthTopUnitCombo.setLayoutData(data);
-		_widthTopUnitCombo.select(0);
-		_widthTopUnitCombo.setEnabled(false);
-		_widthTopUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthTopNumberCombo.getText();
-				if (_widthTopUnitCombo.isEnabled()) {
-					width += _widthTopUnitCombo.getText();
-				}
-
-				_style.setBorderTopWidth(width);
-			}
-		});
-
-		Label widthRightLabel = new Label(widthGroup, SWT.NONE);
-		widthRightLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Right"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthRightLabel.setLayoutData(data);
-
-		_widthRightNumberCombo = new StyleCombo(widthGroup, SWT.NONE);
-		_widthRightNumberCombo.setItems(IStyleConstants.BORDER_WIDTH);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthRightNumberCombo.setLayoutData(data);
-		_widthRightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthRightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthRightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthRightUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthRightNumberCombo.getText();
-				if (_widthRightUnitCombo.isEnabled()) {
-					width += _widthRightUnitCombo.getText();
-				}
-
-				_style.setBorderRightWidth(width);
-			}
-		});
-
-		_widthRightUnitCombo = new StyleCombo(widthGroup, SWT.READ_ONLY);
-		_widthRightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthRightUnitCombo.setLayoutData(data);
-		_widthRightUnitCombo.select(0);
-		_widthRightUnitCombo.setEnabled(false);
-		_widthRightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthRightNumberCombo.getText();
-				if (_widthRightUnitCombo.isEnabled()) {
-					width += _widthRightUnitCombo.getText();
-				}
-
-				_style.setBorderRightWidth(width);
-			}
-		});
-
-		Label widthBottomLabel = new Label(widthGroup, SWT.NONE);
-		widthBottomLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Bottom"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthBottomLabel.setLayoutData(data);
-
-		_widthBottomNumberCombo = new StyleCombo(widthGroup, SWT.NONE);
-		_widthBottomNumberCombo.setItems(IStyleConstants.BORDER_WIDTH);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthBottomNumberCombo.setLayoutData(data);
-		_widthBottomNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthBottomUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthBottomNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthBottomUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthBottomNumberCombo.getText();
-				if (_widthBottomUnitCombo.isEnabled()) {
-					width += _widthBottomUnitCombo.getText();
-				}
-
-				_style.setBorderBottomWidth(width);
-			}
-		});
-
-		_widthBottomUnitCombo = new StyleCombo(widthGroup, SWT.READ_ONLY);
-		_widthBottomUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthBottomUnitCombo.setLayoutData(data);
-		_widthBottomUnitCombo.select(0);
-		_widthBottomUnitCombo.setEnabled(false);
-		_widthBottomUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthBottomNumberCombo.getText();
-				if (_widthBottomUnitCombo.isEnabled()) {
-					width += _widthBottomUnitCombo.getText();
-				}
-
-				_style.setBorderBottomWidth(width);
-			}
-		});
-
-		Label widthLeftLabel = new Label(widthGroup, SWT.NONE);
-		widthLeftLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Left"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthLeftLabel.setLayoutData(data);
-
-		_widthLeftNumberCombo = new StyleCombo(widthGroup, SWT.NONE);
-		_widthLeftNumberCombo.setItems(IStyleConstants.BORDER_WIDTH);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthLeftNumberCombo.setLayoutData(data);
-		_widthLeftNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthLeftUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthLeftNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthLeftUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthLeftNumberCombo.getText();
-				if (_widthLeftUnitCombo.isEnabled()) {
-					width += _widthLeftUnitCombo.getText();
-				}
-
-				_style.setBorderLeftWidth(width);
-			}
-		});
-
-		_widthLeftUnitCombo = new StyleCombo(widthGroup, SWT.READ_ONLY);
-		_widthLeftUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthLeftUnitCombo.setLayoutData(data);
-		_widthLeftUnitCombo.select(0);
-		_widthLeftUnitCombo.setEnabled(false);
-		_widthLeftUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthLeftNumberCombo.getText();
-				if (_widthLeftUnitCombo.isEnabled()) {
-					width += _widthLeftUnitCombo.getText();
-				}
-
-				_style.setBorderLeftWidth(width);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// border-style
-		String style = _style.getBorderTopStyle();
-		if (!isEmptyString(style)) {
-			int index = _styleTopCombo.indexOf(style);
-			if (index != -1) {
-				_styleTopCombo.select(index);
-			} else {
-				_styleTopCombo.setText(style);
-			}
-		}
-		style = _style.getBorderRightStyle();
-		if (!isEmptyString(style)) {
-			int index = _styleRightCombo.indexOf(style);
-			if (index != -1) {
-				_styleRightCombo.select(index);
-			} else {
-				_styleRightCombo.setText(style);
-			}
-		}
-		style = _style.getBorderBottomStyle();
-		if (!isEmptyString(style)) {
-			int index = _styleBottomCombo.indexOf(style);
-			if (index != -1) {
-				_styleBottomCombo.select(index);
-			} else {
-				_styleBottomCombo.setText(style);
-			}
-		}
-		style = _style.getBorderLeftStyle();
-		if (!isEmptyString(style)) {
-			int index = _styleLeftCombo.indexOf(style);
-			if (index != -1) {
-				_styleLeftCombo.select(index);
-			} else {
-				_styleLeftCombo.setText(style);
-			}
-		}
-
-		// border-color
-		String color = _style.getBorderTopColor();
-		if (!isEmptyString(color)) {
-			_colorTopField.setTextWithoutUpdate(color);
-		}
-		color = _style.getBorderRightColor();
-		if (!isEmptyString(color)) {
-			_colorRightField.setTextWithoutUpdate(color);
-		}
-		color = _style.getBorderBottomColor();
-		if (!isEmptyString(color)) {
-			_colorBottomField.setTextWithoutUpdate(color);
-		}
-		color = _style.getBorderLeftColor();
-		if (!isEmptyString(color)) {
-			_colorLeftField.setTextWithoutUpdate(color);
-		}
-
-		// border-width
-		String width = _style.getBorderTopWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthTopNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthTopNumberCombo.select(index);
-			} else {
-				_widthTopNumberCombo.setText(width);
-			}
-		}
-		width = _style.getBorderRightWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthRightNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthRightNumberCombo.select(index);
-			} else {
-				_widthRightNumberCombo.setText(width);
-			}
-		}
-		width = _style.getBorderBottomWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthBottomNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthBottomNumberCombo.select(index);
-			} else {
-				_widthBottomNumberCombo.setText(width);
-			}
-		}
-		width = _style.getBorderLeftWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthLeftNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthLeftNumberCombo.select(index);
-			} else {
-				_widthLeftNumberCombo.setText(width);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferenceNode.java
deleted file mode 100644
index 106bf83..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferenceNode.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.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;
-
-	public BoxPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_styles = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO: this pattern is being repeated; perhaps need common super for preference nodes?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new BoxPreferencePage(_element, _styles);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Box";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("BoxPreferenceNode.LabelText");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferencePage.java
deleted file mode 100644
index 450355c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferencePage.java
+++ /dev/null
@@ -1,669 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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;
-
-	public BoxPreferencePage(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("BoxPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(6, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Label widthLabel = new Label(top, SWT.NONE);
-		widthLabel
-				.setText(DialogsMessages.getString("BoxPreferencePage.Width")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthLabel.setLayoutData(data);
-
-		_widthNumberCombo = new StyleCombo(top, SWT.NONE);
-		_widthNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthNumberCombo.setLayoutData(data);
-		_widthNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthNumberCombo.getText();
-				if (_widthUnitCombo.isEnabled()) {
-					width += _widthUnitCombo.getText();
-				}
-
-				_style.setWidth(width);
-			}
-		});
-
-		_widthUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_widthUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthUnitCombo.setLayoutData(data);
-		_widthUnitCombo.select(0);
-		_widthUnitCombo.setEnabled(false);
-		_widthUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthNumberCombo.getText();
-				if (_widthUnitCombo.isEnabled()) {
-					width += _widthUnitCombo.getText();
-				}
-
-				_style.setWidth(width);
-			}
-		});
-
-		Label clearLabel = new Label(top, SWT.NONE);
-		clearLabel
-				.setText(DialogsMessages.getString("BoxPreferencePage.Clear")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		clearLabel.setLayoutData(data);
-
-		_clearCombo = new StyleCombo(top, SWT.NONE);
-		_clearCombo.setItems(IStyleConstants.CLEAR);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clearCombo.setLayoutData(data);
-		_clearCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String clear = _clearCombo.getText();
-				_style.setClear(clear);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label heightLabel = new Label(top, SWT.NONE);
-		heightLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Height")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		heightLabel.setLayoutData(data);
-
-		_heightNumberCombo = new StyleCombo(top, SWT.NONE);
-		_heightNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_heightNumberCombo.setLayoutData(data);
-		_heightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_heightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_heightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_heightUnitCombo.setEnabled(false);
-				}
-
-				String height = _heightNumberCombo.getText();
-				if (_heightUnitCombo.isEnabled()) {
-					height += _heightUnitCombo.getText();
-				}
-
-				_style.setHeight(height);
-			}
-		});
-
-		_heightUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_heightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_heightUnitCombo.setLayoutData(data);
-		_heightUnitCombo.select(0);
-		_heightUnitCombo.setEnabled(false);
-		_heightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String height = _heightNumberCombo.getText();
-				if (_heightUnitCombo.isEnabled()) {
-					height += _heightNumberCombo.getText();
-				}
-
-				_style.setHeight(height);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-		new Label(top, SWT.NONE);
-		new Label(top, SWT.NONE);
-
-		Group paddingGroup = new Group(top, SWT.NONE);
-		paddingGroup.setText(DialogsMessages
-				.getString("BoxPreferencePage.Padding"));
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 3;
-		data.verticalSpan = 4;
-		paddingGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		paddingGroup.setLayout(layout);
-
-		Label paddingTopLabel = new Label(paddingGroup, SWT.NONE);
-		paddingTopLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Top")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		paddingTopLabel.setLayoutData(data);
-
-		_paddingTopNumberText = new Text(paddingGroup, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingTopNumberText.setLayoutData(data);
-		_paddingTopNumberText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_paddingTopUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_paddingTopNumberText.getText());
-				} catch (NumberFormatException ex) {
-					_paddingTopUnitCombo.setEnabled(false);
-				}
-
-				String padding = _paddingTopNumberText.getText();
-				if (_paddingTopUnitCombo.isEnabled()) {
-					padding += _paddingTopUnitCombo.getText();
-				}
-
-				_style.setPaddingTop(padding);
-			}
-		});
-
-		_paddingTopUnitCombo = new StyleCombo(paddingGroup, SWT.READ_ONLY);
-		_paddingTopUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingTopUnitCombo.setLayoutData(data);
-		_paddingTopUnitCombo.select(0);
-		_paddingTopUnitCombo.setEnabled(false);
-		_paddingTopUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String padding = _paddingTopNumberText.getText();
-				if (_paddingTopUnitCombo.isEnabled()) {
-					padding += _paddingTopUnitCombo.getText();
-				}
-
-				_style.setPaddingTop(padding);
-			}
-		});
-
-		Label paddingRightLabel = new Label(paddingGroup, SWT.NONE);
-		paddingRightLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Right")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		paddingRightLabel.setLayoutData(data);
-
-		_paddingRightNumberText = new Text(paddingGroup, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingRightNumberText.setLayoutData(data);
-		_paddingRightNumberText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_paddingRightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_paddingRightNumberText.getText());
-				} catch (NumberFormatException ex) {
-					_paddingRightUnitCombo.setEnabled(false);
-				}
-
-				String padding = _paddingRightNumberText.getText();
-				if (_paddingRightUnitCombo.isEnabled()) {
-					padding += _paddingRightUnitCombo.getText();
-				}
-
-				_style.setPaddingRight(padding);
-			}
-		});
-
-		_paddingRightUnitCombo = new StyleCombo(paddingGroup, SWT.READ_ONLY);
-		_paddingRightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingRightUnitCombo.setLayoutData(data);
-		_paddingRightUnitCombo.select(0);
-		_paddingRightUnitCombo.setEnabled(false);
-		_paddingRightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String padding = _paddingRightNumberText.getText();
-				if (_paddingRightUnitCombo.isEnabled()) {
-					padding += _paddingRightUnitCombo.getText();
-				}
-
-				_style.setPaddingRight(padding);
-			}
-		});
-
-		Label paddingBottomLabel = new Label(paddingGroup, SWT.NONE);
-		paddingBottomLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Bottom")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		paddingBottomLabel.setLayoutData(data);
-
-		_paddingBottomNumberText = new Text(paddingGroup, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingBottomNumberText.setLayoutData(data);
-		_paddingBottomNumberText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_paddingBottomUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_paddingBottomNumberText.getText());
-				} catch (NumberFormatException ex) {
-					_paddingBottomUnitCombo.setEnabled(false);
-				}
-
-				String padding = _paddingBottomNumberText.getText();
-				if (_paddingBottomUnitCombo.isEnabled()) {
-					padding += _paddingBottomUnitCombo.getText();
-				}
-
-				_style.setPaddingBottom(padding);
-			}
-		});
-
-		_paddingBottomUnitCombo = new StyleCombo(paddingGroup, SWT.READ_ONLY);
-		_paddingBottomUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingBottomUnitCombo.setLayoutData(data);
-		_paddingBottomUnitCombo.select(0);
-		_paddingBottomUnitCombo.setEnabled(false);
-		_paddingBottomUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String padding = _paddingBottomNumberText.getText();
-				if (_paddingBottomUnitCombo.isEnabled()) {
-					padding += _paddingBottomUnitCombo.getText();
-				}
-
-				_style.setPaddingBottom(padding);
-			}
-		});
-
-		Label paddingLeftLabel = new Label(paddingGroup, SWT.NONE);
-		paddingLeftLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Left")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		paddingLeftLabel.setLayoutData(data);
-
-		_paddingLeftNumberText = new Text(paddingGroup, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingLeftNumberText.setLayoutData(data);
-		_paddingLeftNumberText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_paddingLeftUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_paddingLeftNumberText.getText());
-				} catch (NumberFormatException ex) {
-					_paddingLeftUnitCombo.setEnabled(false);
-				}
-
-				String top1 = _paddingLeftNumberText.getText();
-				if (_paddingLeftUnitCombo.isEnabled()) {
-					top1 += _paddingLeftUnitCombo.getText();
-				}
-
-				_style.setPaddingLeft(top1);
-			}
-		});
-
-		_paddingLeftUnitCombo = new StyleCombo(paddingGroup, SWT.READ_ONLY);
-		_paddingLeftUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingLeftUnitCombo.setLayoutData(data);
-		_paddingLeftUnitCombo.select(0);
-		_paddingLeftUnitCombo.setEnabled(false);
-		_paddingLeftUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String top1 = _paddingLeftNumberText.getText();
-				if (_paddingLeftUnitCombo.isEnabled()) {
-					top1 += _paddingLeftUnitCombo.getText();
-				}
-
-				_style.setPaddingLeft(top1);
-			}
-		});
-
-		Group marginGroup = new Group(top, SWT.NONE);
-		marginGroup.setText(DialogsMessages
-				.getString("BoxPreferencePage.Margin"));
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 3;
-		data.verticalSpan = 4;
-		marginGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		marginGroup.setLayout(layout);
-
-		Label marginTopLabel = new Label(marginGroup, SWT.NONE);
-		marginTopLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Top")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		marginTopLabel.setLayoutData(data);
-
-		_marginTopNumberCombo = new StyleCombo(marginGroup, SWT.NONE);
-		_marginTopNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginTopNumberCombo.setLayoutData(data);
-		_marginTopNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_marginTopUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_marginTopNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_marginTopUnitCombo.setEnabled(false);
-				}
-
-				String margin = _marginTopNumberCombo.getText();
-				if (_marginTopUnitCombo.isEnabled()) {
-					margin += _marginTopUnitCombo.getText();
-				}
-
-				_style.setMarginTop(margin);
-			}
-		});
-
-		_marginTopUnitCombo = new StyleCombo(marginGroup, SWT.READ_ONLY);
-		_marginTopUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginTopUnitCombo.setLayoutData(data);
-		_marginTopUnitCombo.select(0);
-		_marginTopUnitCombo.setEnabled(false);
-		_marginTopUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String margin = _marginTopNumberCombo.getText();
-				if (_marginTopUnitCombo.isEnabled()) {
-					margin += _marginTopUnitCombo.getText();
-				}
-
-				_style.setMarginTop(margin);
-			}
-		});
-
-		Label marginRightLabel = new Label(marginGroup, SWT.NONE);
-		marginRightLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Right")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		marginRightLabel.setLayoutData(data);
-
-		_marginRightNumberCombo = new StyleCombo(marginGroup, SWT.NONE);
-		_marginRightNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginRightNumberCombo.setLayoutData(data);
-		_marginRightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_marginRightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_marginRightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_marginRightUnitCombo.setEnabled(false);
-				}
-
-				String margin = _marginRightNumberCombo.getText();
-				if (_marginRightUnitCombo.isEnabled()) {
-					margin += _marginRightUnitCombo.getText();
-				}
-
-				_style.setMarginRight(margin);
-			}
-		});
-
-		_marginRightUnitCombo = new StyleCombo(marginGroup, SWT.READ_ONLY);
-		_marginRightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginRightUnitCombo.setLayoutData(data);
-		_marginRightUnitCombo.select(0);
-		_marginRightUnitCombo.setEnabled(false);
-		_marginRightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String margin = _marginRightNumberCombo.getText();
-				if (_marginRightUnitCombo.isEnabled()) {
-					margin += _marginRightUnitCombo.getText();
-				}
-
-				_style.setMarginRight(margin);
-			}
-		});
-
-		Label marginBottomLabel = new Label(marginGroup, SWT.NONE);
-		marginBottomLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Bottom")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		marginBottomLabel.setLayoutData(data);
-
-		_marginBottomNumberCombo = new StyleCombo(marginGroup, SWT.NONE);
-		_marginBottomNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginBottomNumberCombo.setLayoutData(data);
-		_marginBottomNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_marginBottomUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_marginBottomNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_marginBottomUnitCombo.setEnabled(false);
-				}
-
-				String margin = _marginBottomNumberCombo.getText();
-				if (_marginBottomUnitCombo.isEnabled()) {
-					margin += _marginBottomUnitCombo.getText();
-				}
-
-				_style.setMarginBottom(margin);
-			}
-		});
-
-		_marginBottomUnitCombo = new StyleCombo(marginGroup, SWT.READ_ONLY);
-		_marginBottomUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginBottomUnitCombo.setLayoutData(data);
-		_marginBottomUnitCombo.select(0);
-		_marginBottomUnitCombo.setEnabled(false);
-		_marginBottomUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String margin = _marginBottomNumberCombo.getText();
-				if (_marginBottomUnitCombo.isEnabled()) {
-					margin += _marginBottomUnitCombo.getText();
-				}
-
-				_style.setMarginBottom(margin);
-			}
-		});
-
-		Label marginLeftLabel = new Label(marginGroup, SWT.NONE);
-		marginLeftLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Left")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		marginLeftLabel.setLayoutData(data);
-
-		_marginLeftNumberCombo = new StyleCombo(marginGroup, SWT.NONE);
-		_marginLeftNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginLeftNumberCombo.setLayoutData(data);
-		_marginLeftNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_marginLeftUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_marginLeftNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_marginLeftUnitCombo.setEnabled(false);
-				}
-
-				String top1 = _marginLeftNumberCombo.getText();
-				if (_marginLeftUnitCombo.isEnabled()) {
-					top1 += _marginLeftUnitCombo.getText();
-				}
-
-				_style.setMarginLeft(top1);
-			}
-		});
-
-		_marginLeftUnitCombo = new StyleCombo(marginGroup, SWT.READ_ONLY);
-		_marginLeftUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginLeftUnitCombo.setLayoutData(data);
-		_marginLeftUnitCombo.select(0);
-		_marginLeftUnitCombo.setEnabled(false);
-		_marginLeftUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String top1 = _marginLeftNumberCombo.getText();
-				if (_marginLeftUnitCombo.isEnabled()) {
-					top1 += _marginLeftUnitCombo.getText();
-				}
-
-				_style.setMarginLeft(top1);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// width
-		String width = _style.getWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthNumberCombo.select(index);
-			} else {
-				_widthNumberCombo.setText(width);
-			}
-		}
-
-		// height
-		String height = _style.getHeight();
-		if (!isEmptyString(height)) {
-			int index = _heightNumberCombo.indexOf(height);
-			if (index != -1) {
-				_heightNumberCombo.select(index);
-			} else {
-				_heightNumberCombo.setText(height);
-			}
-		}
-
-		// clear
-		String clear = _style.getClear();
-		if (!isEmptyString(clear)) {
-			int index = _clearCombo.indexOf(clear);
-			if (index != -1) {
-				_clearCombo.select(index);
-			} else {
-				_clearCombo.setText(clear);
-			}
-		}
-
-		// padding
-		String padding = _style.getPaddingTop();
-		if (!isEmptyString(padding)) {
-			_paddingTopNumberText.setText(padding);
-		}
-		padding = _style.getPaddingRight();
-		if (!isEmptyString(padding)) {
-			_paddingRightNumberText.setText(padding);
-		}
-		padding = _style.getPaddingBottom();
-		if (!isEmptyString(padding)) {
-			_paddingBottomNumberText.setText(padding);
-		}
-		padding = _style.getPaddingLeft();
-		if (!isEmptyString(padding)) {
-			_paddingLeftNumberText.setText(padding);
-		}
-
-		// margin
-		String margin = _style.getMarginTop();
-		if (!isEmptyString(margin)) {
-			int index = _marginTopNumberCombo.indexOf(margin);
-			if (index != -1) {
-				_marginTopNumberCombo.select(index);
-			} else {
-				_marginTopNumberCombo.setText(margin);
-			}
-		}
-		margin = _style.getMarginRight();
-		if (!isEmptyString(margin)) {
-			int index = _marginRightNumberCombo.indexOf(margin);
-			if (index != -1) {
-				_marginRightNumberCombo.select(index);
-			} else {
-				_marginRightNumberCombo.setText(margin);
-			}
-		}
-		margin = _style.getMarginBottom();
-		if (!isEmptyString(margin)) {
-			int index = _marginBottomNumberCombo.indexOf(margin);
-			if (index != -1) {
-				_marginBottomNumberCombo.select(index);
-			} else {
-				_marginBottomNumberCombo.setText(margin);
-			}
-		}
-		margin = _style.getMarginLeft();
-		if (!isEmptyString(margin)) {
-			int index = _marginLeftNumberCombo.indexOf(margin);
-			if (index != -1) {
-				_marginLeftNumberCombo.select(index);
-			} else {
-				_marginLeftNumberCombo.setText(margin);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ColorUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ColorUtil.java
deleted file mode 100644
index 39349a9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ColorUtil.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ColorPalette;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ColorUtil extends ColorPalette {
-	private static final Map EXTENDED_COLORS = new HashMap(20);
-
-	private static final Map BASIC_COLORS = new HashMap(143);
-
-	static {
-		BASIC_COLORS.put("Aqua", new Color(null, 0x00, 0xFF, 0xFF));
-		BASIC_COLORS.put("Black", new Color(null, 0x00, 0x00, 0x00));
-		BASIC_COLORS.put("Blue", new Color(null, 0x00, 0x00, 0xFF));
-		BASIC_COLORS.put("Fuchsia", new Color(null, 0xFF, 0x00, 0xFF));
-		BASIC_COLORS.put("Gray", new Color(null, 0x80, 0x80, 0x80));
-		BASIC_COLORS.put("Green", new Color(null, 0x00, 0x80, 0x00));
-		BASIC_COLORS.put("Lime", new Color(null, 0x00, 0xFF, 0x00));
-		BASIC_COLORS.put("Maroon", new Color(null, 0x80, 0x00, 0x00));
-		BASIC_COLORS.put("Navy", new Color(null, 0x00, 0x00, 0x80));
-		BASIC_COLORS.put("Olive", new Color(null, 0x80, 0x80, 0x00));
-		BASIC_COLORS.put("Purple", new Color(null, 0x80, 0x00, 0x80));
-		BASIC_COLORS.put("Red", new Color(null, 0xFF, 0x00, 0x00));
-		BASIC_COLORS.put("Silver", new Color(null, 0xC0, 0xC0, 0xC0));
-		BASIC_COLORS.put("Teal", new Color(null, 0x00, 0x80, 0x80));
-		BASIC_COLORS.put("White", new Color(null, 0xFF, 0xFF, 0xFF));
-		BASIC_COLORS.put("Yellow", new Color(null, 0xFF, 0xFF, 0x00));
-	}
-
-	static {
-		EXTENDED_COLORS.put("AliceBlue", new Color(null, 0xF0, 0xF8, 0xFF));
-		EXTENDED_COLORS.put("AntiqueWhite", new Color(null, 0xFA, 0xEB, 0xD7));
-		EXTENDED_COLORS.put("Aqua", new Color(null, 0x00, 0xFF, 0xFF));
-		EXTENDED_COLORS.put("Aquamarine", new Color(null, 0x7F, 0xFF, 0xD4));
-		EXTENDED_COLORS.put("Azure", new Color(null, 0xF0, 0xFF, 0xFF));
-		EXTENDED_COLORS.put("Beige", new Color(null, 0xF5, 0xF5, 0xDC));
-		EXTENDED_COLORS.put("Bisque", new Color(null, 0xFF, 0xE4, 0xC4));
-		EXTENDED_COLORS.put("Black", new Color(null, 0x00, 0x00, 0x00));
-		EXTENDED_COLORS
-				.put("BlanchedAlmond", new Color(null, 0xFF, 0xEB, 0xCD));
-		EXTENDED_COLORS.put("Blue", new Color(null, 0x00, 0x00, 0xFF));
-		EXTENDED_COLORS.put("BlueViolet", new Color(null, 0x8A, 0x2B, 0xE2));
-		EXTENDED_COLORS.put("Brown", new Color(null, 0xA5, 0x2A, 0x2A));
-		EXTENDED_COLORS.put("BurlyWood", new Color(null, 0xDE, 0xB8, 0x87));
-		EXTENDED_COLORS.put("CadetBlue", new Color(null, 0x5F, 0x9E, 0xA0));
-		EXTENDED_COLORS.put("Chartreuse", new Color(null, 0x7F, 0xFF, 0x00));
-		EXTENDED_COLORS.put("Chocolate", new Color(null, 0xD2, 0x69, 0x1E));
-		EXTENDED_COLORS.put("Coral", new Color(null, 0xFF, 0x7F, 0x50));
-		EXTENDED_COLORS
-				.put("CornflowerBlue", new Color(null, 0x64, 0x95, 0xED));
-		EXTENDED_COLORS.put("Cornsilk", new Color(null, 0xFF, 0xF8, 0xDC));
-		EXTENDED_COLORS.put("Crimson", new Color(null, 0xDC, 0x14, 0x3C));
-		EXTENDED_COLORS.put("Cyan", new Color(null, 0x00, 0xFF, 0xFF));
-		EXTENDED_COLORS.put("DarkBlue", new Color(null, 0x00, 0x00, 0x8B));
-		EXTENDED_COLORS.put("DarkCyan", new Color(null, 0x00, 0x8B, 0x8B));
-		EXTENDED_COLORS.put("DarkGoldenRod", new Color(null, 0xB8, 0x86, 0x0B));
-		EXTENDED_COLORS.put("DarkGray", new Color(null, 0xA9, 0xA9, 0xA9));
-		EXTENDED_COLORS.put("DarkGreen", new Color(null, 0x00, 0x64, 0x00));
-		EXTENDED_COLORS.put("DarkKhaki", new Color(null, 0xBD, 0xB7, 0x6B));
-		EXTENDED_COLORS.put("DarkMagenta", new Color(null, 0x8B, 0x00, 0x8B));
-		EXTENDED_COLORS
-				.put("DarkOliveGreen", new Color(null, 0x55, 0x6B, 0x2F));
-		EXTENDED_COLORS.put("Darkorange", new Color(null, 0xFF, 0x8C, 0x00));
-		EXTENDED_COLORS.put("DarkOrchid", new Color(null, 0x99, 0x32, 0xCC));
-		EXTENDED_COLORS.put("DarkRed", new Color(null, 0x8B, 0x00, 0x00));
-		EXTENDED_COLORS.put("DarkSalmon", new Color(null, 0xE9, 0x96, 0x7A));
-		EXTENDED_COLORS.put("DarkSeaGreen", new Color(null, 0x8F, 0xBC, 0x8F));
-		EXTENDED_COLORS.put("DarkSlateBlue", new Color(null, 0x48, 0x3D, 0x8B));
-		EXTENDED_COLORS.put("DarkSlateGray", new Color(null, 0x2F, 0x4F, 0x4F));
-		EXTENDED_COLORS.put("DarkTurquoise", new Color(null, 0x00, 0xCE, 0xD1));
-		EXTENDED_COLORS.put("DarkViolet", new Color(null, 0x94, 0x00, 0xD3));
-		EXTENDED_COLORS.put("DeepPink", new Color(null, 0xFF, 0x14, 0x93));
-		EXTENDED_COLORS.put("DeepSkyBlue", new Color(null, 0x00, 0xBF, 0xFF));
-		EXTENDED_COLORS.put("DimGray", new Color(null, 0x69, 0x69, 0x69));
-		EXTENDED_COLORS.put("DodgerBlue", new Color(null, 0x1E, 0x90, 0xFF));
-		EXTENDED_COLORS.put("Feldspar", new Color(null, 0xD1, 0x92, 0x75));
-		EXTENDED_COLORS.put("FireBrick", new Color(null, 0xB2, 0x22, 0x22));
-		EXTENDED_COLORS.put("FloralWhite", new Color(null, 0xFF, 0xFA, 0xF0));
-		EXTENDED_COLORS.put("ForestGreen", new Color(null, 0x22, 0x8B, 0x22));
-		EXTENDED_COLORS.put("Fuchsia", new Color(null, 0xFF, 0x00, 0xFF));
-		EXTENDED_COLORS.put("Gainsboro", new Color(null, 0xDC, 0xDC, 0xDC));
-		EXTENDED_COLORS.put("GhostWhite", new Color(null, 0xF8, 0xF8, 0xFF));
-		EXTENDED_COLORS.put("Gold", new Color(null, 0xFF, 0xD7, 0x00));
-		EXTENDED_COLORS.put("GoldenRod", new Color(null, 0xDA, 0xA5, 0x20));
-		EXTENDED_COLORS.put("Gray", new Color(null, 0x80, 0x80, 0x80));
-		EXTENDED_COLORS.put("Green", new Color(null, 0x00, 0x80, 0x00));
-		EXTENDED_COLORS.put("GreenYellow", new Color(null, 0xAD, 0xFF, 0x2F));
-		EXTENDED_COLORS.put("HoneyDew", new Color(null, 0xF0, 0xFF, 0xF0));
-		EXTENDED_COLORS.put("HotPink", new Color(null, 0xFF, 0x69, 0xB4));
-		EXTENDED_COLORS.put("IndianRed", new Color(null, 0xCD, 0x5C, 0x5C));
-		EXTENDED_COLORS.put("Indigo", new Color(null, 0x4B, 0x00, 0x82));
-		EXTENDED_COLORS.put("Ivory", new Color(null, 0xFF, 0xFF, 0xF0));
-		EXTENDED_COLORS.put("Khaki", new Color(null, 0xF0, 0xE6, 0x8C));
-		EXTENDED_COLORS.put("Lavender", new Color(null, 0xE6, 0xE6, 0xFA));
-		EXTENDED_COLORS.put("LavenderBlush", new Color(null, 0xFF, 0xF0, 0xF5));
-		EXTENDED_COLORS.put("LawnGreen", new Color(null, 0x7C, 0xFC, 0x00));
-		EXTENDED_COLORS.put("LemonChiffon", new Color(null, 0xFF, 0xFA, 0xCD));
-		EXTENDED_COLORS.put("LightBlue", new Color(null, 0xAD, 0xD8, 0xE6));
-		EXTENDED_COLORS.put("LightCoral", new Color(null, 0xF0, 0x80, 0x80));
-		EXTENDED_COLORS.put("LightCyan", new Color(null, 0xE0, 0xFF, 0xFF));
-		EXTENDED_COLORS.put("LightGoldenRodYellow", new Color(null, 0xFA, 0xFA,
-				0xD2));
-		EXTENDED_COLORS.put("LightGrey", new Color(null, 0xD3, 0xD3, 0xD3));
-		EXTENDED_COLORS.put("LightGreen", new Color(null, 0x90, 0xEE, 0x90));
-		EXTENDED_COLORS.put("LightPink", new Color(null, 0xFF, 0xB6, 0xC1));
-		EXTENDED_COLORS.put("LightSalmon", new Color(null, 0xFF, 0xA0, 0x7A));
-		EXTENDED_COLORS.put("LightSeaGreen", new Color(null, 0x20, 0xB2, 0xAA));
-		EXTENDED_COLORS.put("LightSkyBlue", new Color(null, 0x87, 0xCE, 0xFA));
-		EXTENDED_COLORS
-				.put("LightSlateBlue", new Color(null, 0x84, 0x70, 0xFF));
-		EXTENDED_COLORS
-				.put("LightSlateGray", new Color(null, 0x77, 0x88, 0x99));
-		EXTENDED_COLORS
-				.put("LightSteelBlue", new Color(null, 0xB0, 0xC4, 0xDE));
-		EXTENDED_COLORS.put("LightYellow", new Color(null, 0xFF, 0xFF, 0xE0));
-		EXTENDED_COLORS.put("Lime", new Color(null, 0x00, 0xFF, 0x00));
-		EXTENDED_COLORS.put("LimeGreen", new Color(null, 0x32, 0xCD, 0x32));
-		EXTENDED_COLORS.put("Linen", new Color(null, 0xFA, 0xF0, 0xE6));
-		EXTENDED_COLORS.put("Magenta", new Color(null, 0xFF, 0x00, 0xFF));
-		EXTENDED_COLORS.put("Maroon", new Color(null, 0x80, 0x00, 0x00));
-		EXTENDED_COLORS.put("MediumAquaMarine", new Color(null, 0x66, 0xCD,
-				0xAA));
-		EXTENDED_COLORS.put("MediumBlue", new Color(null, 0x00, 0x00, 0xCD));
-		EXTENDED_COLORS.put("MediumOrchid", new Color(null, 0xBA, 0x55, 0xD3));
-		EXTENDED_COLORS.put("MediumPurple", new Color(null, 0x93, 0x70, 0xD8));
-		EXTENDED_COLORS
-				.put("MediumSeaGreen", new Color(null, 0x3C, 0xB3, 0x71));
-		EXTENDED_COLORS.put("MediumSlateBlue",
-				new Color(null, 0x7B, 0x68, 0xEE));
-		EXTENDED_COLORS.put("MediumSpringGreen", new Color(null, 0x00, 0xFA,
-				0x9A));
-		EXTENDED_COLORS.put("MediumTurquoise",
-				new Color(null, 0x48, 0xD1, 0xCC));
-		EXTENDED_COLORS.put("MediumVioletRed",
-				new Color(null, 0xC7, 0x15, 0x85));
-		EXTENDED_COLORS.put("MidnightBlue", new Color(null, 0x19, 0x19, 0x70));
-		EXTENDED_COLORS.put("MintCream", new Color(null, 0xF5, 0xFF, 0xFA));
-		EXTENDED_COLORS.put("MistyRose", new Color(null, 0xFF, 0xE4, 0xE1));
-		EXTENDED_COLORS.put("Moccasin", new Color(null, 0xFF, 0xE4, 0xB5));
-		EXTENDED_COLORS.put("NavajoWhite", new Color(null, 0xFF, 0xDE, 0xAD));
-		EXTENDED_COLORS.put("Navy", new Color(null, 0x00, 0x00, 0x80));
-		EXTENDED_COLORS.put("OldLace", new Color(null, 0xFD, 0xF5, 0xE6));
-		EXTENDED_COLORS.put("Olive", new Color(null, 0x80, 0x80, 0x00));
-		EXTENDED_COLORS.put("OliveDrab", new Color(null, 0x6B, 0x8E, 0x23));
-		EXTENDED_COLORS.put("Orange", new Color(null, 0xFF, 0xA5, 0x00));
-		EXTENDED_COLORS.put("OrangeRed", new Color(null, 0xFF, 0x45, 0x00));
-		EXTENDED_COLORS.put("Orchid", new Color(null, 0xDA, 0x70, 0xD6));
-		EXTENDED_COLORS.put("PaleGoldenRod", new Color(null, 0xEE, 0xE8, 0xAA));
-		EXTENDED_COLORS.put("PaleGreen", new Color(null, 0x98, 0xFB, 0x98));
-		EXTENDED_COLORS.put("PaleTurquoise", new Color(null, 0xAF, 0xEE, 0xEE));
-		EXTENDED_COLORS.put("PaleVioletRed", new Color(null, 0xD8, 0x70, 0x93));
-		EXTENDED_COLORS.put("PapayaWhip", new Color(null, 0xFF, 0xEF, 0xD5));
-		EXTENDED_COLORS.put("PeachPuff", new Color(null, 0xFF, 0xDA, 0xB9));
-		EXTENDED_COLORS.put("Peru", new Color(null, 0xCD, 0x85, 0x3F));
-		EXTENDED_COLORS.put("Pink", new Color(null, 0xFF, 0xC0, 0xCB));
-		EXTENDED_COLORS.put("Plum", new Color(null, 0xDD, 0xA0, 0xDD));
-		EXTENDED_COLORS.put("PowderBlue", new Color(null, 0xB0, 0xE0, 0xE6));
-		EXTENDED_COLORS.put("Purple", new Color(null, 0x80, 0x00, 0x80));
-		EXTENDED_COLORS.put("Red", new Color(null, 0xFF, 0x00, 0x00));
-		EXTENDED_COLORS.put("RosyBrown", new Color(null, 0xBC, 0x8F, 0x8F));
-		EXTENDED_COLORS.put("RoyalBlue", new Color(null, 0x41, 0x69, 0xE1));
-		EXTENDED_COLORS.put("SaddleBrown", new Color(null, 0x8B, 0x45, 0x13));
-		EXTENDED_COLORS.put("Salmon", new Color(null, 0xFA, 0x80, 0x72));
-		EXTENDED_COLORS.put("SandyBrown", new Color(null, 0xF4, 0xA4, 0x60));
-		EXTENDED_COLORS.put("SeaGreen", new Color(null, 0x2E, 0x8B, 0x57));
-		EXTENDED_COLORS.put("SeaShell", new Color(null, 0xFF, 0xF5, 0xEE));
-		EXTENDED_COLORS.put("Sienna", new Color(null, 0xA0, 0x52, 0x2D));
-		EXTENDED_COLORS.put("Silver", new Color(null, 0xC0, 0xC0, 0xC0));
-		EXTENDED_COLORS.put("SkyBlue", new Color(null, 0x87, 0xCE, 0xEB));
-		EXTENDED_COLORS.put("SlateBlue", new Color(null, 0x6A, 0x5A, 0xCD));
-		EXTENDED_COLORS.put("SlateGray", new Color(null, 0x70, 0x80, 0x90));
-		EXTENDED_COLORS.put("Snow", new Color(null, 0xFF, 0xFA, 0xFA));
-		EXTENDED_COLORS.put("SpringGreen", new Color(null, 0x00, 0xFF, 0x7F));
-		EXTENDED_COLORS.put("SteelBlue", new Color(null, 0x46, 0x82, 0xB4));
-		EXTENDED_COLORS.put("Tan", new Color(null, 0xD2, 0xB4, 0x8C));
-		EXTENDED_COLORS.put("Teal", new Color(null, 0x00, 0x80, 0x80));
-		EXTENDED_COLORS.put("Thistle", new Color(null, 0xD8, 0xBF, 0xD8));
-		EXTENDED_COLORS.put("Tomato", new Color(null, 0xFF, 0x63, 0x47));
-		EXTENDED_COLORS.put("Turquoise", new Color(null, 0x40, 0xE0, 0xD0));
-		EXTENDED_COLORS.put("Violet", new Color(null, 0xEE, 0x82, 0xEE));
-		EXTENDED_COLORS.put("VioletRed", new Color(null, 0xD0, 0x20, 0x90));
-		EXTENDED_COLORS.put("Wheat", new Color(null, 0xF5, 0xDE, 0xB3));
-		EXTENDED_COLORS.put("White", new Color(null, 0xFF, 0xFF, 0xFF));
-		EXTENDED_COLORS.put("WhiteSmoke", new Color(null, 0xF5, 0xF5, 0xF5));
-		EXTENDED_COLORS.put("Yellow", new Color(null, 0xFF, 0xFF, 0x00));
-		EXTENDED_COLORS.put("YellowGreen", new Color(null, 0x9A, 0xCD, 0x32));
-	}
-
-	public final Map getBasicColorMap() {
-		return Collections.unmodifiableMap(BASIC_COLORS);
-	}
-
-	public final Map getExtendedColorMap() {
-		return Collections.unmodifiableMap(EXTENDED_COLORS);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/DialogsMessages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/DialogsMessages.java
deleted file mode 100644
index 60db23c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/DialogsMessages.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.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
-	}
-
-	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 fea1ad1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/DialogsMessages.properties
+++ /dev/null
@@ -1,93 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 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
-###############################################################################
-StyleButtonDialogField.Edit=Edit...
-StyleDialog.Title=CSS Style Definition
-
-TextPreferenceNode.LabelText=Text
-TextPreferencePage.Title=Text
-TextPreferencePage.Font=Font:
-TextPreferencePage.Size=Size:
-TextPreferencePage.Weight=Weight:
-TextPreferencePage.Style=Style:
-TextPreferencePage.Variant=Variant:
-TextPreferencePage.LineHeight=Line Height:
-TextPreferencePage.Case=Case:
-TextPreferencePage.Decoration=Decoration:
-TextPreferencePage.Color=Color:
-
-BackgroundPreferenceNode.LabelText=Background
-BackgroundPreferencePage.Title=Background
-BackgroundBoxPreferencePage.BackgroundColor=Background color:
-BackgroundBoxPreferencePage.BackgroundImage=Background image:
-BackgroundBoxPreferencePage.BackgroundRepeatLabel=Repeat:
-BackgroundBoxPreferencePage.BackgroundAttachmentLabel=Attachment:
-BackgroundBoxPreferencePage.HorizontalLabel=Horizontal position:
-BackgroundBoxPreferencePage.VerticalLabel=Vertical position:
-
-BlockPreferenceNode.LabelText=Block
-BlockPreferencePage.Title=Block
-BlockPreferencePage.WordSpacing=Word spacing:
-BlockPreferencePage.LetterSpacing=Letter spacing:
-BlockPreferencePage.VerticalAlign=Vertical align:
-BlockPreferencePage.TextAlign=Text align:
-BlockPreferencePage.TextIndent=Text indent:
-BlockPreferencePage.WhiteSpace=White space:
-BlockPreferencePage.Display=Display:
-
-BoxPreferenceNode.LabelText=Box
-BoxPreferencePage.Title=Box
-BoxPreferencePage.Width=Width:
-BoxPreferencePage.Clear=Clear:
-BoxPreferencePage.Height=Height:
-BoxPreferencePage.Padding=Padding
-BoxPreferencePage.Margin=Margin
-BoxPreferencePage.Top=Top:
-BoxPreferencePage.Right=Right:
-BoxPreferencePage.Bottom=Bottom:
-BoxPreferencePage.Left=Left:
-
-BorderPreferenceNode.LabelText=Border
-BorderPreferencePage.Title=Border
-BorderPreferencePage.Style=Style
-BorderPreferencePage.Width=Width
-BorderPreferencePage.Color=Color
-BorderPreferencePage.Top=Top:
-BorderPreferencePage.Right=Right:
-BorderPreferencePage.Bottom=Bottom:
-BorderPreferencePage.Left=Left:
-
-ListPreferenceNode.LabelText=List
-ListPreferencePage.Title=List
-ListPreferencePage.Type=Type:
-ListPreferencePage.Image=Bullet image:
-ListPreferencePage.Position=Position:
-
-PositioningPreferenceNode.LabelText=Positioning
-PositioningPreferencePage.Title=Positioning
-PositioningPreferencePage.Type=Type:
-PositioningPreferencePage.Visibility=Visibility:
-PositioningPreferencePage.Width=Width:
-PositioningPreferencePage.ZIndex=Z-Index:
-PositioningPreferencePage.Height=Height:
-PositioningPreferencePage.Overflow=Overflow:
-PositioningPreferencePage.Placement=Placement
-PositioningPreferencePage.Clip=Clip
-PositioningPreferencePage.Right=Right:
-PositioningPreferencePage.Bottom=Bottom:
-PositioningPreferencePage.Left=Left:
-
-ExtensionsPreferenceNode.LabelText=Extensions
-ExtensionsPreferencePage.Title=Extensions
-ExtensionsPreferencePage.PageBreak=Page break
-ExtensionsPreferencePage.Before=Before:
-ExtensionsPreferencePage.After=After:
-ExtensionsPreferencePage.VisualEffect=Visual effect
-ExtensionsPreferencePage.Cursor=Cursor:
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferenceNode.java
deleted file mode 100644
index 1ac4ce7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferenceNode.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.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;
-
-	public ExtensionsPreferenceNode(IDOMElement element,
-			CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new ExtensionsPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Extensions";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("ExtensionsPreferenceNode.LabelText");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferencePage.java
deleted file mode 100644
index 650e7a3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferencePage.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ExtensionsPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private StyleCombo _beforeCombo, _afterCombo, _cursorCombo;
-
-	/**
-	 * Creates an instance.
-	 * 
-	 * @param element IDOMElement instance.
-	 * @param style CSSPropertyContext instance.
-	 */
-	public ExtensionsPreferencePage(IDOMElement element,
-			CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("ExtensionsPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(1, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Group pageGroup = new Group(top, SWT.NONE);
-		pageGroup.setText(DialogsMessages
-				.getString("ExtensionsPreferencePage.PageBreak"));
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		pageGroup.setLayoutData(data);
-		layout = new GridLayout(2, false);
-		pageGroup.setLayout(layout);
-
-		Label beforeLabel = new Label(pageGroup, SWT.NONE);
-		beforeLabel.setText(DialogsMessages
-				.getString("ExtensionsPreferencePage.Before")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		beforeLabel.setLayoutData(data);
-
-		_beforeCombo = new StyleCombo(pageGroup, SWT.NONE);
-		_beforeCombo.setItems(IStyleConstants.PAGE_BREAK);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_beforeCombo.setLayoutData(data);
-		_beforeCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String page = _beforeCombo.getText();
-				_style.setPageBreakBefore(page);
-			}
-		});
-
-		Label afterLabel = new Label(pageGroup, SWT.NONE);
-		afterLabel.setText(DialogsMessages
-				.getString("ExtensionsPreferencePage.After")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		afterLabel.setLayoutData(data);
-
-		_afterCombo = new StyleCombo(pageGroup, SWT.NONE);
-		_afterCombo.setItems(IStyleConstants.PAGE_BREAK);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_afterCombo.setLayoutData(data);
-		_afterCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String page = _afterCombo.getText();
-				_style.setPageBreakAfter(page);
-			}
-		});
-
-		Group visualGroup = new Group(top, SWT.NONE);
-		visualGroup.setText(DialogsMessages
-				.getString("ExtensionsPreferencePage.VisualEffect"));
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		visualGroup.setLayoutData(data);
-		layout = new GridLayout(2, false);
-		visualGroup.setLayout(layout);
-
-		Label cursorLabel = new Label(visualGroup, SWT.NONE);
-		cursorLabel.setText(DialogsMessages
-				.getString("ExtensionsPreferencePage.Cursor")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		cursorLabel.setLayoutData(data);
-
-		_cursorCombo = new StyleCombo(visualGroup, SWT.NONE);
-		_cursorCombo.setItems(IStyleConstants.CURSOR);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_cursorCombo.setLayoutData(data);
-		_cursorCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String cursor = _cursorCombo.getText();
-				_style.setCursor(cursor);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// page-break-before
-		String page = _style.getPageBreakBefore();
-		if (!isEmptyString(page)) {
-			int index = _beforeCombo.indexOf(page);
-			if (index != -1) {
-				_beforeCombo.select(index);
-			} else {
-				_beforeCombo.setText(page);
-			}
-		}
-
-		// page-break-after
-		page = _style.getPageBreakAfter();
-		if (!isEmptyString(page)) {
-			int index = _afterCombo.indexOf(page);
-			if (index != -1) {
-				_afterCombo.select(index);
-			} else {
-				_afterCombo.setText(page);
-			}
-		}
-
-		// cursor
-		String cursor = _style.getCursor();
-		if (!isEmptyString(cursor)) {
-			int index = _cursorCombo.indexOf(cursor);
-			if (index != -1) {
-				_cursorCombo.select(index);
-			} else {
-				_cursorCombo.setText(cursor);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/IStyleConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/IStyleConstants.java
deleted file mode 100644
index 9c0952a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/IStyleConstants.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.ui.dialogs;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IStyleConstants {
-	final public static String[] ATTACHMENT = { "fixed", "scroll" };
-
-	final public static String[] AUTO = { "auto" };
-
-	final public static String[] BORDER_STYLE = { "none", "dotted", "dashed",
-			"solid", "double", "groove", "ridge", "inset", "outset" };
-
-	final public static String[] BORDER_WIDTH = { "thin", "medium", "thick" };
-
-	final public static String[] CLEAR = { "left", "right", "both", "none" };
-
-	final public static String[] COLOR = { "black", "blue", "gray", "green",
-			"orange", "red", "white", "yellow", "aqua", "fuchsia", "lime",
-			"maroon", "navy", "olive", "purple", "silver", "teal" };
-
-	final public static String[] DISPLAY = { "none", "inline", "block",
-			"list-item", "run-in", "compact", "marker", "table",
-			"inline-table", "table-row-group", "table-header-group",
-			"table-footer-group", "table-row", "table-column-group",
-			"table-column", "table-cell", "table-caption" };
-
-	final public static String[] FLOAT = { "left", "right", "none" };
-
-	final public static String[] FONT_FAMILY = { "Verdana, Arial, Sans-Serif",
-			"Tahoma, Verdana, Arial, Sans-Serif", "\"Times New Roman\", Serif",
-			"Georgia, \"Times New Roman\", Serif",
-			"\"Book Antiqua\", \"Times New Roman\", Serif",
-			"\"Comic Sans MS\", Sans-Serif", "\"Courier New\", Courier",
-			"\"Trebuchet MS\", Sans-Serif" };
-
-	final public static String[] FONT_SIZE_NUMBER = { "9", "10", "12", "14",
-			"16", "18", "24", "36", "xx-small", "x-small", "small", "medium",
-			"large", "x-large", "xx-large", "smaller", "larger" };
-
-	final public static String[] FONT_STYLE = { "normal", "italic", "oblique" };
-
-	final public static String[] FONT_TEXTTRANSFORM = { "capitalize",
-			"uppercase", "lowercase", "none" };
-
-	final public static String[] FONT_VARIANT = { "normal", "small-caps" };
-
-	final public static String[] FONT_WEIGHT = { "normal", "bold", "bolder",
-			"lighter", "100", "200", "300", "400", "500", "600", "700", "800",
-			"900" };
-
-	final public static String[] LIST_POSITION = { "inside", "outside" };
-
-	final public static String[] LIST_TYPE = { "disc", "circle", "sqaure",
-			"decimal", "lower-roman", "upper-roman", "lower-alpha",
-			"upper-alpah", "none" };
-
-	final public static String[] NONE = { "none" };
-
-	final public static String[] NORMAL = { "normal" };
-
-	final public static String[] PERCENT = { "%" };
-
-	final public static String[] POSITION = { "left", "center", "right" };
-
-	final public static String[] POSITIONING_TYPE = { "absolute", "relative",
-			"static" };
-
-	final public static String[] REPEAT = { "no-repeat", "repeat", "repeat-x",
-			"repeat-y" };
-
-	final public static String[] SIZE_UNIT = { "px", "pt", "in", "cm", "mm",
-			"pc", "em", "ex", "%" };
-
-	final public static String[] TEXT_ALIGN = { "left", "right", "center",
-			"justify" };
-
-	final public static String[] TEXT_DECORATION = { "underline", "overline",
-			"line-through", "blink", "none" };
-
-	final public static String[] VERTICAL_ALIGN = { "baseline", "sub", "super",
-			"top", "text-top", "middle", "bottom", "text-bottom" };
-
-	final public static String[] WHITE_SPACE = { "normal", "pre", "nowrap" };
-
-	final public static String[] VISIBILITY = { "inherit", "visible", "hidden" };
-
-	final public static String[] OVERFLOW = { "visible", "hidden", "scroll",
-			"auto" };
-
-	final public static String[] PAGE_BREAK = { "auto", "always", "left",
-			"right" };
-
-	final public static String[] CURSOR = { "hand", "crosshair", "text",
-			"wait", "default", "help", "e-resize", "ne-resize", "n-resize",
-			"nw-resize", "w-resize", "sw-resize", "s-resize", "se-resize",
-			"auto" };
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferenceNode.java
deleted file mode 100644
index 334afe4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferenceNode.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.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;
-
-	public ListPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new ListPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "List";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("ListPreferenceNode.LabelText");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferencePage.java
deleted file mode 100644
index 078e7e3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferencePage.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.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;
-
-	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 f46dd07..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/PositioningPreferenceNode.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.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;
-
-	public PositioningPreferenceNode(IDOMElement element,
-			CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new PositioningPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Positioning";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("PositioningPreferenceNode.LabelText");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/PositioningPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/PositioningPreferencePage.java
deleted file mode 100644
index 415ff91..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/PositioningPreferencePage.java
+++ /dev/null
@@ -1,778 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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;
-
-	public PositioningPreferencePage(IDOMElement element,
-			CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("PositioningPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(6, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Label typeLabel = new Label(top, SWT.NONE);
-		typeLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Type")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		typeLabel.setLayoutData(data);
-
-		_typeCombo = new Combo(top, SWT.NONE);
-		_typeCombo.setItems(IStyleConstants.POSITIONING_TYPE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 2;
-		_typeCombo.setLayoutData(data);
-		_typeCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String type = _typeCombo.getText();
-				_style.setPosition(type);
-			}
-		});
-
-		Label visibilityLabel = new Label(top, SWT.NONE);
-		visibilityLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Visibility")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		visibilityLabel.setLayoutData(data);
-
-		_visibilityCombo = new Combo(top, SWT.NONE);
-		_visibilityCombo.setItems(IStyleConstants.VISIBILITY);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_visibilityCombo.setLayoutData(data);
-		_visibilityCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String visibility = _visibilityCombo.getText();
-				_style.setVisibility(visibility);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label widthLabel = new Label(top, SWT.NONE);
-		widthLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Width")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthLabel.setLayoutData(data);
-
-		_widthNumberCombo = new Combo(top, SWT.NONE);
-		_widthNumberCombo.setItems(IStyleConstants.LIST_POSITION);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthNumberCombo.setLayoutData(data);
-		_widthNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthNumberCombo.getText();
-				if (_widthUnitCombo.isEnabled()) {
-					width += _widthUnitCombo.getText();
-				}
-
-				_style.setWidth(width);
-			}
-		});
-
-		_widthUnitCombo = new Combo(top, SWT.READ_ONLY);
-		_widthUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthUnitCombo.setLayoutData(data);
-		_widthUnitCombo.select(0);
-		_widthUnitCombo.setEnabled(false);
-		_widthUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthNumberCombo.getText();
-				if (_widthUnitCombo.isEnabled()) {
-					width += _widthUnitCombo.getText();
-				}
-
-				_style.setWidth(width);
-			}
-		});
-
-		Label zIndexLabel = new Label(top, SWT.NONE);
-		zIndexLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.ZIndex")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		zIndexLabel.setLayoutData(data);
-
-		_zIndexCombo = new Combo(top, SWT.NONE);
-		_zIndexCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_zIndexCombo.setLayoutData(data);
-		_zIndexCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String index = _zIndexCombo.getText();
-				_style.setZIndex(index);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label heightLabel = new Label(top, SWT.NONE);
-		heightLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Height")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		heightLabel.setLayoutData(data);
-
-		_heightNumberCombo = new Combo(top, SWT.NONE);
-		_heightNumberCombo.setItems(IStyleConstants.LIST_POSITION);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_heightNumberCombo.setLayoutData(data);
-		_heightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_heightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_heightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_heightUnitCombo.setEnabled(false);
-				}
-
-				String height = _heightNumberCombo.getText();
-				if (_heightUnitCombo.isEnabled()) {
-					height += _heightUnitCombo.getText();
-				}
-
-				_style.setHeight(height);
-			}
-		});
-
-		_heightUnitCombo = new Combo(top, SWT.READ_ONLY);
-		_heightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_heightUnitCombo.setLayoutData(data);
-		_heightUnitCombo.select(0);
-		_heightUnitCombo.setEnabled(false);
-		_heightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String height = _heightNumberCombo.getText();
-				if (_heightUnitCombo.isEnabled()) {
-					height += _heightUnitCombo.getText();
-				}
-
-				_style.setHeight(height);
-			}
-		});
-
-		Label overflowLabel = new Label(top, SWT.NONE);
-		overflowLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Overflow")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		overflowLabel.setLayoutData(data);
-
-		_overflowCombo = new Combo(top, SWT.NONE);
-		_overflowCombo.setItems(IStyleConstants.OVERFLOW);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_overflowCombo.setLayoutData(data);
-		_overflowCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String overflow = _overflowCombo.getText();
-				_style.setOverflow(overflow);
-			}
-		});
-
-		Group placementGroup = new Group(top, SWT.NONE);
-		placementGroup.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Placement"));
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 3;
-		data.verticalSpan = 4;
-		placementGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		placementGroup.setLayout(layout);
-
-		Label placementTopLabel = new Label(placementGroup, SWT.NONE);
-		placementTopLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Top")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		placementTopLabel.setLayoutData(data);
-
-		_placementTopNumberCombo = new Combo(placementGroup, SWT.NONE);
-		_placementTopNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementTopNumberCombo.setLayoutData(data);
-		_placementTopNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_placementTopUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_placementTopNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_placementTopUnitCombo.setEnabled(false);
-				}
-
-				String placement = _placementTopNumberCombo.getText();
-				if (_placementTopUnitCombo.isEnabled()) {
-					placement += _placementTopUnitCombo.getText();
-				}
-
-				_style.setTop(placement);
-			}
-		});
-
-		_placementTopUnitCombo = new Combo(placementGroup, SWT.READ_ONLY);
-		_placementTopUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementTopUnitCombo.setLayoutData(data);
-		_placementTopUnitCombo.select(0);
-		_placementTopUnitCombo.setEnabled(false);
-		_placementTopUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String placement = _placementTopNumberCombo.getText();
-				if (_placementTopUnitCombo.isEnabled()) {
-					placement += _placementTopUnitCombo.getText();
-				}
-
-				_style.setTop(placement);
-			}
-		});
-
-		Label placementRightLabel = new Label(placementGroup, SWT.NONE);
-		placementRightLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Right")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		placementRightLabel.setLayoutData(data);
-
-		_placementRightNumberCombo = new Combo(placementGroup, SWT.NONE);
-		_placementRightNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementRightNumberCombo.setLayoutData(data);
-		_placementRightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_placementRightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_placementRightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_placementRightUnitCombo.setEnabled(false);
-				}
-
-				String placement = _placementRightNumberCombo.getText();
-				if (_placementRightUnitCombo.isEnabled()) {
-					placement += _placementRightUnitCombo.getText();
-				}
-
-				_style.setRight(placement);
-			}
-		});
-
-		_placementRightUnitCombo = new Combo(placementGroup, SWT.READ_ONLY);
-		_placementRightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementRightUnitCombo.setLayoutData(data);
-		_placementRightUnitCombo.select(0);
-		_placementRightUnitCombo.setEnabled(false);
-		_placementRightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String placement = _placementRightNumberCombo.getText();
-				if (_placementRightUnitCombo.isEnabled()) {
-					placement += _placementRightUnitCombo.getText();
-				}
-
-				_style.setRight(placement);
-			}
-		});
-
-		Label placementBottomLabel = new Label(placementGroup, SWT.NONE);
-		placementBottomLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Bottom")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		placementBottomLabel.setLayoutData(data);
-
-		_placementBottomNumberCombo = new Combo(placementGroup, SWT.NONE);
-		_placementBottomNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementBottomNumberCombo.setLayoutData(data);
-		_placementBottomNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_placementBottomUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_placementBottomNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_placementBottomUnitCombo.setEnabled(false);
-				}
-
-				String placement = _placementBottomNumberCombo.getText();
-				if (_placementBottomUnitCombo.isEnabled()) {
-					placement += _placementBottomUnitCombo.getText();
-				}
-
-				_style.setBottom(placement);
-			}
-		});
-
-		_placementBottomUnitCombo = new Combo(placementGroup, SWT.READ_ONLY);
-		_placementBottomUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementBottomUnitCombo.setLayoutData(data);
-		_placementBottomUnitCombo.select(0);
-		_placementBottomUnitCombo.setEnabled(false);
-		_placementBottomUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String placement = _placementBottomNumberCombo.getText();
-				if (_placementBottomUnitCombo.isEnabled()) {
-					placement += _placementBottomUnitCombo.getText();
-				}
-
-				_style.setBottom(placement);
-			}
-		});
-
-		Label placementLeftLabel = new Label(placementGroup, SWT.NONE);
-		placementLeftLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Left")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		placementLeftLabel.setLayoutData(data);
-
-		_placementLeftNumberCombo = new Combo(placementGroup, SWT.NONE);
-		_placementLeftNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementLeftNumberCombo.setLayoutData(data);
-		_placementLeftNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_placementLeftUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_placementLeftNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_placementLeftUnitCombo.setEnabled(false);
-				}
-
-				String top1 = _placementLeftNumberCombo.getText();
-				if (_placementLeftUnitCombo.isEnabled()) {
-					top1 += _placementLeftUnitCombo.getText();
-				}
-
-				_style.setLeft(top1);
-			}
-		});
-
-		_placementLeftUnitCombo = new Combo(placementGroup, SWT.READ_ONLY);
-		_placementLeftUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementLeftUnitCombo.setLayoutData(data);
-		_placementLeftUnitCombo.select(0);
-		_placementLeftUnitCombo.setEnabled(false);
-		_placementLeftUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String top1 = _placementLeftNumberCombo.getText();
-				if (_placementLeftUnitCombo.isEnabled()) {
-					top1 += _placementLeftUnitCombo.getText();
-				}
-
-				_style.setLeft(top1);
-			}
-		});
-
-		Group clipGroup = new Group(top, SWT.NONE);
-		clipGroup.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Clip"));
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 3;
-		data.verticalSpan = 4;
-		clipGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		clipGroup.setLayout(layout);
-
-		Label clipTopLabel = new Label(clipGroup, SWT.NONE);
-		clipTopLabel
-				.setText(DialogsMessages.getString("BoxPreferencePage.Top")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		clipTopLabel.setLayoutData(data);
-
-		_clipTopNumberCombo = new Combo(clipGroup, SWT.NONE);
-		_clipTopNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipTopNumberCombo.setLayoutData(data);
-		_clipTopNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_clipTopUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_clipTopNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_clipTopUnitCombo.setEnabled(false);
-				}
-
-				String clip = _clipTopNumberCombo.getText();
-				if (_clipTopUnitCombo.isEnabled()) {
-					clip += _clipTopUnitCombo.getText();
-				}
-
-				_style.setClipTop(clip);
-			}
-		});
-
-		_clipTopUnitCombo = new Combo(clipGroup, SWT.READ_ONLY);
-		_clipTopUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipTopUnitCombo.setLayoutData(data);
-		_clipTopUnitCombo.select(0);
-		_clipTopUnitCombo.setEnabled(false);
-		_clipTopUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String clip = _clipTopNumberCombo.getText();
-				if (_clipTopUnitCombo.isEnabled()) {
-					clip += _clipTopUnitCombo.getText();
-				}
-
-				_style.setClipTop(clip);
-			}
-		});
-
-		Label clipRightLabel = new Label(clipGroup, SWT.NONE);
-		clipRightLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Right")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		clipRightLabel.setLayoutData(data);
-
-		_clipRightNumberCombo = new Combo(clipGroup, SWT.NONE);
-		_clipRightNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipRightNumberCombo.setLayoutData(data);
-		_clipRightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_clipRightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_clipRightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_clipRightUnitCombo.setEnabled(false);
-				}
-
-				String clip = _clipRightNumberCombo.getText();
-				if (_clipRightUnitCombo.isEnabled()) {
-					clip += _clipRightUnitCombo.getText();
-				}
-
-				_style.setClipRight(clip);
-			}
-		});
-
-		_clipRightUnitCombo = new Combo(clipGroup, SWT.READ_ONLY);
-		_clipRightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipRightUnitCombo.setLayoutData(data);
-		_clipRightUnitCombo.select(0);
-		_clipRightUnitCombo.setEnabled(false);
-		_clipRightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String clip = _clipRightNumberCombo.getText();
-				if (_clipRightUnitCombo.isEnabled()) {
-					clip += _clipRightUnitCombo.getText();
-				}
-
-				_style.setClipRight(clip);
-			}
-		});
-
-		Label clipBottomLabel = new Label(clipGroup, SWT.NONE);
-		clipBottomLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Bottom")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		clipBottomLabel.setLayoutData(data);
-
-		_clipBottomNumberCombo = new Combo(clipGroup, SWT.NONE);
-		_clipBottomNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipBottomNumberCombo.setLayoutData(data);
-		_clipBottomNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_clipBottomUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_clipBottomNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_clipBottomUnitCombo.setEnabled(false);
-				}
-
-				String clip = _clipBottomNumberCombo.getText();
-				if (_clipBottomUnitCombo.isEnabled()) {
-					clip += _clipBottomUnitCombo.getText();
-				}
-
-				_style.setClipBottom(clip);
-			}
-		});
-
-		_clipBottomUnitCombo = new Combo(clipGroup, SWT.READ_ONLY);
-		_clipBottomUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipBottomUnitCombo.setLayoutData(data);
-		_clipBottomUnitCombo.select(0);
-		_clipBottomUnitCombo.setEnabled(false);
-		_clipBottomUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String clip = _clipBottomNumberCombo.getText();
-				if (_clipBottomUnitCombo.isEnabled()) {
-					clip += _clipBottomUnitCombo.getText();
-				}
-
-				_style.setClipBottom(clip);
-			}
-		});
-
-		Label clipLeftLabel = new Label(clipGroup, SWT.NONE);
-		clipLeftLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Left")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		clipLeftLabel.setLayoutData(data);
-
-		_clipLeftNumberCombo = new Combo(clipGroup, SWT.NONE);
-		_clipLeftNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipLeftNumberCombo.setLayoutData(data);
-		_clipLeftNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_clipLeftUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_clipLeftNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_clipLeftUnitCombo.setEnabled(false);
-				}
-
-				String top1 = _clipLeftNumberCombo.getText();
-				if (_clipLeftUnitCombo.isEnabled()) {
-					top1 += _clipLeftUnitCombo.getText();
-				}
-
-				_style.setClipLeft(top1);
-			}
-		});
-
-		_clipLeftUnitCombo = new Combo(clipGroup, SWT.READ_ONLY);
-		_clipLeftUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipLeftUnitCombo.setLayoutData(data);
-		_clipLeftUnitCombo.select(0);
-		_clipLeftUnitCombo.setEnabled(false);
-		_clipLeftUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String top1 = _clipLeftNumberCombo.getText();
-				if (_clipLeftUnitCombo.isEnabled()) {
-					top1 += _clipLeftUnitCombo.getText();
-				}
-
-				_style.setClipLeft(top1);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// position
-		String position = _style.getPosition();
-		if (!isEmptyString(position)) {
-			int index = _typeCombo.indexOf(position);
-			if (index != -1) {
-				_typeCombo.select(index);
-			} else {
-				_typeCombo.setText(position);
-			}
-		}
-
-		// visibility
-		String visibility = _style.getVisibility();
-		if (!isEmptyString(visibility)) {
-			int index = _visibilityCombo.indexOf(visibility);
-			if (index != -1) {
-				_visibilityCombo.select(index);
-			} else {
-				_visibilityCombo.setText(visibility);
-			}
-		}
-
-		// width
-		String width = _style.getWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthNumberCombo.select(index);
-			} else {
-				_widthNumberCombo.setText(width);
-			}
-		}
-
-		// z-index
-		String zindex = _style.getZIndex();
-		if (!isEmptyString(zindex)) {
-			int index = _zIndexCombo.indexOf(zindex);
-			if (index != -1) {
-				_zIndexCombo.select(index);
-			} else {
-				_zIndexCombo.setText(zindex);
-			}
-		}
-
-		// height
-		String height = _style.getHeight();
-		if (!isEmptyString(height)) {
-			int index = _heightNumberCombo.indexOf(height);
-			if (index != -1) {
-				_heightNumberCombo.select(index);
-			} else {
-				_heightNumberCombo.setText(height);
-			}
-		}
-
-		// overflow
-		String overflow = _style.getOverflow();
-		if (!isEmptyString(overflow)) {
-			int index = _overflowCombo.indexOf(overflow);
-			if (index != -1) {
-				_overflowCombo.select(index);
-			} else {
-				_overflowCombo.setText(overflow);
-			}
-		}
-
-		// placement
-		String placement = _style.getTop();
-		if (!isEmptyString(placement)) {
-			int index = _placementTopNumberCombo.indexOf(placement);
-			if (index != -1) {
-				_placementTopNumberCombo.select(index);
-			} else {
-				_placementTopNumberCombo.setText(placement);
-			}
-		}
-		placement = _style.getRight();
-		if (!isEmptyString(placement)) {
-			int index = _placementRightNumberCombo.indexOf(placement);
-			if (index != -1) {
-				_placementRightNumberCombo.select(index);
-			} else {
-				_placementRightNumberCombo.setText(placement);
-			}
-		}
-		placement = _style.getBottom();
-		if (!isEmptyString(placement)) {
-			int index = _placementBottomNumberCombo.indexOf(placement);
-			if (index != -1) {
-				_placementBottomNumberCombo.select(index);
-			} else {
-				_placementBottomNumberCombo.setText(placement);
-			}
-		}
-		placement = _style.getLeft();
-		if (!isEmptyString(placement)) {
-			int index = _placementLeftNumberCombo.indexOf(placement);
-			if (index != -1) {
-				_placementLeftNumberCombo.select(index);
-			} else {
-				_placementLeftNumberCombo.setText(placement);
-			}
-		}
-
-		// clip
-		String clip = _style.getClipTop();
-		if (!isEmptyString(clip)) {
-			int index = _clipTopNumberCombo.indexOf(clip);
-			if (index != -1) {
-				_clipTopNumberCombo.select(index);
-			} else {
-				_clipTopNumberCombo.setText(clip);
-			}
-		}
-		clip = _style.getClipRight();
-		if (!isEmptyString(clip)) {
-			int index = _clipRightNumberCombo.indexOf(clip);
-			if (index != -1) {
-				_clipRightNumberCombo.select(index);
-			} else {
-				_clipRightNumberCombo.setText(clip);
-			}
-		}
-		clip = _style.getClipBottom();
-		if (!isEmptyString(clip)) {
-			int index = _clipBottomNumberCombo.indexOf(clip);
-			if (index != -1) {
-				_clipBottomNumberCombo.select(index);
-			} else {
-				_clipBottomNumberCombo.setText(clip);
-			}
-		}
-		clip = _style.getClipLeft();
-		if (!isEmptyString(clip)) {
-			int index = _clipLeftNumberCombo.indexOf(clip);
-			if (index != -1) {
-				_clipLeftNumberCombo.select(index);
-			} else {
-				_clipLeftNumberCombo.setText(clip);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-        }	
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleCombo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleCombo.java
deleted file mode 100644
index e50a885..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleCombo.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class StyleCombo extends Combo {
-
-	/**
-	 * @param parent
-	 * @param style
-	 */
-	public StyleCombo(Composite parent, int style) {
-		super(parent, style);
-		this.addControlListener(new ControlAdapter() {
-			public void controlResized(ControlEvent e) {
-				Combo combo = (Combo) e.widget;
-				combo.setSelection(new Point(0, 0));
-			}
-		});
-	}
-
-	protected void checkSubclass() {
-        // override subclass validation, otherwise Widget.isValidSubclass
-        // will throw an error
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleDialog.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleDialog.java
deleted file mode 100644
index 8ad3b9b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleDialog.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.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
-	 */
-	public StyleDialog(Shell parentShell, PreferenceManager manager,
-			IDOMElement element, CSSPropertyContext style) {
-		super(parentShell, manager);
-		manager.addToRoot(new TextPreferenceNode(element, style));
-		manager.addToRoot(new BackgroudPreferenceNode(element, style));
-		manager.addToRoot(new BlockPreferenceNode(element, style));
-		manager.addToRoot(new BoxPreferenceNode(element, style));
-		manager.addToRoot(new BorderPreferenceNode(element, style));
-		manager.addToRoot(new ListPreferenceNode(element, style));
-		manager.addToRoot(new PositioningPreferenceNode(element, style));
-		manager.addToRoot(new ExtensionsPreferenceNode(element, style));
-	}
-
-	protected Control createDialogArea(Composite parent) {
-		Control control = super.createDialogArea(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(control,
-				PDPlugin.getResourceString("StyleDialog.help.id"));
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(
-				getTreeViewer().getControl(),
-				PDPlugin.getResourceString("StyleDialog.help.id"));
-		return control;
-	}
-
-	protected void update() {
-		super.update();
-		getShell().setText(DialogsMessages.getString("StyleDialog.Title"));
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferenceNode.java
deleted file mode 100644
index c279c69..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferenceNode.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.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;
-
-	public TextPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new TextPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Text";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("TextPreferenceNode.LabelText");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferencePage.java
deleted file mode 100644
index af69bc5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferencePage.java
+++ /dev/null
@@ -1,521 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.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;
-
-	public TextPreferencePage(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		// Set the preference store for the preference page.
-		// IPreferenceStore store =
-		// JMTIntegrationPlugin.getDefault().getPreferenceStore();
-		// setPreferenceStore(store);
-		setTitle(DialogsMessages.getString("TextPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(5, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Label fontLabel = new Label(top, SWT.NONE);
-		fontLabel.setText(DialogsMessages.getString("TextPreferencePage.Font")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		fontLabel.setLayoutData(data);
-
-		_fontFamilyCombo = new StyleCombo(top, SWT.NONE);
-		_fontFamilyCombo.setItems(IStyleConstants.FONT_FAMILY);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 4;
-		_fontFamilyCombo.setLayoutData(data);
-		_fontFamilyCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_style.setFontFamily(_fontFamilyCombo.getText());
-			}
-		});
-
-		Label sizeLabel = new Label(top, SWT.NONE);
-		sizeLabel.setText(DialogsMessages.getString("TextPreferencePage.Size")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		sizeLabel.setLayoutData(data);
-
-		_fontSizeNumberCombo = new StyleCombo(top, SWT.NONE);
-		_fontSizeNumberCombo.setItems(IStyleConstants.FONT_SIZE_NUMBER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontSizeNumberCombo.setLayoutData(data);
-		_fontSizeNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_fontSizeUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_fontSizeNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_fontSizeUnitCombo.setEnabled(false);
-				}
-
-				String size = _fontSizeNumberCombo.getText();
-				if (_fontSizeUnitCombo.isEnabled()) {
-					size += _fontSizeUnitCombo.getText();
-				}
-
-				_style.setFontSize(size);
-			}
-		});
-
-		_fontSizeUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_fontSizeUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontSizeUnitCombo.setLayoutData(data);
-		_fontSizeUnitCombo.select(0);
-		_fontSizeUnitCombo.setEnabled(false);
-		_fontSizeUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String size = _fontSizeNumberCombo.getText();
-				if (_fontSizeUnitCombo.isEnabled()) {
-					size += _fontSizeUnitCombo.getText();
-				}
-
-				_style.setFontSize(size);
-			}
-		});
-
-		Label weightLabel = new Label(top, SWT.NONE);
-		weightLabel.setText(DialogsMessages
-				.getString("TextPreferencePage.Weight")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		weightLabel.setLayoutData(data);
-
-		_fontWeightCombo = new StyleCombo(top, SWT.NONE);
-		_fontWeightCombo.setItems(IStyleConstants.FONT_WEIGHT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontWeightCombo.setLayoutData(data);
-		_fontWeightCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String weight = _fontWeightCombo.getText();
-				_style.setFontWeight(weight);
-			}
-		});
-
-		Label stylesLabel = new Label(top, SWT.NONE);
-		stylesLabel.setText(DialogsMessages
-				.getString("TextPreferencePage.Style")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		stylesLabel.setLayoutData(data);
-
-		_fontStyleCombo = new StyleCombo(top, SWT.NONE);
-		_fontStyleCombo.setItems(IStyleConstants.FONT_STYLE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontStyleCombo.setLayoutData(data);
-		_fontStyleCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String style = _fontStyleCombo.getText();
-				_style.setFontStyle(style);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label variantLabel = new Label(top, SWT.NONE);
-		variantLabel.setText(DialogsMessages
-				.getString("TextPreferencePage.Variant")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		variantLabel.setLayoutData(data);
-
-		_fontVariantCombo = new StyleCombo(top, SWT.NONE);
-		_fontVariantCombo.setItems(IStyleConstants.FONT_VARIANT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontVariantCombo.setLayoutData(data);
-		_fontVariantCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String variant = _fontVariantCombo.getText();
-				_style.setFontVariant(variant);
-			}
-		});
-
-		Label lineHeightLabel = new Label(top, SWT.NONE);
-		lineHeightLabel.setText(DialogsMessages
-				.getString("TextPreferencePage.LineHeight")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		lineHeightLabel.setLayoutData(data);
-
-		_fontLineHeightNumberCombo = new StyleCombo(top, SWT.NONE);
-		_fontLineHeightNumberCombo.setItems(IStyleConstants.NORMAL);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontLineHeightNumberCombo.setLayoutData(data);
-		_fontLineHeightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_fontLineHeightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_fontLineHeightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_fontLineHeightUnitCombo.setEnabled(false);
-				}
-
-				String height = _fontLineHeightNumberCombo.getText();
-				if (_fontLineHeightUnitCombo.isEnabled()) {
-					height += _fontLineHeightUnitCombo.getText();
-				}
-
-				_style.setLineHeight(height);
-			}
-		});
-
-		_fontLineHeightUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_fontLineHeightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontLineHeightUnitCombo.setLayoutData(data);
-		_fontLineHeightUnitCombo.select(0);
-		_fontLineHeightUnitCombo.setEnabled(false);
-		_fontLineHeightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String height = _fontLineHeightNumberCombo.getText();
-				if (_fontLineHeightUnitCombo.isEnabled()) {
-					height += _fontLineHeightUnitCombo.getText();
-				}
-
-				_style.setLineHeight(height);
-			}
-		});
-
-		Label caseLabel = new Label(top, SWT.NONE);
-		caseLabel.setText(DialogsMessages.getString("TextPreferencePage.Case")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		caseLabel.setLayoutData(data);
-
-		_textTransformCombo = new StyleCombo(top, SWT.NONE);
-		_textTransformCombo.setItems(IStyleConstants.FONT_TEXTTRANSFORM);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_textTransformCombo.setLayoutData(data);
-		_textTransformCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String textTransform = _textTransformCombo.getText();
-				_style.setTextTransform(textTransform);
-			}
-		});
-
-		Label decorationLabel = new Label(top, SWT.NONE);
-		decorationLabel.setText(DialogsMessages
-				.getString("TextPreferencePage.Decoration")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		decorationLabel.setLayoutData(data);
-
-		Composite decorationComposite = new Composite(top, SWT.NONE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 4;
-		decorationComposite.setLayoutData(data);
-		layout = new GridLayout(5, true);
-		layout.marginWidth = 0;
-		decorationComposite.setLayout(layout);
-
-		_textDecorationUnderlineButton = new Button(decorationComposite,
-				SWT.CHECK);
-		_textDecorationUnderlineButton
-				.setText(IStyleConstants.TEXT_DECORATION[0]);
-		_textDecorationUnderlineButton
-				.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						if (_textDecorationUnderlineButton.getSelection()) {
-							_textDecorationNoneButton.setSelection(false);
-						}
-						_style.setTextDecoration(getTextDecoration());
-					}
-				});
-
-		_textDecorationOverlineButton = new Button(decorationComposite,
-				SWT.CHECK);
-		_textDecorationOverlineButton
-				.setText(IStyleConstants.TEXT_DECORATION[1]);
-		_textDecorationOverlineButton
-				.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						if (_textDecorationOverlineButton.getSelection()) {
-							_textDecorationNoneButton.setSelection(false);
-						}
-						_style.setTextDecoration(getTextDecoration());
-					}
-				});
-
-		_textDecorationLineThroughButton = new Button(decorationComposite,
-				SWT.CHECK);
-		_textDecorationLineThroughButton
-				.setText(IStyleConstants.TEXT_DECORATION[2]);
-		_textDecorationLineThroughButton
-				.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						if (_textDecorationLineThroughButton.getSelection()) {
-							_textDecorationNoneButton.setSelection(false);
-						}
-						_style.setTextDecoration(getTextDecoration());
-					}
-				});
-
-		_textDecorationBlinkButton = new Button(decorationComposite, SWT.CHECK);
-		_textDecorationBlinkButton.setText(IStyleConstants.TEXT_DECORATION[3]);
-		_textDecorationBlinkButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (_textDecorationBlinkButton.getSelection()) {
-					_textDecorationNoneButton.setSelection(false);
-				}
-				_style.setTextDecoration(getTextDecoration());
-			}
-		});
-
-		_textDecorationNoneButton = new Button(decorationComposite, SWT.CHECK);
-		_textDecorationNoneButton.setText(IStyleConstants.TEXT_DECORATION[4]);
-		_textDecorationNoneButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (_textDecorationNoneButton.getSelection()) {
-					_textDecorationUnderlineButton.setSelection(false);
-					_textDecorationOverlineButton.setSelection(false);
-					_textDecorationLineThroughButton.setSelection(false);
-					_textDecorationBlinkButton.setSelection(false);
-				}
-				_style.setTextDecoration(getTextDecoration());
-			}
-		});
-
-		_colorField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_colorField.setLabelText(DialogsMessages
-				.getString("TextPreferencePage.Color"));
-
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_colorField.getLabelControl(null, top).setLayoutData(data);
-
-		data = new GridData();
-		data.horizontalAlignment = GridData.FILL;
-		data.grabExcessHorizontalSpace = false;
-		_colorField.getComboControl(null, top).setLayoutData(data);
-
-		data = new GridData();
-		_colorField.getChangeControl(null, top).setLayoutData(data);
-		_colorField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _colorField.getText();
-						_style.setColor(color);
-					}
-				});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// font-family
-		String fontFamily = _style.getFontFamily();
-		if (!isEmptyString(fontFamily)) {
-			int index = _fontFamilyCombo.indexOf(fontFamily);
-			if (index != -1) {
-				_fontFamilyCombo.select(index);
-			} else {
-				_fontFamilyCombo.setText(fontFamily);
-			}
-		}
-
-		// font-size
-		String fontSize = _style.getFontSize();
-		if (!isEmptyString(fontSize)) {
-			int index = _fontSizeNumberCombo.indexOf(fontSize);
-			if (index != -1) {
-				_fontSizeNumberCombo.select(index);
-			} else {
-				_fontSizeNumberCombo.setText(fontSize);
-			}
-		}
-
-		// font-weight
-		String fontWeight = _style.getFontWeight();
-		if (!isEmptyString(fontWeight)) {
-			int index = _fontWeightCombo.indexOf(fontWeight);
-			if (index != -1) {
-				_fontWeightCombo.select(index);
-			} else {
-				_fontWeightCombo.setText(fontWeight);
-			}
-		}
-
-		// font-style
-		String fontStyle = _style.getFontStyle();
-		if (!isEmptyString(fontStyle)) {
-			int index = _fontStyleCombo.indexOf(fontStyle);
-			if (index != -1) {
-				_fontStyleCombo.select(index);
-			} else {
-				_fontStyleCombo.setText(fontStyle);
-			}
-		}
-
-		// font-variant
-		String fontVariant = _style.getFontVariant();
-		if (!isEmptyString(fontVariant)) {
-			int index = _fontVariantCombo.indexOf(fontVariant);
-			if (index != -1) {
-				_fontVariantCombo.select(index);
-			} else {
-				_fontVariantCombo.setText(fontVariant);
-			}
-		}
-
-		// line-height
-		String lineHeight = _style.getLineHeight();
-		if (!isEmptyString(lineHeight)) {
-			int index = _fontLineHeightNumberCombo.indexOf(lineHeight);
-			if (index != -1) {
-				_fontLineHeightNumberCombo.select(index);
-			} else {
-				_fontLineHeightNumberCombo.setText(lineHeight);
-			}
-		}
-
-		// text-transform
-		String textTransform = _style.getTextTransform();
-		if (!isEmptyString(textTransform)) {
-			int index = _textTransformCombo.indexOf(textTransform);
-			if (index != -1) {
-				_textTransformCombo.select(index);
-			} else {
-				_textTransformCombo.setText(textTransform);
-			}
-		}
-
-		// text-decoration
-		String textDecoration = _style.getTextDecoration();
-		if (!isEmptyString(textDecoration)) {
-			int index = textDecoration
-					.indexOf(IStyleConstants.TEXT_DECORATION[0]);
-			if (index != -1) {
-				_textDecorationUnderlineButton.setSelection(true);
-			} else {
-				_textDecorationUnderlineButton.setSelection(false);
-			}
-
-			index = textDecoration.indexOf(IStyleConstants.TEXT_DECORATION[1]);
-			if (index != -1) {
-				_textDecorationOverlineButton.setSelection(true);
-			} else {
-				_textDecorationOverlineButton.setSelection(false);
-			}
-
-			index = textDecoration.indexOf(IStyleConstants.TEXT_DECORATION[2]);
-			if (index != -1) {
-				_textDecorationLineThroughButton.setSelection(true);
-			} else {
-				_textDecorationLineThroughButton.setSelection(false);
-			}
-
-			index = textDecoration.indexOf(IStyleConstants.TEXT_DECORATION[3]);
-			if (index != -1) {
-				_textDecorationBlinkButton.setSelection(true);
-			} else {
-				_textDecorationBlinkButton.setSelection(false);
-			}
-
-			index = textDecoration.indexOf(IStyleConstants.TEXT_DECORATION[4]);
-			if (index != -1) {
-				_textDecorationNoneButton.setSelection(true);
-			} else {
-				_textDecorationNoneButton.setSelection(false);
-			}
-		}
-
-		// color
-		String color = _style.getColor();
-		if (!isEmptyString(color)) {
-			_colorField.setTextWithoutUpdate(color);
-		}
-	}
-
-	private String getTextDecoration() {
-		StringBuffer textDecoration = new StringBuffer();
-		if (_textDecorationUnderlineButton.getSelection()) {
-			textDecoration.append(_textDecorationUnderlineButton.getText())
-					.append(' ');
-		}
-		if (_textDecorationOverlineButton.getSelection()) {
-			textDecoration.append(_textDecorationOverlineButton.getText())
-					.append(' ');
-		}
-		if (_textDecorationLineThroughButton.getSelection()) {
-			textDecoration.append(_textDecorationLineThroughButton.getText())
-					.append(' ');
-		}
-		if (_textDecorationBlinkButton.getSelection()) {
-			textDecoration.append(_textDecorationBlinkButton.getText()).append(
-					' ');
-		}
-		if (_textDecorationNoneButton.getSelection()) {
-			textDecoration.append(_textDecorationNoneButton.getText()).append(
-					' ');
-		}
-
-		return textDecoration.toString().trim();
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/BodyHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/BodyHelper.java
deleted file mode 100644
index 2a20b1a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/BodyHelper.java
+++ /dev/null
@@ -1,345 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.ArrayList;
-import java.util.Comparator;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.adapters.IBodyInfo;
-import org.eclipse.jst.pagedesigner.adapters.internal.BodyInfo;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition2;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * This class helps location insertion position to inside correct body or doc
- * prefix. NOTE: this class only doing limited support on doc level position
- * validation. Element specific position validation will be done in other
- * places.
- * 
- * @author mengbo
- */
-public class BodyHelper {
-	// bit flags used for child skipping.
-	/**
-	 * Bit flag for empty text node
-	 */
-	public static final int EMPTY_TEXT = 1;
-
-	/**
-	 * Bit flag for comment node
-	 */
-	public static final int COMMENT = 2;
-
-	/**
-	 * Bit flag for HEAD node
-	 */
-	public static final int HEADER = 3;
-
-	/**
-	 * 
-	 * @param child
-	 * @return boolean
-	 */
-	private static boolean isSkippableChild(Node parent, Node child, int flag) {
-		if ((flag & COMMENT) != 0 && child.getNodeType() == Node.COMMENT_NODE)
-			return true;
-		if ((flag & EMPTY_TEXT) != 0 && child instanceof IDOMText
-				&& ((IDOMText) child).isElementContentWhitespace())
-			return true;
-
-		if ((flag & HEADER) != 0 && child.getNodeType() == Node.ELEMENT_NODE) {
-			String uri = CMUtil.getElementNamespaceURI((Element) child);
-			IBodyInfo parentInfo = getBodyInfo((IDOMNode) parent);
-			if (parentInfo != null
-					&& parentInfo.isBodyHeader((IDOMNode) parent, uri,
-							((Element) child).getLocalName()))
-				return true;
-		}
-		return false;
-	}
-
-	/**
-	 * check whether uri/tag should be header of any body container that is
-	 * ancester of the start node.
-	 * 
-	 * @param start
-	 * @param uri
-	 * @param tag
-	 * @return IDOMNode
-	 */
-	public static IDOMNode findHeaderContainer(IDOMNode start, String uri,
-			String tag) {
-		while (start != null) {
-			IBodyInfo designInfo = getBodyInfo(start);
-			if (designInfo != null && designInfo.isBodyContainer(start)) {
-				if (designInfo.isBodyHeader(start, uri, tag))
-					return start;
-			}
-			start = (IDOMNode) start.getParentNode();
-		}
-		return null;
-	}
-
-	/**
-	 * find the closest body insertion point, to make it as deep as possible.
-	 * (Move into as more body as possible)
-	 * @param position 
-	 * @return IDOMPosition
-	 */
-	public static IDOMPosition findBodyInsertLocation(IDOMPosition position) {
-		// forward first.
-		Node reference = position.getNextSiblingNode();
-		Node container = position.getContainerNode();
-		while (reference != null) {
-			IBodyInfo info = getBodyInfo((IDOMNode) reference);
-			if (info != null && info.isBodyContainer((IDOMNode) reference)) {
-				// good, we find a body!
-				position = new DOMPosition(reference, 0);
-				return findBodyInsertLocation(position);
-			}
-			if (isSkippableChild(container, reference, EMPTY_TEXT | COMMENT
-					| HEADER)) {
-				reference = reference.getNextSibling();
-				continue;
-			}
-            break;
-		}
-
-		// backward
-		reference = position.getPreviousSiblingNode();
-		while (reference != null) {
-			IBodyInfo info = getBodyInfo((IDOMNode) reference);
-			if (info != null && info.isBodyContainer((IDOMNode) reference)) {
-				// good, we find a body!
-				position = new DOMPosition(reference, reference.getChildNodes()
-						.getLength());
-				return findBodyInsertLocation(position);
-			}
-			// XXX: not skip header here. So if there is some header with wrong
-			// location, we will respect user.
-			if (isSkippableChild(container, reference, EMPTY_TEXT | COMMENT)) {
-				reference = reference.getPreviousSibling();
-				continue;
-			}
-            break;
-		}
-
-		// not find any body at same level as the insertion point.
-		return position;
-	}
-
-	/**
-	 * The element type identified by "uri" and "tag" is going to be inserted
-	 * into the document. This method is used to adjust the insert position so
-	 * it can be put into correct body or header section.
-	 * @param uri 
-	 * @param tag 
-	 * @param position 
-	 * @return IDOMPosition
-	 * 
-	 */
-	public static IDOMPosition adjustInsertPosition(String uri, String tag,
-			IDOMPosition position) {
-		IDOMNode parent = (IDOMNode) position.getContainerNode();
-		IBodyInfo designInfo = getBodyInfo(parent);
-		if (designInfo == null) {
-			return position; // should not happen.
-		}
-
-		IDOMNode headerContainer = findHeaderContainer(parent, uri, tag);
-
-		if (headerContainer == null) {
-			// the new node is not header.
-			if (shouldIgnoreAdjust(uri, tag)) {
-				return position;
-			}
-
-			// new node is not body header. So should place inside the inner most
-			// body.
-			if (!designInfo.isBodyContainer(parent)) {
-				return position; // it's parent is not body, so we suggest
-				// it's parent already correctly located, and respect user's
-				// choice.
-			}
-
-			// ok, we are inside some body, but we don't know whether we are in
-			// the inner most body.
-			// try to find a body container at same level and see whether we can
-			// move into that body.
-			return findBodyInsertLocation(position);
-		}
-        // good, we find a body container and the new node should be header
-        // of it.
-        Node child = headerContainer.getFirstChild();
-
-        // if parent is different from headerContainer, then
-        // child!=referenceHolder[0] will always be true
-        while (child != null) // && child != refNode)
-        {
-        	Comparator comp = NodeLocationComparator.getInstance();
-        	// Currently the comparator deels with tags like taglib and
-        	// loadbundle particularly, comparasion result 0
-        	// means it didn't compare the tags.
-        	if (comp.compare(child, tag) < 0
-        			|| (comp.compare(child, tag) == 0 && isSkippableChild(
-        					headerContainer, child, COMMENT | EMPTY_TEXT
-        							| HEADER))) {
-        		child = child.getNextSibling();
-        	} else {
-        		break;
-        	}
-        }
-        if (child != null) {
-        	return new DOMRefPosition(child, false);
-        }
-        return new DOMPosition(parent, parent.getChildNodes()
-        		.getLength());
-	}
-
-	/**
-	 * Find the position to insert a header element into the specified parent.
-	 * 
-	 * @param uri
-	 * @param tag
-	 * @param parent
-	 * @param ref 
-	 */
-	public static void findHeaderInsertPosition(String uri, String tag,
-			Node parent, Node[] ref) {
-		Node child = parent.getFirstChild();
-		while (child != null) {
-			Comparator comp = NodeLocationComparator.getInstance();
-			if (comp.compare(child, tag) < 0
-					|| (comp.compare(child, tag) == 0 && isSkippableChild(
-							parent, child, COMMENT | EMPTY_TEXT | HEADER))) {
-				child = child.getNextSibling();
-			} else {
-				break;
-			}
-		}
-		ref[0] = child;
-		return;
-	}
-
-	/**
-	 * @param position
-	 * @param body
-	 * @param defaultPrefix
-	 * @return the new dom position based on the insert.  May return null if
-	 * insert fails.
-	 */
-	public static IDOMPosition insertBody(IDOMPosition position, QName body,
-			String defaultPrefix) {
-		IBodyInfo bodyInfo = getBodyInfo((IDOMNode) position.getContainerNode());
-
-		Node node = position.getContainerNode();
-		final Node originalContainer = node;
-		final Node nextSibling = position.getNextSiblingNode();
-
-		// create the body element first.
-		Document ownerDoc;
-		if (node instanceof Document) {
-			ownerDoc = (Document) node;
-		} else {
-			ownerDoc = node.getOwnerDocument();
-		}
-		if (ownerDoc == null) {
-			return null; // should not happen
-		}
-
-		final String prefix = JSPUtil.getOrCreatePrefix(((IDOMNode) node).getModel(),
-				body.getNamespaceURI(), defaultPrefix);
-		final Element ele = ownerDoc.createElement((prefix == null ? ""
-				: (prefix + ":"))
-				+ body.getLocalPart());
-
-		// need to find out the insertion point
-		while (node instanceof IDOMNode) {
-			if (bodyInfo.isBodyContainer((IDOMNode) node)) {
-				// ok, node is a body container.
-				// we could create the new node as child of node and move all
-				// node's none header children
-				// as children of the new node.
-
-				NodeList nl = node.getChildNodes();
-				ArrayList list = new ArrayList();
-				for (int i = 0; i < nl.getLength(); i++) {
-					Node child = nl.item(i);
-					if (isSkippableChild(node, child, HEADER | COMMENT
-							| EMPTY_TEXT)) {
-						continue;
-					}
-					list.add(nl.item(i));
-				}
-				for (int i = 0; i < list.size(); i++) {
-					ele.appendChild((Node) list.get(i));
-				}
-				node.appendChild(ele);
-
-				if (node == originalContainer) {
-					if (nextSibling == null) {
-						return new DOMRefPosition2(ele, true);
-					} else if (nextSibling.getParentNode() == ele) {
-						// next sibling is not in header part
-						return new DOMRefPosition(nextSibling, false);
-					} else {
-						return new DOMPosition(ele, 0);
-					}
-				}
-                return position;
-			}
-			node = node.getParentNode();
-		}
-		// should not happen, because document and documentfragment node will
-		// always be body node
-		// so if reach here, means the position is not in document.
-		return null;
-	}
-
-	/**
-	 * For certain special tags, do not following the "header"/"body" separation
-	 * and can't fit into the relocation process.
-	 * 
-	 * @param uri
-	 * @param tag
-	 * @return true if tag is an element that should be moved in response to 
-	 * body insert.
-	 */
-	public static boolean shouldIgnoreAdjust(String uri, String tag) {
-		// FIXME:
-		return (ITLDConstants.URI_HTML.equalsIgnoreCase(uri) && "script"
-				.equalsIgnoreCase(tag))
-				|| (ITLDConstants.URI_JSP.equals(uri));
-	}
-
-	/**
-	 * @param node
-	 * @return the body info corresponding to node (should we use a node adapter?)
-	 */
-	public static IBodyInfo getBodyInfo(IDOMNode node) {
-		// TODO: in the future, when bodyinfo is no longer singleton, we'll use
-		// adapter mechanism.
-		return BodyInfo.getInstance();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CacheManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CacheManager.java
deleted file mode 100644
index 5f513f4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CacheManager.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.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();
-
-	public CacheManager(ICacheEntryCreator creator, int maxSize) {
-		_creator = creator;
-		_maxSize = maxSize;
-		if (_maxSize <= 0) {
-			_maxSize = 10;
-		}
-	}
-
-	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;
-	}
-
-	public void disposeAll() {
-		_keys.clear();
-		for (Iterator iter = _map.keySet().iterator(); iter.hasNext();) {
-			Object key = iter.next();
-			Object entry = _map.get(key);
-			_creator.dispose(key, entry);
-		}
-		_map.clear();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CommandUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CommandUtil.java
deleted file mode 100644
index b86284f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CommandUtil.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.jst.pagedesigner.itemcreation.CreationData;
-import org.eclipse.jst.pagedesigner.itemcreation.ITagCreator;
-import org.eclipse.jst.pagedesigner.itemcreation.internal.TagCreationFactory;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CommandUtil {
-	private static final Logger _log = PDPlugin.getLogger(CommandUtil.class);
-
-	/**
-	 * @param tagItem
-	 * @param model
-	 * @param domPosition
-	 * @param customizationData 
-	 * @return the element inserted or null if failed
-	 */
-	public static Element excuteInsertion(TagToolPaletteEntry tagItem,
-			IDOMModel model, IDOMPosition domPosition, IAdaptable customizationData) {
-		try 
-		{	
-		    IStructuredDocument doc = model.getDocument().getStructuredDocument();
-		    
-		    IStructuredDocumentContext context =
-		        IStructuredDocumentContextFactory.INSTANCE.getContext(doc, -1);
-		    IWorkspaceContextResolver  resolver =
-		        IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context);
-		    
-		    IProject project = resolver.getProject();
-		    
-            final ITaglibDomainMetaDataModelContext modelContext = 
-                TaglibDomainMetaDataQueryHelper
-                    .createMetaDataModelContext(project, tagItem.getURI());
-
-            // TODO: note that the constructor currently causes the prefix defn
-            // to be added to the target doc.  This should be moved into
-            // an ensure method in the AbstractTagCreator
-            final CreationData creationData = 
-                new CreationData(tagItem, model, domPosition, modelContext, customizationData);
-
-		    ITagCreator tagCreator = 
-			    TagCreationFactory.getInstance().createTagCreator(creationData.getTagId());
-			
-			if (tagCreator == null)
-			{
-				return null;//should never get here!
-			}
-
-			return tagCreator.createTag(creationData);
-		} catch (Exception e) {
-			_log.error("Problem creating tag "+tagItem.getTagName()+" at:" + domPosition + "\n", e);
-		}
-        return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/DOMUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/DOMUtil.java
deleted file mode 100644
index c266580..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/DOMUtil.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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 {
-	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
-	 */
-	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
-	 */
-	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 tr
-	 * @param strings
-	 * @return
-	 */
-	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;
-	}
-
-	public static void removeAllChildren(Element ele) {
-		((ElementImpl) ele).removeChildNodes();
-	}
-
-	public static void setTextElementValue(Element ele, String value) {
-		removeAllChildren(ele);
-		Text txt = ele.getOwnerDocument().createTextNode(value);
-		ele.appendChild(txt);
-	}
-
-	/**
-	 * @param htmlElement
-	 * @param string
-	 * @param i
-	 * @return
-	 */
-	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
-	 */
-	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
-	 */
-	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;
-	}
-
-	public static void nodeToString(Node node, StringBuffer sb) {
-		int type = node.getNodeType();
-		switch (type) {
-		case Node.DOCUMENT_NODE:
-			sb.append("<?xml version=\"1.0\" ?>");
-			nodeToString(((Document) node).getDocumentElement(), sb);
-			break;
-
-		case Node.ELEMENT_NODE:
-			sb.append("<");
-			sb.append(node.getNodeName());
-			NamedNodeMap attrs = node.getAttributes();
-			for (int i = 0; i < attrs.getLength(); i++) {
-				Node attr = attrs.item(i);
-				sb.append(" " + attr.getNodeName() + "=\""
-						+ attr.getNodeValue() + "\"");
-			}
-
-			NodeList children = node.getChildNodes();
-			if (children != null) {
-				int len = children.getLength();
-				if (len != 0) {
-					sb.append(">");
-				}
-				for (int i = 0; i < len; i++) {
-					nodeToString(children.item(i), sb);
-				}
-			}
-			break;
-
-		case Node.ENTITY_REFERENCE_NODE:
-			sb.append("&");
-			sb.append(node.getNodeName());
-			sb.append(";");
-			break;
-
-		case Node.CDATA_SECTION_NODE:
-			sb.append("<![CDATA[");
-			sb.append(node.getNodeValue());
-			sb.append("]]>");
-			break;
-
-		case Node.TEXT_NODE:
-			sb.append(node.getNodeValue());
-			break;
-
-		case Node.PROCESSING_INSTRUCTION_NODE:
-			sb.append("<?");
-			sb.append(node.getNodeName());
-			String data = node.getNodeValue();
-			{
-				sb.append(" ");
-				sb.append(data);
-			}
-			sb.append("?>");
-			break;
-		}
-
-		if (type == Node.ELEMENT_NODE) {
-			if (node.getFirstChild() != null) {
-				sb.append("</");
-				sb.append(node.getNodeName());
-				sb.append(">");
-			} else {
-				sb.append("/>");
-			}
-
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/EntityMap.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/EntityMap.java
deleted file mode 100644
index 14b7213..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/EntityMap.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.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);
-
-	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).
-	 */
-	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 ";"
-	 */
-	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 9e2a880..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLSpecialCharHelper.java
+++ /dev/null
@@ -1,421 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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(new Integer(34), "&quot;"); //$NON-NLS-1$
-		_table.put(new Integer(38), "&amp;"); //$NON-NLS-1$
-		_table.put(new Integer(60), "&lt;"); //$NON-NLS-1$
-		_table.put(new Integer(62), "&gt;"); //$NON-NLS-1$
-
-		_table.put(new Integer(160), "&nbsp;"); //$NON-NLS-1$
-		_table.put(new Integer(161), "&iexcl;"); //$NON-NLS-1$
-		_table.put(new Integer(162), "&cent;"); //$NON-NLS-1$
-		_table.put(new Integer(163), "&pound;"); //$NON-NLS-1$
-		_table.put(new Integer(164), "&curren;"); //$NON-NLS-1$
-		_table.put(new Integer(165), "&yen;"); //$NON-NLS-1$
-		_table.put(new Integer(166), "&brvbar;"); //$NON-NLS-1$
-		_table.put(new Integer(167), "&sect;"); //$NON-NLS-1$
-		_table.put(new Integer(168), "&uml;"); //$NON-NLS-1$
-		_table.put(new Integer(169), "&copy;"); //$NON-NLS-1$
-		_table.put(new Integer(170), "&ordf;"); //$NON-NLS-1$
-		_table.put(new Integer(171), "&laquo;"); //$NON-NLS-1$
-		_table.put(new Integer(172), "&not;"); //$NON-NLS-1$
-		_table.put(new Integer(173), "&shy;"); //$NON-NLS-1$
-		_table.put(new Integer(174), "&reg;"); //$NON-NLS-1$
-		_table.put(new Integer(175), "&macr;"); //$NON-NLS-1$
-		_table.put(new Integer(176), "&deg;"); //$NON-NLS-1$
-		_table.put(new Integer(177), "&plusmn;"); //$NON-NLS-1$
-		_table.put(new Integer(178), "&sup2;"); //$NON-NLS-1$
-		_table.put(new Integer(179), "&sup3;"); //$NON-NLS-1$
-		_table.put(new Integer(180), "&acute;"); //$NON-NLS-1$
-		_table.put(new Integer(181), "&micro;"); //$NON-NLS-1$
-		_table.put(new Integer(182), "&para;"); //$NON-NLS-1$
-		_table.put(new Integer(183), "&middot;"); //$NON-NLS-1$
-		_table.put(new Integer(184), "&cedil;"); //$NON-NLS-1$
-		_table.put(new Integer(185), "&sup1;"); //$NON-NLS-1$
-		_table.put(new Integer(186), "&ordm;"); //$NON-NLS-1$
-		_table.put(new Integer(187), "&raquo;"); //$NON-NLS-1$
-		_table.put(new Integer(188), "&frac14;"); //$NON-NLS-1$
-		_table.put(new Integer(189), "&frac12;"); //$NON-NLS-1$
-		_table.put(new Integer(190), "&frac34;"); //$NON-NLS-1$
-		_table.put(new Integer(191), "&iquest;"); //$NON-NLS-1$
-		_table.put(new Integer(192), "&Agrave;"); //$NON-NLS-1$
-		_table.put(new Integer(193), "&Aacute;"); //$NON-NLS-1$
-		_table.put(new Integer(194), "&Acirc;"); //$NON-NLS-1$
-		_table.put(new Integer(195), "&Atilde;"); //$NON-NLS-1$
-		_table.put(new Integer(196), "&Auml;"); //$NON-NLS-1$
-		_table.put(new Integer(197), "&Aring;"); //$NON-NLS-1$
-		_table.put(new Integer(198), "&AElig;"); //$NON-NLS-1$
-		_table.put(new Integer(199), "&Ccedil;"); //$NON-NLS-1$
-		_table.put(new Integer(200), "&Egrave;"); //$NON-NLS-1$
-		_table.put(new Integer(201), "&Eacute;"); //$NON-NLS-1$
-		_table.put(new Integer(202), "&Ecirc;"); //$NON-NLS-1$
-		_table.put(new Integer(203), "&Euml;"); //$NON-NLS-1$
-		_table.put(new Integer(204), "&Igrave;"); //$NON-NLS-1$
-		_table.put(new Integer(205), "&Iacute;"); //$NON-NLS-1$
-		_table.put(new Integer(206), "&Icirc;"); //$NON-NLS-1$
-		_table.put(new Integer(207), "&Iuml;"); //$NON-NLS-1$
-		_table.put(new Integer(208), "&ETH;"); //$NON-NLS-1$
-		_table.put(new Integer(209), "&Ntilde;"); //$NON-NLS-1$
-		_table.put(new Integer(210), "&Ograve;"); //$NON-NLS-1$
-		_table.put(new Integer(211), "&Oacute;"); //$NON-NLS-1$
-		_table.put(new Integer(212), "&Ocirc;"); //$NON-NLS-1$
-		_table.put(new Integer(213), "&Otilde;"); //$NON-NLS-1$
-		_table.put(new Integer(214), "&Ouml;"); //$NON-NLS-1$
-		_table.put(new Integer(215), "&times;"); //$NON-NLS-1$
-		_table.put(new Integer(216), "&Oslash;"); //$NON-NLS-1$
-		_table.put(new Integer(217), "&Ugrave;"); //$NON-NLS-1$
-		_table.put(new Integer(218), "&Uacute;"); //$NON-NLS-1$
-		_table.put(new Integer(219), "&Ucirc;"); //$NON-NLS-1$
-		_table.put(new Integer(220), "&Uuml;"); //$NON-NLS-1$
-		_table.put(new Integer(221), "&Yacute;"); //$NON-NLS-1$
-		_table.put(new Integer(222), "&THORN;"); //$NON-NLS-1$
-		_table.put(new Integer(223), "&szlig;"); //$NON-NLS-1$
-		_table.put(new Integer(224), "&agrave;"); //$NON-NLS-1$
-		_table.put(new Integer(225), "&aacute;"); //$NON-NLS-1$
-		_table.put(new Integer(226), "&acirc;"); //$NON-NLS-1$
-		_table.put(new Integer(227), "&atilde;"); //$NON-NLS-1$
-		_table.put(new Integer(228), "&auml;"); //$NON-NLS-1$
-		_table.put(new Integer(229), "&aring;"); //$NON-NLS-1$
-		_table.put(new Integer(230), "&aelig;"); //$NON-NLS-1$
-		_table.put(new Integer(231), "&ccedil;"); //$NON-NLS-1$
-		_table.put(new Integer(232), "&egrave;"); //$NON-NLS-1$
-		_table.put(new Integer(233), "&eacute;"); //$NON-NLS-1$
-		_table.put(new Integer(234), "&ecirc;"); //$NON-NLS-1$
-		_table.put(new Integer(235), "&euml;"); //$NON-NLS-1$
-		_table.put(new Integer(236), "&igrave;"); //$NON-NLS-1$
-		_table.put(new Integer(237), "&iacute;"); //$NON-NLS-1$
-		_table.put(new Integer(238), "&icirc;"); //$NON-NLS-1$
-		_table.put(new Integer(239), "&iuml;"); //$NON-NLS-1$
-		_table.put(new Integer(240), "&eth;"); //$NON-NLS-1$
-		_table.put(new Integer(241), "&ntilde;"); //$NON-NLS-1$
-		_table.put(new Integer(242), "&ograve;"); //$NON-NLS-1$
-		_table.put(new Integer(243), "&oacute;"); //$NON-NLS-1$
-		_table.put(new Integer(244), "&ocirc;"); //$NON-NLS-1$
-		_table.put(new Integer(245), "&otilde;"); //$NON-NLS-1$
-		_table.put(new Integer(246), "&ouml;"); //$NON-NLS-1$
-		_table.put(new Integer(247), "&divide;"); //$NON-NLS-1$
-		_table.put(new Integer(248), "&oslash;"); //$NON-NLS-1$
-		_table.put(new Integer(249), "&ugrave;"); //$NON-NLS-1$
-		_table.put(new Integer(250), "&uacute;"); //$NON-NLS-1$
-		_table.put(new Integer(251), "&ucirc;"); //$NON-NLS-1$
-		_table.put(new Integer(252), "&uuml;"); //$NON-NLS-1$
-		_table.put(new Integer(253), "&yacute;"); //$NON-NLS-1$
-		_table.put(new Integer(254), "&thorn;"); //$NON-NLS-1$
-		_table.put(new Integer(255), "&yuml;"); //$NON-NLS-1$
-		_table.put(new Integer(402), "&fnof;"); //$NON-NLS-1$
-		_table.put(new Integer(913), "&Alpha;"); //$NON-NLS-1$
-		_table.put(new Integer(914), "&Beta;"); //$NON-NLS-1$
-		_table.put(new Integer(915), "&Gamma;"); //$NON-NLS-1$
-		_table.put(new Integer(916), "&Delta;"); //$NON-NLS-1$
-		_table.put(new Integer(917), "&Epsilon;"); //$NON-NLS-1$
-		_table.put(new Integer(918), "&Zeta;"); //$NON-NLS-1$
-		_table.put(new Integer(919), "&Eta;"); //$NON-NLS-1$
-		_table.put(new Integer(920), "&Theta;"); //$NON-NLS-1$
-		_table.put(new Integer(921), "&Iota;"); //$NON-NLS-1$
-		_table.put(new Integer(922), "&Kappa;"); //$NON-NLS-1$
-		_table.put(new Integer(923), "&Lambda;"); //$NON-NLS-1$
-		_table.put(new Integer(924), "&Mu;"); //$NON-NLS-1$
-		_table.put(new Integer(925), "&Nu;"); //$NON-NLS-1$
-		_table.put(new Integer(926), "&Xi;"); //$NON-NLS-1$
-		_table.put(new Integer(927), "&Omicron;"); //$NON-NLS-1$
-		_table.put(new Integer(928), "&Pi;"); //$NON-NLS-1$
-		_table.put(new Integer(929), "&Rho;"); //$NON-NLS-1$
-		_table.put(new Integer(931), "&Sigma;"); //$NON-NLS-1$
-		_table.put(new Integer(932), "&Tau;"); //$NON-NLS-1$
-		_table.put(new Integer(933), "&Upsilon;"); //$NON-NLS-1$
-		_table.put(new Integer(934), "&Phi;"); //$NON-NLS-1$
-		_table.put(new Integer(935), "&Chi;"); //$NON-NLS-1$
-		_table.put(new Integer(936), "&Psi;"); //$NON-NLS-1$
-		_table.put(new Integer(937), "&Omega;"); //$NON-NLS-1$
-		_table.put(new Integer(945), "&alpha;"); //$NON-NLS-1$
-		_table.put(new Integer(946), "&beta;"); //$NON-NLS-1$
-		_table.put(new Integer(947), "&gamma;"); //$NON-NLS-1$
-		_table.put(new Integer(948), "&delta;"); //$NON-NLS-1$
-		_table.put(new Integer(949), "&epsilon;"); //$NON-NLS-1$
-		_table.put(new Integer(950), "&zeta;"); //$NON-NLS-1$
-		_table.put(new Integer(951), "&eta;"); //$NON-NLS-1$
-		_table.put(new Integer(952), "&theta;"); //$NON-NLS-1$
-		_table.put(new Integer(953), "&iota;"); //$NON-NLS-1$
-		_table.put(new Integer(954), "&kappa;"); //$NON-NLS-1$
-		_table.put(new Integer(955), "&lambda;"); //$NON-NLS-1$
-		_table.put(new Integer(956), "&mu;"); //$NON-NLS-1$
-		_table.put(new Integer(957), "&nu;"); //$NON-NLS-1$
-		_table.put(new Integer(958), "&xi;"); //$NON-NLS-1$
-		_table.put(new Integer(959), "&omicron;"); //$NON-NLS-1$
-		_table.put(new Integer(960), "&pi;"); //$NON-NLS-1$
-		_table.put(new Integer(961), "&rho;"); //$NON-NLS-1$
-		_table.put(new Integer(962), "&sigmaf;"); //$NON-NLS-1$
-		_table.put(new Integer(963), "&sigma;"); //$NON-NLS-1$
-		_table.put(new Integer(964), "&tau;"); //$NON-NLS-1$
-		_table.put(new Integer(965), "&upsilon;"); //$NON-NLS-1$
-		_table.put(new Integer(966), "&phi;"); //$NON-NLS-1$
-		_table.put(new Integer(967), "&chi;"); //$NON-NLS-1$
-		_table.put(new Integer(968), "&psi;"); //$NON-NLS-1$
-		_table.put(new Integer(969), "&omega;"); //$NON-NLS-1$
-		_table.put(new Integer(977), "&thetasym;"); //$NON-NLS-1$
-		_table.put(new Integer(978), "&upsih;"); //$NON-NLS-1$
-		_table.put(new Integer(982), "&piv;"); //$NON-NLS-1$
-		_table.put(new Integer(8226), "&bull;"); //$NON-NLS-1$
-		_table.put(new Integer(8230), "&hellip;"); //$NON-NLS-1$
-		_table.put(new Integer(8242), "&prime;"); //$NON-NLS-1$
-		_table.put(new Integer(8243), "&Prime;"); //$NON-NLS-1$
-		_table.put(new Integer(8254), "&oline;"); //$NON-NLS-1$
-		_table.put(new Integer(8260), "&frasl;"); //$NON-NLS-1$
-		_table.put(new Integer(8472), "&weierp;"); //$NON-NLS-1$
-		_table.put(new Integer(8465), "&image;"); //$NON-NLS-1$
-		_table.put(new Integer(8476), "&real;"); //$NON-NLS-1$
-		_table.put(new Integer(8482), "&trade;"); //$NON-NLS-1$
-		_table.put(new Integer(8501), "&alefsym;"); //$NON-NLS-1$
-		_table.put(new Integer(8592), "&larr;"); //$NON-NLS-1$
-		_table.put(new Integer(8593), "&uarr;"); //$NON-NLS-1$
-		_table.put(new Integer(8594), "&rarr;"); //$NON-NLS-1$
-		_table.put(new Integer(8595), "&darr;"); //$NON-NLS-1$
-		_table.put(new Integer(8596), "&harr;"); //$NON-NLS-1$
-		_table.put(new Integer(8629), "&crarr;"); //$NON-NLS-1$
-		_table.put(new Integer(8656), "&lArr;"); //$NON-NLS-1$
-		_table.put(new Integer(8657), "&uArr;"); //$NON-NLS-1$
-		_table.put(new Integer(8658), "&rArr;"); //$NON-NLS-1$
-		_table.put(new Integer(8659), "&dArr;"); //$NON-NLS-1$
-		_table.put(new Integer(8660), "&hArr;"); //$NON-NLS-1$
-		_table.put(new Integer(8704), "&forall;"); //$NON-NLS-1$
-		_table.put(new Integer(8706), "&part;"); //$NON-NLS-1$
-		_table.put(new Integer(8707), "&exist;"); //$NON-NLS-1$
-		_table.put(new Integer(8709), "&empty;"); //$NON-NLS-1$
-		_table.put(new Integer(8711), "&nabla;"); //$NON-NLS-1$
-		_table.put(new Integer(8712), "&isin;"); //$NON-NLS-1$
-		_table.put(new Integer(8713), "&notin;"); //$NON-NLS-1$
-		_table.put(new Integer(8715), "&ni;"); //$NON-NLS-1$
-		_table.put(new Integer(8719), "&prod;"); //$NON-NLS-1$
-		_table.put(new Integer(8722), "&sum;"); //$NON-NLS-1$
-		_table.put(new Integer(8722), "&minus;"); //$NON-NLS-1$
-		_table.put(new Integer(8727), "&lowast;"); //$NON-NLS-1$
-		_table.put(new Integer(8730), "&radic;"); //$NON-NLS-1$
-		_table.put(new Integer(8733), "&prop;"); //$NON-NLS-1$
-		_table.put(new Integer(8734), "&infin;"); //$NON-NLS-1$
-		_table.put(new Integer(8736), "&ang;"); //$NON-NLS-1$
-		_table.put(new Integer(8869), "&and;"); //$NON-NLS-1$
-		_table.put(new Integer(8870), "&or;"); //$NON-NLS-1$
-		_table.put(new Integer(8745), "&cap;"); //$NON-NLS-1$
-		_table.put(new Integer(8746), "&cup;"); //$NON-NLS-1$
-		_table.put(new Integer(8747), "&int;"); //$NON-NLS-1$
-		_table.put(new Integer(8756), "&there4;"); //$NON-NLS-1$
-		_table.put(new Integer(8764), "&sim;"); //$NON-NLS-1$
-		_table.put(new Integer(8773), "&cong;"); //$NON-NLS-1$
-		_table.put(new Integer(8773), "&asymp;"); //$NON-NLS-1$
-		_table.put(new Integer(8800), "&ne;"); //$NON-NLS-1$
-		_table.put(new Integer(8801), "&equiv;"); //$NON-NLS-1$
-		_table.put(new Integer(8804), "&le;"); //$NON-NLS-1$
-		_table.put(new Integer(8805), "&ge;"); //$NON-NLS-1$
-		_table.put(new Integer(8834), "&sub;"); //$NON-NLS-1$
-		_table.put(new Integer(8835), "&sup;"); //$NON-NLS-1$
-		_table.put(new Integer(8836), "&nsub;"); //$NON-NLS-1$
-		_table.put(new Integer(8838), "&sube;"); //$NON-NLS-1$
-		_table.put(new Integer(8839), "&supe;"); //$NON-NLS-1$
-		_table.put(new Integer(8853), "&oplus;"); //$NON-NLS-1$
-		_table.put(new Integer(8855), "&otimes;"); //$NON-NLS-1$
-		_table.put(new Integer(8869), "&perp;"); //$NON-NLS-1$
-		_table.put(new Integer(8901), "&sdot;"); //$NON-NLS-1$
-		_table.put(new Integer(8968), "&lceil;"); //$NON-NLS-1$
-		_table.put(new Integer(8969), "&rceil;"); //$NON-NLS-1$
-		_table.put(new Integer(8970), "&lfloor;"); //$NON-NLS-1$
-		_table.put(new Integer(8971), "&rfloor;"); //$NON-NLS-1$
-		_table.put(new Integer(9001), "&lang;"); //$NON-NLS-1$
-		_table.put(new Integer(9002), "&rang;"); //$NON-NLS-1$
-		_table.put(new Integer(9674), "&loz;"); //$NON-NLS-1$
-		_table.put(new Integer(9824), "&spades;"); //$NON-NLS-1$
-		_table.put(new Integer(9827), "&clubs;"); //$NON-NLS-1$
-		_table.put(new Integer(9829), "&hearts;"); //$NON-NLS-1$
-		_table.put(new Integer(9830), "&diams;"); //$NON-NLS-1$
-
-		_table.put(new Integer(338), "&OElig;"); //$NON-NLS-1$
-		_table.put(new Integer(339), "&oelig;"); //$NON-NLS-1$
-		_table.put(new Integer(352), "&Scaron;"); //$NON-NLS-1$
-		_table.put(new Integer(353), "&scaron;"); //$NON-NLS-1$
-		_table.put(new Integer(376), "&Yuml;"); //$NON-NLS-1$
-		_table.put(new Integer(710), "&circ;"); //$NON-NLS-1$
-		_table.put(new Integer(732), "&tilde;"); //$NON-NLS-1$
-		_table.put(new Integer(8194), "&ensp;"); //$NON-NLS-1$
-		_table.put(new Integer(8195), "&emsp;"); //$NON-NLS-1$
-		_table.put(new Integer(8201), "&thinsp;"); //$NON-NLS-1$
-		_table.put(new Integer(8204), "&zwnj;"); //$NON-NLS-1$
-		_table.put(new Integer(8205), "&zwj;"); //$NON-NLS-1$
-		_table.put(new Integer(8206), "&lrm;"); //$NON-NLS-1$
-		_table.put(new Integer(8207), "&rlm;"); //$NON-NLS-1$
-		_table.put(new Integer(8211), "&ndash;"); //$NON-NLS-1$
-		_table.put(new Integer(151), "&mdash;"); //$NON-NLS-1$
-		_table.put(new Integer(8216), "&lsquo;"); //$NON-NLS-1$
-		_table.put(new Integer(8217), "&rsquo;"); //$NON-NLS-1$
-		_table.put(new Integer(8218), "&sbquo;"); //$NON-NLS-1$
-		_table.put(new Integer(8220), "&ldquo;"); //$NON-NLS-1$
-		_table.put(new Integer(8221), "&rdquo;"); //$NON-NLS-1$
-		_table.put(new Integer(8222), "&bdquo;"); //$NON-NLS-1$
-		_table.put(new Integer(8224), "&dagger;"); //$NON-NLS-1$
-		_table.put(new Integer(8225), "&Dagger;"); //$NON-NLS-1$
-		_table.put(new Integer(8240), "&permil;"); //$NON-NLS-1$
-		_table.put(new Integer(8249), "&lsaquo;"); //$NON-NLS-1$
-		_table.put(new Integer(8250), "&rsaquo;"); //$NON-NLS-1$
-		_table.put(new Integer(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);
-		}
-	}
-
-	/**
-	 * @return if not in the special list
-	 */
-	public static String getSpecial(int ch) {
-		return (String) _table.get(new Integer(ch));
-	}
-
-	public static int getSpecial(String str) {
-		Integer result = (Integer) _reverse.get(str);
-		if (result == null) {
-			return -1;
-		}
-        return result.intValue();
-	}
-
-	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);
-				}
-			}
-		}
-	}
-
-	public static StringBuffer encode(String str, StringBuffer result) {
-		return encode(str, 0, str.length(), result);
-	}
-
-	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;
-	}
-
-	public static StringBuffer decode(String str, StringBuffer buffer)
-			throws RuntimeException {
-		return decode(str, 0, str.length(), buffer);
-	}
-
-	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;
-	}
-
-	public static int decodeEntity(String entityRef) {
-		Integer result = (Integer) _reverse.get(entityRef);
-		if (result != null) {
-			return result.intValue();
-		}
-		if (entityRef.length() >= 2 && entityRef.charAt(1) == '#') {
-			String s = entityRef.substring(2);
-			if (s.endsWith(";")) {
-				s = s.substring(0, s.length() - 1);
-			}
-			try {
-				return Integer.parseInt(s);
-			} catch (Exception ex) {
-				// ignore
-			}
-		}
-		return -1;
-	}
-}
-
-// FIXME: will it better to use Character instead of Integer ? (yang)
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLUtil.java
deleted file mode 100644
index f469858..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLUtil.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.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
-	 * @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
-	 */
-	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;
-	}
-
-	public static final String[] HiddenTags = new String[] {
-			IHTMLConstants.TAG_APPLET, IHTMLConstants.TAG_AREA,
-			IHTMLConstants.TAG_BASE, IHTMLConstants.TAG_BASEFONT,
-			IHTMLConstants.TAG_HEAD, IHTMLConstants.TAG_IFRAME,
-			IHTMLConstants.TAG_ISINDEX, IHTMLConstants.TAG_META,
-			IHTMLConstants.TAG_NOEMBED, IHTMLConstants.TAG_NOFRAMES,
-			IHTMLConstants.TAG_NOSCRIPT, IHTMLConstants.TAG_SCRIPT,
-			IHTMLConstants.TAG_STYLE, IHTMLConstants.TAG_TITLE,
-			IHTMLConstants.TAG_PARAM };
-
-	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 data
-	 * @return
-	 * @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 8edf749..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ICacheEntryCreator.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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;
-
-public interface ICacheEntryCreator {
-	public Object createEntry(Object key);
-
-	public void dispose(Object key, Object entry);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ImageResolver.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ImageResolver.java
deleted file mode 100644
index 29305bf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ImageResolver.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ImageResolver {
-	/**
-	 * 
-	 * @param element
-	 * @param attrName
-	 * @return
-	 */
-	static String getResolvedURL(Element element, String attrName) {
-		URIResolver resolver = null;
-		if (element instanceof IDOMNode) {
-			resolver = ((IDOMNode) element).getModel().getResolver();
-		}
-		if (null == resolver) {
-			return null;
-		}
-		String src = DOMUtil.getAttributeIgnoreCase(element, attrName);
-		if (src != null && src.length() > 0) {
-			return resolver.getLocationByURI(src);
-		}
-		return null;
-	}
-
-	/**
-	 * given the element and an attribute name identifying the src of the image,
-	 * create a image.
-	 * 
-	 * @param element
-	 * @param attrName
-	 * @return the new image
-	 */
-	public static Image initializeImage(Element element, String attrName) {
-		String url = getResolvedURL(element, attrName);
-		if (url == null) {
-			return null;
-		}
-		Image img = null;
-		int colonIndex = url.indexOf(":");
-		int slashIndex = url.indexOf("/");
-		if (colonIndex != -1 && (slashIndex != -1 && colonIndex < slashIndex)) {
-			//the url seems to have a protocol, so try to load it as a URL
-			try {
-				URL urlObj = new URL(url);
-				ImageDescriptor imgDesc = ImageDescriptor.createFromURL(urlObj);
-				img = imgDesc.createImage(false);
-			} catch(MalformedURLException mfe) {
-				//attempt to load as a file
-				try {
-					img = new Image(null, url);
-				} catch(SWTException se) {
-					//img remains null on return
-				}
-			} catch(SWTException se) {
-				//img remains null on return
-			}
-		} else {
-			//no protocol, so load it as a file
-			try {
-				img = new Image(null, url);
-			} catch(SWTException se) {
-				//img remains null on return
-			}
-		}
-		return img;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/IntFlexArray.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/IntFlexArray.java
deleted file mode 100644
index 0e2ccc1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/IntFlexArray.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.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;
-
-	public IntFlexArray() {
-		this(10);
-	}
-
-	public IntFlexArray(int initCapacity) {
-		if (initCapacity <= 0)
-			initCapacity = 10;
-		array = new int[initCapacity];
-	}
-
-	public void setAt(int idx, int obj) {
-		ensureCapacity(idx + 1);
-		array[idx] = obj;
-		if (idx + 1 > size)
-			size = idx + 1;
-	}
-
-	public int getAt(int idx) {
-		if (idx < array.length)
-			return array[idx];
-        return 0;
-	}
-
-	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 99526d9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JSPUtil.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.pagedesigner.utils;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.jsp.core.internal.contentmodel.TaglibController;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TLDCMDocumentManager;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TaglibTracker;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.taglib.TaglibIndex;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.wst.html.core.internal.format.HTMLFormatProcessorImpl;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-/**
- * utility class for JSP related information.
- * 
- * @author mengbo
- */
-public class JSPUtil {
-	/**
-	 * find out whether the specified taglib has been defined in the IDOMModel.
-	 * If found, then return the prefix. If can't find, then will try to add a
-	 * taglib declaration into the model, and try to use the specified default
-	 * prefix
-	 * 
-	 * @param model
-	 * @param uri
-	 * @param defaultPrefix 
-	 * @return prefix
-	 */
-	public static String getOrCreatePrefix(IDOMModel model, String uri,
-			String defaultPrefix) {
-		return getOrCreatePrefix(model, uri, defaultPrefix, null);
-	}
-
-	/**
-	 * 
-	 * @param model
-	 * @param uri
-	 * @param defaultPrefix
-	 * @param nodes
-	 *            if a taglib node is created, then the created tag lib node is
-	 *            returned in this.  In the case of xml format, it is the attribute node on
-	 *            jsp:root
-	 * @return prefix
-	 */
-	public static String getOrCreatePrefix(IDOMModel model, String uri,
-			String defaultPrefix, Node[] nodes) {
-	
-		String prefix = getPrefix(model, uri);
-		if (prefix != null) {
-			return prefix;
-		}
-
-		prefix = findUnusedPrefix(model, defaultPrefix);
-
-		//need proper API to determine xml type... this may need to change in future
-		if (! model.getDocument().isXMLType()){
-			// TODO: should create the taglib inside the IDOMModel
-			Node[] ref = new Node[1];
-			BodyHelper.findHeaderInsertPosition(ITLDConstants.URI_JSP, "taglib",
-					model.getDocument(), ref);
-			
-			Element ele = model.getDocument().createElement("jsp:directive.taglib");
-			((IDOMElement) ele).setJSPTag(true);
-			ele.setAttribute(ICSSPropertyID.ATTR_URI, uri);
-			ele.setAttribute(ICSSPropertyID.ATTR_PREFIX, prefix);
-			if (nodes != null && nodes.length > 0) {
-				nodes[0] = ele;
-			}
-			model.getDocument().insertBefore(ele, ref[0]);
-			new HTMLFormatProcessorImpl().formatNode(ele);
-		}
-		else {//xml format
-			//find root element
-			boolean tldRefExists = false;
-			Element root = getRootElement(model);
-			if (root != null){				
-				NamedNodeMap attrs = root.getAttributes();
-				for (int i=0;i<attrs.getLength();i++){
-					Attr a = (Attr)attrs.item(i);
-					//is the taglib uri already declared?
-					if (a.getValue().equals(uri)){
-						tldRefExists = true;
-						break;
-					}
-				}
-				if (!tldRefExists){
-					//create attribute
-					Attr a = model.getDocument().createAttribute("xmlns:"+prefix);
-					a.setValue(uri);
-					root.setAttributeNode(a);
-					new HTMLFormatProcessorImpl().formatNode(root);
-					
-					//duplicating what non-xml case does... no callerd making use of this currently
-					if (nodes != null && nodes.length > 0) {
-						nodes[0] = a;
-					}
-				}
-			}				
-		}
-		return prefix;
-	}
-
-	private static Element getRootElement(IDOMModel model) {
-		Document docNode = EditModelQuery.getDocumentNode(model.getDocument());
-		return docNode.getDocumentElement();
-	}
-
-	/**
-	 * Return prefix for taglib if declared in jsp file
-	 * @param model
-	 * @param uri
-	 * @return null means this is tld is not declared in the jsp file
-	 */
-	public static String getPrefix(IDOMModel model, String uri) {
-		TLDCMDocumentManager m = TaglibController.getTLDCMDocumentManager(model
-				.getStructuredDocument());
-		if (m == null) {
-		    // if the doc manager has nothing but the type is XML,
-		    // then see if the prefix is encoded as a namespace in
-		    // the doc root
-		    if (model.getDocument().isXMLType())
-		    {
-		        Element root = getRootElement(model);
-	            if (root != null){              
-	                NamedNodeMap attrs = root.getAttributes();
-	                for (int i=0;i<attrs.getLength();i++){
-	                    Attr a = (Attr)attrs.item(i);
-	                    //is the taglib uri already declared?
-	                    if (a.getValue().equals(uri)
-	                            && a.getName().startsWith("xmlns:"))
-	                    {
-	                        String prefix =  a.getNodeName().substring("xmlns:".length());
-	                        
-	                        if ("".equals(prefix))
-	                        {
-	                            prefix = null;
-	                        }
-	                        return prefix;
-	                    }
-	                }
-	            }
-		    }
-			return null;
-		}
-		List trackers = m.getTaglibTrackers();
-		for (Iterator iter = trackers.iterator(); iter.hasNext();) {
-			TaglibTracker tracker = (TaglibTracker) iter.next();
-			if (uri.equals(tracker.getURI())) {
-				return tracker.getPrefix();
-			}
-            CMDocument cmdoc = tracker.getDocument();
-            if (cmdoc instanceof TLDDocument
-            		&& uri.equals(((TLDDocument) cmdoc).getUri())) {
-            	return tracker.getPrefix();
-            }
-		}
-		return null;
-	}
-
-	/**
-	 * create specified taglib declaration as jsp directive element
-	 * 
-	 * @param model
-	 * @param uri
-	 * @param prefix
-	 * @return Element
-	 */
-	public static Element createTaglibDeclaration(IDOMModel model, String uri,
-			String prefix) {
-		Node[] ref = new Node[1];
-		BodyHelper.findHeaderInsertPosition(ITLDConstants.URI_JSP, "taglib",
-				model.getDocument(), ref);
-		Element ele = model.getDocument().createElement("jsp:directive.taglib");
-		((IDOMElement) ele).setJSPTag(true);
-		ele.setAttribute("uri", uri);
-		ele.setAttribute("prefix", prefix);
-		model.getDocument().insertBefore(ele, ref[0]);
-		return ele;
-	}
-
-	/**
-	 * Return prefix to use based upon the suggestion.   
-	 * Appends an integer until unique, if suggestion was used.
-	 * @param model
-	 * @param suggestion
-	 * @return prefix
-	 */
-	public static String findUnusedPrefix(IDOMModel model, String suggestion) {
-		if (suggestion == null) {
-			suggestion = "p";
-		}
-		TLDCMDocumentManager m = TaglibController.getTLDCMDocumentManager(model
-				.getStructuredDocument());
-		if (m == null) {
-			return suggestion;
-		}
-		List trackers = m.getTaglibTrackers();
-		Set map = new HashSet();
-		for (Iterator iter = trackers.iterator(); iter.hasNext();) {
-			TaglibTracker tracker = (TaglibTracker) iter.next();
-			map.add(tracker.getPrefix());
-		}
-		if (!map.contains(suggestion)) {
-			return suggestion;
-		}
-		for (int i = 1;; i++) {
-			if (!map.contains(suggestion + i)) {
-				return suggestion + i;
-			}
-		}
-	}
-
-	/**
-	 * given the prefix, find the corresponding jsp tld URI.
-	 * 
-	 * @param model
-	 * @param prefix
-	 * @return prefix
-	 */
-	public static String findURIForPrefix(IDOMModel model, String prefix) {
-		if (prefix == null || model == null) {
-			return null;
-		}
-		TLDCMDocumentManager m = TaglibController.getTLDCMDocumentManager(model
-				.getStructuredDocument());
-		if (m == null) {
-			return null;
-		}
-		List trackers = m.getTaglibTrackers();
-		for (Iterator iter = trackers.iterator(); iter.hasNext();) {
-			TaglibTracker tracker = (TaglibTracker) iter.next();
-			if (prefix.equals(tracker.getPrefix())) {
-				CMDocument cmdoc = tracker.getDocument();
-				if (cmdoc instanceof TLDDocument) {
-					return ((TLDDocument) cmdoc).getUri();
-				}
-                break; // fall out and return null
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * judge whether the the baseFile belonged project can support uri specified
-	 * tag lib
-	 * 
-	 * @param uri
-	 *            tag lib uri
-	 * @param baseFile
-	 * @return boolean
-	 */
-	public static boolean supportTaglib(String uri, IFile baseFile) {
-		IPath location = baseFile.getLocation();
-		if (location != null) {
-			return TaglibIndex.resolve(location.toString(), uri, false) != null;
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JavaUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JavaUtil.java
deleted file mode 100644
index 2cc3eb7..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.IJavaProject;
-import org.eclipse.jdt.internal.core.JarEntryFile;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- */
-public class JavaUtil {
-	/**
-	 * 
-	 * @param javaProject
-	 * @param parent
-	 * @return
-	 * @author mengbo
-	 */
-	public static IPath getPathOnClasspath(IJavaProject javaProject,
-			Object parent) {
-		IPath result = null;
-		if (javaProject == null || parent == null) {
-			return new Path("");
-		}
-		IClasspathEntry[] entries = javaProject.readRawClasspath();
-		IPath classPath = null;
-		if (parent instanceof IResource) {
-			if (((javaProject != null) && !javaProject
-					.isOnClasspath((IResource) parent))) {
-				return new Path("");
-			}
-			if (parent instanceof IFile) {
-				IPath elementPath = ((IFile) parent).getFullPath();
-				if (((IFile) parent).getFileExtension().equalsIgnoreCase(
-						IFileFolderConstants.EXT_PROPERTIES)) {
-					int machings = 0;
-					try {
-						for (int i = 0; i < entries.length; i++) {
-							// Determine whether on this classentry's path
-							machings = entries[i].getPath()
-									.matchingFirstSegments(elementPath);
-							if (machings > 0) {
-								// Get package name
-								classPath = elementPath.removeFirstSegments(
-										machings).removeLastSegments(1);
-								break;
-							}
-						}
-						// Not on the classpath?
-						if (classPath == null) {
-							return null;
-						} else if (classPath.segmentCount() > 0)
-							result = javaProject.findElement(classPath)
-									.getPath().removeFirstSegments(machings)
-									.append(((IFile) parent).getName());
-						else
-							result = ((IFile) parent).getFullPath()
-									.removeFirstSegments(machings);
-					} catch (Exception e) {
-						// Error.DesignerPropertyTool.NatureQuerying = Error in
-						// project java nature querying
-						PDPlugin.getLogger(JavaUtil.class).error(
-								"Error.DesignerPropertyTool.NatureQuerying", e);
-						return null;
-					}
-				}
-			}
-		} else if (parent instanceof JarEntryFile) {
-			IPath elementPath = ((JarEntryFile) parent).getFullPath();
-			if (elementPath.getFileExtension().equalsIgnoreCase(
-					IFileFolderConstants.EXT_PROPERTIES)) {
-				result = elementPath;
-			}
-		}
-		if (result != null) {
-			return result;
-		}
-		return new Path("");
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/NodeLocationComparator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/NodeLocationComparator.java
deleted file mode 100644
index 87cf105..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/NodeLocationComparator.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.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 = new Integer(Integer.MAX_VALUE);
-
-	private static NodeLocationComparator _instance = new NodeLocationComparator();
-	static {
-		orders.put("taglib", new Integer(0));
-		orders.put("directive.taglib", new Integer(0));
-		orders.put("head", new Integer(1));
-	}
-
-	private NodeLocationComparator() {
-        // no external instantiation
-	}
-
-	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 3faf608..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/PreviewUtil.java
+++ /dev/null
@@ -1,343 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.PropertyResourceBundle;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IPath;
-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 */
-	public static String WEBROOT_PATH = null;
-
-	/** the file being previewed */
-	public static IFile CURRENT_FILE = null;
-
-	/** the property bundel */
-	public static PropertyResourceBundle BUNDLE = null;
-
-	/** the property bundel map used for loadbundle preview action */
-	public static Map BUNDLE_MAP = null;
-
-	/** the variable name used for loadbundel preview action */
-	public static String VAR = null;
-
-	/** key is prefix value is uri */
-	private static Map _taglibMap = new HashMap();
-
-	// TODO: dead? private static final String PAGE_EXTEND = "_jsppreview_.html"; //$NON-NLS-1$
-
-	/**
-	 * @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
-	 */
-	public static String getAttributesAsString(Map map) {
-		return getAttributesAsString(map, true);
-	}
-
-	/**
-	 * Get file path from uri
-	 * 
-	 * @param uri
-	 *            taglib uri
-	 */
-	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
-	 */
-	public static String getValueOFEP(String attrValue) {
-		if (attrValue != null) {
-			if (attrValue.startsWith("#{")) //$NON-NLS-1$
-			{
-				String key, value = null;
-				int i = attrValue.lastIndexOf("."); //$NON-NLS-1$
-				if (i > 0) {
-					key = attrValue.substring(i + 1, attrValue.length() - 1)
-							.trim();
-					String bundleVariable = attrValue.substring(2, i).trim();
-					if (BUNDLE_MAP == null) {
-						return attrValue; //$NON-NLS-1$
-					}
-					PropertyResourceBundle bundle = (PropertyResourceBundle) BUNDLE_MAP
-							.get(bundleVariable);
-
-					if (bundle != null) {
-						try {
-							value = bundle.getString(key);
-							if (value != null) {
-								return value;
-							}
-                            return attrValue; //$NON-NLS-1$
-						} catch (MissingResourceException e1) {
-							// "Error in resource bundle processing:"
-							_log.info("PreviewUtil.Error.0", e1); //$NON-NLS-1$
-						}
-					}
-				}
-			}
-		}
-		return attrValue;
-	}
-
-	/**
-	 * Get tag attribute string from attribute map
-	 * 
-	 * @param map
-	 *            tag attribute map
-	 * @param flag
-	 *            state
-	 */
-	public static String getAttributesAsString(Map map, boolean flag) {
-		if (map == null) {
-			return null;
-		}
-
-		StringBuffer stringbuffer = new StringBuffer();
-		for (Iterator e = map.keySet().iterator(); e.hasNext();) {
-			String attrName = (String) e.next();
-			String attrValue = (String) map.get(attrName);
-			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
-	 */
-	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
-	 */
-	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();
-			}
-			FileOutputStream fos = new FileOutputStream(file);
-			PrintStream ps = new PrintStream(fos, true, "UTF-8"); //$NON-NLS-1$
-			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 != null && attrNode instanceof Attr) {
-					Attr attr = (Attr) attrNode;
-					attr.setNodeValue(getValueOFEP(attr.getNodeValue()));
-					attr.setNodeValue(PathUtil.convertToAbsolutePath(attr
-							.getNodeValue(), null));
-                    //TODO: dead?
-//					StringBuffer buf = new StringBuffer();
-//					String attrValue = attr.getNodeValue();
-				}
-			}
-		}
-		for (int i = 0, n = nodeList.getLength(); i < n; i++) {
-			previewNode(nodeList.item(i));
-		}
-	}
-
-	// /**
-	// * handle escape attebute of tag
-	// *
-	// * @param node
-	// * @return
-	// */
-	// public static boolean escapeFoeNode(Node node)
-	// {
-	// if (node == null)
-	// {
-	// return false;
-	// }
-	// NamedNodeMap attrMap = node.getAttributes();
-	// if (attrMap != null)
-	// {
-	// for (int i = 0, n = attrMap.getLength(); i < n; i++)
-	// {
-	// Node attrNode = attrMap.item(i);
-	// if (attrNode != null && attrNode instanceof Attr)
-	// {
-	// if ("escape".equalsIgnoreCase(attrNode.getNodeName())
-	// && "true".equalsIgnoreCase(attrNode.getNodeValue()))
-	// {
-	// return true;
-	// }
-	// }
-	// }
-	// }
-	// return false;
-	// }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ProjectResolver.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ProjectResolver.java
deleted file mode 100644
index 2433df1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ProjectResolver.java
+++ /dev/null
@@ -1,488 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.jsf.common.ui.internal.utils.WebrootUtil;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-public class ProjectResolver implements URIResolver {
-	private static final String TLD_TAG_URI = "uri";
-
-	private static final String URI_PREFIX_HTTP = "http";
-
-	private static final String FILE_PROTOCOL = "file";
-
-	/** Create the logger for this class */
-	private static Logger _log = PDPlugin.getLogger(ProjectResolver.class);
-
-	private IProject _project = null;
-
-	private String _fileBaseLocation = null;
-
-	private static Map _uriMap = null;
-
-	/**
-	 * It is strongly recommended that clients use
-	 * project.getAdapter(URIResolver.class) to obtain a URIResolver aware of
-	 * the Project's special requirements. Note that a URIResolver may not be
-	 * returned at all so manually creating this object may still be required.
-	 */
-	public ProjectResolver(IProject project) {
-		super();
-		_project = project;
-	}
-
-	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);
-		}
-	}
-
-	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);
-		}
-	}
-
-	public String getURIfromTLD(File tldFile) {
-
-		if (tldFile == null) {
-			return null;
-		}
-		IDOMModel tldModel;
-
-		InputStream in = null;
-		try {
-			in = new FileInputStream(tldFile);
-		} catch (FileNotFoundException e) {
-			_log.error("RenderingTraverser.Error.FileNotFound", e);
-		}
-//		IDOMModel xmlModel = null;
-
-		try {
-			tldModel = (IDOMModel) PDPlugin.getModelManager().getModelForRead(
-					tldFile.getAbsolutePath(), in, null);
-			NodeList uriList = tldModel.getDocument().getElementsByTagName(
-					TLD_TAG_URI);
-			for (int i = 0, n = uriList.getLength(); i < n; i++) {
-				Node uri = uriList.item(i);
-				return uri.getChildNodes().item(0).getNodeValue();
-			}
-		} catch (UnsupportedEncodingException e1) {
-			_log.error("RenderingTraverser.Error.UnsupportedEncoding", e1);
-		} catch (IOException e1) {
-			_log.error("RenderingTraverser.Error.IO", e1);
-		} finally {
-			ResourceUtils.ensureClosed(in);
-		}
-
-		return null;
-	}
-
-	public String getURIfromTLD(IFile tldFile) {
-		if (tldFile == null) {
-			return null;
-		}
-		IDOMModel tldModel;
-
-		try {
-			tldModel = (IDOMModel) getModelManager().getModelForRead(tldFile);
-			NodeList uriList = tldModel.getDocument().getElementsByTagName(
-					TLD_TAG_URI);
-			for (int i = 0, n = uriList.getLength(); i < n; i++) {
-				Node uri = uriList.item(i);
-				return uri.getChildNodes().item(0).getNodeValue();
-			}
-		} catch (IOException e) {
-			// Error in taglib locating.
-			_log.error("Error.ProjectResolver.GetlocationByURI.0", e); //$NON-NLS-1$
-		} catch (CoreException e1) {
-			_log.error("Error.ProjectResolver.GetlocationByURI.0", e1);
-		}
-		return null;
-	}
-
-	public void initTldMap() {
-		if (_uriMap == null) {
-			_uriMap = new HashMap();
-		}
-		if (_project == null) {
-			return;
-		}
-		if (WebrootUtil.getWebContentFolder(_project) == null) {
-			return;
-		}
-		IFolder webinf = WebrootUtil.getWebContentFolder(_project).getFolder(
-				IFileFolderConstants.FOLDER_WEBINF);
-		if (webinf != null && webinf.exists()) {
-			seekTld(webinf);
-		}
-
-		String locate = PDPlugin.getInstallLocation().append("/jsf-tld")
-				.toString();
-		File jsfDir = new File(locate);
-		seekTld(jsfDir);
-
-	}
-
-	public java.lang.String getFileBaseLocation() {
-		return _fileBaseLocation;
-	}
-
-	public java.lang.String getLocationByURI(String uri) {
-		// System.out.println(getLocationByURI(uri, getFileBaseLocation()));
-		return getLocationByURI(uri, getFileBaseLocation());
-	}
-
-	private IModelManager getModelManager() {
-		return StructuredModelManager.getModelManager();
-	}
-
-	private String getLocationFromWEBXML(String uri, String baseReference) {
-		if (uri == null) {
-			return null;
-		}
-		try {
-			// if (_project.hasNature(ICommonConstants.NATURE_WEBAPP))
-			// {
-			if (uri.startsWith(IFileFolderConstants.PATH_SEPARATOR)) {
-				uri = _project.getProject().getLocation().toString()
-						+ IFileFolderConstants.PATH_SEPARATOR
-						+ WebrootUtil.getWebContentFolderName(_project) + uri;
-			}
-			if (uri.startsWith(URI_PREFIX_HTTP)) {
-				IFile webxml = WebrootUtil.getWebContentFolder(_project)
-						.getFolder(IFileFolderConstants.FOLDER_WEBINF).getFile(
-								IFileFolderConstants.FILE_WEB_XML);
-				IDOMModel xmlModel;
-
-				if (webxml.exists()) {
-					try {
-						xmlModel = (IDOMModel) getModelManager()
-								.getModelForRead(webxml);
-
-						NodeList taglibNodeList = xmlModel
-								.getDocument()
-								.getElementsByTagName(ICSSPropertyID.TAG_TAGLIB);
-
-						for (int i = 0, size = taglibNodeList.getLength(); i < size; i++) {
-							Node taglibNode = taglibNodeList.item(i);
-
-							NodeList childList = taglibNode.getChildNodes();
-							String taguri = "";
-							String taglocation = "";
-							for (int j = 0, childSize = childList.getLength(); j < childSize; j++) {
-								Node childTaglibNode = childList.item(j);
-								if (ICSSPropertyID.ATTR_TAGLIB_URI
-										.equalsIgnoreCase(childTaglibNode
-												.getNodeName())) {
-									taguri = childTaglibNode.getChildNodes()
-											.item(0).getNodeValue();
-								}
-								if (ICSSPropertyID.ATTR_TAGLIB_LOCATION
-										.equalsIgnoreCase(childTaglibNode
-												.getNodeName())) {
-									taglocation = childTaglibNode
-											.getChildNodes().item(0)
-											.getNodeValue();
-								}
-
-							}
-							if (uri.equalsIgnoreCase(taguri))
-								uri = _project.getProject().getLocation()
-										.toString()
-										+ IFileFolderConstants.PATH_SEPARATOR
-										+ WebrootUtil
-												.getWebContentFolderName(_project)
-										+ taglocation;
-						}
-						xmlModel.releaseFromRead();
-					} catch (IOException e) {
-
-						// Error in taglib locating.
-						_log.error(
-								"Error.ProjectResolver.GetlocationByURI.0", e); //$NON-NLS-1$
-					} catch (CoreException e1) {
-						e1.printStackTrace();
-						_log.error("Error.ProjectResolver.GetlocationByURI.0",
-								e1);
-					}
-
-				}
-			}
-			// }
-		} catch (DOMException e1) {
-			// Error in taglib locating.
-			_log.error("Error.ProjectResolver.GetlocationByURI.0", e1); //$NON-NLS-1$
-		}
-		// catch (CoreException e1)
-		// {
-		//
-		// _log.error("Error.ProjectResolver.GetlocationByURI.0", e1);
-		// }
-
-		if (isFileURL(uri)) {
-			try {
-				URL url = new URL(uri);
-				return getPath(url);
-			} catch (MalformedURLException e) {
-				_log.error("Error.ProjectResolver.GetlocationByURI.0", e);
-			}
-		}
-		// defect 244817 end
-		return URIHelper.normalize(uri, baseReference, getRootLocationString());
-
-	}
-
-	public String getLocationByURI(String uri, String baseReference) {
-		// DataWindow may generate URL like "d:\somefile" (dos path). We may
-		// need some
-		// special support. (lium)
-		int columnIndex = uri.indexOf(":");
-		int slashIndex = uri.indexOf("/");
-		if (columnIndex != -1 && (slashIndex == -1 || columnIndex < slashIndex)) {
-			return uri;
-		}
-
-		String result = getLocationFromWEBXML(uri, baseReference);
-		if (result != null && !result.equals(uri)) {
-			return result;
-		}
-		if (_uriMap == null) {
-			initTldMap();
-		}
-		if (_uriMap != null) {
-			return (String) _uriMap.get(uri);
-		}
-		return null;
-	}
-
-	// defect 244817 start
-	/**
-	 * @param passedSpec
-	 * @return boolean
-	 */
-	private boolean isFileURL(String passedSpec) {
-		if (passedSpec == null) {
-			return false;
-		}
-		final String spec = passedSpec.trim();
-		if (spec.length() == 0) {
-			return false;
-		}
-		String newProtocol = null;
-		for (int index = 0, limit = spec.length(); index < limit; index++) {
-			final char p = spec.charAt(index);
-			if (p == '/') {
-				//$NON-NLS-1$
-				break;
-			}
-			if (p == ':') {
-				//$NON-NLS-1$
-				newProtocol = spec.substring(0, index);
-				break;
-			}
-		}
-		return (newProtocol != null && newProtocol
-				.compareToIgnoreCase(FILE_PROTOCOL) == 0); //$NON-NLS-1$
-	}
-
-	/**
-	 * @param url
-	 * @return String
-	 */
-	private String getPath(URL url) {
-		String ref = url.getRef() == null ? "" : "#" + url.getRef(); //$NON-NLS-1$ //$NON-NLS-2$
-		String strPath = url.getFile() + ref;
-		IPath path;
-		if (strPath.length() == 0) {
-			path = Path.ROOT;
-		} else {
-			path = new Path(strPath);
-			String query = null;
-			StringTokenizer parser = new StringTokenizer(strPath, "?"); //$NON-NLS-1$
-			int tokenCount = parser.countTokens();
-			if (tokenCount == 2) {
-				path = new Path((String) parser.nextElement());
-				query = (String) parser.nextElement();
-			}
-			if (query == null) {
-				parser = new StringTokenizer(path.toString(), "#"); //$NON-NLS-1$
-				tokenCount = parser.countTokens();
-				if (tokenCount == 2) {
-					path = new Path((String) parser.nextElement());
-				}
-			}
-		}
-		return getPath(path, url.getHost());
-	}
-
-	/**
-	 * @param path
-	 * @param host
-	 * @return String
-	 */
-	private String getPath(IPath path, String host) {
-		IPath newPath = path;
-		// They are potentially for only Windows operating system.
-		// a.) if path has a device, and if it begins with IPath.SEPARATOR,
-		// remove it
-		final String device = path.getDevice();
-		if ((device != null) && (device.length() > 0)) {
-			if (device.charAt(0) == IPath.SEPARATOR) {
-				final String newDevice = device.substring(1);
-				newPath = path.setDevice(newDevice);
-			}
-		}
-		// b.) if it has a hostname, it is UNC name... Any java or eclipse api
-		// helps it ??
-		if (path != null && host != null && host.length() != 0) {
-			IPath uncPath = new Path(host);
-			uncPath = uncPath.append(path);
-			newPath = uncPath.makeUNC(true);
-		}
-		return newPath.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;
-	}
-
-	protected 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 5fead43..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectManyHelper.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-
-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 static final String OPTION_VISUAL_PREFIX = "option: "; //$NON-NLS-1$
-//
-//	private static final String OPTION_VISUAL_PREFIX_BINDING = "option(binding): "; //$NON-NLS-1$
-//
-//	private static final String OPTION_VISUAL_PREFIX_VALUE = "option(value): "; //$NON-NLS-1$
-
-	private static final String NO_VALUE = "<no value>"; //$NON-NLS-1$
-
-	public static HashSet JSF_SELECT_TAGS, HTML_SELECT_TAGS;
-
-	public static HashSet HTML_SELECT_TAG_OPTIONS, JSF_SELECT_TAG_OPTIONS;
-
-	static {
-		HTML_SELECT_TAGS = new HashSet(10);
-		HTML_SELECT_TAGS.add(IHTMLConstants.TAG_SELECT);
-		HTML_SELECT_TAGS.add(IHTMLConstants.TAG_OPTGROUP);
-		HTML_SELECT_TAG_OPTIONS = new HashSet(10);
-		HTML_SELECT_TAG_OPTIONS.add(IHTMLConstants.TAG_OPTGROUP);
-		HTML_SELECT_TAG_OPTIONS.add(IHTMLConstants.TAG_OPTION);
-
-		JSF_SELECT_TAG_OPTIONS = new HashSet(10);
-		JSF_SELECT_TAG_OPTIONS.add(IJSFConstants.TAG_SELECTITEM);
-		JSF_SELECT_TAG_OPTIONS.add(IJSFConstants.TAG_SELECTITEMS);
-		JSF_SELECT_TAGS = new HashSet(10);
-		JSF_SELECT_TAGS.add(IJSFConstants.TAG_SELECTONELISTBOX);
-		JSF_SELECT_TAGS.add(IJSFConstants.TAG_SELECTONEMENU);
-		JSF_SELECT_TAGS.add(IJSFConstants.TAG_SELECTMANYLISTBOX);//
-		JSF_SELECT_TAGS.add(IJSFConstants.TAG_SELECTMANYMENU);//
-		JSF_SELECT_TAGS.add(IJSFConstants.TAG_SELECTMANYCHECKBOX);
-	}
-
-	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;
-	}
-
-	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[] {});
-	}
-
-	public static boolean hasSelectOptions(Element node) {
-		if (node == null) {
-			return false;
-		}
-		String uri = CMUtil.getElementNamespaceURI(node);
-		if (ITLDConstants.URI_JSF_HTML.equals(uri)) {
-
-			if (JSF_SELECT_TAGS.contains(node.getLocalName())) {
-				IDOMModel model = ((IDOMElement) node).getModel();
-				String jsfcorePrefix = JSPUtil.getPrefix(model,
-						ITLDConstants.URI_JSF_CORE);
-				if (jsfcorePrefix != null) {
-					NodeList nl = node.getElementsByTagName(jsfcorePrefix + ":"
-							+ IJSFConstants.TAG_SELECTITEM);
-					NodeList nl1 = node.getElementsByTagName(jsfcorePrefix
-							+ ":" + IJSFConstants.TAG_SELECTITEMS);
-					return nl.getLength() > 0 || nl1.getLength() > 0;
-				}
-                return false;
-			}
-		}
-		if (ITLDConstants.URI_HTML.equals(uri)) {
-			if (HTML_SELECT_TAGS.contains(node.getNodeName().toLowerCase())) {
-				NodeList nl = node
-						.getElementsByTagName(IHTMLConstants.TAG_OPTION);
-				NodeList nl1 = node
-						.getElementsByTagName(IHTMLConstants.TAG_OPTGROUP);
-				return nl.getLength() > 0 || nl1.getLength() > 0;
-			}
-		}
-		return false;
-	}
-
-	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;
-	}
-
-	public static String getJsfSelectionVisualLabel(Element element) {
-		/*
-		 * if (ele.getAttribute(ICSSPropertyID.ATTR_ITEMLABEL) != null) { return
-		 * OPTION_VISUAL_PREFIX +
-		 * ele.getAttribute(ICSSPropertyID.ATTR_ITEMLABEL); //$NON-NLS-1$ } else
-		 * if (ele.getAttribute(ICSSPropertyID.ATTR_BINDING) != null) { return
-		 * OPTION_VISUAL_PREFIX_BINDING +
-		 * ele.getAttribute(ICSSPropertyID.ATTR_BINDING); //$NON-NLS-1$ } else
-		 * if (ele.getAttribute(ICSSPropertyID.ATTR_ITEMVALUE) != null) { return
-		 * OPTION_VISUAL_PREFIX_VALUE +
-		 * ele.getAttribute(ICSSPropertyID.ATTR_ITEMVALUE); //$NON-NLS-1$ }
-		 * 
-		 * return NO_VALUE; //$NON-NLS-1$
-		 */
-		if (element != null) {
-			return element.getNodeName();
-		}
-        return NO_VALUE;
-	}
-}
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 ae67831..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectionHelper.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.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
-	 */
-	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
-	 */
-	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
-	 */
-	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
-	 */
-	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
-	 */
-	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
-	 */
-	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 selection
-	 *            selection from designer, could be IStructuredSelection of
-	 *            NodeEditPart, or DesignRange.
-	 * @return
-	 */
-	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);
-	}
-
-	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 35dd36f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/WebAppUtil.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.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";
-
-	public static String transformJSPURL(String url, IFile openedFile) {
-		boolean canSupportJSF = JSPUtil.supportTaglib(
-				ITLDConstants.URI_JSF_HTML, openedFile);
-		if (canSupportJSF
-				&& url != null
-				&& url.endsWith(IFileFolderConstants.DOT
-						+ IFileFolderConstants.EXT_JSP)) {
-			String urlPattern = "";
-			IVirtualResource[] resources = ComponentCore
-					.createResources(openedFile);
-			IVirtualComponent component = null;
-			if (resources[0] != null) {
-				component = resources[0].getComponent();
-			}
-			if (component != null) {
-				urlPattern = WebDeployableArtifactUtil.getServletMapping(
-						openedFile.getProject(), true, FACES_SERVLET_NAME,
-						component.getName());
-			}
-			if (urlPattern.lastIndexOf(IFileFolderConstants.DOT) != -1) {
-				String extension = urlPattern.substring(urlPattern
-						.lastIndexOf(IFileFolderConstants.DOT));
-				url = url.substring(0, url.lastIndexOf(IFileFolderConstants.DOT
-						+ IFileFolderConstants.EXT_JSP))
-						+ extension;
-			}
-		}
-		return url;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/XMLUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/XMLUtil.java
deleted file mode 100644
index 7a98425..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/XMLUtil.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.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
-	 */
-	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;
-	}
-
-	public synchronized static DocumentBuilder getDocumentBuilder(
-			boolean validating) {
-		DocumentBuilder result = null;
-		try {
-			DocumentBuilderFactory instance = DocumentBuilderFactory
-					.newInstance();
-			instance.setValidating(validating);
-			result = instance.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 5a6e93c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/ActionData.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.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 {
-	public static final int PALETTE_DND = 1;
-
-	public static final int DATABINDING_DND = 2;
-
-	public static final int OTHER_DND = 3;
-
-	public static final int KEYBOARD_NAVAGATION = 4;
-
-	public static final int INLINE_EDIT = 5;
-
-	public static final int COMPONENT_MOVE = 6;
-
-	public static final int UNKNOWN = 0;
-
-	private int _actionType;
-
-	private Object _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 ac8d97d..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
- */
-public 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 c2e2eee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/BasicPositionRule.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.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
- */
-public class BasicPositionRule extends DefaultPositionRule {
-
-	/**
-	 * @param mediator
-	 */
-	public BasicPositionRule(IPositionMediator mediator, ActionData actionData) {
-		super(mediator, actionData);
-	}
-
-	/*
-	 * (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 342d5ea..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
- */
-public class ContainerMoveInAndOutRule extends DefaultMovementRule {
-	public final String[] HTML_CONTAINERS = { IHTMLConstants.TAG_TABLE };
-
-	public final String[] NONE_HTML_CONTAINERS = {};
-
-	public 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 d7bd149..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultMovementRule.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.validation.caret;
-
-/**
- * @author mengbo
- */
-public class DefaultMovementRule implements IMovementRule {
-	ActionData _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 bc8199d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultPositionRule.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.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 {
-
-	protected IPositionMediator _mediator;
-
-	private ActionData _actionData;
-
-	/**
-	 * 
-	 */
-	public DefaultPositionRule(IPositionMediator mediator, ActionData actionData) {
-		super();
-		_mediator = mediator;
-		if (actionData != null) {
-			_actionData = actionData;
-		} else {
-			_actionData = new ActionData(ActionData.UNKNOWN, new Object());
-		}
-	}
-
-    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)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isValidPosition(org.eclipse.jst.pagedesigner.dom.IDOMPosition)
-	 */
-	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
-     * @param tagName
-     * @return
-     */
-     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 141310d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultPositionValidator.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.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
- */
-public class DefaultPositionValidator implements IPositionMediator {
-	private List _rules = new ArrayList();
-
-	protected final ActionData _actionData;
-
-	/**
-	 * @return Returns the _actionData.
-	 */
-	public ActionData getActionData() {
-		return _actionData;
-	}
-
-	/**
-	 * 
-	 */
-	protected DefaultPositionValidator(ActionData actionData) {
-		_actionData = actionData;
-		initRules();
-	}
-
-	protected void initRules() {
-		_rules.clear();
-		addRule(new BasicPositionRule(this, _actionData));
-        addRule(new IETablePositionRule(this, _actionData));
-        addRule(new RootContainerPositionRule(this, _actionData));
-        addRule(new JSFRootContainerPositionRule(this, _actionData));
-        addRule(new WhitespacePositionMoveRule(this, _actionData));
-	}
-
-	/**
-	 * @return Returns the _rules.
-	 */
-	public List getRules() {
-		return Collections.unmodifiableList(_rules);
-	}
-
-	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.
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IValidator#getEditableContainer(org.eclipse.gef.EditPart)
-	 */
-	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 74fc4ae..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DropActionData.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.pagedesigner.validation.caret;
-
-import java.util.Collections;
-import java.util.List;
-
-public class DropActionData extends ActionData
-{
-    public DropActionData(int action, DropData data ) 
-    {
-        super(action, data);
-    }
-
-    public DropData getDropData()
-    {
-        return (DropData) getData();
-    }
-    
-    public static class DropData
-    {
-        private final List    _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 4bacd8f..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
- */
-public class HeadDataPositionRule extends DefaultPositionRule {
-
-	/**
-	 * @param data
-	 */
-	public HeadDataPositionRule(IPositionMediator mediator, ActionData data) {
-		super(mediator, 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 fef2410..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IEPanelgridPositionRule.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.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
- */
-public class IEPanelgridPositionRule extends DefaultPositionRule {
-	public IEPanelgridPositionRule(IPositionMediator mediator,
-			ActionData actionData) {
-		super(mediator, actionData);
-	}
-
-	/**
-	 * PanelGrid is not editable.
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isEditable(org.eclipse.gef.EditPart)
-	 */
-	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 9bcda2e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IETablePositionRule.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.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 mediator
-	 */
-	public IETablePositionRule(IPositionMediator mediator, ActionData actionData) {
-		super(mediator, 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 node @return
-	 */
-	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;
-	}
-
-    // TODO: dead?
-//	private boolean isValidTrTd(List ancestors) {
-//		String name;
-//		int offset = ancestors.size();
-//		if (offset >= 2) {
-//			return IHTMLConstants.TAG_TR.equalsIgnoreCase(((Node) ancestors
-//					.get(offset - 1)).getLocalName())
-//					&& //
-//					(IHTMLConstants.TAG_TH.equalsIgnoreCase(((Node) ancestors
-//							.get(offset - 2)).getLocalName()) || //
-//					IHTMLConstants.TAG_TD.equalsIgnoreCase(((Node) ancestors
-//							.get(offset - 2)).getLocalName()));
-//		}
-//		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 a1ff20d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IMovementMediator.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.pagedesigner.validation.caret;
-
-import org.eclipse.gef.EditPart;
-
-/**
- * @author mengbo
- */
-public interface IMovementMediator extends IPositionMediator {
-	public boolean allowsMoveIn(Target target);
-
-	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 b1017d6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IMovementRule.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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 {
-	public boolean allowsMoveIn(Target target);
-
-	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 847fcda..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IPositionMediator.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.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 node
-	 * @return
-	 */
-	public boolean hasEditableArea(Target target);
-
-	/**
-	 * To see if the position is valid.
-	 * 
-	 * @param position
-	 * @return
-	 */
-	public boolean isValidPosition(IDOMPosition position);
-
-	public boolean isValidPosition(DesignPosition position);
-
-	/**
-	 * To see if the node is editable.
-	 * 
-	 * @param node
-	 * @return
-	 */
-	public boolean isEditable(Target 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 86cfb21..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IPositionRule.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.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 node
-	 * @return
-	 */
-	public boolean isEditable(Target target);
-
-	/**
-	 * To see if the node itself or its descendent is editable.
-	 * 
-	 * @see isEditable for other details.
-	 * @param node
-	 * @return
-	 */
-	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
-	 */
-	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
-	 */
-	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 696dc30..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingNavigationMediator.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.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.HTMLGraphicalViewer;
-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;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator#getConstainedEditableContainer(org.eclipse.jst.pagedesigner.caret.Target)
-	 */
-	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.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;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator#getConstainedEditableContainer(org.eclipse.jst.pagedesigner.caret.Target)
-	 */
-	public EditPart getConstainedEditableContainer(DesignPosition position,
-			Point p, GraphicalViewer viewer) {
-		Rectangle rect = new Rectangle(p.x, p.y, 1, 1);
-		Viewport port = ((HTMLGraphicalViewer) viewer).getViewport();
-
-		Point viewLocation = port.getViewLocation();
-		Point lastLocation = viewLocation.getCopy();
-		new ExposeHelper((HTMLGraphicalViewer) 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 40b5e99..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(this, _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 259d4ea..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/JSFRootContainerPositionRule.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.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.
-	 */
-	public static final String[] JSF_ROOT_CONTAINERS = { "view", "subview" };
-
-	/**
-	 * @param mediator
-	 * @param actionData
-	 */
-	public JSFRootContainerPositionRule(IPositionMediator mediator,
-			ActionData actionData) {
-		super(mediator, 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 0045421..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/NodeConstructionPositionRule.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;
-
-/**
- * @author mengbo
- */
-public class NodeConstructionPositionRule extends DefaultPositionRule {
-
-	/**
-	 * 
-	 */
-	public NodeConstructionPositionRule(IPositionMediator mediator,
-			ActionData actionData) {
-		super(mediator, 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 7d7134d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/RootContainerPositionRule.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.validation.caret;
-
-import java.util.Arrays;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * This rule deal with containers 'body', 'view', 'subview'.
- * 
- * @author mengbo
- */
-public class RootContainerPositionRule extends DefaultPositionRule {
-	public static final String[] HTML_ROOT_CONTAINERS = { "body" };
-
-	/**
-	 * @param mediator
-	 */
-	public RootContainerPositionRule(IPositionMediator mediator,
-			ActionData actionData) {
-		super(mediator, 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.gef.EditPart)
-	 */
-	public boolean hasEditableArea(Target target) {
-		EditPart part = target.getPart();
-		if (part == null) {
-			return false;
-		}
-		Node node = target.getNode();
-		if (hasBasicContainers(EditModelQuery.getDocumentNode(node))) {
-			return true;// isWithinkBasicContainer(node);
-		}
-		return super.hasEditableArea(target);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isEditable(org.eclipse.gef.EditPart)
-	 */
-	public boolean isEditable(Target target) {
-		Node node = target.getNode();
-		if (hasBasicContainers(EditModelQuery.getDocumentNode(node))) {
-			boolean result = isWithinkBasicContainer(node);
-			return result;
-		}
-		return super.isEditable(target);
-	}
-
-	/**
-	 * We need to see if body, view are there. and they should be at first or
-	 * second level.
-	 * 
-	 * @param document
-	 * @return
-	 */
-	public static boolean hasBasicContainers(Document document) {
-		return getBasicContainer(document) != null;
-
-	}
-
-	public static boolean isWithinkBasicContainer(Node node) {
-		return EditModelQuery.isChild(HTML_ROOT_CONTAINERS, node, true, false);
-	}
-
-	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 2121d7d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/Target.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.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;
-
-	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);
-        }
-	}
-
-	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;
-    }
-    
-	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;
-	}
-
-	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 ec70d48..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/WhitespacePositionMoveRule.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.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 mediator
-	 */
-	public WhitespacePositionMoveRule(IPositionMediator mediator,
-			ActionData actionData) {
-		super(mediator, 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 62b283b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/AbstractDropLocationStrategy.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.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;
-    
-    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 d3f5ea3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretPositionResolver.java
+++ /dev/null
@@ -1,318 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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;
-
-	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
-	 */
-	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
-	 */
-	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
-	 */
-	public static int toYMiddle(Rectangle rect, Point point) {
-		return (point.y - (rect.y + rect.getBottom().y) / 2);
-	}
-
-	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 95f6742..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretUpdater.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.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
- */
-public class CaretUpdater implements IHTMLGraphicalViewerListener,
-		FigureListener {
-//	private static final Logger _log = PDPlugin.getLogger(CaretUpdater.class);
-
-	private IHTMLGraphicalViewer _viewer;
-
-	private boolean _viewerBatchChanging = false;
-
-	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;
-
-	//TODO: dead? private Polyline _rangeStartCaret;
-
-	public CaretUpdater(IHTMLGraphicalViewer viewer) {
-		_viewer = viewer;
-		setup();
-	}
-
-	public void setup() {
-		_viewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * this method is called after the view is fully initialized.
-	 */
-	public void connectViewer() {
-		Viewport viewport = _viewer.getViewport();
-		if (viewport != null) {
-			viewport.getHorizontalRangeModel().addPropertyChangeListener(
-					new PropertyChangeListener() {
-						public void propertyChange(
-								PropertyChangeEvent propertychangeevent) {
-							if ((propertychangeevent.getSource() instanceof RangeModel)
-									&& (propertychangeevent.getPropertyName()
-											.equals(ICSSPropertyID.ATTR_VALUE) || propertychangeevent
-											.getPropertyName().equals("extent")))
-								updateCaret();
-						}
-
-					});
-			viewport.getVerticalRangeModel().addPropertyChangeListener(
-					new PropertyChangeListener() {
-
-						public void propertyChange(
-								PropertyChangeEvent propertychangeevent) {
-							if ((propertychangeevent.getSource() instanceof RangeModel)
-									&& (propertychangeevent.getPropertyName()
-											.equals(ICSSPropertyID.ATTR_VALUE) || propertychangeevent
-											.getPropertyName().equals("extent")))
-								updateCaret();
-						}
-
-					});
-		}
-	}
-
-	public void dispose() {
-		_viewer.removeSelectionChangedListener(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	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.
-		// TODO: dead?? DesignRange range = _viewer.getRangeSelection();
-		((GraphicalEditPart) _viewer.getRootEditPart()).getFigure().repaint();
-		((GraphicalEditPart) _viewer.getRootEditPart()).getFigure()
-				.getUpdateManager().performUpdate();
-	}
-
-	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 2e3bf6f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DefaultDropLocationStrategy.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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;
-
-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;
-
-    public DefaultDropLocationStrategy(EditPartViewer viewer) {
-        super(viewer);
-    }
-
-    public DesignPosition calculateDesignPosition(EditPart host, Point p,
-            IPositionMediator validator) {
-        return EditPartPositionHelper.findEditPartPosition(
-                host, p, validator);
-    }
-
-    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;
-    }
-
-    
-    
-    protected final RectangleFigure showFeedbackRect(Rectangle rect) {
-        RectangleFigure pf = createFeedbackFigure();
-        pf.translateToRelative(rect);
-        pf.setBounds(rect);
-        return pf;
-    }
-    
-    protected Rectangle createCaretBounds(DesignPosition position)
-    {
-        Rectangle rect = EditPartPositionHelper
-            .convertToAbsoluteCaretRect(position);
-
-        // to avoid enlarge feedback pane.
-        rect = rect.intersect(getFeedbackLayer().getBounds());
-        
-        return rect;
-    }
-    
-    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
-     */
-    protected final Label showDropHintLabel(Point mousePosition, DesignPosition position)
-    {
-        Label    dropHintLabel = new Label();
-        dropHintLabel.setOpaque(true);
-        dropHintLabel.setBackgroundColor(ColorConstants.tooltipBackground);
-        dropHintLabel.setBorder(
-                new LineBorder(ColorConstants.black, 1)
-                {
-                    // add an extra pixel of inset to make sure the text
-                    // isn't pressed against the border
-                    public Insets getInsets(IFigure figure) {
-                        return new Insets(getWidth()+1);
-                    }
-                }
-        );
-        addFeedback(dropHintLabel);
-
-        final String hintText = getDropHintText(position);
-        dropHintLabel.setText(hintText);
-        //TODO: need to handle viewport clipping and adjust label location appropriately
-        Dimension hintSize = dropHintLabel.getPreferredSize();
-        Point hintLocation = new Point(mousePosition.x, mousePosition.y+DROP_HINT_VERTICAL_OFFSET);
-        
-        Rectangle hintRect = new Rectangle(hintLocation, hintSize);
-
-        // we need to intersect the rectangle with the feedback pane, otherwise, when the mouse
-        // is dragged near the edge of the viewport with the drop hint active, the canvas will expand
-        // away from the mouse.  In future a more ideal solution will be to relocate the tooltip
-        // so that is is completely inside the viewport.
-        hintRect = hintRect.intersect(getFeedbackLayer().getBounds());
-        
-        dropHintLabel.translateToRelative(hintRect);
-        dropHintLabel.setBounds(hintRect);
-        
-        return dropHintLabel;
-    }
-    
-    protected String getDropHintText(DesignPosition position)
-    {
-        StringBuffer buffer = new StringBuffer("Place");
-        
-        EditPart prevPart = position.getSiblingEditPart(false);
-        EditPart nextPart = position.getSiblingEditPart(true);
-
-        if (nextPart instanceof ElementEditPart)
-        {
-            buffer.append(" before ");
-            buffer.append(((ElementEditPart)nextPart).getTagConvert().getHostElement().getNodeName());
-            buffer.append(",");
-        }
-        
-        if (prevPart instanceof ElementEditPart)
-        {
-            buffer.append(" after ");
-            buffer.append(((ElementEditPart)prevPart).getTagConvert().getHostElement().getNodeName());
-            buffer.append(",");
-        }
-        
-        buffer.append(" inside ");
-        buffer.append(position.getContainerNode().getNodeName());
-        
-        return buffer.toString();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignPosition.java
deleted file mode 100644
index 3e10f32..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignPosition.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.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 {
-	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
-	 */
-	public EditPart getContainerPart() {
-		return _containerPart;
-	}
-
-	public Node getContainerNode() {
-		if (_containerPart != null) {
-			return (Node) _containerPart.getModel();
-		}
-        return null;
-	}
-
-	/**
-	 * if offset < 0, means it is invalid.
-	 * 
-	 * @return
-	 */
-	public int getOffset() {
-		return _offset;
-	}
-
-	public boolean isValid() {
-		return (_containerPart != null) && (_offset >= 0);
-	}
-
-	/**
-	 * This method should not be called when is text node.
-	 * 
-	 * @param forward
-	 * @return
-	 */
-	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
-	 */
-	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
-	 */
-	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 instanceof DesignPosition) {
-			DesignPosition p = (DesignPosition) obj;
-
-			return (p.getContainerPart() == this._containerPart)
-					&& (p.getOffset() == this._offset);
-		}
-
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public StringBuffer debugDump(StringBuffer buffer) {
-//		try {
-			buffer.append("DesignPosition: ").append(this._containerPart)
-					.append(": ").append(this._offset).append("\n");
-
-			if (this._containerPart.getModel() instanceof Text) {
-				// skip
-			} else {
-				if (this._offset > 0) {
-					buffer.append("after: ").append(
-							this._containerPart.getChildren().get(
-									this._offset - 1)).append("\n");
-				}
-
-				if (this._offset < (this._containerPart.getChildren().size() - 1)) {
-					buffer.append("before: ")
-							.append(
-									this._containerPart.getChildren().get(
-											this._offset)).append("\n");
-				}
-			}
-            //TODO: what was being caught here?
-//		} catch (Exception e) {
-//		}
-
-		return buffer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-
-		return debugDump(buffer).toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRange.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRange.java
deleted file mode 100644
index 468defa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRange.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.viewer;
-
-import org.eclipse.jface.viewers.ISelection;
-
-/**
- * @author mengbo
- */
-public class DesignRange implements ISelection {
-	public DesignPosition _start;
-
-	public DesignPosition _end;
-
-	public DesignRange(DesignPosition start, DesignPosition end) {
-		_start = start;
-		_end = end;
-	}
-
-	public DesignPosition getStartPosition() {
-		return _start;
-	}
-
-	public DesignPosition getEndPosition() {
-		return _end;
-	}
-
-	// public boolean isCollapsed()
-	// {
-	// }
-
-	// public boolean fullyContains(EditPart part)
-	// {
-	//        
-	// }
-
-	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);
-	}
-
-	public StringBuffer debugDump(StringBuffer buffer) {
-		if (_start != null) {
-			buffer.append("Start: ").append(_start);
-		} else {
-			buffer.append("Start: null");
-		}
-		if (_end != null) {
-			buffer.append("End: ").append(_end);
-		} else {
-			buffer.append("End: null");
-		}
-		return buffer;
-	}
-
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		return debugDump(buffer).toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRefPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRefPosition.java
deleted file mode 100644
index d02733f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRefPosition.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.viewer;
-
-import org.eclipse.gef.EditPart;
-
-/**
- * @author mengbo
- */
-public class DesignRefPosition extends DesignPosition {
-	private boolean _caretIsAtRight;
-
-	private EditPart _refPart;
-
-	/**
-	 * @param part
-	 * @param offset
-	 */
-	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;
-	}
-
-	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 0e88f0c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/EditPartPositionHelper.java
+++ /dev/null
@@ -1,678 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSTextFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowBox;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class EditPartPositionHelper {
-//	private final static Logger _log = PDPlugin
-//			.getLogger(EditPartPositionHelper.class);
-
-	/**
-	 * Add something to curent
-	 * 
-	 * @param lineBox
-	 * @param host
-	 * @param point
-	 * @param validator
-	 */
-	private static void addToCurrentLine(FlowBoxLine lineBox, EditPart host,
-			Point point, IPositionMediator validator) {
-		Node node = Target.resolveNode(host);
-		if (!(node == null || EditModelQuery.isDocument(node))) {
-			// Either it is referencable or is editable.
-			if (validator.isValidPosition(new DOMRefPosition(node, true))
-					|| //
-					validator
-							.isValidPosition((new DOMRefPosition(node, false)))
-					|| //
-					validator.isValidPosition(new DOMPosition(node, 0))) {
-				lineBox.addLayoutPart(host, point);
-			}
-		}
-	}
-
-	/**
-	 * @param position 
-	 * @return null means failed to convert to rect.
-	 */
-	public static Rectangle convertToAbsoluteCaretRect(DesignPosition position) {
-		Rectangle ret = null;
-		try {
-			final int CARET_OFFSET = 1;
-			if (position == null || !position.isValid()) {
-				return null;
-			}
-			EditPart containerEditPart = position.getContainerPart();
-			if (containerEditPart instanceof TextEditPart) {
-				CSSTextFigure figure = (CSSTextFigure) ((TextEditPart) containerEditPart)
-						.getFigure();
-				ret = figure.calculateCaretPosition(position.getOffset());
-				figure.translateToAbsolute(ret);
-				ret.width = CaretUpdater.CARET_WIDTH;
-			} else {
-				int offset = position.getOffset();
-				// there is no child
-				if (containerEditPart.getChildren().isEmpty()
-						|| LayoutPart.getConcretePart(containerEditPart) == null) {
-					IFigure figure = ((GraphicalEditPart) containerEditPart)
-							.getFigure();
-					Rectangle bounds = figure.getBounds();
-					if (figure instanceof CSSFigure) {
-						List fragments = ((CSSFigure) figure)
-								.getFragmentsForRead();
-						if (fragments.size() > 0) {
-							FlowBox box = (FlowBox) fragments.get(fragments
-									.size() - 1);
-							bounds = LayoutPart.getBounds(box);
-						}
-					}
-
-					ret = new Rectangle(bounds.x + CARET_OFFSET, bounds.y,
-							CaretUpdater.CARET_WIDTH, bounds.height);
-
-					figure.translateToAbsolute(ret);
-				} else if (offset >= 0
-						&& offset <= containerEditPart.getChildren().size()) {
-					ret = getRefRect(position);
-				}
-			}
-		} catch (Exception e) {
-			// This should never happen, we catch here for later analysis.
-			// _log.debug("Error in caret rect resolving", e);
-			ret = new Rectangle(0, 0, 0, 0);
-		}
-		if (ret == null) {
-			ret = new Rectangle(0, 0, 0, 0);
-		}
-		return ret;
-	}
-
-	/**
-	 * This method will create FlowBoxLine to calculate the accurate parts.
-	 * 
-	 * @param host
-	 * @param p
-	 * @param validator 
-	 * @return the design position
-	 */
-	public static DesignPosition findEditPartPosition(EditPart host, Point p,
-			IPositionMediator validator) {
-		try {
-			host = validator.getEditableContainer(new Target(host));
-			FlowBoxLine boxLine = new FlowBoxLine(
-					new Rectangle(p.x, p.y, 0, 0), validator, p);
-			DesignPosition position = innerFindEditPartPosition(host, host, p,
-					boxLine, validator);
-			if (position == null) {
-				position = innerFindEditPartPosition(host, host, p, boxLine,
-						validator);
-				if (position == null) {
-					EditPart part = boxLine.getClosestPart();
-					if (part != null) {
-						LayoutPart layoutPart = new LayoutPart(part, p);
-						position = layoutPart.resolvePosition(validator);
-					}
-				}
-			}
-			return position;
-		} catch (Exception e) {
-			return null;
-		}
-
-	}
-
-	/**
-	 * This function find the position, if there is one which is widget or text
-	 * and it contains p, or there is not such widget, then boxLine will returns
-	 * the widget that are in a sameline which contains p;
-	 * @param rootHost 
-	 * @param host 
-	 * 
-	 * @param p
-	 * @param boxLine 
-	 * @param validator 
-	 * @return the design position
-	 */
-    //TODO: needs refactoring
-	public static DesignPosition innerFindEditPartPosition(EditPart rootHost,
-			EditPart host, Point p, FlowBoxLine boxLine,
-			IPositionMediator validator) {
-		Target target = new Target(host);
-		LayoutPart lPart = new LayoutPart(host, p);
-		// text
-		if (host instanceof TextEditPart) {
-			if (lPart.contains(p)) {
-				DesignPosition position = null;
-				// see if the point is within string.
-				position = findTextEditPartPosition((TextEditPart) host, p);
-				if (position == null) {
-					addToCurrentLine(boxLine, host, p, validator);
-				}
-				// found?!!
-				return position;
-			}
-            addToCurrentLine(boxLine, host, p, validator);
-            return null;
-		}
-		// widget
-		else if (isWidget(host)) {
-			if (lPart.contains(p)
-					&& (validator.isValidPosition(new DOMRefPosition(target
-							.getNode(), true)) || //
-					validator.isValidPosition((new DOMRefPosition(target
-							.getNode(), false))))) {
-				if (IHTMLConstants.TAG_BR.equalsIgnoreCase(Target.resolveNode(
-						host).getNodeName())) {
-					return new DesignRefPosition(host, lPart.isBeforePoint(p));
-				}
-                return new DesignRefPosition(host, lPart.isBeforePoint(p)
-                		|| !lPart.atLeftPart(p));
-			}
-            addToCurrentLine(boxLine, host, p, validator);
-		} else {
-			// root host. we always supporse it has editable area.
-			if (host == rootHost) {
-				if (host.getChildren().size() > 0) {
-					List children = host.getChildren();
-					for (int i = 0, size = children.size(); i < size; i++) {
-						GraphicalEditPart child = (GraphicalEditPart) children
-								.get(i);
-						DesignPosition position = innerFindEditPartPosition(
-								rootHost, child, p, boxLine, validator);
-						if (position != null) {
-							return position;
-						}
-					}
-				}
-				if (boxLine.getPartsList().size() == 0) {
-					if (lPart.contains(p)) {
-						// found!!!
-						return new DesignPosition(host, 0);
-					}
-					addToCurrentLine(boxLine, host, p, validator);
-				}
-			}
-			// container
-			else {
-				// cann't edit it.
-				if (!validator.hasEditableArea(target)) {
-					if (lPart.contains(p) && //
-							(validator.isValidPosition(new DesignRefPosition(
-									target.getPart(), true)) || //
-							validator.isValidPosition(new DesignRefPosition(
-									target.getPart(), true)))) {
-						return new DesignRefPosition(host, lPart
-								.isBeforePoint(p)
-								|| !lPart.atLeftPart(p));
-					}
-                    addToCurrentLine(boxLine, host, p, validator);
-				}
-				// can edit
-				else {
-					// contains p
-					if (lPart.contains(p) || //
-							(!validator.isValidPosition(new DesignRefPosition(
-									target.getPart(), true)) && //
-							!validator.isValidPosition(new DesignRefPosition(
-									target.getPart(), true)))) {
-						if (host.getChildren().size() > 0) {
-							List children = host.getChildren();
-							for (int i = 0, size = children.size(); i < size; i++) {
-								GraphicalEditPart child = (GraphicalEditPart) children
-										.get(i);
-								DesignPosition position = innerFindEditPartPosition(
-										rootHost, child, p, boxLine, validator);
-								if (position != null) {
-									return position;
-								}
-							}
-						} else {
-							// we put the container which is empty here.
-							if (lPart.contains(p)) {
-								// found!!!
-								return new DesignPosition(host, 0);
-							}
-                            addToCurrentLine(boxLine, host, p, validator);
-						}
-					}
-					// not contains p
-					else {
-						addToCurrentLine(boxLine, host, p, validator);
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * similiar to findEditPartPositionConstrained, this method is used to
-	 * vertically move caret.
-	 * 
-	 * @param host
-	 * @param p
-	 * @param validator 
-	 * @return the design position
-	 */
-	public static DesignPosition findEditPartPositionConstrained(EditPart host,
-			Point p, IMovementMediator validator) {
-		try {
-			FlowBoxLine boxLine = new FlowBoxLine(
-					new Rectangle(p.x, p.y, 0, 0), validator, p);
-			DesignPosition position = innerFindEditPartPositionConstrained(
-					host, host, p, boxLine, validator);
-			if (position == null) {
-				position = innerFindEditPartPositionConstrained(host, host, p,
-						boxLine, validator);
-				if (position == null) {
-					EditPart part = boxLine.getClosestPart();
-					if (part != null) {
-						LayoutPart layoutPart = new LayoutPart(part, p);
-						position = layoutPart.resolvePosition(validator);
-					}
-				}
-			}
-			return position;
-		} catch (Exception e) {
-			return null;
-		}
-	}
-
-	/**
-	 * This method is used for move up/down, except for using tactics to deal
-	 * with container, this method is similiar to findEditPartPosition.
-	 * 
-	 * @param rootHost 
-	 * @param host 
-	 * @param p
-	 * @param boxLine 
-	 * @param validator 
-	 * @return the design position
-	 */
-    // TODO: needs refactoring
-	public static DesignPosition innerFindEditPartPositionConstrained(
-			EditPart rootHost, EditPart host, Point p, FlowBoxLine boxLine,
-			IMovementMediator validator) {
-		Target target = new Target(host);
-		LayoutPart lPart = new LayoutPart(host, p);
-		// text
-		if (host instanceof TextEditPart) {
-			if (lPart.contains(p)) {
-				DesignPosition position = null;
-				// see if the point is within string.
-				position = findTextEditPartPosition((TextEditPart) host, p);
-				if (position == null) {
-					addToCurrentLine(boxLine, host, p, validator);
-				}
-				// found?!!
-				return position;
-			}
-            addToCurrentLine(boxLine, host, p, validator);
-            return null;
-		}
-		// widget
-		else if (isWidget(host)) {
-			if (lPart.contains(p)) {
-				// found!!!
-				if (IHTMLConstants.TAG_BR.equalsIgnoreCase(Target.resolveNode(
-						host).getNodeName())) {
-					return new DesignRefPosition(host, lPart.isBeforePoint(p));
-				}
-                return new DesignRefPosition(host, lPart.isBeforePoint(p)
-                		|| !lPart.atLeftPart(p));
-			}
-            addToCurrentLine(boxLine, host, p, validator);
-		} else {
-			// root host. we always supporse it has editable area.
-			if (host == rootHost) {
-				if (host.getChildren().size() > 0) {
-					List children = host.getChildren();
-					for (int i = 0, size = children.size(); i < size; i++) {
-						GraphicalEditPart child = (GraphicalEditPart) children
-								.get(i);
-						DesignPosition position = innerFindEditPartPositionConstrained(
-								rootHost, child, p, boxLine, validator);
-						if (position != null) {
-							return position;
-						}
-					}
-				} else {
-					if (lPart.contains(p)) {
-						// found!!!
-						return new DesignPosition(host, 0);
-					}
-					addToCurrentLine(boxLine, host, p, validator);
-				}
-			}
-			// container
-			else {
-				// cann't edit it.
-				if (!validator.hasEditableArea(target)
-						|| !validator.allowsMoveIn(target)) {
-					if (validator.canReference(target, true)
-							|| validator.canReference(target, false)) {
-						if (lPart.contains(p)) {
-							return new DesignRefPosition(host, lPart
-									.isBeforePoint(p)
-									|| !lPart.atLeftPart(p));
-						}
-                        addToCurrentLine(boxLine, host, p, validator);
-					}
-				}
-				// can edit
-				else {
-					// contains p
-					if (lPart.contains(p)) {
-						if (host.getChildren().size() > 0) {
-							List children = host.getChildren();
-							for (int i = 0, size = children.size(); i < size; i++) {
-								GraphicalEditPart child = (GraphicalEditPart) children
-										.get(i);
-								DesignPosition position = innerFindEditPartPositionConstrained(
-										rootHost, child, p, boxLine, validator);
-								if (position != null) {
-									return position;
-								}
-							}
-						} else {
-							// we put the container which is empty here.
-							if (lPart.contains(p)) {
-								// found!!!
-								return new DesignPosition(host, 0);
-							}
-                            addToCurrentLine(boxLine, host, p, validator);
-						}
-					}
-					// not contains p
-					else {
-						addToCurrentLine(boxLine, host, p, validator);
-					}
-				}
-			}
-		}
-		return null;
-
-	}
-
-	// /**
-	// * @param host
-	// * @param p
-	// * @return
-	// */
-	// private static DesignPosition
-	// findTextEditPartPositionAdjacent(TextEditPart host, Point p)
-	// {
-	// if (host.getFigure() instanceof CSSTextFigure)
-	// {
-	// CSSTextFigure figure = (CSSTextFigure) host.getFigure();
-	// // make a copy to not destroy the original o
-	// p = p.getCopy();
-	// figure.translateToRelative(p);
-	// int offset = figure.getNewInsertionOffset(p);
-	// if (offset >= 0)
-	// {
-	// return new DesignPosition(host, offset);
-	// }
-	// else
-	// {
-	// return null;
-	// }
-	// }
-	// else
-	// {
-	// // should not happen.
-	// return new DesignPosition(host, 0);
-	// }
-	// }
-
-	/**
-	 * @param host
-	 * @param p
-	 * @return
-	 */
-	private static DesignPosition findTextEditPartPosition(TextEditPart host,
-			Point p) {
-		if (host.getFigure() instanceof CSSTextFigure) {
-			CSSTextFigure figure = (CSSTextFigure) host.getFigure();
-			// make a copy to not destroy the original o
-			p = p.getCopy();
-			figure.translateToRelative(p);
-			int offset = figure.getInsertionOffset(p);
-			if (offset >= 0) {
-				return new DesignPosition(host, offset);
-			}
-            return null;
-		}
-        // should not happen.
-        return new DesignPosition(host, 0);
-	}
-
-	/**
-	 * @param figure
-	 * @param box
-	 * @return
-	 */
-//	public static Rectangle getBoxBounds(IFigure figure, FlowBox box) {
-//		Rectangle r = new Rectangle(box._x, box._y, box.getWidth(), box
-//				.getHeight());
-//		figure.translateToAbsolute(r);
-//		return r;
-//	}
-
-	/**
-	 * If child is a GraphicalEditPart, a new copy of its bounding rectangle
-	 * will be returned translated to absolute bounds. If child is not a GraphicalEditPart
-	 * then the empty rectangle (0,0,0,0) is returned.
-	 * 
-	 * @param child
-	 * @return the bounding rectangle or (0,0,0,0) if none.
-	 */
-	public static Rectangle getAbsoluteBounds(EditPart child) {
-		if (child instanceof GraphicalEditPart) {
-			Rectangle bounds = ((GraphicalEditPart) child).getFigure()
-					.getBounds().getCopy();
-			((GraphicalEditPart) child).getFigure().translateToAbsolute(bounds);
-			return bounds;
-		}
-        return new Rectangle(0, 0, 0, 0);
-	}
-
-	/**
-	 * @param host
-	 * @param tagName
-	 * @return
-	 */
-	private static boolean isWidget(EditPart host) {
-		if (host instanceof NodeEditPart) {
-			return ((NodeEditPart) host).isWidget();
-		}
-        return false;
-	}
-
-	/**
-	 * Is Caret at right?
-	 * 
-	 * @param position
-	 * @param caretRefResult
-	 * @return
-	 */
-	private static EditPart tryTwoWays(DesignPosition position,
-			List 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(new Boolean(false));
-		} else {
-			node = EditModelQuery.getInstance().getSibling(
-					DOMPositionHelper.toDOMPosition(position), false);
-			if (node != null && !EditModelQuery.isTransparentText(node)) {
-				result = Target.resolvePart(node);
-				caretRefResult.add(new Boolean(true));
-			}
-		}
-		if (result == null) {
-			if (getConcretePart(position, false) != null) {
-				result = getConcretePart(position, false);
-				caretRefResult.add(new Boolean(true));
-			} else if (getConcretePart(position, true) != null) {
-				result = getConcretePart(position, true);
-				caretRefResult.add(new Boolean(false));
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * Here we are doing something to avoid reference witespace tag. Since we
-	 * still need to improve whitespace tags's layout furthure more.
-	 */
-	private static EditPart getNextConcretPart(DesignPosition position,
-			List caretIsAtRightTest) {
-		EditPart result = null;
-		boolean caretIsAtRight = true;
-		if (position instanceof DesignRefPosition) {
-			caretIsAtRight = ((DesignRefPosition) position).caretIsAtRight();
-			result = ((DesignRefPosition) position).getRefPart();
-			caretIsAtRightTest.add(new Boolean(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 caretLocation = new ArrayList();
-		EditPart part = getNextConcretPart(position, caretLocation);
-		LayoutPart layoutPart;
-		Rectangle rect = null;
-		if (part != null) {
-			layoutPart = new LayoutPart(part, null);
-			boolean caretIsAtRight = ((Boolean) caretLocation.get(0))
-					.booleanValue();
-			final int CARET_OFFSET = 1;
-			Rectangle bounds = null;
-			IFigure figure = ((GraphicalEditPart) part).getFigure();
-			if (!caretIsAtRight) {
-				FlowBox box;
-				if ((box = layoutPart.getLine(0)) != null) {
-					bounds = LayoutPart.getBounds(box);
-				}
-			} else {
-				FlowBox box;
-				if ((box = layoutPart.getLastLine()) != null) {
-					bounds = LayoutPart.getBounds(box);
-				}
-			}
-			if (bounds == null) {
-				bounds = figure.getBounds();
-			}
-			if (!caretIsAtRight) {
-				rect = new Rectangle(bounds.x - CARET_OFFSET, bounds.y,
-						CaretUpdater.CARET_WIDTH, bounds.height);// new
-			} else {
-				rect = new Rectangle(bounds.getRight().x + CARET_OFFSET,
-						bounds.y, CaretUpdater.CARET_WIDTH, bounds.height);// new
-			}
-			figure.translateToAbsolute(rect);
-		} else {
-			System.out.println("No concrete part?");
-		}
-		return rect;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/FlowBoxLine.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/FlowBoxLine.java
deleted file mode 100644
index bfc0e12..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/FlowBoxLine.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.viewer;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-
-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;
-
-	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;
-	}
-
-	public HashMap getPartsList() {
-		return _parts;
-	}
-
-	public Point getRightBottom() {
-		return new Point(_x + _width, _y + _height);
-	}
-
-	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;
-	}
-
-	public boolean interact(LayoutPart lPart) {
-		Rectangle rect = lPart.getAbsoluteBounds();
-		return !(rect.getBottom().y <= _y || getRightBottom().y <= rect.y);
-	}
-
-	public boolean contains(EditPart part) {
-		return _parts.containsKey(part);
-	}
-
-	public boolean contains(LayoutPart part) {
-		return _parts.containsValue(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.
-	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;
-	}
-
-	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 ed7082f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewer.java
+++ /dev/null
@@ -1,524 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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.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
- */
-public 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 CaretUpdater _caretUpdater = null;
-
-	private int _xOffset;
-
-	// private ListenerList _postSelectionChangedListeners = new
-	// ListenerList(1);
-
-	/**
-	 * 
-	 */
-	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.
-		_caretUpdater = new CaretUpdater(this);
-	}
-
-	/**
-	 * @return Returns the _caretUpdater.
-	 */
-	public CaretUpdater getCaretUpdater() {
-		return _caretUpdater;
-	}
-
-	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;
-	}
-
-	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
-	 */
-	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() {
-		Object listeners[] = selectionListeners.toArray();
-		for (int i = 0, n = selectionListeners.size(); i < n; i++) {
-			if (listeners[i] instanceof IHTMLGraphicalViewerListener) {
-				IHTMLGraphicalViewerListener l = (IHTMLGraphicalViewerListener) listeners[i];
-				l.selectionAboutToChange();
-			}
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void fireSelectionChangeFinished() {
-		Object listeners[] = selectionListeners.toArray();
-		for (int i = 0, n = selectionListeners.size(); i < n; i++) {
-			if (listeners[i] instanceof IHTMLGraphicalViewerListener) {
-				IHTMLGraphicalViewerListener l = (IHTMLGraphicalViewerListener) listeners[i];
-				l.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
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	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/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 44e8452..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewer.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.viewer;
-
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.swt.widgets.Caret;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-
-/**
- * @author mengbo
- */
-public interface IHTMLGraphicalViewer extends GraphicalViewer {
-	public IDOMModel getModel();
-
-	public void ensureRangeSelectionMode();
-
-	public void ensureObjectSelectionMode();
-
-	/**
-	 * @return
-	 */
-	public boolean isInRangeMode();
-
-	public DesignRange getRangeSelection();
-
-	/**
-	 * @param position
-	 * @param position2
-	 */
-	public void setRange(DesignPosition position, DesignPosition position2);
-
-	/**
-	 * @param position
-	 */
-	public void setRangeEndPosition(DesignPosition position);
-
-	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();
-
-	public Viewport getViewport();
-}
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 6d16c47..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewerListener.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.viewer;
-
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-
-/**
- * @author mengbo
- */
-public interface IHTMLGraphicalViewerListener extends ISelectionChangedListener {
-	public void selectionAboutToChange();
-
-	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 28c74de..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/LayoutPart.java
+++ /dev/null
@@ -1,471 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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 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.
-	 * 
-	 * @param point
-	 * @return
-	 */
-	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 point
-	 * @return
-	 */
-	public Rectangle getAbsoluteBounds(FlowBox box) {
-		if (box != null) {
-			IFigure figure = ((GraphicalEditPart) _part).getFigure();
-			Rectangle rect = new Rectangle(box._x, box._y, 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
-	 */
-	public boolean contains(Point point) {
-		return getAbsoluteBounds().contains(point);
-	}
-
-	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;
-	}
-
-	public DesignPosition resolvePosition(IPositionMediator validator) {
-		DesignPosition result;
-		if ((result = resolveTextPosition()) == null) {
-			boolean atPointLeft = false;
-			boolean atPointRight = false;
-			atPointLeft = isBeforePoint(_point);
-			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();
-//	}
-
-	public 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;
-
-	}
-
-	/**
-	 * EditPart is at point's left
-	 * 
-	 * @param part
-	 * @param point
-	 * @return
-	 */
-	public 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);
-	}
-
-	public boolean isBeforePoint() {
-		return isBeforePoint(_point);
-	}
-
-	public boolean atLeftPart(Point point) {
-		FlowBox flowBox = getBox();
-		if (flowBox != null) {
-			Rectangle boxRect = getAbsoluteBounds(flowBox);
-			return CaretPositionResolver.toXMiddle(boxRect, point) < 0;
-		}
-		return true;
-	}
-
-	public boolean isAfterPoint() {
-		return isAfterPoint(_point);
-	}
-
-	public boolean atSameLine(Point point) {
-		Rectangle bounds = getAbsoluteBounds();
-		return bounds.contains(bounds.getTop().x, point.y);
-	}
-
-	public boolean atSameRow(Point point) {
-		Rectangle bounds = getAbsoluteBounds();
-		return bounds.contains(point.x, bounds.getRight().y);
-	}
-
-	public static Rectangle getBounds(FlowBox box) {
-		return new Rectangle(box._x, box._y, 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 lineBox
-	 * @param host
-	 * @param rect
-	 * @param validator
-	 */
-	public 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.
-	 * 
-	 * @param lineBox
-	 * @param host
-	 * @param rect
-	 * @param validator
-	 */
-	public EditPart getConcretePart() {
-		return getConcretePart(_part);
-	}
-
-	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;
-	}
-
-	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;
-	}
-
-	public boolean isInline() {
-		return EditModelQuery.isInline(Target.resolveNode(_part));
-	}
-
-    // TODO: dead?
-//	private boolean isWidget() {
-//		return EditModelQuery.isWidget(_part);
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer sb = new StringBuffer();
-		sb.append("editPart:" + _part + ", --- box: " + getBox());
-		return sb.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/TextPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/TextPosition.java
deleted file mode 100644
index a88c86b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/TextPosition.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.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
-	 */
-	public IDOMText getTextNode() {
-		return _containerNode;
-	}
-
-	/**
-	 * if offset < 0, means it is invalid.
-	 * 
-	 * @return
-	 */
-	public int getOffset() {
-		return _offset;
-	}
-
-	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;
-	}
-}
